summaryrefslogtreecommitdiffstats
path: root/gui
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gui/Android.mk189
-rw-r--r--gui/action.cpp2035
-rw-r--r--gui/animation.cpp147
-rw-r--r--gui/blanktimer.cpp152
-rw-r--r--gui/blanktimer.hpp60
-rw-r--r--gui/button.cpp263
-rw-r--r--gui/checkbox.cpp185
-rw-r--r--gui/console.cpp413
-rw-r--r--gui/fileselector.cpp377
-rw-r--r--gui/fill.cpp70
-rw-r--r--gui/gui.cpp931
-rw-r--r--gui/gui.h41
-rw-r--r--gui/gui.hpp33
-rw-r--r--gui/hardwarekeyboard.cpp441
-rw-r--r--gui/image.cpp110
-rw-r--r--gui/input.cpp574
-rw-r--r--gui/keyboard.cpp633
-rw-r--r--gui/listbox.cpp246
-rw-r--r--gui/mousecursor.cpp165
-rw-r--r--gui/object.cpp224
-rw-r--r--gui/objects.hpp1242
-rw-r--r--gui/pages.cpp1697
-rw-r--r--gui/pages.h7
-rw-r--r--gui/pages.hpp212
-rw-r--r--gui/partitionlist.cpp283
-rw-r--r--gui/patternpassword.cpp487
-rw-r--r--gui/placement.h32
-rw-r--r--gui/progressbar.cpp244
-rw-r--r--gui/rapidxml.hpp2616
-rw-r--r--gui/remaining.txt4
-rw-r--r--gui/resources.cpp469
-rw-r--r--gui/resources.hpp136
-rw-r--r--gui/scrolllist.cpp652
-rw-r--r--gui/slider.cpp220
-rw-r--r--gui/slidervalue.cpp440
-rw-r--r--gui/terminal.cpp906
-rw-r--r--gui/text.cpp186
-rw-r--r--gui/textbox.cpp120
-rw-r--r--gui/theme/common/fonts/DroidSansMono.ttfbin0 -> 108128 bytes
-rw-r--r--gui/theme/common/fonts/RobotoCondensed-Regular.ttfbin0 -> 125332 bytes
-rw-r--r--gui/theme/common/images/progress_empty.pngbin0 -> 981 bytes
-rw-r--r--gui/theme/common/images/progress_fill.pngbin0 -> 992 bytes
-rw-r--r--gui/theme/common/landscape.xml5178
-rw-r--r--gui/theme/common/languages/cz.xml640
-rw-r--r--gui/theme/common/languages/de.xml695
-rw-r--r--gui/theme/common/languages/el.xml652
-rw-r--r--gui/theme/common/languages/en.xml696
-rw-r--r--gui/theme/common/languages/es.xml655
-rw-r--r--gui/theme/common/languages/fr.xml651
-rw-r--r--gui/theme/common/languages/hu.xml695
-rw-r--r--gui/theme/common/languages/it.xml695
-rw-r--r--gui/theme/common/languages/nl.xml673
-rw-r--r--gui/theme/common/languages/pl.xml673
-rw-r--r--gui/theme/common/languages/pt_BR.xml640
-rw-r--r--gui/theme/common/languages/ru.xml691
-rw-r--r--gui/theme/common/languages/sk.xml640
-rw-r--r--gui/theme/common/languages/sl.xml640
-rw-r--r--gui/theme/common/languages/sv.xml204
-rw-r--r--gui/theme/common/languages/tr.xml550
-rw-r--r--gui/theme/common/languages/uk.xml681
-rw-r--r--gui/theme/common/portrait.xml4938
-rw-r--r--gui/theme/common/watch.xml5513
-rw-r--r--gui/theme/extra-languages/fonts/DroidSansFallback.ttfbin0 -> 3725920 bytes
-rw-r--r--gui/theme/extra-languages/fonts/NotoSansCJKjp-Regular.ttfbin0 -> 709712 bytes
-rw-r--r--gui/theme/extra-languages/fonts/OFL.txt93
-rw-r--r--gui/theme/extra-languages/languages/ja.xml667
-rw-r--r--gui/theme/extra-languages/languages/zh_CN.xml695
-rw-r--r--gui/theme/extra-languages/languages/zh_TW.xml695
-rw-r--r--gui/theme/landscape_hdpi/images/back.pngbin0 -> 699 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/backspace.pngbin0 -> 934 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/backspace_terminal.pngbin0 -> 870 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/checkbox_false.pngbin0 -> 348 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/checkbox_true.pngbin0 -> 502 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/console.pngbin0 -> 398 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/cursor.pngbin0 -> 1213 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/enter.pngbin0 -> 1095 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/enter_terminal.pngbin0 -> 1074 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/file.pngbin0 -> 428 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/folder.pngbin0 -> 369 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/handle.pngbin0 -> 487 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/home.pngbin0 -> 768 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate001.pngbin0 -> 460 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate002.pngbin0 -> 710 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate003.pngbin0 -> 712 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate004.pngbin0 -> 398 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate005.pngbin0 -> 397 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate006.pngbin0 -> 399 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate007.pngbin0 -> 397 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate008.pngbin0 -> 398 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate009.pngbin0 -> 397 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate010.pngbin0 -> 434 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate011.pngbin0 -> 951 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/indeterminate012.pngbin0 -> 925 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/kb_arrow_down.pngbin0 -> 616 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/kb_arrow_left.pngbin0 -> 538 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/kb_arrow_right.pngbin0 -> 541 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/kb_arrow_up.pngbin0 -> 614 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/kb_hide.pngbin0 -> 783 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/kb_show.pngbin0 -> 755 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/logo.pngbin0 -> 1988 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/main_button.pngbin0 -> 1687 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/main_button_half_width.pngbin0 -> 1316 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/main_button_half_width_low.pngbin0 -> 993 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/progress_empty.pngbin0 -> 1199 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/progress_fill.pngbin0 -> 882 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/radio_false.pngbin0 -> 760 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/radio_true.pngbin0 -> 1243 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/shift.pngbin0 -> 1250 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/shift_fill.pngbin0 -> 998 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/shift_terminal.pngbin0 -> 1222 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/shift_terminal_fill.pngbin0 -> 969 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/slider.pngbin0 -> 1731 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/slider_touch.pngbin0 -> 2381 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/slider_used.pngbin0 -> 1752 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/sort_asc.pngbin0 -> 933 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/sort_desc.pngbin0 -> 917 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/sort_empty.pngbin0 -> 545 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/space.pngbin0 -> 1254 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/space_terminal.pngbin0 -> 1085 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/splashlogo.pngbin0 -> 10759 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/splashteamwin.pngbin0 -> 902 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/tab_3.pngbin0 -> 572 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/tab_4.pngbin0 -> 545 bytes
-rw-r--r--gui/theme/landscape_hdpi/images/unlock_icon.pngbin0 -> 5172 bytes
-rw-r--r--gui/theme/landscape_hdpi/splash.xml51
-rw-r--r--gui/theme/landscape_hdpi/ui.xml721
-rw-r--r--gui/theme/landscape_mdpi/images/back.pngbin0 -> 424 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/backspace.pngbin0 -> 428 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/backspace_terminal.pngbin0 -> 433 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/checkbox_false.pngbin0 -> 188 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/checkbox_true.pngbin0 -> 272 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/console.pngbin0 -> 290 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/cursor.pngbin0 -> 496 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/enter.pngbin0 -> 559 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/enter_terminal.pngbin0 -> 561 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/file.pngbin0 -> 246 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/folder.pngbin0 -> 211 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/handle.pngbin0 -> 257 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/home.pngbin0 -> 437 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate001.pngbin0 -> 208 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate002.pngbin0 -> 284 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate003.pngbin0 -> 191 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate004.pngbin0 -> 190 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate005.pngbin0 -> 192 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate006.pngbin0 -> 192 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate007.pngbin0 -> 192 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate008.pngbin0 -> 191 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate009.pngbin0 -> 192 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate010.pngbin0 -> 192 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate011.pngbin0 -> 225 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/indeterminate012.pngbin0 -> 333 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/kb_arrow_down.pngbin0 -> 316 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/kb_arrow_left.pngbin0 -> 272 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/kb_arrow_right.pngbin0 -> 270 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/kb_arrow_up.pngbin0 -> 309 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/kb_hide.pngbin0 -> 462 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/kb_show.pngbin0 -> 428 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/logo.pngbin0 -> 1027 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/main_button.pngbin0 -> 586 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/main_button_half_width.pngbin0 -> 515 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/main_button_half_width_low.pngbin0 -> 436 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/progress_empty.pngbin0 -> 427 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/progress_fill.pngbin0 -> 336 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/radio_false.pngbin0 -> 410 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/radio_true.pngbin0 -> 473 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/shift.pngbin0 -> 635 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/shift_fill.pngbin0 -> 500 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/shift_terminal.pngbin0 -> 648 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/shift_terminal_fill.pngbin0 -> 514 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/slider.pngbin0 -> 728 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/slider_touch.pngbin0 -> 1010 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/slider_used.pngbin0 -> 723 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/sort_asc.pngbin0 -> 409 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/sort_desc.pngbin0 -> 389 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/sort_empty.pngbin0 -> 232 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/space.pngbin0 -> 407 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/space_terminal.pngbin0 -> 416 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/splashlogo.pngbin0 -> 4236 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/splashteamwin.pngbin0 -> 1146 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/tab_3.pngbin0 -> 303 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/tab_4.pngbin0 -> 293 bytes
-rw-r--r--gui/theme/landscape_mdpi/images/unlock_icon.pngbin0 -> 2794 bytes
-rw-r--r--gui/theme/landscape_mdpi/splash.xml51
-rw-r--r--gui/theme/landscape_mdpi/ui.xml721
-rw-r--r--gui/theme/portrait_hdpi/images/back.pngbin0 -> 1043 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/backspace.pngbin0 -> 840 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/checkbox_false.pngbin0 -> 388 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/checkbox_true.pngbin0 -> 562 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/console.pngbin0 -> 573 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/cursor.pngbin0 -> 1213 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/enter.pngbin0 -> 1024 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/fab_selectfolder.pngbin0 -> 1375 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/file.pngbin0 -> 487 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/folder.pngbin0 -> 415 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/handle.pngbin0 -> 496 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/home.pngbin0 -> 945 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate001.pngbin0 -> 472 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate002.pngbin0 -> 777 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate003.pngbin0 -> 783 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate004.pngbin0 -> 525 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate005.pngbin0 -> 524 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate006.pngbin0 -> 524 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate007.pngbin0 -> 523 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate008.pngbin0 -> 524 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate009.pngbin0 -> 524 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate010.pngbin0 -> 525 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate011.pngbin0 -> 997 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/indeterminate012.pngbin0 -> 996 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/kb_arrow_down.pngbin0 -> 539 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/kb_arrow_left.pngbin0 -> 469 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/kb_arrow_right.pngbin0 -> 468 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/kb_arrow_up.pngbin0 -> 532 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/kb_hide.pngbin0 -> 910 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/kb_show.pngbin0 -> 912 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/logo.pngbin0 -> 2401 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/main_button.pngbin0 -> 1509 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/main_button_half_height.pngbin0 -> 1105 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/main_button_half_height_full_width.pngbin0 -> 1569 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/progress_empty.pngbin0 -> 1148 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/progress_fill.pngbin0 -> 751 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/radio_false.pngbin0 -> 1170 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/radio_true.pngbin0 -> 1475 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/shift.pngbin0 -> 1198 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/shift_fill.pngbin0 -> 913 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/slider.pngbin0 -> 1676 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/slider_touch.pngbin0 -> 2539 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/slider_used.pngbin0 -> 1660 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/sort_asc.pngbin0 -> 751 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/sort_desc.pngbin0 -> 734 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/sort_empty.pngbin0 -> 451 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/space.pngbin0 -> 874 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/splashlogo.pngbin0 -> 10759 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/splashteamwin.pngbin0 -> 902 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_3.pngbin0 -> 689 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_4.pngbin0 -> 629 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_display.pngbin0 -> 762 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_general.pngbin0 -> 1223 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_language.pngbin0 -> 1424 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_timezone.pngbin0 -> 1433 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/tab_vibration.pngbin0 -> 534 bytes
-rw-r--r--gui/theme/portrait_hdpi/images/unlock_icon.pngbin0 -> 5172 bytes
-rw-r--r--gui/theme/portrait_hdpi/splash.xml51
-rw-r--r--gui/theme/portrait_hdpi/ui.xml639
-rw-r--r--gui/theme/portrait_mdpi/images/back.pngbin0 -> 424 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/backspace.pngbin0 -> 515 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/checkbox_false.pngbin0 -> 255 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/checkbox_true.pngbin0 -> 334 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/console.pngbin0 -> 322 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/cursor.pngbin0 -> 483 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/enter.pngbin0 -> 689 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/fab_selectfolder.pngbin0 -> 681 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/file.pngbin0 -> 356 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/folder.pngbin0 -> 244 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/handle.pngbin0 -> 279 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/home.pngbin0 -> 467 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate001.pngbin0 -> 216 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate002.pngbin0 -> 316 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate003.pngbin0 -> 317 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate004.pngbin0 -> 204 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate005.pngbin0 -> 202 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate006.pngbin0 -> 204 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate007.pngbin0 -> 203 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate008.pngbin0 -> 204 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate009.pngbin0 -> 204 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate010.pngbin0 -> 204 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate011.pngbin0 -> 419 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/indeterminate012.pngbin0 -> 418 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/kb_arrow_down.pngbin0 -> 422 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/kb_arrow_left.pngbin0 -> 341 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/kb_arrow_right.pngbin0 -> 340 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/kb_arrow_up.pngbin0 -> 412 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/kb_hide.pngbin0 -> 295 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/kb_show.pngbin0 -> 370 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/logo.pngbin0 -> 1234 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/main_button.pngbin0 -> 506 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/main_button_half_height.pngbin0 -> 410 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/main_button_half_height_full_width.pngbin0 -> 487 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/progress_empty.pngbin0 -> 508 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/progress_fill.pngbin0 -> 393 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/radio_false.pngbin0 -> 613 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/radio_true.pngbin0 -> 741 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/shift.pngbin0 -> 657 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/shift_fill.pngbin0 -> 503 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/slider.pngbin0 -> 580 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/slider_touch.pngbin0 -> 963 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/slider_used.pngbin0 -> 582 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/sort_asc.pngbin0 -> 399 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/sort_desc.pngbin0 -> 396 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/sort_empty.pngbin0 -> 222 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/space.pngbin0 -> 450 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/splashlogo.pngbin0 -> 4236 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/splashteamwin.pngbin0 -> 1146 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_3.pngbin0 -> 357 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_4.pngbin0 -> 357 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_display.pngbin0 -> 409 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_general.pngbin0 -> 599 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_language.pngbin0 -> 600 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_timezone.pngbin0 -> 617 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/tab_vibration.pngbin0 -> 346 bytes
-rw-r--r--gui/theme/portrait_mdpi/images/unlock_icon.pngbin0 -> 2644 bytes
-rw-r--r--gui/theme/portrait_mdpi/splash.xml51
-rw-r--r--gui/theme/portrait_mdpi/ui.xml639
-rw-r--r--gui/theme/watch_mdpi/images/back.pngbin0 -> 427 bytes
-rw-r--r--gui/theme/watch_mdpi/images/backspace.pngbin0 -> 344 bytes
-rw-r--r--gui/theme/watch_mdpi/images/checkbox_false.pngbin0 -> 235 bytes
-rw-r--r--gui/theme/watch_mdpi/images/checkbox_false_small.pngbin0 -> 188 bytes
-rw-r--r--gui/theme/watch_mdpi/images/checkbox_true.pngbin0 -> 363 bytes
-rw-r--r--gui/theme/watch_mdpi/images/checkbox_true_small.pngbin0 -> 260 bytes
-rw-r--r--gui/theme/watch_mdpi/images/close.pngbin0 -> 446 bytes
-rw-r--r--gui/theme/watch_mdpi/images/console.pngbin0 -> 295 bytes
-rw-r--r--gui/theme/watch_mdpi/images/enter.pngbin0 -> 422 bytes
-rw-r--r--gui/theme/watch_mdpi/images/file.pngbin0 -> 315 bytes
-rw-r--r--gui/theme/watch_mdpi/images/folder.pngbin0 -> 272 bytes
-rw-r--r--gui/theme/watch_mdpi/images/grid_less.pngbin0 -> 312 bytes
-rw-r--r--gui/theme/watch_mdpi/images/grid_more.pngbin0 -> 400 bytes
-rw-r--r--gui/theme/watch_mdpi/images/handle.pngbin0 -> 557 bytes
-rw-r--r--gui/theme/watch_mdpi/images/home.pngbin0 -> 499 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate001.pngbin0 -> 174 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate002.pngbin0 -> 400 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate003.pngbin0 -> 194 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate004.pngbin0 -> 194 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate005.pngbin0 -> 194 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate006.pngbin0 -> 194 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate007.pngbin0 -> 193 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate008.pngbin0 -> 193 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate009.pngbin0 -> 193 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate010.pngbin0 -> 193 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate011.pngbin0 -> 192 bytes
-rw-r--r--gui/theme/watch_mdpi/images/indeterminate012.pngbin0 -> 491 bytes
-rw-r--r--gui/theme/watch_mdpi/images/kb_arrow_down.pngbin0 -> 300 bytes
-rw-r--r--gui/theme/watch_mdpi/images/kb_arrow_left.pngbin0 -> 258 bytes
-rw-r--r--gui/theme/watch_mdpi/images/kb_arrow_right.pngbin0 -> 251 bytes
-rw-r--r--gui/theme/watch_mdpi/images/kb_arrow_up.pngbin0 -> 291 bytes
-rw-r--r--gui/theme/watch_mdpi/images/kb_hide.pngbin0 -> 547 bytes
-rw-r--r--gui/theme/watch_mdpi/images/kb_show.pngbin0 -> 511 bytes
-rw-r--r--gui/theme/watch_mdpi/images/main_button.pngbin0 -> 624 bytes
-rw-r--r--gui/theme/watch_mdpi/images/main_button_full_width.pngbin0 -> 684 bytes
-rw-r--r--gui/theme/watch_mdpi/images/main_button_half_height.pngbin0 -> 481 bytes
-rw-r--r--gui/theme/watch_mdpi/images/main_button_quarter_width.pngbin0 -> 564 bytes
-rw-r--r--gui/theme/watch_mdpi/images/progress_empty.pngbin0 -> 637 bytes
-rw-r--r--gui/theme/watch_mdpi/images/progress_fill.pngbin0 -> 460 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_accept.pngbin0 -> 1003 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_accept_transp.pngbin0 -> 1010 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_addzip.pngbin0 -> 929 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_arrow_left.pngbin0 -> 911 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_arrow_right.pngbin0 -> 917 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_delete.pngbin0 -> 870 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_encryption_dis.pngbin0 -> 1346 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_encryption_en.pngbin0 -> 1275 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_folder.pngbin0 -> 1087 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_refresh.pngbin0 -> 1363 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_reset.pngbin0 -> 1506 bytes
-rw-r--r--gui/theme/watch_mdpi/images/q_btn_storage.pngbin0 -> 807 bytes
-rw-r--r--gui/theme/watch_mdpi/images/radio_false.pngbin0 -> 562 bytes
-rw-r--r--gui/theme/watch_mdpi/images/radio_true.pngbin0 -> 689 bytes
-rw-r--r--gui/theme/watch_mdpi/images/shift.pngbin0 -> 499 bytes
-rw-r--r--gui/theme/watch_mdpi/images/shift_fill.pngbin0 -> 411 bytes
-rw-r--r--gui/theme/watch_mdpi/images/slider.pngbin0 -> 947 bytes
-rw-r--r--gui/theme/watch_mdpi/images/slider_touch.pngbin0 -> 880 bytes
-rw-r--r--gui/theme/watch_mdpi/images/slider_used.pngbin0 -> 947 bytes
-rw-r--r--gui/theme/watch_mdpi/images/space.pngbin0 -> 318 bytes
-rw-r--r--gui/theme/watch_mdpi/images/splashlogo.pngbin0 -> 3848 bytes
-rw-r--r--gui/theme/watch_mdpi/images/splashteamwin.pngbin0 -> 680 bytes
-rw-r--r--gui/theme/watch_mdpi/images/unlock_icon.pngbin0 -> 1222 bytes
-rw-r--r--gui/theme/watch_mdpi/splash.xml51
-rw-r--r--gui/theme/watch_mdpi/ui.xml391
-rw-r--r--gui/twmsg.cpp139
-rw-r--r--gui/twmsg.h97
-rw-r--r--gui/twrp0
369 files changed, 49394 insertions, 0 deletions
diff --git a/gui/Android.mk b/gui/Android.mk
new file mode 100644
index 000000000..78e93c61a
--- /dev/null
+++ b/gui/Android.mk
@@ -0,0 +1,189 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_CFLAGS := -fno-strict-aliasing
+
+LOCAL_SRC_FILES := \
+ gui.cpp \
+ resources.cpp \
+ pages.cpp \
+ text.cpp \
+ image.cpp \
+ action.cpp \
+ console.cpp \
+ fill.cpp \
+ button.cpp \
+ checkbox.cpp \
+ fileselector.cpp \
+ progressbar.cpp \
+ animation.cpp \
+ object.cpp \
+ slider.cpp \
+ slidervalue.cpp \
+ listbox.cpp \
+ keyboard.cpp \
+ input.cpp \
+ blanktimer.cpp \
+ partitionlist.cpp \
+ mousecursor.cpp \
+ scrolllist.cpp \
+ patternpassword.cpp \
+ textbox.cpp \
+ terminal.cpp \
+ twmsg.cpp
+
+ifneq ($(TWRP_CUSTOM_KEYBOARD),)
+ LOCAL_SRC_FILES += $(TWRP_CUSTOM_KEYBOARD)
+else
+ LOCAL_SRC_FILES += hardwarekeyboard.cpp
+endif
+
+LOCAL_SHARED_LIBRARIES += libminuitwrp libc libstdc++ libminzip libaosprecovery libselinux
+LOCAL_MODULE := libguitwrp
+
+#TWRP_EVENT_LOGGING := true
+ifeq ($(TWRP_EVENT_LOGGING), true)
+ LOCAL_CFLAGS += -D_EVENT_LOGGING
+endif
+ifneq ($(TW_USE_KEY_CODE_TOUCH_SYNC),)
+ LOCAL_CFLAGS += -DTW_USE_KEY_CODE_TOUCH_SYNC=$(TW_USE_KEY_CODE_TOUCH_SYNC)
+endif
+
+ifneq ($(TW_NO_SCREEN_BLANK),)
+ LOCAL_CFLAGS += -DTW_NO_SCREEN_BLANK
+endif
+ifneq ($(TW_NO_SCREEN_TIMEOUT),)
+ LOCAL_CFLAGS += -DTW_NO_SCREEN_TIMEOUT
+endif
+ifeq ($(TW_OEM_BUILD), true)
+ LOCAL_CFLAGS += -DTW_OEM_BUILD
+endif
+ifneq ($(TW_X_OFFSET),)
+ LOCAL_CFLAGS += -DTW_X_OFFSET=$(TW_X_OFFSET)
+endif
+ifneq ($(TW_Y_OFFSET),)
+ LOCAL_CFLAGS += -DTW_Y_OFFSET=$(TW_Y_OFFSET)
+endif
+ifneq ($(TW_W_OFFSET),)
+ LOCAL_CFLAGS += -DTW_W_OFFSET=$(TW_W_OFFSET)
+endif
+ifneq ($(TW_H_OFFSET),)
+ LOCAL_CFLAGS += -DTW_H_OFFSET=$(TW_H_OFFSET)
+endif
+ifeq ($(TW_ROUND_SCREEN), true)
+ LOCAL_CFLAGS += -DTW_ROUND_SCREEN
+endif
+
+LOCAL_C_INCLUDES += \
+ bionic \
+ system/core/include \
+ system/core/libpixelflinger/include
+
+ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
+ LOCAL_C_INCLUDES += external/stlport/stlport
+endif
+
+LOCAL_CFLAGS += -DTWRES=\"$(TWRES_PATH)\"
+
+include $(BUILD_STATIC_LIBRARY)
+
+# Transfer in the resources for the device
+include $(CLEAR_VARS)
+LOCAL_MODULE := twrp
+LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWRES_PATH)
+
+# The extra blank line before *** is intentional to ensure it ends up on its own line
+define TW_THEME_WARNING_MSG
+
+****************************************************************************
+ Could not find ui.xml for TW_THEME: $(TW_THEME)
+ Set TARGET_SCREEN_WIDTH and TARGET_SCREEN_HEIGHT to automatically select
+ an appropriate theme, or set TW_THEME to one of the following:
+ $(notdir $(wildcard $(commands_recovery_local_path)/gui/theme/*_*))
+****************************************************************************
+endef
+define TW_CUSTOM_THEME_WARNING_MSG
+
+****************************************************************************
+ Could not find ui.xml for TW_CUSTOM_THEME: $(TW_CUSTOM_THEME)
+ Expected to find custom theme's ui.xml at:
+ $(TWRP_THEME_LOC)/ui.xml
+ Please fix this or set TW_THEME to one of the following:
+ $(notdir $(wildcard $(commands_recovery_local_path)/gui/theme/*_*))
+****************************************************************************
+endef
+
+TWRP_RES := $(commands_recovery_local_path)/gui/theme/common/fonts
+TWRP_RES += $(commands_recovery_local_path)/gui/theme/common/languages
+ifeq ($(TW_EXTRA_LANGUAGES),true)
+ TWRP_RES += $(commands_recovery_local_path)/gui/theme/extra-languages/fonts
+ TWRP_RES += $(commands_recovery_local_path)/gui/theme/extra-languages/languages
+endif
+
+ifeq ($(TW_CUSTOM_THEME),)
+ ifeq ($(TW_THEME),)
+ ifeq ($(DEVICE_RESOLUTION),)
+ GUI_WIDTH := $(TARGET_SCREEN_WIDTH)
+ GUI_HEIGHT := $(TARGET_SCREEN_HEIGHT)
+ else
+ SPLIT_DEVICE_RESOLUTION := $(subst x, ,$(DEVICE_RESOLUTION))
+ GUI_WIDTH := $(word 1, $(SPLIT_DEVICE_RESOLUTION))
+ GUI_HEIGHT := $(word 2, $(SPLIT_DEVICE_RESOLUTION))
+ endif
+
+ # Minimum resolution of 100x100
+ # This also ensures GUI_WIDTH and GUI_HEIGHT are numbers
+ ifeq ($(shell test $(GUI_WIDTH) -ge 100; echo $$?),0)
+ ifeq ($(shell test $(GUI_HEIGHT) -ge 100; echo $$?),0)
+ ifeq ($(shell test $(GUI_WIDTH) -gt $(GUI_HEIGHT); echo $$?),0)
+ ifeq ($(shell test $(GUI_WIDTH) -ge 1280; echo $$?),0)
+ TW_THEME := landscape_hdpi
+ else
+ TW_THEME := landscape_mdpi
+ endif
+ else ifeq ($(shell test $(GUI_WIDTH) -lt $(GUI_HEIGHT); echo $$?),0)
+ ifeq ($(shell test $(GUI_WIDTH) -ge 720; echo $$?),0)
+ TW_THEME := portrait_hdpi
+ else
+ TW_THEME := portrait_mdpi
+ endif
+ else ifeq ($(shell test $(GUI_WIDTH) -eq $(GUI_HEIGHT); echo $$?),0)
+ # watch_hdpi does not yet exist
+ TW_THEME := watch_mdpi
+ endif
+ endif
+ endif
+ endif
+
+ TWRP_THEME_LOC := $(commands_recovery_local_path)/gui/theme/$(TW_THEME)
+ ifeq ($(wildcard $(TWRP_THEME_LOC)/ui.xml),)
+ $(warning $(TW_THEME_WARNING_MSG))
+ $(error Theme selection failed; exiting)
+ endif
+
+ TWRP_RES += $(commands_recovery_local_path)/gui/theme/common/$(word 1,$(subst _, ,$(TW_THEME))).xml
+ # for future copying of used include xmls and fonts:
+ # UI_XML := $(TWRP_THEME_LOC)/ui.xml
+ # TWRP_INCLUDE_XMLS := $(shell xmllint --xpath '/recovery/include/xmlfile/@name' $(UI_XML)|sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1\n/gp'|sort|uniq)
+ # TWRP_FONTS_TTF := $(shell xmllint --xpath '/recovery/resources/font/@filename' $(UI_XML)|sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1\n/gp'|sort|uniq)niq)
+else
+ TWRP_THEME_LOC := $(TW_CUSTOM_THEME)
+ ifeq ($(wildcard $(TWRP_THEME_LOC)/ui.xml),)
+ $(warning $(TW_CUSTOM_THEME_WARNING_MSG))
+ $(error Theme selection failed; exiting)
+ endif
+endif
+
+TWRP_RES += $(TW_ADDITIONAL_RES)
+
+TWRP_RES_GEN := $(intermediates)/twrp
+$(TWRP_RES_GEN):
+ mkdir -p $(TARGET_RECOVERY_ROOT_OUT)$(TWRES_PATH)
+ cp -fr $(TWRP_RES) $(TARGET_RECOVERY_ROOT_OUT)$(TWRES_PATH)
+ cp -fr $(TWRP_THEME_LOC)/* $(TARGET_RECOVERY_ROOT_OUT)$(TWRES_PATH)
+
+LOCAL_GENERATED_SOURCES := $(TWRP_RES_GEN)
+LOCAL_SRC_FILES := twrp $(TWRP_RES_GEN)
+include $(BUILD_PREBUILT)
diff --git a/gui/action.cpp b/gui/action.cpp
new file mode 100644
index 000000000..a39515828
--- /dev/null
+++ b/gui/action.cpp
@@ -0,0 +1,2035 @@
+/*update
+ Copyright 2013 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <linux/input.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <dirent.h>
+#include <private/android_filesystem_config.h>
+
+#include <string>
+#include <sstream>
+#include "../partitions.hpp"
+#include "../twrp-functions.hpp"
+#include "../openrecoveryscript.hpp"
+
+#include "../adb_install.h"
+#include "../fuse_sideload.h"
+#include "blanktimer.hpp"
+
+extern "C" {
+#include "../twcommon.h"
+#include "../variables.h"
+#include "../twinstall.h"
+#include "cutils/properties.h"
+#include "../adb_install.h"
+};
+#include "../set_metadata.h"
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../tw_atomic.hpp"
+
+GUIAction::mapFunc GUIAction::mf;
+std::set<string> GUIAction::setActionsRunningInCallerThread;
+static string zip_queue[10];
+static int zip_queue_index;
+pid_t sideload_child_pid;
+
+static void *ActionThread_work_wrapper(void *data);
+
+class ActionThread
+{
+public:
+ ActionThread();
+ ~ActionThread();
+
+ void threadActions(GUIAction *act);
+ void run(void *data);
+private:
+ friend void *ActionThread_work_wrapper(void*);
+ struct ThreadData
+ {
+ ActionThread *this_;
+ GUIAction *act;
+ ThreadData(ActionThread *this_, GUIAction *act) : this_(this_), act(act) {}
+ };
+
+ pthread_t m_thread;
+ bool m_thread_running;
+ pthread_mutex_t m_act_lock;
+};
+
+static ActionThread action_thread; // for all kinds of longer running actions
+static ActionThread cancel_thread; // for longer running "cancel" actions
+
+static void *ActionThread_work_wrapper(void *data)
+{
+ static_cast<ActionThread::ThreadData*>(data)->this_->run(data);
+ return NULL;
+}
+
+ActionThread::ActionThread()
+{
+ m_thread_running = false;
+ pthread_mutex_init(&m_act_lock, NULL);
+}
+
+ActionThread::~ActionThread()
+{
+ pthread_mutex_lock(&m_act_lock);
+ if (m_thread_running) {
+ pthread_mutex_unlock(&m_act_lock);
+ pthread_join(m_thread, NULL);
+ } else {
+ pthread_mutex_unlock(&m_act_lock);
+ }
+ pthread_mutex_destroy(&m_act_lock);
+}
+
+void ActionThread::threadActions(GUIAction *act)
+{
+ pthread_mutex_lock(&m_act_lock);
+ if (m_thread_running) {
+ pthread_mutex_unlock(&m_act_lock);
+ LOGERR("Another threaded action is already running -- not running %u actions starting with '%s'\n",
+ act->mActions.size(), act->mActions[0].mFunction.c_str());
+ } else {
+ m_thread_running = true;
+ pthread_mutex_unlock(&m_act_lock);
+ ThreadData *d = new ThreadData(this, act);
+ pthread_create(&m_thread, NULL, &ActionThread_work_wrapper, d);
+ }
+}
+
+void ActionThread::run(void *data)
+{
+ ThreadData *d = (ThreadData*)data;
+ GUIAction* act = d->act;
+
+ std::vector<GUIAction::Action>::iterator it;
+ for (it = act->mActions.begin(); it != act->mActions.end(); ++it)
+ act->doAction(*it);
+
+ pthread_mutex_lock(&m_act_lock);
+ m_thread_running = false;
+ pthread_mutex_unlock(&m_act_lock);
+ delete d;
+}
+
+GUIAction::GUIAction(xml_node<>* node)
+ : GUIObject(node)
+{
+ xml_node<>* child;
+ xml_node<>* actions;
+ xml_attribute<>* attr;
+
+ if (!node) return;
+
+ if (mf.empty()) {
+#define ADD_ACTION(n) mf[#n] = &GUIAction::n
+#define ADD_ACTION_EX(name, func) mf[name] = &GUIAction::func
+ // These actions will be run in the caller's thread
+ ADD_ACTION(reboot);
+ ADD_ACTION(home);
+ ADD_ACTION(key);
+ ADD_ACTION(page);
+ ADD_ACTION(reload);
+ ADD_ACTION(readBackup);
+ ADD_ACTION(set);
+ ADD_ACTION(clear);
+ ADD_ACTION(mount);
+ ADD_ACTION(unmount);
+ ADD_ACTION_EX("umount", unmount);
+ ADD_ACTION(restoredefaultsettings);
+ ADD_ACTION(copylog);
+ ADD_ACTION(compute);
+ ADD_ACTION_EX("addsubtract", compute);
+ ADD_ACTION(setguitimezone);
+ ADD_ACTION(overlay);
+ ADD_ACTION(queuezip);
+ ADD_ACTION(cancelzip);
+ ADD_ACTION(queueclear);
+ ADD_ACTION(sleep);
+ ADD_ACTION(sleepcounter);
+ ADD_ACTION(appenddatetobackupname);
+ ADD_ACTION(generatebackupname);
+ ADD_ACTION(checkpartitionlist);
+ ADD_ACTION(getpartitiondetails);
+ ADD_ACTION(screenshot);
+ ADD_ACTION(setbrightness);
+ ADD_ACTION(fileexists);
+ ADD_ACTION(killterminal);
+ ADD_ACTION(checkbackupname);
+ ADD_ACTION(adbsideloadcancel);
+ ADD_ACTION(fixsu);
+ ADD_ACTION(startmtp);
+ ADD_ACTION(stopmtp);
+ ADD_ACTION(cancelbackup);
+ ADD_ACTION(checkpartitionlifetimewrites);
+ ADD_ACTION(mountsystemtoggle);
+ ADD_ACTION(setlanguage);
+ ADD_ACTION(checkforapp);
+ ADD_ACTION(togglebacklight);
+
+ // remember actions that run in the caller thread
+ for (mapFunc::const_iterator it = mf.begin(); it != mf.end(); ++it)
+ setActionsRunningInCallerThread.insert(it->first);
+
+ // These actions will run in a separate thread
+ ADD_ACTION(flash);
+ ADD_ACTION(wipe);
+ ADD_ACTION(refreshsizes);
+ ADD_ACTION(nandroid);
+ ADD_ACTION(fixcontexts);
+ ADD_ACTION(fixpermissions);
+ ADD_ACTION(dd);
+ ADD_ACTION(partitionsd);
+ ADD_ACTION(installhtcdumlock);
+ ADD_ACTION(htcdumlockrestoreboot);
+ ADD_ACTION(htcdumlockreflashrecovery);
+ ADD_ACTION(cmd);
+ ADD_ACTION(terminalcommand);
+ ADD_ACTION(reinjecttwrp);
+ ADD_ACTION(decrypt);
+ ADD_ACTION(adbsideload);
+ ADD_ACTION(openrecoveryscript);
+ ADD_ACTION(installsu);
+ ADD_ACTION(decrypt_backup);
+ ADD_ACTION(repair);
+ ADD_ACTION(resize);
+ ADD_ACTION(changefilesystem);
+ ADD_ACTION(flashimage);
+ ADD_ACTION(twcmd);
+ ADD_ACTION(setbootslot);
+ ADD_ACTION(installapp);
+ }
+
+ // First, get the action
+ actions = FindNode(node, "actions");
+ if (actions) child = FindNode(actions, "action");
+ else child = FindNode(node, "action");
+
+ if (!child) return;
+
+ while (child)
+ {
+ Action action;
+
+ attr = child->first_attribute("function");
+ if (!attr) return;
+
+ action.mFunction = attr->value();
+ action.mArg = child->value();
+ mActions.push_back(action);
+
+ child = child->next_sibling("action");
+ }
+
+ // Now, let's get either the key or region
+ child = FindNode(node, "touch");
+ if (child)
+ {
+ attr = child->first_attribute("key");
+ if (attr)
+ {
+ std::vector<std::string> keys = TWFunc::Split_String(attr->value(), "+");
+ for (size_t i = 0; i < keys.size(); ++i)
+ {
+ const int key = getKeyByName(keys[i]);
+ mKeys[key] = false;
+ }
+ }
+ else
+ {
+ attr = child->first_attribute("x");
+ if (!attr) return;
+ mActionX = atol(attr->value());
+ attr = child->first_attribute("y");
+ if (!attr) return;
+ mActionY = atol(attr->value());
+ attr = child->first_attribute("w");
+ if (!attr) return;
+ mActionW = atol(attr->value());
+ attr = child->first_attribute("h");
+ if (!attr) return;
+ mActionH = atol(attr->value());
+ }
+ }
+}
+
+int GUIAction::NotifyTouch(TOUCH_STATE state, int x __unused, int y __unused)
+{
+ if (state == TOUCH_RELEASE)
+ doActions();
+
+ return 0;
+}
+
+int GUIAction::NotifyKey(int key, bool down)
+{
+ std::map<int, bool>::iterator itr = mKeys.find(key);
+ if (itr == mKeys.end())
+ return 1;
+
+ bool prevState = itr->second;
+ itr->second = down;
+
+ // If there is only one key for this action, wait for key up so it
+ // doesn't trigger with multi-key actions.
+ // Else, check if all buttons are pressed, then consume their release events
+ // so they don't trigger one-button actions and reset mKeys pressed status
+ if (mKeys.size() == 1) {
+ if (!down && prevState) {
+ doActions();
+ return 0;
+ }
+ } else if (down) {
+ for (itr = mKeys.begin(); itr != mKeys.end(); ++itr) {
+ if (!itr->second)
+ return 1;
+ }
+
+ // Passed, all req buttons are pressed, reset them and consume release events
+ HardwareKeyboard *kb = PageManager::GetHardwareKeyboard();
+ for (itr = mKeys.begin(); itr != mKeys.end(); ++itr) {
+ kb->ConsumeKeyRelease(itr->first);
+ itr->second = false;
+ }
+
+ doActions();
+ return 0;
+ }
+
+ return 1;
+}
+
+int GUIAction::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIObject::NotifyVarChange(varName, value);
+
+ if (varName.empty() && !isConditionValid() && mKeys.empty() && !mActionW)
+ doActions();
+ else if ((varName.empty() || IsConditionVariable(varName)) && isConditionValid() && isConditionTrue())
+ doActions();
+
+ return 0;
+}
+
+void GUIAction::simulate_progress_bar(void)
+{
+ gui_msg("simulating=Simulating actions...");
+ for (int i = 0; i < 5; i++)
+ {
+ if (PartitionManager.stop_backup.get_value()) {
+ DataManager::SetValue("tw_cancel_backup", 1);
+ gui_msg("backup_cancel=Backup Cancelled");
+ DataManager::SetValue("ui_progress", 0);
+ PartitionManager.stop_backup.set_value(0);
+ return;
+ }
+ usleep(500000);
+ DataManager::SetValue("ui_progress", i * 20);
+ }
+}
+
+int GUIAction::flash_zip(std::string filename, int* wipe_cache)
+{
+ int ret_val = 0;
+
+ DataManager::SetValue("ui_progress", 0);
+
+ if (filename.empty())
+ {
+ LOGERR("No file specified.\n");
+ return -1;
+ }
+
+ if (!TWFunc::Path_Exists(filename)) {
+ if (!PartitionManager.Mount_By_Path(filename, true)) {
+ return -1;
+ }
+ if (!TWFunc::Path_Exists(filename)) {
+ gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1}.")(filename));
+ return -1;
+ }
+ }
+
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ ret_val = TWinstall_zip(filename.c_str(), wipe_cache);
+
+ // Now, check if we need to ensure TWRP remains installed...
+ struct stat st;
+ if (stat("/sbin/installTwrp", &st) == 0)
+ {
+ DataManager::SetValue("tw_operation", "Configuring TWRP");
+ DataManager::SetValue("tw_partition", "");
+ gui_msg("config_twrp=Configuring TWRP...");
+ if (TWFunc::Exec_Cmd("/sbin/installTwrp reinstall") < 0)
+ {
+ gui_msg("config_twrp_err=Unable to configure TWRP with this kernel.");
+ }
+ }
+ }
+
+ // Done
+ DataManager::SetValue("ui_progress", 100);
+ DataManager::SetValue("ui_progress", 0);
+ return ret_val;
+}
+
+GUIAction::ThreadType GUIAction::getThreadType(const GUIAction::Action& action)
+{
+ string func = gui_parse_text(action.mFunction);
+ bool needsThread = setActionsRunningInCallerThread.find(func) == setActionsRunningInCallerThread.end();
+ if (needsThread) {
+ if (func == "cancelbackup")
+ return THREAD_CANCEL;
+ else
+ return THREAD_ACTION;
+ }
+ return THREAD_NONE;
+}
+
+int GUIAction::doActions()
+{
+ if (mActions.size() < 1)
+ return -1;
+
+ // Determine in which thread to run the actions.
+ // Do it for all actions at once before starting, so that we can cancel the whole batch if the thread is already busy.
+ ThreadType threadType = THREAD_NONE;
+ std::vector<Action>::iterator it;
+ for (it = mActions.begin(); it != mActions.end(); ++it) {
+ ThreadType tt = getThreadType(*it);
+ if (tt == THREAD_NONE)
+ continue;
+ if (threadType == THREAD_NONE)
+ threadType = tt;
+ else if (threadType != tt) {
+ LOGERR("Can't mix normal and cancel actions in the same list.\n"
+ "Running the whole batch in the cancel thread.\n");
+ threadType = THREAD_CANCEL;
+ break;
+ }
+ }
+
+ // Now run the actions in the desired thread.
+ switch (threadType) {
+ case THREAD_ACTION:
+ action_thread.threadActions(this);
+ break;
+
+ case THREAD_CANCEL:
+ cancel_thread.threadActions(this);
+ break;
+
+ default: {
+ // no iterators here because theme reloading might kill our object
+ const size_t cnt = mActions.size();
+ for (size_t i = 0; i < cnt; ++i)
+ doAction(mActions[i]);
+ }
+ }
+
+ return 0;
+}
+
+int GUIAction::doAction(Action action)
+{
+ DataManager::GetValue(TW_SIMULATE_ACTIONS, simulate);
+
+ std::string function = gui_parse_text(action.mFunction);
+ std::string arg = gui_parse_text(action.mArg);
+
+ // find function and execute it
+ mapFunc::const_iterator funcitr = mf.find(function);
+ if (funcitr != mf.end())
+ return (this->*funcitr->second)(arg);
+
+ LOGERR("Unknown action '%s'\n", function.c_str());
+ return -1;
+}
+
+void GUIAction::operation_start(const string operation_name)
+{
+ LOGINFO("operation_start: '%s'\n", operation_name.c_str());
+ time(&Start);
+ DataManager::SetValue(TW_ACTION_BUSY, 1);
+ DataManager::SetValue("ui_progress", 0);
+ DataManager::SetValue("tw_operation", operation_name);
+ DataManager::SetValue("tw_operation_state", 0);
+ DataManager::SetValue("tw_operation_status", 0);
+}
+
+void GUIAction::operation_end(const int operation_status)
+{
+ time_t Stop;
+ int simulate_fail;
+ DataManager::SetValue("ui_progress", 100);
+ if (simulate) {
+ DataManager::GetValue(TW_SIMULATE_FAIL, simulate_fail);
+ if (simulate_fail != 0)
+ DataManager::SetValue("tw_operation_status", 1);
+ else
+ DataManager::SetValue("tw_operation_status", 0);
+ } else {
+ if (operation_status != 0) {
+ DataManager::SetValue("tw_operation_status", 1);
+ }
+ else {
+ DataManager::SetValue("tw_operation_status", 0);
+ }
+ }
+ DataManager::SetValue("tw_operation_state", 1);
+ DataManager::SetValue(TW_ACTION_BUSY, 0);
+ blankTimer.resetTimerAndUnblank();
+ property_set("twrp.action_complete", "1");
+ time(&Stop);
+ if ((int) difftime(Stop, Start) > 10)
+ DataManager::Vibrate("tw_action_vibrate");
+ LOGINFO("operation_end - status=%d\n", operation_status);
+}
+
+int GUIAction::reboot(std::string arg)
+{
+ sync();
+ DataManager::SetValue("tw_gui_done", 1);
+ DataManager::SetValue("tw_reboot_arg", arg);
+
+ return 0;
+}
+
+int GUIAction::home(std::string arg __unused)
+{
+ gui_changePage("main");
+ return 0;
+}
+
+int GUIAction::key(std::string arg)
+{
+ const int key = getKeyByName(arg);
+ PageManager::NotifyKey(key, true);
+ PageManager::NotifyKey(key, false);
+ return 0;
+}
+
+int GUIAction::page(std::string arg)
+{
+ property_set("twrp.action_complete", "0");
+ std::string page_name = gui_parse_text(arg);
+ return gui_changePage(page_name);
+}
+
+int GUIAction::reload(std::string arg __unused)
+{
+ PageManager::RequestReload();
+ // The actual reload is handled in pages.cpp in PageManager::RunReload()
+ // The reload will occur on the next Update or Render call and will
+ // be performed in the rendoer thread instead of the action thread
+ // to prevent crashing which could occur when we start deleting
+ // GUI resources in the action thread while we attempt to render
+ // with those same resources in another thread.
+ return 0;
+}
+
+int GUIAction::readBackup(std::string arg __unused)
+{
+ string Restore_Name;
+ DataManager::GetValue("tw_restore", Restore_Name);
+ PartitionManager.Set_Restore_Files(Restore_Name);
+ return 0;
+}
+
+int GUIAction::set(std::string arg)
+{
+ if (arg.find('=') != string::npos)
+ {
+ string varName = arg.substr(0, arg.find('='));
+ string value = arg.substr(arg.find('=') + 1, string::npos);
+
+ DataManager::GetValue(value, value);
+ DataManager::SetValue(varName, value);
+ }
+ else
+ DataManager::SetValue(arg, "1");
+ return 0;
+}
+
+int GUIAction::clear(std::string arg)
+{
+ DataManager::SetValue(arg, "0");
+ return 0;
+}
+
+int GUIAction::mount(std::string arg)
+{
+ if (arg == "usb") {
+ DataManager::SetValue(TW_ACTION_BUSY, 1);
+ if (!simulate)
+ PartitionManager.usb_storage_enable();
+ else
+ gui_msg("simulating=Simulating actions...");
+ } else if (!simulate) {
+ PartitionManager.Mount_By_Path(arg, true);
+ PartitionManager.Add_MTP_Storage(arg);
+ } else
+ gui_msg("simulating=Simulating actions...");
+ return 0;
+}
+
+int GUIAction::unmount(std::string arg)
+{
+ if (arg == "usb") {
+ if (!simulate)
+ PartitionManager.usb_storage_disable();
+ else
+ gui_msg("simulating=Simulating actions...");
+ DataManager::SetValue(TW_ACTION_BUSY, 0);
+ } else if (!simulate) {
+ PartitionManager.UnMount_By_Path(arg, true);
+ } else
+ gui_msg("simulating=Simulating actions...");
+ return 0;
+}
+
+int GUIAction::restoredefaultsettings(std::string arg __unused)
+{
+ operation_start("Restore Defaults");
+ if (simulate) // Simulated so that people don't accidently wipe out the "simulation is on" setting
+ gui_msg("simulating=Simulating actions...");
+ else {
+ DataManager::ResetDefaults();
+ PartitionManager.Update_System_Details();
+ PartitionManager.Mount_Current_Storage(true);
+ }
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::copylog(std::string arg __unused)
+{
+ operation_start("Copy Log");
+ if (!simulate)
+ {
+ string dst, curr_storage;
+ int copy_kernel_log = 0;
+
+ DataManager::GetValue("tw_include_kernel_log", copy_kernel_log);
+ PartitionManager.Mount_Current_Storage(true);
+ curr_storage = DataManager::GetCurrentStoragePath();
+ dst = curr_storage + "/recovery.log";
+ TWFunc::copy_file("/tmp/recovery.log", dst.c_str(), 0755);
+ tw_set_default_metadata(dst.c_str());
+ if (copy_kernel_log)
+ TWFunc::copy_kernel_log(curr_storage);
+ sync();
+ gui_msg(Msg("copy_log=Copied recovery log to {1}")(dst));
+ } else
+ simulate_progress_bar();
+ operation_end(0);
+ return 0;
+}
+
+
+int GUIAction::compute(std::string arg)
+{
+ if (arg.find("+") != string::npos)
+ {
+ string varName = arg.substr(0, arg.find('+'));
+ string string_to_add = arg.substr(arg.find('+') + 1, string::npos);
+ int amount_to_add = atoi(string_to_add.c_str());
+ int value;
+
+ DataManager::GetValue(varName, value);
+ DataManager::SetValue(varName, value + amount_to_add);
+ return 0;
+ }
+ if (arg.find("-") != string::npos)
+ {
+ string varName = arg.substr(0, arg.find('-'));
+ string string_to_subtract = arg.substr(arg.find('-') + 1, string::npos);
+ int amount_to_subtract = atoi(string_to_subtract.c_str());
+ int value;
+
+ DataManager::GetValue(varName, value);
+ value -= amount_to_subtract;
+ if (value <= 0)
+ value = 0;
+ DataManager::SetValue(varName, value);
+ return 0;
+ }
+ if (arg.find("*") != string::npos)
+ {
+ string varName = arg.substr(0, arg.find('*'));
+ string multiply_by_str = gui_parse_text(arg.substr(arg.find('*') + 1, string::npos));
+ int multiply_by = atoi(multiply_by_str.c_str());
+ int value;
+
+ DataManager::GetValue(varName, value);
+ DataManager::SetValue(varName, value*multiply_by);
+ return 0;
+ }
+ if (arg.find("/") != string::npos)
+ {
+ string varName = arg.substr(0, arg.find('/'));
+ string divide_by_str = gui_parse_text(arg.substr(arg.find('/') + 1, string::npos));
+ int divide_by = atoi(divide_by_str.c_str());
+ int value;
+
+ if (divide_by != 0)
+ {
+ DataManager::GetValue(varName, value);
+ DataManager::SetValue(varName, value/divide_by);
+ }
+ return 0;
+ }
+ LOGERR("Unable to perform compute '%s'\n", arg.c_str());
+ return -1;
+}
+
+int GUIAction::setguitimezone(std::string arg __unused)
+{
+ string SelectedZone;
+ DataManager::GetValue(TW_TIME_ZONE_GUISEL, SelectedZone); // read the selected time zone into SelectedZone
+ string Zone = SelectedZone.substr(0, SelectedZone.find(';')); // parse to get time zone
+ string DSTZone = SelectedZone.substr(SelectedZone.find(';') + 1, string::npos); // parse to get DST component
+
+ int dst;
+ DataManager::GetValue(TW_TIME_ZONE_GUIDST, dst); // check wether user chose to use DST
+
+ string offset;
+ DataManager::GetValue(TW_TIME_ZONE_GUIOFFSET, offset); // pull in offset
+
+ string NewTimeZone = Zone;
+ if (offset != "0")
+ NewTimeZone += ":" + offset;
+
+ if (dst != 0)
+ NewTimeZone += DSTZone;
+
+ DataManager::SetValue(TW_TIME_ZONE_VAR, NewTimeZone);
+ DataManager::update_tz_environment_variables();
+ return 0;
+}
+
+int GUIAction::overlay(std::string arg)
+{
+ return gui_changeOverlay(arg);
+}
+
+int GUIAction::queuezip(std::string arg __unused)
+{
+ if (zip_queue_index >= 10) {
+ gui_msg("max_queue=Maximum zip queue reached!");
+ return 0;
+ }
+ DataManager::GetValue("tw_filename", zip_queue[zip_queue_index]);
+ if (strlen(zip_queue[zip_queue_index].c_str()) > 0) {
+ zip_queue_index++;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
+ }
+ return 0;
+}
+
+int GUIAction::cancelzip(std::string arg __unused)
+{
+ if (zip_queue_index <= 0) {
+ gui_msg("min_queue=Minimum zip queue reached!");
+ return 0;
+ } else {
+ zip_queue_index--;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
+ }
+ return 0;
+}
+
+int GUIAction::queueclear(std::string arg __unused)
+{
+ zip_queue_index = 0;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
+ return 0;
+}
+
+int GUIAction::sleep(std::string arg)
+{
+ operation_start("Sleep");
+ usleep(atoi(arg.c_str()));
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::sleepcounter(std::string arg)
+{
+ operation_start("SleepCounter");
+ // Ensure user notices countdown in case it needs to be cancelled
+ blankTimer.resetTimerAndUnblank();
+ int total = atoi(arg.c_str());
+ for (int t = total; t > 0; t--) {
+ int progress = (int)(((float)(total-t)/(float)total)*100.0);
+ DataManager::SetValue("ui_progress", progress);
+ ::sleep(1);
+ DataManager::SetValue("tw_sleep", t-1);
+ }
+ DataManager::SetValue("ui_progress", 100);
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::appenddatetobackupname(std::string arg __unused)
+{
+ operation_start("AppendDateToBackupName");
+ string Backup_Name;
+ DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
+ Backup_Name += TWFunc::Get_Current_Date();
+ if (Backup_Name.size() > MAX_BACKUP_NAME_LEN)
+ Backup_Name.resize(MAX_BACKUP_NAME_LEN);
+ DataManager::SetValue(TW_BACKUP_NAME, Backup_Name);
+ PageManager::NotifyKey(KEY_END, true);
+ PageManager::NotifyKey(KEY_END, false);
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::generatebackupname(std::string arg __unused)
+{
+ operation_start("GenerateBackupName");
+ TWFunc::Auto_Generate_Backup_Name();
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::checkpartitionlist(std::string arg)
+{
+ string List, part_path;
+ int count = 0;
+
+ if (arg.empty())
+ arg = "tw_wipe_list";
+ DataManager::GetValue(arg, List);
+ LOGINFO("checkpartitionlist list '%s'\n", List.c_str());
+ if (!List.empty()) {
+ size_t start_pos = 0, end_pos = List.find(";", start_pos);
+ while (end_pos != string::npos && start_pos < List.size()) {
+ part_path = List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("checkpartitionlist part_path '%s'\n", part_path.c_str());
+ if (part_path == "/and-sec" || part_path == "DALVIK" || part_path == "INTERNAL") {
+ // Do nothing
+ } else {
+ count++;
+ }
+ start_pos = end_pos + 1;
+ end_pos = List.find(";", start_pos);
+ }
+ DataManager::SetValue("tw_check_partition_list", count);
+ } else {
+ DataManager::SetValue("tw_check_partition_list", 0);
+ }
+ return 0;
+}
+
+int GUIAction::getpartitiondetails(std::string arg)
+{
+ string List, part_path;
+
+ if (arg.empty())
+ arg = "tw_wipe_list";
+ DataManager::GetValue(arg, List);
+ LOGINFO("getpartitiondetails list '%s'\n", List.c_str());
+ if (!List.empty()) {
+ size_t start_pos = 0, end_pos = List.find(";", start_pos);
+ part_path = List;
+ while (end_pos != string::npos && start_pos < List.size()) {
+ part_path = List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("getpartitiondetails part_path '%s'\n", part_path.c_str());
+ if (part_path == "/and-sec" || part_path == "DALVIK" || part_path == "INTERNAL") {
+ // Do nothing
+ } else {
+ DataManager::SetValue("tw_partition_path", part_path);
+ break;
+ }
+ start_pos = end_pos + 1;
+ end_pos = List.find(";", start_pos);
+ }
+ if (!part_path.empty()) {
+ TWPartition* Part = PartitionManager.Find_Partition_By_Path(part_path);
+ if (Part) {
+ unsigned long long mb = 1048576;
+
+ DataManager::SetValue("tw_partition_name", Part->Display_Name);
+ DataManager::SetValue("tw_partition_mount_point", Part->Mount_Point);
+ DataManager::SetValue("tw_partition_file_system", Part->Current_File_System);
+ DataManager::SetValue("tw_partition_size", Part->Size / mb);
+ DataManager::SetValue("tw_partition_used", Part->Used / mb);
+ DataManager::SetValue("tw_partition_free", Part->Free / mb);
+ DataManager::SetValue("tw_partition_backup_size", Part->Backup_Size / mb);
+ DataManager::SetValue("tw_partition_removable", Part->Removable);
+ DataManager::SetValue("tw_partition_is_present", Part->Is_Present);
+
+ if (Part->Can_Repair())
+ DataManager::SetValue("tw_partition_can_repair", 1);
+ else
+ DataManager::SetValue("tw_partition_can_repair", 0);
+ if (Part->Can_Resize())
+ DataManager::SetValue("tw_partition_can_resize", 1);
+ else
+ DataManager::SetValue("tw_partition_can_resize", 0);
+ if (TWFunc::Path_Exists("/sbin/mkfs.fat"))
+ DataManager::SetValue("tw_partition_vfat", 1);
+ else
+ DataManager::SetValue("tw_partition_vfat", 0);
+ if (TWFunc::Path_Exists("/sbin/mkexfatfs"))
+ DataManager::SetValue("tw_partition_exfat", 1);
+ else
+ DataManager::SetValue("tw_partition_exfat", 0);
+ if (TWFunc::Path_Exists("/sbin/mkfs.f2fs"))
+ DataManager::SetValue("tw_partition_f2fs", 1);
+ else
+ DataManager::SetValue("tw_partition_f2fs", 0);
+ if (TWFunc::Path_Exists("/sbin/mke2fs"))
+ DataManager::SetValue("tw_partition_ext", 1);
+ else
+ DataManager::SetValue("tw_partition_ext", 0);
+ return 0;
+ } else {
+ LOGERR("Unable to locate partition: '%s'\n", part_path.c_str());
+ }
+ }
+ }
+ DataManager::SetValue("tw_partition_name", "");
+ DataManager::SetValue("tw_partition_file_system", "");
+ // Set this to 0 to prevent trying to partition this device, just in case
+ DataManager::SetValue("tw_partition_removable", 0);
+ return 0;
+}
+
+int GUIAction::screenshot(std::string arg __unused)
+{
+ time_t tm;
+ char path[256];
+ int path_len;
+ uid_t uid = AID_MEDIA_RW;
+ gid_t gid = AID_MEDIA_RW;
+
+ const std::string storage = DataManager::GetCurrentStoragePath();
+ if (PartitionManager.Is_Mounted_By_Path(storage)) {
+ snprintf(path, sizeof(path), "%s/Pictures/Screenshots/", storage.c_str());
+ } else {
+ strcpy(path, "/tmp/");
+ }
+
+ if (!TWFunc::Create_Dir_Recursive(path, 0775, uid, gid))
+ return 0;
+
+ tm = time(NULL);
+ path_len = strlen(path);
+
+ // Screenshot_2014-01-01-18-21-38.png
+ strftime(path+path_len, sizeof(path)-path_len, "Screenshot_%Y-%m-%d-%H-%M-%S.png", localtime(&tm));
+
+ int res = gr_save_screenshot(path);
+ if (res == 0) {
+ chmod(path, 0666);
+ chown(path, uid, gid);
+
+ gui_msg(Msg("screenshot_saved=Screenshot was saved to {1}")(path));
+
+ // blink to notify that the screenshow was taken
+ gr_color(255, 255, 255, 255);
+ gr_fill(0, 0, gr_fb_width(), gr_fb_height());
+ gr_flip();
+ gui_forceRender();
+ } else {
+ gui_err("screenshot_err=Failed to take a screenshot!");
+ }
+ return 0;
+}
+
+int GUIAction::setbrightness(std::string arg)
+{
+ return TWFunc::Set_Brightness(arg);
+}
+
+int GUIAction::fileexists(std::string arg)
+{
+ struct stat st;
+ string newpath = arg + "/.";
+
+ operation_start("FileExists");
+ if (stat(arg.c_str(), &st) == 0 || stat(newpath.c_str(), &st) == 0)
+ operation_end(0);
+ else
+ operation_end(1);
+ return 0;
+}
+
+void GUIAction::reinject_after_flash()
+{
+ if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
+ gui_msg("injecttwrp=Injecting TWRP into boot image...");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+ if (Boot == NULL || Boot->Current_File_System != "emmc")
+ TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+ else {
+ string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
+ TWFunc::Exec_Cmd(injectcmd);
+ }
+ gui_msg("done=Done.");
+ }
+ }
+}
+
+int GUIAction::flash(std::string arg)
+{
+ int i, ret_val = 0, wipe_cache = 0;
+ // We're going to jump to this page first, like a loading page
+ gui_changePage(arg);
+ for (i=0; i<zip_queue_index; i++) {
+ string zip_path = zip_queue[i];
+ size_t slashpos = zip_path.find_last_of('/');
+ string zip_filename = (slashpos == string::npos) ? zip_path : zip_path.substr(slashpos + 1);
+ operation_start("Flashing");
+ DataManager::SetValue("tw_filename", zip_path);
+ DataManager::SetValue("tw_file", zip_filename);
+ DataManager::SetValue(TW_ZIP_INDEX, (i + 1));
+
+ TWFunc::SetPerformanceMode(true);
+ ret_val = flash_zip(zip_path, &wipe_cache);
+ TWFunc::SetPerformanceMode(false);
+ if (ret_val != 0) {
+ gui_msg(Msg(msg::kError, "zip_err=Error installing zip file '{1}'")(zip_path));
+ ret_val = 1;
+ break;
+ }
+ }
+ zip_queue_index = 0;
+
+ if (wipe_cache) {
+ gui_msg("zip_wipe_cache=One or more zip requested a cache wipe -- Wiping cache now.");
+ PartitionManager.Wipe_By_Path("/cache");
+ }
+
+ reinject_after_flash();
+ PartitionManager.Update_System_Details();
+ operation_end(ret_val);
+ // This needs to be after the operation_end call so we change pages before we change variables that we display on the screen
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
+ return 0;
+}
+
+int GUIAction::wipe(std::string arg)
+{
+ operation_start("Format");
+ DataManager::SetValue("tw_partition", arg);
+
+ int ret_val = false;
+
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ if (arg == "data")
+ ret_val = PartitionManager.Factory_Reset();
+ else if (arg == "battery")
+ ret_val = PartitionManager.Wipe_Battery_Stats();
+ else if (arg == "rotate")
+ ret_val = PartitionManager.Wipe_Rotate_Data();
+ else if (arg == "dalvik")
+ ret_val = PartitionManager.Wipe_Dalvik_Cache();
+ else if (arg == "DATAMEDIA") {
+ ret_val = PartitionManager.Format_Data();
+ } else if (arg == "INTERNAL") {
+ int has_datamedia;
+
+ DataManager::GetValue(TW_HAS_DATA_MEDIA, has_datamedia);
+ if (has_datamedia) {
+ ret_val = PartitionManager.Wipe_Media_From_Data();
+ } else {
+ ret_val = PartitionManager.Wipe_By_Path(DataManager::GetSettingsStoragePath());
+ }
+ } else if (arg == "EXTERNAL") {
+ string External_Path;
+
+ DataManager::GetValue(TW_EXTERNAL_PATH, External_Path);
+ ret_val = PartitionManager.Wipe_By_Path(External_Path);
+ } else if (arg == "ANDROIDSECURE") {
+ ret_val = PartitionManager.Wipe_Android_Secure();
+ } else if (arg == "LIST") {
+ string Wipe_List, wipe_path;
+ bool skip = false;
+ ret_val = true;
+
+ DataManager::GetValue("tw_wipe_list", Wipe_List);
+ LOGINFO("wipe list '%s'\n", Wipe_List.c_str());
+ if (!Wipe_List.empty()) {
+ size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
+ while (end_pos != string::npos && start_pos < Wipe_List.size()) {
+ wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("wipe_path '%s'\n", wipe_path.c_str());
+ if (wipe_path == "/and-sec") {
+ if (!PartitionManager.Wipe_Android_Secure()) {
+ gui_msg("and_sec_wipe_err=Unable to wipe android secure");
+ ret_val = false;
+ break;
+ } else {
+ skip = true;
+ }
+ } else if (wipe_path == "DALVIK") {
+ if (!PartitionManager.Wipe_Dalvik_Cache()) {
+ gui_err("dalvik_wipe_err=Failed to wipe dalvik");
+ ret_val = false;
+ break;
+ } else {
+ skip = true;
+ }
+ } else if (wipe_path == "INTERNAL") {
+ if (!PartitionManager.Wipe_Media_From_Data()) {
+ ret_val = false;
+ break;
+ } else {
+ skip = true;
+ }
+ }
+ if (!skip) {
+ if (!PartitionManager.Wipe_By_Path(wipe_path)) {
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(wipe_path));
+ ret_val = false;
+ break;
+ } else if (wipe_path == DataManager::GetSettingsStoragePath()) {
+ arg = wipe_path;
+ }
+ } else {
+ skip = false;
+ }
+ start_pos = end_pos + 1;
+ end_pos = Wipe_List.find(";", start_pos);
+ }
+ }
+ } else
+ ret_val = PartitionManager.Wipe_By_Path(arg);
+#ifndef TW_OEM_BUILD
+ if (arg == DataManager::GetSettingsStoragePath()) {
+ // If we wiped the settings storage path, recreate the TWRP folder and dump the settings
+ string Storage_Path = DataManager::GetSettingsStoragePath();
+
+ if (PartitionManager.Mount_By_Path(Storage_Path, true)) {
+ LOGINFO("Making TWRP folder and saving settings.\n");
+ Storage_Path += "/TWRP";
+ mkdir(Storage_Path.c_str(), 0777);
+ DataManager::Flush();
+ } else {
+ LOGERR("Unable to recreate TWRP folder and save settings.\n");
+ }
+ }
+#endif
+ }
+ PartitionManager.Update_System_Details();
+ if (ret_val)
+ ret_val = 0; // 0 is success
+ else
+ ret_val = 1; // 1 is failure
+ operation_end(ret_val);
+ return 0;
+}
+
+int GUIAction::refreshsizes(std::string arg __unused)
+{
+ operation_start("Refreshing Sizes");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ PartitionManager.Update_System_Details();
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::nandroid(std::string arg)
+{
+ if (simulate) {
+ PartitionManager.stop_backup.set_value(0);
+ DataManager::SetValue("tw_partition", "Simulation");
+ simulate_progress_bar();
+ operation_end(0);
+ } else {
+ operation_start("Nandroid");
+ int ret = 0;
+
+ if (arg == "backup") {
+ string Backup_Name;
+ DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
+ string auto_gen = gui_lookup("auto_generate", "(Auto Generate)");
+ if (Backup_Name == auto_gen || Backup_Name == gui_lookup("curr_date", "(Current Date)") || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0) {
+ ret = PartitionManager.Run_Backup(false);
+ } else {
+ operation_end(1);
+ return -1;
+ }
+ DataManager::SetValue(TW_BACKUP_NAME, auto_gen);
+ } else if (arg == "restore") {
+ string Restore_Name;
+ DataManager::GetValue("tw_restore", Restore_Name);
+ ret = PartitionManager.Run_Restore(Restore_Name);
+ } else {
+ operation_end(1);
+ return -1;
+ }
+ DataManager::SetValue("tw_encrypt_backup", 0);
+ if (!PartitionManager.stop_backup.get_value()) {
+ if (ret == false)
+ ret = 1; // 1 for failure
+ else
+ ret = 0; // 0 for success
+ DataManager::SetValue("tw_cancel_backup", 0);
+ }
+ else {
+ DataManager::SetValue("tw_cancel_backup", 1);
+ gui_msg("backup_cancel=Backup Cancelled");
+ ret = 0;
+ }
+ operation_end(ret);
+ return ret;
+ }
+ return 0;
+}
+
+int GUIAction::cancelbackup(std::string arg __unused) {
+ if (simulate) {
+ PartitionManager.stop_backup.set_value(1);
+ }
+ else {
+ int op_status = PartitionManager.Cancel_Backup();
+ if (op_status != 0)
+ op_status = 1; // failure
+ }
+
+ return 0;
+}
+
+int GUIAction::fixcontexts(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Fix Contexts");
+ LOGINFO("fix contexts started!\n");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ op_status = PartitionManager.Fix_Contexts();
+ if (op_status != 0)
+ op_status = 1; // failure
+ }
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::fixpermissions(std::string arg)
+{
+ return fixcontexts(arg);
+}
+
+int GUIAction::dd(std::string arg)
+{
+ operation_start("imaging");
+
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string cmd = "dd " + arg;
+ TWFunc::Exec_Cmd(cmd);
+ }
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::partitionsd(std::string arg __unused)
+{
+ operation_start("Partition SD Card");
+ int ret_val = 0;
+
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ int allow_partition;
+ DataManager::GetValue(TW_ALLOW_PARTITION_SDCARD, allow_partition);
+ if (allow_partition == 0) {
+ gui_err("no_real_sdcard=This device does not have a real SD Card! Aborting!");
+ } else {
+ if (!PartitionManager.Partition_SDCard())
+ ret_val = 1; // failed
+ }
+ }
+ operation_end(ret_val);
+ return 0;
+
+}
+
+int GUIAction::installhtcdumlock(std::string arg __unused)
+{
+ operation_start("Install HTC Dumlock");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ TWFunc::install_htc_dumlock();
+
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::htcdumlockrestoreboot(std::string arg __unused)
+{
+ operation_start("HTC Dumlock Restore Boot");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ TWFunc::htc_dumlock_restore_original_boot();
+
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::htcdumlockreflashrecovery(std::string arg __unused)
+{
+ operation_start("HTC Dumlock Reflash Recovery");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ TWFunc::htc_dumlock_reflash_recovery_to_boot();
+
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::cmd(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Command");
+ LOGINFO("Running command: '%s'\n", arg.c_str());
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ op_status = TWFunc::Exec_Cmd(arg);
+ if (op_status != 0)
+ op_status = 1;
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::terminalcommand(std::string arg)
+{
+ int op_status = 0;
+ string cmdpath, command;
+
+ DataManager::GetValue("tw_terminal_location", cmdpath);
+ operation_start("CommandOutput");
+ gui_print("%s # %s\n", cmdpath.c_str(), arg.c_str());
+ if (simulate) {
+ simulate_progress_bar();
+ operation_end(op_status);
+ } else if (arg == "exit") {
+ LOGINFO("Exiting terminal\n");
+ operation_end(op_status);
+ page("main");
+ } else {
+ command = "cd \"" + cmdpath + "\" && " + arg + " 2>&1";;
+ LOGINFO("Actual command is: '%s'\n", command.c_str());
+ DataManager::SetValue("tw_terminal_state", 1);
+ DataManager::SetValue("tw_background_thread_running", 1);
+ FILE* fp;
+ char line[512];
+
+ fp = popen(command.c_str(), "r");
+ if (fp == NULL) {
+ LOGERR("Error opening command to run (%s).\n", strerror(errno));
+ } else {
+ int fd = fileno(fp), has_data = 0, check = 0, keep_going = -1;
+ struct timeval timeout;
+ fd_set fdset;
+
+ while (keep_going)
+ {
+ FD_ZERO(&fdset);
+ FD_SET(fd, &fdset);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 400000;
+ has_data = select(fd+1, &fdset, NULL, NULL, &timeout);
+ if (has_data == 0) {
+ // Timeout reached
+ DataManager::GetValue("tw_terminal_state", check);
+ if (check == 0) {
+ keep_going = 0;
+ }
+ } else if (has_data < 0) {
+ // End of execution
+ keep_going = 0;
+ } else {
+ // Try to read output
+ if (fgets(line, sizeof(line), fp) != NULL)
+ gui_print("%s", line); // Display output
+ else
+ keep_going = 0; // Done executing
+ }
+ }
+ fclose(fp);
+ }
+ DataManager::SetValue("tw_operation_status", 0);
+ DataManager::SetValue("tw_operation_state", 1);
+ DataManager::SetValue("tw_terminal_state", 0);
+ DataManager::SetValue("tw_background_thread_running", 0);
+ DataManager::SetValue(TW_ACTION_BUSY, 0);
+ }
+ return 0;
+}
+
+int GUIAction::killterminal(std::string arg __unused)
+{
+ LOGINFO("Sending kill command...\n");
+ operation_start("KillCommand");
+ DataManager::SetValue("tw_operation_status", 0);
+ DataManager::SetValue("tw_operation_state", 1);
+ DataManager::SetValue("tw_terminal_state", 0);
+ DataManager::SetValue("tw_background_thread_running", 0);
+ DataManager::SetValue(TW_ACTION_BUSY, 0);
+ return 0;
+}
+
+int GUIAction::reinjecttwrp(std::string arg __unused)
+{
+ int op_status = 0;
+ operation_start("ReinjectTWRP");
+ gui_msg("injecttwrp=Injecting TWRP into boot image...");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+ gui_msg("done=Done.");
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::checkbackupname(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("CheckBackupName");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ op_status = PartitionManager.Check_Backup_Name(true);
+ if (op_status != 0)
+ op_status = 1;
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::decrypt(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Decrypt");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string Password;
+ DataManager::GetValue("tw_crypto_password", Password);
+ op_status = PartitionManager.Decrypt_Device(Password);
+ if (op_status != 0)
+ op_status = 1;
+ else {
+
+ DataManager::SetValue(TW_IS_ENCRYPTED, 0);
+
+ int has_datamedia;
+
+ // Check for a custom theme and load it if exists
+ DataManager::GetValue(TW_HAS_DATA_MEDIA, has_datamedia);
+ if (has_datamedia != 0) {
+ if (tw_get_default_metadata(DataManager::GetSettingsStoragePath().c_str()) != 0) {
+ LOGINFO("Failed to get default contexts and file mode for storage files.\n");
+ } else {
+ LOGINFO("Got default contexts and file mode for storage files.\n");
+ }
+ }
+ PartitionManager.Decrypt_Adopted();
+ }
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::adbsideload(std::string arg __unused)
+{
+ operation_start("Sideload");
+ if (simulate) {
+ simulate_progress_bar();
+ operation_end(0);
+ } else {
+ gui_msg("start_sideload=Starting ADB sideload feature...");
+ bool mtp_was_enabled = TWFunc::Toggle_MTP(false);
+
+ // wait for the adb connection
+ int ret = apply_from_adb("/", &sideload_child_pid);
+ DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui now that the zip install is going to start
+
+ if (ret != 0) {
+ if (ret == -2)
+ gui_msg("need_new_adb=You need adb 1.0.32 or newer to sideload to this device.");
+ ret = 1; // failure
+ } else {
+ int wipe_cache = 0;
+ int wipe_dalvik = 0;
+ DataManager::GetValue("tw_wipe_dalvik", wipe_dalvik);
+
+ if (TWinstall_zip(FUSE_SIDELOAD_HOST_PATHNAME, &wipe_cache) == 0) {
+ if (wipe_cache || DataManager::GetIntValue("tw_wipe_cache"))
+ PartitionManager.Wipe_By_Path("/cache");
+ if (wipe_dalvik)
+ PartitionManager.Wipe_Dalvik_Cache();
+ } else {
+ ret = 1; // failure
+ }
+ }
+ if (sideload_child_pid) {
+ LOGINFO("Signaling child sideload process to exit.\n");
+ struct stat st;
+ // Calling stat() on this magic filename signals the minadbd
+ // subprocess to shut down.
+ stat(FUSE_SIDELOAD_HOST_EXIT_PATHNAME, &st);
+ int status;
+ LOGINFO("Waiting for child sideload process to exit.\n");
+ waitpid(sideload_child_pid, &status, 0);
+ }
+ property_set("ctl.start", "adbd");
+ TWFunc::Toggle_MTP(mtp_was_enabled);
+ reinject_after_flash();
+ operation_end(ret);
+ }
+ return 0;
+}
+
+int GUIAction::adbsideloadcancel(std::string arg __unused)
+{
+ struct stat st;
+ DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui
+ gui_msg("cancel_sideload=Cancelling ADB sideload...");
+ LOGINFO("Signaling child sideload process to exit.\n");
+ // Calling stat() on this magic filename signals the minadbd
+ // subprocess to shut down.
+ stat(FUSE_SIDELOAD_HOST_EXIT_PATHNAME, &st);
+ if (!sideload_child_pid) {
+ LOGERR("Unable to get child ID\n");
+ return 0;
+ }
+ ::sleep(1);
+ LOGINFO("Killing child sideload process.\n");
+ kill(sideload_child_pid, SIGTERM);
+ int status;
+ LOGINFO("Waiting for child sideload process to exit.\n");
+ waitpid(sideload_child_pid, &status, 0);
+ sideload_child_pid = 0;
+ DataManager::SetValue("tw_page_done", "1"); // For OpenRecoveryScript support
+ return 0;
+}
+
+int GUIAction::openrecoveryscript(std::string arg __unused)
+{
+ operation_start("OpenRecoveryScript");
+ if (simulate) {
+ simulate_progress_bar();
+ operation_end(0);
+ } else {
+ int op_status = OpenRecoveryScript::Run_OpenRecoveryScript_Action();
+ operation_end(op_status);
+ }
+ return 0;
+}
+
+int GUIAction::installsu(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Install SuperSU");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ if (!TWFunc::Install_SuperSU())
+ op_status = 1;
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::fixsu(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Fixing Superuser Permissions");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ LOGERR("Fixing su permissions was deprecated from TWRP.\n");
+ LOGERR("4.3+ ROMs with SELinux will always lose su perms.\n");
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::decrypt_backup(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Try Restore Decrypt");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string Restore_Path, Filename, Password;
+ DataManager::GetValue("tw_restore", Restore_Path);
+ Restore_Path += "/";
+ DataManager::GetValue("tw_restore_password", Password);
+ TWFunc::SetPerformanceMode(true);
+ if (TWFunc::Try_Decrypting_Backup(Restore_Path, Password))
+ op_status = 0; // success
+ else
+ op_status = 1; // fail
+ TWFunc::SetPerformanceMode(false);
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::repair(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Repair Partition");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string part_path;
+ DataManager::GetValue("tw_partition_mount_point", part_path);
+ if (PartitionManager.Repair_By_Path(part_path, true)) {
+ op_status = 0; // success
+ } else {
+ op_status = 1; // fail
+ }
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::resize(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Resize Partition");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string part_path;
+ DataManager::GetValue("tw_partition_mount_point", part_path);
+ if (PartitionManager.Resize_By_Path(part_path, true)) {
+ op_status = 0; // success
+ } else {
+ op_status = 1; // fail
+ }
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::changefilesystem(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Change File System");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string part_path, file_system;
+ DataManager::GetValue("tw_partition_mount_point", part_path);
+ DataManager::GetValue("tw_action_new_file_system", file_system);
+ if (PartitionManager.Wipe_By_Path(part_path, file_system)) {
+ op_status = 0; // success
+ } else {
+ gui_err("change_fs_err=Error changing file system.");
+ op_status = 1; // fail
+ }
+ }
+ PartitionManager.Update_System_Details();
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::startmtp(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Start MTP");
+ if (PartitionManager.Enable_MTP())
+ op_status = 0; // success
+ else
+ op_status = 1; // fail
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::stopmtp(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Stop MTP");
+ if (PartitionManager.Disable_MTP())
+ op_status = 0; // success
+ else
+ op_status = 1; // fail
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::flashimage(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Flash Image");
+ string path, filename;
+ DataManager::GetValue("tw_zip_location", path);
+ DataManager::GetValue("tw_file", filename);
+ if (PartitionManager.Flash_Image(path, filename))
+ op_status = 0; // success
+ else
+ op_status = 1; // fail
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::twcmd(std::string arg)
+{
+ operation_start("TWRP CLI Command");
+ if (simulate)
+ simulate_progress_bar();
+ else
+ OpenRecoveryScript::Run_CLI_Command(arg.c_str());
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::getKeyByName(std::string key)
+{
+ if (key == "home") return KEY_HOMEPAGE; // note: KEY_HOME is cursor movement (like KEY_END)
+ else if (key == "menu") return KEY_MENU;
+ else if (key == "back") return KEY_BACK;
+ else if (key == "search") return KEY_SEARCH;
+ else if (key == "voldown") return KEY_VOLUMEDOWN;
+ else if (key == "volup") return KEY_VOLUMEUP;
+ else if (key == "power") {
+ int ret_val;
+ DataManager::GetValue(TW_POWER_BUTTON, ret_val);
+ if (!ret_val)
+ return KEY_POWER;
+ else
+ return ret_val;
+ }
+
+ return atol(key.c_str());
+}
+
+int GUIAction::checkpartitionlifetimewrites(std::string arg)
+{
+ int op_status = 0;
+ TWPartition* sys = PartitionManager.Find_Partition_By_Path(arg);
+
+ operation_start("Check Partition Lifetime Writes");
+ if (sys) {
+ if (sys->Check_Lifetime_Writes() != 0)
+ DataManager::SetValue("tw_lifetime_writes", 1);
+ else
+ DataManager::SetValue("tw_lifetime_writes", 0);
+ op_status = 0; // success
+ } else {
+ DataManager::SetValue("tw_lifetime_writes", 1);
+ op_status = 1; // fail
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::mountsystemtoggle(std::string arg)
+{
+ int op_status = 0;
+ bool remount_system = PartitionManager.Is_Mounted_By_Path("/system");
+ bool remount_vendor = PartitionManager.Is_Mounted_By_Path("/vendor");
+
+ operation_start("Toggle System Mount");
+ if (!PartitionManager.UnMount_By_Path("/system", true)) {
+ op_status = 1; // fail
+ } else {
+ TWPartition* Part = PartitionManager.Find_Partition_By_Path("/system");
+ if (Part) {
+ if (arg == "0") {
+ DataManager::SetValue("tw_mount_system_ro", 0);
+ Part->Change_Mount_Read_Only(false);
+ } else {
+ DataManager::SetValue("tw_mount_system_ro", 1);
+ Part->Change_Mount_Read_Only(true);
+ }
+ if (remount_system) {
+ Part->Mount(true);
+ }
+ op_status = 0; // success
+ } else {
+ op_status = 1; // fail
+ }
+ Part = PartitionManager.Find_Partition_By_Path("/vendor");
+ if (Part) {
+ if (arg == "0") {
+ Part->Change_Mount_Read_Only(false);
+ } else {
+ Part->Change_Mount_Read_Only(true);
+ }
+ if (remount_vendor) {
+ Part->Mount(true);
+ }
+ op_status = 0; // success
+ } else {
+ op_status = 1; // fail
+ }
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::setlanguage(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Set Language");
+ PageManager::LoadLanguage(DataManager::GetStrValue("tw_language"));
+ PageManager::RequestReload();
+ op_status = 0; // success
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::togglebacklight(std::string arg __unused)
+{
+ blankTimer.toggleBlank();
+ return 0;
+}
+
+int GUIAction::setbootslot(std::string arg)
+{
+ operation_start("Set Boot Slot");
+ if (!simulate)
+ PartitionManager.Set_Active_Slot(arg);
+ else
+ simulate_progress_bar();
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::checkforapp(std::string arg __unused)
+{
+ operation_start("Check for TWRP App");
+ if (!simulate)
+ {
+ string sdkverstr = TWFunc::System_Property_Get("ro.build.version.sdk");
+ int sdkver = 0;
+ if (!sdkverstr.empty()) {
+ sdkver = atoi(sdkverstr.c_str());
+ }
+ if (sdkver <= 13) {
+ if (sdkver == 0)
+ LOGINFO("Unable to read sdk version from build prop\n");
+ else
+ LOGINFO("SDK version too low for TWRP app (%i < 14)\n", sdkver);
+ DataManager::SetValue("tw_app_install_status", 1); // 0 = no status, 1 = not installed, 2 = already installed or do not install
+ goto exit;
+ }
+ if (PartitionManager.Mount_By_Path("/system", false)) {
+ string base_path = "/system";
+ if (TWFunc::Path_Exists("/system/system"))
+ base_path += "/system"; // For devices with system as a root file system (e.g. Pixel)
+ string install_path = base_path + "/priv-app";
+ if (!TWFunc::Path_Exists(install_path))
+ install_path = base_path + "/app";
+ install_path += "/twrpapp";
+ if (TWFunc::Path_Exists(install_path)) {
+ LOGINFO("App found at '%s'\n", install_path.c_str());
+ DataManager::SetValue("tw_app_install_status", 2); // 0 = no status, 1 = not installed, 2 = already installed or do not install
+ goto exit;
+ }
+ }
+ if (PartitionManager.Mount_By_Path("/data", false)) {
+ const char parent_path[] = "/data/app";
+ const char app_prefix[] = "me.twrp.twrpapp-";
+ DIR *d = opendir(parent_path);
+ if (d) {
+ struct dirent *p;
+ while ((p = readdir(d))) {
+ if (p->d_type != DT_DIR || strlen(p->d_name) < strlen(app_prefix) || strncmp(p->d_name, app_prefix, strlen(app_prefix)))
+ continue;
+ closedir(d);
+ LOGINFO("App found at '%s/%s'\n", parent_path, p->d_name);
+ DataManager::SetValue("tw_app_install_status", 2); // 0 = no status, 1 = not installed, 2 = already installed or do not install
+ goto exit;
+ }
+ closedir(d);
+ }
+ } else {
+ LOGINFO("Data partition cannot be mounted during app check\n");
+ DataManager::SetValue("tw_app_install_status", 2); // 0 = no status, 1 = not installed, 2 = already installed or do not install
+ }
+ } else
+ simulate_progress_bar();
+ LOGINFO("App not installed\n");
+ DataManager::SetValue("tw_app_install_status", 1); // 0 = no status, 1 = not installed, 2 = already installed
+exit:
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::installapp(std::string arg __unused)
+{
+ int op_status = 1;
+ operation_start("Install TWRP App");
+ if (!simulate)
+ {
+ if (DataManager::GetIntValue("tw_mount_system_ro") > 0 || DataManager::GetIntValue("tw_app_install_system") == 0) {
+ if (PartitionManager.Mount_By_Path("/data", true)) {
+ string install_path = "/data/app";
+ string context = "u:object_r:apk_data_file:s0";
+ if (!TWFunc::Path_Exists(install_path)) {
+ if (mkdir(install_path.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
+ LOGERR("Error making %s directory: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ if (chown(install_path.c_str(), 1000, 1000)) {
+ LOGERR("chown %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ if (setfilecon(install_path.c_str(), (security_context_t)context.c_str()) < 0) {
+ LOGERR("setfilecon %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ }
+ install_path += "/me.twrp.twrpapp-1";
+ if (mkdir(install_path.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
+ LOGERR("Error making %s directory: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ if (chown(install_path.c_str(), 1000, 1000)) {
+ LOGERR("chown %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ if (setfilecon(install_path.c_str(), (security_context_t)context.c_str()) < 0) {
+ LOGERR("setfilecon %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ install_path += "/base.apk";
+ if (TWFunc::copy_file("/sbin/me.twrp.twrpapp.apk", install_path, 0644)) {
+ LOGERR("Error copying apk file\n");
+ goto exit;
+ }
+ if (chown(install_path.c_str(), 1000, 1000)) {
+ LOGERR("chown %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ if (setfilecon(install_path.c_str(), (security_context_t)context.c_str()) < 0) {
+ LOGERR("setfilecon %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ sync();
+ sync();
+ }
+ } else {
+ if (PartitionManager.Mount_By_Path("/system", true)) {
+ string base_path = "/system";
+ if (TWFunc::Path_Exists("/system/system"))
+ base_path += "/system"; // For devices with system as a root file system (e.g. Pixel)
+ string install_path = base_path + "/priv-app";
+ string context = "u:object_r:system_file:s0";
+ if (!TWFunc::Path_Exists(install_path))
+ install_path = base_path + "/app";
+ if (TWFunc::Path_Exists(install_path)) {
+ install_path += "/twrpapp";
+ LOGINFO("Installing app to '%s'\n", install_path.c_str());
+ if (mkdir(install_path.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0) {
+ if (setfilecon(install_path.c_str(), (security_context_t)context.c_str()) < 0) {
+ LOGERR("setfilecon %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ install_path += "/me.twrp.twrpapp.apk";
+ if (TWFunc::copy_file("/sbin/me.twrp.twrpapp.apk", install_path, 0644)) {
+ LOGERR("Error copying apk file\n");
+ goto exit;
+ }
+ if (setfilecon(install_path.c_str(), (security_context_t)context.c_str()) < 0) {
+ LOGERR("setfilecon %s error: %s\n", install_path.c_str(), strerror(errno));
+ goto exit;
+ }
+ sync();
+ sync();
+ PartitionManager.UnMount_By_Path("/system", true);
+ op_status = 0;
+ } else {
+ LOGERR("Error making app directory '%s': %s\n", strerror(errno));
+ }
+ }
+ }
+ }
+ } else
+ simulate_progress_bar();
+exit:
+ operation_end(0);
+ return 0;
+}
diff --git a/gui/animation.cpp b/gui/animation.cpp
new file mode 100644
index 000000000..2244503e8
--- /dev/null
+++ b/gui/animation.cpp
@@ -0,0 +1,147 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// animation.cpp - GUIAnimation object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+
+GUIAnimation::GUIAnimation(xml_node<>* node) : GUIObject(node)
+{
+ xml_node<>* child;
+
+ mAnimation = NULL;
+ mFrame = 1;
+ mFPS = 1;
+ mLoop = -1;
+ mRender = 1;
+ mUpdateCount = 0;
+
+ if (!node) return;
+
+ mAnimation = LoadAttrAnimation(FindNode(node, "resource"), "name");
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
+
+ child = FindNode(node, "speed");
+ if (child)
+ {
+ mFPS = LoadAttrInt(child, "fps", mFPS);
+ mRender = LoadAttrInt(child, "render", mRender);
+ }
+ if (mFPS > 30) mFPS = 30;
+
+ child = FindNode(node, "loop");
+ if (child)
+ {
+ xml_attribute<>* attr = child->first_attribute("frame");
+ if (attr)
+ mLoop = atoi(attr->value()) - 1;
+ mFrame = LoadAttrInt(child, "start", mFrame);
+ }
+
+ // Fetch the render sizes
+ if (mAnimation && mAnimation->GetResource())
+ {
+ mRenderW = mAnimation->GetWidth();
+ mRenderH = mAnimation->GetHeight();
+
+ // Adjust for placement
+ if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
+ {
+ if (mPlacement == CENTER)
+ mRenderX -= (mRenderW / 2);
+ else
+ mRenderX -= mRenderW;
+ }
+ if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
+ {
+ if (mPlacement == CENTER)
+ mRenderY -= (mRenderH / 2);
+ else
+ mRenderY -= mRenderH;
+ }
+ SetPlacement(TOP_LEFT);
+ }
+}
+
+int GUIAnimation::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (!mAnimation || !mAnimation->GetResource(mFrame)) return -1;
+
+ gr_blit(mAnimation->GetResource(mFrame), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ return 0;
+}
+
+int GUIAnimation::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (!mAnimation) return -1;
+
+ // Handle the "end-of-animation" state
+ if (mLoop == -2) return 0;
+
+ // Determine if we need the next frame yet...
+ if (++mUpdateCount > 30 / mFPS)
+ {
+ mUpdateCount = 0;
+ if (++mFrame >= mAnimation->GetResourceCount())
+ {
+ if (mLoop < 0)
+ {
+ mFrame = mAnimation->GetResourceCount() - 1;
+ mLoop = -2;
+ }
+ else
+ mFrame = mLoop;
+ }
+ if (mRender == 2) return 2;
+ return (Render() == 0 ? 1 : -1);
+ }
+ return 0;
+}
+
diff --git a/gui/blanktimer.cpp b/gui/blanktimer.cpp
new file mode 100644
index 000000000..220525387
--- /dev/null
+++ b/gui/blanktimer.cpp
@@ -0,0 +1,152 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+using namespace std;
+#include <string>
+#include <pthread.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include "pages.hpp"
+#include "blanktimer.hpp"
+#include "../data.hpp"
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+#include "../twrp-functions.hpp"
+#include "../variables.h"
+
+blanktimer::blanktimer(void) {
+ pthread_mutex_init(&mutex, NULL);
+ setTime(0); // no timeout
+ state = kOn;
+ orig_brightness = getBrightness();
+}
+
+bool blanktimer::isScreenOff() {
+ return state >= kOff;
+}
+
+void blanktimer::setTime(int newtime) {
+ pthread_mutex_lock(&mutex);
+ sleepTimer = newtime;
+ pthread_mutex_unlock(&mutex);
+}
+
+void blanktimer::setTimer(void) {
+ clock_gettime(CLOCK_MONOTONIC, &btimer);
+}
+
+void blanktimer::checkForTimeout() {
+#ifndef TW_NO_SCREEN_TIMEOUT
+ pthread_mutex_lock(&mutex);
+ timespec curTime, diff;
+ clock_gettime(CLOCK_MONOTONIC, &curTime);
+ diff = TWFunc::timespec_diff(btimer, curTime);
+ if (sleepTimer > 2 && diff.tv_sec > (sleepTimer - 2) && state == kOn) {
+ orig_brightness = getBrightness();
+ state = kDim;
+ TWFunc::Set_Brightness("5");
+ }
+ if (sleepTimer && diff.tv_sec > sleepTimer && state < kOff) {
+ state = kOff;
+ TWFunc::Set_Brightness("0");
+ TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
+ PageManager::ChangeOverlay("lock");
+ }
+#ifndef TW_NO_SCREEN_BLANK
+ if (state == kOff) {
+ gr_fb_blank(true);
+ state = kBlanked;
+ }
+#endif
+ pthread_mutex_unlock(&mutex);
+#endif
+}
+
+string blanktimer::getBrightness(void) {
+ string result;
+
+ if (DataManager::GetIntValue("tw_has_brightnesss_file")) {
+ DataManager::GetValue("tw_brightness", result);
+ if (result.empty())
+ result = "255";
+ }
+ return result;
+}
+
+void blanktimer::resetTimerAndUnblank(void) {
+#ifndef TW_NO_SCREEN_TIMEOUT
+ pthread_mutex_lock(&mutex);
+ setTimer();
+ switch (state) {
+ case kBlanked:
+#ifndef TW_NO_SCREEN_BLANK
+ gr_fb_blank(false);
+#endif
+ // TODO: this is asymmetric with postscreenblank.sh - shouldn't it be under the next case label?
+ TWFunc::check_and_run_script("/sbin/postscreenunblank.sh", "unblank");
+ // No break here, we want to keep going
+ case kOff:
+ gui_forceRender();
+ // No break here, we want to keep going
+ case kDim:
+ if (!orig_brightness.empty())
+ TWFunc::Set_Brightness(orig_brightness);
+ state = kOn;
+ case kOn:
+ break;
+ }
+ pthread_mutex_unlock(&mutex);
+#endif
+}
+
+void blanktimer::blank(void) {
+/* 1) No need for timer handling since checkForTimeout() verifies
+ * state of screen before performing screen-off
+ * 2) Assume screen-off causes issues for devices that set
+ * TW_NO_SCREEN_TIMEOUT and do not blank screen here either
+ */
+
+#ifndef TW_NO_SCREEN_TIMEOUT
+ pthread_mutex_lock(&mutex);
+ if (state == kOn) {
+ orig_brightness = getBrightness();
+ state = kOff;
+ TWFunc::Set_Brightness("0");
+ TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
+ }
+#ifndef TW_NO_SCREEN_BLANK
+ if (state == kOff) {
+ gr_fb_blank(true);
+ state = kBlanked;
+ }
+#endif
+ pthread_mutex_unlock(&mutex);
+#endif
+}
+
+void blanktimer::toggleBlank(void) {
+ if (state == kOn) {
+ blank();
+ PageManager::ChangeOverlay("lock");
+ } else {
+ resetTimerAndUnblank();
+ }
+}
diff --git a/gui/blanktimer.hpp b/gui/blanktimer.hpp
new file mode 100644
index 000000000..fe7b77c17
--- /dev/null
+++ b/gui/blanktimer.hpp
@@ -0,0 +1,60 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __BLANKTIMER_HEADER_HPP
+#define __BLANKTIMER_HEADER_HPP
+
+#include <sys/time.h>
+
+using namespace std;
+
+class blanktimer
+{
+public:
+ blanktimer();
+
+ // set timeout in seconds
+ void setTime(int newtime);
+
+ // call this in regular intervals
+ void checkForTimeout();
+
+ // call this when an input event is received or when an operation is finished
+ void resetTimerAndUnblank();
+
+ // call this when power button is pressed
+ void toggleBlank(void);
+
+ bool isScreenOff();
+
+private:
+ void setTimer(void);
+ string getBrightness(void);
+ void blank(void);
+
+ pthread_mutex_t mutex;
+ enum State { kOn = 0, kDim = 1, kOff = 2, kBlanked = 3 };
+ State state;
+ timespec btimer;
+ long sleepTimer;
+ string orig_brightness;
+};
+
+extern blanktimer blankTimer;
+
+#endif // __BLANKTIMER_HEADER_HPP
diff --git a/gui/button.cpp b/gui/button.cpp
new file mode 100644
index 000000000..a9b02a305
--- /dev/null
+++ b/gui/button.cpp
@@ -0,0 +1,263 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "../data.hpp"
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUIButton::GUIButton(xml_node<>* node)
+ : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mButtonImg = NULL;
+ mButtonIcon = NULL;
+ mButtonLabel = NULL;
+ mAction = NULL;
+ mRendered = false;
+ hasHighlightColor = false;
+ renderHighlight = false;
+ hasFill = false;
+
+ if (!node) return;
+
+ // These can be loaded directly from the node
+ mButtonLabel = new GUIText(node);
+ mAction = new GUIAction(node);
+
+ mButtonImg = new GUIImage(node);
+ if (mButtonImg->Render() < 0)
+ {
+ delete mButtonImg;
+ mButtonImg = NULL;
+ }
+ if (mButtonLabel->Render() < 0)
+ {
+ delete mButtonLabel;
+ mButtonLabel = NULL;
+ }
+ // Load fill if it exists
+ mFillColor = LoadAttrColor(FindNode(node, "fill"), "color", &hasFill);
+ if (!hasFill && mButtonImg == NULL) {
+ LOGERR("No image resource or fill specified for button.\n");
+ }
+
+ // The icon is a special case
+ mButtonIcon = LoadAttrImage(FindNode(node, "icon"), "resource");
+
+ mHighlightColor = LoadAttrColor(FindNode(node, "highlight"), "color", &hasHighlightColor);
+
+ int x = 0, y = 0, w = 0, h = 0;
+ TextPlacement = TOP_LEFT;
+ if (mButtonImg) {
+ mButtonImg->GetRenderPos(x, y, w, h);
+ } else if (hasFill) {
+ LoadPlacement(FindNode(node, "placement"), &x, &y, &w, &h, &TextPlacement);
+ }
+ SetRenderPos(x, y, w, h);
+ if (mButtonLabel) {
+ TextPlacement = (Placement)LoadAttrInt(FindNode(node, "placement"), "textplacement", TOP_LEFT);
+ if (TextPlacement != TEXT_ONLY_RIGHT) {
+ mButtonLabel->scaleWidth = 1;
+ mButtonLabel->SetMaxWidth(w);
+ mButtonLabel->SetPlacement(CENTER);
+ mTextX = ((mRenderW / 2) + mRenderX);
+ mTextY = mRenderY + (mRenderH / 2);
+ mButtonLabel->SetRenderPos(mTextX, mTextY);
+ } else {
+ mTextX = mRenderW + mRenderX + 5;
+ mButtonLabel->GetCurrentBounds(mTextW, mTextH);
+ mRenderW += mTextW + 5;
+ mTextY = mRenderY + (mRenderH / 2) - (mTextH / 2);
+ mButtonLabel->SetRenderPos(mTextX, mTextY);
+ if (mAction)
+ mAction->SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ }
+ }
+}
+
+GUIButton::~GUIButton()
+{
+ delete mButtonImg;
+ delete mButtonLabel;
+ delete mAction;
+}
+
+int GUIButton::Render(void)
+{
+ if (!isConditionTrue())
+ {
+ mRendered = false;
+ return 0;
+ }
+
+ int ret = 0;
+
+ if (mButtonImg) ret = mButtonImg->Render();
+ if (ret < 0) return ret;
+ if (hasFill) {
+ gr_color(mFillColor.red, mFillColor.green, mFillColor.blue, mFillColor.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+ }
+ if (mButtonIcon && mButtonIcon->GetResource())
+ gr_blit(mButtonIcon->GetResource(), 0, 0, mIconW, mIconH, mIconX, mIconY);
+ if (mButtonLabel) {
+ int w, h;
+ mButtonLabel->GetCurrentBounds(w, h);
+ if (w != mTextW) {
+ mTextW = w;
+ }
+ ret = mButtonLabel->Render();
+ if (ret < 0) return ret;
+ }
+ if (renderHighlight && hasHighlightColor) {
+ gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+ }
+ mRendered = true;
+ return ret;
+}
+
+int GUIButton::Update(void)
+{
+ if (!isConditionTrue()) return (mRendered ? 2 : 0);
+ if (!mRendered) return 2;
+
+ int ret = 0, ret2 = 0;
+
+ if (mButtonImg) ret = mButtonImg->Update();
+ if (ret < 0) return ret;
+
+ if (ret == 0)
+ {
+ if (mButtonLabel) {
+ ret2 = mButtonLabel->Update();
+ if (ret2 < 0) return ret2;
+ if (ret2 > ret) ret = ret2;
+ }
+ }
+ else if (ret == 1)
+ {
+ // The button re-rendered, so everyone else is a render
+ if (mButtonIcon && mButtonIcon->GetResource())
+ gr_blit(mButtonIcon->GetResource(), 0, 0, mIconW, mIconH, mIconX, mIconY);
+ if (mButtonLabel) ret = mButtonLabel->Render();
+ if (ret < 0) return ret;
+ ret = 1;
+ }
+ else
+ {
+ // Aparently, the button needs a background update
+ ret = 2;
+ }
+ return ret;
+}
+
+int GUIButton::SetRenderPos(int x, int y, int w, int h)
+{
+ mRenderX = x;
+ mRenderY = y;
+ if (w || h)
+ {
+ mRenderW = w;
+ mRenderH = h;
+ }
+
+ mIconW = mButtonIcon->GetWidth();
+ mIconH = mButtonIcon->GetHeight();
+
+ mTextH = 0;
+ mTextW = 0;
+ mIconX = mRenderX + ((mRenderW - mIconW) / 2);
+ if (mButtonLabel) mButtonLabel->GetCurrentBounds(mTextW, mTextH);
+ if (mTextW && TextPlacement == TEXT_ONLY_RIGHT)
+ {
+ mRenderW += mTextW + 5;
+ }
+
+ if (mIconH == 0 || mTextH == 0 || mIconH + mTextH > mRenderH)
+ {
+ mIconY = mRenderY + (mRenderH / 2) - (mIconH / 2);
+ }
+ else
+ {
+ int divisor = mRenderH - (mIconH + mTextH);
+ mIconY = mRenderY + (divisor / 3);
+ }
+
+ if (mButtonLabel) mButtonLabel->SetRenderPos(mTextX, mTextY);
+ if (mAction) mAction->SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ return 0;
+}
+
+int GUIButton::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ static int last_state = 0;
+
+ if (!isConditionTrue()) return -1;
+ if (x < mRenderX || x - mRenderX > mRenderW || y < mRenderY || y - mRenderY > mRenderH || state == TOUCH_RELEASE) {
+ if (last_state == 1) {
+ last_state = 0;
+ if (mButtonLabel != NULL)
+ mButtonLabel->isHighlighted = false;
+ if (mButtonImg != NULL)
+ mButtonImg->isHighlighted = false;
+ renderHighlight = false;
+ mRendered = false;
+ }
+ } else {
+ if (last_state == 0) {
+ last_state = 1;
+ DataManager::Vibrate("tw_button_vibrate");
+ if (mButtonLabel != NULL)
+ mButtonLabel->isHighlighted = true;
+ if (mButtonImg != NULL)
+ mButtonImg->isHighlighted = true;
+ renderHighlight = true;
+ mRendered = false;
+ }
+ }
+ if (x < mRenderX || x - mRenderX > mRenderW || y < mRenderY || y - mRenderY > mRenderH)
+ return 0;
+ return (mAction ? mAction->NotifyTouch(state, x, y) : 1);
+}
diff --git a/gui/checkbox.cpp b/gui/checkbox.cpp
new file mode 100644
index 000000000..a2958db99
--- /dev/null
+++ b/gui/checkbox.cpp
@@ -0,0 +1,185 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// checkbox.cpp - GUICheckbox object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUICheckbox::GUICheckbox(xml_node<>* node)
+ : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mChecked = NULL;
+ mUnchecked = NULL;
+ mLabel = NULL;
+ mRendered = false;
+
+ mLastState = 0;
+
+ if (!node)
+ return;
+
+ // The label can be loaded directly
+ mLabel = new GUIText(node);
+
+ // Read the check states
+ child = FindNode(node, "image");
+ if (child)
+ {
+ mChecked = LoadAttrImage(child, "checked");
+ mUnchecked = LoadAttrImage(child, "unchecked");
+ }
+
+ // Get the variable data
+ child = FindNode(node, "data");
+ if (child)
+ {
+ attr = child->first_attribute("variable");
+ if (attr)
+ mVarName = attr->value();
+ attr = child->first_attribute("default");
+ if (attr)
+ DataManager::SetValue(mVarName, attr->value());
+ }
+
+ mCheckW = mChecked->GetWidth();
+ mCheckH = mChecked->GetHeight();
+ if (mCheckW == 0)
+ {
+ mCheckW = mUnchecked->GetWidth();
+ mCheckH = mUnchecked->GetHeight();
+ }
+
+ int x, y, w, h;
+ mLabel->GetRenderPos(x, y, w, h);
+ SetRenderPos(x, y, 0, 0);
+}
+
+GUICheckbox::~GUICheckbox()
+{
+}
+
+int GUICheckbox::Render(void)
+{
+ if (!isConditionTrue())
+ {
+ mRendered = false;
+ return 0;
+ }
+
+ int ret = 0;
+ int lastState = 0;
+ DataManager::GetValue(mVarName, lastState);
+
+ if (lastState)
+ {
+ if (mChecked && mChecked->GetResource())
+ gr_blit(mChecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
+ }
+ else
+ {
+ if (mUnchecked && mUnchecked->GetResource())
+ gr_blit(mUnchecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
+ }
+ if (mLabel)
+ ret = mLabel->Render();
+ mLastState = lastState;
+ mRendered = true;
+ return ret;
+}
+
+int GUICheckbox::Update(void)
+{
+ if (!isConditionTrue()) return (mRendered ? 2 : 0);
+ if (!mRendered) return 2;
+
+ int lastState = 0;
+ DataManager::GetValue(mVarName, lastState);
+
+ if (lastState != mLastState)
+ return 2;
+ return 0;
+}
+
+int GUICheckbox::SetRenderPos(int x, int y, int w, int h)
+{
+ mRenderX = x;
+ mRenderY = y;
+
+ if (w || h)
+ return -1;
+
+ int textW, textH;
+ mLabel->GetCurrentBounds(textW, textH);
+
+ w = textW + mCheckW + 5;
+ mRenderW = w;
+ mRenderH = mCheckH;
+
+ mTextX = mRenderX + mCheckW + 5;
+ mTextY = mRenderY + (mCheckH / 2);
+
+ mLabel->SetRenderPos(mTextX, mTextY, 0, 0);
+ mLabel->SetPlacement(TEXT_ONLY_RIGHT);
+ mLabel->SetMaxWidth(gr_fb_width() - mTextX);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ return 0;
+}
+
+int GUICheckbox::NotifyTouch(TOUCH_STATE state, int x __unused, int y __unused)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ if (state == TOUCH_RELEASE)
+ {
+ int lastState;
+ DataManager::GetValue(mVarName, lastState);
+ lastState = (lastState == 0) ? 1 : 0;
+ DataManager::SetValue(mVarName, lastState);
+
+ DataManager::Vibrate("tw_button_vibrate");
+ }
+ return 0;
+}
+
diff --git a/gui/console.cpp b/gui/console.cpp
new file mode 100644
index 000000000..03628ec30
--- /dev/null
+++ b/gui/console.cpp
@@ -0,0 +1,413 @@
+/*
+ Copyright 2015 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// console.cpp - GUIConsole object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "gui.hpp"
+#include "twmsg.h"
+
+#define GUI_CONSOLE_BUFFER_SIZE 512
+
+static pthread_mutex_t console_lock;
+static size_t last_message_count = 0;
+static std::vector<Message> gMessages;
+
+static std::vector<std::string> gConsole;
+static std::vector<std::string> gConsoleColor;
+static FILE* ors_file = NULL;
+
+struct InitMutex
+{
+ InitMutex() { pthread_mutex_init(&console_lock, NULL); }
+} initMutex;
+
+static void internal_gui_print(const char *color, char *buf)
+{
+ // make sure to flush any outstanding messages first to preserve order of outputs
+ GUIConsole::Translate_Now();
+
+ fputs(buf, stdout);
+ if (ors_file) {
+ fprintf(ors_file, "%s", buf);
+ fflush(ors_file);
+ }
+
+ char *start, *next;
+
+ if (buf[0] == '\n' && strlen(buf) < 2) {
+ // This prevents the double lines bug seen in the console during zip installs
+ return;
+ }
+
+ pthread_mutex_lock(&console_lock);
+ for (start = next = buf; *next != '\0';)
+ {
+ if (*next == '\n')
+ {
+ *next = '\0';
+ gConsole.push_back(start);
+ gConsoleColor.push_back(color);
+
+ start = ++next;
+ }
+ else
+ ++next;
+ }
+
+ // The text after last \n (or whole string if there is no \n)
+ if (*start) {
+ gConsole.push_back(start);
+ gConsoleColor.push_back(color);
+ }
+ pthread_mutex_unlock(&console_lock);
+}
+
+extern "C" void gui_print(const char *fmt, ...)
+{
+ char buf[GUI_CONSOLE_BUFFER_SIZE]; // We're going to limit a single request to 512 bytes
+
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, GUI_CONSOLE_BUFFER_SIZE, fmt, ap);
+ va_end(ap);
+
+ internal_gui_print("normal", buf);
+}
+
+extern "C" void gui_print_color(const char *color, const char *fmt, ...)
+{
+ char buf[GUI_CONSOLE_BUFFER_SIZE]; // We're going to limit a single request to 512 bytes
+
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, GUI_CONSOLE_BUFFER_SIZE, fmt, ap);
+ va_end(ap);
+
+ internal_gui_print(color, buf);
+}
+
+extern "C" void gui_set_FILE(FILE* f)
+{
+ ors_file = f;
+}
+
+void gui_msg(const char* text)
+{
+ if (text) {
+ Message msg = Msg(text);
+ gui_msg(msg);
+ }
+}
+
+void gui_warn(const char* text)
+{
+ if (text) {
+ Message msg = Msg(msg::kWarning, text);
+ gui_msg(msg);
+ }
+}
+
+void gui_err(const char* text)
+{
+ if (text) {
+ Message msg = Msg(msg::kError, text);
+ gui_msg(msg);
+ }
+}
+
+void gui_highlight(const char* text)
+{
+ if (text) {
+ Message msg = Msg(msg::kHighlight, text);
+ gui_msg(msg);
+ }
+}
+
+void gui_msg(Message msg)
+{
+ std::string output = msg;
+ output += "\n";
+ fputs(output.c_str(), stdout);
+ if (ors_file) {
+ fprintf(ors_file, "%s", output.c_str());
+ fflush(ors_file);
+ }
+ pthread_mutex_lock(&console_lock);
+ gMessages.push_back(msg);
+ pthread_mutex_unlock(&console_lock);
+}
+
+void GUIConsole::Translate_Now()
+{
+ pthread_mutex_lock(&console_lock);
+ size_t message_count = gMessages.size();
+ if (message_count <= last_message_count)
+ {
+ pthread_mutex_unlock(&console_lock);
+ return;
+ }
+
+ for (size_t m = last_message_count; m < message_count; m++) {
+ std::string message = gMessages[m];
+ std::string color = "normal";
+ if (gMessages[m].GetKind() == msg::kError)
+ color = "error";
+ else if (gMessages[m].GetKind() == msg::kHighlight)
+ color = "highlight";
+ else if (gMessages[m].GetKind() == msg::kWarning)
+ color = "warning";
+ gConsole.push_back(message);
+ gConsoleColor.push_back(color);
+ }
+ last_message_count = message_count;
+ pthread_mutex_unlock(&console_lock);
+}
+
+void GUIConsole::Clear_For_Retranslation()
+{
+ pthread_mutex_lock(&console_lock);
+ last_message_count = 0;
+ gConsole.clear();
+ gConsoleColor.clear();
+ pthread_mutex_unlock(&console_lock);
+}
+
+GUIConsole::GUIConsole(xml_node<>* node) : GUIScrollList(node)
+{
+ xml_node<>* child;
+
+ mLastCount = 0;
+ scrollToEnd = true;
+ mSlideoutX = mSlideoutY = mSlideoutW = mSlideoutH = 0;
+ mSlideout = 0;
+ mSlideoutState = visible;
+
+ allowSelection = false; // console doesn't support list item selections
+
+ if (!node)
+ {
+ mRenderX = 0;
+ mRenderY = 0;
+ mRenderW = gr_fb_width();
+ mRenderH = gr_fb_height();
+ }
+ else
+ {
+ child = FindNode(node, "color");
+ if (child)
+ {
+ mFontColor = LoadAttrColor(child, "foreground", mFontColor);
+ mBackgroundColor = LoadAttrColor(child, "background", mBackgroundColor);
+ //mScrollColor = LoadAttrColor(child, "scroll", mScrollColor);
+ }
+
+ child = FindNode(node, "slideout");
+ if (child)
+ {
+ mSlideout = 1;
+ mSlideoutState = hidden;
+ LoadPlacement(child, &mSlideoutX, &mSlideoutY, &mSlideoutW, &mSlideoutH, &mPlacement);
+
+ mSlideoutImage = LoadAttrImage(child, "resource");
+
+ if (mSlideoutImage && mSlideoutImage->GetResource())
+ {
+ mSlideoutW = mSlideoutImage->GetWidth();
+ mSlideoutH = mSlideoutImage->GetHeight();
+ if (mPlacement == CENTER || mPlacement == CENTER_X_ONLY) {
+ mSlideoutX = mSlideoutX - (mSlideoutW / 2);
+ if (mPlacement == CENTER) {
+ mSlideoutY = mSlideoutY - (mSlideoutH / 2);
+ }
+ }
+ }
+ }
+ }
+}
+
+int GUIConsole::RenderSlideout(void)
+{
+ if (!mSlideoutImage || !mSlideoutImage->GetResource())
+ return -1;
+
+ gr_blit(mSlideoutImage->GetResource(), 0, 0, mSlideoutW, mSlideoutH, mSlideoutX, mSlideoutY);
+ return 0;
+}
+
+int GUIConsole::RenderConsole(void)
+{
+ Translate_Now();
+ pthread_mutex_lock(&console_lock);
+ AddLines(&gConsole, &gConsoleColor, &mLastCount, &rConsole, &rConsoleColor);
+ pthread_mutex_unlock(&console_lock);
+ GUIScrollList::Render();
+
+ // if last line is fully visible, keep tracking the last line when new lines are added
+ int bottom_offset = GetDisplayRemainder() - actualItemHeight;
+ bool isAtBottom = firstDisplayedItem == (int)GetItemCount() - GetDisplayItemCount() - (bottom_offset != 0) && y_offset == bottom_offset;
+ if (isAtBottom)
+ scrollToEnd = true;
+#if 0
+ // debug - show if we are tracking the last line
+ if (scrollToEnd) {
+ gr_color(0,255,0,255);
+ gr_fill(mRenderX+mRenderW-5, mRenderY+mRenderH-5, 5, 5);
+ } else {
+ gr_color(255,0,0,255);
+ gr_fill(mRenderX+mRenderW-5, mRenderY+mRenderH-5, 5, 5);
+ }
+#endif
+ return (mSlideout ? RenderSlideout() : 0);
+}
+
+int GUIConsole::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (mSlideout && mSlideoutState == hidden)
+ return RenderSlideout();
+
+ return RenderConsole();
+}
+
+int GUIConsole::Update(void)
+{
+ if (mSlideout && mSlideoutState != visible)
+ {
+ if (mSlideoutState == hidden)
+ return 0;
+
+ if (mSlideoutState == request_hide)
+ mSlideoutState = hidden;
+
+ if (mSlideoutState == request_show)
+ mSlideoutState = visible;
+
+ // Any time we activate the console, we reset the position
+ SetVisibleListLocation(rConsole.size() - 1);
+ mUpdate = 1;
+ scrollToEnd = true;
+ }
+
+ pthread_mutex_lock(&console_lock);
+ bool addedNewText = AddLines(&gConsole, &gConsoleColor, &mLastCount, &rConsole, &rConsoleColor);
+ pthread_mutex_unlock(&console_lock);
+ if (addedNewText) {
+ // someone added new text
+ // at least the scrollbar must be updated, even if the new lines are currently not visible
+ mUpdate = 1;
+ }
+
+ if (scrollToEnd) {
+ // keep the last line in view
+ SetVisibleListLocation(rConsole.size() - 1);
+ }
+
+ GUIScrollList::Update();
+
+ if (mUpdate) {
+ mUpdate = 0;
+ if (Render() == 0)
+ return 2;
+ }
+ return 0;
+}
+
+// IsInRegion - Checks if the request is handled by this object
+// Return 1 if this object handles the request, 0 if not
+int GUIConsole::IsInRegion(int x, int y)
+{
+ if (mSlideout) {
+ // Check if they tapped the slideout button
+ if (x >= mSlideoutX && x < mSlideoutX + mSlideoutW && y >= mSlideoutY && y < mSlideoutY + mSlideoutH)
+ return 1;
+
+ // If we're only rendering the slideout, bail now
+ if (mSlideoutState == hidden)
+ return 0;
+ }
+
+ return GUIScrollList::IsInRegion(x, y);
+}
+
+// NotifyTouch - Notify of a touch event
+// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+int GUIConsole::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ if (mSlideout && x >= mSlideoutX && x < mSlideoutX + mSlideoutW && y >= mSlideoutY && y < mSlideoutY + mSlideoutH) {
+ if (state == TOUCH_START) {
+ if (mSlideoutState == hidden)
+ mSlideoutState = request_show;
+ else if (mSlideoutState == visible)
+ mSlideoutState = request_hide;
+ }
+ return 1;
+ }
+ scrollToEnd = false;
+ return GUIScrollList::NotifyTouch(state, x, y);
+}
+
+size_t GUIConsole::GetItemCount()
+{
+ return rConsole.size();
+}
+
+void GUIConsole::RenderItem(size_t itemindex, int yPos, bool selected __unused)
+{
+ // Set the color for the font
+ if (rConsoleColor[itemindex] == "normal") {
+ gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
+ } else {
+ COLOR FontColor;
+ std::string color = rConsoleColor[itemindex];
+ ConvertStrToColor(color, &FontColor);
+ FontColor.alpha = 255;
+ gr_color(FontColor.red, FontColor.green, FontColor.blue, FontColor.alpha);
+ }
+
+ // render text
+ const char* text = rConsole[itemindex].c_str();
+ gr_textEx_scaleW(mRenderX, yPos, text, mFont->GetResource(), mRenderW, TOP_LEFT, 0);
+}
+
+void GUIConsole::NotifySelect(size_t item_selected __unused)
+{
+ // do nothing - console ignores selections
+}
diff --git a/gui/fileselector.cpp b/gui/fileselector.cpp
new file mode 100644
index 000000000..a992b80ea
--- /dev/null
+++ b/gui/fileselector.cpp
@@ -0,0 +1,377 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <algorithm>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+#include "../twrp-functions.hpp"
+
+int GUIFileSelector::mSortOrder = 0;
+
+GUIFileSelector::GUIFileSelector(xml_node<>* node) : GUIScrollList(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mFolderIcon = mFileIcon = NULL;
+ mShowFolders = mShowFiles = mShowNavFolders = 1;
+ mUpdate = 0;
+ mPathVar = "cwd";
+ updateFileList = false;
+
+ // Load filter for filtering files (e.g. *.zip for only zips)
+ child = FindNode(node, "filter");
+ if (child) {
+ attr = child->first_attribute("extn");
+ if (attr)
+ mExtn = attr->value();
+ attr = child->first_attribute("folders");
+ if (attr)
+ mShowFolders = atoi(attr->value());
+ attr = child->first_attribute("files");
+ if (attr)
+ mShowFiles = atoi(attr->value());
+ attr = child->first_attribute("nav");
+ if (attr)
+ mShowNavFolders = atoi(attr->value());
+ }
+
+ // Handle the path variable
+ child = FindNode(node, "path");
+ if (child) {
+ attr = child->first_attribute("name");
+ if (attr)
+ mPathVar = attr->value();
+ attr = child->first_attribute("default");
+ if (attr) {
+ mPathDefault = attr->value();
+ DataManager::SetValue(mPathVar, attr->value());
+ }
+ }
+
+ // Handle the result variable
+ child = FindNode(node, "data");
+ if (child) {
+ attr = child->first_attribute("name");
+ if (attr)
+ mVariable = attr->value();
+ attr = child->first_attribute("default");
+ if (attr)
+ DataManager::SetValue(mVariable, attr->value());
+ }
+
+ // Handle the sort variable
+ child = FindNode(node, "sort");
+ if (child) {
+ attr = child->first_attribute("name");
+ if (attr)
+ mSortVariable = attr->value();
+ attr = child->first_attribute("default");
+ if (attr)
+ DataManager::SetValue(mSortVariable, attr->value());
+
+ DataManager::GetValue(mSortVariable, mSortOrder);
+ }
+
+ // Handle the selection variable
+ child = FindNode(node, "selection");
+ if (child && (attr = child->first_attribute("name")))
+ mSelection = attr->value();
+ else
+ mSelection = "0";
+
+ // Get folder and file icons if present
+ child = FindNode(node, "icon");
+ if (child) {
+ mFolderIcon = LoadAttrImage(child, "folder");
+ mFileIcon = LoadAttrImage(child, "file");
+ }
+ int iconWidth = std::max(mFolderIcon->GetWidth(), mFileIcon->GetWidth());
+ int iconHeight = std::max(mFolderIcon->GetHeight(), mFileIcon->GetHeight());
+ SetMaxIconSize(iconWidth, iconHeight);
+
+ // Fetch the file/folder list
+ std::string value;
+ DataManager::GetValue(mPathVar, value);
+ GetFileList(value);
+}
+
+GUIFileSelector::~GUIFileSelector()
+{
+}
+
+int GUIFileSelector::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ GUIScrollList::Update();
+
+ // Update the file list if needed
+ if (updateFileList) {
+ string value;
+ DataManager::GetValue(mPathVar, value);
+ if (GetFileList(value) == 0) {
+ updateFileList = false;
+ mUpdate = 1;
+ } else
+ return 0;
+ }
+
+ if (mUpdate) {
+ mUpdate = 0;
+ if (Render() == 0)
+ return 2;
+ }
+ return 0;
+}
+
+int GUIFileSelector::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIScrollList::NotifyVarChange(varName, value);
+
+ if (!isConditionTrue())
+ return 0;
+
+ if (varName.empty()) {
+ // Always clear the data variable so we know to use it
+ DataManager::SetValue(mVariable, "");
+ }
+ if (varName == mPathVar || varName == mSortVariable) {
+ if (varName == mSortVariable) {
+ DataManager::GetValue(mSortVariable, mSortOrder);
+ } else {
+ // Reset the list to the top
+ SetVisibleListLocation(0);
+ if (value.empty())
+ DataManager::SetValue(mPathVar, mPathDefault);
+ }
+ updateFileList = true;
+ mUpdate = 1;
+ return 0;
+ }
+ return 0;
+}
+
+bool GUIFileSelector::fileSort(FileData d1, FileData d2)
+{
+ if (d1.fileName == ".")
+ return -1;
+ if (d2.fileName == ".")
+ return 0;
+ if (d1.fileName == "..")
+ return -1;
+ if (d2.fileName == "..")
+ return 0;
+
+ switch (mSortOrder) {
+ case 3: // by size largest first
+ if (d1.fileSize == d2.fileSize || d1.fileType == DT_DIR) // some directories report a different size than others - but this is not the size of the files inside the directory, so we just sort by name on directories
+ return (strcasecmp(d1.fileName.c_str(), d2.fileName.c_str()) < 0);
+ return d1.fileSize < d2.fileSize;
+ case -3: // by size smallest first
+ if (d1.fileSize == d2.fileSize || d1.fileType == DT_DIR) // some directories report a different size than others - but this is not the size of the files inside the directory, so we just sort by name on directories
+ return (strcasecmp(d1.fileName.c_str(), d2.fileName.c_str()) > 0);
+ return d1.fileSize > d2.fileSize;
+ case 2: // by last modified date newest first
+ if (d1.lastModified == d2.lastModified)
+ return (strcasecmp(d1.fileName.c_str(), d2.fileName.c_str()) < 0);
+ return d1.lastModified < d2.lastModified;
+ case -2: // by date oldest first
+ if (d1.lastModified == d2.lastModified)
+ return (strcasecmp(d1.fileName.c_str(), d2.fileName.c_str()) > 0);
+ return d1.lastModified > d2.lastModified;
+ case -1: // by name descending
+ return (strcasecmp(d1.fileName.c_str(), d2.fileName.c_str()) > 0);
+ default: // should be a 1 - sort by name ascending
+ return (strcasecmp(d1.fileName.c_str(), d2.fileName.c_str()) < 0);
+ }
+ return 0;
+}
+
+int GUIFileSelector::GetFileList(const std::string folder)
+{
+ DIR* d;
+ struct dirent* de;
+ struct stat st;
+
+ // Clear all data
+ mFolderList.clear();
+ mFileList.clear();
+
+ d = opendir(folder.c_str());
+ if (d == NULL) {
+ LOGINFO("Unable to open '%s'\n", folder.c_str());
+ if (folder != "/" && (mShowNavFolders != 0 || mShowFiles != 0)) {
+ size_t found;
+ found = folder.find_last_of('/');
+ if (found != string::npos) {
+ string new_folder = folder.substr(0, found);
+
+ if (new_folder.length() < 2)
+ new_folder = "/";
+ DataManager::SetValue(mPathVar, new_folder);
+ }
+ }
+ return -1;
+ }
+
+ while ((de = readdir(d)) != NULL) {
+ FileData data;
+
+ data.fileName = de->d_name;
+ if (data.fileName == ".")
+ continue;
+ if (data.fileName == ".." && folder == "/")
+ continue;
+
+ data.fileType = de->d_type;
+
+ std::string path = folder + "/" + data.fileName;
+ stat(path.c_str(), &st);
+ data.protection = st.st_mode;
+ data.userId = st.st_uid;
+ data.groupId = st.st_gid;
+ data.fileSize = st.st_size;
+ data.lastAccess = st.st_atime;
+ data.lastModified = st.st_mtime;
+ data.lastStatChange = st.st_ctime;
+
+ if (data.fileType == DT_UNKNOWN) {
+ data.fileType = TWFunc::Get_D_Type_From_Stat(path);
+ }
+ if (data.fileType == DT_DIR) {
+ if (mShowNavFolders || (data.fileName != "." && data.fileName != ".."))
+ mFolderList.push_back(data);
+ } else if (data.fileType == DT_REG || data.fileType == DT_LNK || data.fileType == DT_BLK) {
+ if (mExtn.empty() || (data.fileName.length() > mExtn.length() && data.fileName.substr(data.fileName.length() - mExtn.length()) == mExtn)) {
+ mFileList.push_back(data);
+ }
+ }
+ }
+ closedir(d);
+
+ std::sort(mFolderList.begin(), mFolderList.end(), fileSort);
+ std::sort(mFileList.begin(), mFileList.end(), fileSort);
+
+ return 0;
+}
+
+void GUIFileSelector::SetPageFocus(int inFocus)
+{
+ GUIScrollList::SetPageFocus(inFocus);
+ if (inFocus) {
+ std::string value;
+ DataManager::GetValue(mPathVar, value);
+ if (value.empty())
+ DataManager::SetValue(mPathVar, mPathDefault);
+ updateFileList = true;
+ mUpdate = 1;
+ }
+}
+
+size_t GUIFileSelector::GetItemCount()
+{
+ size_t folderSize = mShowFolders ? mFolderList.size() : 0;
+ size_t fileSize = mShowFiles ? mFileList.size() : 0;
+ return folderSize + fileSize;
+}
+
+void GUIFileSelector::RenderItem(size_t itemindex, int yPos, bool selected)
+{
+ size_t folderSize = mShowFolders ? mFolderList.size() : 0;
+
+ ImageResource* icon;
+ std::string text;
+
+ if (itemindex < folderSize) {
+ text = mFolderList.at(itemindex).fileName;
+ icon = mFolderIcon;
+ if (text == "..")
+ text = gui_lookup("up_a_level", "(Up A Level)");
+ } else {
+ text = mFileList.at(itemindex - folderSize).fileName;
+ icon = mFileIcon;
+ }
+
+ RenderStdItem(yPos, selected, icon, text.c_str());
+}
+
+void GUIFileSelector::NotifySelect(size_t item_selected)
+{
+ size_t folderSize = mShowFolders ? mFolderList.size() : 0;
+ size_t fileSize = mShowFiles ? mFileList.size() : 0;
+
+ if (item_selected < folderSize + fileSize) {
+ // We've selected an item!
+ std::string str;
+ if (item_selected < folderSize) {
+ std::string cwd;
+
+ str = mFolderList.at(item_selected).fileName;
+ if (mSelection != "0")
+ DataManager::SetValue(mSelection, str);
+ DataManager::GetValue(mPathVar, cwd);
+
+ // Ignore requests to do nothing
+ if (str == ".") return;
+ if (str == "..") {
+ if (cwd != "/") {
+ size_t found;
+ found = cwd.find_last_of('/');
+ cwd = cwd.substr(0,found);
+
+ if (cwd.length() < 2) cwd = "/";
+ }
+ } else {
+ // Add a slash if we're not the root folder
+ if (cwd != "/") cwd += "/";
+ cwd += str;
+ }
+
+ if (mShowNavFolders == 0 && mShowFiles == 0) {
+ // nav folders and files are disabled, this is probably the restore list and we need to save chosen location to mVariable instead of mPathVar
+ DataManager::SetValue(mVariable, cwd);
+ } else {
+ // We are changing paths, so we need to set mPathVar
+ DataManager::SetValue(mPathVar, cwd);
+ }
+ } else if (!mVariable.empty()) {
+ str = mFileList.at(item_selected - folderSize).fileName;
+ if (mSelection != "0")
+ DataManager::SetValue(mSelection, str);
+
+ std::string cwd;
+ DataManager::GetValue(mPathVar, cwd);
+ if (cwd != "/")
+ cwd += "/";
+ DataManager::SetValue(mVariable, cwd + str);
+ }
+ }
+ mUpdate = 1;
+}
diff --git a/gui/fill.cpp b/gui/fill.cpp
new file mode 100644
index 000000000..3cfbe6ed4
--- /dev/null
+++ b/gui/fill.cpp
@@ -0,0 +1,70 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// fill.cpp - GUIFill object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUIFill::GUIFill(xml_node<>* node) : GUIObject(node)
+{
+ bool has_color = false;
+ mColor = LoadAttrColor(node, "color", &has_color);
+ if (!has_color) {
+ LOGERR("No color specified for fill\n");
+ return;
+ }
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH);
+
+ return;
+}
+
+int GUIFill::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ gr_color(mColor.red, mColor.green, mColor.blue, mColor.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+ return 0;
+}
+
diff --git a/gui/gui.cpp b/gui/gui.cpp
new file mode 100644
index 000000000..369b6b897
--- /dev/null
+++ b/gui/gui.cpp
@@ -0,0 +1,931 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <linux/input.h>
+#include <pthread.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+extern "C"
+{
+#include "../twcommon.h"
+#include <pixelflinger/pixelflinger.h>
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+#include "../variables.h"
+#include "../partitions.hpp"
+#include "../twrp-functions.hpp"
+#include "../openrecoveryscript.hpp"
+#include "../orscmd/orscmd.h"
+#include "blanktimer.hpp"
+#include "../tw_atomic.hpp"
+
+// Enable to print render time of each frame to the log file
+//#define PRINT_RENDER_TIME 1
+
+#ifdef _EVENT_LOGGING
+#define LOGEVENT(...) LOGERR(__VA_ARGS__)
+#else
+#define LOGEVENT(...) do {} while (0)
+#endif
+
+using namespace rapidxml;
+
+// Global values
+static int gGuiInitialized = 0;
+static TWAtomicInt gForceRender;
+blanktimer blankTimer;
+int ors_read_fd = -1;
+static FILE* orsout = NULL;
+static float scale_theme_w = 1;
+static float scale_theme_h = 1;
+
+// Needed by pages.cpp too
+int gGuiRunning = 0;
+
+int g_pty_fd = -1; // set by terminal on init
+void terminal_pty_read();
+
+static int gRecorder = -1;
+
+extern "C" void gr_write_frame_to_file(int fd);
+
+static void flip(void)
+{
+ if (gRecorder != -1)
+ {
+ timespec time;
+ clock_gettime(CLOCK_MONOTONIC, &time);
+ write(gRecorder, &time, sizeof(timespec));
+ gr_write_frame_to_file(gRecorder);
+ }
+ gr_flip();
+}
+
+void rapidxml::parse_error_handler(const char *what, void *where)
+{
+ fprintf(stderr, "Parser error: %s\n", what);
+ fprintf(stderr, " Start of string: %s\n",(char *) where);
+ LOGERR("Error parsing XML file.\n");
+ //abort();
+}
+
+class InputHandler
+{
+public:
+ void init()
+ {
+ // these might be read from DataManager in the future
+ touch_hold_ms = 500;
+ touch_repeat_ms = 100;
+ key_hold_ms = 500;
+ key_repeat_ms = 100;
+ touch_status = TS_NONE;
+ key_status = KS_NONE;
+ state = AS_NO_ACTION;
+ x = y = 0;
+
+#ifndef TW_NO_SCREEN_TIMEOUT
+ {
+ string seconds;
+ DataManager::GetValue("tw_screen_timeout_secs", seconds);
+ blankTimer.setTime(atoi(seconds.c_str()));
+ blankTimer.resetTimerAndUnblank();
+ }
+#else
+ LOGINFO("Skipping screen timeout: TW_NO_SCREEN_TIMEOUT is set\n");
+#endif
+ }
+
+ // process input events. returns true if any event was received.
+ bool processInput(int timeout_ms);
+
+ void handleDrag();
+
+private:
+ // timeouts for touch/key hold and repeat
+ int touch_hold_ms;
+ int touch_repeat_ms;
+ int key_hold_ms;
+ int key_repeat_ms;
+
+ enum touch_status_enum {
+ TS_NONE = 0,
+ TS_TOUCH_AND_HOLD = 1,
+ TS_TOUCH_REPEAT = 2,
+ };
+
+ enum key_status_enum {
+ KS_NONE = 0,
+ KS_KEY_PRESSED = 1,
+ KS_KEY_REPEAT = 2,
+ };
+
+ enum action_state_enum {
+ AS_IN_ACTION_AREA = 0, // we've touched a spot with an action
+ AS_NO_ACTION = 1, // we've touched in an empty area (no action) and ignore remaining events until touch release
+ };
+ touch_status_enum touch_status;
+ key_status_enum key_status;
+ action_state_enum state;
+ int x, y; // x and y coordinates of last touch
+ struct timeval touchStart; // used to track time for long press / key repeat
+
+ void processHoldAndRepeat();
+ void process_EV_REL(input_event& ev);
+ void process_EV_ABS(input_event& ev);
+ void process_EV_KEY(input_event& ev);
+
+ void doTouchStart();
+};
+
+InputHandler input_handler;
+
+
+bool InputHandler::processInput(int timeout_ms)
+{
+ input_event ev;
+ int ret = ev_get(&ev, timeout_ms);
+
+ if (ret < 0)
+ {
+ // This path means that we did not get any new touch data, but
+ // we do not get new touch data if you press and hold on either
+ // the screen or on a keyboard key or mouse button
+ if (touch_status || key_status)
+ processHoldAndRepeat();
+ return (ret != -2); // -2 means no more events in the queue
+ }
+
+ switch (ev.type)
+ {
+ case EV_ABS:
+ process_EV_ABS(ev);
+ break;
+
+ case EV_REL:
+ process_EV_REL(ev);
+ break;
+
+ case EV_KEY:
+ process_EV_KEY(ev);
+ break;
+ }
+
+ if (ev.code != KEY_POWER && ev.code > KEY_RESERVED)
+ blankTimer.resetTimerAndUnblank();
+
+ return true; // we got an event, so there might be more in the queue
+}
+
+void InputHandler::processHoldAndRepeat()
+{
+ HardwareKeyboard *kb = PageManager::GetHardwareKeyboard();
+
+ // touch and key repeat section
+ struct timeval curTime;
+ gettimeofday(&curTime, NULL);
+ long seconds = curTime.tv_sec - touchStart.tv_sec;
+ long useconds = curTime.tv_usec - touchStart.tv_usec;
+ long mtime = ((seconds) * 1000 + useconds / 1000.0) + 0.5;
+
+ if (touch_status == TS_TOUCH_AND_HOLD && mtime > touch_hold_ms)
+ {
+ touch_status = TS_TOUCH_REPEAT;
+ gettimeofday(&touchStart, NULL);
+ LOGEVENT("TOUCH_HOLD: %d,%d\n", x, y);
+ PageManager::NotifyTouch(TOUCH_HOLD, x, y);
+ }
+ else if (touch_status == TS_TOUCH_REPEAT && mtime > touch_repeat_ms)
+ {
+ LOGEVENT("TOUCH_REPEAT: %d,%d\n", x, y);
+ gettimeofday(&touchStart, NULL);
+ PageManager::NotifyTouch(TOUCH_REPEAT, x, y);
+ }
+ else if (key_status == KS_KEY_PRESSED && mtime > key_hold_ms)
+ {
+ LOGEVENT("KEY_HOLD: %d,%d\n", x, y);
+ gettimeofday(&touchStart, NULL);
+ key_status = KS_KEY_REPEAT;
+ kb->KeyRepeat();
+ }
+ else if (key_status == KS_KEY_REPEAT && mtime > key_repeat_ms)
+ {
+ LOGEVENT("KEY_REPEAT: %d,%d\n", x, y);
+ gettimeofday(&touchStart, NULL);
+ kb->KeyRepeat();
+ }
+}
+
+void InputHandler::doTouchStart()
+{
+ LOGEVENT("TOUCH_START: %d,%d\n", x, y);
+ if (PageManager::NotifyTouch(TOUCH_START, x, y) > 0)
+ state = AS_NO_ACTION;
+ else
+ state = AS_IN_ACTION_AREA;
+ touch_status = TS_TOUCH_AND_HOLD;
+ gettimeofday(&touchStart, NULL);
+}
+
+void InputHandler::process_EV_ABS(input_event& ev)
+{
+ x = ev.value >> 16;
+ y = ev.value & 0xFFFF;
+
+ if (ev.code == 0)
+ {
+#ifndef TW_USE_KEY_CODE_TOUCH_SYNC
+ if (state == AS_IN_ACTION_AREA)
+ {
+ LOGEVENT("TOUCH_RELEASE: %d,%d\n", x, y);
+ PageManager::NotifyTouch(TOUCH_RELEASE, x, y);
+ }
+ touch_status = TS_NONE;
+#endif
+ }
+ else
+ {
+ if (!touch_status)
+ {
+#ifndef TW_USE_KEY_CODE_TOUCH_SYNC
+ doTouchStart();
+#endif
+ }
+ else
+ {
+ if (state == AS_IN_ACTION_AREA)
+ {
+ LOGEVENT("TOUCH_DRAG: %d,%d\n", x, y);
+ }
+ }
+ }
+}
+
+void InputHandler::process_EV_KEY(input_event& ev)
+{
+ HardwareKeyboard *kb = PageManager::GetHardwareKeyboard();
+
+ // Handle key-press here
+ LOGEVENT("TOUCH_KEY: %d\n", ev.code);
+ // Left mouse button is treated as a touch
+ if (ev.code == BTN_LEFT)
+ {
+ MouseCursor *cursor = PageManager::GetMouseCursor();
+ if (ev.value == 1)
+ {
+ cursor->GetPos(x, y);
+ doTouchStart();
+ }
+ else if (touch_status)
+ {
+ // Left mouse button was previously pressed and now is
+ // being released so send a TOUCH_RELEASE
+ if (state == AS_IN_ACTION_AREA)
+ {
+ cursor->GetPos(x, y);
+
+ LOGEVENT("Mouse TOUCH_RELEASE: %d,%d\n", x, y);
+ PageManager::NotifyTouch(TOUCH_RELEASE, x, y);
+ }
+ touch_status = TS_NONE;
+ }
+ }
+ // side mouse button, often used for "back" function
+ else if (ev.code == BTN_SIDE)
+ {
+ if (ev.value == 1)
+ kb->KeyDown(KEY_BACK);
+ else
+ kb->KeyUp(KEY_BACK);
+ } else if (ev.value != 0) {
+ // This is a key press
+#ifdef TW_USE_KEY_CODE_TOUCH_SYNC
+ if (ev.code == TW_USE_KEY_CODE_TOUCH_SYNC) {
+ LOGEVENT("key code %i key press == touch start %i %i\n", TW_USE_KEY_CODE_TOUCH_SYNC, x, y);
+ doTouchStart();
+ return;
+ }
+#endif
+ if (kb->KeyDown(ev.code)) {
+ // Key repeat is enabled for this key
+ key_status = KS_KEY_PRESSED;
+ touch_status = TS_NONE;
+ gettimeofday(&touchStart, NULL);
+ } else {
+ key_status = KS_NONE;
+ touch_status = TS_NONE;
+ }
+ } else {
+ // This is a key release
+ kb->KeyUp(ev.code);
+ key_status = KS_NONE;
+ touch_status = TS_NONE;
+#ifdef TW_USE_KEY_CODE_TOUCH_SYNC
+ if (ev.code == TW_USE_KEY_CODE_TOUCH_SYNC) {
+ LOGEVENT("key code %i key release == touch release %i %i\n", TW_USE_KEY_CODE_TOUCH_SYNC, x, y);
+ PageManager::NotifyTouch(TOUCH_RELEASE, x, y);
+ }
+#endif
+ }
+}
+
+void InputHandler::process_EV_REL(input_event& ev)
+{
+ // Mouse movement
+ MouseCursor *cursor = PageManager::GetMouseCursor();
+ LOGEVENT("EV_REL %d %d\n", ev.code, ev.value);
+ if (ev.code == REL_X)
+ cursor->Move(ev.value, 0);
+ else if (ev.code == REL_Y)
+ cursor->Move(0, ev.value);
+
+ if (touch_status) {
+ cursor->GetPos(x, y);
+ LOGEVENT("Mouse TOUCH_DRAG: %d, %d\n", x, y);
+ key_status = KS_NONE;
+ }
+}
+
+void InputHandler::handleDrag()
+{
+ // This allows us to only send one NotifyTouch event per render
+ // cycle to reduce overhead and perceived input latency.
+ static int prevx = 0, prevy = 0; // these track where the last drag notice was so that we don't send duplicate drag notices
+ if (touch_status && (x != prevx || y != prevy)) {
+ prevx = x;
+ prevy = y;
+ if (PageManager::NotifyTouch(TOUCH_DRAG, x, y) > 0)
+ state = AS_NO_ACTION;
+ else
+ state = AS_IN_ACTION_AREA;
+ }
+}
+
+static void setup_ors_command()
+{
+ ors_read_fd = -1;
+
+ unlink(ORS_INPUT_FILE);
+ if (mkfifo(ORS_INPUT_FILE, 06660) != 0) {
+ LOGINFO("Unable to mkfifo %s\n", ORS_INPUT_FILE);
+ return;
+ }
+ unlink(ORS_OUTPUT_FILE);
+ if (mkfifo(ORS_OUTPUT_FILE, 06666) != 0) {
+ LOGINFO("Unable to mkfifo %s\n", ORS_OUTPUT_FILE);
+ unlink(ORS_INPUT_FILE);
+ return;
+ }
+
+ ors_read_fd = open(ORS_INPUT_FILE, O_RDONLY | O_NONBLOCK);
+ if (ors_read_fd < 0) {
+ LOGINFO("Unable to open %s\n", ORS_INPUT_FILE);
+ unlink(ORS_INPUT_FILE);
+ unlink(ORS_OUTPUT_FILE);
+ }
+}
+
+// callback called after a CLI command was executed
+static void ors_command_done()
+{
+ gui_set_FILE(NULL);
+ fclose(orsout);
+ orsout = NULL;
+
+ if (DataManager::GetIntValue("tw_page_done") == 0) {
+ // The select function will return ready to read and the
+ // read function will return errno 19 no such device unless
+ // we set everything up all over again.
+ close(ors_read_fd);
+ setup_ors_command();
+ }
+}
+
+static void ors_command_read()
+{
+ char command[1024];
+ int read_ret = read(ors_read_fd, &command, sizeof(command));
+
+ if (read_ret > 0) {
+ command[1022] = '\n';
+ command[1023] = '\0';
+ LOGINFO("Command '%s' received\n", command);
+ orsout = fopen(ORS_OUTPUT_FILE, "w");
+ if (!orsout) {
+ close(ors_read_fd);
+ ors_read_fd = -1;
+ LOGINFO("Unable to fopen %s\n", ORS_OUTPUT_FILE);
+ unlink(ORS_INPUT_FILE);
+ unlink(ORS_OUTPUT_FILE);
+ return;
+ }
+ if (DataManager::GetIntValue("tw_busy") != 0) {
+ fputs("Failed, operation in progress\n", orsout);
+ LOGINFO("Command cannot be performed, operation in progress.\n");
+ fclose(orsout);
+ } else {
+ if (strlen(command) == 11 && strncmp(command, "dumpstrings", 11) == 0) {
+ gui_set_FILE(orsout);
+ PageManager::GetResources()->DumpStrings();
+ ors_command_done();
+ //check to see if we should show backup page for parsing adbbackup partitions
+ } else if (strlen(command) == 23 && strncmp(command, "adbbackup", 9) == 0) {
+ gui_set_FILE(orsout);
+ DataManager::SetValue("tw_action", "twcmd");
+ DataManager::SetValue("tw_action_param", command);
+ DataManager::SetValue("tw_enable_adb_backup", 1);
+ gui_changePage("backup");
+ ors_command_done();
+ } else {
+ // mirror output messages
+ gui_set_FILE(orsout);
+ // close orsout and restart listener after command is done
+ OpenRecoveryScript::Call_After_CLI_Command(ors_command_done);
+ // run the command in a threaded action...
+ DataManager::SetValue("tw_action", "twcmd");
+ DataManager::SetValue("tw_action_param", command);
+ // ...and switch back to the current page when finished
+ std::string currentPage = PageManager::GetCurrentPage();
+ DataManager::SetValue("tw_has_action2", "1");
+ DataManager::SetValue("tw_action2", "page");
+ DataManager::SetValue("tw_action2_param", currentPage);
+ DataManager::SetValue("tw_action_text1", gui_lookup("running_recovery_commands", "Running Recovery Commands"));
+ DataManager::SetValue("tw_action_text2", "");
+ gui_changePage("singleaction_page");
+ // now immediately return to the GUI main loop (the action runs in the background thread)
+ // put all things that need to be done after the command is finished into ors_command_done, not here
+ }
+ }
+ }
+}
+
+// Get and dispatch input events until it's time to draw the next frame
+// This special function will return immediately the first time, but then
+// always returns 1/30th of a second (or immediately if called later) from
+// the last time it was called
+static void loopTimer(int input_timeout_ms)
+{
+ static timespec lastCall;
+ static int initialized = 0;
+
+ if (!initialized)
+ {
+ clock_gettime(CLOCK_MONOTONIC, &lastCall);
+ initialized = 1;
+ return;
+ }
+
+ do
+ {
+ bool got_event = input_handler.processInput(input_timeout_ms); // get inputs but don't send drag notices
+ timespec curTime;
+ clock_gettime(CLOCK_MONOTONIC, &curTime);
+
+ timespec diff = TWFunc::timespec_diff(lastCall, curTime);
+
+ // This is really 2 or 30 times per second
+ // As long as we get events, increase the timeout so we can catch up with input
+ long timeout = got_event ? 500000000 : 33333333;
+
+ if (diff.tv_sec || diff.tv_nsec > timeout)
+ {
+ // int32_t input_time = TWFunc::timespec_diff_ms(lastCall, curTime);
+ // LOGINFO("loopTimer(): %u ms, count: %u\n", input_time, count);
+
+ lastCall = curTime;
+ input_handler.handleDrag(); // send only drag notices if needed
+ return;
+ }
+
+ // We need to sleep some period time microseconds
+ //unsigned int sleepTime = 33333 -(diff.tv_nsec / 1000);
+ //usleep(sleepTime); // removed so we can scan for input
+ input_timeout_ms = 0;
+ } while (1);
+}
+
+static int runPages(const char *page_name, const int stop_on_page_done)
+{
+ DataManager::SetValue("tw_page_done", 0);
+ DataManager::SetValue("tw_gui_done", 0);
+
+ if (page_name) {
+ PageManager::SetStartPage(page_name);
+ gui_changePage(page_name);
+ }
+
+ gGuiRunning = 1;
+
+ DataManager::SetValue("tw_loaded", 1);
+
+ struct timeval timeout;
+ fd_set fdset;
+ int has_data = 0;
+
+ int input_timeout_ms = 0;
+ int idle_frames = 0;
+
+ for (;;)
+ {
+ loopTimer(input_timeout_ms);
+ if (g_pty_fd > 0) {
+ // TODO: this is not nice, we should have one central select for input, pty, and ors
+ FD_ZERO(&fdset);
+ FD_SET(g_pty_fd, &fdset);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 1;
+ has_data = select(g_pty_fd+1, &fdset, NULL, NULL, &timeout);
+ if (has_data > 0) {
+ terminal_pty_read();
+ }
+ }
+#ifndef TW_OEM_BUILD
+ if (ors_read_fd > 0 && !orsout) { // orsout is non-NULL if a command is still running
+ FD_ZERO(&fdset);
+ FD_SET(ors_read_fd, &fdset);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 1;
+ has_data = select(ors_read_fd+1, &fdset, NULL, NULL, &timeout);
+ if (has_data > 0) {
+ ors_command_read();
+ }
+ }
+#endif
+
+ if (!gForceRender.get_value())
+ {
+ int ret = PageManager::Update();
+ if (ret == 0)
+ ++idle_frames;
+ else if (ret == -2)
+ break; // Theme reload failure
+ else
+ idle_frames = 0;
+ // due to possible animation objects, we need to delay activating the input timeout
+ input_timeout_ms = idle_frames > 15 ? 1000 : 0;
+
+#ifndef PRINT_RENDER_TIME
+ if (ret > 1)
+ PageManager::Render();
+
+ if (ret > 0)
+ flip();
+#else
+ if (ret > 1)
+ {
+ timespec start, end;
+ int32_t render_t, flip_t;
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ PageManager::Render();
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ render_t = TWFunc::timespec_diff_ms(start, end);
+
+ flip();
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ flip_t = TWFunc::timespec_diff_ms(end, start);
+
+ LOGINFO("Render(): %u ms, flip(): %u ms, total: %u ms\n", render_t, flip_t, render_t+flip_t);
+ }
+ else if (ret > 0)
+ flip();
+#endif
+ }
+ else
+ {
+ gForceRender.set_value(0);
+ PageManager::Render();
+ flip();
+ input_timeout_ms = 0;
+ }
+
+ blankTimer.checkForTimeout();
+ if (stop_on_page_done && DataManager::GetIntValue("tw_page_done") != 0)
+ {
+ gui_changePage("main");
+ break;
+ }
+ if (DataManager::GetIntValue("tw_gui_done") != 0)
+ break;
+ }
+ if (ors_read_fd > 0)
+ close(ors_read_fd);
+ ors_read_fd = -1;
+ gGuiRunning = 0;
+ return 0;
+}
+
+int gui_forceRender(void)
+{
+ gForceRender.set_value(1);
+ return 0;
+}
+
+int gui_changePage(std::string newPage)
+{
+ LOGINFO("Set page: '%s'\n", newPage.c_str());
+ PageManager::ChangePage(newPage);
+ gForceRender.set_value(1);
+ return 0;
+}
+
+int gui_changeOverlay(std::string overlay)
+{
+ LOGINFO("Set overlay: '%s'\n", overlay.c_str());
+ PageManager::ChangeOverlay(overlay);
+ gForceRender.set_value(1);
+ return 0;
+}
+
+std::string gui_parse_text(std::string str)
+{
+ // This function parses text for DataManager values encompassed by %value% in the XML
+ // and string resources (%@resource_name%)
+ size_t pos = 0, next, end;
+
+ while (1)
+ {
+ next = str.find("{@", pos);
+ if (next == std::string::npos)
+ break;
+
+ end = str.find('}', next + 1);
+ if (end == std::string::npos)
+ break;
+
+ std::string var = str.substr(next + 2, (end - next) - 2);
+ str.erase(next, (end - next) + 1);
+
+ size_t default_loc = var.find('=', 0);
+ std::string lookup;
+ if (default_loc == std::string::npos) {
+ str.insert(next, PageManager::GetResources()->FindString(var));
+ } else {
+ lookup = var.substr(0, default_loc);
+ std::string default_string = var.substr(default_loc + 1, var.size() - default_loc - 1);
+ str.insert(next, PageManager::GetResources()->FindString(lookup, default_string));
+ }
+ }
+ pos = 0;
+ while (1)
+ {
+ next = str.find('%', pos);
+ if (next == std::string::npos)
+ return str;
+
+ end = str.find('%', next + 1);
+ if (end == std::string::npos)
+ return str;
+
+ // We have a block of data
+ std::string var = str.substr(next + 1, (end - next) - 1);
+ str.erase(next, (end - next) + 1);
+
+ if (next + 1 == end)
+ str.insert(next, 1, '%');
+ else
+ {
+ std::string value;
+ if (var.size() > 0 && var[0] == '@') {
+ // this is a string resource ("%@string_name%")
+ value = PageManager::GetResources()->FindString(var.substr(1));
+ str.insert(next, value);
+ }
+ else if (DataManager::GetValue(var, value) == 0)
+ str.insert(next, value);
+ }
+
+ pos = next + 1;
+ }
+}
+
+std::string gui_lookup(const std::string& resource_name, const std::string& default_value) {
+ return PageManager::GetResources()->FindString(resource_name, default_value);
+}
+
+extern "C" int gui_init(void)
+{
+ gr_init();
+ TWFunc::Set_Brightness(DataManager::GetStrValue("tw_brightness"));
+
+ // load and show splash screen
+ if (PageManager::LoadPackage("splash", TWRES "splash.xml", "splash")) {
+ LOGERR("Failed to load splash screen XML.\n");
+ }
+ else {
+ PageManager::SelectPackage("splash");
+ PageManager::Render();
+ flip();
+ PageManager::ReleasePackage("splash");
+ }
+
+ ev_init();
+ return 0;
+}
+
+extern "C" int gui_loadResources(void)
+{
+#ifndef TW_OEM_BUILD
+ int check = 0;
+ DataManager::GetValue(TW_IS_ENCRYPTED, check);
+
+ if (check)
+ {
+ if (PageManager::LoadPackage("TWRP", TWRES "ui.xml", "decrypt"))
+ {
+ gui_err("base_pkg_err=Failed to load base packages.");
+ goto error;
+ }
+ else
+ check = 1;
+ }
+
+ if (check == 0)
+ {
+ std::string theme_path;
+
+ theme_path = DataManager::GetSettingsStoragePath();
+ if (!PartitionManager.Mount_Settings_Storage(false))
+ {
+ int retry_count = 5;
+ while (retry_count > 0 && !PartitionManager.Mount_Settings_Storage(false))
+ {
+ usleep(500000);
+ retry_count--;
+ }
+
+ if (!PartitionManager.Mount_Settings_Storage(true))
+ {
+ LOGINFO("Unable to mount %s during GUI startup.\n", theme_path.c_str());
+ check = 1;
+ }
+ }
+
+ theme_path += "/TWRP/theme/ui.zip";
+ if (check || PageManager::LoadPackage("TWRP", theme_path, "main"))
+ {
+#endif // ifndef TW_OEM_BUILD
+ if (PageManager::LoadPackage("TWRP", TWRES "ui.xml", "main"))
+ {
+ gui_err("base_pkg_err=Failed to load base packages.");
+ goto error;
+ }
+#ifndef TW_OEM_BUILD
+ }
+ }
+#endif // ifndef TW_OEM_BUILD
+ // Set the default package
+ PageManager::SelectPackage("TWRP");
+
+ gGuiInitialized = 1;
+ return 0;
+
+error:
+ LOGERR("An internal error has occurred: unable to load theme.\n");
+ gGuiInitialized = 0;
+ return -1;
+}
+
+extern "C" int gui_loadCustomResources(void)
+{
+#ifndef TW_OEM_BUILD
+ if (!PartitionManager.Mount_Settings_Storage(false)) {
+ LOGINFO("Unable to mount settings storage during GUI startup.\n");
+ return -1;
+ }
+
+ std::string theme_path = DataManager::GetSettingsStoragePath();
+ theme_path += "/TWRP/theme/ui.zip";
+ // Check for a custom theme
+ if (TWFunc::Path_Exists(theme_path)) {
+ // There is a custom theme, try to load it
+ if (PageManager::ReloadPackage("TWRP", theme_path)) {
+ // Custom theme failed to load, try to load stock theme
+ if (PageManager::ReloadPackage("TWRP", TWRES "ui.xml")) {
+ gui_err("base_pkg_err=Failed to load base packages.");
+ goto error;
+ }
+ }
+ }
+ // Set the default package
+ PageManager::SelectPackage("TWRP");
+#endif
+ return 0;
+
+error:
+ LOGERR("An internal error has occurred: unable to load theme.\n");
+ gGuiInitialized = 0;
+ return -1;
+}
+
+extern "C" int gui_start(void)
+{
+ return gui_startPage("main", 1, 0);
+}
+
+extern "C" int gui_startPage(const char *page_name, const int allow_commands, int stop_on_page_done)
+{
+ if (!gGuiInitialized)
+ return -1;
+
+ // Set the default package
+ PageManager::SelectPackage("TWRP");
+
+ input_handler.init();
+#ifndef TW_OEM_BUILD
+ if (allow_commands)
+ {
+ if (ors_read_fd < 0)
+ setup_ors_command();
+ } else {
+ if (ors_read_fd >= 0) {
+ close(ors_read_fd);
+ ors_read_fd = -1;
+ }
+ }
+#endif
+ return runPages(page_name, stop_on_page_done);
+}
+
+
+extern "C" void set_scale_values(float w, float h)
+{
+ scale_theme_w = w;
+ scale_theme_h = h;
+}
+
+extern "C" int scale_theme_x(int initial_x)
+{
+ if (scale_theme_w != 1) {
+ int scaled = (float)initial_x * scale_theme_w;
+ if (scaled == 0 && initial_x > 0)
+ return 1;
+ return scaled;
+ }
+ return initial_x;
+}
+
+extern "C" int scale_theme_y(int initial_y)
+{
+ if (scale_theme_h != 1) {
+ int scaled = (float)initial_y * scale_theme_h;
+ if (scaled == 0 && initial_y > 0)
+ return 1;
+ return scaled;
+ }
+ return initial_y;
+}
+
+extern "C" int scale_theme_min(int initial_value)
+{
+ if (scale_theme_w != 1 || scale_theme_h != 1) {
+ if (scale_theme_w < scale_theme_h)
+ return scale_theme_x(initial_value);
+ else
+ return scale_theme_y(initial_value);
+ }
+ return initial_value;
+}
+
+extern "C" float get_scale_w()
+{
+ return scale_theme_w;
+}
+
+extern "C" float get_scale_h()
+{
+ return scale_theme_h;
+}
diff --git a/gui/gui.h b/gui/gui.h
new file mode 100644
index 000000000..034f1cd92
--- /dev/null
+++ b/gui/gui.h
@@ -0,0 +1,41 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _GUI_HEADER
+#define _GUI_HEADER
+
+#include <stdio.h>
+
+int gui_init();
+int gui_loadResources();
+int gui_loadCustomResources();
+int gui_start();
+int gui_startPage(const char* page_name, const int allow_comands, int stop_on_page_done);
+void gui_print(const char *fmt, ...);
+void gui_print_color(const char *color, const char *fmt, ...);
+void gui_set_FILE(FILE* f);
+
+void set_scale_values(float w, float h);
+int scale_theme_x(int initial_x);
+int scale_theme_y(int initial_y);
+int scale_theme_min(int initial_value);
+float get_scale_w();
+float get_scale_h();
+
+#endif // _GUI_HEADER
+
diff --git a/gui/gui.hpp b/gui/gui.hpp
new file mode 100644
index 000000000..afcd9b0a9
--- /dev/null
+++ b/gui/gui.hpp
@@ -0,0 +1,33 @@
+/*
+ Copyright 2015 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _GUI_HPP_HEADER
+#define _GUI_HPP_HEADER
+
+#include "twmsg.h"
+
+void gui_msg(const char* text);
+void gui_warn(const char* text);
+void gui_err(const char* text);
+void gui_highlight(const char* text);
+void gui_msg(Message msg);
+
+std::string gui_parse_text(std::string inText);
+std::string gui_lookup(const std::string& resource_name, const std::string& default_value);
+
+#endif //_GUI_HPP_HEADER
diff --git a/gui/hardwarekeyboard.cpp b/gui/hardwarekeyboard.cpp
new file mode 100644
index 000000000..68be9065d
--- /dev/null
+++ b/gui/hardwarekeyboard.cpp
@@ -0,0 +1,441 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// hardwarekeyboard.cpp - HardwareKeyboard object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../common.h"
+}
+
+#include "../twcommon.h"
+#include "objects.hpp"
+#include <linux/input.h>
+
+HardwareKeyboard::HardwareKeyboard()
+ : mLastKeyChar(0)
+{
+}
+
+HardwareKeyboard::~HardwareKeyboard()
+{
+}
+
+// Map keys to other keys.
+static int TranslateKeyCode(int key_code)
+{
+ switch (key_code) {
+ case KEY_SLEEP: // Lock key on Asus Transformer hardware keyboard
+ return KEY_POWER;
+ }
+ return key_code;
+}
+
+static int KeyCodeToChar(int key_code, bool shiftkey, bool ctrlkey)
+{
+ int keyboard = -1;
+
+ switch (key_code) {
+ case KEY_A:
+ if (shiftkey)
+ keyboard = 'A';
+ else
+ keyboard = 'a';
+ break;
+ case KEY_B:
+ if (shiftkey)
+ keyboard = 'B';
+ else
+ keyboard = 'b';
+ break;
+ case KEY_C:
+ if (shiftkey)
+ keyboard = 'C';
+ else
+ keyboard = 'c';
+ break;
+ case KEY_D:
+ if (shiftkey)
+ keyboard = 'D';
+ else
+ keyboard = 'd';
+ break;
+ case KEY_E:
+ if (shiftkey)
+ keyboard = 'E';
+ else
+ keyboard = 'e';
+ break;
+ case KEY_F:
+ if (shiftkey)
+ keyboard = 'F';
+ else
+ keyboard = 'f';
+ break;
+ case KEY_G:
+ if (shiftkey)
+ keyboard = 'G';
+ else
+ keyboard = 'g';
+ break;
+ case KEY_H:
+ if (shiftkey)
+ keyboard = 'H';
+ else
+ keyboard = 'h';
+ break;
+ case KEY_I:
+ if (shiftkey)
+ keyboard = 'I';
+ else
+ keyboard = 'i';
+ break;
+ case KEY_J:
+ if (shiftkey)
+ keyboard = 'J';
+ else
+ keyboard = 'j';
+ break;
+ case KEY_K:
+ if (shiftkey)
+ keyboard = 'K';
+ else
+ keyboard = 'k';
+ break;
+ case KEY_L:
+ if (shiftkey)
+ keyboard = 'L';
+ else
+ keyboard = 'l';
+ break;
+ case KEY_M:
+ if (shiftkey)
+ keyboard = 'M';
+ else
+ keyboard = 'm';
+ break;
+ case KEY_N:
+ if (shiftkey)
+ keyboard = 'N';
+ else
+ keyboard = 'n';
+ break;
+ case KEY_O:
+ if (shiftkey)
+ keyboard = 'O';
+ else
+ keyboard = 'o';
+ break;
+ case KEY_P:
+ if (shiftkey)
+ keyboard = 'P';
+ else
+ keyboard = 'p';
+ break;
+ case KEY_Q:
+ if (shiftkey)
+ keyboard = 'Q';
+ else
+ keyboard = 'q';
+ break;
+ case KEY_R:
+ if (shiftkey)
+ keyboard = 'R';
+ else
+ keyboard = 'r';
+ break;
+ case KEY_S:
+ if (shiftkey)
+ keyboard = 'S';
+ else
+ keyboard = 's';
+ break;
+ case KEY_T:
+ if (shiftkey)
+ keyboard = 'T';
+ else
+ keyboard = 't';
+ break;
+ case KEY_U:
+ if (shiftkey)
+ keyboard = 'U';
+ else
+ keyboard = 'u';
+ break;
+ case KEY_V:
+ if (shiftkey)
+ keyboard = 'V';
+ else
+ keyboard = 'v';
+ break;
+ case KEY_W:
+ if (shiftkey)
+ keyboard = 'W';
+ else
+ keyboard = 'w';
+ break;
+ case KEY_X:
+ if (shiftkey)
+ keyboard = 'X';
+ else
+ keyboard = 'x';
+ break;
+ case KEY_Y:
+ if (shiftkey)
+ keyboard = 'Y';
+ else
+ keyboard = 'y';
+ break;
+ case KEY_Z:
+ if (shiftkey)
+ keyboard = 'Z';
+ else
+ keyboard = 'z';
+ break;
+ case KEY_0:
+ if (shiftkey)
+ keyboard = ')';
+ else
+ keyboard = '0';
+ break;
+ case KEY_1:
+ if (shiftkey)
+ keyboard = '!';
+ else
+ keyboard = '1';
+ break;
+ case KEY_2:
+ if (shiftkey)
+ keyboard = '@';
+ else
+ keyboard = '2';
+ break;
+ case KEY_3:
+ if (shiftkey)
+ keyboard = '#';
+ else
+ keyboard = '3';
+ break;
+ case KEY_4:
+ if (shiftkey)
+ keyboard = '$';
+ else
+ keyboard = '4';
+ break;
+ case KEY_5:
+ if (shiftkey)
+ keyboard = '%';
+ else
+ keyboard = '5';
+ break;
+ case KEY_6:
+ if (shiftkey)
+ keyboard = '^';
+ else
+ keyboard = '6';
+ break;
+ case KEY_7:
+ if (shiftkey)
+ keyboard = '&';
+ else
+ keyboard = '7';
+ break;
+ case KEY_8:
+ if (shiftkey)
+ keyboard = '*';
+ else
+ keyboard = '8';
+ break;
+ case KEY_9:
+ if (shiftkey)
+ keyboard = '(';
+ else
+ keyboard = '9';
+ break;
+ case KEY_SPACE:
+ keyboard = ' ';
+ break;
+ case KEY_BACKSPACE:
+ keyboard = KEYBOARD_BACKSPACE;
+ break;
+ case KEY_TAB:
+ keyboard = KEYBOARD_TAB;
+ break;
+ case KEY_ENTER:
+ keyboard = KEYBOARD_ACTION;
+ break;
+ case KEY_SLASH:
+ if (shiftkey)
+ keyboard = '?';
+ else
+ keyboard = '/';
+ break;
+ case KEY_DOT:
+ if (shiftkey)
+ keyboard = '>';
+ else
+ keyboard = '.';
+ break;
+ case KEY_COMMA:
+ if (shiftkey)
+ keyboard = '<';
+ else
+ keyboard = ',';
+ break;
+ case KEY_MINUS:
+ if (shiftkey)
+ keyboard = '_';
+ else
+ keyboard = '-';
+ break;
+ case KEY_GRAVE:
+ if (shiftkey)
+ keyboard = '~';
+ else
+ keyboard = '`';
+ break;
+ case KEY_EQUAL:
+ if (shiftkey)
+ keyboard = '+';
+ else
+ keyboard = '=';
+ break;
+ case KEY_LEFTBRACE:
+ if (shiftkey)
+ keyboard = '{';
+ else
+ keyboard = '[';
+ break;
+ case KEY_RIGHTBRACE:
+ if (shiftkey)
+ keyboard = '}';
+ else
+ keyboard = ']';
+ break;
+ case KEY_BACKSLASH:
+ if (shiftkey)
+ keyboard = '|';
+ else
+ keyboard = '\\';
+ break;
+ case KEY_SEMICOLON:
+ if (shiftkey)
+ keyboard = ':';
+ else
+ keyboard = ';';
+ break;
+ case KEY_APOSTROPHE:
+ if (shiftkey)
+ keyboard = '\"';
+ else
+ keyboard = '\'';
+ break;
+
+#ifdef _EVENT_LOGGING
+ default:
+ LOGERR("Unmapped keycode: %i\n", key_code);
+ break;
+#endif
+ }
+ if (ctrlkey)
+ {
+ if (keyboard >= 96)
+ keyboard -= 96;
+ else
+ keyboard = -1;
+ }
+ return keyboard;
+}
+
+bool HardwareKeyboard::IsKeyDown(int key_code)
+{
+ std::set<int>::iterator it = mPressedKeys.find(key_code);
+ return (it != mPressedKeys.end());
+}
+
+int HardwareKeyboard::KeyDown(int key_code)
+{
+#ifdef _EVENT_LOGGING
+ LOGERR("HardwareKeyboard::KeyDown %i\n", key_code);
+#endif
+ key_code = TranslateKeyCode(key_code);
+ mPressedKeys.insert(key_code);
+
+ bool ctrlkey = IsKeyDown(KEY_LEFTCTRL) || IsKeyDown(KEY_RIGHTCTRL);
+ bool shiftkey = IsKeyDown(KEY_LEFTSHIFT) || IsKeyDown(KEY_RIGHTSHIFT);
+
+ int ch = KeyCodeToChar(key_code, shiftkey, ctrlkey);
+
+ if (ch != -1) {
+ mLastKeyChar = ch;
+ if (!PageManager::NotifyCharInput(ch))
+ return 1; // Return 1 to enable key repeat
+ } else {
+ mLastKeyChar = 0;
+ mLastKey = key_code;
+ if (!PageManager::NotifyKey(key_code, true))
+ return 1; // Return 1 to enable key repeat
+ }
+ return 0;
+}
+
+int HardwareKeyboard::KeyUp(int key_code)
+{
+#ifdef _EVENT_LOGGING
+ LOGERR("HardwareKeyboard::KeyUp %i\n", key_code);
+#endif
+ key_code = TranslateKeyCode(key_code);
+ std::set<int>::iterator itr = mPressedKeys.find(key_code);
+ if (itr != mPressedKeys.end()) {
+ mPressedKeys.erase(itr);
+ PageManager::NotifyKey(key_code, false);
+ }
+ return 0;
+}
+
+int HardwareKeyboard::KeyRepeat()
+{
+#ifdef _EVENT_LOGGING
+ LOGERR("HardwareKeyboard::KeyRepeat: %i\n", mLastKeyChar);
+#endif
+ if (mLastKeyChar)
+ PageManager::NotifyCharInput(mLastKeyChar);
+ else if (mLastKey)
+ PageManager::NotifyKey(mLastKey, true);
+ return 0;
+}
+
+void HardwareKeyboard::ConsumeKeyRelease(int key)
+{
+ // causes following KeyUp event to suppress notifications
+ mPressedKeys.erase(key);
+}
diff --git a/gui/image.cpp b/gui/image.cpp
new file mode 100644
index 000000000..2b5c54197
--- /dev/null
+++ b/gui/image.cpp
@@ -0,0 +1,110 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// image.cpp - GUIImage object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUIImage::GUIImage(xml_node<>* node) : GUIObject(node)
+{
+ mImage = NULL;
+ mHighlightImage = NULL;
+ isHighlighted = false;
+
+ if (!node)
+ return;
+
+ mImage = LoadAttrImage(FindNode(node, "image"), "resource");
+ mHighlightImage = LoadAttrImage(FindNode(node, "image"), "highlightresource");
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
+
+ if (mImage && mImage->GetResource())
+ {
+ mRenderW = mImage->GetWidth();
+ mRenderH = mImage->GetHeight();
+
+ // Adjust for placement
+ if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
+ {
+ if (mPlacement == CENTER)
+ mRenderX -= (mRenderW / 2);
+ else
+ mRenderX -= mRenderW;
+ }
+ if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
+ {
+ if (mPlacement == CENTER)
+ mRenderY -= (mRenderH / 2);
+ else
+ mRenderY -= mRenderH;
+ }
+ SetPlacement(TOP_LEFT);
+ }
+}
+
+int GUIImage::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (isHighlighted && mHighlightImage && mHighlightImage->GetResource()) {
+ gr_blit(mHighlightImage->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ return 0;
+ }
+ else if (!mImage || !mImage->GetResource())
+ return -1;
+
+ gr_blit(mImage->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ return 0;
+}
+
+int GUIImage::SetRenderPos(int x, int y, int w, int h)
+{
+ if (w || h)
+ return -1;
+
+ mRenderX = x;
+ mRenderY = y;
+ return 0;
+}
+
diff --git a/gui/input.cpp b/gui/input.cpp
new file mode 100644
index 000000000..8dd981c24
--- /dev/null
+++ b/gui/input.cpp
@@ -0,0 +1,574 @@
+/*
+ Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// input.cpp - GUIInput object
+
+#include <linux/input.h>
+#include <pthread.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+
+#define TW_INPUT_NO_UPDATE -1000 // Magic value for HandleTextLocation when no change in scrolling has occurred
+
+GUIInput::GUIInput(xml_node<>* node)
+ : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mInputText = NULL;
+ mAction = NULL;
+ mBackground = NULL;
+ mCursor = NULL;
+ mFont = NULL;
+ mRendered = false;
+ HasMask = false;
+ DrawCursor = false;
+ isLocalChange = true;
+ HasAllowed = false;
+ HasDisabled = false;
+ cursorX = textWidth = scrollingX = mFontHeight = mFontY = lastX = 0;
+ mBackgroundX = mBackgroundY = mBackgroundW = mBackgroundH = MinLen = MaxLen = 0;
+ mCursorLocation = -1; // -1 is always the end of the string
+ CursorWidth = 3;
+ ConvertStrToColor("black", &mBackgroundColor);
+ ConvertStrToColor("white", &mCursorColor);
+ mValue = "";
+ displayValue = "";
+
+ if (!node)
+ return;
+
+ // Load text directly from the node
+ mInputText = new GUIText(node);
+ // Load action directly from the node
+ mAction = new GUIAction(node);
+
+ if (mInputText->Render() < 0)
+ {
+ delete mInputText;
+ mInputText = NULL;
+ }
+
+ // Load the background
+ child = FindNode(node, "background");
+ if (child)
+ {
+ mBackground = LoadAttrImage(child, "resource");
+ mBackgroundColor = LoadAttrColor(child, "color", mBackgroundColor);
+ }
+ if (mBackground && mBackground->GetResource())
+ {
+ mBackgroundW = mBackground->GetWidth();
+ mBackgroundH = mBackground->GetHeight();
+ }
+
+ // Load the cursor color
+ child = FindNode(node, "cursor");
+ if (child)
+ {
+ mCursor = LoadAttrImage(child, "resource");
+ mCursorColor = LoadAttrColor(child, "color", mCursorColor);
+ attr = child->first_attribute("hasfocus");
+ if (attr)
+ {
+ std::string focus = attr->value();
+ SetInputFocus(atoi(focus.c_str()));
+ }
+ CursorWidth = LoadAttrIntScaleX(child, "width", CursorWidth);
+ }
+ DrawCursor = HasInputFocus;
+
+ // Load the font
+ child = FindNode(node, "font");
+ if (child)
+ {
+ mFont = LoadAttrFont(child, "resource");
+ mFontHeight = mFont->GetHeight();
+ }
+
+ child = FindNode(node, "data");
+ if (child)
+ {
+ attr = child->first_attribute("name");
+ if (attr)
+ mVariable = attr->value();
+ attr = child->first_attribute("default");
+ if (attr)
+ DataManager::SetValue(mVariable, attr->value());
+ mMask = LoadAttrString(child, "mask");
+ HasMask = !mMask.empty();
+ }
+
+ // Load input restrictions
+ child = FindNode(node, "restrict");
+ if (child)
+ {
+ MinLen = LoadAttrInt(child, "minlen", MinLen);
+ MaxLen = LoadAttrInt(child, "maxlen", MaxLen);
+ AllowedList = LoadAttrString(child, "allow");
+ HasAllowed = !AllowedList.empty();
+ DisabledList = LoadAttrString(child, "disable");
+ HasDisabled = !DisabledList.empty();
+ }
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+
+ if (mInputText && mFontHeight && mFontHeight < (unsigned)mRenderH) {
+ mFontY = ((mRenderH - mFontHeight) / 2) + mRenderY;
+ mInputText->SetRenderPos(mRenderX, mFontY);
+ } else
+ mFontY = mRenderY;
+
+ if (mInputText)
+ mInputText->SetMaxWidth(0);
+}
+
+GUIInput::~GUIInput()
+{
+ delete mInputText;
+ delete mAction;
+}
+
+void GUIInput::HandleTextLocation(int x) {
+ mRendered = false;
+ if (textWidth <= mRenderW) {
+ if (x != TW_INPUT_NO_UPDATE)
+ lastX = x;
+ scrollingX = 0;
+ return;
+ }
+ if (scrollingX + textWidth < mRenderW) {
+ scrollingX = mRenderW - textWidth;
+ }
+
+ if (x == TW_INPUT_NO_UPDATE)
+ return;
+
+ scrollingX += x - lastX;
+ if (scrollingX > 0)
+ scrollingX = 0;
+ else if (scrollingX + textWidth < mRenderW)
+ scrollingX = mRenderW - textWidth;
+ lastX = x;
+}
+
+void GUIInput::UpdateDisplayText() {
+ void* fontResource = NULL;
+
+ if (mFont) {
+ fontResource = mFont->GetResource();
+ } else {
+ textWidth = 0;
+ return;
+ }
+
+ DataManager::GetValue(mVariable, mValue);
+ if (HasMask) {
+ int index, string_size = mValue.size();
+ string maskedValue;
+ for (index=0; index<string_size; index++)
+ maskedValue += mMask;
+ displayValue = maskedValue;
+ } else {
+ displayValue = mValue;
+ }
+
+ textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource);
+}
+
+void GUIInput::HandleCursorByTouch(int x) {
+// Uses x to find mCursorLocation and cursorX
+ if (displayValue.size() == 0) {
+ mCursorLocation = -1;
+ cursorX = mRenderX;
+ return;
+ }
+
+ void* fontResource = NULL;
+ if (mFont) {
+ fontResource = mFont->GetResource();
+ } else {
+ return;
+ }
+
+ string cursorString;
+ unsigned index = 0, displaySize = displayValue.size();
+ int prevX = mRenderX + scrollingX;
+
+ for (index = 0; index <= displaySize; index++) {
+ cursorString = displayValue.substr(0, index);
+ cursorX = gr_ttf_measureEx(cursorString.c_str(), fontResource) + mRenderX + scrollingX;
+ if (cursorX > x) {
+ if (index > 0 && x <= cursorX - ((x - prevX) / 2) && prevX >= mRenderX) {
+ // This helps make sure that we can place the cursor before the very first char if the first char is
+ // is fully visible while also still letting us place the cursor after the last char if fully visible
+ mCursorLocation = index - 1;
+ cursorX = prevX;
+ return;
+ }
+ mCursorLocation = index;
+ if (cursorX > mRenderX + mRenderW) {
+ cursorX = prevX; // This makes sure that the cursor doesn't get placed after the end of the input box
+ mCursorLocation--;
+ return;
+ }
+ if (cursorX >= mRenderX) {
+ return; // This makes sure that the cursor doesn't get placed before the beginning of the input box
+ }
+ }
+ prevX = cursorX;
+ }
+ mCursorLocation = -1; // x is at or past the end of the string
+}
+
+void GUIInput::HandleCursorByText() {
+// Uses mCursorLocation to find cursorX
+ if (!DrawCursor)
+ return;
+
+ void* fontResource = NULL;
+ if (mFont) {
+ fontResource = mFont->GetResource();
+ } else {
+ return;
+ }
+
+ int cursorTextWidth = textWidth; // width of text to the left of the cursor
+
+ if (mCursorLocation != -1) {
+ string cursorDisplay = displayValue;
+ cursorDisplay.resize(mCursorLocation);
+ cursorTextWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource);
+ }
+ cursorX = mRenderX + cursorTextWidth + scrollingX;
+ if (cursorX >= mRenderX + mRenderW) {
+ scrollingX = mRenderW - cursorTextWidth;
+ cursorX = mRenderX + mRenderW - CursorWidth;
+ } else if (cursorX < mRenderX) {
+ scrollingX = cursorTextWidth * -1;
+ cursorX = mRenderX;
+ }
+}
+
+int GUIInput::Render(void)
+{
+ if (!isConditionTrue())
+ {
+ mRendered = false;
+ return 0;
+ }
+
+ void* fontResource = NULL;
+ if (mFont) fontResource = mFont->GetResource();
+
+ // First step, fill background
+ gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, 255);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+
+ // Next, render the background resource (if it exists)
+ if (mBackground && mBackground->GetResource())
+ {
+ mBackgroundX = mRenderX + ((mRenderW - mBackgroundW) / 2);
+ mBackgroundY = mRenderY + ((mRenderH - mBackgroundH) / 2);
+ gr_blit(mBackground->GetResource(), 0, 0, mBackgroundW, mBackgroundH, mBackgroundX, mBackgroundY);
+ }
+
+ int ret = 0;
+
+ // Render the text
+ if (mInputText) {
+ mInputText->SetRenderPos(mRenderX + scrollingX, mFontY);
+ mInputText->SetText(displayValue);
+ gr_clip(mRenderX, mRenderY, mRenderW, mRenderH);
+ ret = mInputText->Render();
+ gr_noclip();
+ }
+ if (ret < 0)
+ return ret;
+
+ if (HasInputFocus && DrawCursor) {
+ // Render the cursor
+ gr_color(mCursorColor.red, mCursorColor.green, mCursorColor.blue, 255);
+ gr_fill(cursorX, mFontY, CursorWidth, mFontHeight);
+ }
+
+ mRendered = true;
+ return ret;
+}
+
+int GUIInput::Update(void)
+{
+ if (!isConditionTrue()) return (mRendered ? 2 : 0);
+ if (!mRendered) return 2;
+
+ int ret = 0;
+
+ if (mInputText) ret = mInputText->Update();
+ if (ret < 0) return ret;
+
+ return ret;
+}
+
+int GUIInput::GetSelection(int x, int y)
+{
+ if (x < mRenderX || x - mRenderX > mRenderW || y < mRenderY || y - mRenderY > mRenderH) return -1;
+ return (x - mRenderX);
+}
+
+int GUIInput::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ static int startSelection = -1;
+ void* fontResource = NULL;
+
+ if (mFont) fontResource = mFont->GetResource();
+
+ if (!isConditionTrue())
+ return -1;
+
+ if (!HasInputFocus) {
+ if (state != TOUCH_RELEASE)
+ return 0; // Only change focus if touch releases within the input box
+ if (GetSelection(x, y) >= 0) {
+ // When changing focus, we don't scroll or change the cursor location
+ PageManager::SetKeyBoardFocus(0);
+ PageManager::NotifyCharInput(0);
+ SetInputFocus(1);
+ DrawCursor = true;
+ mRendered = false;
+ }
+ } else {
+ switch (state) {
+ case TOUCH_HOLD:
+ case TOUCH_REPEAT:
+ break;
+ case TOUCH_START:
+ startSelection = GetSelection(x,y);
+ lastX = x;
+ DrawCursor = false;
+ mRendered = false;
+ break;
+
+ case TOUCH_DRAG:
+ // Check if we dragged out of the selection window
+ if (GetSelection(x, y) == -1) {
+ lastX = 0;
+ break;
+ }
+
+ DrawCursor = false;
+
+ // Provide some debounce on initial touches
+ if (startSelection != -1 && abs(x - lastX) < 6) {
+ break;
+ }
+
+ startSelection = -1;
+ if (lastX != x)
+ HandleTextLocation(x);
+ break;
+
+ case TOUCH_RELEASE:
+ // We've moved the cursor location
+ mRendered = false;
+ DrawCursor = true;
+ HandleCursorByTouch(x);
+ break;
+ }
+ }
+ return 0;
+}
+
+int GUIInput::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIObject::NotifyVarChange(varName, value);
+
+ if (varName == mVariable) {
+ if (!isLocalChange) {
+ UpdateDisplayText();
+ HandleTextLocation(TW_INPUT_NO_UPDATE);
+ } else
+ isLocalChange = false;
+ return 0;
+ }
+ if (varName.empty()) {
+ UpdateDisplayText();
+ HandleTextLocation(TW_INPUT_NO_UPDATE);
+ HandleCursorByText();
+ }
+ return 0;
+}
+
+int GUIInput::NotifyKey(int key, bool down)
+{
+ if (!HasInputFocus || !down)
+ return 1;
+
+ switch (key)
+ {
+ case KEY_LEFT:
+ if (mCursorLocation == 0)
+ return 0; // we're already at the beginning
+ if (mCursorLocation == -1) {
+ if (displayValue.size() == 0) {
+ cursorX = mRenderX;
+ return 0;
+ }
+ mCursorLocation = displayValue.size() - 1;
+ } else {
+ mCursorLocation--;
+ }
+ mRendered = false;
+ HandleCursorByText();
+ return 0;
+
+ case KEY_RIGHT:
+ if (mCursorLocation == -1)
+ return 0; // we're already at the end
+ mCursorLocation++;
+ if ((int)displayValue.size() <= mCursorLocation)
+ mCursorLocation = -1;
+ HandleCursorByText();
+ mRendered = false;
+ return 0;
+
+ case KEY_HOME:
+ case KEY_UP:
+ if (displayValue.size() == 0)
+ return 0;
+ mCursorLocation = 0;
+ mRendered = false;
+ cursorX = mRenderX;
+ return 0;
+
+ case KEY_END:
+ case KEY_DOWN:
+ mCursorLocation = -1;
+ mRendered = false;
+ HandleCursorByText();
+ return 0;
+ }
+
+ return 1;
+}
+
+int GUIInput::NotifyCharInput(int key)
+{
+ if (HasInputFocus) {
+ if (key == KEYBOARD_BACKSPACE) {
+ //Backspace
+ if (mValue.size() > 0 && mCursorLocation != 0) {
+ if (mCursorLocation == -1) {
+ mValue.resize(mValue.size() - 1);
+ } else {
+ mValue.erase(mCursorLocation - 1, 1);
+ mCursorLocation--;
+ }
+ isLocalChange = true;
+ DataManager::SetValue(mVariable, mValue);
+ UpdateDisplayText();
+ HandleTextLocation(TW_INPUT_NO_UPDATE);
+ HandleCursorByText();
+ }
+ } else if (key == KEYBOARD_SWIPE_LEFT) {
+ // Delete all
+ isLocalChange = true;
+ if (mCursorLocation == -1) {
+ DataManager::SetValue (mVariable, "");
+ mValue = "";
+ textWidth = 0;
+ mCursorLocation = -1;
+ } else {
+ mValue.erase(0, mCursorLocation);
+ DataManager::SetValue(mVariable, mValue);
+ mCursorLocation = 0;
+ }
+ UpdateDisplayText();
+ cursorX = mRenderX;
+ scrollingX = 0;
+ mRendered = false;
+ return 0;
+ } else if (key >= 32) {
+ // Regular key
+ if (HasAllowed && AllowedList.find((char)key) == string::npos) {
+ return 0;
+ }
+ if (HasDisabled && DisabledList.find((char)key) != string::npos) {
+ return 0;
+ }
+ if (MaxLen != 0 && mValue.size() >= MaxLen) {
+ return 0;
+ }
+ if (mCursorLocation == -1) {
+ mValue += key;
+ } else {
+ mValue.insert(mCursorLocation, 1, key);
+ mCursorLocation++;
+ }
+ isLocalChange = true;
+ DataManager::SetValue(mVariable, mValue);
+ UpdateDisplayText();
+ HandleTextLocation(TW_INPUT_NO_UPDATE);
+ HandleCursorByText();
+ } else if (key == KEYBOARD_ACTION) {
+ // Action
+ if (mAction) {
+ unsigned inputLen = mValue.length();
+ if (inputLen < MinLen)
+ return 0;
+ else if (MaxLen != 0 && inputLen > MaxLen)
+ return 0;
+ else
+ return (mAction ? mAction->NotifyTouch(TOUCH_RELEASE, mRenderX, mRenderY) : 1);
+ }
+ }
+ return 0;
+ } else {
+ if (key == 0) {
+ // Somewhat ugly hack-ish way to tell the box to redraw after losing focus to remove the cursor
+ mRendered = false;
+ return 1;
+ }
+ }
+ return 1;
+}
diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp
new file mode 100644
index 000000000..849cf19d8
--- /dev/null
+++ b/gui/keyboard.cpp
@@ -0,0 +1,633 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <linux/input.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../data.hpp"
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+#include "gui.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+bool GUIKeyboard::CtrlActive = false;
+
+GUIKeyboard::GUIKeyboard(xml_node<>* node)
+ : GUIObject(node)
+{
+ int layoutindex, rowindex, keyindex, Xindex, Yindex, keyHeight = 0, keyWidth = 0;
+ currentKey = NULL;
+ highlightRenderCount = 0;
+ hasHighlight = hasCapsHighlight = hasCtrlHighlight = false;
+ char resource[10], layout[8], row[5], key[6], longpress[7];
+ xml_attribute<>* attr;
+ xml_node<>* child;
+ xml_node<>* keylayout;
+ xml_node<>* keyrow;
+
+ for (layoutindex=0; layoutindex<MAX_KEYBOARD_LAYOUTS; layoutindex++) {
+ layouts[layoutindex].keyboardImg = NULL;
+ memset(layouts[layoutindex].keys, 0, sizeof(Layout::keys));
+ memset(layouts[layoutindex].row_end_y, 0, sizeof(Layout::row_end_y));
+ }
+
+ mRendered = false;
+ currentLayout = 1;
+ CapsLockOn = false;
+
+ if (!node) return;
+
+ mHighlightColor = LoadAttrColor(FindNode(node, "highlight"), "color", &hasHighlight);
+ mCapsHighlightColor = LoadAttrColor(FindNode(node, "capshighlight"), "color", &hasCapsHighlight);
+ mCtrlHighlightColor = LoadAttrColor(FindNode(node, "ctrlhighlight"), "color", &hasCtrlHighlight);
+
+ child = FindNode(node, "keymargin");
+ mKeyMarginX = LoadAttrIntScaleX(child, "x", 0);
+ mKeyMarginY = LoadAttrIntScaleY(child, "y", 0);
+
+ child = FindNode(node, "background");
+ mBackgroundColor = LoadAttrColor(child, "color", COLOR(32,32,32,255));
+
+ child = FindNode(node, "key-alphanumeric");
+ mFont = PageManager::GetResources()->FindFont(LoadAttrString(child, "font", "keylabel"));
+ mFontColor = LoadAttrColor(child, "textcolor", COLOR(255,255,255,255));
+ mKeyColorAlphanumeric = LoadAttrColor(child, "color", COLOR(0,0,0,0));
+
+ child = FindNode(node, "key-other");
+ mSmallFont = PageManager::GetResources()->FindFont(LoadAttrString(child, "font", "keylabel-small"));
+ mFontColorSmall = LoadAttrColor(child, "textcolor", COLOR(192,192,192,255));
+ mKeyColorOther = LoadAttrColor(child, "color", COLOR(0,0,0,0));
+
+ child = FindNode(node, "longpress");
+ mLongpressFont = PageManager::GetResources()->FindFont(LoadAttrString(child, "font", "keylabel-longpress"));
+ mLongpressFontColor = LoadAttrColor(child, "textcolor", COLOR(128,128,128,255));
+ LoadPlacement(child, &longpressOffsetX, &longpressOffsetY);
+
+ LoadKeyLabels(node, 0); // load global key labels
+
+ // compatibility ugliness: resources should be specified in the layouts themselves instead
+ // Load the images for the different layouts
+ child = FindNode(node, "layout");
+ if (child)
+ {
+ layoutindex = 1;
+ strcpy(resource, "resource1");
+ attr = child->first_attribute(resource);
+ while (attr && layoutindex < (MAX_KEYBOARD_LAYOUTS + 1)) {
+ layouts[layoutindex - 1].keyboardImg = LoadAttrImage(child, resource);
+
+ layoutindex++;
+ resource[8] = (char)(layoutindex + 48);
+ attr = child->first_attribute(resource);
+ }
+ }
+
+ // Check the first image to get height and width
+ if (layouts[0].keyboardImg && layouts[0].keyboardImg->GetResource())
+ {
+ mRenderW = layouts[0].keyboardImg->GetWidth();
+ mRenderH = layouts[0].keyboardImg->GetHeight();
+ }
+
+ // Load all of the layout maps
+ layoutindex = 1;
+ strcpy(layout, "layout1");
+ keylayout = FindNode(node, layout);
+ while (keylayout)
+ {
+ if (layoutindex > MAX_KEYBOARD_LAYOUTS) {
+ LOGERR("Too many layouts defined in keyboard.\n");
+ return;
+ }
+
+ LoadKeyLabels(keylayout, layoutindex); // load per-layout key labels
+
+ Layout& lay = layouts[layoutindex - 1];
+
+ child = keylayout->first_node("keysize");
+ keyHeight = LoadAttrIntScaleY(child, "height", 0);
+ keyWidth = LoadAttrIntScaleX(child, "width", 0);
+ // compatibility ugliness: capslock="0" means that this is the caps layout. Also it has nothing to do with keysize.
+ lay.is_caps = (LoadAttrInt(child, "capslock", 1) == 0);
+ // compatibility ugliness: revert_layout has nothing to do with keysize.
+ lay.revert_layout = LoadAttrInt(child, "revert_layout", -1);
+
+ rowindex = 1;
+ Yindex = 0;
+ strcpy(row, "row1");
+ keyrow = keylayout->first_node(row);
+ while (keyrow)
+ {
+ if (rowindex > MAX_KEYBOARD_ROWS) {
+ LOGERR("Too many rows defined in keyboard.\n");
+ return;
+ }
+
+ Yindex += keyHeight;
+ lay.row_end_y[rowindex - 1] = Yindex;
+
+ keyindex = 1;
+ Xindex = 0;
+ strcpy(key, "key01");
+ attr = keyrow->first_attribute(key);
+
+ while (attr) {
+ if (keyindex > MAX_KEYBOARD_KEYS) {
+ LOGERR("Too many keys defined in a keyboard row.\n");
+ return;
+ }
+
+ const char* keyinfo = attr->value();
+
+ if (strlen(keyinfo) == 0) {
+ LOGERR("No key info on layout%i, row%i, key%dd.\n", layoutindex, rowindex, keyindex);
+ return;
+ }
+
+ if (ParseKey(keyinfo, lay.keys[rowindex - 1][keyindex - 1], Xindex, keyWidth, false))
+ LOGERR("Invalid key info on layout%i, row%i, key%02i.\n", layoutindex, rowindex, keyindex);
+
+
+ // PROCESS LONG PRESS INFO IF EXISTS
+ sprintf(longpress, "long%02i", keyindex);
+ attr = keyrow->first_attribute(longpress);
+ if (attr) {
+ const char* keyinfo = attr->value();
+
+ if (strlen(keyinfo) == 0) {
+ LOGERR("No long press info on layout%i, row%i, long%dd.\n", layoutindex, rowindex, keyindex);
+ return;
+ }
+
+ if (ParseKey(keyinfo, lay.keys[rowindex - 1][keyindex - 1], Xindex, keyWidth, true))
+ LOGERR("Invalid long press key info on layout%i, row%i, long%02i.\n", layoutindex, rowindex, keyindex);
+ }
+ keyindex++;
+ sprintf(key, "key%02i", keyindex);
+ attr = keyrow->first_attribute(key);
+ }
+ rowindex++;
+ row[3] = (char)(rowindex + 48);
+ keyrow = keylayout->first_node(row);
+ }
+ layoutindex++;
+ layout[6] = (char)(layoutindex + 48);
+ keylayout = FindNode(node, layout);
+ }
+
+ int x, y;
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &x, &y, &mRenderW, &mRenderH);
+ SetRenderPos(x, y, mRenderW, mRenderH);
+ return;
+}
+
+GUIKeyboard::~GUIKeyboard()
+{
+}
+
+int GUIKeyboard::ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress)
+{
+ key.layout = 0;
+ int keychar = 0;
+ if (strlen(keyinfo) == 1) {
+ // This is a single key, simple definition
+ keychar = keyinfo[0];
+ } else {
+ // This key has extra data: {keywidth}:{what_the_key_does}
+ keyWidth = scale_theme_x(atoi(keyinfo));
+
+ const char* ptr = keyinfo;
+ while (*ptr > 32 && *ptr != ':')
+ ptr++;
+ if (*ptr != ':')
+ return -1; // no colon is an error
+ ptr++;
+
+ if (*ptr == 0) { // This is an empty area
+ keychar = 0;
+ } else if (strlen(ptr) == 1) { // This is the character that this key uses
+ keychar = *ptr;
+ } else if (*ptr == 'c') { // This is an ASCII character code: "c:{number}"
+ keychar = atoi(ptr + 2);
+ } else if (*ptr == 'k') { // This is a Linux keycode from input.h: "k:{number}"
+ keychar = -atoi(ptr + 2);
+ } else if (*ptr == 'l') { // This is a different layout: "layout{number}"
+ key.layout = atoi(ptr + 6);
+ } else if (*ptr == 'a') { // This is an action: "action" (the Enter key)
+ keychar = KEYBOARD_ACTION;
+ } else
+ return -1;
+ }
+
+ if (longpress) {
+ key.longpresskey = keychar;
+ } else {
+ key.key = keychar;
+ Xindex += keyWidth;
+ key.end_x = Xindex - 1;
+ }
+
+ return 0;
+}
+
+void GUIKeyboard::LoadKeyLabels(xml_node<>* parent, int layout)
+{
+ for (xml_node<>* child = parent->first_node(); child; child = child->next_sibling()) {
+ std::string name = child->name();
+ if (name == "keylabel") {
+ std::string keydef = LoadAttrString(child, "key", "");
+ Key tempkey;
+ int dummyX;
+ if (ParseKey(keydef.c_str(), tempkey, dummyX, 0, false) == 0) {
+ KeyLabel keylabel;
+ keylabel.key = tempkey.key;
+ keylabel.layout_from = layout;
+ keylabel.layout_to = tempkey.layout;
+ keylabel.text = LoadAttrString(child, "text", "");
+ keylabel.image = LoadAttrImage(child, "resource");
+ mKeyLabels.push_back(keylabel);
+ } else {
+ LOGERR("Ignoring invalid keylabel in layout %d: '%s'.\n", layout, keydef.c_str());
+ }
+ }
+ }
+}
+
+void GUIKeyboard::DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH)
+{
+ int keychar = key.key;
+ if (!keychar && !key.layout)
+ return;
+
+ // key background
+ COLOR& c = (keychar >= 32 && keychar < 127) ? mKeyColorAlphanumeric : mKeyColorOther;
+ gr_color(c.red, c.green, c.blue, c.alpha);
+ keyX += mKeyMarginX;
+ keyY += mKeyMarginY;
+ keyW -= mKeyMarginX * 2;
+ keyH -= mKeyMarginY * 2;
+ gr_fill(keyX, keyY, keyW, keyH);
+
+ // key label
+ FontResource* labelFont = mFont;
+ string labelText;
+ ImageResource* labelImage = NULL;
+ if (keychar > 32 && keychar < 127) {
+ // TODO: this will eventually need UTF-8 support
+ labelText = (char) keychar;
+ if (CtrlActive) {
+ int ctrlchar = KeyCharToCtrlChar(keychar);
+ if (ctrlchar != keychar)
+ labelText = std::string("^") + (char)(ctrlchar + 64);
+ }
+ gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
+ }
+ else {
+ // search for a special key label
+ for (std::vector<KeyLabel>::iterator it = mKeyLabels.begin(); it != mKeyLabels.end(); ++it) {
+ if (it->layout_from > 0 && it->layout_from != currentLayout)
+ continue; // this label is for another layout
+ if (it->key == key.key && it->layout_to == key.layout)
+ {
+ // found a label
+ labelText = it->text;
+ labelImage = it->image;
+ break;
+ }
+ }
+ labelFont = mSmallFont;
+ gr_color(mFontColorSmall.red, mFontColorSmall.green, mFontColorSmall.blue, mFontColorSmall.alpha);
+ }
+
+ if (labelImage)
+ {
+ int w = labelImage->GetWidth();
+ int h = labelImage->GetHeight();
+ int x = keyX + (keyW - w) / 2;
+ int y = keyY + (keyH - h) / 2;
+ gr_blit(labelImage->GetResource(), 0, 0, w, h, x, y);
+ }
+ else if (!labelText.empty())
+ {
+ void* fontResource = labelFont->GetResource();
+ int textW = gr_ttf_measureEx(labelText.c_str(), fontResource);
+ int textH = labelFont->GetHeight();
+ int textX = keyX + (keyW - textW) / 2;
+ int textY = keyY + (keyH - textH) / 2;
+ gr_textEx_scaleW(textX, textY, labelText.c_str(), fontResource, keyW, TOP_LEFT, 0);
+ }
+
+ // longpress key label (only if font is defined)
+ keychar = key.longpresskey;
+ if (keychar > 32 && keychar < 127 && mLongpressFont->GetResource()) {
+ void* fontResource = mLongpressFont->GetResource();
+ gr_color(mLongpressFontColor.red, mLongpressFontColor.green, mLongpressFontColor.blue, mLongpressFontColor.alpha);
+ string text(1, keychar);
+ int textW = gr_ttf_measureEx(text.c_str(), fontResource);
+ int textX = keyX + keyW - longpressOffsetX - textW;
+ int textY = keyY + longpressOffsetY;
+ gr_textEx_scaleW(textX, textY, text.c_str(), fontResource, keyW, TOP_LEFT, 0);
+ }
+}
+
+int GUIKeyboard::KeyCharToCtrlChar(int key)
+{
+ // convert upper and lower case to ctrl chars
+ // Ctrl+A to Ctrl+_ (we don't support entering null bytes)
+ if (key >= 65 && key <= 127 && key != 96)
+ return key & 0x1f;
+ return key; // pass on others (already ctrl chars, numbers, etc.) unchanged
+}
+
+int GUIKeyboard::Render(void)
+{
+ if (!isConditionTrue())
+ {
+ mRendered = false;
+ return 0;
+ }
+
+ Layout& lay = layouts[currentLayout - 1];
+
+ bool drawKeys = false;
+ if (lay.keyboardImg && lay.keyboardImg->GetResource())
+ // keyboard is image based
+ gr_blit(lay.keyboardImg->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ else {
+ // keyboard is software drawn
+ // fill background
+ gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, mBackgroundColor.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+ drawKeys = true;
+ }
+
+ // draw keys
+ int y1 = 0;
+ for (int row = 0; row < MAX_KEYBOARD_ROWS; ++row) {
+ int rowY = mRenderY + y1;
+ int rowH = lay.row_end_y[row] - y1;
+ y1 = lay.row_end_y[row];
+ int x1 = 0;
+ for (int col = 0; col < MAX_KEYBOARD_KEYS; ++col) {
+ Key& key = lay.keys[row][col];
+ int keyY = rowY;
+ int keyH = rowH;
+ int keyX = mRenderX + x1;
+ int keyW = key.end_x - x1;
+ x1 = key.end_x;
+
+ // Draw key for software drawn keyboard
+ if (drawKeys)
+ DrawKey(key, keyX, keyY, keyW, keyH);
+
+ // Draw highlight for capslock
+ if (hasCapsHighlight && lay.is_caps && CapsLockOn && key.layout > 0 && key.layout == lay.revert_layout) {
+ gr_color(mCapsHighlightColor.red, mCapsHighlightColor.green, mCapsHighlightColor.blue, mCapsHighlightColor.alpha);
+ gr_fill(keyX, keyY, keyW, keyH);
+ }
+
+ // Draw highlight for control
+ if (hasCtrlHighlight && key.key == -KEY_LEFTCTRL && CtrlActive) {
+ gr_color(mCtrlHighlightColor.red, mCtrlHighlightColor.green, mCtrlHighlightColor.blue, mCtrlHighlightColor.alpha);
+ gr_fill(keyX, keyY, keyW, keyH);
+ }
+
+ // Highlight current key
+ if (hasHighlight && &key == currentKey && highlightRenderCount != 0) {
+ gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
+ gr_fill(keyX, keyY, keyW, keyH);
+ }
+ }
+ }
+
+ if (!hasHighlight || highlightRenderCount == 0)
+ mRendered = true;
+ else if (highlightRenderCount > 0)
+ highlightRenderCount--;
+ return 0;
+}
+
+int GUIKeyboard::Update(void)
+{
+ if (!isConditionTrue()) return (mRendered ? 2 : 0);
+ if (!mRendered) return 2;
+
+ return 0;
+}
+
+int GUIKeyboard::SetRenderPos(int x, int y, int w, int h)
+{
+ RenderObject::SetRenderPos(x, y, w, h);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ return 0;
+}
+
+GUIKeyboard::Key* GUIKeyboard::HitTestKey(int x, int y)
+{
+ if (!IsInRegion(x, y))
+ return NULL;
+
+ int rely = y - mRenderY;
+ int relx = x - mRenderX;
+
+ Layout& lay = layouts[currentLayout - 1];
+
+ // Find the correct row
+ int row;
+ for (row = 0; row < MAX_KEYBOARD_ROWS; ++row) {
+ if (lay.row_end_y[row] > rely)
+ break;
+ }
+ if (row == MAX_KEYBOARD_ROWS)
+ return NULL;
+
+ // Find the correct key (column)
+ int col;
+ int x1 = 0;
+ for (col = 0; col < MAX_KEYBOARD_KEYS; ++col) {
+ Key& key = lay.keys[row][col];
+ if (x1 <= relx && relx < key.end_x && (key.key != 0 || key.layout != 0)) {
+ // This is the key that was pressed!
+ return &key;
+ }
+ x1 = key.end_x;
+ }
+ return NULL;
+}
+
+int GUIKeyboard::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ static int was_held = 0, startX = 0;
+
+ if (!isConditionTrue()) return -1;
+
+ switch (state)
+ {
+ case TOUCH_START:
+ was_held = 0;
+ startX = x;
+ currentKey = HitTestKey(x, y);
+ if (currentKey)
+ highlightRenderCount = -1;
+ else
+ highlightRenderCount = 0;
+ mRendered = false;
+ break;
+
+ case TOUCH_DRAG:
+ break;
+
+ case TOUCH_RELEASE:
+ // TODO: we might want to notify of key releases here
+ if (x < startX - (mRenderW * 0.5)) {
+ if (highlightRenderCount != 0) {
+ highlightRenderCount = 0;
+ mRendered = false;
+ }
+ PageManager::NotifyCharInput(KEYBOARD_SWIPE_LEFT);
+ return 0;
+ } else if (x > startX + (mRenderW * 0.5)) {
+ if (highlightRenderCount != 0) {
+ highlightRenderCount = 0;
+ mRendered = false;
+ }
+ PageManager::NotifyCharInput(KEYBOARD_SWIPE_RIGHT);
+ return 0;
+ }
+ // fall through
+ case TOUCH_HOLD:
+ case TOUCH_REPEAT:
+ if (!currentKey) {
+ if (highlightRenderCount != 0) {
+ highlightRenderCount = 0;
+ mRendered = false;
+ }
+ return 0;
+ }
+
+ if (highlightRenderCount != 0) {
+ if (state == TOUCH_RELEASE)
+ highlightRenderCount = 2;
+ else
+ highlightRenderCount = -1;
+ mRendered = false;
+ }
+
+ if (HitTestKey(x, y) != currentKey) {
+ // We dragged off of the starting key
+ currentKey = NULL;
+ if (highlightRenderCount != 0) {
+ highlightRenderCount = 0;
+ mRendered = false;
+ }
+ return 0;
+ } else {
+ Key& key = *currentKey;
+ bool repeatKey = false;
+ Layout& lay = layouts[currentLayout - 1];
+ if (state == TOUCH_RELEASE && was_held == 0) {
+ DataManager::Vibrate("tw_keyboard_vibrate");
+ if (key.layout > 0) {
+ // Switch layouts
+ if (lay.is_caps && key.layout == lay.revert_layout && !CapsLockOn) {
+ CapsLockOn = true; // Set the caps lock
+ } else {
+ CapsLockOn = false; // Unset the caps lock and change layouts
+ currentLayout = key.layout;
+ }
+ mRendered = false;
+ } else if (key.key == KEYBOARD_ACTION) {
+ // Action
+ highlightRenderCount = 0;
+ // Send action notification
+ PageManager::NotifyCharInput(key.key);
+ } else if (key.key == -KEY_LEFTCTRL) {
+ CtrlActive = !CtrlActive; // toggle Control key state
+ mRendered = false; // render Ctrl key highlight
+ } else if (key.key != 0) {
+ // Regular key
+ if (key.key > 0) {
+ // ASCII code or character
+ int keycode = key.key;
+ if (CtrlActive) {
+ CtrlActive = false;
+ mRendered = false;
+ keycode = KeyCharToCtrlChar(key.key);
+ }
+ PageManager::NotifyCharInput(keycode);
+ } else {
+ // Linux key code
+ PageManager::NotifyKey(-key.key, true);
+ PageManager::NotifyKey(-key.key, false);
+ }
+ if (!CapsLockOn && lay.is_caps) {
+ // caps lock was not set, change layouts
+ currentLayout = lay.revert_layout;
+ mRendered = false;
+ }
+ }
+ } else if (state == TOUCH_HOLD) {
+ was_held = 1;
+ if (key.longpresskey > 0) {
+ // Long Press Key
+ DataManager::Vibrate("tw_keyboard_vibrate");
+ PageManager::NotifyCharInput(key.longpresskey);
+ }
+ else
+ repeatKey = true;
+ } else if (state == TOUCH_REPEAT) {
+ was_held = 1;
+ repeatKey = true;
+ }
+ if (repeatKey) {
+ if (key.key == KEYBOARD_BACKSPACE) {
+ // Repeat backspace
+ PageManager::NotifyCharInput(key.key);
+ }
+ switch (key.key)
+ {
+ // Repeat arrows
+ case -KEY_LEFT:
+ case -KEY_RIGHT:
+ case -KEY_UP:
+ case -KEY_DOWN:
+ PageManager::NotifyKey(-key.key, true);
+ PageManager::NotifyKey(-key.key, false);
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
+void GUIKeyboard::SetPageFocus(int inFocus)
+{
+ if (inFocus)
+ CtrlActive = false;
+}
diff --git a/gui/listbox.cpp b/gui/listbox.cpp
new file mode 100644
index 000000000..05276e8ac
--- /dev/null
+++ b/gui/listbox.cpp
@@ -0,0 +1,246 @@
+/*
+ Copyright 2013 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string.h>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+#include "pages.hpp"
+
+extern std::vector<language_struct> Language_List;
+
+GUIListBox::GUIListBox(xml_node<>* node) : GUIScrollList(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+ mIconSelected = mIconUnselected = NULL;
+ mUpdate = 0;
+ isCheckList = isTextParsed = false;
+
+ // Get the icons, if any
+ child = FindNode(node, "icon");
+ if (child) {
+ mIconSelected = LoadAttrImage(child, "selected");
+ mIconUnselected = LoadAttrImage(child, "unselected");
+ }
+ int iconWidth = std::max(mIconSelected->GetWidth(), mIconUnselected->GetWidth());
+ int iconHeight = std::max(mIconSelected->GetHeight(), mIconUnselected->GetHeight());
+ SetMaxIconSize(iconWidth, iconHeight);
+
+ // Handle the result variable
+ child = FindNode(node, "data");
+ if (child) {
+ attr = child->first_attribute("name");
+ if (attr)
+ mVariable = attr->value();
+ attr = child->first_attribute("default");
+ if (attr)
+ DataManager::SetValue(mVariable, attr->value());
+ // Get the currently selected value for the list
+ DataManager::GetValue(mVariable, currentValue);
+ if (mVariable == "tw_language") {
+ std::vector<language_struct>::iterator iter;
+ for (iter = Language_List.begin(); iter != Language_List.end(); iter++) {
+ ListItem data;
+ data.displayName = (*iter).displayvalue;
+ data.variableValue = (*iter).filename;
+ data.action = NULL;
+ if (currentValue == (*iter).filename) {
+ data.selected = 1;
+ DataManager::SetValue("tw_language_display", (*iter).displayvalue);
+ } else
+ data.selected = 0;
+ mListItems.push_back(data);
+ }
+ }
+ }
+ else
+ allowSelection = false; // allows using listbox as a read-only list or menu
+
+ // Get the data for the list
+ child = FindNode(node, "listitem");
+ if (!child) return;
+ while (child) {
+ ListItem item;
+
+ attr = child->first_attribute("name");
+ if (!attr)
+ continue;
+ // We will parse display names when we get page focus to ensure that translating takes place
+ item.displayName = attr->value();
+ item.variableValue = gui_parse_text(child->value());
+ item.selected = (child->value() == currentValue);
+ item.action = NULL;
+ xml_node<>* action = child->first_node("action");
+ if (action) {
+ item.action = new GUIAction(action);
+ allowSelection = true;
+ }
+ xml_node<>* variable_name = child->first_node("data");
+ if (variable_name) {
+ attr = variable_name->first_attribute("variable");
+ if (attr) {
+ item.variableName = attr->value();
+ item.selected = (DataManager::GetIntValue(item.variableName) != 0);
+ allowSelection = true;
+ isCheckList = true;
+ }
+ }
+
+ LoadConditions(child, item.mConditions);
+
+ mListItems.push_back(item);
+ mVisibleItems.push_back(mListItems.size()-1);
+
+ child = child->next_sibling("listitem");
+ }
+}
+
+GUIListBox::~GUIListBox()
+{
+}
+
+int GUIListBox::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ GUIScrollList::Update();
+
+ if (mUpdate) {
+ mUpdate = 0;
+ if (Render() == 0)
+ return 2;
+ }
+ return 0;
+}
+
+int GUIListBox::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIScrollList::NotifyVarChange(varName, value);
+
+ if (!isConditionTrue())
+ return 0;
+
+ // Check to see if the variable that we are using to store the list selected value has been updated
+ if (varName == mVariable) {
+ currentValue = value;
+ mUpdate = 1;
+ }
+
+ std::vector<size_t> mVisibleItemsOld;
+ std::swap(mVisibleItemsOld, mVisibleItems);
+ for (size_t i = 0; i < mListItems.size(); i++) {
+ ListItem& item = mListItems[i];
+ // update per-item visibility condition
+ bool itemVisible = UpdateConditions(item.mConditions, varName);
+ if (itemVisible)
+ mVisibleItems.push_back(i);
+
+ if (isCheckList)
+ {
+ if (item.variableName == varName || varName.empty()) {
+ std::string val;
+ DataManager::GetValue(item.variableName, val);
+ item.selected = (val != "0");
+ mUpdate = 1;
+ }
+ }
+ else if (varName == mVariable) {
+ if (item.variableValue == currentValue) {
+ item.selected = 1;
+ SetVisibleListLocation(mVisibleItems.empty() ? 0 : mVisibleItems.size()-1);
+ } else {
+ item.selected = 0;
+ }
+ }
+ }
+
+ if (mVisibleItemsOld != mVisibleItems) {
+ mUpdate = 1; // some item's visibility has changed
+ if (firstDisplayedItem >= (int)mVisibleItems.size()) {
+ // all items in the view area were removed - make last item visible
+ SetVisibleListLocation(mVisibleItems.empty() ? 0 : mVisibleItems.size()-1);
+ }
+ }
+
+ return 0;
+}
+
+void GUIListBox::SetPageFocus(int inFocus)
+{
+ GUIScrollList::SetPageFocus(inFocus);
+ if (inFocus) {
+ if (!isTextParsed) {
+ isTextParsed = true;
+ for (size_t i = 0; i < mListItems.size(); i++) {
+ ListItem& item = mListItems[i];
+ item.displayName = gui_parse_text(item.displayName);
+ }
+ }
+ DataManager::GetValue(mVariable, currentValue);
+ NotifyVarChange(mVariable, currentValue);
+ }
+}
+
+size_t GUIListBox::GetItemCount()
+{
+ return mVisibleItems.size();
+}
+
+void GUIListBox::RenderItem(size_t itemindex, int yPos, bool selected)
+{
+ // note: the "selected" parameter above is for the currently touched item
+ // don't confuse it with the more persistent "selected" flag per list item used below
+ ListItem& item = mListItems[mVisibleItems[itemindex]];
+ ImageResource* icon = item.selected ? mIconSelected : mIconUnselected;
+ const std::string& text = item.displayName;
+
+ RenderStdItem(yPos, selected, icon, text.c_str());
+}
+
+void GUIListBox::NotifySelect(size_t item_selected)
+{
+ if (!isCheckList) {
+ // deselect all items, even invisible ones
+ for (size_t i = 0; i < mListItems.size(); i++) {
+ mListItems[i].selected = 0;
+ }
+ }
+
+ ListItem& item = mListItems[mVisibleItems[item_selected]];
+
+ if (isCheckList) {
+ int selected = 1 - item.selected;
+ item.selected = selected;
+ DataManager::SetValue(item.variableName, selected ? "1" : "0");
+ } else {
+ item.selected = 1;
+ string str = item.variableValue; // [check] should this set currentValue instead?
+ DataManager::SetValue(mVariable, str);
+ }
+ if (item.action)
+ item.action->doActions();
+ mUpdate = 1;
+}
diff --git a/gui/mousecursor.cpp b/gui/mousecursor.cpp
new file mode 100644
index 000000000..b87cac414
--- /dev/null
+++ b/gui/mousecursor.cpp
@@ -0,0 +1,165 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+MouseCursor::MouseCursor(int resX, int resY)
+{
+ ResetData(resX, resY);
+}
+
+MouseCursor::~MouseCursor()
+{
+}
+
+void MouseCursor::ResetData(int resX, int resY)
+{
+ m_resX = resX;
+ m_resY = resY;
+ m_moved = false;
+ m_speedMultiplier = 2.5f;
+ m_image = NULL;
+ m_present = false;
+
+ ConvertStrToColor("red", &m_color);
+
+ SetRenderPos(resX/2, resY/2, 10, 10);
+}
+
+void MouseCursor::LoadData(xml_node<>* node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ child = FindNode(node, "placement");
+ if (child)
+ LoadPlacement(child, &mRenderX, &mRenderY, &mRenderW, &mRenderH);
+
+ child = FindNode(node, "background");
+ if (child)
+ {
+ m_color = LoadAttrColor(child, "color", m_color);
+ m_image = LoadAttrImage(child, "resource");
+ if (m_image)
+ {
+ mRenderW = m_image->GetWidth();
+ mRenderH = m_image->GetHeight();
+ }
+ }
+
+ child = FindNode(node, "speed");
+ if (child)
+ {
+ attr = child->first_attribute("multiplier");
+ if (attr)
+ m_speedMultiplier = atof(attr->value());
+ }
+}
+
+int MouseCursor::Render(void)
+{
+ if (!m_present)
+ return 0;
+
+ if (m_image)
+ {
+ gr_blit(m_image->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ }
+ else
+ {
+ gr_color(m_color.red, m_color.green, m_color.blue, m_color.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+ }
+ return 0;
+}
+
+int MouseCursor::Update(void)
+{
+ if (m_present != ev_has_mouse())
+ {
+ m_present = ev_has_mouse();
+ if (m_present)
+ SetRenderPos(m_resX/2, m_resY/2);
+ return 2;
+ }
+
+ if (m_present && m_moved)
+ {
+ m_moved = false;
+ return 2;
+ }
+ return 0;
+}
+
+int MouseCursor::SetRenderPos(int x, int y, int w, int h)
+{
+ if (x == mRenderX && y == mRenderY)
+ m_moved = true;
+
+ return RenderObject::SetRenderPos(x, y, w, h);
+}
+
+void MouseCursor::Move(int deltaX, int deltaY)
+{
+ if (deltaX != 0)
+ {
+ mRenderX += deltaX*m_speedMultiplier;
+ mRenderX = (std::min)(mRenderX, m_resX);
+ mRenderX = (std::max)(mRenderX, 0);
+
+ m_moved = true;
+ }
+
+ if (deltaY != 0)
+ {
+ mRenderY += deltaY*m_speedMultiplier;
+ mRenderY = (std::min)(mRenderY, m_resY);
+ mRenderY = (std::max)(mRenderY, 0);
+
+ m_moved = true;
+ }
+}
+
+void MouseCursor::GetPos(int& x, int& y)
+{
+ x = mRenderX;
+ y = mRenderY;
+}
diff --git a/gui/object.cpp b/gui/object.cpp
new file mode 100644
index 000000000..0cf2ccea6
--- /dev/null
+++ b/gui/object.cpp
@@ -0,0 +1,224 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// object.cpp - GUIObject base class
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+#include "../variables.h"
+}
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+
+GUIObject::GUIObject(xml_node<>* node)
+{
+ mConditionsResult = true;
+ if (node)
+ LoadConditions(node, mConditions);
+}
+
+void GUIObject::LoadConditions(xml_node<>* node, std::vector<Condition>& conditions)
+{
+ xml_node<>* condition = FindNode(node, "conditions");
+ if (condition) condition = FindNode(condition, "condition");
+ else condition = FindNode(node, "condition");
+
+ while (condition)
+ {
+ Condition cond;
+
+ cond.mCompareOp = "=";
+
+ xml_attribute<>* attr;
+ attr = condition->first_attribute("var1");
+ if (attr) cond.mVar1 = attr->value();
+
+ attr = condition->first_attribute("op");
+ if (attr) cond.mCompareOp = attr->value();
+
+ attr = condition->first_attribute("var2");
+ if (attr) cond.mVar2 = attr->value();
+
+ conditions.push_back(cond);
+
+ condition = condition->next_sibling("condition");
+ }
+}
+
+GUIObject::~GUIObject()
+{
+}
+
+bool GUIObject::IsConditionVariable(std::string var)
+{
+ std::vector<Condition>::iterator iter;
+ for (iter = mConditions.begin(); iter != mConditions.end(); iter++)
+ {
+ if (iter->mVar1 == var)
+ return true;
+ }
+ return false;
+}
+
+bool GUIObject::isConditionTrue()
+{
+ return mConditionsResult;
+}
+
+bool GUIObject::isConditionTrue(Condition* condition)
+{
+ // This is used to hold the proper value of "true" based on the '!' NOT flag
+ bool bTrue = true;
+
+ if (condition->mVar1.empty())
+ return bTrue;
+
+ if (!condition->mCompareOp.empty() && condition->mCompareOp[0] == '!')
+ bTrue = false;
+
+ if (condition->mVar2.empty() && condition->mCompareOp != "modified")
+ {
+ if (!DataManager::GetStrValue(condition->mVar1).empty())
+ return bTrue;
+
+ return !bTrue;
+ }
+
+ string var1, var2;
+ if (DataManager::GetValue(condition->mVar1, var1))
+ var1 = condition->mVar1;
+ if (DataManager::GetValue(condition->mVar2, var2))
+ var2 = condition->mVar2;
+
+ if (var2.substr(0, 2) == "{@")
+ // translate resource string in value
+ var2 = gui_parse_text(var2);
+
+ // This is a special case, we stat the file and that determines our result
+ if (var1 == "fileexists")
+ {
+ struct stat st;
+ if (stat(var2.c_str(), &st) == 0)
+ var2 = var1;
+ else
+ var2 = "FAILED";
+ }
+ if (var1 == "mounted")
+ {
+ if (isMounted(condition->mVar2))
+ var2 = var1;
+ else
+ var2 = "FAILED";
+ }
+
+ if (condition->mCompareOp.find('=') != string::npos && var1 == var2)
+ return bTrue;
+
+ if (condition->mCompareOp.find('>') != string::npos && (atof(var1.c_str()) > atof(var2.c_str())))
+ return bTrue;
+
+ if (condition->mCompareOp.find('<') != string::npos && (atof(var1.c_str()) < atof(var2.c_str())))
+ return bTrue;
+
+ if (condition->mCompareOp == "modified")
+ {
+ // This is a hack to allow areas to reset the default value
+ if (var1.empty())
+ {
+ condition->mLastVal = var1;
+ return !bTrue;
+ }
+
+ if (var1 != condition->mLastVal)
+ return bTrue;
+ }
+
+ return !bTrue;
+}
+
+bool GUIObject::isConditionValid()
+{
+ return !mConditions.empty();
+}
+
+int GUIObject::NotifyVarChange(const std::string& varName, const std::string& value __unused)
+{
+ mConditionsResult = UpdateConditions(mConditions, varName);
+ return 0;
+}
+
+bool GUIObject::UpdateConditions(std::vector<Condition>& conditions, const std::string& varName)
+{
+ bool result = true;
+
+ const bool varNameEmpty = varName.empty();
+ std::vector<Condition>::iterator iter;
+ for (iter = conditions.begin(); iter != conditions.end(); ++iter)
+ {
+ if (varNameEmpty && iter->mCompareOp == "modified")
+ {
+ string val;
+
+ // If this fails, val will not be set, which is perfect
+ if (DataManager::GetValue(iter->mVar1, val))
+ {
+ DataManager::SetValue(iter->mVar1, "");
+ DataManager::GetValue(iter->mVar1, val);
+ }
+ iter->mLastVal = val;
+ }
+
+ if (varNameEmpty || iter->mVar1 == varName || iter->mVar2 == varName)
+ iter->mLastResult = isConditionTrue(&(*iter));
+
+ if (!iter->mLastResult)
+ result = false;
+ }
+ return result;
+}
+
+bool GUIObject::isMounted(string vol)
+{
+ FILE *fp;
+ char tmpOutput[255];
+
+ fp = fopen("/proc/mounts", "rt");
+ while (fgets(tmpOutput,255,fp) != NULL)
+ {
+ char* mnt = tmpOutput;
+ while (*mnt > 32) mnt++;
+ while (*mnt > 0 && *mnt <= 32) mnt++;
+ char* pos = mnt;
+ while (*pos > 32) pos++;
+ *pos = 0;
+ if (vol == mnt)
+ {
+ fclose(fp);
+ return true;
+ }
+ }
+ fclose(fp);
+ return false;
+}
diff --git a/gui/objects.hpp b/gui/objects.hpp
new file mode 100644
index 000000000..630cf7102
--- /dev/null
+++ b/gui/objects.hpp
@@ -0,0 +1,1242 @@
+/*
+ Copyright 2013 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// objects.hpp - Base classes for object manager of GUI
+
+#ifndef _OBJECTS_HEADER
+#define _OBJECTS_HEADER
+
+#include "rapidxml.hpp"
+#include <vector>
+#include <string>
+#include <map>
+#include <set>
+#include <time.h>
+
+using namespace rapidxml;
+
+#include "../data.hpp"
+#include "resources.hpp"
+#include "pages.hpp"
+#include "../partitions.hpp"
+#include "placement.h"
+
+#ifndef TW_X_OFFSET
+#define TW_X_OFFSET 0
+#endif
+#ifndef TW_Y_OFFSET
+#define TW_Y_OFFSET 0
+#endif
+#ifndef TW_W_OFFSET
+#define TW_W_OFFSET 0
+#endif
+#ifndef TW_H_OFFSET
+#define TW_H_OFFSET 0
+#endif
+
+class RenderObject
+{
+public:
+ RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
+ virtual ~RenderObject() {}
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void) = 0;
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void) { return 0; }
+
+ // GetRenderPos - Returns the current position of the object
+ virtual int GetRenderPos(int& x, int& y, int& w, int& h) { x = mRenderX; y = mRenderY; w = mRenderW; h = mRenderH; return 0; }
+
+ // SetRenderPos - Update the position of the object
+ // Return 0 on success, <0 on error
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0) { mRenderX = x; mRenderY = y; if (w || h) { mRenderW = w; mRenderH = h; } return 0; }
+
+ // GetPlacement - Returns the current placement
+ virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
+
+ // SetPlacement - Update the current placement
+ virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ // TODO: This should be named NotifyPageFocus for consistency
+ virtual void SetPageFocus(int inFocus __unused) { return; }
+
+protected:
+ int mRenderX, mRenderY, mRenderW, mRenderH;
+ Placement mPlacement;
+};
+
+class ActionObject
+{
+public:
+ ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
+ virtual ~ActionObject() {}
+
+public:
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
+
+ // NotifyKey - Notify of a key press
+ // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
+ virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
+
+ virtual int GetActionPos(int& x, int& y, int& w, int& h) { x = mActionX; y = mActionY; w = mActionW; h = mActionH; return 0; }
+
+ // Return 0 on success, <0 on error
+ virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
+
+ // IsInRegion - Checks if the request is handled by this object
+ // Return 1 if this object handles the request, 0 if not
+ virtual int IsInRegion(int x, int y) { return ((x < mActionX || x >= mActionX + mActionW || y < mActionY || y >= mActionY + mActionH) ? 0 : 1); }
+
+protected:
+ int mActionX, mActionY, mActionW, mActionH;
+};
+
+class GUIObject
+{
+public:
+ GUIObject(xml_node<>* node);
+ virtual ~GUIObject();
+
+public:
+ bool IsConditionVariable(std::string var);
+ bool isConditionTrue();
+ bool isConditionValid();
+
+ // NotifyVarChange - Notify of a variable change
+ // Returns 0 on success, <0 on error
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+protected:
+ class Condition
+ {
+ public:
+ Condition() {
+ mLastResult = true;
+ }
+
+ std::string mVar1;
+ std::string mVar2;
+ std::string mCompareOp;
+ std::string mLastVal;
+ bool mLastResult;
+ };
+
+ std::vector<Condition> mConditions;
+
+protected:
+ static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
+ static bool isMounted(std::string vol);
+ static bool isConditionTrue(Condition* condition);
+ static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
+
+ bool mConditionsResult;
+};
+
+class InputObject
+{
+public:
+ InputObject() { HasInputFocus = 0; }
+ virtual ~InputObject() {}
+
+public:
+ // NotifyCharInput - Notify of character input (usually from the onscreen or hardware keyboard)
+ // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
+ virtual int NotifyCharInput(int ch __unused) { return 1; }
+
+ virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
+
+protected:
+ int HasInputFocus;
+};
+
+// Derived Objects
+// GUIText - Used for static text
+class GUIText : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ // w and h may be ignored, in which case, no bounding box is applied
+ GUIText(xml_node<>* node);
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // Retrieve the size of the current string (dynamic strings may change per call)
+ virtual int GetCurrentBounds(int& w, int& h);
+
+ // Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // Set maximum width in pixels
+ virtual int SetMaxWidth(unsigned width);
+
+ void SetText(string newtext);
+
+public:
+ bool isHighlighted;
+ bool scaleWidth;
+ unsigned maxWidth;
+
+protected:
+ std::string mText;
+ std::string mLastValue;
+ COLOR mColor;
+ COLOR mHighlightColor;
+ FontResource* mFont;
+ int mIsStatic;
+ int mVarChanged;
+ int mFontHeight;
+};
+
+// GUIImage - Used for static image
+class GUIImage : public GUIObject, public RenderObject
+{
+public:
+ GUIImage(xml_node<>* node);
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // SetRenderPos - Update the position of the object
+ // Return 0 on success, <0 on error
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+public:
+ bool isHighlighted;
+
+protected:
+ ImageResource* mImage;
+ ImageResource* mHighlightImage;
+};
+
+// GUIFill - Used for fill colors
+class GUIFill : public GUIObject, public RenderObject
+{
+public:
+ GUIFill(xml_node<>* node);
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+protected:
+ COLOR mColor;
+};
+
+// GUIAction - Used for standard actions
+class GUIAction : public GUIObject, public ActionObject
+{
+ friend class ActionThread;
+
+public:
+ GUIAction(xml_node<>* node);
+
+public:
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+ virtual int NotifyKey(int key, bool down);
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ int doActions();
+
+protected:
+ class Action
+ {
+ public:
+ std::string mFunction;
+ std::string mArg;
+ };
+
+ std::vector<Action> mActions;
+ std::map<int, bool> mKeys;
+
+protected:
+ enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
+
+ int getKeyByName(std::string key);
+ int doAction(Action action);
+ ThreadType getThreadType(const Action& action);
+ void simulate_progress_bar(void);
+ int flash_zip(std::string filename, int* wipe_cache);
+ void reinject_after_flash();
+ void operation_start(const string operation_name);
+ void operation_end(const int operation_status);
+ time_t Start;
+
+ // map action name to function pointer
+ typedef int (GUIAction::*execFunction)(std::string);
+ typedef std::map<std::string, execFunction> mapFunc;
+ static mapFunc mf;
+ static std::set<std::string> setActionsRunningInCallerThread;
+
+ // GUI actions
+ int reboot(std::string arg);
+ int home(std::string arg);
+ int key(std::string arg);
+ int page(std::string arg);
+ int reload(std::string arg);
+ int readBackup(std::string arg);
+ int set(std::string arg);
+ int clear(std::string arg);
+ int mount(std::string arg);
+ int unmount(std::string arg);
+ int restoredefaultsettings(std::string arg);
+ int copylog(std::string arg);
+ int compute(std::string arg);
+ int setguitimezone(std::string arg);
+ int overlay(std::string arg);
+ int queuezip(std::string arg);
+ int cancelzip(std::string arg);
+ int queueclear(std::string arg);
+ int sleep(std::string arg);
+ int sleepcounter(std::string arg);
+ int appenddatetobackupname(std::string arg);
+ int generatebackupname(std::string arg);
+ int checkpartitionlist(std::string arg);
+ int getpartitiondetails(std::string arg);
+ int screenshot(std::string arg);
+ int setbrightness(std::string arg);
+ int checkforapp(std::string arg);
+
+ // (originally) threaded actions
+ int fileexists(std::string arg);
+ int flash(std::string arg);
+ int wipe(std::string arg);
+ int refreshsizes(std::string arg);
+ int nandroid(std::string arg);
+ int fixcontexts(std::string arg);
+ int fixpermissions(std::string arg);
+ int dd(std::string arg);
+ int partitionsd(std::string arg);
+ int installhtcdumlock(std::string arg);
+ int htcdumlockrestoreboot(std::string arg);
+ int htcdumlockreflashrecovery(std::string arg);
+ int cmd(std::string arg);
+ int terminalcommand(std::string arg);
+ int killterminal(std::string arg);
+ int reinjecttwrp(std::string arg);
+ int checkbackupname(std::string arg);
+ int decrypt(std::string arg);
+ int adbsideload(std::string arg);
+ int adbsideloadcancel(std::string arg);
+ int openrecoveryscript(std::string arg);
+ int installsu(std::string arg);
+ int fixsu(std::string arg);
+ int decrypt_backup(std::string arg);
+ int repair(std::string arg);
+ int resize(std::string arg);
+ int changefilesystem(std::string arg);
+ int startmtp(std::string arg);
+ int stopmtp(std::string arg);
+ int flashimage(std::string arg);
+ int cancelbackup(std::string arg);
+ int checkpartitionlifetimewrites(std::string arg);
+ int mountsystemtoggle(std::string arg);
+ int setlanguage(std::string arg);
+ int togglebacklight(std::string arg);
+ int twcmd(std::string arg);
+ int setbootslot(std::string arg);
+ int installapp(std::string arg);
+
+ int simulate;
+};
+
+class GUIButton : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUIButton(xml_node<>* node);
+ virtual ~GUIButton();
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // SetPos - Update the position of the render object
+ // Return 0 on success, <0 on error
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+protected:
+ GUIImage* mButtonImg;
+ ImageResource* mButtonIcon;
+ GUIText* mButtonLabel;
+ GUIAction* mAction;
+ int mTextX, mTextY, mTextW, mTextH;
+ int mIconX, mIconY, mIconW, mIconH;
+ bool mRendered;
+ bool hasHighlightColor;
+ bool renderHighlight;
+ bool hasFill;
+ COLOR mFillColor;
+ COLOR mHighlightColor;
+ Placement TextPlacement;
+};
+
+class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUICheckbox(xml_node<>* node);
+ virtual ~GUICheckbox();
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // SetPos - Update the position of the render object
+ // Return 0 on success, <0 on error
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+protected:
+ ImageResource* mChecked;
+ ImageResource* mUnchecked;
+ GUIText* mLabel;
+ int mTextX, mTextY;
+ int mCheckX, mCheckY, mCheckW, mCheckH;
+ int mLastState;
+ bool mRendered;
+ std::string mVarName;
+};
+
+class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUIScrollList(xml_node<>* node);
+ virtual ~GUIScrollList();
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+ // NotifyVarChange - Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // SetPos - Update the position of the render object
+ // Return 0 on success, <0 on error
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ virtual void SetPageFocus(int inFocus);
+
+protected:
+ // derived classes need to implement these
+ // get number of items
+ virtual size_t GetItemCount() { return 0; }
+ // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ // an item was selected
+ virtual void NotifySelect(size_t item_selected __unused) {}
+
+ // render a standard-layout list item with optional icon and text
+ void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
+
+ enum { NO_ITEM = (size_t)-1 };
+ // returns item index at coordinates or NO_ITEM if there is no item there
+ size_t HitTestItem(int x, int y);
+
+ // Called by the derived class to set the max icon size so we can calculate the proper actualItemHeight and center smaller icons if the icon size varies
+ void SetMaxIconSize(int w, int h);
+
+ // This will make sure that the item indicated by list_index is visible on the screen
+ void SetVisibleListLocation(size_t list_index);
+
+ // Handle scrolling changes for drags and kinetic scrolling
+ void HandleScrolling();
+
+ // Returns many full rows the list is capable of displaying
+ int GetDisplayItemCount();
+
+ // Returns the size in pixels of a partial item or row size
+ int GetDisplayRemainder();
+
+protected:
+ // Background
+ COLOR mBackgroundColor;
+ ImageResource* mBackground; // background image, if any, automatically centered
+
+ // Header
+ COLOR mHeaderBackgroundColor;
+ COLOR mHeaderFontColor;
+ std::string mHeaderText; // Original header text without parsing any variables
+ std::string mLastHeaderValue; // Header text after parsing variables
+ bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
+ int mHeaderH; // actual header height including font, icon, padding, and separator heights
+ ImageResource* mHeaderIcon;
+ int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
+ int mHeaderSeparatorH; // Height of the separator between header and list items
+ COLOR mHeaderSeparatorColor; // color of the header separator
+
+ // Per-item layout
+ FontResource* mFont;
+ COLOR mFontColor;
+ bool hasHighlightColor; // indicates if a highlight color was set
+ COLOR mHighlightColor; // background row highlight color
+ COLOR mFontHighlightColor;
+ int mFontHeight;
+ int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
+ int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
+ int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
+ int mSeparatorH; // Height of the separator between items
+ COLOR mSeparatorColor; // color of the separator that is between items
+
+ // Scrollbar
+ int mFastScrollW; // width of the fastscroll area
+ int mFastScrollLineW; // width of the line for fastscroll rendering
+ int mFastScrollRectW; // width of the rectangle for fastscroll
+ int mFastScrollRectH; // minimum height of the rectangle for fastscroll
+ COLOR mFastScrollLineColor;
+ COLOR mFastScrollRectColor;
+
+ // Scrolling and dynamic state
+ int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
+ int mFastScrollRectCurrentH; // current height of fastscroll rect
+ int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
+ bool hasScroll; // indicates that we have enough items in the list to scroll
+ int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
+ int scrollingSpeed; // on a touch release, this is set based on the difference in the y-axis between the last 2 touches and indicates how fast the kinetic scrolling will go
+ int y_offset; // this is how many pixels offset in the y axis for per pixel scrolling, is always <= 0 and should never be < -actualItemHeight
+ bool allowSelection; // true if touched item can be selected, false for pure read-only lists and the console
+ size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
+ int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
+ int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
+ int fastScroll; // indicates that the inital touch was inside the fastscroll region - makes for easier fast scrolling as the touches don't have to stay within the fast scroll region and you drag your finger
+ int mUpdate; // indicates that a change took place and we need to re-render
+ bool AddLines(std::vector<std::string>* origText, std::vector<std::string>* origColor, size_t* lastCount, std::vector<std::string>* rText, std::vector<std::string>* rColor);
+};
+
+class GUIFileSelector : public GUIScrollList
+{
+public:
+ GUIFileSelector(xml_node<>* node);
+ virtual ~GUIFileSelector();
+
+public:
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyVarChange - Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ virtual void SetPageFocus(int inFocus);
+
+ virtual size_t GetItemCount();
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ virtual void NotifySelect(size_t item_selected);
+
+protected:
+ struct FileData {
+ std::string fileName;
+ unsigned char fileType; // Uses d_type format from struct dirent
+ mode_t protection; // Uses mode_t format from stat
+ uid_t userId;
+ gid_t groupId;
+ off_t fileSize;
+ time_t lastAccess; // Uses time_t format from stat
+ time_t lastModified; // Uses time_t format from stat
+ time_t lastStatChange; // Uses time_t format from stat
+ };
+
+protected:
+ virtual int GetFileList(const std::string folder);
+ static bool fileSort(FileData d1, FileData d2);
+
+protected:
+ std::vector<FileData> mFolderList;
+ std::vector<FileData> mFileList;
+ std::string mPathVar; // current path displayed, saved in the data manager
+ std::string mPathDefault; // default value for the path if none is set in mPathVar
+ std::string mExtn; // used for filtering the file list, for example, *.zip
+ std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
+ std::string mSortVariable; // data manager variable used to change the sorting of files
+ std::string mSelection; // set when the user selects an item without the full path like selecting /path/to/foo would just be set to foo
+ int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
+ int mShowNavFolders; // indicates if the list should include the "up a level" item and allow you to traverse folders (nav folders are disabled for the restore list, for instance)
+ static int mSortOrder; // must be static because it is used by the static function fileSort
+ ImageResource* mFolderIcon;
+ ImageResource* mFileIcon;
+ bool updateFileList;
+};
+
+class GUIListBox : public GUIScrollList
+{
+public:
+ GUIListBox(xml_node<>* node);
+ virtual ~GUIListBox();
+
+public:
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyVarChange - Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ virtual void SetPageFocus(int inFocus);
+
+ virtual size_t GetItemCount();
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ virtual void NotifySelect(size_t item_selected);
+
+protected:
+ struct ListItem {
+ std::string displayName;
+ std::string variableName;
+ std::string variableValue;
+ unsigned int selected;
+ GUIAction* action;
+ std::vector<Condition> mConditions;
+ };
+
+protected:
+ std::vector<ListItem> mListItems;
+ std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
+ std::string mVariable;
+ std::string currentValue;
+ ImageResource* mIconSelected;
+ ImageResource* mIconUnselected;
+ bool isCheckList;
+ bool isTextParsed;
+};
+
+class GUIPartitionList : public GUIScrollList
+{
+public:
+ GUIPartitionList(xml_node<>* node);
+ virtual ~GUIPartitionList();
+
+public:
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update();
+
+ // NotifyVarChange - Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ virtual void SetPageFocus(int inFocus);
+
+ virtual size_t GetItemCount();
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ virtual void NotifySelect(size_t item_selected);
+
+protected:
+ void MatchList();
+ void SetPosition();
+
+protected:
+ std::vector<PartitionList> mList;
+ std::string ListType;
+ std::string mVariable;
+ std::string selectedList;
+ std::string currentValue;
+ std::string mLastValue;
+ ImageResource* mIconSelected;
+ ImageResource* mIconUnselected;
+ bool updateList;
+};
+
+class GUITextBox : public GUIScrollList
+{
+public:
+ GUITextBox(xml_node<>* node);
+
+public:
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyVarChange - Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // ScrollList interface
+ virtual size_t GetItemCount();
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ virtual void NotifySelect(size_t item_selected);
+protected:
+
+ size_t mLastCount;
+ bool mIsStatic;
+ std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
+ std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
+ std::vector<std::string> rText; // Rendered text - what we actually see
+
+};
+
+class GUIConsole : public GUIScrollList
+{
+public:
+ GUIConsole(xml_node<>* node);
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // IsInRegion - Checks if the request is handled by this object
+ // Return 1 if this object handles the request, 0 if not
+ virtual int IsInRegion(int x, int y);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+ // ScrollList interface
+ virtual size_t GetItemCount();
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ virtual void NotifySelect(size_t item_selected);
+
+ static void Translate_Now();
+ static void Clear_For_Retranslation();
+protected:
+ enum SlideoutState
+ {
+ hidden = 0,
+ visible,
+ request_hide,
+ request_show
+ };
+
+ ImageResource* mSlideoutImage;
+ size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
+ bool scrollToEnd; // true if we want to keep tracking the last line
+ int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
+ int mSlideout;
+ SlideoutState mSlideoutState;
+ std::vector<std::string> rConsole;
+ std::vector<std::string> rConsoleColor;
+
+protected:
+ int RenderSlideout(void);
+ int RenderConsole(void);
+};
+
+class TerminalEngine;
+class GUITerminal : public GUIScrollList, public InputObject
+{
+public:
+ GUITerminal(xml_node<>* node);
+
+public:
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+ // NotifyKey - Notify of a key press
+ // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
+ virtual int NotifyKey(int key, bool down);
+
+ // character input
+ virtual int NotifyCharInput(int ch);
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ virtual void SetPageFocus(int inFocus);
+
+ // ScrollList interface
+ virtual size_t GetItemCount();
+ virtual void RenderItem(size_t itemindex, int yPos, bool selected);
+ virtual void NotifySelect(size_t item_selected);
+protected:
+ void InitAndResize();
+
+ TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
+ int updateCounter; // to track if anything changed in the back-end
+ bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
+};
+
+// GUIAnimation - Used for animations
+class GUIAnimation : public GUIObject, public RenderObject
+{
+public:
+ GUIAnimation(xml_node<>* node);
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+protected:
+ AnimationResource* mAnimation;
+ int mFrame;
+ int mFPS;
+ int mLoop;
+ int mRender;
+ int mUpdateCount;
+};
+
+class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUIProgressBar(xml_node<>* node);
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyVarChange - Notify of a variable change
+ // Returns 0 on success, <0 on error
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+protected:
+ ImageResource* mEmptyBar;
+ ImageResource* mFullBar;
+ std::string mMinValVar;
+ std::string mMaxValVar;
+ std::string mCurValVar;
+ float mSlide;
+ float mSlideInc;
+ int mSlideFrames;
+ int mLastPos;
+
+protected:
+ virtual int RenderInternal(void); // Does the actual render
+};
+
+class GUISlider : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUISlider(xml_node<>* node);
+ virtual ~GUISlider();
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+protected:
+ GUIAction* sAction;
+ GUIText* sSliderLabel;
+ ImageResource* sSlider;
+ ImageResource* sSliderUsed;
+ ImageResource* sTouch;
+ int sTouchW, sTouchH;
+ int sCurTouchX;
+ int sUpdate;
+};
+
+// these are ASCII codes reported via NotifyCharInput
+// other special keys (arrows etc.) are reported via NotifyKey
+#define KEYBOARD_ACTION 13 // CR
+#define KEYBOARD_BACKSPACE 8 // Backspace
+#define KEYBOARD_TAB 9 // Tab
+#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
+#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
+
+class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUIKeyboard(xml_node<>* node);
+ virtual ~GUIKeyboard();
+
+public:
+ virtual int Render(void);
+ virtual int Update(void);
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+ virtual void SetPageFocus(int inFocus);
+
+protected:
+ struct Key
+ {
+ int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
+ int longpresskey;
+ int end_x;
+ int layout;
+ };
+ int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
+ void LoadKeyLabels(xml_node<>* parent, int layout);
+ void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
+ int KeyCharToCtrlChar(int key);
+
+ enum {
+ MAX_KEYBOARD_LAYOUTS = 5,
+ MAX_KEYBOARD_ROWS = 9,
+ MAX_KEYBOARD_KEYS = 20
+ };
+ struct Layout
+ {
+ ImageResource* keyboardImg;
+ Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
+ int row_end_y[MAX_KEYBOARD_ROWS];
+ bool is_caps;
+ int revert_layout;
+ };
+ Layout layouts[MAX_KEYBOARD_LAYOUTS];
+
+ struct KeyLabel
+ {
+ int key; // same as in struct Key
+ int layout_from; // 1-based; 0 for labels that apply to all layouts
+ int layout_to; // same as Key.layout
+ string text; // key label text
+ ImageResource* image; // image (overrides text if defined)
+ };
+ std::vector<KeyLabel> mKeyLabels;
+
+ // Find key at screen coordinates
+ Key* HitTestKey(int x, int y);
+
+ bool mRendered;
+ std::string mVariable;
+ int currentLayout;
+ bool CapsLockOn;
+ static bool CtrlActive; // all keyboards share a common Control key state so that the Control key can be on a separate keyboard instance
+ int highlightRenderCount;
+ Key* currentKey;
+ bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
+ COLOR mHighlightColor;
+ COLOR mCapsHighlightColor;
+ COLOR mCtrlHighlightColor;
+ COLOR mFontColor; // for centered key labels
+ COLOR mFontColorSmall; // for centered key labels
+ FontResource* mFont; // for main key labels
+ FontResource* mSmallFont; // for key labels like "?123"
+ FontResource* mLongpressFont; // for the small longpress label in the upper right corner
+ int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
+ COLOR mLongpressFontColor;
+ COLOR mBackgroundColor; // keyboard background color
+ COLOR mKeyColorAlphanumeric; // key background color
+ COLOR mKeyColorOther; // key background color
+ int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
+};
+
+// GUIInput - Used for keyboard input
+class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
+{
+public:
+ GUIInput(xml_node<>* node);
+ virtual ~GUIInput();
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+ virtual int NotifyKey(int key, bool down);
+ virtual int NotifyCharInput(int ch);
+
+protected:
+ virtual int GetSelection(int x, int y);
+
+ // Handles displaying the text properly when chars are added, deleted, or for scrolling
+ void HandleTextLocation(int x);
+ void UpdateDisplayText();
+ void HandleCursorByTouch(int x);
+ void HandleCursorByText();
+
+protected:
+ GUIText* mInputText;
+ GUIAction* mAction;
+ ImageResource* mBackground;
+ ImageResource* mCursor;
+ FontResource* mFont;
+ std::string mVariable;
+ std::string mMask;
+ std::string mValue;
+ std::string displayValue;
+ COLOR mBackgroundColor;
+ COLOR mCursorColor;
+ int scrollingX;
+ int cursorX; // actual x axis location of the cursor
+ int lastX;
+ int mCursorLocation;
+ int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
+ int mFontY;
+ int textWidth;
+ unsigned mFontHeight;
+ unsigned CursorWidth;
+ bool mRendered;
+ bool HasMask;
+ bool DrawCursor;
+ bool isLocalChange;
+ bool HasAllowed;
+ bool HasDisabled;
+ std::string AllowedList;
+ std::string DisabledList;
+ unsigned MinLen;
+ unsigned MaxLen;
+};
+
+class HardwareKeyboard
+{
+public:
+ HardwareKeyboard();
+ virtual ~HardwareKeyboard();
+
+public:
+ // called by the input handler for key events
+ int KeyDown(int key_code);
+ int KeyUp(int key_code);
+
+ // called by the input handler when holding a key down
+ int KeyRepeat();
+
+ // called by multi-key actions to suppress key-release notifications
+ void ConsumeKeyRelease(int key);
+
+ bool IsKeyDown(int key_code);
+private:
+ int mLastKey;
+ int mLastKeyChar;
+ std::set<int> mPressedKeys;
+};
+
+class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUISliderValue(xml_node<>* node);
+ virtual ~GUISliderValue();
+
+public:
+ // Render - Render the full object to the GL surface
+ // Return 0 on success, <0 on error
+ virtual int Render(void);
+
+ // Update - Update any UI component animations (called <= 30 FPS)
+ // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+ virtual int Update(void);
+
+ // SetPos - Update the position of the render object
+ // Return 0 on success, <0 on error
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+ // NotifyTouch - Notify of a touch event
+ // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+
+ // Notify of a variable change
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+
+ // SetPageFocus - Notify when a page gains or loses focus
+ virtual void SetPageFocus(int inFocus);
+
+protected:
+ int measureText(const std::string& str);
+ int valueFromPct(float pct);
+ float pctFromValue(int value);
+ void loadValue(bool force = false);
+
+ std::string mVariable;
+ int mMax;
+ int mMin;
+ int mValue;
+ char *mValueStr;
+ float mValuePct;
+ std::string mMaxStr;
+ std::string mMinStr;
+ FontResource *mFont;
+ GUIText* mLabel;
+ int mLabelW;
+ COLOR mTextColor;
+ COLOR mLineColor;
+ COLOR mSliderColor;
+ bool mShowRange;
+ bool mShowCurr;
+ int mLineX;
+ int mLineY;
+ int mLineH;
+ int mLinePadding;
+ int mPadding;
+ int mSliderY;
+ int mSliderW;
+ int mSliderH;
+ bool mRendered;
+ int mFontHeight;
+ GUIAction *mAction;
+ bool mChangeOnDrag;
+ int mLineW;
+ bool mDragging;
+ ImageResource *mBackgroundImage;
+ ImageResource *mHandleImage;
+ ImageResource *mHandleHoverImage;
+};
+
+class MouseCursor : public RenderObject
+{
+public:
+ MouseCursor(int posX, int posY);
+ virtual ~MouseCursor();
+
+ virtual int Render(void);
+ virtual int Update(void);
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+ void Move(int deltaX, int deltaY);
+ void GetPos(int& x, int& y);
+ void LoadData(xml_node<>* node);
+ void ResetData(int resX, int resY);
+
+private:
+ int m_resX;
+ int m_resY;
+ bool m_moved;
+ float m_speedMultiplier;
+ COLOR m_color;
+ ImageResource *m_image;
+ bool m_present;
+};
+
+class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
+{
+public:
+ GUIPatternPassword(xml_node<>* node);
+ virtual ~GUIPatternPassword();
+
+public:
+ virtual int Render(void);
+ virtual int Update(void);
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+ virtual int NotifyVarChange(const std::string& varName, const std::string& value);
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+protected:
+ void CalculateDotPositions();
+ void ResetActiveDots();
+ void ConnectDot(int dot_idx);
+ void ConnectIntermediateDots(int dot_idx);
+ void Resize(size_t size);
+ int InDot(int x, int y);
+ bool DotUsed(int dot_idx);
+ std::string GeneratePassphrase();
+ void PatternDrawn();
+
+ struct Dot {
+ int x;
+ int y;
+ bool active;
+ };
+
+ std::string mSizeVar;
+ size_t mGridSize;
+
+ Dot* mDots;
+ int* mConnectedDots;
+ size_t mConnectedDotsLen;
+ int mCurLineX;
+ int mCurLineY;
+ bool mTrackingTouch;
+ bool mNeedRender;
+
+ COLOR mDotColor;
+ COLOR mActiveDotColor;
+ COLOR mLineColor;
+ ImageResource *mDotImage;
+ ImageResource *mActiveDotImage;
+ gr_surface mDotCircle;
+ gr_surface mActiveDotCircle;
+ int mDotRadius;
+ int mLineWidth;
+
+ std::string mPassVar;
+ GUIAction *mAction;
+ int mUpdate;
+};
+
+
+// Helper APIs
+xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
+std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
+int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
+int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
+int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
+COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
+COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
+FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
+ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
+AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
+bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
+
+#endif // _OBJECTS_HEADER
diff --git a/gui/pages.cpp b/gui/pages.cpp
new file mode 100644
index 000000000..bf6c6921c
--- /dev/null
+++ b/gui/pages.cpp
@@ -0,0 +1,1697 @@
+/*
+ Copyright 2013 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// pages.cpp - Source to manage GUI base objects
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include "../twrp-functions.hpp"
+#include "../partitions.hpp"
+
+#include <string>
+#include <algorithm>
+
+extern "C" {
+#include "../twcommon.h"
+#include "../minzip/SysUtil.h"
+#include "../minzip/Zip.h"
+#include "gui.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "blanktimer.hpp"
+
+// version 2 requires theme to handle power button as action togglebacklight
+#define TW_THEME_VERSION 2
+
+#define TW_THEME_VER_ERR -2
+
+extern int gGuiRunning;
+
+std::map<std::string, PageSet*> PageManager::mPageSets;
+PageSet* PageManager::mCurrentSet;
+MouseCursor *PageManager::mMouseCursor = NULL;
+HardwareKeyboard *PageManager::mHardwareKeyboard = NULL;
+bool PageManager::mReloadTheme = false;
+std::string PageManager::mStartPage = "main";
+std::vector<language_struct> Language_List;
+
+int tw_x_offset = 0;
+int tw_y_offset = 0;
+int tw_w_offset = 0;
+int tw_h_offset = 0;
+
+// Helper routine to convert a string to a color declaration
+int ConvertStrToColor(std::string str, COLOR* color)
+{
+ // Set the default, solid black
+ memset(color, 0, sizeof(COLOR));
+ color->alpha = 255;
+
+ // Translate variables
+ DataManager::GetValue(str, str);
+
+ // Look for some defaults
+ if (str == "black") return 0;
+ else if (str == "white") { color->red = color->green = color->blue = 255; return 0; }
+ else if (str == "red") { color->red = 255; return 0; }
+ else if (str == "green") { color->green = 255; return 0; }
+ else if (str == "blue") { color->blue = 255; return 0; }
+
+ // At this point, we require an RGB(A) color
+ if (str[0] != '#')
+ return -1;
+
+ str.erase(0, 1);
+
+ int result;
+ if (str.size() >= 8) {
+ // We have alpha channel
+ string alpha = str.substr(6, 2);
+ result = strtol(alpha.c_str(), NULL, 16);
+ color->alpha = result & 0x000000FF;
+ str.resize(6);
+ result = strtol(str.c_str(), NULL, 16);
+ color->red = (result >> 16) & 0x000000FF;
+ color->green = (result >> 8) & 0x000000FF;
+ color->blue = result & 0x000000FF;
+ } else {
+ result = strtol(str.c_str(), NULL, 16);
+ color->red = (result >> 16) & 0x000000FF;
+ color->green = (result >> 8) & 0x000000FF;
+ color->blue = result & 0x000000FF;
+ }
+ return 0;
+}
+
+// Helper APIs
+xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth /* = 0 */)
+{
+ if (!parent)
+ return NULL;
+
+ xml_node<>* child = parent->first_node(nodename);
+ if (child)
+ return child;
+
+ if (depth == 10) {
+ LOGERR("Too many style loops detected.\n");
+ return NULL;
+ }
+
+ xml_node<>* style = parent->first_node("style");
+ if (style) {
+ while (style) {
+ if (!style->first_attribute("name")) {
+ LOGERR("No name given for style.\n");
+ continue;
+ } else {
+ std::string name = style->first_attribute("name")->value();
+ xml_node<>* node = PageManager::FindStyle(name);
+
+ if (node) {
+ // We found the style that was named
+ xml_node<>* stylenode = FindNode(node, nodename, depth + 1);
+ if (stylenode)
+ return stylenode;
+ }
+ }
+ style = style->next_sibling("style");
+ }
+ } else {
+ // Search for stylename in the parent node <object type="foo" style="foo2">
+ xml_attribute<>* attr = parent->first_attribute("style");
+ // If no style is found anywhere else and the node wasn't found in the object itself
+ // as a special case we will search for a style that uses the same style name as the
+ // object type, so <object type="button"> would search for a style named "button"
+ if (!attr)
+ attr = parent->first_attribute("type");
+ // if there's no attribute type, the object type must be the element name
+ std::string stylename = attr ? attr->value() : parent->name();
+ xml_node<>* node = PageManager::FindStyle(stylename);
+ if (node) {
+ xml_node<>* stylenode = FindNode(node, nodename, depth + 1);
+ if (stylenode)
+ return stylenode;
+ }
+ }
+ return NULL;
+}
+
+std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue)
+{
+ if (!element)
+ return defaultvalue;
+
+ xml_attribute<>* attr = element->first_attribute(attrname);
+ return attr ? attr->value() : defaultvalue;
+}
+
+int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue)
+{
+ string value = LoadAttrString(element, attrname);
+ // resolve variables
+ DataManager::GetValue(value, value);
+ return value.empty() ? defaultvalue : atoi(value.c_str());
+}
+
+int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue)
+{
+ return scale_theme_x(LoadAttrInt(element, attrname, defaultvalue));
+}
+
+int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue)
+{
+ return scale_theme_y(LoadAttrInt(element, attrname, defaultvalue));
+}
+
+COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue)
+{
+ string value = LoadAttrString(element, attrname);
+ *found_color = !value.empty();
+ // resolve variables
+ DataManager::GetValue(value, value);
+ COLOR ret = defaultvalue;
+ if (ConvertStrToColor(value, &ret) == 0)
+ return ret;
+ else
+ return defaultvalue;
+}
+
+COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue)
+{
+ bool found_color = false;
+ return LoadAttrColor(element, attrname, &found_color, defaultvalue);
+}
+
+FontResource* LoadAttrFont(xml_node<>* element, const char* attrname)
+{
+ std::string name = LoadAttrString(element, attrname, "");
+ if (name.empty())
+ return NULL;
+ else
+ return PageManager::GetResources()->FindFont(name);
+}
+
+ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname)
+{
+ std::string name = LoadAttrString(element, attrname, "");
+ if (name.empty())
+ return NULL;
+ else
+ return PageManager::GetResources()->FindImage(name);
+}
+
+AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname)
+{
+ std::string name = LoadAttrString(element, attrname, "");
+ if (name.empty())
+ return NULL;
+ else
+ return PageManager::GetResources()->FindAnimation(name);
+}
+
+bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h /* = NULL */, Placement* placement /* = NULL */)
+{
+ if (!node)
+ return false;
+
+ if (node->first_attribute("x"))
+ *x = LoadAttrIntScaleX(node, "x") + tw_x_offset;
+
+ if (node->first_attribute("y"))
+ *y = LoadAttrIntScaleY(node, "y") + tw_y_offset;
+
+ if (w && node->first_attribute("w"))
+ *w = LoadAttrIntScaleX(node, "w");
+
+ if (h && node->first_attribute("h"))
+ *h = LoadAttrIntScaleY(node, "h");
+
+ if (placement && node->first_attribute("placement"))
+ *placement = (Placement) LoadAttrInt(node, "placement");
+
+ return true;
+}
+
+int ActionObject::SetActionPos(int x, int y, int w, int h)
+{
+ if (x < 0 || y < 0)
+ return -1;
+
+ mActionX = x;
+ mActionY = y;
+ if (w || h)
+ {
+ mActionW = w;
+ mActionH = h;
+ }
+ return 0;
+}
+
+Page::Page(xml_node<>* page, std::vector<xml_node<>*> *templates)
+{
+ mTouchStart = NULL;
+
+ // We can memset the whole structure, because the alpha channel is ignored
+ memset(&mBackground, 0, sizeof(COLOR));
+
+ // With NULL, we make a console-only display
+ if (!page)
+ {
+ mName = "console";
+
+ GUIConsole* element = new GUIConsole(NULL);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ return;
+ }
+
+ if (page->first_attribute("name"))
+ mName = page->first_attribute("name")->value();
+ else
+ {
+ LOGERR("No page name attribute found!\n");
+ return;
+ }
+
+ LOGINFO("Loading page %s\n", mName.c_str());
+
+ // This is a recursive routine for template handling
+ ProcessNode(page, templates, 0);
+}
+
+Page::~Page()
+{
+ for (std::vector<GUIObject*>::iterator itr = mObjects.begin(); itr != mObjects.end(); ++itr)
+ delete *itr;
+}
+
+bool Page::ProcessNode(xml_node<>* page, std::vector<xml_node<>*> *templates, int depth)
+{
+ if (depth == 10)
+ {
+ LOGERR("Page processing depth has exceeded 10. Failing out. This is likely a recursive template.\n");
+ return false;
+ }
+
+ for (xml_node<>* child = page->first_node(); child; child = child->next_sibling())
+ {
+ std::string type = child->name();
+
+ if (type == "background") {
+ mBackground = LoadAttrColor(child, "color", COLOR(0,0,0,0));
+ continue;
+ }
+
+ if (type == "object") {
+ // legacy format : <object type="...">
+ xml_attribute<>* attr = child->first_attribute("type");
+ type = attr ? attr->value() : "*unspecified*";
+ }
+
+ if (type == "text")
+ {
+ GUIText* element = new GUIText(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "image")
+ {
+ GUIImage* element = new GUIImage(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ }
+ else if (type == "fill")
+ {
+ GUIFill* element = new GUIFill(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ }
+ else if (type == "action")
+ {
+ GUIAction* element = new GUIAction(child);
+ mObjects.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "console")
+ {
+ GUIConsole* element = new GUIConsole(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "terminal")
+ {
+ GUITerminal* element = new GUITerminal(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ mInputs.push_back(element);
+ }
+ else if (type == "button")
+ {
+ GUIButton* element = new GUIButton(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "checkbox")
+ {
+ GUICheckbox* element = new GUICheckbox(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "fileselector")
+ {
+ GUIFileSelector* element = new GUIFileSelector(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "animation")
+ {
+ GUIAnimation* element = new GUIAnimation(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ }
+ else if (type == "progressbar")
+ {
+ GUIProgressBar* element = new GUIProgressBar(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "slider")
+ {
+ GUISlider* element = new GUISlider(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "slidervalue")
+ {
+ GUISliderValue *element = new GUISliderValue(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "listbox")
+ {
+ GUIListBox* element = new GUIListBox(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "keyboard")
+ {
+ GUIKeyboard* element = new GUIKeyboard(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "input")
+ {
+ GUIInput* element = new GUIInput(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ mInputs.push_back(element);
+ }
+ else if (type == "partitionlist")
+ {
+ GUIPartitionList* element = new GUIPartitionList(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "patternpassword")
+ {
+ GUIPatternPassword* element = new GUIPatternPassword(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "textbox")
+ {
+ GUITextBox* element = new GUITextBox(child);
+ mObjects.push_back(element);
+ mRenders.push_back(element);
+ mActions.push_back(element);
+ }
+ else if (type == "template")
+ {
+ if (!templates || !child->first_attribute("name"))
+ {
+ LOGERR("Invalid template request.\n");
+ }
+ else
+ {
+ std::string name = child->first_attribute("name")->value();
+ xml_node<>* node;
+ bool node_found = false;
+
+ // We need to find the correct template
+ for (std::vector<xml_node<>*>::iterator itr = templates->begin(); itr != templates->end(); itr++) {
+ node = (*itr)->first_node("template");
+
+ while (node)
+ {
+ if (!node->first_attribute("name"))
+ continue;
+
+ if (name == node->first_attribute("name")->value())
+ {
+ if (!ProcessNode(node, templates, depth + 1))
+ return false;
+ else {
+ node_found = true;
+ break;
+ }
+ }
+ if (node_found)
+ break;
+ node = node->next_sibling("template");
+ }
+ // [check] why is there no if (node_found) here too?
+ }
+ }
+ }
+ else
+ {
+ LOGERR("Unknown object type: %s.\n", type.c_str());
+ }
+ }
+ return true;
+}
+
+int Page::Render(void)
+{
+ // Render background
+ gr_color(mBackground.red, mBackground.green, mBackground.blue, mBackground.alpha);
+ gr_fill(0, 0, gr_fb_width(), gr_fb_height());
+
+ // Render remaining objects
+ std::vector<RenderObject*>::iterator iter;
+ for (iter = mRenders.begin(); iter != mRenders.end(); iter++)
+ {
+ if ((*iter)->Render())
+ LOGERR("A render request has failed.\n");
+ }
+ return 0;
+}
+
+int Page::Update(void)
+{
+ int retCode = 0;
+
+ std::vector<RenderObject*>::iterator iter;
+ for (iter = mRenders.begin(); iter != mRenders.end(); iter++)
+ {
+ int ret = (*iter)->Update();
+ if (ret < 0)
+ LOGERR("An update request has failed.\n");
+ else if (ret > retCode)
+ retCode = ret;
+ }
+
+ return retCode;
+}
+
+int Page::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ // By default, return 1 to ignore further touches if nobody is listening
+ int ret = 1;
+
+ // Don't try to handle a lack of handlers
+ if (mActions.size() == 0)
+ return ret;
+
+ // We record mTouchStart so we can pass all the touch stream to the same handler
+ if (state == TOUCH_START)
+ {
+ std::vector<ActionObject*>::reverse_iterator iter;
+ // We work backwards, from top-most element to bottom-most element
+ for (iter = mActions.rbegin(); iter != mActions.rend(); iter++)
+ {
+ if ((*iter)->IsInRegion(x, y))
+ {
+ mTouchStart = (*iter);
+ ret = mTouchStart->NotifyTouch(state, x, y);
+ if (ret >= 0)
+ break;
+ mTouchStart = NULL;
+ }
+ }
+ }
+ else if (state == TOUCH_RELEASE && mTouchStart != NULL)
+ {
+ ret = mTouchStart->NotifyTouch(state, x, y);
+ mTouchStart = NULL;
+ }
+ else if ((state == TOUCH_DRAG || state == TOUCH_HOLD || state == TOUCH_REPEAT) && mTouchStart != NULL)
+ {
+ ret = mTouchStart->NotifyTouch(state, x, y);
+ }
+ return ret;
+}
+
+int Page::NotifyKey(int key, bool down)
+{
+ std::vector<ActionObject*>::reverse_iterator iter;
+
+ int ret = 1;
+ // We work backwards, from top-most element to bottom-most element
+ for (iter = mActions.rbegin(); iter != mActions.rend(); iter++)
+ {
+ ret = (*iter)->NotifyKey(key, down);
+ if (ret == 0)
+ return 0;
+ if (ret < 0) {
+ LOGERR("An action handler has returned an error\n");
+ ret = 1;
+ }
+ }
+ return ret;
+}
+
+int Page::NotifyCharInput(int ch)
+{
+ std::vector<InputObject*>::reverse_iterator iter;
+
+ // We work backwards, from top-most element to bottom-most element
+ for (iter = mInputs.rbegin(); iter != mInputs.rend(); iter++)
+ {
+ int ret = (*iter)->NotifyCharInput(ch);
+ if (ret == 0)
+ return 0;
+ else if (ret < 0)
+ LOGERR("A char input handler has returned an error\n");
+ }
+ return 1;
+}
+
+int Page::SetKeyBoardFocus(int inFocus)
+{
+ std::vector<InputObject*>::reverse_iterator iter;
+
+ // We work backwards, from top-most element to bottom-most element
+ for (iter = mInputs.rbegin(); iter != mInputs.rend(); iter++)
+ {
+ int ret = (*iter)->SetInputFocus(inFocus);
+ if (ret == 0)
+ return 0;
+ else if (ret < 0)
+ LOGERR("An input focus handler has returned an error\n");
+ }
+ return 1;
+}
+
+void Page::SetPageFocus(int inFocus)
+{
+ // Render remaining objects
+ std::vector<RenderObject*>::iterator iter;
+ for (iter = mRenders.begin(); iter != mRenders.end(); iter++)
+ (*iter)->SetPageFocus(inFocus);
+
+ return;
+}
+
+int Page::NotifyVarChange(std::string varName, std::string value)
+{
+ std::vector<GUIObject*>::iterator iter;
+ for (iter = mObjects.begin(); iter != mObjects.end(); ++iter)
+ {
+ if ((*iter)->NotifyVarChange(varName, value))
+ LOGERR("An action handler errored on NotifyVarChange.\n");
+ }
+ return 0;
+}
+
+
+// transient data for loading themes
+struct LoadingContext
+{
+ ZipArchive* zip; // zip to load theme from, or NULL for the stock theme
+ std::set<std::string> filenames; // to detect cyclic includes
+ std::string basepath; // if zip is NULL, base path to load includes from with trailing slash, otherwise empty
+ std::vector<xml_document<>*> xmldocs; // all loaded xml docs
+ std::vector<char*> xmlbuffers; // text buffers with xml content
+ std::vector<xml_node<>*> styles; // refer to <styles> nodes inside xmldocs
+ std::vector<xml_node<>*> templates; // refer to <templates> nodes inside xmldocs
+
+ LoadingContext()
+ {
+ zip = NULL;
+ }
+
+ ~LoadingContext()
+ {
+ // free all xml buffers
+ for (std::vector<char*>::iterator it = xmlbuffers.begin(); it != xmlbuffers.end(); ++it)
+ free(*it);
+ }
+
+};
+
+// for FindStyle
+LoadingContext* PageManager::currentLoadingContext = NULL;
+
+
+PageSet::PageSet()
+{
+ mResources = new ResourceManager;
+ mCurrentPage = NULL;
+
+ set_scale_values(1, 1); // Reset any previous scaling values
+}
+
+PageSet::~PageSet()
+{
+ mOverlays.clear();
+ for (std::vector<Page*>::iterator itr = mPages.begin(); itr != mPages.end(); ++itr)
+ delete *itr;
+
+ delete mResources;
+}
+
+int PageSet::Load(LoadingContext& ctx, const std::string& filename)
+{
+ bool isMain = ctx.xmlbuffers.empty(); // if we have no files yet, remember that this is the main XML file
+
+ if (!ctx.filenames.insert(filename).second)
+ // ignore already loaded files to prevent crash with cyclic includes
+ return 0;
+
+ // load XML into buffer
+ char* xmlbuffer = PageManager::LoadFileToBuffer(filename, ctx.zip);
+ if (!xmlbuffer)
+ return -1; // error already displayed by LoadFileToBuffer
+ ctx.xmlbuffers.push_back(xmlbuffer);
+
+ // parse XML
+ xml_document<>* doc = new xml_document<>();
+ doc->parse<0>(xmlbuffer);
+ ctx.xmldocs.push_back(doc);
+
+ xml_node<>* root = doc->first_node("recovery");
+ if (!root)
+ root = doc->first_node("install");
+ if (!root) {
+ LOGERR("Unknown root element in %s\n", filename.c_str());
+ return -1;
+ }
+
+ if (isMain) {
+ int rc = LoadDetails(ctx, root);
+ if (rc != 0)
+ return rc;
+ }
+
+ LOGINFO("Loading resources...\n");
+ xml_node<>* child = root->first_node("resources");
+ if (child)
+ mResources->LoadResources(child, ctx.zip, "theme");
+
+ LOGINFO("Loading variables...\n");
+ child = root->first_node("variables");
+ if (child)
+ LoadVariables(child);
+
+ LOGINFO("Loading mouse cursor...\n");
+ child = root->first_node("mousecursor");
+ if (child)
+ PageManager::LoadCursorData(child);
+
+ LOGINFO("Loading pages...\n");
+ child = root->first_node("templates");
+ if (child)
+ ctx.templates.push_back(child);
+
+ child = root->first_node("styles");
+ if (child)
+ ctx.styles.push_back(child);
+
+ // Load pages
+ child = root->first_node("pages");
+ if (child) {
+ if (LoadPages(ctx, child)) {
+ LOGERR("PageSet::Load returning -1\n");
+ return -1;
+ }
+ }
+
+ // process includes recursively
+ child = root->first_node("include");
+ if (child) {
+ xml_node<>* include = child->first_node("xmlfile");
+ while (include != NULL) {
+ xml_attribute<>* attr = include->first_attribute("name");
+ if (!attr) {
+ LOGERR("Skipping include/xmlfile with no name\n");
+ continue;
+ }
+
+ string filename = ctx.basepath + attr->value();
+ LOGINFO("Including file: %s...\n", filename.c_str());
+ int rc = Load(ctx, filename);
+ if (rc != 0)
+ return rc;
+
+ include = include->next_sibling("xmlfile");
+ }
+ }
+
+ return 0;
+}
+
+void PageSet::MakeEmergencyConsoleIfNeeded()
+{
+ if (mPages.empty()) {
+ mCurrentPage = new Page(NULL, NULL); // fallback console page
+ // TODO: since removal of non-TTF fonts, the emergency console doesn't work without a font, which might be missing too
+ mPages.push_back(mCurrentPage);
+ }
+}
+
+int PageSet::LoadLanguage(char* languageFile, ZipArchive* package)
+{
+ xml_document<> lang;
+ xml_node<>* parent;
+ xml_node<>* child;
+ std::string resource_source;
+ int ret = 0;
+
+ if (languageFile) {
+ printf("parsing languageFile\n");
+ lang.parse<0>(languageFile);
+ printf("parsing languageFile done\n");
+ } else {
+ return -1;
+ }
+
+ parent = lang.first_node("language");
+ if (!parent) {
+ LOGERR("Unable to locate language node in language file.\n");
+ lang.clear();
+ return -1;
+ }
+
+ child = parent->first_node("display");
+ if (child) {
+ DataManager::SetValue("tw_language_display", child->value());
+ resource_source = child->value();
+ } else {
+ LOGERR("language file does not have a display value set\n");
+ DataManager::SetValue("tw_language_display", "Not Set");
+ resource_source = languageFile;
+ }
+
+ child = parent->first_node("resources");
+ if (child)
+ mResources->LoadResources(child, package, resource_source);
+ else
+ ret = -1;
+ DataManager::SetValue("tw_backup_name", gui_lookup("auto_generate", "(Auto Generate)"));
+ lang.clear();
+ return ret;
+}
+
+int PageSet::LoadDetails(LoadingContext& ctx, xml_node<>* root)
+{
+ xml_node<>* child = root->first_node("details");
+ if (child) {
+ int theme_ver = 0;
+ xml_node<>* themeversion = child->first_node("themeversion");
+ if (themeversion && themeversion->value()) {
+ theme_ver = atoi(themeversion->value());
+ } else {
+ LOGINFO("No themeversion in theme.\n");
+ }
+ if (theme_ver != TW_THEME_VERSION) {
+ LOGINFO("theme version from xml: %i, expected %i\n", theme_ver, TW_THEME_VERSION);
+ if (ctx.zip) {
+ gui_err("theme_ver_err=Custom theme version does not match TWRP version. Using stock theme.");
+ return TW_THEME_VER_ERR;
+ } else {
+ gui_print_color("warning", "Stock theme version does not match TWRP version.\n");
+ }
+ }
+ xml_node<>* resolution = child->first_node("resolution");
+ if (resolution) {
+ LOGINFO("Checking resolution...\n");
+ xml_attribute<>* width_attr = resolution->first_attribute("width");
+ xml_attribute<>* height_attr = resolution->first_attribute("height");
+ xml_attribute<>* noscale_attr = resolution->first_attribute("noscaling");
+ if (width_attr && height_attr && !noscale_attr) {
+ int width = atoi(width_attr->value());
+ int height = atoi(height_attr->value());
+ int offx = 0, offy = 0;
+#ifdef TW_ROUND_SCREEN
+ xml_node<>* roundscreen = child->first_node("roundscreen");
+ if (roundscreen) {
+ LOGINFO("TW_ROUND_SCREEN := true, using round screen XML settings.\n");
+ xml_attribute<>* offx_attr = roundscreen->first_attribute("offset_x");
+ xml_attribute<>* offy_attr = roundscreen->first_attribute("offset_y");
+ if (offx_attr) {
+ offx = atoi(offx_attr->value());
+ }
+ if (offy_attr) {
+ offy = atoi(offy_attr->value());
+ }
+ }
+#endif
+ if (width != 0 && height != 0) {
+ float scale_w = (((float)gr_fb_width() + (float)tw_w_offset) - ((float)offx * 2.0)) / (float)width;
+ float scale_h = (((float)gr_fb_height() + (float)tw_h_offset) - ((float)offy * 2.0)) / (float)height;
+#ifdef TW_ROUND_SCREEN
+ float scale_off_w = ((float)gr_fb_width() + (float)tw_w_offset) / (float)width;
+ float scale_off_h = ((float)gr_fb_height() + (float)tw_h_offset) / (float)height;
+ tw_x_offset = offx * scale_off_w;
+ tw_y_offset = offy * scale_off_h;
+#endif
+ if (scale_w != 1 || scale_h != 1) {
+ LOGINFO("Scaling theme width %fx and height %fx, offsets x: %i y: %i w: %i h: %i\n",
+ scale_w, scale_h, tw_x_offset, tw_y_offset, tw_w_offset, tw_h_offset);
+ set_scale_values(scale_w, scale_h);
+ }
+ }
+ } else {
+ LOGINFO("XML does not contain width and height, no scaling will be applied\n");
+ }
+ } else {
+ LOGINFO("XML contains no resolution tag, no scaling will be applied.\n");
+ }
+ } else {
+ LOGINFO("XML contains no details tag, no scaling will be applied.\n");
+ }
+
+ return 0;
+}
+
+int PageSet::SetPage(std::string page)
+{
+ Page* tmp = FindPage(page);
+ if (tmp)
+ {
+ if (mCurrentPage) mCurrentPage->SetPageFocus(0);
+ mCurrentPage = tmp;
+ mCurrentPage->SetPageFocus(1);
+ mCurrentPage->NotifyVarChange("", "");
+ return 0;
+ }
+ else
+ {
+ LOGERR("Unable to locate page (%s)\n", page.c_str());
+ }
+ return -1;
+}
+
+int PageSet::SetOverlay(Page* page)
+{
+ if (page) {
+ if (mOverlays.size() >= 10) {
+ LOGERR("Too many overlays requested, max is 10.\n");
+ return -1;
+ }
+
+ std::vector<Page*>::iterator iter;
+ for (iter = mOverlays.begin(); iter != mOverlays.end(); iter++) {
+ if ((*iter)->GetName() == page->GetName()) {
+ mOverlays.erase(iter);
+ // SetOverlay() is (and should stay) the only function which
+ // adds to mOverlays. Then, each page can appear at most once.
+ break;
+ }
+ }
+
+ page->SetPageFocus(1);
+ page->NotifyVarChange("", "");
+
+ if (!mOverlays.empty())
+ mOverlays.back()->SetPageFocus(0);
+
+ mOverlays.push_back(page);
+ } else {
+ if (!mOverlays.empty()) {
+ mOverlays.back()->SetPageFocus(0);
+ mOverlays.pop_back();
+ if (!mOverlays.empty())
+ mOverlays.back()->SetPageFocus(1);
+ else if (mCurrentPage)
+ mCurrentPage->SetPageFocus(1); // Just in case somehow the regular page lost focus, we'll set it again
+ }
+ }
+ return 0;
+}
+
+const ResourceManager* PageSet::GetResources()
+{
+ return mResources;
+}
+
+Page* PageSet::FindPage(std::string name)
+{
+ std::vector<Page*>::iterator iter;
+
+ for (iter = mPages.begin(); iter != mPages.end(); iter++)
+ {
+ if (name == (*iter)->GetName())
+ return (*iter);
+ }
+ return NULL;
+}
+
+int PageSet::LoadVariables(xml_node<>* vars)
+{
+ xml_node<>* child;
+ xml_attribute<> *name, *value, *persist;
+ int p;
+
+ child = vars->first_node("variable");
+ while (child)
+ {
+ name = child->first_attribute("name");
+ value = child->first_attribute("value");
+ persist = child->first_attribute("persist");
+ if (name && value)
+ {
+ if (strcmp(name->value(), "tw_x_offset") == 0) {
+ tw_x_offset = atoi(value->value());
+ child = child->next_sibling("variable");
+ continue;
+ }
+ if (strcmp(name->value(), "tw_y_offset") == 0) {
+ tw_y_offset = atoi(value->value());
+ child = child->next_sibling("variable");
+ continue;
+ }
+ if (strcmp(name->value(), "tw_w_offset") == 0) {
+ tw_w_offset = atoi(value->value());
+ child = child->next_sibling("variable");
+ continue;
+ }
+ if (strcmp(name->value(), "tw_h_offset") == 0) {
+ tw_h_offset = atoi(value->value());
+ child = child->next_sibling("variable");
+ continue;
+ }
+ p = persist ? atoi(persist->value()) : 0;
+ string temp = value->value();
+ string valstr = gui_parse_text(temp);
+
+ if (valstr.find("+") != string::npos) {
+ string val1str = valstr;
+ val1str = val1str.substr(0, val1str.find('+'));
+ string val2str = valstr;
+ val2str = val2str.substr(val2str.find('+') + 1, string::npos);
+ int val1 = atoi(val1str.c_str());
+ int val2 = atoi(val2str.c_str());
+ int val = val1 + val2;
+
+ DataManager::SetValue(name->value(), val, p);
+ } else if (valstr.find("-") != string::npos) {
+ string val1str = valstr;
+ val1str = val1str.substr(0, val1str.find('-'));
+ string val2str = valstr;
+ val2str = val2str.substr(val2str.find('-') + 1, string::npos);
+ int val1 = atoi(val1str.c_str());
+ int val2 = atoi(val2str.c_str());
+ int val = val1 - val2;
+
+ DataManager::SetValue(name->value(), val, p);
+ } else {
+ DataManager::SetValue(name->value(), valstr, p);
+ }
+ }
+
+ child = child->next_sibling("variable");
+ }
+ return 0;
+}
+
+int PageSet::LoadPages(LoadingContext& ctx, xml_node<>* pages)
+{
+ xml_node<>* child;
+
+ if (!pages)
+ return -1;
+
+ child = pages->first_node("page");
+ while (child != NULL)
+ {
+ Page* page = new Page(child, &ctx.templates);
+ if (page->GetName().empty())
+ {
+ LOGERR("Unable to process load page\n");
+ delete page;
+ }
+ else
+ {
+ mPages.push_back(page);
+ }
+ child = child->next_sibling("page");
+ }
+ if (mPages.size() > 0)
+ return 0;
+ return -1;
+}
+
+int PageSet::IsCurrentPage(Page* page)
+{
+ return ((mCurrentPage && mCurrentPage == page) ? 1 : 0);
+}
+
+std::string PageSet::GetCurrentPage() const
+{
+ return mCurrentPage ? mCurrentPage->GetName() : "";
+}
+
+int PageSet::Render(void)
+{
+ int ret;
+
+ ret = (mCurrentPage ? mCurrentPage->Render() : -1);
+ if (ret < 0)
+ return ret;
+
+ std::vector<Page*>::iterator iter;
+
+ for (iter = mOverlays.begin(); iter != mOverlays.end(); iter++) {
+ ret = ((*iter) ? (*iter)->Render() : -1);
+ if (ret < 0)
+ return ret;
+ }
+ return ret;
+}
+
+int PageSet::Update(void)
+{
+ int ret;
+
+ ret = (mCurrentPage ? mCurrentPage->Update() : -1);
+ if (ret < 0 || ret > 1)
+ return ret;
+
+ std::vector<Page*>::iterator iter;
+
+ for (iter = mOverlays.begin(); iter != mOverlays.end(); iter++) {
+ ret = ((*iter) ? (*iter)->Update() : -1);
+ if (ret < 0)
+ return ret;
+ }
+ return ret;
+}
+
+int PageSet::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!mOverlays.empty())
+ return mOverlays.back()->NotifyTouch(state, x, y);
+
+ return (mCurrentPage ? mCurrentPage->NotifyTouch(state, x, y) : -1);
+}
+
+int PageSet::NotifyKey(int key, bool down)
+{
+ if (!mOverlays.empty())
+ return mOverlays.back()->NotifyKey(key, down);
+
+ return (mCurrentPage ? mCurrentPage->NotifyKey(key, down) : -1);
+}
+
+int PageSet::NotifyCharInput(int ch)
+{
+ if (!mOverlays.empty())
+ return mOverlays.back()->NotifyCharInput(ch);
+
+ return (mCurrentPage ? mCurrentPage->NotifyCharInput(ch) : -1);
+}
+
+int PageSet::SetKeyBoardFocus(int inFocus)
+{
+ if (!mOverlays.empty())
+ return mOverlays.back()->SetKeyBoardFocus(inFocus);
+
+ return (mCurrentPage ? mCurrentPage->SetKeyBoardFocus(inFocus) : -1);
+}
+
+int PageSet::NotifyVarChange(std::string varName, std::string value)
+{
+ std::vector<Page*>::iterator iter;
+
+ for (iter = mOverlays.begin(); iter != mOverlays.end(); iter++)
+ (*iter)->NotifyVarChange(varName, value);
+
+ return (mCurrentPage ? mCurrentPage->NotifyVarChange(varName, value) : -1);
+}
+
+void PageSet::AddStringResource(std::string resource_source, std::string resource_name, std::string value)
+{
+ mResources->AddStringResource(resource_source, resource_name, value);
+}
+
+char* PageManager::LoadFileToBuffer(std::string filename, ZipArchive* package) {
+ size_t len;
+ char* buffer = NULL;
+
+ if (!package) {
+ // We can try to load the XML directly...
+ LOGINFO("PageManager::LoadFileToBuffer loading filename: '%s' directly\n", filename.c_str());
+ struct stat st;
+ if (stat(filename.c_str(),&st) != 0) {
+ // This isn't always an error, sometimes we request files that don't exist.
+ return NULL;
+ }
+
+ len = (size_t)st.st_size;
+
+ buffer = (char*) malloc(len + 1);
+ if (!buffer) {
+ LOGERR("PageManager::LoadFileToBuffer failed to malloc\n");
+ return NULL;
+ }
+
+ int fd = open(filename.c_str(), O_RDONLY);
+ if (fd == -1) {
+ LOGERR("PageManager::LoadFileToBuffer failed to open '%s' - (%s)\n", filename.c_str(), strerror(errno));
+ free(buffer);
+ return NULL;
+ }
+
+ if (read(fd, buffer, len) < 0) {
+ LOGERR("PageManager::LoadFileToBuffer failed to read '%s' - (%s)\n", filename.c_str(), strerror(errno));
+ free(buffer);
+ close(fd);
+ return NULL;
+ }
+ close(fd);
+ } else {
+ LOGINFO("PageManager::LoadFileToBuffer loading filename: '%s' from zip\n", filename.c_str());
+ const ZipEntry* zipentry = mzFindZipEntry(package, filename.c_str());
+ if (zipentry == NULL) {
+ LOGERR("Unable to locate '%s' in zip file\n", filename.c_str());
+ return NULL;
+ }
+
+ // Allocate the buffer for the file
+ len = mzGetZipEntryUncompLen(zipentry);
+ buffer = (char*) malloc(len + 1);
+ if (!buffer)
+ return NULL;
+
+ if (!mzExtractZipEntryToBuffer(package, zipentry, (unsigned char*) buffer)) {
+ LOGERR("Unable to extract '%s'\n", filename.c_str());
+ free(buffer);
+ return NULL;
+ }
+ }
+ // NULL-terminate the string
+ buffer[len] = 0x00;
+ return buffer;
+}
+
+void PageManager::LoadLanguageListDir(string dir) {
+ if (!TWFunc::Path_Exists(dir)) {
+ LOGERR("LoadLanguageListDir '%s' path not found\n", dir.c_str());
+ return;
+ }
+
+ DIR *d = opendir(dir.c_str());
+ struct dirent *p;
+
+ if (d == NULL) {
+ LOGERR("LoadLanguageListDir error opening dir: '%s', %s\n", dir.c_str(), strerror(errno));
+ return;
+ }
+
+ while ((p = readdir(d))) {
+ if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, "..") || strlen(p->d_name) < 5)
+ continue;
+
+ string file = p->d_name;
+ if (file.substr(strlen(p->d_name) - 4) != ".xml")
+ continue;
+ string path = dir + p->d_name;
+ string file_no_extn = file.substr(0, strlen(p->d_name) - 4);
+ struct language_struct language_entry;
+ language_entry.filename = file_no_extn;
+ char* xmlFile = PageManager::LoadFileToBuffer(dir + p->d_name, NULL);
+ if (xmlFile == NULL) {
+ LOGERR("LoadLanguageListDir unable to load '%s'\n", language_entry.filename.c_str());
+ continue;
+ }
+ xml_document<> *doc = new xml_document<>();
+ doc->parse<0>(xmlFile);
+
+ xml_node<>* parent = doc->first_node("language");
+ if (!parent) {
+ LOGERR("Invalid language XML file '%s'\n", language_entry.filename.c_str());
+ } else {
+ xml_node<>* child = parent->first_node("display");
+ if (child) {
+ language_entry.displayvalue = child->value();
+ } else {
+ LOGERR("No display value for '%s'\n", language_entry.filename.c_str());
+ language_entry.displayvalue = language_entry.filename;
+ }
+ Language_List.push_back(language_entry);
+ }
+ doc->clear();
+ delete doc;
+ free(xmlFile);
+ }
+ closedir(d);
+}
+
+void PageManager::LoadLanguageList(ZipArchive* package) {
+ Language_List.clear();
+ if (TWFunc::Path_Exists(TWRES "customlanguages"))
+ TWFunc::removeDir(TWRES "customlanguages", true);
+ if (package) {
+ TWFunc::Recursive_Mkdir(TWRES "customlanguages");
+ struct utimbuf timestamp = { 1217592000, 1217592000 }; // 8/1/2008 default
+ mzExtractRecursive(package, "languages", TWRES "customlanguages/", &timestamp, NULL, NULL, NULL);
+ LoadLanguageListDir(TWRES "customlanguages/");
+ } else {
+ LoadLanguageListDir(TWRES "languages/");
+ }
+
+ std::sort(Language_List.begin(), Language_List.end());
+}
+
+void PageManager::LoadLanguage(string filename) {
+ string actual_filename;
+ if (TWFunc::Path_Exists(TWRES "customlanguages/" + filename + ".xml"))
+ actual_filename = TWRES "customlanguages/" + filename + ".xml";
+ else
+ actual_filename = TWRES "languages/" + filename + ".xml";
+ char* xmlFile = PageManager::LoadFileToBuffer(actual_filename, NULL);
+ if (xmlFile == NULL)
+ LOGERR("Unable to load '%s'\n", actual_filename.c_str());
+ else {
+ mCurrentSet->LoadLanguage(xmlFile, NULL);
+ free(xmlFile);
+ }
+ PartitionManager.Translate_Partition_Display_Names();
+}
+
+int PageManager::LoadPackage(std::string name, std::string package, std::string startpage)
+{
+ std::string mainxmlfilename = package;
+ ZipArchive zip;
+ char* languageFile = NULL;
+ char* baseLanguageFile = NULL;
+ PageSet* pageSet = NULL;
+ int ret;
+ MemMapping map;
+
+ mReloadTheme = false;
+ mStartPage = startpage;
+
+ // init the loading context
+ LoadingContext ctx;
+
+ // Open the XML file
+ LOGINFO("Loading package: %s (%s)\n", name.c_str(), package.c_str());
+ if (package.size() > 4 && package.substr(package.size() - 4) != ".zip")
+ {
+ LOGINFO("Load XML directly\n");
+ tw_x_offset = TW_X_OFFSET;
+ tw_y_offset = TW_Y_OFFSET;
+ tw_w_offset = TW_W_OFFSET;
+ tw_h_offset = TW_H_OFFSET;
+ if (name != "splash") {
+ LoadLanguageList(NULL);
+ languageFile = LoadFileToBuffer(TWRES "languages/en.xml", NULL);
+ }
+ ctx.basepath = TWRES;
+ }
+ else
+ {
+ LOGINFO("Loading zip theme\n");
+ tw_x_offset = 0;
+ tw_y_offset = 0;
+ tw_w_offset = 0;
+ tw_h_offset = 0;
+ if (!TWFunc::Path_Exists(package))
+ return -1;
+ if (sysMapFile(package.c_str(), &map) != 0) {
+ LOGERR("Failed to map '%s'\n", package.c_str());
+ goto error;
+ }
+ if (mzOpenZipArchive(map.addr, map.length, &zip)) {
+ LOGERR("Unable to open zip archive '%s'\n", package.c_str());
+ sysReleaseMap(&map);
+ goto error;
+ }
+ ctx.zip = &zip;
+ mainxmlfilename = "ui.xml";
+ LoadLanguageList(ctx.zip);
+ languageFile = LoadFileToBuffer("languages/en.xml", ctx.zip);
+ baseLanguageFile = LoadFileToBuffer(TWRES "languages/en.xml", NULL);
+ }
+
+ // Before loading, mCurrentSet must be the loading package so we can find resources
+ pageSet = mCurrentSet;
+ mCurrentSet = new PageSet();
+
+ if (baseLanguageFile) {
+ mCurrentSet->LoadLanguage(baseLanguageFile, NULL);
+ free(baseLanguageFile);
+ }
+
+ if (languageFile) {
+ mCurrentSet->LoadLanguage(languageFile, ctx.zip);
+ free(languageFile);
+ }
+
+ // Load and parse the XML and all includes
+ currentLoadingContext = &ctx; // required to find styles
+ ret = mCurrentSet->Load(ctx, mainxmlfilename);
+ currentLoadingContext = NULL;
+
+ if (ret == 0) {
+ mCurrentSet->SetPage(startpage);
+ mPageSets.insert(std::pair<std::string, PageSet*>(name, mCurrentSet));
+ } else {
+ if (ret != TW_THEME_VER_ERR)
+ LOGERR("Package %s failed to load.\n", name.c_str());
+ }
+
+ // reset to previous pageset
+ mCurrentSet = pageSet;
+
+ if (ctx.zip) {
+ mzCloseZipArchive(ctx.zip);
+ sysReleaseMap(&map);
+ }
+ return ret;
+
+error:
+ // Sometimes we get here without a real error
+ if (ctx.zip) {
+ mzCloseZipArchive(ctx.zip);
+ sysReleaseMap(&map);
+ }
+ return -1;
+}
+
+PageSet* PageManager::FindPackage(std::string name)
+{
+ std::map<std::string, PageSet*>::iterator iter;
+
+ iter = mPageSets.find(name);
+ if (iter != mPageSets.end())
+ return (*iter).second;
+
+ LOGERR("Unable to locate package %s\n", name.c_str());
+ return NULL;
+}
+
+PageSet* PageManager::SelectPackage(std::string name)
+{
+ LOGINFO("Switching packages (%s)\n", name.c_str());
+ PageSet* tmp;
+
+ tmp = FindPackage(name);
+ if (tmp)
+ {
+ mCurrentSet = tmp;
+ mCurrentSet->MakeEmergencyConsoleIfNeeded();
+ mCurrentSet->NotifyVarChange("", "");
+ }
+ else
+ LOGERR("Unable to find package.\n");
+
+ return mCurrentSet;
+}
+
+int PageManager::ReloadPackage(std::string name, std::string package)
+{
+ std::map<std::string, PageSet*>::iterator iter;
+
+ mReloadTheme = false;
+
+ iter = mPageSets.find(name);
+ if (iter == mPageSets.end())
+ return -1;
+
+ if (mMouseCursor)
+ mMouseCursor->ResetData(gr_fb_width(), gr_fb_height());
+
+ PageSet* set = (*iter).second;
+ mPageSets.erase(iter);
+
+ if (LoadPackage(name, package, mStartPage) != 0)
+ {
+ LOGINFO("Failed to load package '%s'.\n", package.c_str());
+ mPageSets.insert(std::pair<std::string, PageSet*>(name, set));
+ return -1;
+ }
+ if (mCurrentSet == set)
+ SelectPackage(name);
+ delete set;
+ GUIConsole::Translate_Now();
+ return 0;
+}
+
+void PageManager::ReleasePackage(std::string name)
+{
+ std::map<std::string, PageSet*>::iterator iter;
+
+ iter = mPageSets.find(name);
+ if (iter == mPageSets.end())
+ return;
+
+ PageSet* set = (*iter).second;
+ mPageSets.erase(iter);
+ delete set;
+ if (set == mCurrentSet)
+ mCurrentSet = NULL;
+ return;
+}
+
+int PageManager::RunReload() {
+ int ret_val = 0;
+ std::string theme_path;
+
+ if (!mReloadTheme)
+ return 0;
+
+ mReloadTheme = false;
+ theme_path = DataManager::GetSettingsStoragePath();
+ if (PartitionManager.Mount_By_Path(theme_path.c_str(), 1) < 0) {
+ LOGERR("Unable to mount %s during gui_reload_theme function.\n", theme_path.c_str());
+ ret_val = 1;
+ }
+
+ theme_path += "/TWRP/theme/ui.zip";
+ if (ret_val != 0 || ReloadPackage("TWRP", theme_path) != 0)
+ {
+ // Loading the custom theme failed - try loading the stock theme
+ LOGINFO("Attempting to reload stock theme...\n");
+ if (ReloadPackage("TWRP", TWRES "ui.xml"))
+ {
+ LOGERR("Failed to load base packages.\n");
+ ret_val = 1;
+ }
+ }
+ if (ret_val == 0) {
+ if (DataManager::GetStrValue("tw_language") != "en.xml") {
+ LOGINFO("Loading language '%s'\n", DataManager::GetStrValue("tw_language").c_str());
+ LoadLanguage(DataManager::GetStrValue("tw_language"));
+ }
+ }
+
+ // This makes the console re-translate
+ GUIConsole::Clear_For_Retranslation();
+
+ return ret_val;
+}
+
+void PageManager::RequestReload() {
+ mReloadTheme = true;
+}
+
+void PageManager::SetStartPage(const std::string& page_name) {
+ mStartPage = page_name;
+}
+
+int PageManager::ChangePage(std::string name)
+{
+ DataManager::SetValue("tw_operation_state", 0);
+ int ret = (mCurrentSet ? mCurrentSet->SetPage(name) : -1);
+ return ret;
+}
+
+std::string PageManager::GetCurrentPage()
+{
+ return mCurrentSet ? mCurrentSet->GetCurrentPage() : "";
+}
+
+int PageManager::ChangeOverlay(std::string name)
+{
+ if (name.empty())
+ return mCurrentSet->SetOverlay(NULL);
+ else
+ {
+ Page* page = mCurrentSet ? mCurrentSet->FindPage(name) : NULL;
+ return mCurrentSet->SetOverlay(page);
+ }
+}
+
+const ResourceManager* PageManager::GetResources()
+{
+ return (mCurrentSet ? mCurrentSet->GetResources() : NULL);
+}
+
+int PageManager::IsCurrentPage(Page* page)
+{
+ return (mCurrentSet ? mCurrentSet->IsCurrentPage(page) : 0);
+}
+
+int PageManager::Render(void)
+{
+ if (blankTimer.isScreenOff())
+ return 0;
+
+ int res = (mCurrentSet ? mCurrentSet->Render() : -1);
+ if (mMouseCursor)
+ mMouseCursor->Render();
+ return res;
+}
+
+HardwareKeyboard *PageManager::GetHardwareKeyboard()
+{
+ if (!mHardwareKeyboard)
+ mHardwareKeyboard = new HardwareKeyboard();
+ return mHardwareKeyboard;
+}
+
+xml_node<>* PageManager::FindStyle(std::string name)
+{
+ if (!currentLoadingContext)
+ {
+ LOGERR("FindStyle works only while loading a theme.\n");
+ return NULL;
+ }
+
+ for (std::vector<xml_node<>*>::iterator itr = currentLoadingContext->styles.begin(); itr != currentLoadingContext->styles.end(); itr++) {
+ xml_node<>* node = (*itr)->first_node("style");
+
+ while (node) {
+ if (!node->first_attribute("name"))
+ continue;
+
+ if (name == node->first_attribute("name")->value())
+ return node;
+ node = node->next_sibling("style");
+ }
+ }
+ return NULL;
+}
+
+MouseCursor *PageManager::GetMouseCursor()
+{
+ if (!mMouseCursor)
+ mMouseCursor = new MouseCursor(gr_fb_width(), gr_fb_height());
+ return mMouseCursor;
+}
+
+void PageManager::LoadCursorData(xml_node<>* node)
+{
+ if (!mMouseCursor)
+ mMouseCursor = new MouseCursor(gr_fb_width(), gr_fb_height());
+
+ mMouseCursor->LoadData(node);
+}
+
+int PageManager::Update(void)
+{
+ if (blankTimer.isScreenOff())
+ return 0;
+
+ if (RunReload())
+ return -2;
+
+ int res = (mCurrentSet ? mCurrentSet->Update() : -1);
+
+ if (mMouseCursor)
+ {
+ int c_res = mMouseCursor->Update();
+ if (c_res > res)
+ res = c_res;
+ }
+ return res;
+}
+
+int PageManager::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ return (mCurrentSet ? mCurrentSet->NotifyTouch(state, x, y) : -1);
+}
+
+int PageManager::NotifyKey(int key, bool down)
+{
+ return (mCurrentSet ? mCurrentSet->NotifyKey(key, down) : -1);
+}
+
+int PageManager::NotifyCharInput(int ch)
+{
+ return (mCurrentSet ? mCurrentSet->NotifyCharInput(ch) : -1);
+}
+
+int PageManager::SetKeyBoardFocus(int inFocus)
+{
+ return (mCurrentSet ? mCurrentSet->SetKeyBoardFocus(inFocus) : -1);
+}
+
+int PageManager::NotifyVarChange(std::string varName, std::string value)
+{
+ return (mCurrentSet ? mCurrentSet->NotifyVarChange(varName, value) : -1);
+}
+
+void PageManager::AddStringResource(std::string resource_source, std::string resource_name, std::string value)
+{
+ if (mCurrentSet)
+ mCurrentSet->AddStringResource(resource_source, resource_name, value);
+}
+
+extern "C" void gui_notifyVarChange(const char *name, const char* value)
+{
+ if (!gGuiRunning)
+ return;
+
+ PageManager::NotifyVarChange(name, value);
+}
diff --git a/gui/pages.h b/gui/pages.h
new file mode 100644
index 000000000..d407162a2
--- /dev/null
+++ b/gui/pages.h
@@ -0,0 +1,7 @@
+#ifndef _PAGES_HEADER
+#define _PAGES_HEADER
+
+void gui_notifyVarChange(const char *name, const char* value);
+
+#endif // _PAGES_HEADER
+
diff --git a/gui/pages.hpp b/gui/pages.hpp
new file mode 100644
index 000000000..1e71b10e0
--- /dev/null
+++ b/gui/pages.hpp
@@ -0,0 +1,212 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// pages.hpp - Base classes for page manager of GUI
+
+#ifndef _PAGES_HEADER_HPP
+#define _PAGES_HEADER_HPP
+
+#include "../minzip/Zip.h"
+#include <vector>
+#include <map>
+#include <string>
+#include "rapidxml.hpp"
+#include "gui.hpp"
+using namespace rapidxml;
+
+enum TOUCH_STATE {
+ TOUCH_START = 0,
+ TOUCH_DRAG = 1,
+ TOUCH_RELEASE = 2,
+ TOUCH_HOLD = 3,
+ TOUCH_REPEAT = 4
+};
+
+struct COLOR {
+ unsigned char red;
+ unsigned char green;
+ unsigned char blue;
+ unsigned char alpha;
+ COLOR() : red(0), green(0), blue(0), alpha(0) {}
+ COLOR(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255)
+ : red(r), green(g), blue(b), alpha(a) {}
+};
+
+struct language_struct {
+ std::string filename;
+ std::string displayvalue;
+};
+
+inline bool operator < (const language_struct& language1, const language_struct& language2)
+{
+ return language1.displayvalue < language2.displayvalue;
+}
+
+extern std::vector<language_struct> Language_List;
+
+// Utility Functions
+int ConvertStrToColor(std::string str, COLOR* color);
+int gui_forceRender(void);
+int gui_changePage(std::string newPage);
+int gui_changeOverlay(std::string newPage);
+
+class Resource;
+class ResourceManager;
+class RenderObject;
+class ActionObject;
+class InputObject;
+class MouseCursor;
+class GUIObject;
+class HardwareKeyboard;
+
+class Page
+{
+public:
+ Page(xml_node<>* page, std::vector<xml_node<>*> *templates);
+ virtual ~Page();
+
+ std::string GetName(void) { return mName; }
+
+public:
+ virtual int Render(void);
+ virtual int Update(void);
+ virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+ virtual int NotifyKey(int key, bool down);
+ virtual int NotifyCharInput(int ch);
+ virtual int SetKeyBoardFocus(int inFocus);
+ virtual int NotifyVarChange(std::string varName, std::string value);
+ virtual void SetPageFocus(int inFocus);
+
+protected:
+ std::string mName;
+ std::vector<GUIObject*> mObjects;
+ std::vector<RenderObject*> mRenders;
+ std::vector<ActionObject*> mActions;
+ std::vector<InputObject*> mInputs;
+
+ ActionObject* mTouchStart;
+ COLOR mBackground;
+
+protected:
+ bool ProcessNode(xml_node<>* page, std::vector<xml_node<>*> *templates, int depth);
+};
+
+struct LoadingContext;
+
+class PageSet
+{
+public:
+ PageSet();
+ virtual ~PageSet();
+
+public:
+ int Load(LoadingContext& ctx, const std::string& filename);
+ int LoadLanguage(char* languageFile, ZipArchive* package);
+ void MakeEmergencyConsoleIfNeeded();
+
+ Page* FindPage(std::string name);
+ int SetPage(std::string page);
+ int SetOverlay(Page* page);
+ const ResourceManager* GetResources();
+
+ // Helper routine for identifing if we're the current page
+ int IsCurrentPage(Page* page);
+ std::string GetCurrentPage() const;
+
+ // These are routing routines
+ int Render(void);
+ int Update(void);
+ int NotifyTouch(TOUCH_STATE state, int x, int y);
+ int NotifyKey(int key, bool down);
+ int NotifyCharInput(int ch);
+ int SetKeyBoardFocus(int inFocus);
+ int NotifyVarChange(std::string varName, std::string value);
+
+ void AddStringResource(std::string resource_source, std::string resource_name, std::string value);
+
+protected:
+ int LoadDetails(LoadingContext& ctx, xml_node<>* root);
+ int LoadPages(LoadingContext& ctx, xml_node<>* pages);
+ int LoadVariables(xml_node<>* vars);
+
+protected:
+ ResourceManager* mResources;
+ std::vector<Page*> mPages;
+ Page* mCurrentPage;
+ std::vector<Page*> mOverlays; // Special case for popup dialogs and the lock screen
+};
+
+class PageManager
+{
+public:
+ // Used by GUI
+ static char* LoadFileToBuffer(std::string filename, ZipArchive* package);
+ static void LoadLanguageList(ZipArchive* package);
+ static void LoadLanguage(std::string filename);
+ static int LoadPackage(std::string name, std::string package, std::string startpage);
+ static PageSet* SelectPackage(std::string name);
+ static int ReloadPackage(std::string name, std::string package);
+ static void ReleasePackage(std::string name);
+ static int RunReload();
+ static void RequestReload();
+ static void SetStartPage(const std::string& page_name);
+
+ // Used for actions and pages
+ static int ChangePage(std::string name);
+ static int ChangeOverlay(std::string name);
+ static const ResourceManager* GetResources();
+ static std::string GetCurrentPage();
+
+ // Helper to identify if a particular page is the active page
+ static int IsCurrentPage(Page* page);
+
+ // These are routing routines
+ static int Render(void);
+ static int Update(void);
+ static int NotifyTouch(TOUCH_STATE state, int x, int y);
+ static int NotifyKey(int key, bool down);
+ static int NotifyCharInput(int ch);
+ static int SetKeyBoardFocus(int inFocus);
+ static int NotifyVarChange(std::string varName, std::string value);
+
+ static MouseCursor *GetMouseCursor();
+ static void LoadCursorData(xml_node<>* node);
+
+ static HardwareKeyboard *GetHardwareKeyboard();
+
+ static xml_node<>* FindStyle(std::string name);
+ static void AddStringResource(std::string resource_source, std::string resource_name, std::string value);
+
+protected:
+ static PageSet* FindPackage(std::string name);
+ static void LoadLanguageListDir(std::string dir);
+ static void Translate_Partition(const char* path, const char* resource_name, const char* default_value);
+ static void Translate_Partition(const char* path, const char* resource_name, const char* default_value, const char* storage_resource_name, const char* storage_default_value);
+ static void Translate_Partition_Display_Names();
+
+protected:
+ static std::map<std::string, PageSet*> mPageSets;
+ static PageSet* mCurrentSet;
+ static MouseCursor *mMouseCursor;
+ static HardwareKeyboard *mHardwareKeyboard;
+ static bool mReloadTheme;
+ static std::string mStartPage;
+ static LoadingContext* currentLoadingContext;
+};
+
+#endif // _PAGES_HEADER_HPP
diff --git a/gui/partitionlist.cpp b/gui/partitionlist.cpp
new file mode 100644
index 000000000..c85339152
--- /dev/null
+++ b/gui/partitionlist.cpp
@@ -0,0 +1,283 @@
+/*
+ Copyright 2013 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string.h>
+#include <sys/stat.h>
+#include <dirent.h>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+#include "../partitions.hpp"
+
+GUIPartitionList::GUIPartitionList(xml_node<>* node) : GUIScrollList(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mIconSelected = mIconUnselected = NULL;
+ mUpdate = 0;
+ updateList = false;
+
+ child = FindNode(node, "icon");
+ if (child)
+ {
+ mIconSelected = LoadAttrImage(child, "selected");
+ mIconUnselected = LoadAttrImage(child, "unselected");
+ }
+
+ // Handle the result variable
+ child = FindNode(node, "data");
+ if (child)
+ {
+ attr = child->first_attribute("name");
+ if (attr)
+ mVariable = attr->value();
+ attr = child->first_attribute("selectedlist");
+ if (attr)
+ selectedList = attr->value();
+ }
+
+ int iconWidth = std::max(mIconSelected->GetWidth(), mIconUnselected->GetWidth());
+ int iconHeight = std::max(mIconSelected->GetHeight(), mIconUnselected->GetHeight());
+ SetMaxIconSize(iconWidth, iconHeight);
+
+ child = FindNode(node, "listtype");
+ if (child && (attr = child->first_attribute("name"))) {
+ ListType = attr->value();
+ updateList = true;
+ } else {
+ mList.clear();
+ LOGERR("No partition listtype specified for partitionlist GUI element\n");
+ return;
+ }
+}
+
+GUIPartitionList::~GUIPartitionList()
+{
+}
+
+int GUIPartitionList::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ // Check for changes in mount points if the list type is mount and update the list and render if needed
+ if (ListType == "mount") {
+ int listSize = mList.size();
+ for (int i = 0; i < listSize; i++) {
+ if (PartitionManager.Is_Mounted_By_Path(mList.at(i).Mount_Point) && !mList.at(i).selected) {
+ mList.at(i).selected = 1;
+ mUpdate = 1;
+ } else if (!PartitionManager.Is_Mounted_By_Path(mList.at(i).Mount_Point) && mList.at(i).selected) {
+ mList.at(i).selected = 0;
+ mUpdate = 1;
+ }
+ }
+ }
+
+ GUIScrollList::Update();
+
+ if (updateList) {
+ // Completely update the list if needed -- Used primarily for
+ // restore as the list for restore will change depending on what
+ // partitions were backed up
+ mList.clear();
+ PartitionManager.Get_Partition_List(ListType, &mList);
+ SetVisibleListLocation(0);
+ updateList = false;
+ mUpdate = 1;
+ if (ListType == "backup" || ListType == "flashimg")
+ MatchList();
+ }
+
+ if (mUpdate) {
+ mUpdate = 0;
+ if (Render() == 0)
+ return 2;
+ }
+
+ return 0;
+}
+
+int GUIPartitionList::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIScrollList::NotifyVarChange(varName, value);
+
+ if (!isConditionTrue())
+ return 0;
+
+ if (varName == mVariable && !mUpdate)
+ {
+ if (ListType == "storage") {
+ currentValue = value;
+ SetPosition();
+ } else if (ListType == "backup") {
+ MatchList();
+ } else if (ListType == "restore") {
+ updateList = true;
+ SetVisibleListLocation(0);
+ }
+
+ mUpdate = 1;
+ return 0;
+ }
+ return 0;
+}
+
+void GUIPartitionList::SetPageFocus(int inFocus)
+{
+ GUIScrollList::SetPageFocus(inFocus);
+ if (inFocus) {
+ if (ListType == "storage" || ListType == "flashimg") {
+ DataManager::GetValue(mVariable, currentValue);
+ SetPosition();
+ }
+ updateList = true;
+ mUpdate = 1;
+ }
+}
+
+void GUIPartitionList::MatchList(void) {
+ int i, listSize = mList.size();
+ string variablelist, searchvalue;
+ size_t pos;
+
+ DataManager::GetValue(mVariable, variablelist);
+
+ for (i = 0; i < listSize; i++) {
+ searchvalue = mList.at(i).Mount_Point + ";";
+ pos = variablelist.find(searchvalue);
+ if (pos != string::npos) {
+ mList.at(i).selected = 1;
+ } else {
+ mList.at(i).selected = 0;
+ }
+ }
+}
+
+void GUIPartitionList::SetPosition() {
+ int listSize = mList.size();
+
+ SetVisibleListLocation(0);
+ for (int i = 0; i < listSize; i++) {
+ if (mList.at(i).Mount_Point == currentValue) {
+ mList.at(i).selected = 1;
+ SetVisibleListLocation(i);
+ } else {
+ mList.at(i).selected = 0;
+ }
+ }
+}
+
+size_t GUIPartitionList::GetItemCount()
+{
+ return mList.size();
+}
+
+void GUIPartitionList::RenderItem(size_t itemindex, int yPos, bool selected)
+{
+ // note: the "selected" parameter above is for the currently touched item
+ // don't confuse it with the more persistent "selected" flag per list item used below
+ ImageResource* icon = mList.at(itemindex).selected ? mIconSelected : mIconUnselected;
+ const std::string& text = mList.at(itemindex).Display_Name;
+
+ RenderStdItem(yPos, selected, icon, text.c_str());
+}
+
+void GUIPartitionList::NotifySelect(size_t item_selected)
+{
+ if (item_selected < mList.size()) {
+ int listSize = mList.size();
+ if (ListType == "mount") {
+ if (!mList.at(item_selected).selected) {
+ if (PartitionManager.Mount_By_Path(mList.at(item_selected).Mount_Point, true)) {
+ mList.at(item_selected).selected = 1;
+ PartitionManager.Add_MTP_Storage(mList.at(item_selected).Mount_Point);
+ mUpdate = 1;
+ }
+ } else {
+ if (PartitionManager.UnMount_By_Path(mList.at(item_selected).Mount_Point, true)) {
+ mList.at(item_selected).selected = 0;
+ mUpdate = 1;
+ }
+ }
+ } else if (!mVariable.empty()) {
+ if (ListType == "storage") {
+ int i;
+ std::string str = mList.at(item_selected).Mount_Point;
+ bool update_size = false;
+ TWPartition* Part = PartitionManager.Find_Partition_By_Path(str);
+ if (Part == NULL) {
+ LOGERR("Unable to locate partition for '%s'\n", str.c_str());
+ return;
+ }
+ if (!Part->Is_Mounted() && Part->Removable)
+ update_size = true;
+ if (!Part->Mount(true)) {
+ // Do Nothing
+ } else if (update_size && !Part->Update_Size(true)) {
+ // Do Nothing
+ } else {
+ for (i=0; i<listSize; i++)
+ mList.at(i).selected = 0;
+
+ if (update_size) {
+ char free_space[255];
+ sprintf(free_space, "%llu", Part->Free / 1024 / 1024);
+ mList.at(item_selected).Display_Name = Part->Storage_Name + " (";
+ mList.at(item_selected).Display_Name += free_space;
+ mList.at(item_selected).Display_Name += "MB)";
+ }
+ mList.at(item_selected).selected = 1;
+ mUpdate = 1;
+
+ DataManager::SetValue(mVariable, str);
+ }
+ } else {
+ if (ListType == "flashimg") { // only one item can be selected for flashing images
+ for (int i=0; i<listSize; i++)
+ mList.at(i).selected = 0;
+ }
+ if (mList.at(item_selected).selected)
+ mList.at(item_selected).selected = 0;
+ else
+ mList.at(item_selected).selected = 1;
+
+ int i;
+ string variablelist;
+ for (i=0; i<listSize; i++) {
+ if (mList.at(i).selected) {
+ variablelist += mList.at(i).Mount_Point + ";";
+ }
+ }
+
+ mUpdate = 1;
+ if (selectedList.empty())
+ DataManager::SetValue(mVariable, variablelist);
+ else
+ DataManager::SetValue(selectedList, variablelist);
+ }
+ }
+ }
+}
diff --git a/gui/patternpassword.cpp b/gui/patternpassword.cpp
new file mode 100644
index 000000000..c31737f32
--- /dev/null
+++ b/gui/patternpassword.cpp
@@ -0,0 +1,487 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+#include <sstream>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+#include "../twrp-functions.hpp"
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUIPatternPassword::GUIPatternPassword(xml_node<>* node)
+ : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ // 3x3 is the default.
+ mGridSize = 3;
+ mDots = new Dot[mGridSize * mGridSize];
+ mConnectedDots = new int[mGridSize * mGridSize];
+
+ ResetActiveDots();
+ mTrackingTouch = false;
+ mNeedRender = true;
+
+ ConvertStrToColor("blue", &mDotColor);
+ ConvertStrToColor("white", &mActiveDotColor);
+ ConvertStrToColor("blue", &mLineColor);
+
+ mDotImage = mActiveDotImage = NULL;
+ mDotCircle = mActiveDotCircle = NULL;
+ mDotRadius = 50;
+ mLineWidth = 35;
+
+ mAction = NULL;
+ mUpdate = 0;
+
+ if (!node)
+ return;
+
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH, &mPlacement);
+
+ mAction = new GUIAction(node);
+
+ child = FindNode(node, "dot");
+ if (child)
+ {
+ mDotColor = LoadAttrColor(child, "color", mDotColor);
+ mActiveDotColor = LoadAttrColor(child, "activecolor", mActiveDotColor);
+ mDotRadius = LoadAttrIntScaleX(child, "radius", mDotRadius);
+
+ mDotImage = LoadAttrImage(child, "image");
+ mActiveDotImage = LoadAttrImage(child, "activeimage");
+ }
+
+ child = FindNode(node, "line");
+ if (child)
+ {
+ mLineColor = LoadAttrColor(child, "color", mLineColor);
+ mLineWidth = LoadAttrIntScaleX(child, "width", mLineWidth);
+ }
+
+ child = FindNode(node, "data");
+ if (child)
+ mPassVar = LoadAttrString(child, "name", "");
+
+ child = FindNode(node, "size");
+ if (child) {
+ mSizeVar = LoadAttrString(child, "name", "");
+
+ // Use the configured default, if set.
+ size_t size = LoadAttrInt(child, "default", mGridSize);
+ Resize(size);
+ }
+
+ if (!mDotImage || !mDotImage->GetResource() || !mActiveDotImage || !mActiveDotImage->GetResource())
+ {
+ mDotCircle = gr_render_circle(mDotRadius, mDotColor.red, mDotColor.green, mDotColor.blue, mDotColor.alpha);
+ mActiveDotCircle = gr_render_circle(mDotRadius/2, mActiveDotColor.red, mActiveDotColor.green, mActiveDotColor.blue, mActiveDotColor.alpha);
+ }
+ else
+ mDotRadius = mDotImage->GetWidth()/2;
+
+ SetRenderPos(mRenderX, mRenderY, mRenderW, mRenderH);
+}
+
+GUIPatternPassword::~GUIPatternPassword()
+{
+ delete mDotImage;
+ delete mActiveDotImage;
+ delete mAction;
+
+ delete[] mDots;
+ delete[] mConnectedDots;
+
+ if (mDotCircle)
+ gr_free_surface(mDotCircle);
+
+ if (mActiveDotCircle)
+ gr_free_surface(mActiveDotCircle);
+}
+
+void GUIPatternPassword::ResetActiveDots()
+{
+ mConnectedDotsLen = 0;
+ mCurLineX = mCurLineY = -1;
+ for (size_t i = 0; i < mGridSize * mGridSize; ++i)
+ mDots[i].active = false;
+}
+
+int GUIPatternPassword::SetRenderPos(int x, int y, int w, int h)
+{
+ mRenderX = x;
+ mRenderY = y;
+
+ if (w || h)
+ {
+ mRenderW = w;
+ mRenderH = h;
+
+ mAction->SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ }
+
+ CalculateDotPositions();
+ return 0;
+}
+
+void GUIPatternPassword::CalculateDotPositions(void)
+{
+ const int num_gaps = mGridSize - 1;
+ const int step_x = (mRenderW - mDotRadius*2) / num_gaps;
+ const int step_y = (mRenderH - mDotRadius*2) / num_gaps;
+ int x = mRenderX;
+ int y = mRenderY;
+
+ /* Order is important for keyphrase generation:
+ *
+ * 0 1 2 3 ... n-1
+ * n n+1 n+2 n+3 ... 2n-1
+ * 2n 2n+1 2n+2 2n+3 ... 3n-1
+ * 3n 3n+1 3n+2 3n+3 ... 4n-1
+ * : : : :
+ * n*n-1
+ */
+
+ for (size_t r = 0; r < mGridSize; ++r)
+ {
+ for (size_t c = 0; c < mGridSize; ++c)
+ {
+ mDots[mGridSize*r + c].x = x;
+ mDots[mGridSize*r + c].y = y;
+ x += step_x;
+ }
+ x = mRenderX;
+ y += step_y;
+ }
+}
+
+int GUIPatternPassword::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ gr_color(mLineColor.red, mLineColor.green, mLineColor.blue, mLineColor.alpha);
+ for (size_t i = 1; i < mConnectedDotsLen; ++i) {
+ const Dot& dp = mDots[mConnectedDots[i-1]];
+ const Dot& dc = mDots[mConnectedDots[i]];
+ gr_line(dp.x + mDotRadius, dp.y + mDotRadius, dc.x + mDotRadius, dc.y + mDotRadius, mLineWidth);
+ }
+
+ if (mConnectedDotsLen > 0 && mTrackingTouch) {
+ const Dot& dc = mDots[mConnectedDots[mConnectedDotsLen-1]];
+ gr_line(dc.x + mDotRadius, dc.y + mDotRadius, mCurLineX, mCurLineY, mLineWidth);
+ }
+
+ for (size_t i = 0; i < mGridSize * mGridSize; ++i) {
+ if (mDotCircle) {
+ gr_blit(mDotCircle, 0, 0, gr_get_width(mDotCircle), gr_get_height(mDotCircle), mDots[i].x, mDots[i].y);
+ if (mDots[i].active) {
+ gr_blit(mActiveDotCircle, 0, 0, gr_get_width(mActiveDotCircle), gr_get_height(mActiveDotCircle), mDots[i].x + mDotRadius/2, mDots[i].y + mDotRadius/2);
+ }
+ } else {
+ if (mDots[i].active) {
+ gr_blit(mActiveDotImage->GetResource(), 0, 0, mActiveDotImage->GetWidth(), mActiveDotImage->GetHeight(),
+ mDots[i].x + (mDotRadius - mActiveDotImage->GetWidth()/2), mDots[i].y + (mDotRadius - mActiveDotImage->GetHeight()/2));
+ } else {
+ gr_blit(mDotImage->GetResource(), 0, 0, mDotImage->GetWidth(), mDotImage->GetHeight(), mDots[i].x, mDots[i].y);
+ }
+ }
+ }
+ return 0;
+}
+
+int GUIPatternPassword::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ int res = mNeedRender ? 2 : 1;
+ mNeedRender = false;
+ return res;
+}
+
+void GUIPatternPassword::Resize(size_t n) {
+ if (mGridSize == n)
+ return;
+
+ delete[] mDots;
+ delete[] mConnectedDots;
+
+ mGridSize = n;
+ mDots = new Dot[n*n];
+ mConnectedDots = new int[n*n];
+
+ ResetActiveDots();
+ CalculateDotPositions();
+ mTrackingTouch = false;
+ mNeedRender = true;
+}
+
+static int pow(int x, int i)
+{
+ int result = 1;
+ if (i<0)
+ return 0;
+ while(i-- > 0)
+ result *= x;
+ return result;
+}
+
+static bool IsInCircle(int x, int y, int ox, int oy, int r)
+{
+ return pow(x - ox, 2) + pow(y - oy, 2) <= pow(r, 2);
+}
+
+int GUIPatternPassword::InDot(int x, int y)
+{
+ for (size_t i = 0; i < mGridSize * mGridSize; ++i) {
+ if (IsInCircle(x, y, mDots[i].x + mDotRadius, mDots[i].y + mDotRadius, mDotRadius*3))
+ return i;
+ }
+ return -1;
+}
+
+bool GUIPatternPassword::DotUsed(int dot_idx)
+{
+ for (size_t i = 0; i < mConnectedDotsLen; ++i) {
+ if (mConnectedDots[i] == dot_idx)
+ return true;
+ }
+ return false;
+}
+
+void GUIPatternPassword::ConnectDot(int dot_idx)
+{
+ if (mConnectedDotsLen >= mGridSize * mGridSize)
+ {
+ LOGERR("mConnectedDots in GUIPatternPassword has overflown!\n");
+ return;
+ }
+
+ mConnectedDots[mConnectedDotsLen++] = dot_idx;
+ mDots[dot_idx].active = true;
+}
+
+void GUIPatternPassword::ConnectIntermediateDots(int next_dot_idx)
+{
+ if (mConnectedDotsLen == 0)
+ return;
+
+ const int prev_dot_idx = mConnectedDots[mConnectedDotsLen-1];
+
+ int px = prev_dot_idx % mGridSize;
+ int py = prev_dot_idx / mGridSize;
+
+ int nx = next_dot_idx % mGridSize;
+ int ny = next_dot_idx / mGridSize;
+
+ /*
+ * We connect all dots that are in a straight line between the previous dot
+ * and the next one. This is simple for 3x3, but is more complicated for
+ * larger grids.
+ *
+ * Weirdly, Android doesn't do the logical thing when it comes to connecting
+ * dots between two points. Rather than simply adding all points that lie
+ * on the line between the start and end points, it instead only connects
+ * dots that are adjacent in only three directions -- horizontal, vertical
+ * and diagonal (45°).
+ *
+ * So we can just iterate over the correct axes, taking care to ensure that
+ * the order in which the intermediate points are added to the pattern is
+ * correct.
+ */
+
+ int x = px;
+ int y = py;
+
+ int Dx = (nx > px) ? 1 : -1;
+ int Dy = (ny > py) ? 1 : -1;
+
+ // Vertical lines.
+ if (px == nx)
+ Dx = 0;
+
+ // Horizontal lines.
+ else if (py == ny)
+ Dy = 0;
+
+ // Diagonal lines (|∆x| = |∆y|).
+ else if (abs(px - nx) == abs(py - ny))
+ ;
+
+ // No valid intermediate dots.
+ else
+ return;
+
+ // Iterate along axis, adding dots in the correct order.
+ while ((Dy == 0 || y != ny - Dy) && (Dx == 0 || x != nx - Dx)) {
+ x += Dx;
+ y += Dy;
+
+ int idx = mGridSize * y + x;
+ if (!DotUsed(idx))
+ ConnectDot(idx);
+ }
+}
+
+int GUIPatternPassword::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ switch (state)
+ {
+ case TOUCH_START:
+ {
+ const int dot_idx = InDot(x, y);
+ if (dot_idx == -1)
+ break;
+
+ mTrackingTouch = true;
+ ResetActiveDots();
+ ConnectDot(dot_idx);
+ DataManager::Vibrate("tw_button_vibrate");
+ mCurLineX = x;
+ mCurLineY = y;
+ mNeedRender = true;
+ break;
+ }
+ case TOUCH_DRAG:
+ {
+ if (!mTrackingTouch)
+ break;
+
+ const int dot_idx = InDot(x, y);
+ if (dot_idx != -1 && !DotUsed(dot_idx))
+ {
+ ConnectIntermediateDots(dot_idx);
+ ConnectDot(dot_idx);
+ DataManager::Vibrate("tw_button_vibrate");
+ }
+
+ mCurLineX = x;
+ mCurLineY = y;
+ mNeedRender = true;
+ break;
+ }
+ case TOUCH_RELEASE:
+ {
+ if (!mTrackingTouch)
+ break;
+
+ mNeedRender = true;
+ mTrackingTouch = false;
+ PatternDrawn();
+ ResetActiveDots();
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+
+int GUIPatternPassword::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (varName == mSizeVar) {
+ Resize(atoi(value.c_str()));
+ mUpdate = true;
+ }
+ return 0;
+}
+
+static unsigned int getSDKVersion(void) {
+ unsigned int sdkver = 23;
+ string sdkverstr = TWFunc::System_Property_Get("ro.build.version.sdk");
+ if (!sdkverstr.empty()) {
+ sdkver = (unsigned int)strtoull(sdkverstr.c_str(), NULL, 10);
+ sdkver = (sdkver != 0) ? sdkver : 23;
+ }
+ LOGINFO("sdk version is %u\n", sdkver);
+ return sdkver;
+}
+
+std::string GUIPatternPassword::GeneratePassphrase()
+{
+ char pattern[mConnectedDotsLen];
+ for (size_t i = 0; i < mConnectedDotsLen; i++) {
+ pattern[i] = (char) mConnectedDots[i];
+ }
+
+ std::stringstream pass;
+ char buffer[3] = {0};
+
+ if ((mGridSize == 3) || (getSDKVersion() >= 23)) {
+ // Marshmallow uses a consistent method
+ for (size_t i = 0; i < mConnectedDotsLen; i++) {
+ buffer[0] = (pattern[i] & 0xff) + '1';
+ pass << std::string(buffer);
+ }
+ } else {
+ /*
+ * Okay, rant time for pre-Marshmallow ROMs.
+ * It turns out that Android and CyanogenMod have *two* separate methods
+ * for generating passphrases from patterns. This is a legacy issue, as
+ * Android only supports 3x3 grids, and so we need to support both.
+ * Luckily, CyanogenMod is in the same boat as us and needs to support
+ * Android's 3x3 encryption style.
+ *
+ * In order to generate a 3x3 passphrase, add 1 to each dot index
+ * and concatenate the string representation of the integers. No
+ * padding should be added.
+ *
+ * For *all* other NxN passphrases (until a 16x16 grid comes along),
+ * they are generated by taking "%.2x" for each dot index and
+ * concatenating the results (without adding 1).
+ */
+ for (size_t i = 0; i < mConnectedDotsLen; i++) {
+ snprintf(buffer, 3, "%.2x", pattern[i] & 0xff);
+ pass << std::string(buffer);
+ }
+ }
+
+ return pass.str();
+}
+
+void GUIPatternPassword::PatternDrawn()
+{
+ if (!mPassVar.empty() && mConnectedDotsLen > 0)
+ DataManager::SetValue(mPassVar, GeneratePassphrase());
+
+ if (mAction)
+ mAction->doActions();
+}
diff --git a/gui/placement.h b/gui/placement.h
new file mode 100644
index 000000000..02079e8eb
--- /dev/null
+++ b/gui/placement.h
@@ -0,0 +1,32 @@
+/*
+ Copyright 2015 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __PLACEMENT_H
+#define __PLACEMENT_H
+
+enum Placement {
+ TOP_LEFT = 0,
+ TOP_RIGHT = 1,
+ BOTTOM_LEFT = 2,
+ BOTTOM_RIGHT = 3,
+ CENTER = 4,
+ CENTER_X_ONLY = 5,
+ TEXT_ONLY_RIGHT = 6,
+};
+
+#endif // __PLACEMENT_H
diff --git a/gui/progressbar.cpp b/gui/progressbar.cpp
new file mode 100644
index 000000000..56ce48091
--- /dev/null
+++ b/gui/progressbar.cpp
@@ -0,0 +1,244 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// progressbar.cpp - GUIProgressBar object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUIProgressBar::GUIProgressBar(xml_node<>* node) : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mEmptyBar = NULL;
+ mFullBar = NULL;
+ mLastPos = 0;
+ mSlide = 0.0;
+ mSlideInc = 0.0;
+
+ if (!node)
+ {
+ LOGERR("GUIProgressBar created without XML node\n");
+ return;
+ }
+
+ child = FindNode(node, "resource");
+ if (child)
+ {
+ mEmptyBar = LoadAttrImage(child, "empty");
+ mFullBar = LoadAttrImage(child, "full");
+ }
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY);
+
+ // Load the data
+ child = FindNode(node, "data");
+ if (child)
+ {
+ mMinValVar = LoadAttrString(child, "min");
+ mMaxValVar = LoadAttrString(child, "max");
+ mCurValVar = LoadAttrString(child, "name");
+ }
+
+ mRenderW = mEmptyBar->GetWidth();
+ mRenderH = mEmptyBar->GetHeight();
+}
+
+int GUIProgressBar::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ // This handles making sure timing updates occur
+ Update();
+ return RenderInternal();
+}
+
+int GUIProgressBar::RenderInternal(void)
+{
+ if (!mEmptyBar || !mEmptyBar->GetResource())
+ return -1;
+
+ if (!mFullBar || !mFullBar->GetResource())
+ return -1;
+
+ gr_blit(mEmptyBar->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ gr_blit(mFullBar->GetResource(), 0, 0, mLastPos, mRenderH, mRenderX, mRenderY);
+ return 0;
+}
+
+int GUIProgressBar::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ std::string str;
+ int min, max, cur, pos;
+
+ if (mMinValVar.empty())
+ min = 0;
+ else
+ {
+ str.clear();
+ if (atoi(mMinValVar.c_str()) != 0)
+ str = mMinValVar;
+ else
+ DataManager::GetValue(mMinValVar, str);
+ min = atoi(str.c_str());
+ }
+
+ if (mMaxValVar.empty())
+ max = 100;
+ else
+ {
+ str.clear();
+ if (atoi(mMaxValVar.c_str()) != 0)
+ str = mMaxValVar;
+ else
+ DataManager::GetValue(mMaxValVar, str);
+ max = atoi(str.c_str());
+ }
+
+ str.clear();
+ DataManager::GetValue(mCurValVar, str);
+ cur = atoi(str.c_str());
+
+ // Do slide, if needed
+ if (mSlideFrames)
+ {
+ mSlide += mSlideInc;
+ mSlideFrames--;
+ if (cur != (int) mSlide)
+ {
+ cur = (int) mSlide;
+ DataManager::SetValue(mCurValVar, cur);
+ }
+ }
+
+ // Normalize to 0
+ max -= min;
+ cur -= min;
+ min = 0;
+
+ if (cur < min)
+ cur = min;
+ if (cur > max)
+ cur = max;
+
+ if (max == 0)
+ pos = 0;
+ else
+ pos = (cur * mRenderW) / max;
+
+ if (pos == mLastPos)
+ return 0;
+
+ mLastPos = pos;
+
+ if (RenderInternal() != 0)
+ return -1;
+ return 2;
+}
+
+int GUIProgressBar::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIObject::NotifyVarChange(varName, value);
+
+ if (!isConditionTrue())
+ return 0;
+
+ static int nextPush = 0;
+
+ if (varName.empty())
+ {
+ nextPush = 0;
+ mLastPos = 0;
+ mSlide = 0.0;
+ mSlideInc = 0.0;
+ return 0;
+ }
+
+ if (varName == "ui_progress_portion" || varName == "ui_progress_frames")
+ {
+ std::string str;
+ int cur;
+
+ if (mSlideFrames)
+ {
+ mSlide += (mSlideInc * mSlideFrames);
+ cur = (int) mSlide;
+ DataManager::SetValue(mCurValVar, cur);
+ mSlideFrames = 0;
+ }
+
+ if (nextPush)
+ {
+ mSlide += nextPush;
+ cur = (int) mSlide;
+ DataManager::SetValue(mCurValVar, cur);
+ nextPush = 0;
+ }
+
+ if (varName == "ui_progress_portion") mSlide = atof(value.c_str());
+ else
+ {
+ mSlideFrames = atol(value.c_str());
+ if (mSlideFrames == 0)
+ {
+ // We're just holding this progress until the next push
+ nextPush = mSlide;
+ }
+ }
+
+ if (mSlide > 0 && mSlideFrames > 0)
+ {
+ // Get the current position
+ str.clear();
+ DataManager::GetValue(mCurValVar, str);
+ cur = atoi(str.c_str());
+
+ mSlideInc = (float) mSlide / (float) mSlideFrames;
+ mSlide = cur;
+ }
+ }
+ return 0;
+}
diff --git a/gui/rapidxml.hpp b/gui/rapidxml.hpp
new file mode 100644
index 000000000..33a886014
--- /dev/null
+++ b/gui/rapidxml.hpp
@@ -0,0 +1,2616 @@
+#ifndef RAPIDXML_HPP_INCLUDED
+#define RAPIDXML_HPP_INCLUDED
+
+#define RAPIDXML_NO_EXCEPTIONS
+
+// Copyright (C) 2006, 2009 Marcin Kalicinski
+// Version 1.13
+// Revision $DateTime: 2009/05/13 01:46:17 $
+//! \file rapidxml.hpp This file contains rapidxml parser and DOM implementation
+
+// If standard library is disabled, user must provide implementations of required functions and typedefs
+#if !defined(RAPIDXML_NO_STDLIB)
+ #include <cstdlib> // For std::size_t
+ #include <cassert> // For assert
+ #include <new> // For placement new
+#endif
+
+// On MSVC, disable "conditional expression is constant" warning (level 4).
+// This warning is almost impossible to avoid with certain types of templated code
+#ifdef _MSC_VER
+ #pragma warning(push)
+ #pragma warning(disable:4127) // Conditional expression is constant
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+// RAPIDXML_PARSE_ERROR
+
+#if defined(RAPIDXML_NO_EXCEPTIONS)
+
+#define RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); }
+
+namespace rapidxml
+{
+ //! When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS,
+ //! this function is called to notify user about the error.
+ //! It must be defined by the user.
+ //! <br><br>
+ //! This function cannot return. If it does, the results are undefined.
+ //! <br><br>
+ //! A very simple definition might look like that:
+ //! <pre>
+ //! void %rapidxml::%parse_error_handler(const char *what, void *where)
+ //! {
+ //! std::cout << "Parse error: " << what << "\n";
+ //! std::abort();
+ //! }
+ //! </pre>
+ //! \param what Human readable description of the error.
+ //! \param where Pointer to character data where error was detected.
+ void parse_error_handler(const char *what, void *where);
+}
+
+#else
+
+#include <exception> // For std::exception
+
+#define RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where)
+
+namespace rapidxml
+{
+
+ //! Parse error exception.
+ //! This exception is thrown by the parser when an error occurs.
+ //! Use what() function to get human-readable error message.
+ //! Use where() function to get a pointer to position within source text where error was detected.
+ //! <br><br>
+ //! If throwing exceptions by the parser is undesirable,
+ //! it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included.
+ //! This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception.
+ //! This function must be defined by the user.
+ //! <br><br>
+ //! This class derives from <code>std::exception</code> class.
+ class parse_error: public std::exception
+ {
+
+ public:
+
+ //! Constructs parse error
+ parse_error(const char *what, void *where)
+ : m_what(what)
+ , m_where(where)
+ {
+ }
+
+ //! Gets human readable description of error.
+ //! \return Pointer to null terminated description of the error.
+ virtual const char *what() const throw()
+ {
+ return m_what;
+ }
+
+ //! Gets pointer to character data where error happened.
+ //! Ch should be the same as char type of xml_document that produced the error.
+ //! \return Pointer to location within the parsed string where error occured.
+ template<class Ch>
+ Ch *where() const
+ {
+ return reinterpret_cast<Ch *>(m_where);
+ }
+
+ private:
+
+ const char *m_what;
+ void *m_where;
+
+ };
+}
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+// Pool sizes
+
+#ifndef RAPIDXML_STATIC_POOL_SIZE
+ // Size of static memory block of memory_pool.
+ // Define RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.
+ // No dynamic memory allocations are performed by memory_pool until static memory is exhausted.
+ #define RAPIDXML_STATIC_POOL_SIZE (64 * 1024)
+#endif
+
+#ifndef RAPIDXML_DYNAMIC_POOL_SIZE
+ // Size of dynamic memory block of memory_pool.
+ // Define RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.
+ // After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool.
+ #define RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024)
+#endif
+
+#ifndef RAPIDXML_ALIGNMENT
+ // Memory allocation alignment.
+ // Define RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer.
+ // All memory allocations for nodes, attributes and strings will be aligned to this value.
+ // This must be a power of 2 and at least 1, otherwise memory_pool will not work.
+ #define RAPIDXML_ALIGNMENT sizeof(void *)
+#endif
+
+namespace rapidxml
+{
+ // Forward declarations
+ template<class Ch> class xml_node;
+ template<class Ch> class xml_attribute;
+ template<class Ch> class xml_document;
+
+ //! Enumeration listing all node types produced by the parser.
+ //! Use xml_node::type() function to query node type.
+ enum node_type
+ {
+ node_document, //!< A document node. Name and value are empty.
+ node_element, //!< An element node. Name contains element name. Value contains text of first data node.
+ node_data, //!< A data node. Name is empty. Value contains data text.
+ node_cdata, //!< A CDATA node. Name is empty. Value contains data text.
+ node_comment, //!< A comment node. Name is empty. Value contains comment text.
+ node_declaration, //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.
+ node_doctype, //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text.
+ node_pi //!< A PI node. Name contains target. Value contains instructions.
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // Parsing flags
+
+ //! Parse flag instructing the parser to not create data nodes.
+ //! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_no_data_nodes = 0x1;
+
+ //! Parse flag instructing the parser to not use text of first data node as a value of parent element.
+ //! Can be combined with other flags by use of | operator.
+ //! Note that child data nodes of element node take precendence over its value when printing.
+ //! That is, if element has one or more child data nodes <em>and</em> a value, the value will be ignored.
+ //! Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_no_element_values = 0x2;
+
+ //! Parse flag instructing the parser to not place zero terminators after strings in the source text.
+ //! By default zero terminators are placed, modifying source text.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_no_string_terminators = 0x4;
+
+ //! Parse flag instructing the parser to not translate entities in the source text.
+ //! By default entities are translated, modifying source text.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_no_entity_translation = 0x8;
+
+ //! Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters.
+ //! By default, UTF-8 handling is enabled.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_no_utf8 = 0x10;
+
+ //! Parse flag instructing the parser to create XML declaration node.
+ //! By default, declaration node is not created.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_declaration_node = 0x20;
+
+ //! Parse flag instructing the parser to create comments nodes.
+ //! By default, comment nodes are not created.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_comment_nodes = 0x40;
+
+ //! Parse flag instructing the parser to create DOCTYPE node.
+ //! By default, doctype node is not created.
+ //! Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_doctype_node = 0x80;
+
+ //! Parse flag instructing the parser to create PI nodes.
+ //! By default, PI nodes are not created.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_pi_nodes = 0x100;
+
+ //! Parse flag instructing the parser to validate closing tag names.
+ //! If not set, name inside closing tag is irrelevant to the parser.
+ //! By default, closing tags are not validated.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_validate_closing_tags = 0x200;
+
+ //! Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes.
+ //! By default, whitespace is not trimmed.
+ //! This flag does not cause the parser to modify source text.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_trim_whitespace = 0x400;
+
+ //! Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character.
+ //! Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag.
+ //! By default, whitespace is not normalized.
+ //! If this flag is specified, source text will be modified.
+ //! Can be combined with other flags by use of | operator.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_normalize_whitespace = 0x800;
+
+ // Compound flags
+
+ //! Parse flags which represent default behaviour of the parser.
+ //! This is always equal to 0, so that all other flags can be simply ored together.
+ //! Normally there is no need to inconveniently disable flags by anding with their negated (~) values.
+ //! This also means that meaning of each flag is a <i>negation</i> of the default setting.
+ //! For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is <i>enabled</i> by default,
+ //! and using the flag will disable it.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_default = 0;
+
+ //! A combination of parse flags that forbids any modifications of the source text.
+ //! This also results in faster parsing. However, note that the following will occur:
+ //! <ul>
+ //! <li>names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends</li>
+ //! <li>entities will not be translated</li>
+ //! <li>whitespace will not be normalized</li>
+ //! </ul>
+ //! See xml_document::parse() function.
+ const int parse_non_destructive = parse_no_string_terminators | parse_no_entity_translation;
+
+ //! A combination of parse flags resulting in fastest possible parsing, without sacrificing important data.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_fastest = parse_non_destructive | parse_no_data_nodes;
+
+ //! A combination of parse flags resulting in largest amount of data being extracted.
+ //! This usually results in slowest parsing.
+ //! <br><br>
+ //! See xml_document::parse() function.
+ const int parse_full = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags;
+
+ ///////////////////////////////////////////////////////////////////////
+ // Internals
+
+ //! \cond internal
+ namespace internal
+ {
+
+ // Struct that contains lookup tables for the parser
+ // It must be a template to allow correct linking (because it has static data members, which are defined in a header file).
+ template<int Dummy>
+ struct lookup_tables
+ {
+ static const unsigned char lookup_whitespace[256]; // Whitespace table
+ static const unsigned char lookup_node_name[256]; // Node name table
+ static const unsigned char lookup_text[256]; // Text table
+ static const unsigned char lookup_text_pure_no_ws[256]; // Text table
+ static const unsigned char lookup_text_pure_with_ws[256]; // Text table
+ static const unsigned char lookup_attribute_name[256]; // Attribute name table
+ static const unsigned char lookup_attribute_data_1[256]; // Attribute data table with single quote
+ static const unsigned char lookup_attribute_data_1_pure[256]; // Attribute data table with single quote
+ static const unsigned char lookup_attribute_data_2[256]; // Attribute data table with double quotes
+ static const unsigned char lookup_attribute_data_2_pure[256]; // Attribute data table with double quotes
+ static const unsigned char lookup_digits[256]; // Digits
+ static const unsigned char lookup_upcase[256]; // To uppercase conversion table for ASCII characters
+ };
+
+ // Find length of the string
+ template<class Ch>
+ inline std::size_t measure(const Ch *p)
+ {
+ const Ch *tmp = p;
+ while (*tmp)
+ ++tmp;
+ return tmp - p;
+ }
+
+ // Compare strings for equality
+ template<class Ch>
+ inline bool compare(const Ch *p1, std::size_t size1, const Ch *p2, std::size_t size2, bool case_sensitive)
+ {
+ if (size1 != size2)
+ return false;
+ if (case_sensitive)
+ {
+ for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2)
+ if (*p1 != *p2)
+ return false;
+ }
+ else
+ {
+ for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2)
+ if (lookup_tables<0>::lookup_upcase[static_cast<unsigned char>(*p1)] != lookup_tables<0>::lookup_upcase[static_cast<unsigned char>(*p2)])
+ return false;
+ }
+ return true;
+ }
+ }
+ //! \endcond
+
+ ///////////////////////////////////////////////////////////////////////
+ // Memory pool
+
+ //! This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation.
+ //! In most cases, you will not need to use this class directly.
+ //! However, if you need to create nodes manually or modify names/values of nodes,
+ //! you are encouraged to use memory_pool of relevant xml_document to allocate the memory.
+ //! Not only is this faster than allocating them by using <code>new</code> operator,
+ //! but also their lifetime will be tied to the lifetime of document,
+ //! possibly simplyfing memory management.
+ //! <br><br>
+ //! Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool.
+ //! You can also call allocate_string() function to allocate strings.
+ //! Such strings can then be used as names or values of nodes without worrying about their lifetime.
+ //! Note that there is no <code>free()</code> function -- all allocations are freed at once when clear() function is called,
+ //! or when the pool is destroyed.
+ //! <br><br>
+ //! It is also possible to create a standalone memory_pool, and use it
+ //! to allocate nodes, whose lifetime will not be tied to any document.
+ //! <br><br>
+ //! Pool maintains <code>RAPIDXML_STATIC_POOL_SIZE</code> bytes of statically allocated memory.
+ //! Until static memory is exhausted, no dynamic memory allocations are done.
+ //! When static memory is exhausted, pool allocates additional blocks of memory of size <code>RAPIDXML_DYNAMIC_POOL_SIZE</code> each,
+ //! by using global <code>new[]</code> and <code>delete[]</code> operators.
+ //! This behaviour can be changed by setting custom allocation routines.
+ //! Use set_allocator() function to set them.
+ //! <br><br>
+ //! Allocations for nodes, attributes and strings are aligned at <code>RAPIDXML_ALIGNMENT</code> bytes.
+ //! This value defaults to the size of pointer on target architecture.
+ //! <br><br>
+ //! To obtain absolutely top performance from the parser,
+ //! it is important that all nodes are allocated from a single, contiguous block of memory.
+ //! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably.
+ //! If required, you can tweak <code>RAPIDXML_STATIC_POOL_SIZE</code>, <code>RAPIDXML_DYNAMIC_POOL_SIZE</code> and <code>RAPIDXML_ALIGNMENT</code>
+ //! to obtain best wasted memory to performance compromise.
+ //! To do it, define their values before rapidxml.hpp file is included.
+ //! \param Ch Character type of created nodes.
+ template<class Ch = char>
+ class memory_pool
+ {
+
+ public:
+
+ //! \cond internal
+ typedef void *(alloc_func)(std::size_t); // Type of user-defined function used to allocate memory
+ typedef void (free_func)(void *); // Type of user-defined function used to free memory
+ //! \endcond
+
+ //! Constructs empty pool with default allocator functions.
+ memory_pool()
+ : m_alloc_func(0)
+ , m_free_func(0)
+ {
+ init();
+ }
+
+ //! Destroys pool and frees all the memory.
+ //! This causes memory occupied by nodes allocated by the pool to be freed.
+ //! Nodes allocated from the pool are no longer valid.
+ ~memory_pool()
+ {
+ clear();
+ }
+
+ //! Allocates a new node from the pool, and optionally assigns name and value to it.
+ //! If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>.
+ //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function
+ //! will call rapidxml::parse_error_handler() function.
+ //! \param type Type of node to create.
+ //! \param name Name to assign to the node, or 0 to assign no name.
+ //! \param value Value to assign to the node, or 0 to assign no value.
+ //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string.
+ //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string.
+ //! \return Pointer to allocated node. This pointer will never be NULL.
+ xml_node<Ch> *allocate_node(node_type type,
+ const Ch *name = 0, const Ch *value = 0,
+ std::size_t name_size = 0, std::size_t value_size = 0)
+ {
+ void *memory = allocate_aligned(sizeof(xml_node<Ch>));
+ xml_node<Ch> *node = new(memory) xml_node<Ch>(type);
+ if (name)
+ {
+ if (name_size > 0)
+ node->name(name, name_size);
+ else
+ node->name(name);
+ }
+ if (value)
+ {
+ if (value_size > 0)
+ node->value(value, value_size);
+ else
+ node->value(value);
+ }
+ return node;
+ }
+
+ //! Allocates a new attribute from the pool, and optionally assigns name and value to it.
+ //! If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>.
+ //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function
+ //! will call rapidxml::parse_error_handler() function.
+ //! \param name Name to assign to the attribute, or 0 to assign no name.
+ //! \param value Value to assign to the attribute, or 0 to assign no value.
+ //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string.
+ //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string.
+ //! \return Pointer to allocated attribute. This pointer will never be NULL.
+ xml_attribute<Ch> *allocate_attribute(const Ch *name = 0, const Ch *value = 0,
+ std::size_t name_size = 0, std::size_t value_size = 0)
+ {
+ void *memory = allocate_aligned(sizeof(xml_attribute<Ch>));
+ xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;
+ if (name)
+ {
+ if (name_size > 0)
+ attribute->name(name, name_size);
+ else
+ attribute->name(name);
+ }
+ if (value)
+ {
+ if (value_size > 0)
+ attribute->value(value, value_size);
+ else
+ attribute->value(value);
+ }
+ return attribute;
+ }
+
+ //! Allocates a char array of given size from the pool, and optionally copies a given string to it.
+ //! If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>.
+ //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function
+ //! will call rapidxml::parse_error_handler() function.
+ //! \param source String to initialize the allocated memory with, or 0 to not initialize it.
+ //! \param size Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated.
+ //! \return Pointer to allocated char array. This pointer will never be NULL.
+ Ch *allocate_string(const Ch *source = 0, std::size_t size = 0)
+ {
+ assert(source || size); // Either source or size (or both) must be specified
+ if (size == 0)
+ size = internal::measure(source) + 1;
+ Ch *result = static_cast<Ch *>(allocate_aligned(size * sizeof(Ch)));
+ if (source)
+ for (std::size_t i = 0; i < size; ++i)
+ result[i] = source[i];
+ return result;
+ }
+
+ //! Clones an xml_node and its hierarchy of child nodes and attributes.
+ //! Nodes and attributes are allocated from this memory pool.
+ //! Names and values are not cloned, they are shared between the clone and the source.
+ //! Result node can be optionally specified as a second parameter,
+ //! in which case its contents will be replaced with cloned source node.
+ //! This is useful when you want to clone entire document.
+ //! \param source Node to clone.
+ //! \param result Node to put results in, or 0 to automatically allocate result node
+ //! \return Pointer to cloned node. This pointer will never be NULL.
+ xml_node<Ch> *clone_node(const xml_node<Ch> *source, xml_node<Ch> *result = 0)
+ {
+ // Prepare result node
+ if (result)
+ {
+ result->remove_all_attributes();
+ result->remove_all_nodes();
+ result->type(source->type());
+ }
+ else
+ result = allocate_node(source->type());
+
+ // Clone name and value
+ result->name(source->name(), source->name_size());
+ result->value(source->value(), source->value_size());
+
+ // Clone child nodes and attributes
+ for (xml_node<Ch> *child = source->first_node(); child; child = child->next_sibling())
+ result->append_node(clone_node(child));
+ for (xml_attribute<Ch> *attr = source->first_attribute(); attr; attr = attr->next_attribute())
+ result->append_attribute(allocate_attribute(attr->name(), attr->value(), attr->name_size(), attr->value_size()));
+
+ return result;
+ }
+
+ //! Clears the pool.
+ //! This causes memory occupied by nodes allocated by the pool to be freed.
+ //! Any nodes or strings allocated from the pool will no longer be valid.
+ void clear()
+ {
+ while (m_begin != m_static_memory)
+ {
+ char *previous_begin = reinterpret_cast<header *>(align(m_begin))->previous_begin;
+ if (m_free_func)
+ m_free_func(m_begin);
+ else
+ delete[] m_begin;
+ m_begin = previous_begin;
+ }
+ init();
+ }
+
+ //! Sets or resets the user-defined memory allocation functions for the pool.
+ //! This can only be called when no memory is allocated from the pool yet, otherwise results are undefined.
+ //! Allocation function must not return invalid pointer on failure. It should either throw,
+ //! stop the program, or use <code>longjmp()</code> function to pass control to other place of program.
+ //! If it returns invalid pointer, results are undefined.
+ //! <br><br>
+ //! User defined allocation functions must have the following forms:
+ //! <br><code>
+ //! <br>void *allocate(std::size_t size);
+ //! <br>void free(void *pointer);
+ //! </code><br>
+ //! \param af Allocation function, or 0 to restore default function
+ //! \param ff Free function, or 0 to restore default function
+ void set_allocator(alloc_func *af, free_func *ff)
+ {
+ assert(m_begin == m_static_memory && m_ptr == align(m_begin)); // Verify that no memory is allocated yet
+ m_alloc_func = af;
+ m_free_func = ff;
+ }
+
+ private:
+
+ struct header
+ {
+ char *previous_begin;
+ };
+
+ void init()
+ {
+ m_begin = m_static_memory;
+ m_ptr = align(m_begin);
+ m_end = m_static_memory + sizeof(m_static_memory);
+ }
+
+ char *align(char *ptr)
+ {
+ std::size_t alignment = ((RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (RAPIDXML_ALIGNMENT - 1))) & (RAPIDXML_ALIGNMENT - 1));
+ return ptr + alignment;
+ }
+
+ char *allocate_raw(std::size_t size)
+ {
+ // Allocate
+ void *memory;
+ if (m_alloc_func) // Allocate memory using either user-specified allocation function or global operator new[]
+ {
+ memory = m_alloc_func(size);
+ assert(memory); // Allocator is not allowed to return 0, on failure it must either throw, stop the program or use longjmp
+ }
+ else
+ {
+ memory = new char[size];
+#ifdef RAPIDXML_NO_EXCEPTIONS
+ if (!memory) // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc
+ RAPIDXML_PARSE_ERROR("out of memory", 0);
+#endif
+ }
+ return static_cast<char *>(memory);
+ }
+
+ void *allocate_aligned(std::size_t size)
+ {
+ // Calculate aligned pointer
+ char *result = align(m_ptr);
+
+ // If not enough memory left in current pool, allocate a new pool
+ if (result + size > m_end)
+ {
+ // Calculate required pool size (may be bigger than RAPIDXML_DYNAMIC_POOL_SIZE)
+ std::size_t pool_size = RAPIDXML_DYNAMIC_POOL_SIZE;
+ if (pool_size < size)
+ pool_size = size;
+
+ // Allocate
+ std::size_t alloc_size = sizeof(header) + (2 * RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation
+ char *raw_memory = allocate_raw(alloc_size);
+
+ // Setup new pool in allocated memory
+ char *pool = align(raw_memory);
+ header *new_header = reinterpret_cast<header *>(pool);
+ new_header->previous_begin = m_begin;
+ m_begin = raw_memory;
+ m_ptr = pool + sizeof(header);
+ m_end = raw_memory + alloc_size;
+
+ // Calculate aligned pointer again using new pool
+ result = align(m_ptr);
+ }
+
+ // Update pool and return aligned pointer
+ m_ptr = result + size;
+ return result;
+ }
+
+ char *m_begin; // Start of raw memory making up current pool
+ char *m_ptr; // First free byte in current pool
+ char *m_end; // One past last available byte in current pool
+ char m_static_memory[RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory
+ alloc_func *m_alloc_func; // Allocator function, or 0 if default is to be used
+ free_func *m_free_func; // Free function, or 0 if default is to be used
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // XML base
+
+ //! Base class for xml_node and xml_attribute implementing common functions:
+ //! name(), name_size(), value(), value_size() and parent().
+ //! \param Ch Character type to use
+ template<class Ch = char>
+ class xml_base
+ {
+
+ public:
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Construction & destruction
+
+ // Construct a base with empty name, value and parent
+ xml_base()
+ : m_name(0)
+ , m_value(0)
+ , m_parent(0)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Node data access
+
+ //! Gets name of the node.
+ //! Interpretation of name depends on type of node.
+ //! Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.
+ //! <br><br>
+ //! Use name_size() function to determine length of the name.
+ //! \return Name of node, or empty string if node has no name.
+ Ch *name() const
+ {
+ return m_name ? m_name : nullstr();
+ }
+
+ //! Gets size of node name, not including terminator character.
+ //! This function works correctly irrespective of whether name is or is not zero terminated.
+ //! \return Size of node name, in characters.
+ std::size_t name_size() const
+ {
+ return m_name ? m_name_size : 0;
+ }
+
+ //! Gets value of node.
+ //! Interpretation of value depends on type of node.
+ //! Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.
+ //! <br><br>
+ //! Use value_size() function to determine length of the value.
+ //! \return Value of node, or empty string if node has no value.
+ Ch *value() const
+ {
+ return m_value ? m_value : nullstr();
+ }
+
+ //! Gets size of node value, not including terminator character.
+ //! This function works correctly irrespective of whether value is or is not zero terminated.
+ //! \return Size of node value, in characters.
+ std::size_t value_size() const
+ {
+ return m_value ? m_value_size : 0;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Node modification
+
+ //! Sets name of node to a non zero-terminated string.
+ //! See \ref ownership_of_strings.
+ //! <br><br>
+ //! Note that node does not own its name or value, it only stores a pointer to it.
+ //! It will not delete or otherwise free the pointer on destruction.
+ //! It is reponsibility of the user to properly manage lifetime of the string.
+ //! The easiest way to achieve it is to use memory_pool of the document to allocate the string -
+ //! on destruction of the document the string will be automatically freed.
+ //! <br><br>
+ //! Size of name must be specified separately, because name does not have to be zero terminated.
+ //! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated).
+ //! \param name Name of node to set. Does not have to be zero terminated.
+ //! \param size Size of name, in characters. This does not include zero terminator, if one is present.
+ void name(const Ch *name, std::size_t size)
+ {
+ m_name = const_cast<Ch *>(name);
+ m_name_size = size;
+ }
+
+ //! Sets name of node to a zero-terminated string.
+ //! See also \ref ownership_of_strings and xml_node::name(const Ch *, std::size_t).
+ //! \param name Name of node to set. Must be zero terminated.
+ void name(const Ch *name)
+ {
+ this->name(name, internal::measure(name));
+ }
+
+ //! Sets value of node to a non zero-terminated string.
+ //! See \ref ownership_of_strings.
+ //! <br><br>
+ //! Note that node does not own its name or value, it only stores a pointer to it.
+ //! It will not delete or otherwise free the pointer on destruction.
+ //! It is reponsibility of the user to properly manage lifetime of the string.
+ //! The easiest way to achieve it is to use memory_pool of the document to allocate the string -
+ //! on destruction of the document the string will be automatically freed.
+ //! <br><br>
+ //! Size of value must be specified separately, because it does not have to be zero terminated.
+ //! Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated).
+ //! <br><br>
+ //! If an element has a child node of type node_data, it will take precedence over element value when printing.
+ //! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser.
+ //! \param value value of node to set. Does not have to be zero terminated.
+ //! \param size Size of value, in characters. This does not include zero terminator, if one is present.
+ void value(const Ch *value, std::size_t size)
+ {
+ m_value = const_cast<Ch *>(value);
+ m_value_size = size;
+ }
+
+ //! Sets value of node to a zero-terminated string.
+ //! See also \ref ownership_of_strings and xml_node::value(const Ch *, std::size_t).
+ //! \param value Vame of node to set. Must be zero terminated.
+ void value(const Ch *value)
+ {
+ this->value(value, internal::measure(value));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Related nodes access
+
+ //! Gets node parent.
+ //! \return Pointer to parent node, or 0 if there is no parent.
+ xml_node<Ch> *parent() const
+ {
+ return m_parent;
+ }
+
+ protected:
+
+ // Return empty string
+ static Ch *nullstr()
+ {
+ static Ch zero = Ch('\0');
+ return &zero;
+ }
+
+ Ch *m_name; // Name of node, or 0 if no name
+ Ch *m_value; // Value of node, or 0 if no value
+ std::size_t m_name_size; // Length of node name, or undefined of no name
+ std::size_t m_value_size; // Length of node value, or undefined if no value
+ xml_node<Ch> *m_parent; // Pointer to parent node, or 0 if none
+
+ };
+
+ //! Class representing attribute node of XML document.
+ //! Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base).
+ //! Note that after parse, both name and value of attribute will point to interior of source text used for parsing.
+ //! Thus, this text must persist in memory for the lifetime of attribute.
+ //! \param Ch Character type to use.
+ template<class Ch = char>
+ class xml_attribute: public xml_base<Ch>
+ {
+
+ friend class xml_node<Ch>;
+
+ public:
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Construction & destruction
+
+ //! Constructs an empty attribute with the specified type.
+ //! Consider using memory_pool of appropriate xml_document if allocating attributes manually.
+ xml_attribute()
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Related nodes access
+
+ //! Gets document of which attribute is a child.
+ //! \return Pointer to document that contains this attribute, or 0 if there is no parent document.
+ xml_document<Ch> *document() const
+ {
+ if (xml_node<Ch> *node = this->parent())
+ {
+ while (node->parent())
+ node = node->parent();
+ return node->type() == node_document ? static_cast<xml_document<Ch> *>(node) : 0;
+ }
+ else
+ return 0;
+ }
+
+ //! Gets previous attribute, optionally matching attribute name.
+ //! \param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found attribute, or 0 if not found.
+ xml_attribute<Ch> *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_attribute<Ch> *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute)
+ if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ return attribute;
+ return 0;
+ }
+ else
+ return this->m_parent ? m_prev_attribute : 0;
+ }
+
+ //! Gets next attribute, optionally matching attribute name.
+ //! \param name Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found attribute, or 0 if not found.
+ xml_attribute<Ch> *next_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_attribute<Ch> *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute)
+ if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ return attribute;
+ return 0;
+ }
+ else
+ return this->m_parent ? m_next_attribute : 0;
+ }
+
+ private:
+
+ xml_attribute<Ch> *m_prev_attribute; // Pointer to previous sibling of attribute, or 0 if none; only valid if parent is non-zero
+ xml_attribute<Ch> *m_next_attribute; // Pointer to next sibling of attribute, or 0 if none; only valid if parent is non-zero
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // XML node
+
+ //! Class representing a node of XML document.
+ //! Each node may have associated name and value strings, which are available through name() and value() functions.
+ //! Interpretation of name and value depends on type of the node.
+ //! Type of node can be determined by using type() function.
+ //! <br><br>
+ //! Note that after parse, both name and value of node, if any, will point interior of source text used for parsing.
+ //! Thus, this text must persist in the memory for the lifetime of node.
+ //! \param Ch Character type to use.
+ template<class Ch = char>
+ class xml_node: public xml_base<Ch>
+ {
+
+ public:
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Construction & destruction
+
+ //! Constructs an empty node with the specified type.
+ //! Consider using memory_pool of appropriate document to allocate nodes manually.
+ //! \param type Type of node to construct.
+ xml_node(node_type type)
+ : m_type(type)
+ , m_first_node(0)
+ , m_first_attribute(0)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Node data access
+
+ //! Gets type of node.
+ //! \return Type of node.
+ node_type type() const
+ {
+ return m_type;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Related nodes access
+
+ //! Gets document of which node is a child.
+ //! \return Pointer to document that contains this node, or 0 if there is no parent document.
+ xml_document<Ch> *document() const
+ {
+ xml_node<Ch> *node = const_cast<xml_node<Ch> *>(this);
+ while (node->parent())
+ node = node->parent();
+ return node->type() == node_document ? static_cast<xml_document<Ch> *>(node) : 0;
+ }
+
+ //! Gets first child node, optionally matching node name.
+ //! \param name Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found child, or 0 if not found.
+ xml_node<Ch> *first_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_node<Ch> *child = m_first_node; child; child = child->next_sibling())
+ if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive))
+ return child;
+ return 0;
+ }
+ else
+ return m_first_node;
+ }
+
+ //! Gets last child node, optionally matching node name.
+ //! Behaviour is undefined if node has no children.
+ //! Use first_node() to test if node has children.
+ //! \param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found child, or 0 if not found.
+ xml_node<Ch> *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ assert(m_first_node); // Cannot query for last child if node has no children
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_node<Ch> *child = m_last_node; child; child = child->previous_sibling())
+ if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive))
+ return child;
+ return 0;
+ }
+ else
+ return m_last_node;
+ }
+
+ //! Gets previous sibling node, optionally matching node name.
+ //! Behaviour is undefined if node has no parent.
+ //! Use parent() to test if node has a parent.
+ //! \param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found sibling, or 0 if not found.
+ xml_node<Ch> *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ assert(this->m_parent); // Cannot query for siblings if node has no parent
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_node<Ch> *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling)
+ if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))
+ return sibling;
+ return 0;
+ }
+ else
+ return m_prev_sibling;
+ }
+
+ //! Gets next sibling node, optionally matching node name.
+ //! Behaviour is undefined if node has no parent.
+ //! Use parent() to test if node has a parent.
+ //! \param name Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found sibling, or 0 if not found.
+ xml_node<Ch> *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ assert(this->m_parent); // Cannot query for siblings if node has no parent
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_node<Ch> *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling)
+ if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))
+ return sibling;
+ return 0;
+ }
+ else
+ return m_next_sibling;
+ }
+
+ //! Gets first attribute of node, optionally matching attribute name.
+ //! \param name Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found attribute, or 0 if not found.
+ xml_attribute<Ch> *first_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_attribute<Ch> *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute)
+ if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ return attribute;
+ return 0;
+ }
+ else
+ return m_first_attribute;
+ }
+
+ //! Gets last attribute of node, optionally matching attribute name.
+ //! \param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
+ //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
+ //! \return Pointer to found attribute, or 0 if not found.
+ xml_attribute<Ch> *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ {
+ if (name)
+ {
+ if (name_size == 0)
+ name_size = internal::measure(name);
+ for (xml_attribute<Ch> *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute)
+ if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ return attribute;
+ return 0;
+ }
+ else
+ return m_first_attribute ? m_last_attribute : 0;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Node modification
+
+ //! Sets type of node.
+ //! \param type Type of node to set.
+ void type(node_type type)
+ {
+ m_type = type;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Node manipulation
+
+ //! Prepends a new child node.
+ //! The prepended child becomes the first child, and all existing children are moved one position back.
+ //! \param child Node to prepend.
+ void prepend_node(xml_node<Ch> *child)
+ {
+ assert(child && !child->parent() && child->type() != node_document);
+ if (first_node())
+ {
+ child->m_next_sibling = m_first_node;
+ m_first_node->m_prev_sibling = child;
+ }
+ else
+ {
+ child->m_next_sibling = 0;
+ m_last_node = child;
+ }
+ m_first_node = child;
+ child->m_parent = this;
+ child->m_prev_sibling = 0;
+ }
+
+ //! Appends a new child node.
+ //! The appended child becomes the last child.
+ //! \param child Node to append.
+ void append_node(xml_node<Ch> *child)
+ {
+ assert(child && !child->parent() && child->type() != node_document);
+ if (first_node())
+ {
+ child->m_prev_sibling = m_last_node;
+ m_last_node->m_next_sibling = child;
+ }
+ else
+ {
+ child->m_prev_sibling = 0;
+ m_first_node = child;
+ }
+ m_last_node = child;
+ child->m_parent = this;
+ child->m_next_sibling = 0;
+ }
+
+ //! Inserts a new child node at specified place inside the node.
+ //! All children after and including the specified node are moved one position back.
+ //! \param where Place where to insert the child, or 0 to insert at the back.
+ //! \param child Node to insert.
+ void insert_node(xml_node<Ch> *where, xml_node<Ch> *child)
+ {
+ assert(!where || where->parent() == this);
+ assert(child && !child->parent() && child->type() != node_document);
+ if (where == m_first_node)
+ prepend_node(child);
+ else if (where == 0)
+ append_node(child);
+ else
+ {
+ child->m_prev_sibling = where->m_prev_sibling;
+ child->m_next_sibling = where;
+ where->m_prev_sibling->m_next_sibling = child;
+ where->m_prev_sibling = child;
+ child->m_parent = this;
+ }
+ }
+
+ //! Removes first child node.
+ //! If node has no children, behaviour is undefined.
+ //! Use first_node() to test if node has children.
+ void remove_first_node()
+ {
+ assert(first_node());
+ xml_node<Ch> *child = m_first_node;
+ m_first_node = child->m_next_sibling;
+ if (child->m_next_sibling)
+ child->m_next_sibling->m_prev_sibling = 0;
+ else
+ m_last_node = 0;
+ child->m_parent = 0;
+ }
+
+ //! Removes last child of the node.
+ //! If node has no children, behaviour is undefined.
+ //! Use first_node() to test if node has children.
+ void remove_last_node()
+ {
+ assert(first_node());
+ xml_node<Ch> *child = m_last_node;
+ if (child->m_prev_sibling)
+ {
+ m_last_node = child->m_prev_sibling;
+ child->m_prev_sibling->m_next_sibling = 0;
+ }
+ else
+ m_first_node = 0;
+ child->m_parent = 0;
+ }
+
+ //! Removes specified child from the node
+ // \param where Pointer to child to be removed.
+ void remove_node(xml_node<Ch> *where)
+ {
+ assert(where && where->parent() == this);
+ assert(first_node());
+ if (where == m_first_node)
+ remove_first_node();
+ else if (where == m_last_node)
+ remove_last_node();
+ else
+ {
+ where->m_prev_sibling->m_next_sibling = where->m_next_sibling;
+ where->m_next_sibling->m_prev_sibling = where->m_prev_sibling;
+ where->m_parent = 0;
+ }
+ }
+
+ //! Removes all child nodes (but not attributes).
+ void remove_all_nodes()
+ {
+ for (xml_node<Ch> *node = first_node(); node; node = node->m_next_sibling)
+ node->m_parent = 0;
+ m_first_node = 0;
+ }
+
+ //! Prepends a new attribute to the node.
+ //! \param attribute Attribute to prepend.
+ void prepend_attribute(xml_attribute<Ch> *attribute)
+ {
+ assert(attribute && !attribute->parent());
+ if (first_attribute())
+ {
+ attribute->m_next_attribute = m_first_attribute;
+ m_first_attribute->m_prev_attribute = attribute;
+ }
+ else
+ {
+ attribute->m_next_attribute = 0;
+ m_last_attribute = attribute;
+ }
+ m_first_attribute = attribute;
+ attribute->m_parent = this;
+ attribute->m_prev_attribute = 0;
+ }
+
+ //! Appends a new attribute to the node.
+ //! \param attribute Attribute to append.
+ void append_attribute(xml_attribute<Ch> *attribute)
+ {
+ assert(attribute && !attribute->parent());
+ if (first_attribute())
+ {
+ attribute->m_prev_attribute = m_last_attribute;
+ m_last_attribute->m_next_attribute = attribute;
+ }
+ else
+ {
+ attribute->m_prev_attribute = 0;
+ m_first_attribute = attribute;
+ }
+ m_last_attribute = attribute;
+ attribute->m_parent = this;
+ attribute->m_next_attribute = 0;
+ }
+
+ //! Inserts a new attribute at specified place inside the node.
+ //! All attributes after and including the specified attribute are moved one position back.
+ //! \param where Place where to insert the attribute, or 0 to insert at the back.
+ //! \param attribute Attribute to insert.
+ void insert_attribute(xml_attribute<Ch> *where, xml_attribute<Ch> *attribute)
+ {
+ assert(!where || where->parent() == this);
+ assert(attribute && !attribute->parent());
+ if (where == m_first_attribute)
+ prepend_attribute(attribute);
+ else if (where == 0)
+ append_attribute(attribute);
+ else
+ {
+ attribute->m_prev_attribute = where->m_prev_attribute;
+ attribute->m_next_attribute = where;
+ where->m_prev_attribute->m_next_attribute = attribute;
+ where->m_prev_attribute = attribute;
+ attribute->m_parent = this;
+ }
+ }
+
+ //! Removes first attribute of the node.
+ //! If node has no attributes, behaviour is undefined.
+ //! Use first_attribute() to test if node has attributes.
+ void remove_first_attribute()
+ {
+ assert(first_attribute());
+ xml_attribute<Ch> *attribute = m_first_attribute;
+ if (attribute->m_next_attribute)
+ {
+ attribute->m_next_attribute->m_prev_attribute = 0;
+ }
+ else
+ m_last_attribute = 0;
+ attribute->m_parent = 0;
+ m_first_attribute = attribute->m_next_attribute;
+ }
+
+ //! Removes last attribute of the node.
+ //! If node has no attributes, behaviour is undefined.
+ //! Use first_attribute() to test if node has attributes.
+ void remove_last_attribute()
+ {
+ assert(first_attribute());
+ xml_attribute<Ch> *attribute = m_last_attribute;
+ if (attribute->m_prev_attribute)
+ {
+ attribute->m_prev_attribute->m_next_attribute = 0;
+ m_last_attribute = attribute->m_prev_attribute;
+ }
+ else
+ m_first_attribute = 0;
+ attribute->m_parent = 0;
+ }
+
+ //! Removes specified attribute from node.
+ //! \param where Pointer to attribute to be removed.
+ void remove_attribute(xml_attribute<Ch> *where)
+ {
+ assert(first_attribute() && where->parent() == this);
+ if (where == m_first_attribute)
+ remove_first_attribute();
+ else if (where == m_last_attribute)
+ remove_last_attribute();
+ else
+ {
+ where->m_prev_attribute->m_next_attribute = where->m_next_attribute;
+ where->m_next_attribute->m_prev_attribute = where->m_prev_attribute;
+ where->m_parent = 0;
+ }
+ }
+
+ //! Removes all attributes of node.
+ void remove_all_attributes()
+ {
+ for (xml_attribute<Ch> *attribute = first_attribute(); attribute; attribute = attribute->m_next_attribute)
+ attribute->m_parent = 0;
+ m_first_attribute = 0;
+ }
+
+ private:
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Restrictions
+
+ // No copying
+ xml_node(const xml_node &);
+ void operator =(const xml_node &);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Data members
+
+ // Note that some of the pointers below have UNDEFINED values if certain other pointers are 0.
+ // This is required for maximum performance, as it allows the parser to omit initialization of
+ // unneded/redundant values.
+ //
+ // The rules are as follows:
+ // 1. first_node and first_attribute contain valid pointers, or 0 if node has no children/attributes respectively
+ // 2. last_node and last_attribute are valid only if node has at least one child/attribute respectively, otherwise they contain garbage
+ // 3. prev_sibling and next_sibling are valid only if node has a parent, otherwise they contain garbage
+
+ node_type m_type; // Type of node; always valid
+ xml_node<Ch> *m_first_node; // Pointer to first child node, or 0 if none; always valid
+ xml_node<Ch> *m_last_node; // Pointer to last child node, or 0 if none; this value is only valid if m_first_node is non-zero
+ xml_attribute<Ch> *m_first_attribute; // Pointer to first attribute of node, or 0 if none; always valid
+ xml_attribute<Ch> *m_last_attribute; // Pointer to last attribute of node, or 0 if none; this value is only valid if m_first_attribute is non-zero
+ xml_node<Ch> *m_prev_sibling; // Pointer to previous sibling of node, or 0 if none; this value is only valid if m_parent is non-zero
+ xml_node<Ch> *m_next_sibling; // Pointer to next sibling of node, or 0 if none; this value is only valid if m_parent is non-zero
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // XML document
+
+ //! This class represents root of the DOM hierarchy.
+ //! It is also an xml_node and a memory_pool through public inheritance.
+ //! Use parse() function to build a DOM tree from a zero-terminated XML text string.
+ //! parse() function allocates memory for nodes and attributes by using functions of xml_document,
+ //! which are inherited from memory_pool.
+ //! To access root node of the document, use the document itself, as if it was an xml_node.
+ //! \param Ch Character type to use.
+ template<class Ch = char>
+ class xml_document: public xml_node<Ch>, public memory_pool<Ch>
+ {
+
+ public:
+
+ //! Constructs empty XML document
+ xml_document()
+ : xml_node<Ch>(node_document)
+ {
+ }
+
+ //! Parses zero-terminated XML string according to given flags.
+ //! Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used.
+ //! The string must persist for the lifetime of the document.
+ //! In case of error, rapidxml::parse_error exception will be thrown.
+ //! <br><br>
+ //! If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning.
+ //! Make sure that data is zero-terminated.
+ //! <br><br>
+ //! Document can be parsed into multiple times.
+ //! Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool.
+ //! \param text XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser.
+ template<int Flags>
+ void parse(Ch *text)
+ {
+ assert(text);
+
+ // Remove current contents
+ this->remove_all_nodes();
+ this->remove_all_attributes();
+
+ // Parse BOM, if any
+ parse_bom<Flags>(text);
+
+ // Parse children
+ while (1)
+ {
+ // Skip whitespace before node
+ skip<whitespace_pred, Flags>(text);
+ if (*text == 0)
+ break;
+
+ // Parse and append new child
+ if (*text == Ch('<'))
+ {
+ ++text; // Skip '<'
+ if (xml_node<Ch> *node = parse_node<Flags>(text))
+ this->append_node(node);
+ }
+ else
+ RAPIDXML_PARSE_ERROR("expected <", text);
+ }
+
+ }
+
+ //! Clears the document by deleting all nodes and clearing the memory pool.
+ //! All nodes owned by document pool are destroyed.
+ void clear()
+ {
+ this->remove_all_nodes();
+ this->remove_all_attributes();
+ memory_pool<Ch>::clear();
+ }
+
+ private:
+
+ ///////////////////////////////////////////////////////////////////////
+ // Internal character utility functions
+
+ // Detect whitespace character
+ struct whitespace_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ return internal::lookup_tables<0>::lookup_whitespace[static_cast<unsigned char>(ch)];
+ }
+ };
+
+ // Detect node name character
+ struct node_name_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ return internal::lookup_tables<0>::lookup_node_name[static_cast<unsigned char>(ch)];
+ }
+ };
+
+ // Detect attribute name character
+ struct attribute_name_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ return internal::lookup_tables<0>::lookup_attribute_name[static_cast<unsigned char>(ch)];
+ }
+ };
+
+ // Detect text character (PCDATA)
+ struct text_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ return internal::lookup_tables<0>::lookup_text[static_cast<unsigned char>(ch)];
+ }
+ };
+
+ // Detect text character (PCDATA) that does not require processing
+ struct text_pure_no_ws_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast<unsigned char>(ch)];
+ }
+ };
+
+ // Detect text character (PCDATA) that does not require processing
+ struct text_pure_with_ws_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast<unsigned char>(ch)];
+ }
+ };
+
+ // Detect attribute value character
+ template<Ch Quote>
+ struct attribute_value_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ if (Quote == Ch('\''))
+ return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast<unsigned char>(ch)];
+ if (Quote == Ch('\"'))
+ return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast<unsigned char>(ch)];
+ return 0; // Should never be executed, to avoid warnings on Comeau
+ }
+ };
+
+ // Detect attribute value character
+ template<Ch Quote>
+ struct attribute_value_pure_pred
+ {
+ static unsigned char test(Ch ch)
+ {
+ if (Quote == Ch('\''))
+ return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast<unsigned char>(ch)];
+ if (Quote == Ch('\"'))
+ return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast<unsigned char>(ch)];
+ return 0; // Should never be executed, to avoid warnings on Comeau
+ }
+ };
+
+ // Insert coded character, using UTF8 or 8-bit ASCII
+ template<int Flags>
+ static void insert_coded_character(Ch *&text, unsigned long code)
+ {
+ if (Flags & parse_no_utf8)
+ {
+ // Insert 8-bit ASCII character
+ // Todo: possibly verify that code is less than 256 and use replacement char otherwise?
+ text[0] = static_cast<unsigned char>(code);
+ text += 1;
+ }
+ else
+ {
+ // Insert UTF8 sequence
+ if (code < 0x80) // 1 byte sequence
+ {
+ text[0] = static_cast<unsigned char>(code);
+ text += 1;
+ }
+ else if (code < 0x800) // 2 byte sequence
+ {
+ text[1] = static_cast<unsigned char>((code | 0x80) & 0xBF); code >>= 6;
+ text[0] = static_cast<unsigned char>(code | 0xC0);
+ text += 2;
+ }
+ else if (code < 0x10000) // 3 byte sequence
+ {
+ text[2] = static_cast<unsigned char>((code | 0x80) & 0xBF); code >>= 6;
+ text[1] = static_cast<unsigned char>((code | 0x80) & 0xBF); code >>= 6;
+ text[0] = static_cast<unsigned char>(code | 0xE0);
+ text += 3;
+ }
+ else if (code < 0x110000) // 4 byte sequence
+ {
+ text[3] = static_cast<unsigned char>((code | 0x80) & 0xBF); code >>= 6;
+ text[2] = static_cast<unsigned char>((code | 0x80) & 0xBF); code >>= 6;
+ text[1] = static_cast<unsigned char>((code | 0x80) & 0xBF); code >>= 6;
+ text[0] = static_cast<unsigned char>(code | 0xF0);
+ text += 4;
+ }
+ else // Invalid, only codes up to 0x10FFFF are allowed in Unicode
+ {
+ RAPIDXML_PARSE_ERROR("invalid numeric character entity", text);
+ }
+ }
+ }
+
+ // Skip characters until predicate evaluates to true
+ template<class StopPred, int Flags>
+ static void skip(Ch *&text)
+ {
+ Ch *tmp = text;
+ while (StopPred::test(*tmp))
+ ++tmp;
+ text = tmp;
+ }
+
+ // Skip characters until predicate evaluates to true while doing the following:
+ // - replacing XML character entity references with proper characters (&apos; &amp; &quot; &lt; &gt; &#...;)
+ // - condensing whitespace sequences to single space character
+ template<class StopPred, class StopPredPure, int Flags>
+ static Ch *skip_and_expand_character_refs(Ch *&text)
+ {
+ // If entity translation, whitespace condense and whitespace trimming is disabled, use plain skip
+ if (Flags & parse_no_entity_translation &&
+ !(Flags & parse_normalize_whitespace) &&
+ !(Flags & parse_trim_whitespace))
+ {
+ skip<StopPred, Flags>(text);
+ return text;
+ }
+
+ // Use simple skip until first modification is detected
+ skip<StopPredPure, Flags>(text);
+
+ // Use translation skip
+ Ch *src = text;
+ Ch *dest = src;
+ while (StopPred::test(*src))
+ {
+ // If entity translation is enabled
+ if (!(Flags & parse_no_entity_translation))
+ {
+ // Test if replacement is needed
+ if (src[0] == Ch('&'))
+ {
+ switch (src[1])
+ {
+
+ // &amp; &apos;
+ case Ch('a'):
+ if (src[2] == Ch('m') && src[3] == Ch('p') && src[4] == Ch(';'))
+ {
+ *dest = Ch('&');
+ ++dest;
+ src += 5;
+ continue;
+ }
+ if (src[2] == Ch('p') && src[3] == Ch('o') && src[4] == Ch('s') && src[5] == Ch(';'))
+ {
+ *dest = Ch('\'');
+ ++dest;
+ src += 6;
+ continue;
+ }
+ break;
+
+ // &quot;
+ case Ch('q'):
+ if (src[2] == Ch('u') && src[3] == Ch('o') && src[4] == Ch('t') && src[5] == Ch(';'))
+ {
+ *dest = Ch('"');
+ ++dest;
+ src += 6;
+ continue;
+ }
+ break;
+
+ // &gt;
+ case Ch('g'):
+ if (src[2] == Ch('t') && src[3] == Ch(';'))
+ {
+ *dest = Ch('>');
+ ++dest;
+ src += 4;
+ continue;
+ }
+ break;
+
+ // &lt;
+ case Ch('l'):
+ if (src[2] == Ch('t') && src[3] == Ch(';'))
+ {
+ *dest = Ch('<');
+ ++dest;
+ src += 4;
+ continue;
+ }
+ break;
+
+ // &#...; - assumes ASCII
+ case Ch('#'):
+ if (src[2] == Ch('x'))
+ {
+ unsigned long code = 0;
+ src += 3; // Skip &#x
+ while (1)
+ {
+ unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast<unsigned char>(*src)];
+ if (digit == 0xFF)
+ break;
+ code = code * 16 + digit;
+ ++src;
+ }
+ insert_coded_character<Flags>(dest, code); // Put character in output
+ }
+ else
+ {
+ unsigned long code = 0;
+ src += 2; // Skip &#
+ while (1)
+ {
+ unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast<unsigned char>(*src)];
+ if (digit == 0xFF)
+ break;
+ code = code * 10 + digit;
+ ++src;
+ }
+ insert_coded_character<Flags>(dest, code); // Put character in output
+ }
+ if (*src == Ch(';'))
+ ++src;
+ else
+ RAPIDXML_PARSE_ERROR("expected ;", src);
+ continue;
+
+ // Something else
+ default:
+ // Ignore, just copy '&' verbatim
+ break;
+
+ }
+ }
+ }
+
+ // If whitespace condensing is enabled
+ if (Flags & parse_normalize_whitespace)
+ {
+ // Test if condensing is needed
+ if (whitespace_pred::test(*src))
+ {
+ *dest = Ch(' '); ++dest; // Put single space in dest
+ ++src; // Skip first whitespace char
+ // Skip remaining whitespace chars
+ while (whitespace_pred::test(*src))
+ ++src;
+ continue;
+ }
+ }
+
+ // No replacement, only copy character
+ *dest++ = *src++;
+
+ }
+
+ // Return new end
+ text = src;
+ return dest;
+
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Internal parsing functions
+
+ // Parse BOM, if any
+ template<int Flags>
+ void parse_bom(Ch *&text)
+ {
+ // UTF-8?
+ if (static_cast<unsigned char>(text[0]) == 0xEF &&
+ static_cast<unsigned char>(text[1]) == 0xBB &&
+ static_cast<unsigned char>(text[2]) == 0xBF)
+ {
+ text += 3; // Skup utf-8 bom
+ }
+ }
+
+ // Parse XML declaration (<?xml...)
+ template<int Flags>
+ xml_node<Ch> *parse_xml_declaration(Ch *&text)
+ {
+ // If parsing of declaration is disabled
+ if (!(Flags & parse_declaration_node))
+ {
+ // Skip until end of declaration
+ while (text[0] != Ch('?') || text[1] != Ch('>'))
+ {
+ if (!text[0]) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+ text += 2; // Skip '?>'
+ return 0;
+ }
+
+ // Create declaration
+ xml_node<Ch> *declaration = this->allocate_node(node_declaration);
+
+ // Skip whitespace before attributes or ?>
+ skip<whitespace_pred, Flags>(text);
+
+ // Parse declaration attributes
+ parse_node_attributes<Flags>(text, declaration);
+
+ // Skip ?>
+ if (text[0] != Ch('?') || text[1] != Ch('>'))
+ RAPIDXML_PARSE_ERROR("expected ?>", text);
+ text += 2;
+
+ return declaration;
+ }
+
+ // Parse XML comment (<!--...)
+ template<int Flags>
+ xml_node<Ch> *parse_comment(Ch *&text)
+ {
+ // If parsing of comments is disabled
+ if (!(Flags & parse_comment_nodes))
+ {
+ // Skip until end of comment
+ while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>'))
+ {
+ if (!text[0]) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+ text += 3; // Skip '-->'
+ return 0; // Do not produce comment node
+ }
+
+ // Remember value start
+ Ch *value = text;
+
+ // Skip until end of comment
+ while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>'))
+ {
+ if (!text[0]) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+
+ // Create comment node
+ xml_node<Ch> *comment = this->allocate_node(node_comment);
+ comment->value(value, text - value);
+
+ // Place zero terminator after comment value
+ if (!(Flags & parse_no_string_terminators))
+ *text = Ch('\0');
+
+ text += 3; // Skip '-->'
+ return comment;
+ }
+
+ // Parse DOCTYPE
+ template<int Flags>
+ xml_node<Ch> *parse_doctype(Ch *&text)
+ {
+ // Remember value start
+ Ch *value = text;
+
+ // Skip to >
+ while (*text != Ch('>'))
+ {
+ // Determine character type
+ switch (*text)
+ {
+
+ // If '[' encountered, scan for matching ending ']' using naive algorithm with depth
+ // This works for all W3C test files except for 2 most wicked
+ case Ch('['):
+ {
+ ++text; // Skip '['
+ int depth = 1;
+ while (depth > 0)
+ {
+ switch (*text)
+ {
+ case Ch('['): ++depth; break;
+ case Ch(']'): --depth; break;
+ case 0: RAPIDXML_PARSE_ERROR("unexpected end of data", text); return 0;
+ }
+ ++text;
+ }
+ break;
+ }
+
+ // Error on end of text
+ case Ch('\0'):
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+
+ // Other character, skip it
+ default:
+ ++text;
+
+ }
+ }
+
+ // If DOCTYPE nodes enabled
+ if (Flags & parse_doctype_node)
+ {
+ // Create a new doctype node
+ xml_node<Ch> *doctype = this->allocate_node(node_doctype);
+ doctype->value(value, text - value);
+
+ // Place zero terminator after value
+ if (!(Flags & parse_no_string_terminators))
+ *text = Ch('\0');
+
+ text += 1; // skip '>'
+ return doctype;
+ }
+ else
+ {
+ text += 1; // skip '>'
+ return 0;
+ }
+
+ }
+
+ // Parse PI
+ template<int Flags>
+ xml_node<Ch> *parse_pi(Ch *&text)
+ {
+ // If creation of PI nodes is enabled
+ if (Flags & parse_pi_nodes)
+ {
+ // Create pi node
+ xml_node<Ch> *pi = this->allocate_node(node_pi);
+
+ // Extract PI target name
+ Ch *name = text;
+ skip<node_name_pred, Flags>(text);
+ if (text == name)
+ RAPIDXML_PARSE_ERROR("expected PI target", text);
+ pi->name(name, text - name);
+
+ // Skip whitespace between pi target and pi
+ skip<whitespace_pred, Flags>(text);
+
+ // Remember start of pi
+ Ch *value = text;
+
+ // Skip to '?>'
+ while (text[0] != Ch('?') || text[1] != Ch('>'))
+ {
+ if (*text == Ch('\0')) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+
+ // Set pi value (verbatim, no entity expansion or whitespace normalization)
+ pi->value(value, text - value);
+
+ // Place zero terminator after name and value
+ if (!(Flags & parse_no_string_terminators))
+ {
+ pi->name()[pi->name_size()] = Ch('\0');
+ pi->value()[pi->value_size()] = Ch('\0');
+ }
+
+ text += 2; // Skip '?>'
+ return pi;
+ }
+ else
+ {
+ // Skip to '?>'
+ while (text[0] != Ch('?') || text[1] != Ch('>'))
+ {
+ if (*text == Ch('\0')) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+ text += 2; // Skip '?>'
+ return 0;
+ }
+ }
+
+ // Parse and append data
+ // Return character that ends data.
+ // This is necessary because this character might have been overwritten by a terminating 0
+ template<int Flags>
+ Ch parse_and_append_data(xml_node<Ch> *node, Ch *&text, Ch *contents_start)
+ {
+ // Backup to contents start if whitespace trimming is disabled
+ if (!(Flags & parse_trim_whitespace))
+ text = contents_start;
+
+ // Skip until end of data
+ Ch *value = text, *end;
+ if (Flags & parse_normalize_whitespace)
+ end = skip_and_expand_character_refs<text_pred, text_pure_with_ws_pred, Flags>(text);
+ else
+ end = skip_and_expand_character_refs<text_pred, text_pure_no_ws_pred, Flags>(text);
+
+ // Trim trailing whitespace if flag is set; leading was already trimmed by whitespace skip after >
+ if (Flags & parse_trim_whitespace)
+ {
+ if (Flags & parse_normalize_whitespace)
+ {
+ // Whitespace is already condensed to single space characters by skipping function, so just trim 1 char off the end
+ if (*(end - 1) == Ch(' '))
+ --end;
+ }
+ else
+ {
+ // Backup until non-whitespace character is found
+ while (whitespace_pred::test(*(end - 1)))
+ --end;
+ }
+ }
+
+ // If characters are still left between end and value (this test is only necessary if normalization is enabled)
+ // Create new data node
+ if (!(Flags & parse_no_data_nodes))
+ {
+ xml_node<Ch> *data = this->allocate_node(node_data);
+ data->value(value, end - value);
+ node->append_node(data);
+ }
+
+ // Add data to parent node if no data exists yet
+ if (!(Flags & parse_no_element_values))
+ if (*node->value() == Ch('\0'))
+ node->value(value, end - value);
+
+ // Place zero terminator after value
+ if (!(Flags & parse_no_string_terminators))
+ {
+ Ch ch = *text;
+ *end = Ch('\0');
+ return ch; // Return character that ends data; this is required because zero terminator overwritten it
+ }
+
+ // Return character that ends data
+ return *text;
+ }
+
+ // Parse CDATA
+ template<int Flags>
+ xml_node<Ch> *parse_cdata(Ch *&text)
+ {
+ // If CDATA is disabled
+ if (Flags & parse_no_data_nodes)
+ {
+ // Skip until end of cdata
+ while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>'))
+ {
+ if (!text[0]) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+ text += 3; // Skip ]]>
+ return 0; // Do not produce CDATA node
+ }
+
+ // Skip until end of cdata
+ Ch *value = text;
+ while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>'))
+ {
+ if (!text[0]) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+
+ // Create new cdata node
+ xml_node<Ch> *cdata = this->allocate_node(node_cdata);
+ cdata->value(value, text - value);
+
+ // Place zero terminator after value
+ if (!(Flags & parse_no_string_terminators))
+ *text = Ch('\0');
+
+ text += 3; // Skip ]]>
+ return cdata;
+ }
+
+ // Parse element node
+ template<int Flags>
+ xml_node<Ch> *parse_element(Ch *&text)
+ {
+ // Create element node
+ xml_node<Ch> *element = this->allocate_node(node_element);
+
+ // Extract element name
+ Ch *name = text;
+ skip<node_name_pred, Flags>(text);
+ if (text == name)
+ RAPIDXML_PARSE_ERROR("expected element name", text);
+ element->name(name, text - name);
+
+ // Skip whitespace between element name and attributes or >
+ skip<whitespace_pred, Flags>(text);
+
+ // Parse attributes, if any
+ parse_node_attributes<Flags>(text, element);
+
+ // Determine ending type
+ if (*text == Ch('>'))
+ {
+ ++text;
+ parse_node_contents<Flags>(text, element);
+ }
+ else if (*text == Ch('/'))
+ {
+ ++text;
+ if (*text != Ch('>'))
+ RAPIDXML_PARSE_ERROR("expected >", text);
+ ++text;
+ }
+ else
+ RAPIDXML_PARSE_ERROR("expected >", text);
+
+ // Place zero terminator after name
+ if (!(Flags & parse_no_string_terminators))
+ element->name()[element->name_size()] = Ch('\0');
+
+ // Return parsed element
+ return element;
+ }
+
+ // Determine node type, and parse it
+ template<int Flags>
+ xml_node<Ch> *parse_node(Ch *&text)
+ {
+ // Parse proper node type
+ switch (text[0])
+ {
+
+ // <...
+ default:
+ // Parse and append element node
+ return parse_element<Flags>(text);
+
+ // <?...
+ case Ch('?'):
+ ++text; // Skip ?
+ if ((text[0] == Ch('x') || text[0] == Ch('X')) &&
+ (text[1] == Ch('m') || text[1] == Ch('M')) &&
+ (text[2] == Ch('l') || text[2] == Ch('L')) &&
+ whitespace_pred::test(text[3]))
+ {
+ // '<?xml ' - xml declaration
+ text += 4; // Skip 'xml '
+ return parse_xml_declaration<Flags>(text);
+ }
+ else
+ {
+ // Parse PI
+ return parse_pi<Flags>(text);
+ }
+
+ // <!...
+ case Ch('!'):
+
+ // Parse proper subset of <! node
+ switch (text[1])
+ {
+
+ // <!-
+ case Ch('-'):
+ if (text[2] == Ch('-'))
+ {
+ // '<!--' - xml comment
+ text += 3; // Skip '!--'
+ return parse_comment<Flags>(text);
+ }
+ break;
+
+ // <![
+ case Ch('['):
+ if (text[2] == Ch('C') && text[3] == Ch('D') && text[4] == Ch('A') &&
+ text[5] == Ch('T') && text[6] == Ch('A') && text[7] == Ch('['))
+ {
+ // '<![CDATA[' - cdata
+ text += 8; // Skip '![CDATA['
+ return parse_cdata<Flags>(text);
+ }
+ break;
+
+ // <!D
+ case Ch('D'):
+ if (text[2] == Ch('O') && text[3] == Ch('C') && text[4] == Ch('T') &&
+ text[5] == Ch('Y') && text[6] == Ch('P') && text[7] == Ch('E') &&
+ whitespace_pred::test(text[8]))
+ {
+ // '<!DOCTYPE ' - doctype
+ text += 9; // skip '!DOCTYPE '
+ return parse_doctype<Flags>(text);
+ }
+
+ } // switch
+
+ // Attempt to skip other, unrecognized node types starting with <!
+ ++text; // Skip !
+ while (*text != Ch('>'))
+ {
+ if (*text == 0) {
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return 0;
+ }
+ ++text;
+ }
+ ++text; // Skip '>'
+ return 0; // No node recognized
+
+ }
+ }
+
+ // Parse contents of the node - children, data etc.
+ template<int Flags>
+ void parse_node_contents(Ch *&text, xml_node<Ch> *node)
+ {
+ // For all children and text
+ while (1)
+ {
+ // Skip whitespace between > and node contents
+ Ch *contents_start = text; // Store start of node contents before whitespace is skipped
+ skip<whitespace_pred, Flags>(text);
+ Ch next_char = *text;
+
+ // After data nodes, instead of continuing the loop, control jumps here.
+ // This is because zero termination inside parse_and_append_data() function
+ // would wreak havoc with the above code.
+ // Also, skipping whitespace after data nodes is unnecessary.
+ after_data_node:
+
+ // Determine what comes next: node closing, child node, data node, or 0?
+ switch (next_char)
+ {
+
+ // Node closing or child node
+ case Ch('<'):
+ if (text[1] == Ch('/'))
+ {
+ // Node closing
+ text += 2; // Skip '</'
+ if (Flags & parse_validate_closing_tags)
+ {
+ // Skip and validate closing tag name
+ Ch *closing_name = text;
+ skip<node_name_pred, Flags>(text);
+ if (!internal::compare(node->name(), node->name_size(), closing_name, text - closing_name, true))
+ RAPIDXML_PARSE_ERROR("invalid closing tag name", text);
+ }
+ else
+ {
+ // No validation, just skip name
+ skip<node_name_pred, Flags>(text);
+ }
+ // Skip remaining whitespace after node name
+ skip<whitespace_pred, Flags>(text);
+ if (*text != Ch('>'))
+ RAPIDXML_PARSE_ERROR("expected >", text);
+ ++text; // Skip '>'
+ return; // Node closed, finished parsing contents
+ }
+ else
+ {
+ // Child node
+ ++text; // Skip '<'
+ if (xml_node<Ch> *child = parse_node<Flags>(text))
+ node->append_node(child);
+ }
+ break;
+
+ // End of data - error
+ case Ch('\0'):
+ RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ return;
+
+ // Data node
+ default:
+ next_char = parse_and_append_data<Flags>(node, text, contents_start);
+ goto after_data_node; // Bypass regular processing after data nodes
+
+ }
+ }
+ }
+
+ // Parse XML attributes of the node
+ template<int Flags>
+ void parse_node_attributes(Ch *&text, xml_node<Ch> *node)
+ {
+ // For all attributes
+ while (attribute_name_pred::test(*text))
+ {
+ // Extract attribute name
+ Ch *name = text;
+ ++text; // Skip first character of attribute name
+ skip<attribute_name_pred, Flags>(text);
+ if (text == name)
+ RAPIDXML_PARSE_ERROR("expected attribute name", name);
+
+ // Create new attribute
+ xml_attribute<Ch> *attribute = this->allocate_attribute();
+ attribute->name(name, text - name);
+ node->append_attribute(attribute);
+
+ // Skip whitespace after attribute name
+ skip<whitespace_pred, Flags>(text);
+
+ // Skip =
+ if (*text != Ch('='))
+ RAPIDXML_PARSE_ERROR("expected =", text);
+ ++text;
+
+ // Add terminating zero after name
+ if (!(Flags & parse_no_string_terminators))
+ attribute->name()[attribute->name_size()] = 0;
+
+ // Skip whitespace after =
+ skip<whitespace_pred, Flags>(text);
+
+ // Skip quote and remember if it was ' or "
+ Ch quote = *text;
+ if (quote != Ch('\'') && quote != Ch('"'))
+ RAPIDXML_PARSE_ERROR("expected ' or \"", text);
+ ++text;
+
+ // Extract attribute value and expand char refs in it
+ Ch *value = text, *end;
+ const int AttFlags = Flags & ~parse_normalize_whitespace; // No whitespace normalization in attributes
+ if (quote == Ch('\''))
+ end = skip_and_expand_character_refs<attribute_value_pred<Ch('\'')>, attribute_value_pure_pred<Ch('\'')>, AttFlags>(text);
+ else
+ end = skip_and_expand_character_refs<attribute_value_pred<Ch('"')>, attribute_value_pure_pred<Ch('"')>, AttFlags>(text);
+
+ // Set attribute value
+ attribute->value(value, end - value);
+
+ // Make sure that end quote is present
+ if (*text != quote)
+ RAPIDXML_PARSE_ERROR("expected ' or \"", text);
+ ++text; // Skip quote
+
+ // Add terminating zero after value
+ if (!(Flags & parse_no_string_terminators))
+ attribute->value()[attribute->value_size()] = 0;
+
+ // Skip whitespace after attribute value
+ skip<whitespace_pred, Flags>(text);
+ }
+ }
+
+ };
+
+ //! \cond internal
+ namespace internal
+ {
+
+ // Whitespace (space \n \r \t)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_whitespace[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, // 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // F
+ };
+
+ // Node name (anything but space \n \r \t / > ? \0)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_node_name[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Text (i.e. PCDATA) (anything but < \0)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_text[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Text (i.e. PCDATA) that does not require processing when ws normalization is disabled
+ // (anything but < \0 &)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_text_pure_no_ws[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Text (i.e. PCDATA) that does not require processing when ws normalizationis is enabled
+ // (anything but < \0 & space \n \r \t)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_text_pure_with_ws[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Attribute name (anything but space \n \r \t / < > = ? ! \0)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_attribute_name[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Attribute data with single quote (anything but ' \0)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_attribute_data_1[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Attribute data with single quote that does not require processing (anything but ' \0 &)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_attribute_data_1_pure[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Attribute data with double quote (anything but " \0)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_attribute_data_2[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Attribute data with double quote that does not require processing (anything but " \0 &)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_attribute_data_2_pure[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
+ 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F
+ };
+
+ // Digits (dec and hex, 255 denotes end of numeric character reference)
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_digits[256] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 0
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 1
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 2
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,255,255,255,255,255,255, // 3
+ 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 4
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 5
+ 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 6
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 7
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 8
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 9
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // A
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // B
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // C
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // D
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // E
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 // F
+ };
+
+ // Upper case conversion
+ template<int Dummy>
+ const unsigned char lookup_tables<Dummy>::lookup_upcase[256] =
+ {
+ // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A B C D E F
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 0
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, // 1
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 2
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 3
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 4
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, // 5
+ 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 6
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127, // 7
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 8
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 9
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // A
+ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // B
+ 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // C
+ 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // D
+ 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // E
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // F
+ };
+ }
+ //! \endcond
+
+}
+
+// Undefine internal macros
+#undef RAPIDXML_PARSE_ERROR
+
+// On MSVC, restore warnings state
+#ifdef _MSC_VER
+ #pragma warning(pop)
+#endif
+
+#endif
diff --git a/gui/remaining.txt b/gui/remaining.txt
new file mode 100644
index 000000000..298ee90ad
--- /dev/null
+++ b/gui/remaining.txt
@@ -0,0 +1,4 @@
+* Confirmation of action
+* Multi-String Variables
+* String Box
+
diff --git a/gui/resources.cpp b/gui/resources.cpp
new file mode 100644
index 000000000..bd71d50b0
--- /dev/null
+++ b/gui/resources.cpp
@@ -0,0 +1,469 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// resource.cpp - Source to manage GUI resources
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <string>
+#include <sstream>
+#include <iostream>
+#include <iomanip>
+#include <fcntl.h>
+
+#include "../minzip/Zip.h"
+extern "C" {
+#include "../twcommon.h"
+#include "gui.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+#define TMP_RESOURCE_NAME "/tmp/extract.bin"
+
+Resource::Resource(xml_node<>* node, ZipArchive* pZip __unused)
+{
+ if (node && node->first_attribute("name"))
+ mName = node->first_attribute("name")->value();
+}
+
+int Resource::ExtractResource(ZipArchive* pZip, std::string folderName, std::string fileName, std::string fileExtn, std::string destFile)
+{
+ if (!pZip)
+ return -1;
+
+ std::string src = folderName + "/" + fileName + fileExtn;
+
+ const ZipEntry* binary = mzFindZipEntry(pZip, src.c_str());
+ if (binary == NULL) {
+ return -1;
+ }
+
+ unlink(destFile.c_str());
+ int fd = creat(destFile.c_str(), 0666);
+ if (fd < 0)
+ return -1;
+
+ int ret = 0;
+ if (!mzExtractZipEntryToFile(pZip, binary, fd))
+ ret = -1;
+
+ close(fd);
+ return ret;
+}
+
+void Resource::LoadImage(ZipArchive* pZip, std::string file, gr_surface* surface)
+{
+ int rc = 0;
+ if (ExtractResource(pZip, "images", file, ".png", TMP_RESOURCE_NAME) == 0)
+ {
+ rc = res_create_surface(TMP_RESOURCE_NAME, surface);
+ unlink(TMP_RESOURCE_NAME);
+ }
+ else if (ExtractResource(pZip, "images", file, "", TMP_RESOURCE_NAME) == 0)
+ {
+ // JPG includes the .jpg extension in the filename so extension should be blank
+ rc = res_create_surface(TMP_RESOURCE_NAME, surface);
+ unlink(TMP_RESOURCE_NAME);
+ }
+ else if (!pZip)
+ {
+ // File name in xml may have included .png so try without adding .png
+ rc = res_create_surface(file.c_str(), surface);
+ }
+ if (rc != 0)
+ LOGINFO("Failed to load image from %s%s, error %d\n", file.c_str(), pZip ? " (zip)" : "", rc);
+}
+
+void Resource::CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect)
+{
+ if (!source) {
+ *destination = NULL;
+ return;
+ }
+ if (get_scale_w() != 0 && get_scale_h() != 0) {
+ float scale_w = get_scale_w(), scale_h = get_scale_h();
+ if (retain_aspect) {
+ if (scale_w < scale_h)
+ scale_h = scale_w;
+ else
+ scale_w = scale_h;
+ }
+ if (res_scale_surface(source, destination, scale_w, scale_h)) {
+ LOGINFO("Error scaling image, using regular size.\n");
+ *destination = source;
+ }
+ } else {
+ *destination = source;
+ }
+}
+
+FontResource::FontResource(xml_node<>* node, ZipArchive* pZip)
+ : Resource(node, pZip)
+{
+ origFontSize = 0;
+ origFont = NULL;
+ LoadFont(node, pZip);
+}
+
+void FontResource::LoadFont(xml_node<>* node, ZipArchive* pZip)
+{
+ std::string file;
+ xml_attribute<>* attr;
+
+ mFont = NULL;
+ if (!node)
+ return;
+
+ attr = node->first_attribute("filename");
+ if (!attr)
+ return;
+
+ file = attr->value();
+
+ if (file.size() >= 4 && file.compare(file.size()-4, 4, ".ttf") == 0)
+ {
+ int font_size = 0;
+
+ if (origFontSize != 0) {
+ attr = node->first_attribute("scale");
+ if (attr == NULL)
+ return;
+ font_size = origFontSize * atoi(attr->value()) / 100;
+ } else {
+ attr = node->first_attribute("size");
+ if (attr == NULL)
+ return;
+ font_size = scale_theme_min(atoi(attr->value()));
+ origFontSize = font_size;
+ }
+
+ int dpi = 300;
+
+ attr = node->first_attribute("dpi");
+ if (attr)
+ dpi = atoi(attr->value());
+
+ // we can't use TMP_RESOURCE_NAME here because the ttf subsystem is caching the name and scaling needs to reload the font
+ std::string tmpname = "/tmp/" + file;
+ if (ExtractResource(pZip, "fonts", file, "", tmpname) == 0)
+ {
+ mFont = gr_ttf_loadFont(tmpname.c_str(), font_size, dpi);
+ }
+ else
+ {
+ file = std::string(TWRES "fonts/") + file;
+ mFont = gr_ttf_loadFont(file.c_str(), font_size, dpi);
+ }
+ }
+ else
+ {
+ LOGERR("Non-TTF fonts are no longer supported.\n");
+ }
+}
+
+void FontResource::DeleteFont() {
+ if (mFont)
+ gr_ttf_freeFont(mFont);
+ mFont = NULL;
+ if (origFont)
+ gr_ttf_freeFont(origFont);
+ origFont = NULL;
+}
+
+void FontResource::Override(xml_node<>* node, ZipArchive* pZip) {
+ if (!origFont) {
+ origFont = mFont;
+ } else if (mFont) {
+ gr_ttf_freeFont(mFont);
+ mFont = NULL;
+ }
+ LoadFont(node, pZip);
+}
+
+FontResource::~FontResource()
+{
+ DeleteFont();
+}
+
+ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip)
+ : Resource(node, pZip)
+{
+ std::string file;
+ gr_surface temp_surface = NULL;
+
+ mSurface = NULL;
+ if (!node) {
+ LOGERR("ImageResource node is NULL\n");
+ return;
+ }
+
+ if (node->first_attribute("filename"))
+ file = node->first_attribute("filename")->value();
+ else {
+ LOGERR("No filename specified for image resource.\n");
+ return;
+ }
+
+ bool retain_aspect = (node->first_attribute("retainaspect") != NULL);
+ // the value does not matter, if retainaspect is present, we assume that we want to retain it
+ LoadImage(pZip, file, &temp_surface);
+ CheckAndScaleImage(temp_surface, &mSurface, retain_aspect);
+}
+
+ImageResource::~ImageResource()
+{
+ if (mSurface)
+ res_free_surface(mSurface);
+}
+
+AnimationResource::AnimationResource(xml_node<>* node, ZipArchive* pZip)
+ : Resource(node, pZip)
+{
+ std::string file;
+ int fileNum = 1;
+
+ if (!node)
+ return;
+
+ if (node->first_attribute("filename"))
+ file = node->first_attribute("filename")->value();
+ else {
+ LOGERR("No filename specified for image resource.\n");
+ return;
+ }
+
+ bool retain_aspect = (node->first_attribute("retainaspect") != NULL);
+ // the value does not matter, if retainaspect is present, we assume that we want to retain it
+ for (;;)
+ {
+ std::ostringstream fileName;
+ fileName << file << std::setfill ('0') << std::setw (3) << fileNum;
+
+ gr_surface surface, temp_surface = NULL;
+ LoadImage(pZip, fileName.str(), &temp_surface);
+ CheckAndScaleImage(temp_surface, &surface, retain_aspect);
+ if (surface) {
+ mSurfaces.push_back(surface);
+ fileNum++;
+ } else
+ break; // Done loading animation images
+ }
+}
+
+AnimationResource::~AnimationResource()
+{
+ std::vector<gr_surface>::iterator it;
+
+ for (it = mSurfaces.begin(); it != mSurfaces.end(); ++it)
+ res_free_surface(*it);
+
+ mSurfaces.clear();
+}
+
+FontResource* ResourceManager::FindFont(const std::string& name) const
+{
+ for (std::vector<FontResource*>::const_iterator it = mFonts.begin(); it != mFonts.end(); ++it)
+ if (name == (*it)->GetName())
+ return *it;
+ return NULL;
+}
+
+ImageResource* ResourceManager::FindImage(const std::string& name) const
+{
+ for (std::vector<ImageResource*>::const_iterator it = mImages.begin(); it != mImages.end(); ++it)
+ if (name == (*it)->GetName())
+ return *it;
+ return NULL;
+}
+
+AnimationResource* ResourceManager::FindAnimation(const std::string& name) const
+{
+ for (std::vector<AnimationResource*>::const_iterator it = mAnimations.begin(); it != mAnimations.end(); ++it)
+ if (name == (*it)->GetName())
+ return *it;
+ return NULL;
+}
+
+std::string ResourceManager::FindString(const std::string& name) const
+{
+ if (this != NULL) {
+ std::map<std::string, string_resource_struct>::const_iterator it = mStrings.find(name);
+ if (it != mStrings.end())
+ return it->second.value;
+ LOGERR("String resource '%s' not found. No default value.\n", name.c_str());
+ PageManager::AddStringResource("NO DEFAULT", name, "[" + name + ("]"));
+ } else {
+ LOGINFO("String resources not loaded when looking for '%s'. No default value.\n", name.c_str());
+ }
+ return "[" + name + ("]");
+}
+
+std::string ResourceManager::FindString(const std::string& name, const std::string& default_string) const
+{
+ if (this != NULL) {
+ std::map<std::string, string_resource_struct>::const_iterator it = mStrings.find(name);
+ if (it != mStrings.end())
+ return it->second.value;
+ LOGERR("String resource '%s' not found. Using default value.\n", name.c_str());
+ PageManager::AddStringResource("DEFAULT", name, default_string);
+ } else {
+ LOGINFO("String resources not loaded when looking for '%s'. Using default value.\n", name.c_str());
+ }
+ return default_string;
+}
+
+void ResourceManager::DumpStrings() const
+{
+ if (this == NULL) {
+ gui_print("No string resources\n");
+ return;
+ }
+ std::map<std::string, string_resource_struct>::const_iterator it;
+ gui_print("Dumping all strings:\n");
+ for (it = mStrings.begin(); it != mStrings.end(); it++)
+ gui_print("source: %s: '%s' = '%s'\n", it->second.source.c_str(), it->first.c_str(), it->second.value.c_str());
+ gui_print("Done dumping strings\n");
+}
+
+ResourceManager::ResourceManager()
+{
+}
+
+void ResourceManager::AddStringResource(std::string resource_source, std::string resource_name, std::string value)
+{
+ string_resource_struct res;
+ res.source = resource_source;
+ res.value = value;
+ mStrings[resource_name] = res;
+}
+
+void ResourceManager::LoadResources(xml_node<>* resList, ZipArchive* pZip, std::string resource_source)
+{
+ if (!resList)
+ return;
+
+ for (xml_node<>* child = resList->first_node(); child; child = child->next_sibling())
+ {
+ std::string type = child->name();
+ if (type == "resource") {
+ // legacy format : <resource type="...">
+ xml_attribute<>* attr = child->first_attribute("type");
+ type = attr ? attr->value() : "*unspecified*";
+ }
+
+ bool error = false;
+ if (type == "font")
+ {
+ FontResource* res = new FontResource(child, pZip);
+ if (res->GetResource())
+ mFonts.push_back(res);
+ else {
+ error = true;
+ delete res;
+ }
+ }
+ else if (type == "fontoverride")
+ {
+ if (mFonts.size() != 0 && child && child->first_attribute("name")) {
+ string FontName = child->first_attribute("name")->value();
+ size_t font_count = mFonts.size(), i;
+ bool found = false;
+
+ for (i = 0; i < font_count; i++) {
+ if (mFonts[i]->GetName() == FontName) {
+ mFonts[i]->Override(child, pZip);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ LOGERR("Unable to locate font '%s' for override.\n", FontName.c_str());
+ }
+ } else if (mFonts.size() != 0)
+ LOGERR("Unable to locate font name for type fontoverride.\n");
+ }
+ else if (type == "image")
+ {
+ ImageResource* res = new ImageResource(child, pZip);
+ if (res->GetResource())
+ mImages.push_back(res);
+ else {
+ error = true;
+ delete res;
+ }
+ }
+ else if (type == "animation")
+ {
+ AnimationResource* res = new AnimationResource(child, pZip);
+ if (res->GetResourceCount())
+ mAnimations.push_back(res);
+ else {
+ error = true;
+ delete res;
+ }
+ }
+ else if (type == "string")
+ {
+ if (xml_attribute<>* attr = child->first_attribute("name")) {
+ string_resource_struct res;
+ res.source = resource_source;
+ res.value = child->value();
+ mStrings[attr->value()] = res;
+ } else
+ error = true;
+ }
+ else
+ {
+ LOGERR("Resource type (%s) not supported.\n", type.c_str());
+ error = true;
+ }
+
+ if (error)
+ {
+ std::string res_name;
+ if (child->first_attribute("name"))
+ res_name = child->first_attribute("name")->value();
+ if (res_name.empty() && child->first_attribute("filename"))
+ res_name = child->first_attribute("filename")->value();
+
+ if (!res_name.empty()) {
+ LOGERR("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str());
+ } else
+ LOGERR("Resource type (%s) failed to load\n", type.c_str());
+ }
+ }
+}
+
+ResourceManager::~ResourceManager()
+{
+ for (std::vector<FontResource*>::iterator it = mFonts.begin(); it != mFonts.end(); ++it)
+ delete *it;
+
+ for (std::vector<ImageResource*>::iterator it = mImages.begin(); it != mImages.end(); ++it)
+ delete *it;
+
+ for (std::vector<AnimationResource*>::iterator it = mAnimations.begin(); it != mAnimations.end(); ++it)
+ delete *it;
+}
diff --git a/gui/resources.hpp b/gui/resources.hpp
new file mode 100644
index 000000000..2d3067667
--- /dev/null
+++ b/gui/resources.hpp
@@ -0,0 +1,136 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// resources.hpp - Base classes for resource management of GUI
+
+#ifndef _RESOURCE_HEADER
+#define _RESOURCE_HEADER
+
+#include <string>
+#include <vector>
+#include <map>
+#include "rapidxml.hpp"
+
+struct ZipArchive;
+
+extern "C" {
+#include "../minuitwrp/minui.h"
+}
+
+// Base Objects
+class Resource
+{
+public:
+ Resource(xml_node<>* node, ZipArchive* pZip);
+ virtual ~Resource() {}
+
+public:
+ std::string GetName() { return mName; }
+
+private:
+ std::string mName;
+
+protected:
+ static int ExtractResource(ZipArchive* pZip, std::string folderName, std::string fileName, std::string fileExtn, std::string destFile);
+ static void LoadImage(ZipArchive* pZip, std::string file, gr_surface* surface);
+ static void CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect);
+};
+
+class FontResource : public Resource
+{
+public:
+ FontResource(xml_node<>* node, ZipArchive* pZip);
+ virtual ~FontResource();
+
+public:
+ void* GetResource() { return this ? mFont : NULL; }
+ int GetHeight() { return gr_ttf_getMaxFontHeight(this ? mFont : NULL); }
+ void Override(xml_node<>* node, ZipArchive* pZip);
+
+protected:
+ void* mFont;
+
+private:
+ void LoadFont(xml_node<>* node, ZipArchive* pZip);
+ void DeleteFont();
+
+private:
+ int origFontSize;
+ void* origFont;
+};
+
+class ImageResource : public Resource
+{
+public:
+ ImageResource(xml_node<>* node, ZipArchive* pZip);
+ virtual ~ImageResource();
+
+public:
+ gr_surface GetResource() { return this ? mSurface : NULL; }
+ int GetWidth() { return gr_get_width(this ? mSurface : NULL); }
+ int GetHeight() { return gr_get_height(this ? mSurface : NULL); }
+
+protected:
+ gr_surface mSurface;
+};
+
+class AnimationResource : public Resource
+{
+public:
+ AnimationResource(xml_node<>* node, ZipArchive* pZip);
+ virtual ~AnimationResource();
+
+public:
+ gr_surface GetResource() { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(0); }
+ gr_surface GetResource(int entry) { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(entry); }
+ int GetWidth() { return gr_get_width(this ? GetResource() : NULL); }
+ int GetHeight() { return gr_get_height(this ? GetResource() : NULL); }
+ int GetResourceCount() { return mSurfaces.size(); }
+
+protected:
+ std::vector<gr_surface> mSurfaces;
+};
+
+class ResourceManager
+{
+public:
+ ResourceManager();
+ virtual ~ResourceManager();
+ void AddStringResource(std::string resource_source, std::string resource_name, std::string value);
+ void LoadResources(xml_node<>* resList, ZipArchive* pZip, std::string resource_source);
+
+public:
+ FontResource* FindFont(const std::string& name) const;
+ ImageResource* FindImage(const std::string& name) const;
+ AnimationResource* FindAnimation(const std::string& name) const;
+ std::string FindString(const std::string& name) const;
+ std::string FindString(const std::string& name, const std::string& default_string) const;
+ void DumpStrings() const;
+
+private:
+ struct string_resource_struct {
+ std::string value;
+ std::string source;
+ };
+ std::vector<FontResource*> mFonts;
+ std::vector<ImageResource*> mImages;
+ std::vector<AnimationResource*> mAnimations;
+ std::map<std::string, string_resource_struct> mStrings;
+};
+
+#endif // _RESOURCE_HEADER
diff --git a/gui/scrolllist.cpp b/gui/scrolllist.cpp
new file mode 100644
index 000000000..7540356bf
--- /dev/null
+++ b/gui/scrolllist.cpp
@@ -0,0 +1,652 @@
+/*
+ Copyright 2013 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string.h>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+#include "../data.hpp"
+
+const float SCROLLING_SPEED_DECREMENT = 0.9; // friction
+const int SCROLLING_FLOOR = 2; // minimum pixels for scrolling to stop
+
+GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ firstDisplayedItem = mItemSpacing = mFontHeight = mSeparatorH = y_offset = scrollingSpeed = 0;
+ maxIconWidth = maxIconHeight = mHeaderIconHeight = mHeaderIconWidth = 0;
+ mHeaderSeparatorH = mHeaderH = actualItemHeight = 0;
+ mHeaderIsStatic = false;
+ mBackground = mHeaderIcon = NULL;
+ mFont = NULL;
+ mFastScrollW = mFastScrollLineW = mFastScrollRectW = mFastScrollRectH = 0;
+ mFastScrollRectCurrentY = mFastScrollRectCurrentH = mFastScrollRectTouchY = 0;
+ lastY = last2Y = fastScroll = 0;
+ mUpdate = 0;
+ touchDebounce = 6;
+ ConvertStrToColor("black", &mBackgroundColor);
+ ConvertStrToColor("black", &mHeaderBackgroundColor);
+ ConvertStrToColor("black", &mSeparatorColor);
+ ConvertStrToColor("black", &mHeaderSeparatorColor);
+ ConvertStrToColor("white", &mFontColor);
+ ConvertStrToColor("white", &mHeaderFontColor);
+ ConvertStrToColor("white", &mFastScrollLineColor);
+ ConvertStrToColor("white", &mFastScrollRectColor);
+ hasHighlightColor = false;
+ allowSelection = true;
+ selectedItem = NO_ITEM;
+
+ // Load header text
+ // note: node can be NULL for the emergency console
+ child = node ? node->first_node("text") : NULL;
+ if (child) mHeaderText = child->value();
+ // Simple way to check for static state
+ mLastHeaderValue = gui_parse_text(mHeaderText);
+ mHeaderIsStatic = (mLastHeaderValue == mHeaderText);
+
+ mHighlightColor = LoadAttrColor(FindNode(node, "highlight"), "color", &hasHighlightColor);
+
+ child = FindNode(node, "background");
+ if (child)
+ {
+ mBackground = LoadAttrImage(child, "resource");
+ mBackgroundColor = LoadAttrColor(child, "color");
+ }
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+
+ // Load the font, and possibly override the color
+ child = FindNode(node, "font");
+ if (child)
+ {
+ mFont = LoadAttrFont(child, "resource");
+ mFontColor = LoadAttrColor(child, "color");
+ mFontHighlightColor = LoadAttrColor(child, "highlightcolor", mFontColor);
+ mItemSpacing = LoadAttrIntScaleY(child, "spacing");
+ }
+
+ // Load the separator if it exists
+ child = FindNode(node, "separator");
+ if (child)
+ {
+ mSeparatorColor = LoadAttrColor(child, "color");
+ mSeparatorH = LoadAttrIntScaleY(child, "height");
+ }
+
+ // Fast scroll
+ child = FindNode(node, "fastscroll");
+ if (child)
+ {
+ mFastScrollLineColor = LoadAttrColor(child, "linecolor");
+ mFastScrollRectColor = LoadAttrColor(child, "rectcolor");
+
+ mFastScrollW = LoadAttrIntScaleX(child, "w");
+ mFastScrollLineW = LoadAttrIntScaleX(child, "linew");
+ mFastScrollRectW = LoadAttrIntScaleX(child, "rectw");
+ mFastScrollRectH = LoadAttrIntScaleY(child, "recth");
+ }
+
+ // Retrieve the line height
+ mFontHeight = mFont->GetHeight();
+ actualItemHeight = mFontHeight + mItemSpacing + mSeparatorH;
+
+ // Load the header if it exists
+ child = FindNode(node, "header");
+ if (child)
+ {
+ mHeaderH = mFontHeight;
+ mHeaderIcon = LoadAttrImage(child, "icon");
+ mHeaderBackgroundColor = LoadAttrColor(child, "background", mBackgroundColor);
+ mHeaderFontColor = LoadAttrColor(child, "textcolor", mFontColor);
+ mHeaderSeparatorColor = LoadAttrColor(child, "separatorcolor", mSeparatorColor);
+ mHeaderSeparatorH = LoadAttrIntScaleY(child, "separatorheight", mSeparatorH);
+
+ if (mHeaderIcon && mHeaderIcon->GetResource())
+ {
+ mHeaderIconWidth = mHeaderIcon->GetWidth();
+ mHeaderIconHeight = mHeaderIcon->GetHeight();
+ if (mHeaderIconHeight > mHeaderH)
+ mHeaderH = mHeaderIconHeight;
+ if (mHeaderIconWidth > maxIconWidth)
+ maxIconWidth = mHeaderIconWidth;
+ }
+
+ mHeaderH += mItemSpacing + mHeaderSeparatorH;
+ if (mHeaderH < actualItemHeight)
+ mHeaderH = actualItemHeight;
+ }
+
+ if (actualItemHeight / 3 > 6)
+ touchDebounce = actualItemHeight / 3;
+}
+
+GUIScrollList::~GUIScrollList()
+{
+}
+
+void GUIScrollList::SetMaxIconSize(int w, int h)
+{
+ if (w > maxIconWidth)
+ maxIconWidth = w;
+ if (h > maxIconHeight)
+ maxIconHeight = h;
+ if (maxIconHeight > mFontHeight) {
+ actualItemHeight = maxIconHeight + mItemSpacing + mSeparatorH;
+ if (mHeaderH > 0 && actualItemHeight > mHeaderH)
+ mHeaderH = actualItemHeight;
+ }
+}
+
+void GUIScrollList::SetVisibleListLocation(size_t list_index)
+{
+ // This will make sure that the item indicated by list_index is visible on the screen
+ size_t lines = GetDisplayItemCount();
+
+ if (list_index <= (unsigned)firstDisplayedItem) {
+ // list_index is above the currently displayed items, put the selected item at the very top
+ firstDisplayedItem = list_index;
+ y_offset = 0;
+ } else if (list_index >= firstDisplayedItem + lines) {
+ // list_index is below the currently displayed items, put the selected item at the very bottom
+ firstDisplayedItem = list_index - lines + 1;
+ if (GetDisplayRemainder() != 0) {
+ // There's a partial row displayed, set the scrolling offset so that the selected item really is at the very bottom
+ firstDisplayedItem--;
+ y_offset = GetDisplayRemainder() - actualItemHeight;
+ } else {
+ // There's no partial row so zero out the offset
+ y_offset = 0;
+ }
+ if (firstDisplayedItem < 0)
+ firstDisplayedItem = 0;
+ }
+ scrollingSpeed = 0; // stop kinetic scrolling on setting visible location
+ mUpdate = 1;
+}
+
+int GUIScrollList::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ // First step, fill background
+ gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, mBackgroundColor.alpha);
+ gr_fill(mRenderX, mRenderY + mHeaderH, mRenderW, mRenderH - mHeaderH);
+
+ // don't paint outside of the box
+ gr_clip(mRenderX, mRenderY, mRenderW, mRenderH);
+
+ // Next, render the background resource (if it exists)
+ if (mBackground && mBackground->GetResource())
+ {
+ int BackgroundW = mBackground->GetWidth();
+ int BackgroundH = mBackground->GetHeight();
+ int BackgroundX = mRenderX + ((mRenderW - BackgroundW) / 2);
+ int BackgroundY = mRenderY + ((mRenderH - BackgroundH) / 2);
+ gr_blit(mBackground->GetResource(), 0, 0, BackgroundW, BackgroundH, BackgroundX, BackgroundY);
+ }
+
+ // This tells us how many full lines we can actually render
+ size_t lines = GetDisplayItemCount();
+
+ size_t listSize = GetItemCount();
+ int listW = mRenderW; // this is only used for the separators - the list items are rendered in the full width of the list
+
+ if (listSize <= lines) {
+ hasScroll = false;
+ scrollingSpeed = 0;
+ lines = listSize;
+ y_offset = 0;
+ } else {
+ hasScroll = true;
+ listW -= mFastScrollW; // space for fast scroll
+ lines++;
+ if (lines < listSize)
+ lines++;
+ }
+
+ int yPos = mRenderY + mHeaderH + y_offset;
+
+ // render all visible items
+ for (size_t line = 0; line < lines; line++)
+ {
+ size_t itemindex = line + firstDisplayedItem;
+ if (itemindex >= listSize)
+ break;
+
+ RenderItem(itemindex, yPos, itemindex == selectedItem);
+
+ // Add the separator
+ gr_color(mSeparatorColor.red, mSeparatorColor.green, mSeparatorColor.blue, mSeparatorColor.alpha);
+ gr_fill(mRenderX, yPos + actualItemHeight - mSeparatorH, listW, mSeparatorH);
+
+ // Move the yPos
+ yPos += actualItemHeight;
+ }
+
+ // Render the Header (last so that it overwrites the top most row for per pixel scrolling)
+ yPos = mRenderY;
+ if (mHeaderH > 0) {
+ // First step, fill background
+ gr_color(mHeaderBackgroundColor.red, mHeaderBackgroundColor.green, mHeaderBackgroundColor.blue, mHeaderBackgroundColor.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mHeaderH);
+
+ int IconOffsetX = 0;
+
+ // render the icon if it exists
+ if (mHeaderIcon && mHeaderIcon->GetResource())
+ {
+ gr_blit(mHeaderIcon->GetResource(), 0, 0, mHeaderIconWidth, mHeaderIconHeight, mRenderX + ((mHeaderIconWidth - maxIconWidth) / 2), (yPos + (int)((mHeaderH - mHeaderIconHeight) / 2)));
+ IconOffsetX = maxIconWidth;
+ }
+
+ // render the text
+ gr_color(mHeaderFontColor.red, mHeaderFontColor.green, mHeaderFontColor.blue, mHeaderFontColor.alpha);
+ gr_textEx_scaleW(mRenderX + IconOffsetX + 5, yPos + (int)(mHeaderH / 2), mLastHeaderValue.c_str(), mFont->GetResource(), mRenderW, TEXT_ONLY_RIGHT, 0);
+
+ // Add the separator
+ gr_color(mHeaderSeparatorColor.red, mHeaderSeparatorColor.green, mHeaderSeparatorColor.blue, mHeaderSeparatorColor.alpha);
+ gr_fill(mRenderX, yPos + mHeaderH - mHeaderSeparatorH, mRenderW, mHeaderSeparatorH);
+ }
+
+ // reset clipping
+ gr_noclip();
+
+ // render fast scroll
+ if (hasScroll) {
+ int fWidth = mRenderW - listW;
+ int fHeight = mRenderH - mHeaderH;
+ int centerX = listW + mRenderX + fWidth / 2;
+
+ // first determine the total list height and where we are in the list
+ int totalHeight = GetItemCount() * actualItemHeight; // total height of the full list in pixels
+ int topPos = firstDisplayedItem * actualItemHeight - y_offset;
+
+ // now scale it proportionally to the scrollbar height
+ int boxH = fHeight * fHeight / totalHeight; // proportional height of the displayed portion
+ boxH = std::max(boxH, mFastScrollRectH); // but keep a minimum height
+ int boxY = (fHeight - boxH) * topPos / (totalHeight - fHeight); // pixels relative to top of list
+ int boxW = mFastScrollRectW;
+
+ int x = centerX - boxW / 2;
+ int y = mRenderY + mHeaderH + boxY;
+
+ // line above and below box (needs to be split because box can be transparent)
+ gr_color(mFastScrollLineColor.red, mFastScrollLineColor.green, mFastScrollLineColor.blue, mFastScrollLineColor.alpha);
+ gr_fill(centerX - mFastScrollLineW / 2, mRenderY + mHeaderH, mFastScrollLineW, boxY);
+ gr_fill(centerX - mFastScrollLineW / 2, y + boxH, mFastScrollLineW, fHeight - boxY - boxH);
+
+ // box
+ gr_color(mFastScrollRectColor.red, mFastScrollRectColor.green, mFastScrollRectColor.blue, mFastScrollRectColor.alpha);
+ gr_fill(x, y, boxW, boxH);
+
+ mFastScrollRectCurrentY = boxY;
+ mFastScrollRectCurrentH = boxH;
+ }
+ mUpdate = 0;
+ return 0;
+}
+
+void GUIScrollList::RenderItem(size_t itemindex __unused, int yPos, bool selected)
+{
+ RenderStdItem(yPos, selected, NULL, "implement RenderItem!");
+}
+
+void GUIScrollList::RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH)
+{
+ if (hasHighlightColor && selected) {
+ // Highlight the item background of the selected item
+ gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
+ gr_fill(mRenderX, yPos, mRenderW, actualItemHeight);
+ }
+
+ if (selected) {
+ // Use the highlight color for the font
+ gr_color(mFontHighlightColor.red, mFontHighlightColor.green, mFontHighlightColor.blue, mFontHighlightColor.alpha);
+ } else {
+ // Set the color for the font
+ gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
+ }
+
+ if (!iconAndTextH)
+ iconAndTextH = actualItemHeight;
+
+ // render icon
+ if (icon && icon->GetResource()) {
+ int iconH = icon->GetHeight();
+ int iconW = icon->GetWidth();
+ int iconY = yPos + (iconAndTextH - iconH) / 2;
+ int iconX = mRenderX + (maxIconWidth - iconW) / 2;
+ gr_blit(icon->GetResource(), 0, 0, iconW, iconH, iconX, iconY);
+ }
+
+ // render label text
+ int textX = mRenderX + maxIconWidth + 5;
+ int textY = yPos + (iconAndTextH / 2);
+ gr_textEx_scaleW(textX, textY, text, mFont->GetResource(), mRenderW, TEXT_ONLY_RIGHT, 0);
+}
+
+int GUIScrollList::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (!mHeaderIsStatic) {
+ std::string newValue = gui_parse_text(mHeaderText);
+ if (mLastHeaderValue != newValue) {
+ mLastHeaderValue = newValue;
+ mUpdate = 1;
+ }
+ }
+
+ // Handle kinetic scrolling
+ // maximum number of items to scroll per update
+ float maxItemsScrolledPerFrame = std::max(2.5, float(GetDisplayItemCount() / 4) + 0.5);
+
+ int maxScrollDistance = actualItemHeight * maxItemsScrolledPerFrame;
+ int oldScrollingSpeed = scrollingSpeed;
+ if (scrollingSpeed == 0) {
+ // Do nothing
+ return 0;
+ } else if (scrollingSpeed > 0) {
+ if (scrollingSpeed < maxScrollDistance)
+ y_offset += scrollingSpeed;
+ else
+ y_offset += maxScrollDistance;
+ scrollingSpeed *= SCROLLING_SPEED_DECREMENT;
+ if (scrollingSpeed == oldScrollingSpeed)
+ --scrollingSpeed;
+ } else if (scrollingSpeed < 0) {
+ if (abs(scrollingSpeed) < maxScrollDistance)
+ y_offset += scrollingSpeed;
+ else
+ y_offset -= maxScrollDistance;
+ scrollingSpeed *= SCROLLING_SPEED_DECREMENT;
+ if (scrollingSpeed == oldScrollingSpeed)
+ ++scrollingSpeed;
+ }
+ if (abs(scrollingSpeed) < SCROLLING_FLOOR)
+ scrollingSpeed = 0;
+ HandleScrolling();
+ mUpdate = 1;
+
+ return 0;
+}
+
+size_t GUIScrollList::HitTestItem(int x __unused, int y)
+{
+ // We only care about y position
+ if (y < mRenderY || y - mRenderY <= mHeaderH || y - mRenderY > mRenderH)
+ return NO_ITEM;
+
+ int startSelection = (y - mRenderY - mHeaderH);
+
+ // Locate the correct item
+ size_t actualSelection = firstDisplayedItem;
+ int selectY = y_offset;
+ while (selectY + actualItemHeight < startSelection) {
+ selectY += actualItemHeight;
+ actualSelection++;
+ }
+
+ if (actualSelection < GetItemCount())
+ return actualSelection;
+
+ return NO_ITEM;
+}
+
+int GUIScrollList::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ switch (state)
+ {
+ case TOUCH_START:
+ if (hasScroll && x >= mRenderX + mRenderW - mFastScrollW) {
+ fastScroll = 1; // Initial touch is in the fast scroll region
+ int fastScrollBoxTop = mFastScrollRectCurrentY + mRenderY + mHeaderH;
+ int fastScrollBoxBottom = fastScrollBoxTop + mFastScrollRectCurrentH;
+ if (y >= fastScrollBoxTop && y < fastScrollBoxBottom)
+ // user grabbed the fastscroll bar
+ // try to keep the initially touched part of the scrollbar under the finger
+ mFastScrollRectTouchY = y - fastScrollBoxTop;
+ else
+ // user tapped outside the fastscroll bar
+ // center fastscroll rect on the initial touch position
+ mFastScrollRectTouchY = mFastScrollRectCurrentH / 2;
+ }
+
+ if (scrollingSpeed != 0) {
+ selectedItem = NO_ITEM; // this allows the user to tap the list to stop the scrolling without selecting the item they tap
+ scrollingSpeed = 0; // stop scrolling on a new touch
+ } else if (!fastScroll && allowSelection) {
+ // find out which item the user touched
+ selectedItem = HitTestItem(x, y);
+ }
+ if (selectedItem != NO_ITEM)
+ mUpdate = 1;
+ lastY = last2Y = y;
+ break;
+
+ case TOUCH_DRAG:
+ if (fastScroll)
+ {
+ int relY = y - mRenderY - mHeaderH; // touch position relative to window
+ int windowH = mRenderH - mHeaderH;
+ int totalHeight = GetItemCount() * actualItemHeight; // total height of the full list in pixels
+
+ // calculate new top position of the fastscroll bar relative to window
+ int newY = relY - mFastScrollRectTouchY;
+ // keep it fully inside the list
+ newY = std::min(std::max(newY, 0), windowH - mFastScrollRectCurrentH);
+
+ // now compute the new scroll position for the list
+ int newTopPos = newY * (totalHeight - windowH) / (windowH - mFastScrollRectCurrentH); // new top pixel of list
+ newTopPos = std::min(newTopPos, totalHeight - windowH); // account for rounding errors
+ firstDisplayedItem = newTopPos / actualItemHeight;
+ y_offset = - newTopPos % actualItemHeight;
+
+ selectedItem = NO_ITEM;
+ mUpdate = 1;
+ scrollingSpeed = 0; // prevent kinetic scrolling when using fast scroll
+ break;
+ }
+
+ // Provide some debounce on initial touches
+ if (selectedItem != NO_ITEM && abs(y - lastY) < touchDebounce) {
+ mUpdate = 1;
+ break;
+ }
+
+ selectedItem = NO_ITEM; // nothing is selected because we dragged too far
+ // Handle scrolling
+ if (hasScroll) {
+ y_offset += y - lastY; // adjust the scrolling offset based on the difference between the starting touch and the current touch
+ last2Y = lastY; // keep track of previous y locations so that we can tell how fast to scroll for kinetic scrolling
+ lastY = y; // update last touch to the current touch so we can tell how far and what direction we scroll for the next touch event
+
+ HandleScrolling();
+ } else
+ y_offset = 0;
+ mUpdate = 1;
+ break;
+
+ case TOUCH_RELEASE:
+ if (fastScroll)
+ mUpdate = 1; // get rid of touch effects on the fastscroll bar
+ fastScroll = 0;
+ if (selectedItem != NO_ITEM) {
+ // We've selected an item!
+ NotifySelect(selectedItem);
+ mUpdate = 1;
+
+ DataManager::Vibrate("tw_button_vibrate");
+ selectedItem = NO_ITEM;
+ } else {
+ // Start kinetic scrolling
+ scrollingSpeed = lastY - last2Y;
+ if (abs(scrollingSpeed) < touchDebounce)
+ scrollingSpeed = 0;
+ }
+ case TOUCH_REPEAT:
+ case TOUCH_HOLD:
+ break;
+ }
+ return 0;
+}
+
+void GUIScrollList::HandleScrolling()
+{
+ // handle dragging downward, scrolling upward
+ // the offset should always be <= 0 and > -actualItemHeight, adjust the first display row and offset as needed
+ while (firstDisplayedItem && y_offset > 0) {
+ firstDisplayedItem--;
+ y_offset -= actualItemHeight;
+ }
+ if (firstDisplayedItem == 0 && y_offset > 0) {
+ y_offset = 0; // user kept dragging downward past the top of the list, so always reset the offset to 0 since we can't scroll any further in this direction
+ scrollingSpeed = 0; // stop kinetic scrolling
+ }
+
+ // handle dragging upward, scrolling downward
+ int totalSize = GetItemCount();
+ int lines = GetDisplayItemCount(); // number of full lines our list can display at once
+ int bottom_offset = GetDisplayRemainder() - actualItemHeight; // extra display area that can display a partial line for per pixel scrolling
+
+ // the offset should always be <= 0 and > -actualItemHeight, adjust the first display row and offset as needed
+ while (firstDisplayedItem + lines + (bottom_offset ? 1 : 0) < totalSize && abs(y_offset) > actualItemHeight) {
+ firstDisplayedItem++;
+ y_offset += actualItemHeight;
+ }
+ // Check if we dragged too far, set the list at the bottom and adjust offset as needed
+ if (bottom_offset != 0 && firstDisplayedItem + lines + 1 >= totalSize && y_offset <= bottom_offset) {
+ firstDisplayedItem = totalSize - lines - 1;
+ y_offset = bottom_offset;
+ scrollingSpeed = 0; // stop kinetic scrolling
+ } else if (firstDisplayedItem + lines >= totalSize && y_offset < 0) {
+ firstDisplayedItem = totalSize - lines;
+ y_offset = 0;
+ scrollingSpeed = 0; // stop kinetic scrolling
+ }
+}
+
+int GUIScrollList::GetDisplayItemCount()
+{
+ return (mRenderH - mHeaderH) / (actualItemHeight);
+}
+
+int GUIScrollList::GetDisplayRemainder()
+{
+ return (mRenderH - mHeaderH) % actualItemHeight;
+}
+
+int GUIScrollList::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIObject::NotifyVarChange(varName, value);
+
+ if (!isConditionTrue())
+ return 0;
+
+ if (!mHeaderIsStatic) {
+ std::string newValue = gui_parse_text(mHeaderText);
+ if (mLastHeaderValue != newValue) {
+ mLastHeaderValue = newValue;
+ firstDisplayedItem = 0;
+ y_offset = 0;
+ scrollingSpeed = 0; // stop kinetic scrolling on variable changes
+ mUpdate = 1;
+ }
+ }
+ return 0;
+}
+
+int GUIScrollList::SetRenderPos(int x, int y, int w /* = 0 */, int h /* = 0 */)
+{
+ mRenderX = x;
+ mRenderY = y;
+ if (w || h)
+ {
+ mRenderW = w;
+ mRenderH = h;
+ }
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ mUpdate = 1;
+ return 0;
+}
+
+void GUIScrollList::SetPageFocus(int inFocus)
+{
+ if (inFocus) {
+ NotifyVarChange("", ""); // This forces a check for the header text
+ scrollingSpeed = 0; // stop kinetic scrolling on page changes
+ mUpdate = 1;
+ }
+}
+
+bool GUIScrollList::AddLines(std::vector<std::string>* origText, std::vector<std::string>* origColor, size_t* lastCount, std::vector<std::string>* rText, std::vector<std::string>* rColor)
+{
+ if (*lastCount == origText->size())
+ return false; // nothing to add
+
+ size_t prevCount = *lastCount;
+ *lastCount = origText->size();
+
+ // Due to word wrap, figure out what / how the newly added text needs to be added to the render vector that is word wrapped
+ // Note, that multiple consoles on different GUI pages may be different widths or use different fonts, so the word wrapping
+ // may different in different console windows
+ for (size_t i = prevCount; i < *lastCount; i++) {
+ string curr_line = origText->at(i);
+ string curr_color;
+ if (origColor)
+ curr_color = origColor->at(i);
+ for (;;) {
+ size_t line_char_width = gr_ttf_maxExW(curr_line.c_str(), mFont->GetResource(), mRenderW);
+ if (line_char_width < curr_line.size()) {
+ //string left = curr_line.substr(0, line_char_width);
+ size_t wrap_pos = curr_line.find_last_of(" ,./:-_;", line_char_width - 1);
+ if (wrap_pos == string::npos)
+ wrap_pos = line_char_width;
+ else if (wrap_pos < line_char_width - 1)
+ wrap_pos++;
+ rText->push_back(curr_line.substr(0, wrap_pos));
+ if (origColor)
+ rColor->push_back(curr_color);
+ curr_line = curr_line.substr(wrap_pos);
+ /* After word wrapping, delete any leading spaces. Note that the word wrapping is not smart enough to know not
+ * to wrap in the middle of something like ... so some of the ... could appear on the following line. */
+ curr_line.erase(0, curr_line.find_first_not_of(" "));
+ } else {
+ rText->push_back(curr_line);
+ if (origColor)
+ rColor->push_back(curr_color);
+ break;
+ }
+ }
+ }
+ return true;
+}
diff --git a/gui/slider.cpp b/gui/slider.cpp
new file mode 100644
index 000000000..ed5c615ce
--- /dev/null
+++ b/gui/slider.cpp
@@ -0,0 +1,220 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// slider.cpp - GUISlider object
+// Pulled & ported from https://raw.github.com/agrabren/RecoverWin/master/gui/slider.cpp
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "../data.hpp"
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUISlider::GUISlider(xml_node<>* node) : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ sAction = NULL;
+ sSliderLabel = NULL;
+ sSlider = NULL;
+ sSliderUsed = NULL;
+ sTouch = NULL;
+ sTouchW = 20;
+
+ if (!node)
+ {
+ LOGERR("GUISlider created without XML node\n");
+ return;
+ }
+
+ // Load the resources
+ child = FindNode(node, "resource");
+ if (child)
+ {
+ sSlider = LoadAttrImage(child, "base");
+ sSliderUsed = LoadAttrImage(child, "used");
+ sTouch = LoadAttrImage(child, "touch");
+ }
+
+ // Load the text label
+ sSliderLabel = new GUIText(node);
+ if (sSliderLabel->Render() < 0)
+ {
+ delete sSliderLabel;
+ sSliderLabel = NULL;
+ }
+
+ // Load the placement
+ Placement TextPlacement = CENTER;
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH, &TextPlacement);
+
+ mRenderW = sSlider->GetWidth();
+ mRenderH = sSlider->GetHeight();
+ if (TextPlacement == CENTER || TextPlacement == CENTER_X_ONLY) {
+ mRenderX = mRenderX - (mRenderW / 2);
+ if (TextPlacement == CENTER) {
+ mRenderY = mRenderY - (mRenderH / 2);
+ }
+ }
+ if (sSliderLabel) {
+ int sTextX = mRenderX + (mRenderW / 2);
+ int w, h;
+ sSliderLabel->GetCurrentBounds(w, h);
+ int sTextY = mRenderY + ((mRenderH - h) / 2);
+ sSliderLabel->SetRenderPos(sTextX, sTextY);
+ sSliderLabel->SetMaxWidth(mRenderW);
+ }
+ if (sTouch && sTouch->GetResource())
+ {
+ sTouchW = sTouch->GetWidth(); // Width of the "touch image" that follows the touch (arrow)
+ sTouchH = sTouch->GetHeight(); // Height of the "touch image" that follows the touch (arrow)
+ }
+
+ //LOGINFO("mRenderW: %i mTouchW: %i\n", mRenderW, mTouchW);
+ mActionX = mRenderX;
+ mActionY = mRenderY;
+ mActionW = mRenderW;
+ mActionH = mRenderH;
+
+ sAction = new GUIAction(node);
+
+ sCurTouchX = mRenderX;
+ sUpdate = 1;
+}
+
+GUISlider::~GUISlider()
+{
+ delete sAction;
+ delete sSliderLabel;
+}
+
+int GUISlider::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (!sSlider || !sSlider->GetResource())
+ return -1;
+
+ // Draw the slider
+ gr_blit(sSlider->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+
+ // Draw the used
+ if (sSliderUsed && sSliderUsed->GetResource() && sCurTouchX > mRenderX)
+ gr_blit(sSliderUsed->GetResource(), 0, 0, sCurTouchX - mRenderX, mRenderH, mRenderX, mRenderY);
+
+ // Draw the touch icon
+ if (sTouch && sTouch->GetResource())
+ gr_blit(sTouch->GetResource(), 0, 0, sTouchW, sTouchH, sCurTouchX, (mRenderY + ((mRenderH - sTouchH) / 2)));
+
+ if (sSliderLabel) {
+ int ret = sSliderLabel->Render();
+ if (ret < 0) return ret;
+ }
+
+ sUpdate = 0;
+ return 0;
+}
+
+int GUISlider::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ if (sUpdate)
+ return 2;
+ return 0;
+}
+
+int GUISlider::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ static bool dragging = false;
+
+ switch (state)
+ {
+ case TOUCH_START:
+ if (x >= mRenderX && x <= mRenderX + sTouchW &&
+ y >= mRenderY && y <= mRenderY + mRenderH)
+ {
+ sCurTouchX = x - (sTouchW / 2);
+ if (sCurTouchX < mRenderX)
+ sCurTouchX = mRenderX;
+ dragging = true;
+ }
+ break;
+
+ case TOUCH_DRAG:
+ if (!dragging)
+ return 0;
+ if (y < mRenderY - sTouchH || y > mRenderY + (sTouchH * 2))
+ {
+ sCurTouchX = mRenderX;
+ dragging = false;
+ sUpdate = 1;
+ break;
+ }
+ sCurTouchX = x - (sTouchW / 2);
+ if (sCurTouchX < mRenderX)
+ sCurTouchX = mRenderX;
+ if (sCurTouchX > mRenderX + mRenderW - sTouchW)
+ sCurTouchX = mRenderX + mRenderW - sTouchW;
+ sUpdate = 1;
+ break;
+
+ case TOUCH_RELEASE:
+ if (!dragging)
+ return 0;
+
+ if (sCurTouchX >= mRenderX + mRenderW - sTouchW) {
+ DataManager::Vibrate("tw_button_vibrate");
+ sAction->doActions();
+ }
+
+ sCurTouchX = mRenderX;
+ dragging = false;
+ sUpdate = 1;
+ case TOUCH_REPEAT:
+ case TOUCH_HOLD:
+ break;
+ }
+ return 0;
+}
diff --git a/gui/slidervalue.cpp b/gui/slidervalue.cpp
new file mode 100644
index 000000000..6f007e23b
--- /dev/null
+++ b/gui/slidervalue.cpp
@@ -0,0 +1,440 @@
+/*
+ Copyright 2017 TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// slidervalue.cpp - GUISliderValue object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUISliderValue::GUISliderValue(xml_node<>* node) : GUIObject(node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mMin = 0;
+ mMax = 100;
+ mValue = 0;
+ mLineH = 2;
+ mLinePadding = 10;
+ mSliderW = 5;
+ mSliderH = 30;
+ mLineX = 0;
+ mLineY = 0;
+ mValueStr = NULL;
+ mAction = NULL;
+ mShowCurr = true;
+ mShowRange = false;
+ mChangeOnDrag = false;
+ mRendered = false;
+ mBackgroundImage = NULL;
+ mHandleImage = NULL;
+ mHandleHoverImage = NULL;
+ mDragging = false;
+
+ mLabel = NULL;
+ ConvertStrToColor("white", &mTextColor);
+ ConvertStrToColor("white", &mLineColor);
+ ConvertStrToColor("blue", &mSliderColor);
+
+ if (!node)
+ {
+ LOGERR("GUISliderValue created without XML node\n");
+ return;
+ }
+
+ mLabel = new GUIText(node);
+ if (mLabel->Render() < 0)
+ {
+ delete mLabel;
+ mLabel = NULL;
+ }
+
+ mAction = new GUIAction(node);
+
+ child = FindNode(node, "font");
+ if (child)
+ {
+ mFont = LoadAttrFont(child, "resource");
+ mTextColor = LoadAttrColor(child, "color", mTextColor);
+ }
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW);
+
+ child = FindNode(node, "colors");
+ if (child)
+ {
+ mLineColor = LoadAttrColor(child, "line");
+ mSliderColor = LoadAttrColor(child, "slider");
+ }
+
+ child = FindNode(node, "resource");
+ if (child)
+ {
+ mBackgroundImage = LoadAttrImage(child, "background");
+ mHandleImage = LoadAttrImage(child, "handle");
+ mHandleHoverImage = LoadAttrImage(child, "handlehover");
+ }
+
+ child = FindNode(node, "data");
+ if (child)
+ {
+ attr = child->first_attribute("variable");
+ if (attr)
+ mVariable = attr->value();
+
+ attr = child->first_attribute("min");
+ if (attr)
+ {
+ mMinStr = gui_parse_text(attr->value());
+ mMin = atoi(mMinStr.c_str());
+ }
+
+ attr = child->first_attribute("max");
+ if (attr)
+ {
+ mMaxStr = gui_parse_text(attr->value());
+ mMax = atoi(mMaxStr.c_str());
+ }
+
+ if (mMin > mMax)
+ mMin = mMax;
+
+ attr = child->first_attribute("default");
+ if (attr)
+ {
+ string parsevalue = gui_parse_text(attr->value());
+ int def = atoi(parsevalue.c_str());
+
+ if (def < mMin)
+ def = mMin;
+ else if (def > mMax)
+ def = mMax;
+ DataManager::SetValue(mVariable, def);
+ }
+
+ attr = child->first_attribute("showrange");
+ if (attr)
+ mShowRange = atoi(attr->value());
+
+ attr = child->first_attribute("showcurr");
+ if (attr)
+ mShowCurr = atoi(attr->value());
+
+ attr = child->first_attribute("changeondrag");
+ if (attr)
+ mChangeOnDrag = atoi(attr->value());
+ }
+
+ child = FindNode(node, "dimensions");
+ if (child)
+ {
+ mLineH = LoadAttrIntScaleY(child, "lineh", mLineH);
+ mLinePadding = LoadAttrIntScaleX(child, "linepadding", mLinePadding);
+ mSliderW = LoadAttrIntScaleX(child, "sliderw", mSliderW);
+ mSliderH = LoadAttrIntScaleY(child, "sliderh", mSliderH);
+ }
+
+ mFontHeight = mFont->GetHeight();
+
+ if (mShowCurr)
+ {
+ int maxLen = std::max(strlen(mMinStr.c_str()), strlen(mMaxStr.c_str()));
+ mValueStr = new char[maxLen+1];
+ }
+
+ loadValue(true);
+
+ if (mShowRange)
+ {
+ int textW = std::max(measureText(mMaxStr), measureText(mMinStr));
+ mLinePadding += textW;
+ }
+
+ SetRenderPos(mRenderX, mRenderY, mRenderW);
+}
+
+GUISliderValue::~GUISliderValue()
+{
+ delete mLabel;
+ delete mAction;
+ delete[] mValueStr;
+}
+
+void GUISliderValue::loadValue(bool force)
+{
+ if (!mVariable.empty())
+ {
+ int value = DataManager::GetIntValue(mVariable);
+ if (mValue == value && !force)
+ return;
+
+ mValue = value;
+ }
+
+ mValue = std::max(mValue, mMin);
+ mValue = std::min(mValue, mMax);
+ mValuePct = pctFromValue(mValue);
+ mRendered = false;
+}
+
+int GUISliderValue::SetRenderPos(int x, int y, int w, int h)
+{
+ mRenderX = x;
+ mRenderY = y;
+ if (w || h)
+ {
+ mRenderW = w;
+ mRenderH = h;
+ }
+
+ mRenderH = mSliderH;
+ if (mShowCurr)
+ mRenderH += mFontHeight;
+
+ if (mLabel)
+ {
+ int lw, lh;
+ mLabel->GetCurrentBounds(lw, lh);
+ int textX = mRenderX + (mRenderW/2 - lw/2);
+
+ mLabel->SetRenderPos(textX, mRenderY);
+
+ y += lh;
+ mRenderH += lh;
+ }
+
+ mSliderY = y;
+
+ mActionX = mRenderX;
+ mActionY = mRenderY;
+ mActionW = mRenderW;
+ mActionH = mRenderH;
+
+ if (mBackgroundImage && mBackgroundImage->GetResource())
+ {
+ mLineW = mBackgroundImage->GetWidth();
+ mLineH = mBackgroundImage->GetHeight();
+ }
+ else
+ mLineW = mRenderW - (mLinePadding * 2);
+
+ mLineY = y + (mSliderH/2 - mLineH/2);
+ mLineX = mRenderX + (mRenderW/2 - mLineW/2);
+
+ return 0;
+}
+
+int GUISliderValue::measureText(const std::string& str)
+{
+ void* fontResource = NULL;
+ if (mFont) fontResource = mFont->GetResource();
+
+ return gr_ttf_measureEx(str.c_str(), fontResource);
+}
+
+int GUISliderValue::Render(void)
+{
+ if (!isConditionTrue())
+ {
+ mRendered = false;
+ return 0;
+ }
+
+ if (mLabel)
+ {
+ int w, h;
+ mLabel->GetCurrentBounds(w, h);
+ if (w != mLabelW) {
+ mLabelW = w;
+ int textX = mRenderX + (mRenderW/2 - mLabelW/2);
+ mLabel->SetRenderPos(textX, mRenderY);
+ }
+ int res = mLabel->Render();
+ if (res < 0)
+ return res;
+ }
+
+ // line
+ if (mBackgroundImage && mBackgroundImage->GetResource())
+ {
+ gr_blit(mBackgroundImage->GetResource(), 0, 0, mLineW, mLineH, mLineX, mLineY);
+ }
+ else
+ {
+ gr_color(mLineColor.red, mLineColor.green, mLineColor.blue, mLineColor.alpha);
+ gr_fill(mLineX, mLineY, mLineW, mLineH);
+ }
+
+ // slider
+ uint32_t sliderX = mLineX + (mValuePct*(mLineW - mSliderW))/100;
+
+ if (mHandleImage && mHandleImage->GetResource())
+ {
+ gr_surface s = mHandleImage->GetResource();
+ if (mDragging && mHandleHoverImage && mHandleHoverImage->GetResource())
+ s = mHandleHoverImage->GetResource();
+ gr_blit(s, 0, 0, mSliderW, mSliderH, sliderX, mLineY + (mLineH/2 - mSliderH/2));
+ }
+ else
+ {
+ gr_color(mSliderColor.red, mSliderColor.green, mSliderColor.blue, mSliderColor.alpha);
+ gr_fill(sliderX, mSliderY, mSliderW, mSliderH);
+ }
+
+ void *fontResource = NULL;
+ if (mFont) fontResource = mFont->GetResource();
+ gr_color(mTextColor.red, mTextColor.green, mTextColor.blue, mTextColor.alpha);
+ if (mShowRange)
+ {
+ int rangeY = (mLineY - mLineH/2) - mFontHeight/2;
+ gr_textEx_scaleW(mRenderX + mPadding/2, rangeY, mMinStr.c_str(), fontResource, mRenderW, TOP_LEFT, 0);
+ gr_textEx_scaleW(mLineX + mLineW + mPadding/2, rangeY, mMaxStr.c_str(), fontResource, mRenderW, TOP_LEFT, 0);
+ }
+
+ if (mValueStr && mShowCurr)
+ {
+ sprintf(mValueStr, "%d", mValue);
+ int textW = measureText(mValueStr);
+ gr_textEx_scaleW(mRenderX + (mRenderW/2 - textW/2), mSliderY+mSliderH, mValueStr, fontResource, mRenderW, TOP_LEFT, 0);
+ }
+
+ mRendered = true;
+ return 0;
+}
+
+int GUISliderValue::Update(void)
+{
+ if (!isConditionTrue())
+ return mRendered ? 2 : 0;
+ if (!mRendered)
+ return 2;
+
+ if (mLabel)
+ return mLabel->Update();
+ return 0;
+}
+
+int GUISliderValue::valueFromPct(float pct)
+{
+ int range = abs(mMax - mMin);
+ return mMin + (pct * range) / 100;
+}
+
+float GUISliderValue::pctFromValue(int value)
+{
+ return float((value - mMin) * 100) / abs(mMax - mMin);
+}
+
+int GUISliderValue::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ switch (state)
+ {
+ case TOUCH_START:
+ if (x >= mLineX && x <= mLineX + mLineW &&
+ y >= mRenderY && y <= mRenderY + mRenderH)
+ {
+ mDragging = true;
+ }
+ // no break
+ case TOUCH_DRAG:
+ {
+ if (!mDragging) return 0;
+
+ x = std::max(mLineX + mSliderW/2, x);
+ x = std::min(mLineX + mLineW - mSliderW/2, x);
+
+ mValuePct = float(((x - (mLineX + mSliderW/2)) * 100) / (mLineW - mSliderW));
+ int newVal = valueFromPct(mValuePct);
+ if (newVal != mValue) {
+ mRendered = false;
+ mValue = newVal;
+ if (mChangeOnDrag) {
+ if (!mVariable.empty())
+ DataManager::SetValue(mVariable, mValue);
+ if (mAction)
+ mAction->doActions();
+ }
+ }
+ break;
+ }
+ case TOUCH_RELEASE:
+ {
+ if (!mDragging) return 0;
+ mDragging = false;
+
+ if (!mVariable.empty())
+ DataManager::SetValue(mVariable, mValue);
+ if (mAction)
+ mAction->doActions();
+ break;
+ }
+ case TOUCH_REPEAT:
+ case TOUCH_HOLD:
+ break;
+ }
+ return 0;
+}
+
+int GUISliderValue::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIObject::NotifyVarChange(varName, value);
+
+ if (mLabel)
+ mLabel->NotifyVarChange(varName, value);
+ if (varName == mVariable) {
+ int newVal = atoi(value.c_str());
+ if (newVal != mValue) {
+ mValue = newVal;
+ mValuePct = pctFromValue(mValue);
+ mRendered = false;
+ }
+ }
+ return 0;
+}
+
+void GUISliderValue::SetPageFocus(int inFocus)
+{
+ if (inFocus)
+ loadValue();
+}
diff --git a/gui/terminal.cpp b/gui/terminal.cpp
new file mode 100644
index 000000000..fe80fb097
--- /dev/null
+++ b/gui/terminal.cpp
@@ -0,0 +1,906 @@
+/*
+ Copyright 2016 _that/TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// terminal.cpp - GUITerminal object
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <termio.h>
+
+#include <string>
+#include <cctype>
+#include <linux/input.h>
+#include <sys/wait.h>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+#if 0
+#define debug_printf printf
+#else
+#define debug_printf(...)
+#endif
+
+extern int g_pty_fd; // in gui.cpp where the select is
+
+/*
+Pseudoterminal handler.
+*/
+class Pseudoterminal
+{
+public:
+ Pseudoterminal() : fdMaster(0), pid(0)
+ {
+ }
+
+ bool started() const { return pid > 0; }
+
+ bool start()
+ {
+ fdMaster = getpt();
+ if (fdMaster < 0) {
+ LOGERR("Error %d on getpt()\n", errno);
+ return false;
+ }
+
+ if (unlockpt(fdMaster) != 0) {
+ LOGERR("Error %d on unlockpt()\n", errno);
+ return false;
+ }
+
+ pid = fork();
+ if (pid < 0) {
+ LOGERR("fork failed for pty, error %d\n", errno);
+ close(fdMaster);
+ pid = 0;
+ return false;
+ }
+ else if (pid) {
+ // child started, now someone needs to periodically read from fdMaster
+ // and write it to the terminal
+ // this currently works through gui.cpp calling terminal_pty_read below
+ g_pty_fd = fdMaster;
+ return true;
+ }
+ else {
+ int fdSlave = open(ptsname(fdMaster), O_RDWR);
+ close(fdMaster);
+ runSlave(fdSlave);
+ }
+ // we can't get here
+ LOGERR("impossible error in pty\n");
+ return false;
+ }
+
+ void runSlave(int fdSlave)
+ {
+ dup2(fdSlave, 0); // PTY becomes standard input (0)
+ dup2(fdSlave, 1); // PTY becomes standard output (1)
+ dup2(fdSlave, 2); // PTY becomes standard error (2)
+
+ // Now the original file descriptor is useless
+ close(fdSlave);
+
+ // Make the current process a new session leader
+ if (setsid() == (pid_t)-1)
+ LOGERR("setsid failed: %d\n", errno);
+
+ // As the child is a session leader, set the controlling terminal to be the slave side of the PTY
+ // (Mandatory for programs like the shell to make them manage correctly their outputs)
+ ioctl(0, TIOCSCTTY, 1);
+
+ execl("/sbin/sh", "sh", NULL);
+ _exit(127);
+ }
+
+ int read(char* buffer, size_t size)
+ {
+ if (!started()) {
+ LOGERR("someone tried to read from pty, but it was not started\n");
+ return -1;
+ }
+ int rc = ::read(fdMaster, buffer, size);
+ debug_printf("pty read: %d bytes\n", rc);
+ if (rc < 0) {
+ // assume child has died (usual errno when shell exits seems to be EIO == 5)
+ if (errno != EIO)
+ LOGERR("pty read failed: %d\n", errno);
+ stop();
+ }
+ return rc;
+ }
+
+ int write(const char* buffer, size_t size)
+ {
+ if (!started()) {
+ LOGERR("someone tried to write to pty, but it was not started\n");
+ return -1;
+ }
+ int rc = ::write(fdMaster, buffer, size);
+ debug_printf("pty write: %d bytes -> %d\n", size, rc);
+ if (rc < 0) {
+ LOGERR("pty write failed: %d\n", errno);
+ // assume child has died
+ stop();
+ }
+ return rc;
+ }
+
+ template<size_t n>
+ inline int write(const char (&literal)[n])
+ {
+ return write(literal, n-1);
+ }
+
+ void resize(int xChars, int yChars, int w, int h)
+ {
+ struct winsize ws;
+ ws.ws_row = yChars;
+ ws.ws_col = xChars;
+ ws.ws_xpixel = w;
+ ws.ws_ypixel = h;
+ if (ioctl(fdMaster, TIOCSWINSZ, &ws) < 0)
+ LOGERR("failed to set window size, error %d\n", errno);
+ }
+
+ void stop()
+ {
+ if (!started()) {
+ LOGERR("someone tried to stop pty, but it was not started\n");
+ return;
+ }
+ close(fdMaster);
+ g_pty_fd = fdMaster = -1;
+ int status;
+ waitpid(pid, &status, WNOHANG); // avoid zombies but don't hang if the child is still alive and we got here due to some error
+ pid = 0;
+ }
+
+private:
+ int fdMaster;
+ pid_t pid;
+};
+
+// UTF-8 decoder
+// Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>
+// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.
+
+const uint32_t UTF8_ACCEPT = 0;
+const uint32_t UTF8_REJECT = 1;
+
+static const uint8_t utf8d[] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf
+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df
+ 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef
+ 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff
+ 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2
+ 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4
+ 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6
+ 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8
+};
+
+uint32_t inline utf8decode(uint32_t* state, uint32_t* codep, uint32_t byte)
+{
+ uint32_t type = utf8d[byte];
+
+ *codep = (*state != UTF8_ACCEPT) ?
+ (byte & 0x3fu) | (*codep << 6) :
+ (0xff >> type) & (byte);
+
+ *state = utf8d[256 + *state*16 + type];
+ return *state;
+}
+// end of UTF-8 decoder
+
+// Append a UTF-8 codepoint to string s
+size_t utf8add(std::string& s, uint32_t cp)
+{
+ if (cp < 0x7f) {
+ s += cp;
+ return 1;
+ }
+ else if (cp < 0x7ff) {
+ s += (0xc0 | (cp >> 6));
+ s += (0x80 | (cp & 0x3f));
+ return 2;
+ }
+ else if (cp < 0xffff) {
+ s += (0xe0 | (cp >> 12));
+ s += (0x80 | ((cp >> 6) & 0x3f));
+ s += (0x80 | (cp & 0x3f));
+ return 3;
+ }
+ else if (cp < 0x1fffff) {
+ s += (0xf0 | (cp >> 18));
+ s += (0x80 | ((cp >> 12) & 0x3f));
+ s += (0x80 | ((cp >> 6) & 0x3f));
+ s += (0x80 | (cp & 0x3f));
+ return 4;
+ }
+ return 0;
+}
+
+/*
+TerminalEngine is the terminal back-end, dealing with the text buffer and attributes
+and with communicating with the pty.
+It does not care about visual things like rendering, fonts, windows etc.
+The idea is that 0 to n GUITerminal instances (e.g. on different pages) can connect
+to one TerminalEngine to interact with the terminal, and that the TerminalEngine
+survives things like page changes or even theme reloads.
+*/
+class TerminalEngine
+{
+public:
+#if 0 // later
+ struct Attributes
+ {
+ COLOR fgcolor; // TODO: what about palette?
+ COLOR bgcolor;
+ // could add bold, underline, blink, etc.
+ };
+
+ struct AttributeRange
+ {
+ size_t start; // start position inside text (in bytes)
+ Attributes a;
+ };
+#endif
+ typedef uint32_t CodePoint; // Unicode code point
+
+ // A line of text, optimized for rendering and storage in the buffer
+ struct Line
+ {
+ std::string text; // in UTF-8 format
+// std::vector<AttributeRange> attrs;
+ Line() {}
+ size_t utf8forward(size_t start) const
+ {
+ if (start >= text.size())
+ return start;
+ uint32_t u8state = 0, u8cp = 0;
+ size_t i = start;
+ uint32_t rc;
+ do {
+ rc = utf8decode(&u8state, &u8cp, (unsigned char)text[i]);
+ ++i;
+ } while (rc != UTF8_ACCEPT && rc != UTF8_REJECT && i < text.size());
+ return i;
+ }
+
+ std::string substr(size_t start, size_t n) const
+ {
+ size_t i = 0;
+ for (; start && i < text.size(); i = utf8forward(i))
+ --start;
+ size_t s = i;
+ for (; n && i < text.size(); i = utf8forward(i))
+ --n;
+ return text.substr(s, i - s);
+ }
+ size_t length() const
+ {
+ size_t n = 0;
+ for (size_t i = 0; i < text.size(); i = utf8forward(i))
+ ++n;
+ return n;
+ }
+ };
+
+ // A single character cell with a Unicode code point
+ struct Cell
+ {
+ Cell() : cp(' ') {}
+ Cell(CodePoint cp) : cp(cp) {}
+ CodePoint cp;
+// Attributes a;
+ };
+
+ // A line of text, optimized for editing single characters
+ struct UnpackedLine
+ {
+ std::vector<Cell> cells;
+ void eraseFrom(size_t x)
+ {
+ if (cells.size() > x)
+ cells.erase(cells.begin() + x, cells.end());
+ }
+
+ void eraseTo(size_t x)
+ {
+ if (x > 0)
+ cells.erase(cells.begin(), cells.begin() + x);
+ }
+ };
+
+ TerminalEngine()
+ {
+ // the default size will be overwritten by the GUI window when the size is known
+ width = 40;
+ height = 10;
+
+ clear();
+ updateCounter = 0;
+ state = kStateGround;
+ utf8state = utf8codepoint = 0;
+ }
+
+ void setSize(int xChars, int yChars, int w, int h)
+ {
+ width = xChars;
+ height = yChars;
+ if (pty.started())
+ pty.resize(width, height, w, h);
+ debug_printf("setSize: %d*%d chars, %d*%d pixels\n", xChars, yChars, w, h);
+ }
+
+ void initPty()
+ {
+ if (!pty.started())
+ {
+ pty.start();
+ pty.resize(width, height, 0, 0);
+ }
+ }
+
+ void readPty()
+ {
+ char buffer[1024];
+ int rc = pty.read(buffer, sizeof(buffer));
+ debug_printf("readPty: %d bytes\n", rc);
+ if (rc < 0)
+ output("\r\nChild process exited.\r\n"); // TODO: maybe exit terminal here
+ else
+ for (int i = 0; i < rc; ++i)
+ output(buffer[i]);
+ }
+
+ void clear()
+ {
+ cursorX = cursorY = 0;
+ lines.clear();
+ setY(0);
+ unpackLine(0);
+ ++updateCounter;
+ }
+
+ void output(const char *buf)
+ {
+ for (const char* p = buf; *p; ++p)
+ output(*p);
+ }
+
+ void output(const char ch)
+ {
+ char debug[2]; debug[0] = ch; debug[1] = 0;
+ debug_printf("output: %d %s\n", (int)ch, (ch >= ' ' && ch < 127) ? debug : ch == 27 ? "esc" : "");
+ if (ch < 32) {
+ // always process control chars, even after incomplete UTF-8 fragments
+ processC0(ch);
+ if (utf8state != UTF8_ACCEPT)
+ {
+ debug_printf("Terminal: incomplete UTF-8 fragment before control char ignored, codepoint=%u ch=%d\n", utf8codepoint, (int)ch);
+ utf8state = UTF8_ACCEPT;
+ }
+ return;
+ }
+ uint32_t rc = utf8decode(&utf8state, &utf8codepoint, (unsigned char)ch);
+ if (rc == UTF8_ACCEPT)
+ processCodePoint(utf8codepoint);
+ else if (rc == UTF8_REJECT) {
+ debug_printf("Terminal: invalid UTF-8 sequence ignored, codepoint=%u ch=%d\n", utf8codepoint, (int)ch);
+ utf8state = UTF8_ACCEPT;
+ }
+ // else we need to read more bytes to assemble a codepoint
+ }
+
+ bool inputChar(int ch)
+ {
+ debug_printf("inputChar: %d\n", ch);
+ initPty(); // reinit just in case it died before
+ // encode the char as UTF-8 and send it to the pty
+ std::string c;
+ utf8add(c, (uint32_t)ch);
+ pty.write(c.c_str(), c.size());
+ return true;
+ }
+
+ bool inputKey(int key)
+ {
+ debug_printf("inputKey: %d\n", key);
+ switch (key)
+ {
+ case KEY_UP: pty.write("\e[A"); break;
+ case KEY_DOWN: pty.write("\e[B"); break;
+ case KEY_RIGHT: pty.write("\e[C"); break;
+ case KEY_LEFT: pty.write("\e[D"); break;
+ case KEY_HOME: pty.write("\eOH"); break;
+ case KEY_END: pty.write("\eOF"); break;
+ case KEY_INSERT: pty.write("\e[2~"); break;
+ case KEY_DELETE: pty.write("\e[3~"); break;
+ case KEY_PAGEUP: pty.write("\e[5~"); break;
+ case KEY_PAGEDOWN: pty.write("\e[6~"); break;
+ // TODO: other keys
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ size_t getLinesCount() const { return lines.size(); }
+ const Line& getLine(size_t n) { if (unpackedY == n) packLine(); return lines[n]; }
+ int getCursorX() const { return cursorX; }
+ int getCursorY() const { return cursorY; }
+ int getUpdateCounter() const { return updateCounter; }
+
+ void setX(int x)
+ {
+ x = min(width, max(x, 0));
+ cursorX = x;
+ ++updateCounter;
+ }
+
+ void setY(int y)
+ {
+ //y = min(height, max(y, 0));
+ y = max(y, 0);
+ cursorY = y;
+ while (lines.size() <= (size_t) y)
+ lines.push_back(Line());
+ ++updateCounter;
+ }
+
+ void up(int n = 1) { setY(cursorY - n); }
+ void down(int n = 1) { setY(cursorY + n); }
+ void left(int n = 1) { setX(cursorX - n); }
+ void right(int n = 1) { setX(cursorX + n); }
+
+private:
+ void packLine()
+ {
+ std::string& s = lines[unpackedY].text;
+ s.clear();
+ for (size_t i = 0; i < unpackedLine.cells.size(); ++i) {
+ Cell& c = unpackedLine.cells[i];
+ utf8add(s, c.cp);
+ // later: if attributes changed, add attributes
+ }
+ }
+
+ void unpackLine(size_t y)
+ {
+ uint32_t u8state = 0, u8cp = 0;
+ std::string& s = lines[y].text;
+ unpackedLine.cells.clear();
+ for (size_t i = 0; i < s.size(); ++i) {
+ uint32_t rc = utf8decode(&u8state, &u8cp, (unsigned char)s[i]);
+ if (rc == UTF8_ACCEPT)
+ unpackedLine.cells.push_back(Cell(u8cp));
+ }
+ if (unpackedLine.cells.size() < (size_t)width)
+ unpackedLine.cells.resize(width);
+ unpackedY = y;
+ }
+
+ void ensureUnpacked(size_t y)
+ {
+ if (unpackedY != y)
+ {
+ packLine();
+ unpackLine(y);
+ }
+ }
+
+ void processC0(char ch)
+ {
+ switch (ch)
+ {
+ case 7: // BEL
+ DataManager::Vibrate("tw_button_vibrate");
+ break;
+ case 8: // BS
+ left();
+ break;
+ case 9: // HT
+ // TODO: this might be totally wrong
+ right();
+ while (cursorX % 8 != 0 && cursorX < width)
+ right();
+ break;
+ case 10: // LF
+ case 11: // VT
+ case 12: // FF
+ down();
+ break;
+ case 13: // CR
+ setX(0);
+ break;
+ case 24: // CAN
+ case 26: // SUB
+ state = kStateGround;
+ ctlseq.clear();
+ break;
+ case 27: // ESC
+ state = kStateEsc;
+ ctlseq.clear();
+ break;
+ }
+ }
+
+ void processCodePoint(CodePoint cp)
+ {
+ ++updateCounter;
+ debug_printf("codepoint: %u\n", cp);
+ if (cp == 0x9b) // CSI
+ {
+ state = kStateCsi;
+ ctlseq.clear();
+ return;
+ }
+ switch (state)
+ {
+ case kStateGround:
+ processChar(cp);
+ break;
+ case kStateEsc:
+ processEsc(cp);
+ break;
+ case kStateCsi:
+ processControlSequence(cp);
+ break;
+ }
+ }
+
+ void processChar(CodePoint cp)
+ {
+ ensureUnpacked(cursorY);
+ // extend unpackedLine if needed, write ch into cell
+ if (unpackedLine.cells.size() <= (size_t)cursorX)
+ unpackedLine.cells.resize(cursorX+1);
+ unpackedLine.cells[cursorX].cp = cp;
+
+ right();
+ if (cursorX >= width)
+ {
+ // TODO: configurable line wrapping
+ // TODO: don't go down immediately but only on next char?
+ down();
+ setX(0);
+ }
+ // TODO: update all GUI objects that display this terminal engine
+ }
+
+ void processEsc(CodePoint cp)
+ {
+ switch (cp) {
+ case 'c': // TODO: Reset
+ break;
+ case 'D': // Line feed
+ down();
+ break;
+ case 'E': // Newline
+ setX(0);
+ down();
+ break;
+ case '[': // CSI
+ state = kStateCsi;
+ ctlseq.clear();
+ break;
+ case ']': // TODO: OSC state
+ default:
+ state = kStateGround;
+ }
+ }
+
+ void processControlSequence(CodePoint cp)
+ {
+ if (cp >= 0x40 && cp <= 0x7e) {
+ ctlseq += cp;
+ execControlSequence(ctlseq);
+ ctlseq.clear();
+ state = kStateGround;
+ return;
+ }
+ if (isdigit(cp) || cp == ';' /* || (ch >= 0x3c && ch <= 0x3f) */) {
+ ctlseq += cp;
+ // state = kStateCsiParam;
+ return;
+ }
+ }
+
+ static int parseArg(std::string& s, int defaultvalue)
+ {
+ if (s.empty() || !isdigit(s[0]))
+ return defaultvalue;
+ int value = atoi(s.c_str());
+ size_t pos = s.find(';');
+ s.erase(0, pos != std::string::npos ? pos+1 : std::string::npos);
+ return value;
+ }
+
+ void execControlSequence(std::string ctlseq)
+ {
+ // assert(!ctlseq.empty());
+ if (ctlseq == "6n") {
+ // CPR - cursor position report
+ char answer[20];
+ sprintf(answer, "\e[%d;%dR", cursorY, cursorX);
+ pty.write(answer, strlen(answer));
+ return;
+ }
+ char f = *ctlseq.rbegin();
+ // if (f == '?') ... private mode
+ switch (f)
+ {
+ // case '@': // ICH - insert character
+ case 'A': // CUU - cursor up
+ up(parseArg(ctlseq, 1));
+ break;
+ case 'B': // CUD - cursor down
+ case 'e': // VPR - line position forward
+ down(parseArg(ctlseq, 1));
+ break;
+ case 'C': // CUF - cursor right
+ case 'a': // HPR - character position forward
+ right(parseArg(ctlseq, 1));
+ break;
+ case 'D': // CUB - cursor left
+ left(parseArg(ctlseq, 1));
+ break;
+ case 'E': // CNL - cursor next line
+ down(parseArg(ctlseq, 1));
+ setX(0);
+ break;
+ case 'F': // CPL - cursor preceding line
+ up(parseArg(ctlseq, 1));
+ setX(0);
+ break;
+ case 'G': // CHA - cursor character absolute
+ setX(parseArg(ctlseq, 1)-1);
+ break;
+ case 'H': // CUP - cursor position
+ // TODO: consider scrollback area
+ setY(parseArg(ctlseq, 1)-1);
+ setX(parseArg(ctlseq, 1)-1);
+ break;
+ case 'J': // ED - erase in page
+ {
+ int param = parseArg(ctlseq, 0);
+ ensureUnpacked(cursorY);
+ switch (param) {
+ default:
+ case 0:
+ unpackedLine.eraseFrom(cursorX);
+ if (lines.size() > (size_t)cursorY+1)
+ lines.erase(lines.begin() + cursorY+1, lines.end());
+ break;
+ case 1:
+ unpackedLine.eraseTo(cursorX);
+ if (cursorY > 0) {
+ lines.erase(lines.begin(), lines.begin() + cursorY-1);
+ cursorY = 0;
+ }
+ break;
+ case 2: // clear
+ case 3: // clear incl scrollback
+ clear();
+ break;
+ }
+ }
+ break;
+ case 'K': // EL - erase in line
+ {
+ int param = parseArg(ctlseq, 0);
+ ensureUnpacked(cursorY);
+ switch (param) {
+ default:
+ case 0:
+ unpackedLine.eraseFrom(cursorX);
+ break;
+ case 1:
+ unpackedLine.eraseTo(cursorX);
+ break;
+ case 2:
+ unpackedLine.cells.clear();
+ break;
+ }
+ }
+ break;
+ // case 'L': // IL - insert line
+
+ default:
+ debug_printf("unknown ctlseq: '%s'\n", ctlseq.c_str());
+ break;
+ }
+ }
+
+private:
+ int cursorX, cursorY; // 0-based, char based. TODO: decide how to handle scrollback
+ int width, height; // window size in chars
+ std::vector<Line> lines; // the text buffer
+ UnpackedLine unpackedLine; // current line for editing
+ size_t unpackedY; // number of current line
+ int updateCounter; // changes whenever terminal could require redraw
+
+ Pseudoterminal pty;
+ enum { kStateGround, kStateEsc, kStateCsi } state;
+
+ // for accumulating a full UTF-8 character from individual bytes
+ uint32_t utf8state;
+ uint32_t utf8codepoint;
+
+ // for accumulating a control sequence after receiving CSI
+ std::string ctlseq;
+};
+
+// The one and only terminal engine for now
+TerminalEngine gEngine;
+
+void terminal_pty_read()
+{
+ gEngine.readPty();
+}
+
+
+GUITerminal::GUITerminal(xml_node<>* node) : GUIScrollList(node)
+{
+ allowSelection = false; // terminal doesn't support list item selections
+ lastCondition = false;
+
+ if (!node) {
+ mRenderX = 0;
+ mRenderY = 0;
+ mRenderW = gr_fb_width();
+ mRenderH = gr_fb_height();
+ }
+
+ engine = &gEngine;
+ updateCounter = 0;
+}
+
+int GUITerminal::Update(void)
+{
+ if (!isConditionTrue()) {
+ lastCondition = false;
+ return 0;
+ }
+
+ if (lastCondition == false) {
+ lastCondition = true;
+ // we're becoming visible, so we might need to resize the terminal content
+ InitAndResize();
+ }
+
+ if (updateCounter != engine->getUpdateCounter()) {
+ // try to keep the cursor in view
+ SetVisibleListLocation(engine->getCursorY());
+ updateCounter = engine->getUpdateCounter();
+ }
+
+ GUIScrollList::Update();
+
+ if (mUpdate) {
+ mUpdate = 0;
+ if (Render() == 0)
+ return 2;
+ }
+ return 0;
+}
+
+// NotifyTouch - Notify of a touch event
+// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+int GUITerminal::NotifyTouch(TOUCH_STATE state, int x, int y)
+{
+ if (!isConditionTrue())
+ return -1;
+
+ // TODO: grab focus correctly
+ // TODO: fix focus handling in PageManager and GUIInput
+ SetInputFocus(1);
+ debug_printf("Terminal: SetInputFocus\n");
+ return GUIScrollList::NotifyTouch(state, x, y);
+ // TODO later: allow cursor positioning by touch (simulate mouse click?)
+ // http://stackoverflow.com/questions/5966903/how-to-get-mousemove-and-mouseclick-in-bash
+ // will likely not work with Busybox anyway
+}
+
+int GUITerminal::NotifyKey(int key, bool down)
+{
+ if (!HasInputFocus)
+ return 1;
+ if (down)
+ if (engine->inputKey(key))
+ mUpdate = 1;
+ return 0;
+}
+
+// character input
+int GUITerminal::NotifyCharInput(int ch)
+{
+ if (engine->inputChar(ch))
+ mUpdate = 1;
+ return 0;
+}
+
+size_t GUITerminal::GetItemCount()
+{
+ return engine->getLinesCount();
+}
+
+void GUITerminal::RenderItem(size_t itemindex, int yPos, bool selected)
+{
+ const TerminalEngine::Line& line = engine->getLine(itemindex);
+
+ gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
+ // later: handle attributes here
+
+ // render text
+ const char* text = line.text.c_str();
+ gr_textEx_scaleW(mRenderX, yPos, text, mFont->GetResource(), mRenderW, TOP_LEFT, 0);
+
+ if (itemindex == (size_t) engine->getCursorY()) {
+ // render cursor
+ int cursorX = engine->getCursorX();
+ std::string leftOfCursor = line.substr(0, cursorX);
+ int x = gr_ttf_measureEx(leftOfCursor.c_str(), mFont->GetResource());
+ // note that this single character can be a UTF-8 sequence
+ std::string atCursor = (size_t)cursorX < line.length() ? line.substr(cursorX, 1) : " ";
+ int w = gr_ttf_measureEx(atCursor.c_str(), mFont->GetResource());
+ gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
+ gr_fill(mRenderX + x, yPos, w, actualItemHeight);
+ gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, mBackgroundColor.alpha);
+ gr_textEx_scaleW(mRenderX + x, yPos, atCursor.c_str(), mFont->GetResource(), mRenderW, TOP_LEFT, 0);
+ }
+}
+
+void GUITerminal::NotifySelect(size_t item_selected)
+{
+ // do nothing - terminal ignores selections
+}
+
+void GUITerminal::InitAndResize()
+{
+ // make sure the shell is started
+ engine->initPty();
+ // send window resize
+ int charWidth = gr_ttf_measureEx("N", mFont->GetResource());
+ engine->setSize(mRenderW / charWidth, GetDisplayItemCount(), mRenderW, mRenderH);
+}
+
+void GUITerminal::SetPageFocus(int inFocus)
+{
+ if (inFocus && isConditionTrue()) {
+ // TODO: grab focus correctly, this hack grabs focus and insists that the terminal be the focus regardless of other elements
+ // It's highly unlikely that there will be any other visible input elements on the page anyway...
+ SetInputFocus(1);
+ InitAndResize();
+ }
+}
diff --git a/gui/text.cpp b/gui/text.cpp
new file mode 100644
index 000000000..61940ff9f
--- /dev/null
+++ b/gui/text.cpp
@@ -0,0 +1,186 @@
+/*
+ Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// text.cpp - GUIText object
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUIText::GUIText(xml_node<>* node)
+ : GUIObject(node)
+{
+ mFont = NULL;
+ mIsStatic = 1;
+ mVarChanged = 0;
+ mFontHeight = 0;
+ maxWidth = 0;
+ scaleWidth = true;
+ isHighlighted = false;
+ mText = "";
+
+ if (!node)
+ return;
+
+ // Load colors
+ mColor = LoadAttrColor(node, "color", COLOR(0,0,0,255));
+ mHighlightColor = LoadAttrColor(node, "highlightcolor", mColor);
+
+ // Load the font, and possibly override the color
+ mFont = LoadAttrFont(FindNode(node, "font"), "resource");
+ if (!mFont)
+ return;
+ mColor = LoadAttrColor(FindNode(node, "font"), "color", mColor);
+ mHighlightColor = LoadAttrColor(FindNode(node, "font"), "highlightcolor", mColor);
+
+ // Load the placement
+ LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH, &mPlacement);
+
+ xml_node<>* child = FindNode(node, "text");
+ if (child) mText = child->value();
+
+ child = FindNode(node, "noscaling");
+ if (child) {
+ scaleWidth = false;
+ } else {
+ if (mPlacement == TOP_LEFT || mPlacement == BOTTOM_LEFT) {
+ maxWidth = gr_fb_width() - mRenderX;
+ } else if (mPlacement == TOP_RIGHT || mPlacement == BOTTOM_RIGHT) {
+ maxWidth = mRenderX;
+ } else if (mPlacement == CENTER || mPlacement == CENTER_X_ONLY) {
+ if (mRenderX < gr_fb_width() / 2) {
+ maxWidth = mRenderX * 2;
+ } else {
+ maxWidth = (gr_fb_width() - mRenderX) * 2;
+ }
+ }
+ }
+
+ // Simple way to check for static state
+ mLastValue = gui_parse_text(mText);
+ if (mLastValue != mText) mIsStatic = 0;
+
+ mFontHeight = mFont->GetHeight();
+}
+
+int GUIText::Render(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ void* fontResource = NULL;
+ if (mFont)
+ fontResource = mFont->GetResource();
+ else
+ return -1;
+
+ mLastValue = gui_parse_text(mText);
+
+ mVarChanged = 0;
+
+ if (isHighlighted)
+ gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
+ else
+ gr_color(mColor.red, mColor.green, mColor.blue, mColor.alpha);
+
+ gr_textEx_scaleW(mRenderX, mRenderY, mLastValue.c_str(), fontResource, maxWidth, mPlacement, scaleWidth);
+
+ return 0;
+}
+
+int GUIText::Update(void)
+{
+ if (!isConditionTrue())
+ return 0;
+
+ static int updateCounter = 3;
+
+ // This hack just makes sure we update at least once a minute for things like clock and battery
+ if (updateCounter) updateCounter--;
+ else
+ {
+ mVarChanged = 1;
+ updateCounter = 3;
+ }
+
+ if (mIsStatic || !mVarChanged)
+ return 0;
+
+ std::string newValue = gui_parse_text(mText);
+ if (mLastValue == newValue)
+ return 0;
+ else
+ mLastValue = newValue;
+ return 2;
+}
+
+int GUIText::GetCurrentBounds(int& w, int& h)
+{
+ void* fontResource = NULL;
+
+ if (mFont)
+ fontResource = mFont->GetResource();
+
+ h = mFontHeight;
+ mLastValue = gui_parse_text(mText);
+ w = gr_ttf_measureEx(mLastValue.c_str(), fontResource);
+ return 0;
+}
+
+int GUIText::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIObject::NotifyVarChange(varName, value);
+
+ mVarChanged = 1;
+ return 0;
+}
+
+int GUIText::SetMaxWidth(unsigned width)
+{
+ maxWidth = width;
+ if (!maxWidth)
+ scaleWidth = false;
+ mVarChanged = 1;
+ return 0;
+}
+
+void GUIText::SetText(string newtext)
+{
+ mText = newtext;
+}
diff --git a/gui/textbox.cpp b/gui/textbox.cpp
new file mode 100644
index 000000000..2c7d09f99
--- /dev/null
+++ b/gui/textbox.cpp
@@ -0,0 +1,120 @@
+/*
+ Copyright 2015 bigbiff/Dees_Troy/_that TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// textbox.cpp - GUITextBox object
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+GUITextBox::GUITextBox(xml_node<>* node) : GUIScrollList(node)
+{
+ xml_node<>* child;
+
+ mLastCount = 0;
+ mIsStatic = true;
+
+ allowSelection = false; // textbox doesn't support list item selections
+
+ child = FindNode(node, "color");
+ if (child)
+ {
+ mFontColor = LoadAttrColor(child, "foreground", mFontColor);
+ mBackgroundColor = LoadAttrColor(child, "background", mBackgroundColor);
+ //mScrollColor = LoadAttrColor(child, "scroll", mScrollColor);
+ }
+ child = FindNode(node, "text");
+ while (child) {
+ string txt = child->value();
+ mText.push_back(txt);
+ string lookup = gui_parse_text(txt);
+ if (lookup != txt)
+ mIsStatic = false;
+ mLastValue.push_back(lookup);
+ child = child->next_sibling("text");
+ }
+}
+
+int GUITextBox::Update(void)
+{
+ if (AddLines(&mLastValue, NULL, &mLastCount, &rText, NULL)) {
+ // someone added new text
+ // at least the scrollbar must be updated, even if the new lines are currently not visible
+ mUpdate = 1;
+ }
+
+ GUIScrollList::Update();
+
+ if (mUpdate) {
+ mUpdate = 0;
+ if (Render() == 0)
+ return 2;
+ }
+ return 0;
+}
+
+size_t GUITextBox::GetItemCount()
+{
+ return rText.size();
+}
+
+void GUITextBox::RenderItem(size_t itemindex, int yPos, bool selected __unused)
+{
+ // Set the color for the font
+ gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
+
+ // render text
+ const char* text = rText[itemindex].c_str();
+ gr_textEx_scaleW(mRenderX, yPos, text, mFont->GetResource(), mRenderW, TOP_LEFT, 0);
+}
+
+void GUITextBox::NotifySelect(size_t item_selected __unused)
+{
+ // do nothing - textbox ignores selections
+}
+
+int GUITextBox::NotifyVarChange(const std::string& varName, const std::string& value)
+{
+ GUIScrollList::NotifyVarChange(varName, value);
+
+ if (!isConditionTrue() || mIsStatic)
+ return 0;
+
+ // Check to see if the variable exists in mText
+ for (size_t i = 0; i < mText.size(); i++) {
+ string lookup = gui_parse_text(mText.at(i));
+ if (lookup != mText.at(i)) {
+ mLastValue.at(i) = lookup;
+ mUpdate = 1;
+ // There are ways to improve efficiency here, but I am not
+ // sure if we will even use this feature in the stock theme
+ // at all except for language translation. If we start using
+ // variables in textboxes in the stock theme, we can circle
+ // back and make improvements here.
+ mLastCount = 0;
+ rText.clear();
+ }
+ }
+ return 0;
+}
diff --git a/gui/theme/common/fonts/DroidSansMono.ttf b/gui/theme/common/fonts/DroidSansMono.ttf
new file mode 100644
index 000000000..4085cee84
--- /dev/null
+++ b/gui/theme/common/fonts/DroidSansMono.ttf
Binary files differ
diff --git a/gui/theme/common/fonts/RobotoCondensed-Regular.ttf b/gui/theme/common/fonts/RobotoCondensed-Regular.ttf
new file mode 100644
index 000000000..b9fc49c95
--- /dev/null
+++ b/gui/theme/common/fonts/RobotoCondensed-Regular.ttf
Binary files differ
diff --git a/gui/theme/common/images/progress_empty.png b/gui/theme/common/images/progress_empty.png
new file mode 100644
index 000000000..1a7471e44
--- /dev/null
+++ b/gui/theme/common/images/progress_empty.png
Binary files differ
diff --git a/gui/theme/common/images/progress_fill.png b/gui/theme/common/images/progress_fill.png
new file mode 100644
index 000000000..7f4121fe5
--- /dev/null
+++ b/gui/theme/common/images/progress_fill.png
Binary files differ
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
new file mode 100644
index 000000000..6d544833f
--- /dev/null
+++ b/gui/theme/common/landscape.xml
@@ -0,0 +1,5178 @@
+<?xml version="1.0"?>
+<recovery>
+ <styles>
+ <style name="text_l">
+ <font resource="font_l" color="%text_color%"/>
+ </style>
+
+ <style name="text_m">
+ <font resource="font_m" color="%text_color%"/>
+ </style>
+
+ <style name="text_m_accent">
+ <font resource="font_m" color="%accent_color%"/>
+ </style>
+
+ <style name="text_m_fail">
+ <font resource="font_m" color="%text_fail_color%"/>
+ </style>
+
+ <style name="text_s">
+ <font resource="font_s" color="%text_color%"/>
+ </style>
+
+ <style name="input">
+ <background color="%background_color%"/>
+ <cursor color="%accent_color%" hasfocus="1" width="%input_line_width%"/>
+ <font resource="font_m" color="%text_color%"/>
+ </style>
+
+ <style name="checkbox">
+ <font resource="font_m" color="%text_color%"/>
+ <image checked="checkbox_true" unchecked="checkbox_false"/>
+ </style>
+
+ <style name="radiobutton">
+ <font resource="font_m" color="%text_color%"/>
+ <image checked="radio_true" unchecked="radio_false"/>
+ </style>
+
+ <style name="main_button">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_l" color="%text_button_color%"/>
+ <image resource="main_button"/>
+ </style>
+
+ <style name="main_button_m">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button"/>
+ </style>
+
+ <style name="main_button_half_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button_half_width"/>
+ </style>
+
+ <style name="main_button_half_width_low">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button_half_width_low"/>
+ </style>
+
+ <style name="button_third_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="tab_3"/>
+ </style>
+
+ <style name="button_quarter_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="tab_4"/>
+ </style>
+
+ <style name="sort_asc">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="sort_asc"/>
+ </style>
+
+ <style name="sort_desc">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="sort_desc"/>
+ </style>
+
+ <style name="sort_empty">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="sort_empty"/>
+ </style>
+
+ <style name="fab">
+ <highlight color="%highlight_color%"/>
+ <placement x="%indent_right%" y="%row21a_y%" placement="1"/>
+ <font resource="font_m" color="%button_text_color%"/>
+ </style>
+
+ <style name="tab">
+ <highlight color="%highlight_color%"/>
+ <fill color="%accent_color%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ </style>
+
+ <style name="console">
+ <fastscroll rectcolor="%accent_color%" w="%fastscroll_w%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <color foreground="%text_color%" background="%background_color%" scroll="%background_color%"/>
+ <font resource="fixed"/>
+ </style>
+
+ <style name="terminal">
+ <fastscroll linecolor="%transparent%" rectcolor="%accent_color%" w="%fastscroll_w%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <background color="%background_color%"/>
+ <font resource="fixed" spacing="3" color="%text_color%"/>
+ </style>
+
+ <style name="fileselector">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <sort name="tw_gui_sort_order"/>
+ <icon folder="folder" file="file"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="listbox">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="scrolllist">
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%"/>
+ </style>
+
+ <style name="partitionlist">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="partitionlist_storage">
+ <highlight color="%fileselector_highlight_color%"/>
+ <placement x="%dialog_content_x%" y="%row4_y%" w="%content_overlay_width%" h="%partitionlist_storage_height%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="slider">
+ <placement x="%col2_x_right%" y="%row17a_y%"/>
+ <font resource="font_m" color="%text_color%"/>
+ <resource base="slider" used="slider_used" touch="slider_touch"/>
+ </style>
+
+ <style name="slider_centered">
+ <placement x="%center_x%" y="%row17a_y%"/>
+ <font resource="font_m" color="%text_color%"/>
+ <resource base="slider" used="slider_used" touch="slider_touch"/>
+ </style>
+
+ <style name="slidervalue">
+ <resource handle="handle"/>
+ <font resource="font_m" color="%text_color%"/>
+ <colors line="%fileselector_linecolor%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ </style>
+
+ <style name="patternpassword">
+ <size name="tw_gui_pattern_grid_size" default="3"/>
+ </style>
+ </styles>
+
+ <pages>
+ <page name="main">
+ <action>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="main2">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@twrp_header=Team Win Recovery Project}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_version%</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@install_btn=Install}</text>
+ <actions>
+ <action function="queueclear"/>
+ <action function="set">tw_selectimage=0</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row2_y%"/>
+ <text>{@wipe_btn=Wipe}</text>
+ <action function="page">wipe</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row6a_y%"/>
+ <text>{@backup_btn=Backup}</text>
+ <action function="page">backup</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row6a_y%"/>
+ <text>{@restore_btn=Restore}</text>
+ <action function="page">restore</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@mount_btn=Mount}</text>
+ <action function="page">mount</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row11_y%"/>
+ <text>{@settings_btn=Settings}</text>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@advanced_btn=Advanced}</text>
+ <action function="page">advanced</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@reboot_btn=Reboot}</text>
+ <action function="page">reboot</action>
+ </button>
+ </page>
+
+ <page name="install">
+ <template name="page"/>
+
+ <text style="text_l">
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_l">
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_image_hdr=Install Image}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@select_file_from_storage=Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%fileselector_install_folder_width%" h="%fileselector_install_height%"/>
+ <text>{@file_selector_folders_hdr=Folders}</text>
+ <filter folders="1" files="0"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="select"/>
+ </fileselector>
+
+ <fileselector>
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%col2_x_left%" y="%row1a_y%" w="%fileselector_install_width%" h="%fileselector_install_height%"/>
+ <text>%tw_zip_location%</text>
+ <filter extn=".zip" folders="0" files="1"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="tw_filename"/>
+ <selection name="tw_file"/>
+ </fileselector>
+
+ <fileselector>
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%col2_x_left%" y="%row1a_y%" w="%fileselector_install_width%" h="%fileselector_install_height%"/>
+ <text>%tw_zip_location%</text>
+ <filter extn=".img" folders="0" files="1"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="tw_filename"/>
+ <selection name="tw_file"/>
+ </fileselector>
+
+ <button style="main_button_half_width_low">
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%col_button_right%" y="%row13a_y%"/>
+ <text>{@install_image_btn=Install Image}</text>
+ <actions>
+ <action function="set">tw_selectimage=1</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%col_button_right%" y="%row13a_y%"/>
+ <text>{@install_zip_btn=Install Zip}</text>
+ <actions>
+ <action function="set">tw_selectimage=0</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row16a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=install</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <action>
+ <conditions>
+ <condition var1="tw_selectimage" var2="0"/>
+ <condition var1="tw_filename" op="modified"/>
+ </conditions>
+ <actions>
+ <action function="queuezip"/>
+ <action function="page">flash_confirm</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_selectimage" var2="1"/>
+ <condition var1="tw_filename" op="modified"/>
+ </conditions>
+ <action function="page">flashimage_confirm</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_confirm">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@zip_queue_count=%tw_zip_queue_count% of max of 10 Files queued}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@zip_warn1=This operation may install incompatible}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@zip_warn2=software and render your device unusable.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@zip_back_cancel=Press back to cancel adding this zip.}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row8_y%"/>
+ <text>{@folder=Folder:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row9_y%"/>
+ <text>%tw_zip_location%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@file=File:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row12_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row8_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row9_y%"/>
+ <text>{@zip_sig_chk=Zip signature verification}</text>
+ <data variable="tw_signed_zip_verify"/>
+ </checkbox>
+
+ <checkbox>
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <placement x="%col1_x_right%" y="%row10a_y%"/>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
+ <data variable="tw_inject_after_zip"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row12_y%"/>
+ <text>{@install_reboot_chk=Reboot after installation is complete}</text>
+ <data variable="tw_install_reboot"/>
+ </checkbox>
+
+ <button style="main_button_half_width">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@zip_add_btn=Add more Zips}</text>
+ <action function="page">install</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@zip_clear_btn=Clear Zip Queue}</text>
+ <actions>
+ <action function="queueclear"/>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
+ <action function="flash">flash_zip</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="cancelzip"/>
+ <action function="page">install</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_zip">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_count_hdr=Install Zip %tw_zip_index% of %tw_zip_queue_count%}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <action function="page">flash_done</action>
+ </action>
+ </page>
+
+ <page name="flash_done">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@failed=Failed}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_operation_status" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@successful=Successful}</text>
+ </text>
+
+ <template name="console"/>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
+ <actions>
+ <action function="set">tw_back=flash_done</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=/cache</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=wipe</action>
+ <action function="set">tw_action2_param=dalvik</action>
+ <action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache &amp; Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache &amp; Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache &amp; Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@reboot_system_btn=Reboot System}</text>
+ <actions>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=install</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_install_reboot" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ <condition var1="tw_reboot_system" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_sleep=%tw_sleep_total%</action>
+ <action function="page">flash_sleep_and_reboot</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="flash_sleep_and_reboot">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@install_reboot=Rebooting in %tw_sleep% second(s)}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_sleep" op="&gt;" var2="0"/>
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_install_reboot=0</action>
+ <action function="page">flash_done</action>
+ </actions>
+ </button>
+
+ <action>
+ <conditions>
+ <condition var1="tw_sleep" var2="tw_sleep_total"/>
+ <condition var1="tw_install_reboot" var2="1"/>
+ </conditions>
+ <action function="sleepcounter">%tw_sleep_total%</action>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_sleep" var2="0"/>
+ <condition var1="tw_install_reboot" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="sleep">50000</action>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="flashimage_confirm">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_image_hdr=Install Image}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@install_sel_target=Select Target Partition}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row8_y%"/>
+ <text>{@folder=Folder:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row9_y%"/>
+ <text>%tw_zip_location%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@file=File:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row12_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%col1_x_right%" y="%row7a_y%" w="%content_half_width%" h="%partitionlist_flashimage_height%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <text>{@flash_image_select=Select Partition to Flash Image:}</text>
+ <data name="tw_flash_partition"/>
+ <listtype name="flashimg"/>
+ </partitionlist>
+
+ <slider>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
+ <actions>
+ <action function="set">tw_back=flashimage_confirm</action>
+ <action function="set">tw_action=flashimage</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@flashing_image=Flashing Image...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@image_flashed=Image Flashed}</action>
+ <action function="page">action_page</action>
+ </actions>
+ <action function="flashimage"/>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=install</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="clear_vars">
+ <action>
+ <action function="set">tw_operation_state=0</action>
+ <action function="set">tw_text1=</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_text3=</action>
+ <action function="set">tw_text4=</action>
+ <action function="set">tw_action_text1=</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_action_param=</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action2=</action>
+ <action function="set">tw_action2_param=</action>
+ <action function="set">tw_has_cancel=0</action>
+ <action function="set">tw_cancel_action=</action>
+ <action function="set">tw_cancel_param=</action>
+ <action function="set">tw_show_exclamation=0</action>
+ <action function="set">tw_show_reboot=0</action>
+ <action function="page">%tw_clear_destination%</action>
+ </action>
+ </page>
+
+ <page name="reboot_system_routine">
+ <action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=system</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_text3=</action>
+ <action function="set">tw_text4=</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </action>
+ </page>
+
+ <page name="confirm_action">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@confirm_action=Confirm Action}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text/>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>%tw_text1%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>%tw_text2%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>%tw_text3%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_text4%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider style="slider_centered">
+ <text>%tw_slider_text%</text>
+ <action function="page">action_page</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="action_page">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_action_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_action_text2%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_has_cancel" var2="1"/>
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="%tw_cancel_action%">%tw_cancel_param%</action>
+ </button>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="0"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="1"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="singleaction_page">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_action_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_action_text2%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="0"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="1"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="action_complete">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_complete_text1%</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@failed=Failed}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_operation_status" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@successful=Successful}</text>
+ </text>
+
+ <template name="console"/>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@back_btn=Back}</text>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@reboot_system_btn=Reboot System}</text>
+ <actions>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="filecheck">
+ <action>
+ <action function="fileexists">%tw_filecheck%</action>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_fileexists=1</action>
+ <action function="page">%tw_existpage%</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">%tw_notexistpage%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="rebootcheck">
+ <action>
+ <condition var1="tw_backup_system_size" op="&gt;=" var2="%tw_min_system%"/>
+ <action function="page">appcheck</action>
+ </action>
+
+ <action>
+ <condition var1="tw_backup_system_size" op="&lt;" var2="%tw_min_system%"/>
+ <action function="page">confirm_action</action>
+ </action>
+ </page>
+
+ <page name="appcheck">
+ <action>
+ <condition var1="tw_app_prompt" var2="1"/>
+ <action function="checkforapp"></action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_prompt" op="!=" var2="1"/>
+ <action function="reboot">%tw_reboot_param%</action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_install_status" var2="1"/>
+ <action function="page">rebootapp</action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_install_status" var2="2"/>
+ <action function="reboot">%tw_reboot_param%</action>
+ </action>
+ </page>
+
+ <page name="wipe">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@factory_reset_hdr=Factory Reset}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@factory_reset1=Wipes Data, Cache, and Dalvik}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@factory_reset2=(not including internal storage)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <conditions>
+ <condition var1="tw_has_android_secure" var2="1"/>
+ <condition var1="fileexists" var2="/and-sec"/>
+ </conditions>
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@android_secure=Android Secure}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_has_sdext_partition" var2="1"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@sdext=SD-EXT}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@factory_reset3=Most of the time this is}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@factory_reset4=the only wipe that you need.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row10_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@advanced_wipe_btn=Advanced Wipe}</text>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@format_data_btn=Format Data}</text>
+ <action function="page">formatdata</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <conditions>
+ <condition var1="tw_is_encrypted" var2="1"/>
+ <condition var1="tw_has_data_media" var2="0"/>
+ </conditions>
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@wipe_enc_btn=Wipe Encryption}</text>
+ <actions>
+ <action function="set">tw_back=wipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=DATAMEDIA</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@wipe_enc_confirm=Wipe Encryption from Data?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_format_data=Swipe to Format Data}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_factory_reset=Swipe to Factory Reset}</text>
+ <actions>
+ <action function="set">tw_back=wipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=data</action>
+ <action function="set">tw_action_text1={@factory_resetting=Factory Reset...}</action>
+ <action function="set">tw_complete_text1={@factory_reset_complete=Factory Reset Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="advancedwipe">
+ <template name="page"/>
+
+ <action>
+ <action function="set">tw_wipe_list=</action>
+ </action>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@advanced_wipe_hdr=Advanced Wipe}</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <text>{@sel_part_wipe=Select Partitions to Wipe:}</text>
+ <data name="tw_wipe_list"/>
+ <listtype name="wipe"/>
+ </partitionlist>
+
+ <text style="text_m_fail">
+ <condition var1="partitionlisterror" var2="1"/>
+ <placement x="%col2_x_left%" y="%row14a_y%" placement="5"/>
+ <text>{@invalid_part_sel=Invalid partition selection}</text>
+ </text>
+
+ <button style="main_button_m">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@repair_change_btn=Repair or Change File System}</text>
+ <actions>
+ <action function="checkpartitionlist">tw_wipe_list</action>
+ <action function="page">checkpartitionlist</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_wipe=Swipe to Wipe}</text>
+ <actions>
+ <action function="set">tw_back=advancedwipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=LIST</action>
+ <action function="set">tw_text1={@wipe_sel_confirm=Wipe Selected Partition(s)?}</action>
+ <action function="set">tw_action_text1={@wiping_part=Wiping Partition(s)...}</action>
+ <action function="set">tw_complete_text1={@wipe_complete=Wipe Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe</action>
+ </action>
+ </page>
+
+ <page name="formatdata">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@format_data_hdr=Format Data}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@format_data_lcp1=Format Data will wipe all of your apps, backups, pictures, videos, media, and}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@format_data_lcp2=removes encryption on internal storage.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_has_adopted_storage" var2="1"/>
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@format_data_adopted=Including Adopted Storage}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@format_data_undo=This cannot be undone.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@yes_continue=Type yes to continue. Press back to cancel.}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row8_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_confirm_formatdata%</text>
+ <data name="tw_confirm_formatdata"/>
+ <restrict minlen="3" maxlen="3" allow="yes"/>
+ <action function="page">formatdata_confirm</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row9_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe</action>
+ </action>
+ </page>
+
+ <page name="formatdata_confirm">
+ <action>
+ <condition var1="tw_confirm_formatdata" op="=" var2="yes"/>
+ <actions>
+ <action function="set">tw_back=formatdata</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=DATAMEDIA</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_confirm_formatdata" op="!=" var2="yes"/>
+ <action function="page">formatdata</action>
+ </action>
+ </page>
+
+ <page name="checkpartitionlist">
+ <action>
+ <condition var1="tw_check_partition_list" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="getpartitiondetails">tw_wipe_list</action>
+ <action function="page">partitionoptions</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_check_partition_list" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="partitionoptions">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@part_opt_hdr=Partition Options for: %tw_partition_name%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_is_present" var2="1"/>
+ <placement x="%col2_x_left%" y="%row5_y%"/>
+ <text>{@part_present_yes=Present: Yes}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_is_present" var2="0"/>
+ <placement x="%col2_x_left%" y="%row5_y%"/>
+ <text>{@part_present_no=Present: No}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_removable" var2="1"/>
+ <placement x="%col1_x_right%" y="%row5_y%"/>
+ <text>{@part_removable_yes=Removable: Yes}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_removable" var2="0"/>
+ <placement x="%col1_x_right%" y="%row5_y%"/>
+ <text>{@part_removable_no=Removable: No}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col2_x_left%" y="%row7_y%"/>
+ <text>{@part_size=Size: %tw_partition_size%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_right%" y="%row7_y%"/>
+ <text>{@part_used=Used: %tw_partition_used%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col2_x_left%" y="%row9_y%"/>
+ <text>{@part_free=Free: %tw_partition_free%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_right%" y="%row9_y%"/>
+ <text>{@part_backup_size=Backup Size: %tw_partition_backup_size%MB}</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_can_resize" op="=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@resize_btn=Resize File System}</text>
+ <actions>
+ <action function="set">tw_back=partitionoptions</action>
+ <action function="set">tw_action=resize</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=getpartitiondetails</action>
+ <action function="set">tw_action2_param=tw_wipe_list</action>
+ <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@resizing=Resizing...}</action>
+ <action function="set">tw_complete_text1={@resize_complete=Resize Complete}</action>
+ <action function="set">tw_slider_text={@swipe_resize=Swipe to Resize}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_can_repair" op="=" var2="1"/>
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@repair_btn=Repair File System}</text>
+ <actions>
+ <action function="set">tw_back=partitionoptions</action>
+ <action function="set">tw_action=repair</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@repair_confirm=Repair %tw_partition_name%?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@repairing=Repairing...}</action>
+ <action function="set">tw_complete_text1={@repair_complete=Repair Complete}</action>
+ <action function="set">tw_slider_text={@swipe_repair=Swipe to Repair}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@change_fs_btn=Change File System}</text>
+ <action function="page">selectfilesystem</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advancedwipe</action>
+ </action>
+ </page>
+
+ <page name="refreshfilesystem">
+ <action>
+ <condition var1="tw_check_partition_list" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="getpartitiondetails">tw_wipe_list</action>
+ <action function="page">selectfilesystem</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_check_partition_list" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="set">tw_wipe_list=</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="selectfilesystem">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@change_fs_for_hdr=Change File System for: %tw_partition_name%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@change_fs_warn1=Some ROMs or kernels may not support some}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@change_fs_warn2=file systems. Proceed with caution!}</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>EXT2</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext2</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT2</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%col2_x_left%" y="%row11_y%"/>
+ <text>EXT3</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext3</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT3</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%center_x%" y="%row11_y%"/>
+ <text>EXT4</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext4</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT4</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_vfat" op="=" var2="1"/>
+ <placement x="%col2_x_right%" y="%row11_y%"/>
+ <text>FAT</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=vfat</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=FAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_exfat" op="=" var2="1"/>
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>exFAT</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=exfat</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=exFAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_partition_f2fs" op="=" var2="1"/>
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>F2FS</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=f2fs</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=F2FS</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">partitionoptions</action>
+ </action>
+ </page>
+
+ <page name="backup">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row3_y%"/>
+ <text>%tw_backup_name%</text>
+ </text>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_half_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <placement x="col1_x_left" y="%row2_y%" w="%content_half_width%" h="%navbar_height%"/>
+ <fill color="%transparent%"/>
+ <actions>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">backupname1</action>
+ </actions>
+ </button>
+
+ <partitionlist>
+ <placement x="%col1_x_left%" y="%row4a_y%" w="%content_half_width%" h="%partitionlist_backup_height%"/>
+ <text>{@sel_part_backup=Select Partitions to Backup:}</text>
+ <data name="tw_backup_list"/>
+ <listtype name="backup"/>
+ </partitionlist>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row2_y%"/>
+ <text>{@encryption=Encryption:}</text>
+ </text>
+
+ <text style="text_m">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%col1_x_right%" y="%row3_y%"/>
+ <text>{@enc_disabled=disabled - set a password to enable}</text>
+ </text>
+
+ <text style="text_m">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%col1_x_right%" y="%row3_y%"/>
+ <text>{@enc_enabled=enabled}</text>
+ </text>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_right%" y="row4_y" w="%content_half_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <placement x="col1_x_right" y="%row2_y%" w="%content_half_width%" h="%navbar_height%"/>
+ <fill color="%transparent%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row5_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@enable_backup_comp_chk=Enable compression}</text>
+ <data variable="tw_use_compression"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row7a_y%"/>
+ <text>{@skip_md5_backup_chk=Skip MD5 generation during backup}</text>
+ <data variable="tw_skip_md5_generate"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row9_y%"/>
+ <text>{@disable_backup_space_chk=Disable free space check before backup}</text>
+ <data variable="tw_disable_free_space"/>
+ </checkbox>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@refresh_sizes_btn=Refresh Sizes}</text>
+ <actions>
+ <action function="refreshsizes"/>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_backup=Swipe to Backup}</text>
+ <action function="page">backup_run</action>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="backupname1">
+ <action>
+ <condition var1="tw_backup_name" op="=" var2="{@auto_generate=(Auto Generate)}"/>
+ <action function="generatebackupname"/>
+ </action>
+
+ <action>
+ <action function="page">backupname2</action>
+ </action>
+ </page>
+
+ <page name="backupname2">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_name%</text>
+ <data name="tw_backup_name"/>
+ <restrict minlen="1" maxlen="64" allow=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.{}[]"/>
+ <actions>
+ <action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_name%</action>
+ <action function="set">tw_existpage=backupname2</action>
+ <action function="set">tw_notexistpage=backup</action>
+ <action function="page">filecheck</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_half_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="row4_y" w="%content_half_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
+ </text>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%date_button_x%" y="%row5_y%"/>
+ <text>{@append_date_btn=Append Date}</text>
+ <action function="appenddatetobackupname"/>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">backup</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="backupencryption">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row2_y%"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_right%" y="%row2_input_y%" w="%content_half_width%" h="%input_height%"/>
+ <text>%tw_backup_encrypt_display%</text>
+ <data name="tw_backup_password" mask="*" maskvariable="tw_backup_encrypt_display"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">backupencryption2</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_right%" y="row4_y" w="%content_half_width%" h="input_line_width"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_not_match" var2="1"/>
+ <placement x="%col1_x_right%" y="row4_y" w="%content_half_width%" h="input_line_width"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_not_match" var2="1"/>
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@pass_not_match=Passwords do not match!}</text>
+ </text>
+
+ <button style="main_button_half_width_low">
+ <placement x="%center_x%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">backup</action>
+ </action>
+ </page>
+
+ <page name="backupencryption2">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row2_y%"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_right%" y="%row2_input_y%" w="%content_half_width%" h="%input_height%"/>
+ <text>%tw_backup_encrypt_display2%</text>
+ <data name="tw_backup_password2" mask="*" maskvariable="tw_backup_encrypt_display2"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">checkbackuppassword</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_right%" y="row4_y" w="%content_half_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m">
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@enter_pass2=Enter Password again:}</text>
+ </text>
+
+ <button style="main_button_half_width_low">
+ <placement x="%center_x%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">backup</action>
+ </action>
+ </page>
+
+ <page name="checkbackuppassword">
+ <action>
+ <condition var1="tw_backup_password2" var2="tw_backup_password"/>
+ <actions>
+ <action function="set">tw_encrypt_backup=1</action>
+ <action function="page">backup</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_backup_password2" op="!=" var2="tw_backup_password"/>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_password_not_match=1</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="backup_run">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_operation%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_partition% Partition</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <text style="text_m_accent">
+ <placement x="%progress_text_x%" y="%progress_text_y%"/>
+ <text>{@progress=Progress:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%progress_text_x%" y="%row17_y%"/>
+ <text>%tw_file_progress%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%progress_text_x%" y="%row18_y%"/>
+ <text>%tw_size_progress%</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="cancelbackup"/>
+ </button>
+
+ <action>
+ <action function="nandroid">backup</action>
+ </action>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_cancel_backup" var2="0"/>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="set">tw_complete_text1={@backup_complete=Backup Complete}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_cancel_backup" var2="1"/>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="set">tw_complete_text1={@backup_cancel=Backup Cancelled}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_sel_store_hdr=Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%content_quarter_width%" h="%fileselector_install_height%"/>
+ <text>{@restore_sel_pack_fs=Select Package to Restore:}</text>
+ <filter folders="1" files="0" nav="0"/>
+ <path name="tw_backups_folder"/>
+ <data name="tw_restore" default=""/>
+ <selection name="tw_restore_name"/>
+ </fileselector>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row16a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <action>
+ <condition var1="tw_restore" op="modified"/>
+ <actions>
+ <action function="readBackup"/>
+ <action function="page">restore_read</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="restore_read">
+ <action>
+ <condition var1="tw_restore_encrypted" var2="1"/>
+ <actions>
+ <action function="set">tw_password_fail=0</action>
+ <action function="page">restore_decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_restore_encrypted" var2="0"/>
+ <actions>
+ <action function="page">restore_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore_decrypt">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_enc_backup_hdr=Encrypted Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_restore_display%</text>
+ <data name="tw_restore_password" mask="*" maskvariable="tw_restore_display"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">try_restore_decrypt</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row5_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="row5_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="%row5_y%"/>
+ <text>{@restore_dec_fail=Password failed, please try again!}</text>
+ </text>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">restore</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row6_y%"/>
+ <text>{@del_backup_btn=Delete Backup}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; rm -rf "%tw_restore_name%"</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore</action>
+ </action>
+ </page>
+
+ <page name="try_restore_decrypt">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_try_decrypt=Encrypted Backup - Trying Decryption}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <action function="decrypt_backup"/>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_password_fail=1</action>
+ <action function="page">restore_decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">restore_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore_select">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_backup_date=Backup made on %tw_restore_file_date%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row3_y%"/>
+ <text>%tw_restore_name%</text>
+ </text>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <placement x="col1_x_left" y="%row2_y%" w="%content_width%" h="%navbar_height%"/>
+ <fill color="%transparent%"/>
+ <actions>
+ <action function="set">tw_backup_rename=%tw_restore_name%</action>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">renamebackup</action>
+ </actions>
+ </button>
+
+ <partitionlist>
+ <placement x="%col1_x_left%" y="%row4a_y%" w="%content_half_width%" h="%partitionlist_backup_height%"/>
+ <text>{@restore_sel_part=Select Partitions to Restore:}</text>
+ <data name="tw_restore_list" selectedlist="tw_restore_selected"/>
+ <listtype name="restore"/>
+ </partitionlist>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row5_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@restore_enable_md5_chk=Enable MD5 Verification of Backup Files}</text>
+ <data variable="tw_skip_md5_check"/>
+ </checkbox>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@del_backup_btn=Delete Backup}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; rm -rf "%tw_restore_name%"</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_restore=Swipe to Restore}</text>
+ <action function="page">restore_run</action>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore</action>
+ </action>
+ </page>
+
+ <page name="renamebackup">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@rename_backup_hdr=Rename Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_rename%</text>
+ <data name="tw_backup_rename"/>
+ <restrict minlen="1" maxlen="64" allow=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.{}[]"/>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; mv "%tw_restore_name%" "%tw_backup_rename%"</action>
+ <action function="set">tw_text1={@rename_backup_confirm=Rename Backup?}</action>
+ <action function="set">tw_text2={@rename_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@renaming_backup=Renaming Backup...}</action>
+ <action function="set">tw_complete_text1={@rename_backup_complete=Backup Rename Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_rename=Swipe to Rename}</action>
+ <action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_rename%</action>
+ <action function="set">tw_existpage=renamebackup</action>
+ <action function="set">tw_notexistpage=confirm_action</action>
+ <action function="page">filecheck</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
+ </text>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">restore_select</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore_select</action>
+ </action>
+ </page>
+
+ <page name="restore_run">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_operation% %tw_partition%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <text style="text_m_accent">
+ <placement x="%progress_text_x%" y="%progress_text_y%"/>
+ <text>{@progress=Progress:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%progress_text_x%" y="%row18_y%"/>
+ <text>%tw_size_progress%</text>
+ </text>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="set">tw_back=restore_select</action>
+ <action function="set">tw_complete_text1={@restore_complete=Restore Complete}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <action function="nandroid">restore</action>
+ </action>
+ </page>
+
+ <page name="mount">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%content_width%" h="%partitionlist_mount_height%"/>
+ <text>{@mount_sel_part=Select Partitions to Mount:}</text>
+ <listtype name="mount"/>
+ </partitionlist>
+
+ <button style="checkbox">
+ <condition var1="tw_mount_system_ro" op="=" var2="0"/>
+ <placement x="%col1_x_left%" y="%row14_y%" textplacement="6"/>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
+ <image resource="checkbox_false"/>
+ <action function="mountsystemtoggle">1</action>
+ </button>
+
+ <button style="checkbox">
+ <condition var1="tw_mount_system_ro" op="!=" var2="0"/>
+ <placement x="%col1_x_left%" y="%row14_y%" textplacement="6"/>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
+ <image resource="checkbox_true"/>
+ <actions>
+ <action function="set">tw_lifetime_writes=2</action>
+ <action function="page">system_readonly_check</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_has_usb_storage" var2="1"/>
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@mount_usb_storage_btn=Mount USB Storage}</text>
+ <action function="page">usb_mount</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <conditions>
+ <condition var1="tw_is_encrypted" var2="1"/>
+ <condition var1="tw_is_decrypted" var2="0"/>
+ </conditions>
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@decrypt_data_btn=Decrypt Data}</text>
+ <action function="page">decrypt</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=mount</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <conditions>
+ <condition var1="tw_has_mtp" var2="1"/>
+ <condition var1="tw_mtp_enabled" var2="0"/>
+ </conditions>
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@enable_mtp_btn=Enable MTP}</text>
+ <action function="startmtp"/>
+ </button>
+
+ <button style="main_button_half_width">
+ <conditions>
+ <condition var1="tw_has_mtp" var2="1"/>
+ <condition var1="tw_mtp_enabled" var2="1"/>
+ </conditions>
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@disable_mtp_btn=Disable MTP}</text>
+ <action function="stopmtp"/>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="usb_mount">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@usb_storage_hdr=USB Storage}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@usb_stor_mnt1=USB Storage Mounted}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@usb_stor_mnt2=Be sure to safely remove your device}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@usb_stor_mnt3=from your computer before unmounting!}</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@unmount_btn=Unmount}</text>
+ <action function="page">usb_umount</action>
+ </button>
+
+ <action>
+ <action function="mount">usb</action>
+ <action function="set">tw_busy=1</action>
+ </action>
+ </page>
+
+ <page name="usb_umount">
+ <action>
+ <action function="unmount">usb</action>
+ </action>
+
+ <action>
+ <action function="page">mount</action>
+ <action function="set">tw_busy=0</action>
+ </action>
+ </page>
+
+ <page name="system_readonly_check">
+ <action>
+ <action function="checkpartitionlifetimewrites">/system</action>
+ </action>
+
+ <action>
+ <condition var1="tw_lifetime_writes" var2="1"/>
+ <actions>
+ <action function="mountsystemtoggle">0</action>
+ <action function="page">mount</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_lifetime_writes" var2="0"/>
+ <actions>
+ <action function="set">tw_back=mount</action>
+ <action function="page">system_readonly</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="reboot">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_system" var2="1"/>
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@rb_system_btn=System}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_poweroff" var2="1"/>
+ <placement x="%center_x%" y="%row2_y%"/>
+ <text>{@rb_poweroff_btn=Power Off}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=poweroff</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_ospo=sure you wish to power off?}</action>
+ <action function="set">tw_action_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_complete_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_slider_text={@swipe_power_off=Swipe to Power Off}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_recovery" var2="1"/>
+ <placement x="%col1_x_left%" y="%row6a_y%"/>
+ <text>{@rb_recovery_btn=Recovery}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=recovery</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_bootloader" var2="1"/>
+ <placement x="%center_x%" y="%row6a_y%"/>
+ <text>{@rb_bootloader_btn=Bootloader}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=bootloader</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_download_mode" var2="1"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@rb_download_btn=Download}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=download</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="rebootapp">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@reboot_install_app_hdr=Install TWRP App?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@reboot_install_app1=Would you like to install the Official TWRP App?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@reboot_install_app2=The app can check for new TWRP versions.}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@reboot_install_app_prompt_install=Prompt to install TWRP app if not installed}</text>
+ <data variable="tw_app_prompt"/>
+ </checkbox>
+
+ <checkbox>
+ <condition var1="tw_mount_system_ro" var2="0"/>
+ <placement x="%indent%" y="%row7_y%"/>
+ <text>{@reboot_install_app_system=Install as a System App}</text>
+ <data variable="tw_app_install_system"/>
+ </checkbox>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@su_cancel=Do not Install}</text>
+ <action function="reboot">%tw_reboot_param%</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_to_install_app=Swipe to Install TWRP App}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=installapp</action>
+ <action function="set">tw_action_text1={@reboot_installing_app=Installing App...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=reboot</action>
+ <action function="set">tw_action2_param=%tw_reboot_param%</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_app_install_status=0</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_app_install_status=0</action>
+ <action function="page">reboot</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="system_readonly">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@sys_ro_hdr=Unmodified System Partition}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@sys_ro_keep=Keep System Read only?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@sys_rol1=TWRP can leave your system partition unmodified to make it easier for you to take official updates.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@sys_rol2=TWRP will be unable to prevent the stock ROM from replacing TWRP and will not offer to root your device.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@sys_rol3=Installing zips or performing adb operations may still modify the system partition.}</text>
+ </text>
+
+ <checkbox>
+ <condition var1="tw_is_encrypted" var2="0"/>
+ <placement x="%col1_x_left%" y="%row14_y%"/>
+ <text>{@sys_ro_never_show_chk=Never show this screen during boot again}</text>
+ <data variable="tw_never_show_system_ro_page"/>
+ </checkbox>
+
+ <button style="main_button_half_width">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@sys_ro_keep_ro_btn=Keep Read Only}</text>
+ <actions>
+ <action function="mountsystemtoggle">1</action>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="overlay">select_language</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_allow_mod=Swipe to Allow Modifications}</text>
+ <actions>
+ <action function="mountsystemtoggle">0</action>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </slider>
+ </page>
+
+ <page name="settings">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@settings_gen_hdr=General Settings}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="0" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox style="scrolllist">
+ <placement x="%col1_x_left%" y="%row3a_y%" w="%content_half_width%" h="%listbox_settings_height%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
+ <data variable="tw_signed_zip_verify"/>
+ </listitem>
+ <listitem name="{@install_reboot_chk=Reboot after installation is complete}">
+ <data variable="tw_install_reboot"/>
+ </listitem>
+ <listitem name="{@use_rmrf_chk=Use rm -rf instead of formatting}">
+ <data variable="tw_rm_rf"/>
+ </listitem>
+ <listitem name="{@disable_backup_space_chk=Disable free space check before backup}">
+ <data variable="tw_disable_free_space"/>
+ </listitem>
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
+ <data variable="tw_skip_md5_generate"/>
+ </listitem>
+ <listitem name="{@restore_enable_md5_chk=Enable MD5 verification of backup files}">
+ <data variable="tw_skip_md5_check"/>
+ </listitem>
+ <listitem name="{@use24clock_chk=Use 24-hour clock}">
+ <data variable="tw_military_time"/>
+ </listitem>
+ <listitem name="{@reboot_install_app_prompt_install=Prompt to install TWRP app on every reboot}">
+ <data variable="tw_app_prompt"/>
+ </listitem>
+ <listitem name="{@simact_chk=Simulate actions for theme testing}">
+ <data variable="tw_simulate_actions"/>
+ </listitem>
+ <listitem name="{@simfail_chk=Simulate failure for actions}">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <data variable="tw_simulate_fail"/>
+ </listitem>
+ </listbox>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row3a_y%"/>
+ <text>{@rev_navbar_chk=Reversed navbar layout}</text>
+ <data variable="tw_samsung_navbar"/>
+ </checkbox>
+
+ <button style="radiobutton">
+ <condition var1="tw_navbar_button_position" op="!=" var2="0"/>
+ <placement x="%col1_x_right%" y="%row5_y%" textplacement="6"/>
+ <text>{@ctr_navbar_rdo=Center navbar buttons}</text>
+ <image resource="radio_false"/>
+ <action function="set">tw_navbar_button_position=0</action>
+ </button>
+
+ <button style="radiobutton">
+ <condition var1="tw_navbar_button_position" var2="0"/>
+ <placement x="%col1_x_right%" y="%row5_y%" textplacement="6"/>
+ <text>{@ctr_navbar_rdo=Center navbar buttons}</text>
+ <image resource="radio_true"/>
+ <action function="set">tw_navbar_button_position=0</action>
+ </button>
+
+ <button style="radiobutton">
+ <condition var1="tw_navbar_button_position" op="!=" var2="1"/>
+ <placement x="%col1_x_right%" y="%row6a_y%" textplacement="6"/>
+ <text>{@lft_navbar_rdo=Left align navbar buttons}</text>
+ <image resource="radio_false"/>
+ <action function="set">tw_navbar_button_position=1</action>
+ </button>
+
+ <button style="radiobutton">
+ <condition var1="tw_navbar_button_position" var2="1"/>
+ <placement x="%col1_x_right%" y="%row6a_y%" textplacement="6"/>
+ <text>{@lft_navbar_rdo=Left align navbar buttons}</text>
+ <image resource="radio_true"/>
+ <action function="set">tw_navbar_button_position=1</action>
+ </button>
+
+ <button style="radiobutton">
+ <condition var1="tw_navbar_button_position" op="!=" var2="2"/>
+ <placement x="%col1_x_right%" y="%row8_y%" textplacement="6"/>
+ <text>{@rht_navbar_rdo=Right align navbar buttons}</text>
+ <image resource="radio_false"/>
+ <action function="set">tw_navbar_button_position=2</action>
+ </button>
+
+ <button style="radiobutton">
+ <condition var1="tw_navbar_button_position" var2="2"/>
+ <placement x="%col1_x_right%" y="%row8_y%" textplacement="6"/>
+ <text>{@rht_navbar_rdo=Right align navbar buttons}</text>
+ <image resource="radio_true"/>
+ <action function="set">tw_navbar_button_position=2</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@restore_defaults_btn=Restore Defaults}</text>
+ <action function="restoredefaultsettings"/>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_timezone">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@time_zone_hdr=Time Zone}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col2_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%col1_x_left%" y="%row3_y%" w="%content_half_width%" h="%listbox_timezone_height%"/>
+ <text>{@sel_tz_list=Select Time Zone:}</text>
+ <data name="tw_time_zone_guisel"/>
+ <listitem name="{@utcm11=(UTC -11) Samoa, Midway Island}">BST11;BDT</listitem>
+ <listitem name="{@utcm10=(UTC -10) Hawaii}">HST10;HDT</listitem>
+ <listitem name="{@utcm9=(UTC -9) Alaska}">AST9;ADT</listitem>
+ <listitem name="{@utcm8=(UTC -8) Pacific Time}">PST8;PDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm7=(UTC -7) Mountain Time}">MST7;MDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm6=(UTC -6) Central Time}">CST6;CDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm5=(UTC -5) Eastern Time}">EST5;EDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm4=(UTC -4) Atlantic Time}">AST4;ADT</listitem>
+ <listitem name="{@utcm3=(UTC -3) Brazil, Buenos Aires}">GRNLNDST3;GRNLNDDT</listitem>
+ <listitem name="{@utcm2=(UTC -2) Mid-Atlantic}">FALKST2;FALKDT</listitem>
+ <listitem name="{@utcm1=(UTC -1) Azores, Cape Verde}">AZOREST1;AZOREDT</listitem>
+ <listitem name="{@utc0=(UTC 0) London, Dublin, Lisbon}">GMT0;BST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp1=(UTC +1) Berlin, Brussels, Paris}">CET-1;CEST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp2=(UTC +2) Athens, Istanbul, South Africa}">WET-2;WET,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp3=(UTC +3) Moscow, Baghdad}">SAUST-3;SAUDT</listitem>
+ <listitem name="{@utcp4=(UTC +4) Abu Dhabi, Tbilisi, Muscat}">WST-4;WDT</listitem>
+ <listitem name="{@utcp5=(UTC +5) Yekaterinburg, Islamabad}">PAKST-5;PAKDT</listitem>
+ <listitem name="{@utcp6=(UTC +6) Almaty, Dhaka, Colombo}">TASHST-6;TASHDT</listitem>
+ <listitem name="{@utcp7=(UTC +7) Bangkok, Hanoi, Jakarta}">THAIST-7;THAIDT</listitem>
+ <listitem name="{@utcp8=(UTC +8) Beijing, Singapore, Hong Kong}">TAIST-8;TAIDT</listitem>
+ <listitem name="{@utcp9=(UTC +9) Tokyo, Seoul, Yakutsk}">JST-9;JSTDT</listitem>
+ <listitem name="{@utcp10=(UTC +10) Eastern Australia, Guam}">EET-10;EETDT</listitem>
+ <listitem name="{@utcp11=(UTC +11) Vladivostok, Solomon Islands}">MET-11;METDT</listitem>
+ <listitem name="{@utcp12=(UTC +12) Auckland, Wellington, Fiji}">NZST-12;NZDT</listitem>
+ </listbox>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row3a_y%"/>
+ <text>{@sel_tz_offset=Select Offset (usually 0): %tw_time_zone_guioffset%}</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%col1_x_right%" y="%row5_y%"/>
+ <text>{@tz_offset_none=None}</text>
+ <action function="set">tw_time_zone_guioffset=0</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col2_x_right%" y="%row5_y%"/>
+ <text>{@tz_offset_15=15}</text>
+ <action function="set">tw_time_zone_guioffset=15</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col3_x_right%" y="%row5_y%"/>
+ <text>{@tz_offset_30=30}</text>
+ <action function="set">tw_time_zone_guioffset=30</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col4_x_right%" y="%row5_y%"/>
+ <text>{@tz_offset_45=45}</text>
+ <action function="set">tw_time_zone_guioffset=45</action>
+ </button>
+
+ <checkbox>
+ <placement x="%col1_x_right%" y="%row7_y%"/>
+ <font resource="font_m" color="%text_color%"/>
+ <text>{@use_dst_chk=Use daylight savings time (DST)}</text>
+ <data variable="tw_time_zone_guidst"/>
+ <image checked="checkbox_true" unchecked="checkbox_false"/>
+ </checkbox>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%col1_x_right%" y="%row9_y%"/>
+ <text>{@curr_tz=Current Time Zone: %tw_time_zone%}</text>
+ </text>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <text>{@set_tz_btn=Set Time Zone}</text>
+ <image resource="main_button_half_width"/>
+ <action function="setguitimezone"/>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_screen">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@settings_screen_hdr=Screen Settings}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col3_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row3a_y%" textplacement="6"/>
+ <font resource="font_m" color="%text_color%"/>
+ <condition var1="tw_screen_timeout_secs" op="=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
+ <image resource="checkbox_false"/>
+ <action function="set">tw_screen_timeout_secs=60</action>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row3a_y%" textplacement="6"/>
+ <font resource="font_m" color="%text_color%"/>
+ <condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
+ <image resource="checkbox_true"/>
+ <action function="set">tw_screen_timeout_secs=0</action>
+ </button>
+
+ <slidervalue>
+ <condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <placement x="col1_x_left" y="%row5_y%" w="%content_width%"/>
+ <text>{@screen_to_slider=Screen timeout in seconds:}</text>
+ <data variable="tw_screen_timeout_secs" min="15" max="300"/>
+ </slidervalue>
+
+ <slidervalue>
+ <condition var1="tw_has_brightnesss_file" var2="1"/>
+ <placement x="col1_x_left" y="%row10_y%" w="%content_width%"/>
+ <text>{@screen_bright_slider=Brightness: %tw_brightness_pct%%}</text>
+ <data variable="tw_brightness_pct" min="10" max="100"/>
+ <actions>
+ <action function="set">tw_brightness=%tw_brightness_max%</action>
+ <action function="compute">tw_brightness*%tw_brightness_pct%</action>
+ <action function="compute">tw_brightness/100</action>
+ <action function="setbrightness">%tw_brightness%</action>
+ </actions>
+ </slidervalue>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_vibration">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@vibration_hdr=Vibration}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col4_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <slidervalue>
+ <placement x="col1_x_left" y="%row4_y%" w="%content_width%"/>
+ <text>{@button_vibration=Button Vibration:}</text>
+ <data variable="tw_button_vibrate" min="0" max="300"/>
+ </slidervalue>
+
+ <slidervalue>
+ <placement x="col1_x_left" y="%row9_y%" w="%content_width%"/>
+ <text>{@kb_vibration=Keyboard Vibration:}</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300"/>
+ </slidervalue>
+
+ <slidervalue>
+ <placement x="col1_x_left" y="%row14_y%" w="%content_width%"/>
+ <text>{@act_vibration=Action Vibration:}</text>
+ <data variable="tw_action_vibrate" min="0" max="500"/>
+ </slidervalue>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_language">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@language_hdr=Language - %tw_language_display%}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col5_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%col1_x_left%" y="%row3_y%" w="%content_half_width%" h="%listbox_timezone_height%"/>
+ <text>{@select_language=Select Language:}</text>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <text>{@set_language_btn=Set Language}</text>
+ <image resource="main_button_half_width"/>
+ <action function="setlanguage"></action>
+ </button>
+
+ <action>
+ <touch key="home" />
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back" />
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="copylog">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@copying_log=Copy Logs to SD Card}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row4_y%"/>
+ <text>{@include_kernel_log=Include Kernel Log}</text>
+ <data variable="tw_include_kernel_log" value="1"/>
+ </checkbox>
+
+ <slider>
+ <text>{@copying_log=Copy Logs to SD Card}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=copylog</action>
+ <action function="set">tw_action_text1={@copying_log=Copy Logs to SD Card}</action>
+ <action function="set">tw_complete_text1={@copy_log_complete=Logs Copy Completed}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="page">advanced</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="advanced">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@copy_log_btn=Copy Log}</text>
+ <action function="page">copylog</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%center_x%" y="%row2_y%"/>
+ <text>{@fix_context_btn=Fix Contexts}</text>
+ <action function="page">fixcontexts</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_allow_partition_sdcard" var2="1"/>
+ <placement x="%col1_x_left%" y="%row6a_y%"/>
+ <text>{@part_sd_btn=Partition SD Card}</text>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row6a_y%"/>
+ <text>{@file_manager_btn=File Manager}</text>
+ <action function="page">filemanagerlist</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@terminal_btn=Terminal}</text>
+ <action function="page">terminalcommand</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row11_y%"/>
+ <text>{@reload_theme_btn=Reload Theme}</text>
+ <action function="reload"/>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row15a_y%"/>
+ <text>{@adb_sideload_btn=ADB Sideload}</text>
+ <action function="page">sideload</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_show_dumlock" var2="1"/>
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@dumlock_btn=HTC Dumlock}</text>
+ <action function="page">htcdumlock</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@inject_twrp_btn=Inject TWRP}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=reinjecttwrp</action>
+ <action function="set">tw_text1={@inject_twrp_confirm=Re-Inject TWRP?}</action>
+ <action function="set">tw_action_text1={@injecting_twrp=Re-Injecting TWRP...}</action>
+ <action function="set">tw_complete_text1={@inject_twrp_complete=TWRP Injection Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="partsdcardsel">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%content_width%" h="%partitionlist_mount_height%"/>
+ <text>{@sel_storage_list=Select Storage}</text>
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <text style="text_m_fail">
+ <condition var1="partitionlisterror" var2="1"/>
+ <placement x="%center_x%" y="%row14_y%" placement="5"/>
+ <text>{@invalid_partsd_sel=You must select a removable device}</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@ok_btn=OK}</text>
+ <actions>
+ <action function="getpartitiondetails">tw_storage_path</action>
+ <action function="page">partsdcardcheck</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="partsdcardcheck">
+ <action>
+ <condition var1="tw_partition_removable" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcard</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_partition_removable" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="partsdcard">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@part_sd_ext_sz=EXT Size:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>%tw_sdext_size%</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col3_x_left%" y="%row5_y%"/>
+ <text>{@part_sd_m=-}</text>
+ <action function="addsubtract">tw_sdext_size-256</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col2_x_right%" y="%row5_y%"/>
+ <text>{@part_sd_p=+}</text>
+ <action function="addsubtract">tw_sdext_size+256</action>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row9_y%" placement="5"/>
+ <text>{@part_sd_swap_sz=Swap Size:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row10_y%" placement="5"/>
+ <text>%tw_swap_size%</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col3_x_left%" y="%row9_y%"/>
+ <text>{@part_sd_m=-}</text>
+ <action function="addsubtract">tw_swap_size-64</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col2_x_right%" y="%row9_y%"/>
+ <text>{@part_sd_p=+}</text>
+ <action function="addsubtract">tw_swap_size+64</action>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row13_y%" placement="5"/>
+ <text>{@file_system=File System:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row14_y%" placement="5"/>
+ <text>%tw_sdpart_file_system%</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col3_x_left%" y="%row13_y%"/>
+ <text>EXT3</text>
+ <action function="set">tw_sdpart_file_system=ext3</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col2_x_right%" y="%row13_y%"/>
+ <text>EXT4</text>
+ <action function="set">tw_sdpart_file_system=ext4</action>
+ </button>
+
+ <slider style="slider_centered">
+ <text>{@swipe_part_sd=Swipe to Partition}</text>
+ <action function="page">partsdcardaction</action>
+ <actions>
+ <action function="set">tw_back=partsdcard</action>
+ <action function="set">tw_action=partitionsd</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=set</action>
+ <action function="set">tw_action2_param=tw_zip_location=/sdcard</action>
+ <action function="set">tw_action_text1={@partitioning_sd=Partitioning SD Card...}</action>
+ <action function="set">tw_action_text2={@partitioning_sd2=This will take a few minutes.}</action>
+ <action function="set">tw_complete_text1={@part_sd_complete=Partitioning Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">partsdcardsel</action>
+ </action>
+ </page>
+
+ <page name="htcdumlock">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@dumlock_hdr=HTC Dumlock}</text>
+ </text>
+
+ <button style="main_button_m">
+ <placement x="%col2_x_left%" y="%row2_y%"/>
+ <text>{@dumlock_restore_btn=Restore Original Boot}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=htcdumlockrestoreboot</action>
+ <action function="set">tw_text1={@dumlock_restore_confirm=Restore original boot image?}</action>
+ <action function="set">tw_action_text1={@dumlock_restoring=Restoring Original Boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_restore_complete=Restore Original Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_m">
+ <placement x="%col2_x_left%" y="%row6a_y%"/>
+ <text>{@dumlock_reflash_btn=Reflash Recovery}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=htcdumlockreflashrecovery</action>
+ <action function="set">tw_text1={@dumlock_reflash_confirm=Reflash recovery to boot?}</action>
+ <action function="set">tw_action_text1={@dumlock_reflashing=Flashing recovery to boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_reflash_complete=Recovery Flash to Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_m">
+ <placement x="%col2_x_left%" y="%row11_y%"/>
+ <text>{@dumlock_install_btn=Install HTC Dumlock}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=installhtcdumlock</action>
+ <action function="set">tw_text1={@dumlock_install_confirm=Install HTC dumlock files to ROM?}</action>
+ <action function="set">tw_action_text1={@dumlock_installing=Installing HTC Dumlock...}</action>
+ <action function="set">tw_complete_text1={@dumlock_install_complete=HTC Dumlock Install Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="lock">
+ <background color="%semi_transparent%"/>
+
+ <image>
+ <image resource="unlock_icon"/>
+ <placement x="%center_x%" y="%row8_y%" placement="4"/>
+ </image>
+
+ <slider style="slider_centered">
+ <text>{@swipe_to_unlock=Swipe to Unlock}</text>
+ <action function="overlay"/>
+ </slider>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+ </page>
+
+ <page name="filemanagerlist">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_sel_file=Select a File or Folder}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%content_quarter_width%" h="%fileselector_filemanager_height%"/>
+ <text>%tw_file_location1%</text>
+ <filter folders="1" files="1"/>
+ <path name="tw_file_location1" default="/"/>
+ <data name="tw_filename1"/>
+ <selection name="tw_selection1"/>
+ </fileselector>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row16a_y%"/>
+ <text>{@fm_sel_curr_folder=Select Current Folder}</text>
+ <actions>
+ <action function="set">tw_filename1=tw_file_location1</action>
+ <action function="set">tw_fm_isfolder=1</action>
+ <action function="set">tw_fm_type={@fm_type_folder=Folder}</action>
+ <action function="page">filemanageroptions</action>
+ </actions>
+ </button>
+
+ <action>
+ <actions>
+ <action function="set">tw_fm_type={@fm_type_file=File}</action>
+ <action function="set">tw_fm_isfolder=0</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+
+ <action>
+ <condition var1="tw_filename1" op="modified"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanageroptions">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_choose_act=Choose Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@fm_selected=%tw_fm_type% selected:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row3_y%"/>
+ <text>%tw_filename1%</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_fm_isfolder" var2="0"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@fm_copy_file_btn=Copy File}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=cp</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_fm_isfolder" var2="1"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@fm_copy_folder_btn=Copy Folder}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=cd "%tw_file_location1%" &amp;&amp; cd .. &amp;&amp; cp -R</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row11_y%"/>
+ <text>{@fm_move_btn=Move}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=mv</action>
+ <action function="set">tw_fm_text1={@fm_moving=Moving}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@fm_chmod755_btn=chmod 755}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=chmod 755</action>
+ <action function="set">tw_fm_text1={@fm_chmod755ing=chmod 755}</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@fm_chmod_btn=chmod}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=0000</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerchmod</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_right%" y="%row11_y%"/>
+ <text>{@fm_delete_btn=Delete}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=rm -rf</action>
+ <action function="set">tw_fm_text1={@fm_deleting=Deleting}</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_fm_isfolder" var2="0"/>
+ <placement x="%center_x%" y="%row11_y%"/>
+ <text>{@fm_rename_file_btn=Rename File}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=tw_selection1</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
+ <action function="set">tw_filemanager_command=mv</action>
+ <action function="page">filemanagerrenamefile</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
+ <condition var1="tw_fm_isfolder" var2="1"/>
+ <placement x="%center_x%" y="%row11_y%"/>
+ <text>{@fm_rename_folder_btn=Rename Folder}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=tw_selection1</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
+ <action function="set">tw_filemanager_command=cd "%tw_file_location1%" &amp;&amp; cd .. &amp;&amp; mv</action>
+ <action function="page">filemanagerrenamefolder</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanagerlist</action>
+ </action>
+ </page>
+
+ <page name="choosedestinationfolder">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_sel_dest=Select Destination Folder}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%col1_x_left%" y="%row1a_y%" w="%content_quarter_width%" h="%fileselector_filemanager_height%"/>
+ <text>%tw_file_location2%</text>
+ <filter folders="1" files="0"/>
+ <path name="tw_file_location2" default="/"/>
+ <data name="tw_filename2"/>
+ <selection name="tw_selection2"/>
+ </fileselector>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row16a_y%"/>
+ <text>{@fm_sel_curr_folder=Select Current Folder}</text>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3=%tw_file_location2%</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerrenamefile">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="1" maxlen="128"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3="%tw_file_location1%/%tw_filemanager_rename%"</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerrenamefolder">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="1" maxlen="128"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3=%tw_filemanager_rename%</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerchmod">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_set_perms_hdr=Set Permissions}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@fm_perms=Permissions:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="3" maxlen="4" allow="0123456789"/>
+ <actions>
+ <action function="set">tw_filemanager_command=chmod %tw_filemanager_rename%</action>
+ <action function="set">tw_fm_text1=chmod %tw_filemanager_rename%</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerconfirm">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@confirm_action=Confirm Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>%tw_fm_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>%tw_filename1%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_fm_text2%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>%tw_fm_text3%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider style="slider_centered">
+ <text>{@swipe_to_confirm=Swipe to Confirm}</text>
+ <action function="page">filemanageraction</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="filemanageraction">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_fm_text1%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_back=filemanagerlist</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_include_text3" var2="0"/>
+ <action function="cmd">%tw_filemanager_command% "%tw_filename1%"</action>
+ </action>
+
+ <action>
+ <condition var1="tw_include_text3" var2="1"/>
+ <action function="cmd">%tw_filemanager_command% "%tw_filename1%" "%tw_fm_text3%"</action>
+ </action>
+ </page>
+
+ <page name="decrypt">
+ <template name="page"/>
+
+ <action>
+ <condition var1="tw_crypto_pwtype" var2="2"/>
+ <action function="page">decrypt_pattern</action>
+ </action>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@decrypt_data_enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_crypto_display%</text>
+ <data name="tw_crypto_password" mask="*" maskvariable="tw_crypto_display"/>
+ <restrict minlen="1" maxlen="254"/>
+ <action function="page">trydecrypt</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row5_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="row5_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="%row5_y%"/>
+ <text>{@decrypt_data_failed=Password failed, please try again!}</text>
+ </text>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%indent_right%" y="%row6_y%" placement="1"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="overlay">select_language</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+ </page>
+
+ <page name="decrypt_pattern">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col2_x_left%" y="%row2_y%" placement="5"/>
+ <text>{@decrypt_data_enter_pattern=Enter Pattern.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col2_x_left%" y="%row3_y%" placement="5"/>
+ <text>{@decrypt_data_failed_pattern=Pattern failed, please try again!}</text>
+ </text>
+
+ <patternpassword>
+ <placement x="%pattern_x%" y="%row4a_y%" w="%pattern_size%" h="%pattern_size%"/>
+ <dot color="%fileselector_linecolor%" activecolor="%accent_color%" radius="%pattern_dot_dia%"/>
+ <line color="%fileselector_linecolor%" width="%pattern_line_w%"/>
+ <data name="tw_crypto_password"/>
+ <action function="page">trydecrypt</action>
+ </patternpassword>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>3x3</text>
+ <action function="set">tw_gui_pattern_grid_size=3</action>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>4x4</text>
+ <action function="set">tw_gui_pattern_grid_size=4</action>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>5x5</text>
+ <action function="set">tw_gui_pattern_grid_size=5</action>
+ </button>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row10a_y%"/>
+ <text>6x6</text>
+ <action function="set">tw_gui_pattern_grid_size=6</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col1_x_right%" y="%row15a_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="overlay">select_language</action>
+ </button>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_right%" y="%row15a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </button>
+ </page>
+
+ <page name="trydecrypt">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@decrypt_data_trying=Trying Decryption}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <action function="decrypt"/>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_password_fail=1</action>
+ <action function="page">decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="terminalcommand">
+ <template name="page"/>
+
+ <fill color="%background_color%">
+ <placement x="0" y="%status_height%" w="%screen_width%" h="%header_height%"/>
+ </fill>
+
+ <terminal>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%row3_header_y%" w="%screen_width%" h="%terminal_s_height%"/>
+ </terminal>
+
+ <terminal>
+ <condition var1="tw_hide_kb" var2="1"/>
+ <placement x="0" y="%row3_header_y%" w="%screen_width%" h="%terminal_l_height%"/>
+ </terminal>
+
+ <template name="keyboardterminaltemplate"/>
+
+ <object type="fill" color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%" />
+ </object>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <placement x="%home_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <placement x="%home_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="page">main</action>
+ <action function="set">tw_hide_kb=0</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="page">advanced</action>
+ <action function="set">tw_hide_kb=0</action>
+ </actions>
+ </action>
+
+ <object type="action">
+ <touch key="power+voldown" />
+ <action function="screenshot" />
+ </object>
+ </page>
+
+ <page name="sideload">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@adb_sideload_hdr=ADB Sideload}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>{@sideload_wipe_dalvik_chk=Wipe Dalvik Cache}</text>
+ <data variable="tw_wipe_dalvik"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%col1_x_left%" y="%row3a_y%"/>
+ <text>{@sideload_wipe_cache_chk=Wipe Cache}</text>
+ <data variable="tw_wipe_cache"/>
+ </checkbox>
+
+ <slider style="slider_centered">
+ <text>{@swipe_to_sideload=Swipe to Start Sideload}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=adbsideload</action>
+ <action function="set">tw_action_text1={@sideload_confirm=ADB Sideload}</action>
+ <action function="set">tw_action_text2={@sideload_usage=Usage: adb sideload filename.zip}</action>
+ <action function="set">tw_complete_text1={@sideload_complete=ADB Sideload Complete}</action>
+ <action function="set">tw_has_cancel=1</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="set">tw_cancel_action=adbsideloadcancel</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="fixcontexts">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fix_contexts_hdr=Fix Contexts}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@fix_contexts_note1=Note: Fixing contexts is rarely needed.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@fix_contexts_note2=Fixing SELinux Contexts may cause}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@fix_contexts_note3=your device to not boot properly.}</text>
+ </text>
+
+ <slider style="slider_centered">
+ <text>{@swipe_to_fix_contexts=Swipe to Fix Contexts}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=fixcontexts</action>
+ <action function="set">tw_action_text1={@fixing_contexts=Fixing Contexts...}</action>
+ <action function="set">tw_complete_text1={@fix_contexts_complete=Fix Contexts Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="installsu">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@su_hdr=SuperSU Check}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@su_note1=Your device does not appear to be rooted.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@su_note2=Install SuperSU now?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@su_note3=This will root your device.}</text>
+ </text>
+
+ <button style="main_button_half_width">
+ <placement x="%col2_x_left%" y="%row15a_y%"/>
+ <text>{@su_cancel=Do not Install}</text>
+ <action function="set">tw_page_done=1</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_su_to_install=Swipe to Install}</text>
+ <actions>
+ <action function="set">tw_action=installsu</action>
+ <action function="set">tw_action_text1={@su_installing=Installing SuperSU}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="page">singleaction_page</action>
+ </actions>
+ </slider>
+ </page>
+
+ <page name="slideout">
+ <fill color="%background_color%">
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="%slideout_bg_height%"/>
+ </fill>
+
+ <console>
+ <placement x="%col1_x_left%" y="%slideout_y%" w="%content_width%" h="%slideout_height%"/>
+ </console>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ <action function="overlay"/>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="select_storage">
+ <fill color="%semi_transparent%">
+ <placement x="0" y="0" w="%screen_width%" h="%screen_height%"/>
+ </fill>
+
+ <fill color="%background_color%">
+ <placement x="%col2_x_left%" y="row4_y" w="%dialog_width%" h="%dialog_height%"/>
+ </fill>
+
+ <partitionlist style="partitionlist_storage">
+ <text>{@sel_storage_list=Select Storage}</text>
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <button style="button_third_width">
+ <placement x="%dialog_button_x%" y="%row13_y%"/>
+ <text>{@ok_btn=OK}</text>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="overlay"/>
+ <action function="page">clear_vars</action>
+ </actions>
+ </button>
+
+ <fill color="#000000">
+ <placement x="0" y="navbar_y" w="%screen_width%" h="%navbar_height"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <placement x="%home_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <placement x="%home_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="select_language">
+ <fill color="%semi_transparent%">
+ <placement x="0" y="0" w="%screen_width%" h="%screen_height%"/>
+ </fill>
+
+ <fill color="%background_color%">
+ <placement x="%col2_x_left%" y="row4_y" w="%dialog_width%" h="%dialog_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%dialog_content_x%" y="%row4_y%" w="%content_overlay_width%" h="%partitionlist_storage_height%"/>
+ <text>{@select_language=Select Language:}</text>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button style="button_third_width">
+ <placement x="%dialog_button_x%" y="%row13_y%"/>
+ <text>{@ok_btn=OK}</text>
+ <actions>
+ <action function="overlay"/>
+ <action function="setlanguage"></action>
+ </actions>
+ </button>
+
+ <fill color="#000000">
+ <placement x="0" y="navbar_y" w="%screen_width%" h="%navbar_height"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <placement x="%home_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <placement x="%home_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="console" />
+ <condition var1="tw_busy" var2="0" />
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2" />
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+ </pages>
+</recovery>
diff --git a/gui/theme/common/languages/cz.xml b/gui/theme/common/languages/cz.xml
new file mode 100644
index 000000000..83cd0b2cf
--- /dev/null
+++ b/gui/theme/common/languages/cz.xml
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Czech</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">Systém</string>
+ <string name="system_image">Obraz systému</string>
+ <string name="vendor">Dodavatel</string>
+ <string name="vendor_image">Obrázek dodavatela</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SD karta</string>
+ <string name="internal">Interní úložiště</string>
+ <string name="microsd">Mikro SD karta</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Přijaté data</string>
+ <string name="adopted_storage">Přijaté úložiště</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Baterie: %tw_battery%</string>
+ <string name="sort_by_name">Seřadit podle názvu</string>
+ <string name="sort_by_date">Seřadit podle datumu</string>
+ <string name="sort_by_size">Seřadit podle velikosti</string>
+ <string name="sort_by_name_only">Název</string>
+ <string name="sort_by_date_only">Datum</string>
+ <string name="sort_by_size_only">Velikost</string>
+ <string name="tab_general">VŠEOBECNÉ</string>
+ <string name="tab_options">MOŽNOSTI</string>
+ <string name="tab_backup">ZÁLOHOVÁNÍ</string>
+ <string name="tab_time_zone">ČASOVÉ PÁSMO</string>
+ <string name="tab_screen">OBRAZOVKA</string>
+ <string name="tab_vibration">VIBRACE</string>
+ <string name="tab_language">JAZYK</string>
+ <string name="install_btn">Instalovat</string>
+ <string name="wipe_btn">Vymazat</string>
+ <string name="backup_btn">Zálohovat</string>
+ <string name="restore_btn">Obnovit</string>
+ <string name="mount_btn">Připojit</string>
+ <string name="settings_btn">Nastavení</string>
+ <string name="advanced_btn">Rozšířené</string>
+ <string name="reboot_btn">Restartovat</string>
+ <string name="files_btn">Soubory</string>
+ <string name="copy_log_btn">Kopírovat log</string>
+ <string name="select_type_hdr">Vyberte typ</string>
+ <string name="install_zip_hdr">Instalovat Zip</string>
+ <string name="install_zip_btn">Instalovat Zip</string>
+ <string name="install_image_hdr">Instalovat obraz</string>
+ <string name="install_image_btn">Instalovat obraz</string>
+ <string name="install_select_file_hdr">Vybrat soubor</string>
+ <string name="file_selector_folders_hdr">Složky</string>
+ <string name="select_file_from_storage">Vyberte soubor z: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Instalovat</string>
+ <string name="select_storage_hdr">Vyberte úložiště</string>
+ <string name="select_storage_btn">Vyberte úložiště</string>
+ <string name="queue_hdr">Řada</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% / max 10 souborů v řadě</string>
+ <string name="zip_queue_count_s">Soubor %tw_zip_queue_count% z 10:</string>
+ <string name="zip_warn1">Tato operace může nainstalovat nekompatibilní</string>
+ <string name="zip_warn2">software a znefunkčnit zařízení.</string>
+ <string name="zip_back_cancel">Stlačte Nazpět pro zrušení přidání zip.</string>
+ <string name="zip_back_clear">Stlačte Nazpět pro vyčištění seznamu.</string>
+ <string name="folder">Adresář:</string>
+ <string name="file">Soubor:</string>
+ <string name="zip_sig_chk">Verifikace podpisu zip</string>
+ <string name="inject_twrp_chk">Vložit TWRP po instalaci</string>
+ <string name="options_hdr">Nastavení</string>
+ <string name="confirm_flash_hdr">Potvrdit flash</string>
+ <string name="zip_queue">Řada:</string>
+ <string name="options">Nastavení:</string>
+ <string name="swipe_confirm"> Potvrdit</string>
+ <string name="zip_add_btn">Přidat víc Zip</string>
+ <string name="zip_clear_btn">Vyčistit seznam Zip</string>
+ <string name="install_zip_count_hdr">Nainstaluj Zip %tw_zip_index% z %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Instalace Zip: %tw_file%</string>
+ <string name="failed">Neúspěšné</string>
+ <string name="successful">Úspěšné</string>
+ <string name="install_failed">Instalace selhala</string>
+ <string name="install_successful">Instalace se podařila</string>
+ <string name="wipe_cache_dalvik_btn">Vymazat cache/dalvik</string>
+ <string name="reboot_system_btn">Restartovat systém</string>
+ <string name="install_sel_target">Vyberte cílový oddíl</string>
+ <string name="flash_image_select">Vyberte cílový oddíl pro zápis obrazu:</string>
+ <string name="target_partition">Cílový oddíl:</string>
+ <string name="flashing_image">Zapisování obrazu...</string>
+ <string name="image_flashed">Obraz zapsaný</string>
+ <string name="wipe_cache_dalvik_confirm">Smazat cache &amp; dalvik?</string>
+ <string name="wiping_cache_dalvik">Mazání cache &amp; dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Vymazání cache &amp; dalvik dokončeno</string>
+ <string name="swipe_wipe">Potáhnout pro vymazání</string>
+ <string name="swipe_wipe_s"> Vymazání</string>
+ <string name="no_os1">Není nainstalovaný OS! Jste si</string>
+ <string name="no_osrb">si jistý, že chcete restart?</string>
+ <string name="no_ospo">si jistý, že chcete vypnout zařízení?</string>
+ <string name="rebooting">Restartování...</string>
+ <string name="swipe_reboot">Potáhnout pro restart</string>
+ <string name="swipe_reboot_s"> Restart</string>
+ <string name="swipe_flash">Potáhnout pro potvrzení zápisu</string>
+ <string name="confirm_action">Potvrdit akci</string>
+ <string name="back_cancel">Pro zrušení stlačte tlačítko nazpět.</string>
+ <string name="cancel_btn">Zrušit</string>
+ <string name="wipe_hdr">Vymazat</string>
+ <string name="factory_reset_hdr">Tovární nastavení</string>
+ <string name="factory_reset_btn">Tovární nastavení</string>
+ <string name="factory_reset1">Vymazat Data, Cache a Dalvik</string>
+ <string name="factory_reset2">(nezahrnuje vnitřní paměť)</string>
+ <string name="factory_reset3">Většinou je</string>
+ <string name="factory_reset4">potřebné jen vymazaní.</string>
+ <string name="factory_resetting">Tovární nastavení...</string>
+ <string name="advanced_wipe_hdr">Rozšířené vymazání</string>
+ <string name="advanced_wipe_btn">Rozšířené vymazání</string>
+ <string name="wipe_enc_confirm">Vymazat šifrovaní z Data?</string>
+ <string name="formatting_data">Formátuji Data...</string>
+ <string name="swipe_format_data">Swipe pro volbu Formátovat Data</string>
+ <string name="swipe_format_data_s"> Formátovat Data</string>
+ <string name="factory_reset_complete">Tovární nastavení ukončené</string>
+ <string name="sel_part_hdr">Vyberte oddíly</string>
+ <string name="wipe_sel_confirm">Vymazat vybraný(é) oddíl(y)?</string>
+ <string name="wiping_part">Vymazávání oddílu(ů)...</string>
+ <string name="wipe_complete">Vymazávání dokončeno</string>
+ <string name="sel_part_wipe">Vyberte oddíly na vymazání:</string>
+ <string name="invalid_part_sel">Neplatný výběr oddílu</string>
+ <string name="format_data_hdr">Formátovat Data</string>
+ <string name="format_data_btn">Formátovat Data</string>
+ <string name="format_data_ptr1">Formátování Data vymaže všechny aplikace,</string>
+ <string name="format_data_ptr2">zálohy, fotky, videa, hudbu</string>
+ <string name="format_data_ptr3">a vymaže enkrypci vnitřní paměťi.</string>
+ <string name="format_data_adopted">Zahrnuje adoptovanou paměť</string>
+ <string name="format_data_lcp1">Formátování Data vymaže všechny aplikace, zálohy, fotografie, videa, hudbu</string>
+ <string name="format_data_lcp2">a vymaže enkrypci vnitřní paměťi.</string>
+ <string name="format_data_wtc1">Formátování Data vymaže všechny aplikace,</string>
+ <string name="format_data_wtc2">zálohy a hudbu. Tento proces je nevratný.</string>
+ <string name="format_data_undo">Toto je nevratné.</string>
+ <string name="format_data_complete">Formátování Data je hotové</string>
+ <string name="yes_continue">Napiš \"yes\" pro pokračování. Stlač nazpět pro zrušení.</string>
+ <string name="part_opt_hdr">Možnosti pro: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Vyber akci</string>
+ <string name="file_sys_opt">Nastavení souborového systému</string>
+ <string name="partition">Oddíly: %tw_partition_name%</string>
+ <string name="part_mount_point">Mount point: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Souborový systém: %tw_partition_file_system%</string>
+ <string name="part_prosent_yes">Přítomný: Ano</string>
+ <string name="part_prosent_no">Přítomný: Ne</string>
+ <string name="part_removable_yes">Vyměnitelný: Ano</string>
+ <string name="part_removable_no">Vyměnitelný: Ne</string>
+ <string name="part_size">Velikost: %tw_partition_size%MB</string>
+ <string name="part_used">Použité: %tw_partition_used%MB</string>
+ <string name="part_free">Volné: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Velikost zálohy: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Natáhnout souborový systém</string>
+ <string name="resize_btn_s">Natáhnout</string>
+ <string name="resize_confirm">Natáhnout %tw_partition_name%?</string>
+ <string name="resizing">Natahuji...</string>
+ <string name="resize_complete">Natažení dokončeno</string>
+ <string name="swipe_resize">Potáhni pro natažení</string>
+ <string name="swipe_resize_s"> Natáhnout</string>
+ <string name="repair_btn">Opravit souborový systém</string>
+ <string name="repair_btn_s">Oprava</string>
+ <string name="repair_confirm">Opravit %tw_partition_name%?</string>
+ <string name="repairing">Opravování...</string>
+ <string name="repair_complete">Oprava ukončená</string>
+ <string name="swipe_repair">Potáhnout pro opravu</string>
+ <string name="swipe_repair_s"> Oprava</string>
+ <string name="change_fs_btn">Změnit souborový systém</string>
+ <string name="change_fs_btn_s">Změnit</string>
+ <string name="change_fs_for_hdr">Změnit souborový systém pro: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Oddíl: %tw_partition_name% &gt; Zvolte souborový systém</string>
+ <string name="change_fs_warn1">Některé ROM nebo jádra nemusí podporovat některé</string>
+ <string name="change_fs_warn2">souborové systémy. Pokračujte opatrně!</string>
+ <string name="change_fs_confirm">Změnit %tw_partition_name%?</string>
+ <string name="formatting">Formátovaní...</string>
+ <string name="format_complete">Formátovaní dokončeno</string>
+ <string name="swipe_change_fs">Potáhnout pro změnu</string>
+ <string name="swipe_change_s"> Změna</string>
+ <string name="back_btn">Nazpět</string>
+ <string name="wipe_enc_btn">Vymazat šifrování</string>
+ <string name="swipe_factory_reset">Potáhnout pro tovární nastavení</string>
+ <string name="repair_change_btn">Opravit nebo změnit souborový systém</string>
+ <string name="storage_hdr">Úložiště: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Záloha</string>
+ <string name="backup_confirm_hdr">Potvrdit zálohu</string>
+ <string name="encryption_tab">ŠIFROVÁNÍ</string>
+ <string name="encryption">Šifrování:</string>
+ <string name="name">Název:</string>
+ <string name="sel_part_backup">Vybrat oddíly do zálohy:</string>
+ <string name="storage">Paměť:</string>
+ <string name="enc_disabled">zakázané - pro povolení zadejte heslo</string>
+ <string name="enc_enabled">povolené</string>
+ <string name="enable_backup_comp_chk">Povolit kompresi</string>
+ <string name="skip_md5_backup_chk">Vynechat generovaní MD5 během zálohy</string>
+ <string name="disable_backup_space_chk">Nekontrolovat volné místo</string>
+ <string name="refresh_sizes_btn">Obnovit velikosti</string>
+ <string name="swipe_backup">Potáhnout pro zálohu</string>
+ <string name="append_date_btn">Připojit datum</string>
+ <string name="backup_name_exists">Záloha se stejným názvem už existuje!</string>
+ <string name="encrypt_backup">Šifrovat zálohu?</string>
+ <string name="enter_pass">Zadajte heslo:</string>
+ <string name="enter_pass2">Zopakujte heslo:</string>
+ <string name="pass_not_match">Hesla se nezhodují!</string>
+ <string name="partitions">Oddíly:</string>
+ <string name="disabled">Zakázané</string>
+ <string name="enabled">Povolené</string>
+ <string name="backup_name_hdr">Pojmenování zálohy</string>
+ <string name="progress">Příběh:</string>
+ <string name="backup_complete">Zálohovaní je dokončeno</string>
+ <string name="restore_hdr">Obnova</string>
+ <string name="sel_backup_hdr">Vyberte zálohu</string>
+ <string name="restore_sel_store_hdr">Vyberte zálohu z %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Vyberte balíček pro obnovu:</string>
+ <string name="restore_enc_backup_hdr">Šifrovaná záloha</string>
+ <string name="restore_dec_fail">Heslo je nesprávne, zkuste to znova!</string>
+ <string name="del_backup_btn">Smazat zálohu</string>
+ <string name="del_backup_confirm">Smazat zálohu?</string>
+ <string name="del_backup_confirm2">Toto je nevratné!</string>
+ <string name="deleting_backup">Vymazávaní zálohy...</string>
+ <string name="backup_deleted">Vymazání zálohy dokončeno</string>
+ <string name="swipe_delete">Potáhnout pro smazání</string>
+ <string name="swipe_delete_s"> Vymazat</string>
+ <string name="restore_try_decrypt">Šifrovaná záloha - pokus o dešifrovaní</string>
+ <string name="restore_try_decrypt_s">Pokus o dešifrovaní</string>
+ <string name="restore_backup_date">Záloha hotová %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Vybrat oddíl pro obnovu:</string>
+ <string name="restore_enable_md5_chk">Povolit kontrolu MD5 na zálohovaných souborech</string>
+ <string name="restore_complete">Obnova dokočená</string>
+ <string name="swipe_restore">Potáhnout pro obnovu</string>
+ <string name="swipe_restore_s"> Obnovit</string>
+ <string name="rename_backup_hdr">Přejmenovat zálohu</string>
+ <string name="rename_backup_confirm">Přejmenovat zálohu?</string>
+ <string name="rename_backup_confirm2">Toto je nevratné!</string>
+ <string name="renaming_backup">Přejmenovávaní zálohy...</string>
+ <string name="rename_backup_complete">Přejmenování zálohy dokončeno</string>
+ <string name="swipe_to_rename">Potáhnutím přejmenovat</string>
+ <string name="swipe_rename"> Přejmenovat</string>
+ <string name="confirm_hdr">Potvrdit</string>
+ <string name="mount_hdr">Připojit</string>
+ <string name="mount_sel_part">Vybrat oddíly pro připojení:</string>
+ <string name="mount_sys_ro_chk">Připojit oddíly v režimu čtení</string>
+ <string name="mount_sys_ro_s_chk">Připojit systém v režimu na čtení</string>
+ <string name="decrypt_data_btn">Dekryptovat Data</string>
+ <string name="disable_mtp_btn">Zakázat MTP</string>
+ <string name="enable_mtp_btn">Povolit MTP</string>
+ <string name="mount_usb_storage_btn">Připoj. ukl. prostor USB</string>
+ <string name="usb_storage_hdr">Ukládací prostor USB</string>
+ <string name="usb_stor_mnt1">Ukládací prostor USB připojený</string>
+ <string name="usb_stor_mnt2">Ujistěte se, že jste zařízení odebrali</string>
+ <string name="usb_stor_mnt3">z počítače před odpojením!</string>
+ <string name="unmount_btn">Odpojit</string>
+ <string name="rb_system_btn">Systém</string>
+ <string name="rb_poweroff_btn">Vypnout</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Stáhnout</string>
+ <string name="turning_off">Vypínání...</string>
+ <string name="swipe_power_off">Potáhnout pro vypnutí</string>
+ <string name="swipe_power_off_s">Vypnout</string>
+ <string name="sys_ro_hdr">Nezměněný systémový oddíl</string>
+ <string name="sys_ro_keep">Ponechat Systém v režimu na čtení?</string>
+ <string name="sys_rop1">TWRP může ponechat váš systémový oddíl nezměněný</string>
+ <string name="sys_rop2">což zjednoduší instalaci oficiálních aktualizací.</string>
+ <string name="sys_rop3">TWRP nezabrání tuctové ROMky</string>
+ <string name="sys_rop4">přepsat TWRP a nebude nabízet rootování zařízení.</string>
+ <string name="sys_rop5">Instalovaní Zip nebo operace přes adb můžu stále</string>
+ <string name="sys_rop6">modifikovat systémový oddíl.</string>
+ <string name="sys_rol1">TWRP může ponechat váš systémový oddíl nezměněný což zjednoduší instalaci oficiálních aktualizací.</string>
+ <string name="sys_rol2">TWRP nezabrání tuctové ROMce přepsat TWRP a nebude nabízet rootování zařízení.</string>
+ <string name="sys_rol3">Instalování Zip nebo operace přes adb můžou stále modifikovat systémový oddíl.</string>
+ <string name="sys_ro_never_show_chk">Nikdy víc nezobrazovat tuto obrazovku po startu</string>
+ <string name="sys_ro_keep_ro_btn">Ponechat v režimu na čtení</string>
+ <string name="swipe_allow_mod">Potáhnout pro povolení změn</string>
+ <string name="swipe_allow_mod_s">Povolit změny</string>
+ <string name="settings_hdr">Nastavení</string>
+ <string name="settings_gen_hdr">Všeobecné</string>
+ <string name="settings_gen_s_hdr">Všeobecné</string>
+ <string name="settings_gen_btn">Všeobecné</string>
+ <string name="use_rmrf_chk">Použít rm -rf namísto naformátování</string>
+ <string name="use24clock_chk">Používat 24-hodin</string>
+ <string name="rev_navbar_chk">Převrácené uspořádaní lišty</string>
+ <string name="simact_chk">Simulovat akce pro testovaní téma</string>
+ <string name="simfail_chk">Simulovat neúspěchy akcí</string>
+ <string name="ctr_navbar_rdo">Centrovat tlačítka navigace</string>
+ <string name="lft_navbar_rdo">Zarovnat tlačítka navigace vlevo</string>
+ <string name="rht_navbar_rdo">Zarovnat tlačítka navigace vpravo</string>
+ <string name="restore_defaults_btn">Obnovit předvolené</string>
+ <string name="settings_tz_btn">Časové pásmo</string>
+ <string name="settings_screen_btn">Obrazovka</string>
+ <string name="settings_screen_bright_btn">Jas obrazovky</string>
+ <string name="settings_vibration_btn">Vibrovat</string>
+ <string name="settings_language_btn">Jazyk</string>
+ <string name="time_zone_hdr">Časové pásmo</string>
+ <string name="sel_tz_list">Vyberte časové pásmo:</string>
+ <string name="utcm11">(UTC -11) Samoa, Midwayské ostrovy</string>
+ <string name="utcm10">(UTC -10) Havaj</string>
+ <string name="utcm9">(UTC -9) Aljaška</string>
+ <string name="utcm8">(UTC -8) Tichomořský čas</string>
+ <string name="utcm7">(UTC -7) Západní (Horský) čas USA, Arizona</string>
+ <string name="utcm6">(UTC -6) Centrální čas USA, Mexiko</string>
+ <string name="utcm5">(UTC -5) Východní čas USA, Indiana</string>
+ <string name="utcm4">(UTC -4) Atlantický čas, Caracas</string>
+ <string name="utcm3">(UTC -3) Brazílie, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Středoatlantický čas</string>
+ <string name="utcm1">(UTC -1) Azory, Cape Verde</string>
+ <string name="utc0">(UTC 0) Greenwichský čas, Londýn, Dublin, Lisabon</string>
+ <string name="utcp1">(UTC +1) Stredoevropský čas, Praha, Berlín, Brusel, Paříž</string>
+ <string name="utcp2">(UTC +2) Atény, Istanbul, Minsk, Káhira</string>
+ <string name="utcp3">(UTC +3) Moskva, Bagdád, Teherán</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Islamabád, Karáčí, Jekaterinsburg</string>
+ <string name="utcp6">(UTC +6) Astana, Colombo, Dhakar</string>
+ <string name="utcp7">(UTC +7) Bangkok, Džakarta, Hanoj</string>
+ <string name="utcp8">(UTC +8) Peking, Hong Kong, Singapur</string>
+ <string name="utcp9">(UTC +9) Jakutsk, Tokyo, Soul</string>
+ <string name="utcp10">(UTC +10) Vladivostok, Sydney, Guam</string>
+ <string name="utcp11">(UTC +11) Magadan, Šalamounovy ostrovy</string>
+ <string name="utcp12">(UTC +12) Wellington, Fidži, Kamčatka</string>
+ <string name="sel_tz_offset">Zvolte odchylku (obyčejně 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Žádná</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Použít letní čas (DST)</string>
+ <string name="curr_tz">Aktuální časové pásmo: %tw_time_zone%</string>
+ <string name="curr_tz_s">Aktuální časové pásmo:</string>
+ <string name="set_tz_btn">Nastav časové pásmo</string>
+ <string name="settings_screen_hdr">Obrazovka</string>
+ <string name="settings_screen_timeout_hdr">Vypnutí obrazovky</string>
+ <string name="enable_timeout_chk">Povolit vypnutí obrazovky</string>
+ <string name="screen_to_slider">Vypnutí obrazovky v sekundách:</string>
+ <string name="screen_to_slider_s">Vypnutí obrazovky v sekundách (0=zakázané): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Nastavení vypnutí obrazovky nedostupné</string>
+ <string name="screen_bright_slider">Jas: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Nastavení jasu nedostupné</string>
+ <string name="vibration_hdr">Vibrovat</string>
+ <string name="button_vibration_hdr">Vibrovat při stláčení</string>
+ <string name="kb_vibration_hdr">Vibrovat při psaní</string>
+ <string name="act_vibration_hdr">Vibrovat při akci</string>
+ <string name="button_vibration">Vibrovat při stláčení:</string>
+ <string name="kb_vibration">Vibrovat při psaní:</string>
+ <string name="act_vibration">Vibrovat při akci:</string>
+ <string name="select_language">Výběr jazyka:</string>
+ <string name="sel_lang_btn">Výběr jazyka</string>
+ <string name="set_language_btn">Nastavit jazyk</string>
+ <string name="advanced_hdr">Rozšířené</string>
+ <string name="copy_log_confirm">Kopírovat log na SD kartu?</string>
+ <string name="copying_log">Kopírování logu na SD kartu...</string>
+ <string name="copy_log_complete">Kopírování logu dokončeno</string>
+ <string name="part_sd_btn">Rozdělit SD kartu</string>
+ <string name="part_sd_s_btn">SD karta</string>
+ <string name="file_manager_btn">Souborový manažer</string>
+ <string name="language_hdr">Jazyk</string>
+ <string name="terminal_btn">Terminál</string>
+ <string name="reload_theme_btn">Načítat téma</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Vložit TWRP</string>
+ <string name="inject_twrp_confirm">Znova vložit TWRP?</string>
+ <string name="injecting_twrp">Znova vkladám TWRP...</string>
+ <string name="inject_twrp_complete">Vložení TWRP dokončeno</string>
+ <string name="swipe_to_confirm">Potáhnout pro potvrzení</string>
+ <string name="part_sd_hdr">Rozdělit SD kartu</string>
+ <string name="invalid_partsd_sel">Musíte zvolit odstranitelné zařízení</string>
+ <string name="part_sd_lose">Přijdete o všechny soubory na vložené SD kartě!</string>
+ <string name="part_sd_undo">Toto je nevratná akce!</string>
+ <string name="part_sd_ext_sz">Velikost EXT:</string>
+ <string name="part_sd_swap_sz">Velikost Swap:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Souborový systém:</string>
+ <string name="swipe_part_sd">Potáhnutím rozdělit</string>
+ <string name="swipe_part_sd_s">Rozdělení</string>
+ <string name="partitioning_sd">Dělím SD kartu...</string>
+ <string name="partitioning_sd2">Toto potrvá několik minut.</string>
+ <string name="part_sd_complete">Rozdělení kompletní</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Onbovit původní boot</string>
+ <string name="dumlock_restore_confirm">Obnovit původní obraz boot?</string>
+ <string name="dumlock_restoring">Obnovování původního bootu...</string>
+ <string name="dumlock_restore_complete">Obnova původního bootu dokončená</string>
+ <string name="dumlock_reflash_btn">Přepsání recovery</string>
+ <string name="dumlock_reflash_confirm">Přepsat recovery při startu?</string>
+ <string name="dumlock_reflashing">Přepisování recovery při startu...</string>
+ <string name="dumlock_reflash_complete">Přepsání recovery při startu dokončeno</string>
+ <string name="dumlock_install_btn">Instalovat HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Instalovat soubory HTC Dumlock do ROM?</string>
+ <string name="dumlock_installing">Instalace HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Instalace HTC Dumlock dokončená</string>
+ <string name="swipe_to_unlock">Potáhnutím odemknout</string>
+ <string name="swipe_unlock"> Odemknout</string>
+ <string name="fm_hdr">Souborový manažer</string>
+ <string name="fm_sel_file">Vyberte soubor nebo adresář</string>
+ <string name="fm_type_folder">Adresář</string>
+ <string name="fm_type_file">Soubor</string>
+ <string name="fm_choose_act">Zvolte akci</string>
+ <string name="fm_selected">Zvolené %tw_fm_type%:</string>
+ <string name="fm_copy_btn">Kopíruj</string>
+ <string name="fm_copy_file_btn">Kopírovat soubor</string>
+ <string name="fm_copy_folder_btn">Kopírovat adresář</string>
+ <string name="fm_copying">Kopírování</string>
+ <string name="fm_move_btn">Přesunout</string>
+ <string name="fm_moving">Přesouvání</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Vymazat</string>
+ <string name="fm_deleting">Vymazávání</string>
+ <string name="fm_rename_btn">Přejmenovat</string>
+ <string name="fm_rename_file_btn">Přejmenovat soubor</string>
+ <string name="fm_rename_folder_btn">Přejmenovat adresář</string>
+ <string name="fm_renaming">Přejmenovávání</string>
+ <string name="fm_sel_dest">Vyberte cílový adresář</string>
+ <string name="fm_sel_curr_folder">Vyberte současný adresář</string>
+ <string name="fm_rename_hdr">Přejmenovat</string>
+ <string name="fm_set_perms_hdr">Nastavit práva</string>
+ <string name="fm_perms">Práva:</string>
+ <string name="fm_complete">Operace na souboru dokončená</string>
+ <string name="decrypt_data_hdr">Dešifrovat data</string>
+ <string name="decrypt_data_enter_pass">Zadejte heslo.</string>
+ <string name="decrypt_data_enter_pattern">Zadejte vzor.</string>
+ <string name="decrypt_data_trying">Pokus o dešifrování</string>
+ <string name="term_hdr">Příkaz terminálu</string>
+ <string name="term_s_hdr">Terminál</string>
+ <string name="term_kill_btn">ZABÍT</string>
+ <string name="term_sel_folder_hdr">Navigovat do počátečního adresáře</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Vymazat dalvik cache</string>
+ <string name="sideload_wipe_cache_chk">Vymazat cache</string>
+ <string name="swipe_to_sideload">Potáhnout pro spuštění sideload</string>
+ <string name="swipe_sideload"> Start</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Použití: adb sideload název.zip</string>
+ <string name="sideload_complete">ADB Sideload dokončený</string>
+ <string name="reboot_hdr">Restart</string>
+ <string name="su_hdr">Kontrola SuperSU</string>
+ <string name="su_note1">Vaše zařízení se netváří jako rootnuté.</string>
+ <string name="su_note2">Instalovat SuperSU nyní?</string>
+ <string name="su_note3">Toto rootne vaše zařízení.</string>
+ <string name="su_cancel">Neinstalovat</string>
+ <string name="swipe_su_to_install">Potáhnutím nainstalovat</string>
+ <string name="swipe_su_install"> Instalovat</string>
+ <string name="su_installing">Instalace SuperSU</string>
+ <string name="sel_storage_list">Vyberte úložiště</string>
+ <string name="ok_btn">OK</string>
+ <string name="no_kernel_selinux">Kernel nemá podporu pro čtení obsahu SELinux.</string>
+ <string name="full_selinux">Plná podpora SELinux.</string>
+ <string name="no_selinux">Bez podpory SELinux (chybí libselinux).</string>
+ <string name="mtp_enabled">MTP povolené</string>
+ <string name="mtp_crash">MTP selhalo, MTP nebude spuštěné při startu.</string>
+ <string name="decrypt_success">Úspešně dešifrované s přednastaveným heslem.</string>
+ <string name="unable_to_decrypt">Nelze dešifrovat s přednastaveným heslem. Možná budete muset naformátovat Data.</string>
+ <string name="generating_md51">Generuje se MD5</string>
+ <string name="generating_md52"> *Generuje se Md5...</string>
+ <string name="md5_created"> *MD5 vygenerované.</string>
+ <string name="md5_error"> * chyba MD5!</string>
+ <string name="md5_compute_error"> * chyba při výpočtu MD5.</string>
+ <string name="current_date">(Aktuální datum)</string>
+ <string name="auto_generate">(Generovat automaticky)</string>
+ <string name="unable_to_locate_partition">Nelze najít oddíl \'{1}\' pro výpočet zálohy.</string>
+ <string name="no_partition_selected">Žádné oddíly vybrané na zálohování.</string>
+ <string name="total_partitions_backup"> * Počet oddílů označených na zálohování: {1}</string>
+ <string name="total_backup_size"> * Konečná velikost zálohy: {1}MB</string>
+ <string name="available_space"> * Zůstatek místa: {1}MB</string>
+ <string name="unable_locate_storage">Nelze najít úložiště.</string>
+ <string name="no_space">Nedostatek místa na úložišti.</string>
+ <string name="backup_started">[ZÁLOHOVÁNÍ ZAČALO]</string>
+ <string name="backup_folder"> * Adresář zálohy: {1}</string>
+ <string name="fail_backup_folder">Nelze vytvořit adresář zálohy.</string>
+ <string name="avg_backup_fs">Průměrná míra zálohování souborových systémů: {1} MB/sek</string>
+ <string name="avg_backup_img">Průměrná míra zálohování disků: {1} MB/sek</string>
+ <string name="total_backed_size">[{1} MB ZÁLOH DOHROMADY]</string>
+ <string name="backup_completed">[ZÁLOHA DOKONČENÁ ZA {1} SEKUND]</string>
+ <string name="restore_started">[ZAČÁTEK OBNOVY]</string>
+ <string name="restore_folder">Obnovit adresář: \'{1}\'</string>
+ <string name="verifying_md5">Kontrolování MD5</string>
+ <string name="skip_md5">Vynechání kontroly MD5 na základě uživatelského nastavení.</string>
+ <string name="calc_restore">Počítání detailů obnovy...</string>
+ <string name="restore_read_only">Nelze obnovit {1} -- připojené jen na čtení.</string>
+ <string name="restore_unable_locate">Nelze najít oddíl \'{1}\' pro obnovu.</string>
+ <string name="no_part_restore">Žádné oddíly nebyly vybrané pro obnovu.</string>
+ <string name="restore_part_count">Obnova {1} oddílů...</string>
+ <string name="total_restore_size">Velikost obnovy je spolu {1}MB</string>
+ <string name="updating_system_details">Obnovování detailů systému</string>
+ <string name="restore_completed">[OBNOVA DOKONČENÁ ZA {1} SEKUND]</string>
+ <string name="error_opening_strerr">Chyba při otvírání: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Nelze najít oddíl podle názvu zálohy: \'{1}\'</string>
+ <string name="unable_find_part_path">Nelze najít oddíl na cestě \'{1}\'</string>
+ <string name="update_part_details">Obnova detailů oddílů...</string>
+ <string name="update_part_details_done">...hotovo</string>
+ <string name="wiping_dalvik">Vymazávání adresářů dalvik cache...</string>
+ <string name="cleaned">Vyčištěné: {1}...</string>
+ <string name="dalvik_done">-- Vyčištění adresáře Dalvik cache bylo dokončeno!</string>
+ <string name="no_andsec">Žádné zabezpečené android oddíly nebyly nalezeny.</string>
+ <string name="unable_to_locate">{1} nelze najít.</string>
+ <string name="wiping_datamedia">Vymazávání interního úložiště -- /data/media...</string>
+ <string name="unable_to_mount">{1} nelze připojit</string>
+ <string name="unable_to_mount_internal">Nelze připojit interní úložiště</string>
+ <string name="unable_to_mount_storage">Nelze připojit úložiště</string>
+ <string name="fail_decrypt">Nelze dešifrovat data.</string>
+ <string name="no_crypto_support">Tato verze byla zkompilovaná bez podpory šifrování.</string>
+ <string name="decrypt_success_dev">Data byly úspěšne dešifrované, nový block device: \'{1}\'</string>
+ <string name="done">Hotovo.</string>
+ <string name="start_partition_sd">Dělení SD karty...</string>
+ <string name="partition_sd_locate">Nelze najít zařízení na rozdělení.</string>
+ <string name="ext_swap_size">Velikost EXT + Swap je větší jako velikost SD-karty.</string>
+ <string name="remove_part_table">Vymazávání tabulky rozdělení...</string>
+ <string name="unable_rm_part">Nelze vymazat tabulku rozdělení.</string>
+ <string name="create_part">Vytváření oddílu {1}...</string>
+ <string name="unable_to_create_part">oddíl {1} nelze vytvořit.</string>
+ <string name="format_sdext_as">Formátování sd-ext jako {1}...</string>
+ <string name="part_complete">Rozdělení dokončeno.</string>
+ <string name="unable_to_open">Nelze otevřít \'{1}\'.</string>
+ <string name="mtp_already_enabled">MTP je už povolené</string>
+ <string name="mtp_fail">Nelze povolit MTP</string>
+ <string name="no_mtp">Podpora MTP není zahrnutá</string>
+ <string name="image_flash_start">[ZÁPIS OBRAZU SPUŠTĚNÝ]</string>
+ <string name="img_to_flash">Obraz na zápis: \'{1}\'</string>
+ <string name="flash_unable_locate">Nelze najít oddíl \'{1}\' pro zápis.</string>
+ <string name="no_part_flash">Na zápis nebyly zvolené žádné oddíly.</string>
+ <string name="too_many_flash">Na zápis je zvolených příliš mnoho oddílů.</string>
+ <string name="invalid_flash">Zvolený oddíl je nesprávný pro zápis.</string>
+ <string name="flash_done">[ZÁPIS OBRAZU DOKONČENÝ]</string>
+ <string name="wiping">Mazání {1}</string>
+ <string name="repair_not_exist">{1} neexistuje! Oprava nemožná!</string>
+ <string name="repairing_using">Oprava {1} pomocí {2}...</string>
+ <string name="unable_repair">Nelze opravit {1}.</string>
+ <string name="mount_data_footer">Nelze připojit /data a nelze najít parametry šifrování.</string>
+ <string name="create_folder_strerr">Adresář \'{1}\' nelze vytvořit ({2}).</string>
+ <string name="fail_mount">Nelze připojit \'{1}\' ({2})</string>
+ <string name="fail_unmount">Nelze odpojit \'{1}\' ({2})</string>
+ <string name="cannot_resize">Nelze natáhnout {1}.</string>
+ <string name="repair_resize">Opravování {1} před natáhnutím.</string>
+ <string name="unable_resize">Nelze natáhnout {1}.</string>
+ <string name="no_md5_found">Soubor MD5 se nenašel pro \'{1}\'. Prosím zvolte Vypnout kontrolu MD5 během obnovy.</string>
+ <string name="md5_fail_match">MD5 neodpovídá souboru \'{1}\'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Nelze dešifrovat soubor tar \'{1}\'</string>
+ <string name="format_data_msg">Měli by jste restartovat recovery aby jste mohli znova používat /data.</string>
+ <string name="format_data_err">Nelze formátovat pro zrušení šifrování.</string>
+ <string name="formatting_using">Formátování {1} použitím {2}...</string>
+ <string name="unable_to_wipe">Nelze vymazat {1}.</string>
+ <string name="cannot_wipe">Oddíl {1} se nedá vymazat.</string>
+ <string name="remove_all">Vymazání všech souborů v \'{1}\'</string>
+ <string name="wiping_data">Vymazaní Data bez vymazání /data/media...</string>
+ <string name="backing_up">Zálohování {1}...</string>
+ <string name="backing">Zálohování</string>
+ <string name="backup_size">Velikost zálohy pro \'{1}\' je 0 bajtů.</string>
+ <string name="datamedia_fs_restore">UPOZORNĚNÍ: Tato záloha /data byla vytvořená pomocí systému souborů {1}! Záloha nebude bootovat pokud se nezmění nazpět na {1}.</string>
+ <string name="restoring">Obnovování {1}...</string>
+ <string name="restoring_hdr">Obnovování</string>
+ <string name="recreate_folder_err">Nelze vytvořit adresář {1}.</string>
+ <string name="img_size_err">Velikost obrazu je větší než cílové zařízení</string>
+ <string name="flashing">Zapisování {1}...</string>
+ <string name="backup_folder_set">Adresář záloh nastavený na: \'{1}\'</string>
+ <string name="locate_backup_err">Zálohu \'{1}\' nelze najít</string>
+ <string name="set_restore_opt">Nastavení možností obnovy: \'{1}\':</string>
+ <string name="md5_check_skip">Vynechání kontroly MD5 zapnuté</string>
+ <string name="ors_encrypt_restore_err">Nelze použít OpenRecoveryScript na obnovu zašifrované zálohy.</string>
+ <string name="mounting">Připojení</string>
+ <string name="unmounting">Odpojení</string>
+ <string name="mounted">\'{1}\' připojený</string>
+ <string name="unmounted">\'{1}\' odpojený</string>
+ <string name="setting">Nastavení \'{1}\' na \'{2}\'</string>
+ <string name="setting_empty">Nastavení \'{1}\' na prázdné</string>
+ <string name="making_dir1">Vytváření adresáře</string>
+ <string name="making_dir2">Vytváření adresáře: \'{1}\'</string>
+ <string name="running_command">Spouštění příkazu</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Spouštění funkce ADB sideload...</string>
+ <string name="need_new_adb">pro použití sideload na toto zařízení potřebujete ADB 1.0.32 nebo novší.</string>
+ <string name="no_pwd">Heslo nebylo poskytnuté.</string>
+ <string name="done_ors">Vykonávání skriptu dokončeno</string>
+ <string name="injecttwrp">Vkládání TWRP do obrazu boot...</string>
+ <string name="zip_err">Chyba při instalaci zip souboru \'{1}\'</string>
+ <string name="installing_zip">Instalace zip souboru \'{1}\'</string>
+ <string name="select_backup_opt">Nastavení možností zálohy:</string>
+ <string name="comprossion_on">Komprese zapnutá</string>
+ <string name="md5_off">Generovaní MD5 vypnuté</string>
+ <string name="backup_fail">Zálohování selhalo</string>
+ <string name="backup_clean">Zálohování selhalo. Čistění adresáře záloh.</string>
+ <string name="running_recovery_commands">Spouštění příkazů recovery</string>
+ <string name="recovery_commands_complete">Příkazy recovery dokončeno</string>
+ <string name="running_ors">Spouštění OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript dokončený</string>
+ <string name="no_updater_binary">Nelze nájít \'{1}\' v souboru zip.</string>
+ <string name="check_for_md5">Kontrola MD5 souboru...</string>
+ <string name="fail_sysmap">Nelze namapovat soubor \'{1}\'</string>
+ <string name="verify_zip_sig">Ověřování podpisu zip souboru...</string>
+ <string name="verify_zip_fail">Ověřování podpisu zip souboru selhalo!</string>
+ <string name="verify_zip_done">Podpis souboru zip úspešně ověřený.</string>
+ <string name="zip_corrupt">Soubor zip je poškozený!</string>
+ <string name="no_md5">Vynechání kontroly MD5: soubor s MD5 nenalezen</string>
+ <string name="md5_fail">MD5 nesedí</string>
+ <string name="md5_match">MD5 sedí</string>
+ <string name="pid_signal">Proces {1} skončil se signálem: {2}</string>
+ <string name="pid_error">Proces {1} skončil s CHYBOU: {2}</string>
+ <string name="install_dumlock">Instalování HTC Dumlock do systému...</string>
+ <string name="dumlock_restore">Obnovování původního bootu...</string>
+ <string name="dumlock_reflash">Zapisování recovery do bootu...</string>
+ <string name="run_script">Běh skriptu {1}...</string>
+ <string name="rename_stock">Přejmenovaný tuctový recovery soubor v /systém pro zabránění přepsání TWRP tuctovou ROM.</string>
+ <string name="split_backup">Rozdělení zálohy do více archívů...</string>
+ <string name="backup_error">Chyba při vytváření zálohy.</string>
+ <string name="restore_error">Chyba během procesu obnovy.</string>
+ <string name="split_thread">Rozdělení ID vlákna {1} do archívu {2}</string>
+ <string name="file_progress">%llu z %llu souborů, %i%%</string>
+ <string name="size_progress">%lluMB z %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Pokus o dešifrování datového oddílu přez příkazový řádek.</string>
+ <string name="base_pkg_err">Nepodařilo se načíst základní balíčky.</string>
+ <string name="simulating">Simulování akcí...</string>
+ <string name="backup_cancel">Zálohování přerušeno</string>
+ <string name="config_twrp">Konfigurování TWRP...</string>
+ <string name="config_twrp_err">Nelze konfigurovat TWRP s tímto jádrem.</string>
+ <string name="copy_log">Recovery log zkopírovaný do {1}.</string>
+ <string name="max_queue">Dosažený maximální počet zip v seznamu!</string>
+ <string name="min_queue">Dosažený minimální počet zip v seznamu!</string>
+ <string name="screenshot_saved">Snímek obrazovky byl uložen do {1}</string>
+ <string name="screenshot_err">Nelze udělat snímek obrazovky!</string>
+ <string name="zip_wipe_cache">Jeden nebo víc zip souborů vyžádalo smazaní cache -- Vymazání cache nyní.</string>
+ <string name="and_sec_wipe_err">Nelze vymazat android secure</string>
+ <string name="dalvik_wipe_err">Nelze vymazat dalvik</string>
+ <string name="auto_gen">(Generovat automaticky)</string>
+ <string name="curr_date">(Aktuální datum)</string>
+ <string name="backup_name_len">Název zálohy je příliš dlouhý.</string>
+ <string name="backup_name_invalid">Název zálohy \'{1}\' obsahuje neplatný znak: \'{1}\'</string>
+ <string name="no_real_sdcard">Toto zařízení nemá skutečnou SD kartu! Přerušuji!</string>
+ <string name="cancel_sideload">Ruším ADB sideload...</string>
+ <string name="change_fs_err">Chyba při změně souborového systému.</string>
+ <string name="theme_ver_err">Téma vlastní verze nesedí s verzí TWRP. Použije se tuctové téma.</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/de.xml b/gui/theme/common/languages/de.xml
new file mode 100644
index 000000000..8e8bf4bf3
--- /dev/null
+++ b/gui/theme/common/languages/de.xml
@@ -0,0 +1,695 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Deutsch</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System-Image</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor-Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="data_backup">Data (ohne /data/media)</string>
+ <string name="sdcard">SD-Karte</string>
+ <string name="internal">Interner Speicher</string>
+ <string name="microsd">Micro SD-Karte</string>
+ <string name="usbotg">USB-OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Eingegliederte Daten-Partition</string>
+ <string name="adopted_storage">Eingegliederte Storage-Partition</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Akku: %tw_battery%</string>
+ <string name="sort_by_name">Nach Namen sortieren</string>
+ <string name="sort_by_date">Nach Datum sortieren</string>
+ <string name="sort_by_size">Nach Größe sortieren</string>
+ <string name="sort_by_name_only">Name</string>
+ <string name="sort_by_date_only">Datum</string>
+ <string name="sort_by_size_only">Größe</string>
+ <string name="tab_general">ALLGEMEIN</string>
+ <string name="tab_options">OPTIONEN</string>
+ <string name="tab_backup">SICHERUNG</string>
+ <string name="tab_time_zone">ZEITZONE</string>
+ <string name="tab_screen">BILDSCHIRM</string>
+ <string name="tab_vibration">VIBRATION</string>
+ <string name="tab_language">SPRACHE</string>
+
+ <string name="install_btn">Installieren</string>
+ <string name="wipe_btn">Löschen</string>
+ <string name="backup_btn">Sichern</string>
+ <string name="restore_btn">Wiederherstellen</string>
+ <string name="mount_btn">Einhängen</string>
+ <string name="settings_btn">Einstellungen</string>
+ <string name="advanced_btn">Erweitert</string>
+ <string name="reboot_btn">Neustart</string>
+ <string name="files_btn">Dateien</string>
+ <string name="copy_log_btn">Log kopieren</string>
+ <string name="select_type_hdr">Typ wählen</string>
+ <string name="install_zip_hdr">ZIP installieren</string>
+ <string name="install_zip_btn">ZIP installieren</string>
+ <string name="install_image_hdr">Image installieren</string>
+ <string name="install_image_btn">Image installieren</string>
+ <string name="install_select_file_hdr">Datei auswählen</string>
+ <string name="file_selector_folders_hdr">Ordner</string>
+ <string name="select_file_from_storage">Speicher: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Installieren</string>
+ <string name="select_storage_hdr">Speicher auswählen</string>
+ <string name="select_storage_btn">Speicher auswählen</string>
+ <string name="queue_hdr">Einreihen</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% von 10 Dateien eingereiht</string>
+ <string name="zip_queue_count_s">File %tw_zip_queue_count% von 10:</string>
+ <string name="zip_warn1">Dieser Vorgang kann möglicherweise inkompatible</string>
+ <string name="zip_warn2">Software installieren und das Gerät unbrauchbar machen.</string>
+ <string name="zip_back_cancel">Zurück-Taste drücken, um den Vorgang abzubrechen.</string>
+ <string name="zip_back_clear">Zurück-Taste drücken, um Warteschlange zu löschen.</string>
+ <string name="folder">Ordner:</string>
+ <string name="file">Datei:</string>
+ <string name="zip_sig_chk">ZIP-Signaturprüfung</string>
+ <string name="inject_twrp_chk">TWRP nach der Installation injizieren</string>
+ <string name="install_reboot_chk">Automatischer Neustart nach Installation</string>
+ <string name="options_hdr">Einstellungen</string>
+ <string name="confirm_flash_hdr">Flashvorgang bestätigen</string>
+ <string name="zip_queue">Warteschlange:</string>
+ <string name="options">Einstellungen:</string>
+ <string name="swipe_confirm">Bestätigen</string>
+ <string name="zip_add_btn">Mehr ZIPs hinzufügen</string>
+ <string name="zip_clear_btn">ZIP-Stapel löschen</string>
+ <string name="install_zip_count_hdr">Installiere ZIP %tw_zip_index% von %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Installiere ZIP: %tw_file%</string>
+ <string name="failed">Fehlgeschlagen</string>
+ <string name="successful">Erfolgreich</string>
+ <string name="install_failed">Installation fehlgeschlagen</string>
+ <string name="install_successful">Installation erfolgreich</string>
+ <string name="wipe_cache_dalvik_btn">Cache/Dalvik löschen</string>
+ <string name="reboot_system_btn">System neustarten</string>
+ <string name="install_sel_target">Ziel-Partition auswählen</string>
+ <string name="flash_image_select">Partition wählen, um das Image zu einzuspielen:</string>
+ <string name="target_partition">Ziel-Partition:</string>
+ <string name="flashing_image">Spiele Image ein...</string>
+ <string name="image_flashed">Image eingespielt</string>
+ <string name="wipe_cache_dalvik_confirm">Cache &amp; Dalvik löschen?</string>
+ <string name="wiping_cache_dalvik">Lösche Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Cache &amp; Dalvik gelöscht</string>
+ <string name="swipe_wipe">Löschen bestätigen</string>
+ <string name="swipe_wipe_s">Löschen</string>
+ <string name="no_os1">Kein OS installiert! Sind Sie</string>
+ <string name="no_osrb">sicher, dass Sie neu starten möchten?</string>
+ <string name="no_ospo">sicher, dass Sie ausschalten möchten?</string>
+ <string name="rebooting">Neustart...</string>
+ <string name="swipe_reboot">Neustart bestätigen</string>
+ <string name="swipe_reboot_s">Neustart</string>
+ <string name="reboot_install_app_hdr">TWRP App installieren?</string>
+ <string name="reboot_install_app1">Soll die offizielle TWRP App installiert werden?</string>
+ <string name="reboot_install_app2">Die App kann nach neuen TWRP-Versionen suchen.</string>
+ <string name="reboot_install_app_prompt_install">Fragen, ob TWRP App installiert werden soll</string>
+ <string name="reboot_install_app_system">Als System-App installieren</string>
+ <string name="reboot_installing_app">Installiere App...</string>
+ <string name="swipe_to_install_app">TWRP App installieren</string>
+ <string name="swipe_flash">Installation bestätigen</string>
+ <string name="confirm_action">Aktion bestätigen</string>
+ <string name="back_cancel">Zurück-Taste drücken, um den Vorgang abzubrechen.</string>
+ <string name="cancel_btn">Abbruch</string>
+ <string name="wipe_hdr">Löschen</string>
+ <string name="factory_reset_hdr">Werkseinstellungen herstellen</string>
+ <string name="factory_reset_btn">Werkseinstellungen</string>
+ <string name="factory_reset1">Löscht Daten, Cache und Dalvik</string>
+ <string name="factory_reset2">(ohne internen Speicher)</string>
+ <string name="factory_reset3">Diese Lösch-Aktion ist in der Regel</string>
+ <string name="factory_reset4">die einzige die benötigt wird.</string>
+ <string name="factory_resetting">Werkseinstellungen herstellen...</string>
+ <string name="advanced_wipe_hdr">Erweitertes Löschen</string>
+ <string name="advanced_wipe_btn">Erweitertes Löschen</string>
+ <string name="wipe_enc_confirm">Verschlüsselung der Daten-Partition enfernen?</string>
+ <string name="formatting_data">Data wird formatiert...</string>
+ <string name="swipe_format_data">Daten-Partition formatieren</string>
+ <string name="swipe_format_data_s">Formatieren </string>
+ <string name="factory_reset_complete">Werkseinstellungen wiederhergestellt</string>
+ <string name="sel_part_hdr">Partitionen auswählen</string>
+ <string name="wipe_sel_confirm">Ausgewählte Partition(en) löschen?</string>
+ <string name="wiping_part">Lösche Partition(en)...</string>
+ <string name="wipe_complete">Löschen abgeschlossen </string>
+ <string name="sel_part_wipe">Partitionen zum Löschen auswählen:</string>
+ <string name="invalid_part_sel">Ungültige Partitionsauswahl</string>
+ <string name="format_data_hdr">Daten-Partition formatieren</string>
+ <string name="format_data_btn">Daten formatieren</string>
+ <string name="format_data_ptr1">Formatieren der Daten-Partition löscht alle Apps,</string>
+ <string name="format_data_ptr2">Sicherungen, Bilder, Videos, sowie Medien und</string>
+ <string name="format_data_ptr3">entfernt die Verschlüsselung des internen Speichers.</string>
+ <string name="format_data_adopted">Betrifft auch die eingegliederte Storage-Partition.</string>
+ <string name="format_data_lcp1">Formatieren der Daten-Partition löscht alle Apps, Sicherungen, Bilder, Videos, sowie Medien und</string>
+ <string name="format_data_lcp2">entfernt die Verschlüsselung des internen Speichers.</string>
+ <string name="format_data_wtc1">Formatieren der Daten-Partition löscht alle Apps,</string>
+ <string name="format_data_wtc2">Sicherungen und Medien. Endgültig!</string>
+ <string name="format_data_undo">Dies kann nicht rückgängig gemacht werden.</string>
+ <string name="format_data_complete">Formatierung der Daten-Partition abgeschlossen</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">"yes" eingeben um fortzufahren. Zurück drücken um abzubrechen.</string>
+ <string name="part_opt_hdr">Optionen für %tw_partition_name%-Partition</string>
+ <string name="sel_act_hdr">Aktion auswählen</string>
+ <string name="file_sys_opt">Dateisystem-Optionen</string>
+ <string name="partition">Partition: %tw_partition_name%</string>
+ <string name="part_mount_point">Einhängepunkt: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Dateisystem: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Vorhanden: Ja</string>
+ <string name="part_present_no">Vorhanden: Nein</string>
+ <string name="part_removable_yes">Wechselbar: Ja</string>
+ <string name="part_removable_no">Wechselbar: Nein</string>
+ <string name="part_size">Größe: %tw_partition_size%MB</string>
+ <string name="part_used">Verwendet: %tw_partition_used%MB</string>
+ <string name="part_free">Frei: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Backup-Größe: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Größe ändern</string>
+ <string name="resize_btn_s">Größe ändern</string>
+ <string name="resize_confirm">Größe von %tw_partition_name% ändern?</string>
+ <string name="resizing">Ändere Größe...</string>
+ <string name="resize_complete">Größenänderung abgeschlossen</string>
+ <string name="swipe_resize">Größenänderung bestätigen</string>
+ <string name="swipe_resize_s">Größe ändern</string>
+ <string name="repair_btn">Dateisystem reparieren</string>
+ <string name="repair_btn_s">Reparatur</string>
+ <string name="repair_confirm">Repariere %tw_partition_name%?</string>
+ <string name="repairing">Reparieren...</string>
+ <string name="repair_complete">Reparatur abgeschlossen</string>
+ <string name="swipe_repair">Partition reparieren</string>
+ <string name="swipe_repair_s">Reparieren</string>
+ <string name="change_fs_btn">Dateisystem ändern</string>
+ <string name="change_fs_btn_s">Ändern</string>
+ <string name="change_fs_for_hdr">Dateisystem für %tw_partition_name% ändern</string>
+ <string name="change_fs_for_hdr_s">Partition: %tw_partition_name% &gt; Dateisystem auswählen</string>
+ <string name="change_fs_warn1">Einige ROMs oder Kernel unterstützen möglicherweise manche</string>
+ <string name="change_fs_warn2">Dateisysteme nicht. Überlegt handeln!</string>
+ <string name="change_fs_confirm">%tw_partition_name% ändern?</string>
+ <string name="formatting">Formatierung...</string>
+ <string name="format_complete">Formatieren abgeschlossen</string>
+ <string name="swipe_change_fs">Dateisystem ändern</string>
+ <string name="swipe_change_s">Ändern</string>
+ <string name="back_btn">Zurück</string>
+ <string name="wipe_enc_btn">Verschlüsselung entfernen</string>
+ <string name="swipe_factory_reset">Werkseinstellungen herstellen</string>
+ <string name="repair_change_btn">Dateisystem reparieren oder ändern</string>
+ <string name="storage_hdr">Speicher: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Sicherung</string>
+ <string name="backup_confirm_hdr">Sicherung bestätigen</string>
+ <string name="encryption_tab">VERSCHLÜSSELUNG</string>
+ <string name="encryption">Verschlüsselung:</string>
+ <string name="name">Name:</string>
+ <string name="sel_part_backup">Zu sichernde Partitionen auswählen:</string>
+ <string name="storage">Speicherort:</string>
+ <string name="enc_disabled">deaktiviert - Passwort festlegen um zu aktivieren</string>
+ <string name="enc_enabled">aktiviert</string>
+ <string name="enable_backup_comp_chk">Komprimierung aktivieren</string>
+ <string name="skip_md5_backup_chk">MD5-Erstellung für die Sicherung überspringen</string>
+ <string name="disable_backup_space_chk">Prüfung auf freien Speicher deaktivieren</string>
+ <string name="current_boot_slot">Aktiver Slot: %tw_active_slot%</string>
+ <string name="boot_slot_a">Slot A</string>
+ <string name="boot_slot_b">Slot B</string>
+ <string name="changing_boot_slot">Wechsle Boot Slot</string>
+ <string name="changing_boot_slot_complete">Boot Slot gewechselt</string>
+ <string name="refresh_sizes_btn">Größen aktualisieren</string>
+ <string name="swipe_backup">Sicherung erstellen</string>
+ <string name="append_date_btn">Datum anhängen</string>
+ <string name="backup_name_exists">Eine Sicherung mit diesem Namen existiert bereits!</string>
+ <string name="encrypt_backup">Sicherung verschlüsseln?</string>
+ <string name="enter_pass">Passwort eingeben:</string>
+ <string name="enter_pass2">Passwort erneut eingeben:</string>
+ <string name="pass_not_match">Die Passwörter stimmen nicht überein!</string>
+ <string name="partitions">Partitionen:</string>
+ <string name="disabled">Deaktiviert</string>
+ <string name="enabled">Aktiviert</string>
+ <string name="backup_name_hdr">Sicherung benennen</string>
+ <string name="progress">Fortschritt:</string>
+ <string name="backup_complete">Sicherung abgeschlossen</string>
+ <string name="restore_hdr">Wiederherstellen</string>
+ <string name="sel_backup_hdr">Sicherung auswählen</string>
+ <string name="restore_sel_store_hdr">Speicher: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Wiederherzustellende Sicherung:</string>
+ <string name="restore_enc_backup_hdr">Verschlüsselte Sicherung</string>
+ <string name="restore_dec_fail">Passwort falsch, bitte erneut versuchen!</string>
+ <string name="del_backup_btn">Sicherung löschen</string>
+ <string name="del_backup_confirm">Sicherung löschen?</string>
+ <string name="del_backup_confirm2">Dies kann nicht rückgängig gemacht werden!</string>
+ <string name="deleting_backup">Sicherung wird gelöscht...</string>
+ <string name="backup_deleted">Sicherung gelöscht</string>
+ <string name="swipe_delete">Löschen bestätigen</string>
+ <string name="swipe_delete_s">Löschen</string>
+ <string name="restore_try_decrypt">Verschlüsselte Sicherung - Versuche Entschlüsselung</string>
+ <string name="restore_try_decrypt_s">Versuche Entschlüsselung</string>
+ <string name="restore_backup_date">Sicherung am %tw_restore_file_date% erstellt</string>
+ <string name="restore_sel_part">Wiederherzustellende Partitionen:</string>
+ <string name="restore_enable_md5_chk">MD5-Prüfung von Sicherungs-Dateien aktivieren</string>
+ <string name="restore_complete">Wiederherstellen abgeschlossen</string>
+ <string name="swipe_restore">Sicherung wiederherstellen</string>
+ <string name="swipe_restore_s">Wiederherstellen</string>
+ <string name="rename_backup_hdr">Sicherung umbenennen</string>
+ <string name="rename_backup_confirm">Sicherung umbenennen?</string>
+ <string name="rename_backup_confirm2">Dies kann nicht rückgängig gemacht werden!</string>
+ <string name="renaming_backup">Sicherung wird umbenannt...</string>
+ <string name="rename_backup_complete">Sicherung umbenannt</string>
+ <string name="swipe_to_rename">Name ändern</string>
+ <string name="swipe_rename">Umbenennen</string>
+ <string name="confirm_hdr">Bestätigen</string>
+ <string name="mount_hdr">Einhängen</string>
+ <string name="mount_sel_part">Einzuhängende Partitionen:</string>
+ <string name="mount_sys_ro_chk">System-Partition schreibgeschützt einhängen</string>
+ <string name="mount_sys_ro_s_chk">System nur lesend</string>
+ <string name="decrypt_data_btn">Daten-Partition entschlüsseln</string>
+ <string name="disable_mtp_btn">MTP deaktivieren</string>
+ <string name="enable_mtp_btn">MTP aktivieren</string>
+ <string name="mount_usb_storage_btn">USB-Speicher einhängen</string>
+ <string name="usb_storage_hdr">USB-Speicher</string>
+ <string name="usb_stor_mnt1">USB-Speicher eingehängt</string>
+ <string name="usb_stor_mnt2">Funktion "USB-Speicher auswerfen" auf Computer</string>
+ <string name="usb_stor_mnt3">ausführen, bevor die Verbindung getrennt wird!</string>
+ <string name="unmount_btn">Auswerfen</string>
+ <string name="rb_system_btn">System</string>
+ <string name="rb_poweroff_btn">Ausschalten</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">Ausschalten...</string>
+ <string name="swipe_power_off">Gerät ausschalten</string>
+ <string name="swipe_power_off_s">Ausschalten</string>
+ <string name="sys_ro_hdr">Unveränderte Systempartition</string>
+ <string name="sys_ro_keep">System-Partition schreibgeschützt einhängen?</string>
+ <string name="sys_rop1">TWRP kann die System Partition unverändert lassen,</string>
+ <string name="sys_rop2">um das Aufspielen offizieller Updates zu erleichtern.</string>
+ <string name="sys_rop3">Jedoch kann dann das Hersteller-ROM TWRP wieder</string>
+ <string name="sys_rop4">überschreiben und TWRP kann keinen Root-Zugriff einrichten.</string>
+ <string name="sys_rop5">Das Installieren von ZIPs oder ADB-Vorgänge könnten jedoch</string>
+ <string name="sys_rop6">trotzdem die System-Partition verändern.</string>
+ <string name="sys_rol1">TWRP kann die System-Partition unverändert lassen, um das Aufspielen offizieller Updates zu erleichtern.</string>
+ <string name="sys_rol2">Jedoch kann dann das Hersteller-ROM TWRP wieder überschreiben und TWRP kann keinen Root-Zugriff einrichten.</string>
+ <string name="sys_rol3">Das Installieren von ZIPs oder ADB-Vorgänge könnten jedoch trotzdem die System-Partition verändern.</string>
+ <string name="sys_ro_never_show_chk">Diesen Bildschirm nicht mehr anzeigen</string>
+ <string name="sys_ro_keep_ro_btn">Nur-Lesend belassen</string>
+ <string name="swipe_allow_mod">Veränderungen zulassen</string>
+ <string name="swipe_allow_mod_s">Zulassen</string>
+ <string name="settings_hdr">Einstellungen</string>
+ <string name="settings_gen_hdr">Allgemein</string>
+ <string name="settings_gen_s_hdr">Allgemein</string>
+ <string name="settings_gen_btn">Allgemein</string>
+ <string name="use_rmrf_chk">rekursiv löschen anstatt formatieren</string>
+ <string name="use24clock_chk">24-Stunden-Format</string>
+ <string name="rev_navbar_chk">Navigationsleiste umkehren</string>
+ <string name="simact_chk">Benutzeraktionen für Design-Test simulieren</string>
+ <string name="simfail_chk">Fehlschlag von Benutzeraktionen simulieren</string>
+ <string name="ctr_navbar_rdo">Navigationsleisten-Schaltflächen zentrieren</string>
+ <string name="lft_navbar_rdo">Navigationsleisten-Schaltflächen linksbündig</string>
+ <string name="rht_navbar_rdo">Navigationsleisten-Schaltflächen rechtsbündig</string>
+ <string name="restore_defaults_btn">Standard herstellen</string>
+ <string name="settings_tz_btn">Zeitzone</string>
+ <string name="settings_screen_btn">Bildschirm</string>
+ <string name="settings_screen_bright_btn">Helligkeit</string>
+ <string name="settings_vibration_btn">Vibration</string>
+ <string name="settings_language_btn">Sprache</string>
+ <string name="time_zone_hdr">Zeitzone</string>
+ <string name="sel_tz_list">Zeitzone auswählen:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Midwayinseln</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time (USA)</string>
+ <string name="utcm6">(UTC -6) Central Time (USA)</string>
+ <string name="utcm5">(UTC -5) Eastern Time (USA)</string>
+ <string name="utcm4">(UTC -4) Atlantic Time (USA)</string>
+ <string name="utcm3">(UTC -3) Brasilien, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mittelatlantik</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lissabon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brüssel, Paris</string>
+ <string name="utcp2">(UTC +2) Athen, Istanbul, Südafrika</string>
+ <string name="utcp3">(UTC +3) Moskau, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tiflis, Muscat</string>
+ <string name="utcp5">(UTC +5) Ekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Peking, Singapur, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokio, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Ostaustralien, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Salomonen</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fidschi</string>
+ <string name="sel_tz_offset">Zeitverschiebung: %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Keine</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Sommerzeit verwenden</string>
+ <string name="curr_tz">Aktuelle Zeitzone: %tw_time_zone%</string>
+ <string name="curr_tz_s">Aktuelle Zeitzone:</string>
+ <string name="set_tz_btn">Zeitzone einstellen</string>
+ <string name="settings_screen_hdr">Bildschirm</string>
+ <string name="settings_screen_timeout_hdr">Bildschirm-Timeout</string>
+ <string name="enable_timeout_chk">Bildschirm automatisch ausschalten</string>
+ <string name="screen_to_slider">Zeit bis zum Ausschalten (in Sekunden):</string>
+ <string name="screen_to_slider_s">Ausschalten nach %tw_screen_timeout_secs% Sekunden (0 = deaktiviert): </string>
+ <string name="screen_to_na">Bildschirm-Abschaltung nicht verfügbar</string>
+ <string name="screen_bright_slider">Helligkeit: %tw_brightness_pct% %</string>
+ <string name="screen_bright_na">Helligkeit nicht verfügbar</string>
+ <string name="vibration_hdr">Vibration</string>
+ <string name="button_vibration_hdr">Tasten-Vibration</string>
+ <string name="kb_vibration_hdr">Tastatur-Vibration</string>
+ <string name="act_vibration_hdr">Aktion-Vibration</string>
+ <string name="button_vibration">Tasten-Vibration:</string>
+ <string name="kb_vibration">Tastatur-Vibration:</string>
+ <string name="act_vibration">Aktion-Vibration:</string>
+ <string name="select_language">Sprache auswählen:</string>
+ <string name="sel_lang_btn">Sprache auswählen</string>
+ <string name="set_language_btn">Sprache einstellen</string>
+ <string name="advanced_hdr">Erweitert</string>
+ <string name="copy_log_confirm">Log auf SD-Karte kopieren?</string>
+ <string name="copying_log">Kopiere Log auf SD-Karte...</string>
+ <string name="copy_log_complete">Log erfolgreich kopiert</string>
+ <string name="fix_context_btn">SELinux Kontexte</string>
+ <string name="part_sd_btn">SD-Karte partitionieren</string>
+ <string name="part_sd_s_btn">SD-Karte</string>
+ <string name="file_manager_btn">Dateimanager</string>
+ <string name="language_hdr">Sprache</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Theme neu laden</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">TWRP injizieren</string>
+ <string name="inject_twrp_confirm">TWRP wieder injizieren?</string>
+ <string name="injecting_twrp">TWRP wird wieder injiziert...</string>
+ <string name="inject_twrp_complete">TWRP-Injektion abgeschlossen</string>
+ <string name="swipe_to_confirm">Aktion bestätigen</string>
+ <string name="part_sd_hdr">SD-Karte partitionieren</string>
+ <string name="invalid_partsd_sel">Es muss ein Wechseldatenträger ausgewählt sein!</string>
+ <string name="part_sd_lose">Es werden alle Dateien von der SD-Karte gelöscht!</string>
+ <string name="part_sd_undo">Diese Aktion kann nicht rückgängig gemacht werden!</string>
+ <string name="part_sd_ext_sz">EXT Grösse:</string>
+ <string name="part_sd_swap_sz">Grösse der Auslagerungsdatei:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Dateisystem:</string>
+ <string name="swipe_part_sd">SD-Karte partitionieren</string>
+ <string name="swipe_part_sd_s">Partitionieren</string>
+ <string name="partitioning_sd">Partitioniere SD-Karte...</string>
+ <string name="partitioning_sd2">Dies wird einige Minuten dauern.</string>
+ <string name="part_sd_complete">Partitionierung abgeschlossen</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Orginale Boot-Partition wiederherstellen</string>
+ <string name="dumlock_restore_confirm">Orginales Image der Boot-Partition wiederherstellen?</string>
+ <string name="dumlock_restoring">Stelle originale Boot-Partition wieder her...</string>
+ <string name="dumlock_restore_complete">Wiederherstellen der orginalen Boot-Partition abgeschlossen</string>
+ <string name="dumlock_reflash_btn">Recovery erneut einspielen</string>
+ <string name="dumlock_reflash_confirm">Recovery in Boot-Partition einspielen?</string>
+ <string name="dumlock_reflashing">Spiele Recovery in Boot-Partition ein...</string>
+ <string name="dumlock_reflash_complete">Einspielen der Recovery in die Boot-Partition abgeschlossen</string>
+ <string name="dumlock_install_btn">HTC Dumlock installieren</string>
+ <string name="dumlock_install_confirm">HTC Dumlock Dateien ins ROM installieren?</string>
+ <string name="dumlock_installing">Installiere HTC Dumlock...</string>
+ <string name="dumlock_install_complete">HTC Dumlock Installation abgeschlossen</string>
+ <string name="swipe_to_unlock">Bildschirm entsperren</string>
+ <string name="swipe_unlock">Entsperren</string>
+ <string name="fm_hdr">Dateimanager</string>
+ <string name="fm_sel_file">Datei oder Ordner auswählen</string>
+ <string name="fm_type_folder">Ordner</string>
+ <string name="fm_type_file">Datei</string>
+ <string name="fm_choose_act">Aktion auswählen</string>
+ <string name="fm_selected">%tw_fm_type%:</string>
+ <string name="fm_copy_btn">Kopieren</string>
+ <string name="fm_copy_file_btn">Datei kopieren</string>
+ <string name="fm_copy_folder_btn">Ordner kopieren</string>
+ <string name="fm_copying">Kopiere</string>
+ <string name="fm_move_btn">Verschieben</string>
+ <string name="fm_moving">Verschiebe</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Löschen</string>
+ <string name="fm_deleting">Wird gelöscht</string>
+ <string name="fm_rename_btn">Umbenennen</string>
+ <string name="fm_rename_file_btn">Datei umbennen</string>
+ <string name="fm_rename_folder_btn">Ordner umbenennen</string>
+ <string name="fm_renaming">Umbenennen</string>
+ <string name="fm_sel_dest">Zielordner auswählen</string>
+ <string name="fm_sel_curr_folder">Aktuellen Ordner auswählen</string>
+ <string name="fm_rename_hdr">Umbenennen</string>
+ <string name="fm_set_perms_hdr">Berechtigungen setzen</string>
+ <string name="fm_perms">Berechtigungen:</string>
+ <string name="fm_complete">Dateivorgang beendet</string>
+ <string name="decrypt_data_hdr">Daten-Partition entschlüsseln</string>
+ <string name="decrypt_data_enter_pass">Passwort eingeben:</string>
+ <string name="decrypt_data_failed">Passwort falsch, bitte erneut versuchen!</string>
+ <string name="decrypt_data_failed_pattern">Muster falsch, bitte erneut versuchen!</string>
+ <string name="decrypt_data_enter_pattern">Muster eingeben.</string>
+ <string name="decrypt_data_trying">Versuche Entschlüsselung</string>
+ <string name="term_hdr">Terminal</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">BEENDEN</string>
+ <string name="term_sel_folder_hdr">Zum Stamm-Ordner navigieren</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Dalvik Cache löschen</string>
+ <string name="sideload_wipe_cache_chk">Cache löschen</string>
+ <string name="swipe_to_sideload">ADB Sideload starten</string>
+ <string name="swipe_sideload">Start</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Syntax: adb sideload Dateiname.zip</string>
+ <string name="sideload_complete">ADB Sideload abgeschlossen</string>
+ <string name="fix_contexts_hdr">SELinux Kontexte</string>
+ <string name="fix_contexts_note1">Das Korrigieren der Kontexte wird selten benötigt!</string>
+ <string name="fix_contexts_note2">Das Korrigieren der SELinux-Kontexte kann</string>
+ <string name="fix_contexts_note3">Startprobleme verursachen.</string>
+ <string name="swipe_to_fix_contexts">SELinux-Kontexte korrigieren</string>
+ <string name="swipe_fix_contexts">Korrigieren</string>
+ <string name="fixing_contexts">Korrigiere Kontexte...</string>
+ <string name="fix_contexts_complete">Korrektur der Kontexte abgeschlossen</string>
+ <string name="reboot_hdr">Neustart</string>
+ <string name="su_hdr">SuperSU-Check</string>
+ <string name="su_note1">Anscheinend besteht kein Root-Zugriff auf das Gerät.</string>
+ <string name="su_note2">SuperSU jetzt installieren?</string>
+ <string name="su_note3">Dies wird Root-Zugriff auf dem Gerät einrichten.</string>
+ <string name="su_cancel">Nicht installieren</string>
+ <string name="swipe_su_to_install">Installation starten</string>
+ <string name="swipe_su_install">Installieren</string>
+ <string name="su_installing">Installiere SuperSU</string>
+ <string name="sel_storage_list">Speicher auswählen</string>
+ <string name="ok_btn">OK</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Dieser Kernel hat keine Leseunterstützung für SELinux-Kontexte.</string>
+ <string name="full_selinux">Volle SELinux-Unterstützung ist vorhanden.</string>
+ <string name="no_selinux">Keine SELinux-Unterstützung vorhanden (kein libselinux).</string>
+ <string name="mtp_enabled">MTP aktiviert</string>
+ <string name="mtp_crash">MTP abgestürzt, MTP wird künftig während Bootvorgang nicht gestartet.</string>
+ <string name="decrypt_success">Erfolgreich mit dem Standardpasswort entschlüsselt.</string>
+ <string name="unable_to_decrypt">Entschlüsselung mit Standardpasswort nicht möglich. Eventuell muss die Daten-Partition formatiert werden.</string>
+ <string name="generating_md51">Generiere MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * generiere MD5...</string>
+ <string name="md5_created"> * MD5 erstellt.</string>
+ <string name="md5_error"> * MD5-Fehler!</string>
+ <string name="md5_compute_error"> * Fehler bei MD5-Berechnung.</string>
+ <string name="current_date">(Aktuelles Datum)</string>
+ <string name="auto_generate">(Automatisch generiert)</string>
+ <string name="unable_to_locate_partition">Kann '{1}' Partition für Sicherungsberechnungen nicht finden.</string>
+ <string name="no_partition_selected">Keine Partitionen für die Sicherung ausgewählt.</string>
+ <string name="total_partitions_backup"> * Anzahl der zu sichernden Partitionen: {1}</string>
+ <string name="total_backup_size"> * Gesamtgröße aller Daten: {1}MB</string>
+ <string name="available_space"> * Verfügbare Speicherplatz: {1}MB</string>
+ <string name="unable_locate_storage">Kann Sicherungsgerät nicht finden.</string>
+ <string name="no_space">Zu wenig freier Speicherplatz.</string>
+ <string name="backup_started">[SICHERUNG GESTARTET]</string>
+ <string name="backup_folder"> * Ordner für Sicherung: {1}</string>
+ <string name="fail_backup_folder">Ordner für Sicherung konnte nicht erstellt werden.</string>
+ <string name="avg_backup_fs">Durchschnittliche Sicherungsgeschwindigkeit für Dateisysteme: {1} MB/sek</string>
+ <string name="avg_backup_img">Durchschnittliche Sicherungsgeschwindigkeit für abgebildete Laufwerke: {1} MB/sek</string>
+ <string name="total_backed_size">[INSGESAMT {1} MB GESICHERT]</string>
+ <string name="backup_completed">[SICHERUNG ABGESCHLOSSEN IN {1} SEKUNDEN]</string>
+ <string name="restore_started">[WIEDERHERSTELLEN GESTARTET]</string>
+ <string name="restore_folder">Wiederherstellen aus Ordner: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} fertiggestellt ({2} Sekunden)]</string>
+ <string name="verifying_md5">Überprüfe MD5</string>
+ <string name="skip_md5">Überspringe MD5-Prüfung aufgrund Benutzereinstellungen.</string>
+ <string name="calc_restore">Berechne Wiederherstellungsinformationen...</string>
+ <string name="restore_read_only">Kann {1} nicht wiederherstellen -- Partition schreibgeschützt.</string>
+ <string name="restore_unable_locate">Kann wiederherzustellende '{1}'-Partition nicht finden.</string>
+ <string name="no_part_restore">Keine Partitionen zur Wiederherstellung ausgewählt.</string>
+ <string name="restore_part_count">{1} Partitionen wiederherstellen...</string>
+ <string name="total_restore_size">Insgesamt wiederherzustellen: {1}MB</string>
+ <string name="updating_system_details">Aktualisieren der System-Details</string>
+ <string name="restore_completed">[WIEDERHERSTELLEN ABGESCHLOSSEN IN {1} SEKUNDEN]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Fehler beim Öffnen: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Partition nicht anhand des Sicherungsnamens ermittelbar: '{1}'</string>
+ <string name="unable_find_part_path">Partition für Pfad '{1}' nicht gefunden</string>
+ <string name="update_part_details">Partitions-Informationen werden aktualisiert...</string>
+ <string name="update_part_details_done">...Fertig</string>
+ <string name="wiping_dalvik">Dalvik Cache-Verzeichnisse bereinigen...</string>
+ <string name="cleaned">Bereinigt: {1}...</string>
+ <string name="dalvik_done">-- Dalvik Cache-Verzeichnisse bereinigt!</string>
+ <string name="no_andsec">Keine "Android Secure"-Partitionen gefunden.</string>
+ <string name="unable_to_locate">{1} nicht gefunden.</string>
+ <string name="wiping_datamedia">Lösche internen Speicher -- /data/media...</string>
+ <string name="unable_to_mount">Kann {1} nicht einhängen</string>
+ <string name="unable_to_mount_internal">Kann internen Speicher nicht einhängen</string>
+ <string name="unable_to_mount_storage">Kann Speicher nicht einhängen</string>
+ <string name="fail_decrypt">Entschlüsselung der Daten-Partition fehlgeschlagen.</string>
+ <string name="no_crypto_support">In diese Version wurde keine Krypto-Unterstützung eingebunden.</string>
+ <string name="decrypt_success_dev">Erfolgreich entschlüsselt, neues Blockgerät: '{1}'</string>
+ <string name="decrypt_success_nodev">Erfolgreich entschlüsseltd</string>
+ <string name="done">Abgeschlossen.</string>
+ <string name="start_partition_sd">Partitioniere SD Karte...</string>
+ <string name="partition_sd_locate">Zu partitionierendes Gerät nicht gefunden.</string>
+ <string name="ext_swap_size">EXT + Auslagerung ist grösser als die SD-Karte.</string>
+ <string name="remove_part_table">Entferne Partitionstabelle...</string>
+ <string name="unable_rm_part">Partitionstabelle kann nicht entfernt werden.</string>
+ <string name="create_part">Erstelle {1}-Partition...</string>
+ <string name="unable_to_create_part">{1}-Partition kann nicht erstellt werden.</string>
+ <string name="format_sdext_as">Formatiere sd-ext als {1}...</string>
+ <string name="part_complete">Partitionierung abgeschlossen.</string>
+ <string name="unable_to_open">'{1}' kann nicht geöffnet werden.</string>
+ <string name="mtp_already_enabled">MTP bereits aktiviert</string>
+ <string name="mtp_fail">Fehler beim Aktivieren von MTP</string>
+ <string name="no_mtp">MTP-Unterstützung nicht integriert</string>
+ <string name="image_flash_start">[IMAGE-DATEI WIRD AUFGESPIELT]</string>
+ <string name="img_to_flash">Aufzuspielendes Image: '{1}'</string>
+ <string name="flash_unable_locate">'{1}'-Partition wurde nicht gefunden.</string>
+ <string name="no_part_flash">Keine Partitionen ausgewählt.</string>
+ <string name="too_many_flash">Zu viele Partitionen ausgewählt.</string>
+ <string name="invalid_flash">Ungültige Partitions-Auswahl.</string>
+ <string name="flash_done">[IMAGE EINSPIELEN ABGESCHLOSSEN]</string>
+ <string name="wiping">Lösche {1}</string>
+ <string name="repair_not_exist">{1} existiert nicht! Reparieren nicht möglich!</string>
+ <string name="repairing_using">Reparatur von {1} mit {2}...</string>
+ <string name="unable_repair">{1} kann nicht repariert werden.</string>
+ <string name="mount_data_footer">/data konnte nicht eingehängt werden und Krypto-Signatur wurde nicht gefunden.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Ordner '{1}' konnte nicht angelegt werden ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">'{1}' konnte nicht eingehängt werden ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">'{1}' konnte nicht eingehängt werden ({2})</string>
+ <string name="cannot_resize">Größe von {1} kann nicht geändert werden.</string>
+ <string name="repair_resize">{1} wird repariert. Danach wird die Größe geändert.</string>
+ <string name="unable_resize">Größe von {1} kann nicht geändert werden.</string>
+ <string name="no_md5_found">Keine MD5-Datei für '{1}' gefunden. Bitte MD5-Prüfung für Wiederherstellung deaktivieren.</string>
+ <string name="md5_fail_match">MD5-Prüfung für '{1}' fehlgeschlagen.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">TAR-Datei '{1}' konnte nicht entschlüsselt werden.</string>
+ <string name="format_data_msg">Ein Neustart von TWRP kann notwendig sein, damit /data wieder verwendet werden kann.</string>
+ <string name="format_data_err">Formatierung zum Entfernen der Verschlüsselung kann nicht durchgeführt werden.</string>
+ <string name="formatting_using">Formatiere {1} mit {2}...</string>
+ <string name="unable_to_wipe">{1} kann nicht gelöscht werden.</string>
+ <string name="cannot_wipe">Partition {1} kann nicht gelöscht werden.</string>
+ <string name="remove_all">Entferne alle Dateien unter '{1}'</string>
+ <string name="wiping_data">Lösche Daten, aber verschone internen Speicher...</string>
+ <string name="backing_up">Sichere {1}...</string>
+ <string name="backup_storage_warning">Backups of {1} do not include any files in internal storage such as pictures or downloads.</string>
+ <string name="backing">Sichere</string>
+ <string name="backup_size">Sicherung von '{1}' hat 0 Byte.</string>
+ <string name="datamedia_fs_restore">WARNUNG: Diese Sicherung wurde mit dem Dateisystem {1} erstellt! Es kann sein, dass wieder zu {1} gewechselt werden muss, damit das Gerät nach der Wiederherstellung auch startet.</string>
+ <string name="restoring">Wiederherstellung läuft</string>
+ <string name="restoring_hdr">Wiederherstellung läuft</string>
+ <string name="recreate_folder_err">Ordner {1} kann nicht wiederhergestellt werden.</string>
+ <string name="img_size_err">Image ist zu groß für das Gerät</string>
+ <string name="flashing">Einspielen von {1}...</string>
+ <string name="backup_folder_set"> * Ordner für Sicherung: {1}</string>
+ <string name="locate_backup_err">Sicherung '{1}' nicht gefunden</string>
+ <string name="set_restore_opt">Setze Wiederherstellungs-Optionen: '{1}':</string>
+ <string name="md5_check_skip">MD5-Prüfung ist deaktiviert</string>
+ <string name="ors_encrypt_restore_err">Eine verschlüsselte Sicherung kann nicht per OpenRecoveryScript wiederhergestellt werden.</string>
+ <string name="mounting">Einhängen</string>
+ <string name="unmounting">Auswerfen</string>
+ <string name="mounted">'{1}' eingehängt</string>
+ <string name="unmounted">'{1}' ausgeworfen</string>
+ <string name="setting">Setze '{1}' auf '{2}'</string>
+ <string name="setting_empty">Setze '{1}' auf leer</string>
+ <string name="making_dir1">Erstelle Verzeichnis</string>
+ <string name="making_dir2">Erstelle Verzeichnis: '{1}'</string>
+ <string name="running_command">Führe Befehl aus</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Starte ADB Sideload...</string>
+ <string name="need_new_adb">Für dieses Gerät wird ADB 1.0.32 oder neuer benötigt.</string>
+ <string name="no_pwd">Kein Passwort angegeben.</string>
+ <string name="done_ors">Skript wurde verarbeitet</string>
+ <string name="injecttwrp">Injiziere TWRP in das Boot-Image...</string>
+ <string name="zip_err">Fehler beim Installieren von ZIP '{1}'</string>
+ <string name="installing_zip">Installiere Zip '{1}'</string>
+ <string name="select_backup_opt">Setze Sicherungs-Optionen:</string>
+ <string name="compression_on">Komprimierung ist aktiviert</string>
+ <string name="md5_off">MD5-Generierung ist deaktiviert</string>
+ <string name="backup_fail">Sicherung fehlgeschlagen</string>
+ <string name="backup_clean">Sicherung fehlgeschlagen, bereinige Sicherungs-Verzeichnis</string>
+ <string name="running_recovery_commands">Führe Recovery-Befehle aus</string>
+ <string name="recovery_commands_complete">Recovery-Befehle ausgeführt</string>
+ <string name="running_ors">Führe OpenRecoveryScript aus</string>
+ <string name="ors_complete">OpenRecoveryScript ausgeführt</string>
+ <string name="invalid_zip_format">Invalid zip file format!</string>
+ <string name="check_for_md5">Suche nach MD5-Datei...</string>
+ <string name="fail_sysmap">'{1}' kann nicht zugeordnet werden</string>
+ <string name="verify_zip_sig">Überprüfe ZIP-Signatur...</string>
+ <string name="verify_zip_fail">Prüfung der ZIP-Signatur fehlgeschlagen!</string>
+ <string name="verify_zip_done">Prüfung der ZIP-Signatur erfolgreich.</string>
+ <string name="zip_corrupt">ZIP-Datei ist beschädigt!</string>
+ <string name="no_md5">MD5-Prüfung übersprungen: keine MD5-Datei gefunden</string>
+ <string name="md5_fail">MD5 stimmt nicht überein</string>
+ <string name="md5_match">MD5 stimmt überein</string>
+ <string name="pid_signal">Prozess {1} endete mit Meldung: {2}</string>
+ <string name="pid_error">Prozess {1} endete mit FEHLER: {2}</string>
+ <string name="install_dumlock">Installiere HTC Dumlock in System-Partition...</string>
+ <string name="dumlock_restore">Stelle originale Boot-Partition wieder her...</string>
+ <string name="dumlock_reflash">Recovery auf Boot-Partition einspielen...</string>
+ <string name="run_script">Führe {1}-Skript aus...</string>
+ <string name="rename_stock">Hersteller-Recovery in "/system" wurde umbenannt, damit das Hersteller-ROM TWRP nicht überschreibt.</string>
+ <string name="split_backup">Sicherungs-Datei wird in mehrere Archive aufgeteilt...</string>
+ <string name="backup_error">Fehler beim Erstellen der Sicherung.</string>
+ <string name="restore_error">Fehler während der Wiederherstellung.</string>
+ <string name="split_thread">Teile Thread-ID {1} in Archiv {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu von %llu Dateien, %i%%</string>
+ <string name="size_progress">%lluMB von %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Versuche die Daten-Partition per Kommandozeile zu entschlüsseln.</string>
+ <string name="base_pkg_err">Basis-Pakete konnten nicht geladen werden.</string>
+ <string name="simulating">Simuliere Aktionen...</string>
+ <string name="backup_cancel">Sicherung abgebrochen</string>
+ <string name="config_twrp">Konfiguriere TWRP...</string>
+ <string name="config_twrp_err">Konfigurieren von TWRP mit diesem Kernel nicht möglich.</string>
+ <string name="copy_log">Recovery-Log wurde nach {1} kopiert.</string>
+ <string name="max_queue">Maximale Anzahl an ZIP-Dateien erreicht!</string>
+ <string name="min_queue">Minimale Anzahl an ZIP-Dateien erreicht!</string>
+ <string name="screenshot_saved">Bildschirmfoto gespeichert unter {1}</string>
+ <string name="screenshot_err">Bildschirmfoto konnte nicht erstellt werden!</string>
+ <string name="zip_wipe_cache">Eine oder mehrere ZIP-Dateien wollen den Cache löschen -- Lösche Cache jetzt.</string>
+ <string name="and_sec_wipe_err">Android Secure kann nicht gelöscht werden</string>
+ <string name="dalvik_wipe_err">Löschen von Dalvik fehlgeschlagen</string>
+ <string name="auto_gen">(automatisch erstellt)</string>
+ <string name="curr_date">(aktuelles Datum)</string>
+ <string name="backup_name_len">Der Name der Sicherung ist zu lang.</string>
+ <string name="backup_name_invalid">Sicherungs-Name '{1}' enthält ungültige Zeichen: '{1}'</string>
+ <string name="no_real_sdcard">Dieses Gerät verwendet keine SD-Karte! Abbruch!</string>
+ <string name="cancel_sideload">ADB Sideload wird abgebrochen...</string>
+ <string name="change_fs_err">Fehler beim Ändern des Dateisystems.</string>
+ <string name="theme_ver_err">Theme-Version inkompatibel zu TWRP-Version. Standard-Theme wird verwendet.</string>
+ <string name="up_a_level">(Übergeordneter Ordner)</string>
+ <string name="install_reboot"version="2">Neustart in %tw_sleep% Sekunden</string>
+ <string name="adbbackup_error">Fehler während ADB Backup. Abbruch..."</string>
+ <string name="adbbackup_control_error">Kein Zugriff auf ADB Control Channel</string>
+ <string name="twrp_adbbu_option">--twrp option wird für ADB Backup benötigt</string>
+ <string name="partition_not_found">Pfad: {1} wurde nicht in Partitionsliste gefunden</string>
+ <string name="copy_kernel_log">Kernel-Log wurde nach {1} kopiert</string>
+ <string name="include_kernel_log">Zusätzlich Kernel-Log kopieren</string>
+ <string name="unable_set_boot_slot">Fehler während Wechsel zu Slot {1}</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/el.xml b/gui/theme/common/languages/el.xml
new file mode 100644
index 000000000..7ec4d15a7
--- /dev/null
+++ b/gui/theme/common/languages/el.xml
@@ -0,0 +1,652 @@
+<?xml version="1.0"?>
+<language>
+ <display>Ελληνικά</display>
+ <resources>
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+ <string name="system">Σύστημα</string>
+ <string name="system_image">Εικόνα Συστήματος</string>
+ <string name="vendor">Προμηθευτής</string>
+ <string name="vendor_image">Εικόνα Προμηθευτή</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Μνήμη cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">Κάρτα SD</string>
+ <string name="internal">Εσωτερικός χώρος αποθήκευσης</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Εγκεκριμένα δεδομένα</string>
+ <string name="adopted_storage">Εγκεκριμένος Αποθ. Χώρος</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Μπαταρία: %tw_battery%</string>
+ <string name="sort_by_name">Ταξινόμηση κατά όνομα</string>
+ <string name="sort_by_date">Ταξινόμηση κατά ημερομηνία</string>
+ <string name="sort_by_size">Ταξινόμηση κατά μέγεθος</string>
+ <string name="sort_by_name_only">Όνομα</string>
+ <string name="sort_by_date_only">Ημ/νία</string>
+ <string name="sort_by_size_only">Μέγεθος</string>
+ <string name="tab_general">ΓΕΝΙΚΑ</string>
+ <string name="tab_options">ΡΥΘΜΙΣΕΙΣ</string>
+ <string name="tab_backup">ΑΝΤΙΓΡ. ΑΣΦΑΛ.</string>
+ <string name="tab_time_zone">ΖΩΝΗ ΩΡΑΣ</string>
+ <string name="tab_screen">ΟΘΟΝΗ</string>
+ <string name="tab_vibration">ΔΟΝΗΣΗ</string>
+ <string name="tab_language">ΓΛΩΣΣΑ</string>
+ <string name="install_btn">Εγκατάσταση</string>
+ <string name="wipe_btn">Εκαθάριση</string>
+ <string name="backup_btn">Αντίγρ. ασφαλ.</string>
+ <string name="restore_btn">Επαναφορά</string>
+ <string name="mount_btn">Προσάρτηση</string>
+ <string name="settings_btn">Ρυθμίσεις</string>
+ <string name="advanced_btn">Προηγμένες</string>
+ <string name="reboot_btn">Επανεκκίνηση</string>
+ <string name="files_btn">Αρχεία</string>
+ <string name="copy_log_btn">Αντιγρ. αρχείου καταγραφής</string>
+ <string name="select_type_hdr">Επιλέξτε τύπο</string>
+ <string name="install_zip_hdr">Εγατάσταση Zip</string>
+ <string name="install_zip_btn">Εγατάσταση Zip</string>
+ <string name="install_image_hdr">Εγκατάσταση εικόνας</string>
+ <string name="install_image_btn">Εγκατάσταση εικόνας</string>
+ <string name="install_select_file_hdr">Επιλέξτε Αρχείο</string>
+ <string name="file_selector_folders_hdr">Φάκελοι</string>
+ <string name="select_file_from_storage">Επιλέξτε αρχείο από %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Εγκατάσταση</string>
+ <string name="select_storage_hdr">Επιλέξτε Αποθ. χώρο</string>
+ <string name="select_storage_btn">Επιλέξτε Αποθ. χώρο</string>
+ <string name="queue_hdr">Ουρά</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% το μέγιστο 10 αρχεία στην ουρά</string>
+ <string name="zip_queue_count_s">Αρχεία %tw_zip_queue_count% από 10:</string>
+ <string name="zip_warn1">Αυτή η λειτουργία μπορεί να εγκαταστήσει μη συμβατό</string>
+ <string name="zip_warn2">λογισμικό και να αχρηστεύσει τη συσκευή σας.</string>
+ <string name="zip_back_cancel">Πιέστε το πλήκτρο πίσω για να ακυρώσετε την προσθήκη του zip.</string>
+ <string name="zip_back_clear">Πατήστε το κουμπί πίσω για να καθαρήσετε την ουρά.</string>
+ <string name="folder">Φάκελος:</string>
+ <string name="file">Αρχείο:</string>
+ <string name="zip_sig_chk">Επαλήθευση της υπογραφής Zip</string>
+ <string name="inject_twrp_chk">Εισάγωγή TWRP μετά την εγκατάσταση</string>
+ <string name="install_reboot_chk">Εππανεκίνηση μετά την εγκατάσταση</string>
+ <string name="options_hdr">Ρυθμίσεις</string>
+ <string name="confirm_flash_hdr">Επιβεβαίωση Flash</string>
+ <string name="zip_queue">Ουρά:</string>
+ <string name="options">Ρυθμίσεις:</string>
+ <string name="swipe_confirm"> Επιβεβαιώστε</string>
+ <string name="zip_add_btn">Προσθ. περισσότερα zip</string>
+ <string name="zip_clear_btn">Εκκαθάριση ουράς Zip</string>
+ <string name="install_zip_count_hdr">Εγκαταστήστε Zip %tw_zip_index% από %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Εγκατάσταση Zip: %tw_file%</string>
+ <string name="failed">Απέτυχε</string>
+ <string name="successful">Επιτυχής</string>
+ <string name="install_failed">Η εγκατάσταση απέτυχε</string>
+ <string name="install_successful">Επιτυχής εγκατάσταση</string>
+ <string name="wipe_cache_dalvik_btn">Εκκαθάριση cache/dalvik</string>
+ <string name="reboot_system_btn">Επανεκ. συστήματος</string>
+ <string name="install_sel_target">Επιλέξτε Διαμέρισμα</string>
+ <string name="flash_image_select">Επιλέξτε Διαμέρισμα για Flash εικόνας:</string>
+ <string name="target_partition">Διαμέρισμα:</string>
+ <string name="flashing_image">Εγγραφή εικόνας...</string>
+ <string name="image_flashed">Η εικόνα εγγράφηκε</string>
+ <string name="wipe_cache_dalvik_confirm">Εκκαθάριση Cache &amp; Dalvik;</string>
+ <string name="wiping_cache_dalvik">Εκκαθάριση Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Η Εκκαθάριση Cache &amp; Dalvik ολοκληρώθηκε</string>
+ <string name="swipe_wipe">Σύρετε για εκαθάριση</string>
+ <string name="swipe_wipe_s"> Εκαθάριση</string>
+ <string name="no_os1">Κανένα λειτουργικό σύστημα εγκατεστημένο! Είστε</string>
+ <string name="no_osrb">σίγουροι ότι θέλετε να κάνετε επανεκκίνηση;</string>
+ <string name="no_ospo">σίγουροι ότι θέλετε να κάνετε απενεργοποίηση;</string>
+ <string name="rebooting">Επανεκκίνηση...</string>
+ <string name="swipe_reboot">Σύρετε για Επανεκκίνηση</string>
+ <string name="swipe_reboot_s"> Επανεκκίνηση</string>
+ <string name="swipe_flash">Σύρετε για Εγατάσταση</string>
+ <string name="confirm_action">Επιβεβαίωση ενέργειας</string>
+ <string name="back_cancel">Πατήστε το κουμπί πίσω για να ακυρώσετε.</string>
+ <string name="cancel_btn">Άκυρο</string>
+ <string name="wipe_hdr">Εκαθάριση</string>
+ <string name="factory_reset_hdr">Επαναφορά εργοστασιακών ρυθμίσεων</string>
+ <string name="factory_reset_btn">Επαναφορά εργοστασιακών ρυθμίσεων</string>
+ <string name="factory_reset1">Εκαθάριση Data, Cache και Dalvik</string>
+ <string name="factory_reset2">(εξαιρέσει εσωτερική αποθήκευσης)</string>
+ <string name="factory_reset3">Στις περισσότερες περιπτώσεις αυτή είναι</string>
+ <string name="factory_reset4">η μόνη εκκαθάριση που χρειάζεστε.</string>
+ <string name="factory_resetting">Επαναφορά εργοστασιακών ρυθμίσεων...</string>
+ <string name="advanced_wipe_hdr">Σύνθετη Εκκαθάριση</string>
+ <string name="advanced_wipe_btn">Σύνθετη Εκκαθάριση</string>
+ <string name="wipe_enc_confirm">Εκκαθάριση κρυπτογράφηση από τα Δεδομένα;</string>
+ <string name="formatting_data">Διαμόρφωση Δεδομένων...</string>
+ <string name="swipe_format_data">Σύρετε για Διαμόρφ. Δεδομ.</string>
+ <string name="swipe_format_data_s"> Διαμόρφ Δεδομ.</string>
+ <string name="factory_reset_complete">Επαναφορά εργοστασιακών ρυθμίσεων ολοκληρώθηκε</string>
+ <string name="sel_part_hdr">Επιλέξτε Τομέα(είς)</string>
+ <string name="wipe_sel_confirm">Εκκαθάριση επιλεγμένου(ων) τομέα(ων);</string>
+ <string name="wiping_part">Εκκαθάριση Τομέα(ων)...</string>
+ <string name="wipe_complete">Η εκκαθάριση ολοκληρώθηκε</string>
+ <string name="sel_part_wipe">Επιλέξτε Τομείς για Εκκαθάριση:</string>
+ <string name="invalid_part_sel">Μη έγκυρη επιλογή Τομέα</string>
+ <string name="format_data_hdr">Διαμόρφωση Δεδομένων</string>
+ <string name="format_data_btn">Διαμόρφωση Δεδομένων</string>
+ <string name="format_data_ptr1">Η Διαμόρφωση Δεδομένων θα διαγράψει όλες τις εφαρμογές,</string>
+ <string name="format_data_ptr2">αντίγραφα ασφαλείας, φωτογραφίες, βίντεο, πολυμέσα και</string>
+ <string name="format_data_ptr3">αφαιρεί την κρυπτογράφηση στον εσωτερικό χώρο αποθήκευσης.</string>
+ <string name="format_data_adopted">Including Adopted Storage</string>
+ <string name="format_data_lcp1">Η Διαμόρφωση Δεδομένων θα διαγράψει όλες τις εφαρμογές, αντίγραφα ασφαλείας, φωτογραφίες, βίντεο, πολυμέσα και</string>
+ <string name="format_data_lcp2">αφαιρεί την κρυπτογράφηση στον εσωτερικό χώρο αποθήκευσης.</string>
+ <string name="format_data_wtc1">Η Διαμόρφωση Δεδομένων θα διαγράψει όλες τις εφαρμογές,</string>
+ <string name="format_data_wtc2">αντίγραφα ασφαλείας και πολυμέσα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.</string>
+ <string name="format_data_undo">Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.</string>
+ <string name="format_data_complete">Η Διαμόρφωση Δεδομένων ολοκληρώθηκε</string>
+ <string name="yes_continue">Πληκτρολογήστε Yes για να συνεχίσετε. Πιέστε το πλήκτρο πίσω για να ακυρώσετε.</string>
+ <string name="part_opt_hdr">Ρυθμίσεις Τομέα: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Επιλέξτε ενέργεια</string>
+ <string name="file_sys_opt">Επιλογές των αρχείων συστήματος</string>
+ <string name="partition">Τομέας: %tw_partition_name%</string>
+ <string name="part_mount_point">Σημείο προσάρτησης: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Αρχεία Σύστηματος: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Παρόν: Ναι</string>
+ <string name="part_present_no">Παρόν: Όχι</string>
+ <string name="part_removable_yes">Αφαιρούμενο: Ναι</string>
+ <string name="part_removable_no">Αφαιρούμενο: Όχι</string>
+ <string name="part_size">Μέγεθος: %tw_partition_size%MB</string>
+ <string name="part_used">Χρησιμοποιούνται: %tw_partition_used%MB</string>
+ <string name="part_free">Ελεύθερα: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Μέγεθος του αντιγράφου ασφαλείας: %tw_partition_backup_size% MB</string>
+ <string name="resize_btn">Αλλάξετε το μέγεθος του Αρχείων Συστήματος</string>
+ <string name="resize_btn_s">Αλλαγή μεγέθους</string>
+ <string name="resize_confirm">Αλλαγή μεγέθους %tw_partition_name%;</string>
+ <string name="resizing">Αλλαγή μεγέθους...</string>
+ <string name="resize_complete">Η αλλαγή μεγέθους ολοκληρώθηκε</string>
+ <string name="swipe_resize">Σύρετε για αλλαγή μεγέθους</string>
+ <string name="swipe_resize_s"> Αλλαγή μεγέθους</string>
+ <string name="repair_btn">Επιδιόρθ. Αρχ. Συστήματος</string>
+ <string name="repair_btn_s">Επιδιόρθωση</string>
+ <string name="repair_confirm">Επιδιόρθωση %tw_partition_name%;</string>
+ <string name="repairing">Επιδιόρθωση...</string>
+ <string name="repair_complete">Η επιδιόρθωση ολοκληρώθηκε</string>
+ <string name="swipe_repair">Σύρετε για Επιδιόρθωση</string>
+ <string name="swipe_repair_s"> Επιδιόρθωση</string>
+ <string name="change_fs_btn">Αλλαγή Αρχ. Συστήματος</string>
+ <string name="change_fs_btn_s">Αλλαγή</string>
+ <string name="change_fs_for_hdr">Αλλαγή Αρχείου Συστήματος για: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Τομέας: %tw_partition_name% &gt; επιλέξετε Αρχεία Συστήματος</string>
+ <string name="change_fs_warn1">Κάποια ROM ή kernels μπορεί να μην υποστηρίζουν κάποια</string>
+ <string name="change_fs_warn2">αρχεία συστήματος. Συνεχίστε με προσοχή!</string>
+ <string name="change_fs_confirm">Αλλαγή %tw_partition_name%;</string>
+ <string name="formatting">Διαμόρφωση...</string>
+ <string name="format_complete">Η Διαμόρφωση ολοκληρώθηκε</string>
+ <string name="swipe_change_fs">Σύρετε για Αλλαγή</string>
+ <string name="swipe_change_s"> Αλλαγή</string>
+ <string name="back_btn">Πίσω</string>
+ <string name="wipe_enc_btn">Εκκαθάριση Κρυπτογράφησης</string>
+ <string name="swipe_factory_reset">Σύρετε για Επαναφ. εργοστ. ρυθμ.</string>
+ <string name="repair_change_btn">Επιδιόρθωση ή Αλλαγή Αρχείων Συστήματος</string>
+ <string name="storage_hdr">Αποθ. χώρος: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Αντίγραφα ασφαλείας</string>
+ <string name="backup_confirm_hdr">Επιβεβαίωση Αντιγράφων Ασφαλείας</string>
+ <string name="encryption_tab">ΚΡΥΠΤΟΓΑΦΗΣΗ</string>
+ <string name="encryption">Κρυπτογράφηση:</string>
+ <string name="name">Όνομα:</string>
+ <string name="sel_part_backup">Επιλέξτε Τομείς για αντίγραφα ασφαλείας:</string>
+ <string name="storage">Αποθ. χώρος:</string>
+ <string name="enc_disabled">απενεργοποιημένο - ορίσετε έναν κωδικό για να ενεργοποιήσετε</string>
+ <string name="enc_enabled">ενεργοποιημένο</string>
+ <string name="enable_backup_comp_chk">Ενεργοποιήσετε τη συμπίεση</string>
+ <string name="skip_md5_backup_chk">Παράλ. δημιουργ. MD5 κατά την δημ. αντιγρ. ασφ.</string>
+ <string name="disable_backup_space_chk">Απενεργοποίηση Ελέγχου Ελεύθερου Χώρου</string>
+ <string name="refresh_sizes_btn">Ανανέωση Μεγεθών</string>
+ <string name="swipe_backup">Σύρετε για δημιουργ. Αντιγρ. Ασφαλ.</string>
+ <string name="append_date_btn">Προσαρτημένη Ημ/νία</string>
+ <string name="backup_name_exists">Ένα αντίγραφο ασφαλείας με αυτό το όνομα υπάρχει ήδη!</string>
+ <string name="encrypt_backup">Κρυπτογράφηση αντιγράφων ασφαλείας;</string>
+ <string name="enter_pass">Εισάγετε κωδικό:</string>
+ <string name="enter_pass2">Εισάγετε τον κωδικό ξανά:</string>
+ <string name="pass_not_match">Οι κωδικοί πρόσβασης δεν ταιριάζουν!</string>
+ <string name="partitions">Τομείς:</string>
+ <string name="disabled">Απενεργοποιημένο</string>
+ <string name="enabled">Ενεργοποιημένο</string>
+ <string name="backup_name_hdr">Ορίστε όνομα Αντίγραφου Ασφαλείας</string>
+ <string name="progress">Πρόοδος:</string>
+ <string name="backup_complete">Αντίγραφο Ασφαλείας Δημιουργήθηκε</string>
+ <string name="restore_hdr">Επαναφορά</string>
+ <string name="sel_backup_hdr">Επιλέξτε αντίγραφα ασφαλείας</string>
+ <string name="restore_sel_store_hdr">Επιλέξτε αρχείο από %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Επιλέξτε πακέτο Επαναφοράς:</string>
+ <string name="restore_enc_backup_hdr">Κρυπτογραφημένο αντίγραφο ασφαλείας</string>
+ <string name="restore_dec_fail">Κωδικός απέτυχε, παρακαλώ προσπαθήστε ξανά!</string>
+ <string name="del_backup_btn">Διαγραφή αντιγράφου ασφαλείας</string>
+ <string name="del_backup_confirm">Διαγραφή αντιγράφου ασφαλείας;</string>
+ <string name="del_backup_confirm2">Αυτή η ενέργεια δεν μπορεί να αναιρεθεί!</string>
+ <string name="deleting_backup">Διαγραφή αντιγράφων ασφαλείας...</string>
+ <string name="backup_deleted">Το αντίγραφο ασφαλείας διαγράφηκε</string>
+ <string name="swipe_delete">Σύρετε για διαγραφή</string>
+ <string name="swipe_delete_s"> Διαγραφή</string>
+ <string name="restore_try_decrypt">Κρυπτογραφημένο Αντίγραφο Ασφαλείας - Προσπάθεια Αποκρυπτογράφησης</string>
+ <string name="restore_try_decrypt_s">Προσπάθεια αποκρυπτογράφησης</string>
+ <string name="restore_backup_date">Το Αντίγραφο ασφαλείας δημιουργήθηκε στο %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Επιλέξτε Τομείς για Επαναφορά:</string>
+ <string name="restore_enable_md5_chk">Ενεργ. την επαλήθευση MD5 στα αντίγρ. ασφαλ.</string>
+ <string name="restore_complete">Η Eπαναφορά ολοκληρώθηκε</string>
+ <string name="swipe_restore">Σύρετε για Eπαναφορά</string>
+ <string name="swipe_restore_s"> Επαναφορά</string>
+ <string name="rename_backup_hdr">Μετονομασία αντιγράφου ασφαλείας</string>
+ <string name="rename_backup_confirm">Μετονομασία αντιγράφου ασφαλείας;</string>
+ <string name="rename_backup_confirm2">Αυτή η ενέργεια δεν μπορεί να αναιρεθεί!</string>
+ <string name="renaming_backup">Μετονομασία αντίγραφου ασφαλείας...</string>
+ <string name="rename_backup_complete">Η Μετονομασία Αντ. Ασφαλ. Ολοκληρώθηκε</string>
+ <string name="swipe_to_rename">Σύρετε για Μεταονομασία</string>
+ <string name="swipe_rename"> Μετονομασία</string>
+ <string name="confirm_hdr">Επιβεβαίωση</string>
+ <string name="mount_hdr">Προσάρτηση</string>
+ <string name="mount_sel_part">Επιλέξτε Τομείς για Προσάρτηση:</string>
+ <string name="mount_sys_ro_chk">Ορισμός του τομέα συστήματος μόνο για ανάγνωση</string>
+ <string name="mount_sys_ro_s_chk">Τοποθέτηση Συστήματος σε RO</string>
+ <string name="decrypt_data_btn">Αποκρυπτογράφηση δεδομένων</string>
+ <string name="disable_mtp_btn">Απενεργοποίηση MTP</string>
+ <string name="enable_mtp_btn">Ενεργοποίηση MTP</string>
+ <string name="mount_usb_storage_btn">Προσάρτ. αποθ. χώρου USB</string>
+ <string name="usb_storage_hdr">Εξ. χώρος USB</string>
+ <string name="usb_stor_mnt1">Εξ. χώρος USB προσαρτήθηκε</string>
+ <string name="usb_stor_mnt2">Βεβαιωθείτε ότι θα αφαιρέσετε με ασφάλεια τη συσκευή σας</string>
+ <string name="usb_stor_mnt3">από τον υπολογιστή σας πριν από την αποπροσάρτηση!</string>
+ <string name="unmount_btn">Αποπροσάρτηση</string>
+ <string name="rb_system_btn">Σύστημα</string>
+ <string name="rb_poweroff_btn">Απενεργοποίηση</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Λήψη</string>
+ <string name="turning_off">Απενεργοποίηση...</string>
+ <string name="swipe_power_off">Σύρετε για Απενεργοποίηση</string>
+ <string name="swipe_power_off_s">Απενεργοποίηση</string>
+ <string name="sys_ro_hdr">Τομέας συστήματος χωρίς τροποποιήσεις</string>
+ <string name="sys_ro_keep">Κρατήστε το σύστημα για ανάγνωση μόνο;</string>
+ <string name="sys_rop1">Το TWRP μπορεί να αφήσει τον τομέα συστήματος μη τροποποιημένο</string>
+ <string name="sys_rop2">ώστε να κάνει ευκολότερο για σας να λάβετε επίσημες ενημερώσεις.</string>
+ <string name="sys_rop3">Το TWRP δεν θα είναι σε θέση να αποτρέψει το λειτουργικό</string>
+ <string name="sys_rop4">να αντικαταστήσει το TWRP και δεν θα προσφέρουν τη δυνατότητα root στη συσκευή σας.</string>
+ <string name="sys_rop5">Η εγκατάσταση zip ή η εκτέλεση εντολών adb μπορούν να</string>
+ <string name="sys_rop6">τροποποιήσουν το διαμέρισμα του συστήματος.</string>
+ <string name="sys_rol1">Το TWRP μπορεί να αφήσει τον τομέα συστήματος μη τροποποιημένο ώστε να κάνει ευκολότερο για σας να λάβετε επίσημες ενημερώσεις.</string>
+ <string name="sys_rol2">Το TWRP δεν θα είναι σε θέση να αποτρέψει το λειτουργικό να αντικαταστήσει το TWRP και δεν θα προσφέρουν τη δυνατότητα root στη συσκευή σας.</string>
+ <string name="sys_rol3">Η Εγκατάσταση zip ή η εκτέλεση εργασιών adb μπορούν να τροποποιήσουν το διαμέρισμα του συστήματος.</string>
+ <string name="sys_ro_never_show_chk">Μην εμφανιστεί ξανά αυτή η οθόνη κατά την εκκίνηση</string>
+ <string name="sys_ro_keep_ro_btn">Διατήρηση Ανάγνωσης Μόνο</string>
+ <string name="swipe_allow_mod">Σύρετε για να Επιτρέψετε τις Τροποποιήσεις</string>
+ <string name="swipe_allow_mod_s">Επιτρέψτε τροποποιήσεις</string>
+ <string name="settings_hdr">Ρυθμίσεις</string>
+ <string name="settings_gen_hdr">Γενικές Ρυθμίσεις</string>
+ <string name="settings_gen_s_hdr">Γενικά</string>
+ <string name="settings_gen_btn">Γενικά</string>
+ <string name="use_rmrf_chk">Χρήση rm -rf αντί για διαμόρφωση</string>
+ <string name="use24clock_chk">Χρήση 24-ωρης μορφής ώρας</string>
+ <string name="rev_navbar_chk">Αντεστραμμένη navbar διάταξης</string>
+ <string name="simact_chk">Προσομοιώση ενεργειών για τη δοκιμή θέματος</string>
+ <string name="simfail_chk">Προσομοίωση αποτυχίας για δράσεις</string>
+ <string name="ctr_navbar_rdo">Κεντρική στοίχιση navbar κουμπιών</string>
+ <string name="lft_navbar_rdo">Αριστερή στοίχιση navbar κουμπιών</string>
+ <string name="rht_navbar_rdo">Δεξιά στοίχιση navbar κουμπιών</string>
+ <string name="restore_defaults_btn">Επαναφ. Προεπιλεγμ.</string>
+ <string name="settings_tz_btn">Ζώνη Ώρας</string>
+ <string name="settings_screen_btn">Οθόνη</string>
+ <string name="settings_screen_bright_btn">Φωτεινότητα οθόνης</string>
+ <string name="settings_vibration_btn">Δόνηση</string>
+ <string name="settings_language_btn">Γλώσσα</string>
+ <string name="time_zone_hdr">Ζώνη Ώρας</string>
+ <string name="sel_tz_list">Επιλέξτε ζώνη ώρας:</string>
+ <string name="utcm11">(UTC -11) Σαμόα, Midway Island</string>
+ <string name="utcm10">(UTC -10) Χαβάη</string>
+ <string name="utcm9">(UTC -9) Αλάσκα</string>
+ <string name="utcm8">(UTC -8) Ώρα Ειρηνικού</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Κεντρική ώρα</string>
+ <string name="utcm5">(UTC -5) Ανατολική ώρα</string>
+ <string name="utcm4">(UTC -4) Ώρα Ατλαντικού</string>
+ <string name="utcm3">(UTC -3) Βραζιλία, Μπουένος Άϊρες</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Αζόρες, Νήσοι Πράσινου Ακρωτηρίου</string>
+ <string name="utc0">(UTC 0) Λονδίνο, Δουβλίνο, Λισαβόνα</string>
+ <string name="utcp1">(UTC + 1) Βερολίνο, Βρυξέλλες, Παρίσι</string>
+ <string name="utcp2">(UTC + 2) Αθήνα, Κωνσταντινούπολη, Νότια Αφρική</string>
+ <string name="utcp3">(UTC + 3) Μόσχα, Βαγδάτη</string>
+ <string name="utcp4">(UTC + 4) Αμπού Ντάμπι, Τιφλίδα, Μοσχάτο</string>
+ <string name="utcp5">(UTC + 5) Αικατερινούπολη, Ισλαμαμπάντ</string>
+ <string name="utcp6">(UTC + 6) Αλμάτι, Ντάκα, Κολόμπο</string>
+ <string name="utcp7">(UTC + 7) Μπανγκόκ, Ανόι, Τζακάρτα</string>
+ <string name="utcp8">(UTC + 8) Πεκίνο, Σιγκαπούρη, Hong Kong</string>
+ <string name="utcp9">(UTC + 9) Τόκιο, Σεούλ, Γιακούτσκ</string>
+ <string name="utcp10">(UTC + 10) Ανατολική Αυστραλία, Γκουάμ</string>
+ <string name="utcp11">(UTC + 11) Βλαδιβοστόκ, Νησιά Σολομώντα</string>
+ <string name="utcp12">(UTC + 12) Όκλαντ, Γουέλινγκτον, Φίτζι</string>
+ <string name="sel_tz_offset">Επιλέξτε μετατόπιση (συνήθως 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Κανένα</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Χρησιμοποιήστε τη θερινή ώρα (DST)</string>
+ <string name="curr_tz">Τρέχουσα ζώνης ώρας: %tw_time_zone%</string>
+ <string name="curr_tz_s">Τρέχουσα ζώνης ώρας:</string>
+ <string name="set_tz_btn">Ορισμός ζώνης ώρας</string>
+ <string name="settings_screen_hdr">Ρυθμίσεις οθόνης</string>
+ <string name="settings_screen_timeout_hdr">Χρονικό όριο οθόνης</string>
+ <string name="enable_timeout_chk">Ενεργοποίηση χρονικού ορίου οθόνης</string>
+ <string name="screen_to_slider">Χρονικό όριο οθόνης σε δευτερόλεπτα:</string>
+ <string name="screen_to_slider_s">Χρονικό όριο οθόνης σε δευτερόλεπτα (0 = απενεργοποιημένο): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Η ρύθμιση χρονικού ορίου οθόνης δεν είναι διαθέσιμη</string>
+ <string name="screen_bright_slider">Φωτεινότητα: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Η ρύθμιση φωτεινότητας δεν είναι διαθέσιμη</string>
+ <string name="vibration_hdr">Δόνηση</string>
+ <string name="button_vibration_hdr">Δόνηση Κουμπιού</string>
+ <string name="kb_vibration_hdr">Δόνηση Πληκτρολογίου</string>
+ <string name="act_vibration_hdr">Δόνηση Ενέργειας</string>
+ <string name="button_vibration">Δόνηση Κουμπιού:</string>
+ <string name="kb_vibration">Δόνηση Πληκτρολογίου:</string>
+ <string name="act_vibration">Δόνηση Ενέργειας:</string>
+ <string name="select_language">Επιλέξτε γλώσσα:</string>
+ <string name="sel_lang_btn">Ορισμός γλώσσας</string>
+ <string name="set_language_btn">Ρύθμιση γλώσσας</string>
+ <string name="advanced_hdr">Προηγμένες</string>
+ <string name="copy_log_confirm">Αντιγραφή Log στην κάρτα SD;</string>
+ <string name="copying_log">Αντιγραφή Log στην κάρτα SD...</string>
+ <string name="copy_log_complete">Η Αντιγραφή Log Ολοκληρώθηκε</string>
+ <string name="fix_context_btn">Διορθ. περιεχομ.</string>
+ <string name="part_sd_btn">Τομέας κάρτας SD</string>
+ <string name="part_sd_s_btn">Κάρτα SD</string>
+ <string name="file_manager_btn">Διαχείρ. αρχείων</string>
+ <string name="language_hdr">Γλώσσα</string>
+ <string name="terminal_btn">Τερματικό</string>
+ <string name="reload_theme_btn">Εκ νέου φόρτ. θέματ.</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Εισαγωγή TWRP</string>
+ <string name="inject_twrp_confirm">Επανεισαγωγή TWRP;</string>
+ <string name="injecting_twrp">Επανεισαγωγή TWRP...</string>
+ <string name="inject_twrp_complete">Εισαγωγή TWRP ολοκληρώθηκε</string>
+ <string name="swipe_to_confirm">Σύρετε για επιβεβαιώσετε</string>
+ <string name="part_sd_hdr">Τομέας κάρτας SD</string>
+ <string name="invalid_partsd_sel">Πρέπει να επιλέξετε μία αφαιρ. συσκευή</string>
+ <string name="part_sd_lose">Θα χάσετε όλα τα αρχεία στην κάρτα SD!</string>
+ <string name="part_sd_undo">Αυτή η ενέργεια δεν μπορεί να αναιρεθεί!</string>
+ <string name="part_sd_ext_sz">Μέγεθος EXT:</string>
+ <string name="part_sd_swap_sz">Αλλαγή Μεγέθους:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Σύστημα αρχείων:</string>
+ <string name="swipe_part_sd">Σύρετε για Διαχωρισμό</string>
+ <string name="swipe_part_sd_s">Τομέας</string>
+ <string name="partitioning_sd">Διαχώριση κάρτας SD...</string>
+ <string name="partitioning_sd2">Αυτό θα διαρκέσει μερικά λεπτά.</string>
+ <string name="part_sd_complete">Η Διαχώριση ολοκληρώθηκε</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Επαναφέρετε το Αρχικό Boot</string>
+ <string name="dumlock_restore_confirm">Επαναφορά την αρχικής εικόνας boot;</string>
+ <string name="dumlock_restoring">Επαναφορά του Αρχικού Boot...</string>
+ <string name="dumlock_restore_complete">Επαναφορά του Αρχικού Boot Ολοκληρώθηκε</string>
+ <string name="dumlock_reflash_btn">Επανεγγραφή Recovery</string>
+ <string name="dumlock_reflash_confirm">Επανεγγραφή Recovery στο boot;</string>
+ <string name="dumlock_reflashing">Εγγραφή recovery στο boot...</string>
+ <string name="dumlock_reflash_complete">Η Εγγραφή Recovery στο Boot Ολοκληρώθηκε</string>
+ <string name="dumlock_install_btn">Εγκατάσταση του HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Εγκατάσταση αρχείων HTC dumlock στο λειτουργικό;</string>
+ <string name="dumlock_installing">Εγκατάσταση του HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Η εγκατάσταση HTC Dumlock Ολοκληρώθηκε</string>
+ <string name="swipe_to_unlock">Σύρετε για ξεκλείδωμα</string>
+ <string name="swipe_unlock"> Ξεκλείδωμα</string>
+ <string name="fm_hdr">Διαχείριση αρχείων</string>
+ <string name="fm_sel_file">Επιλέξτε ένα αρχείο ή φάκελο</string>
+ <string name="fm_type_folder">Φάκελος</string>
+ <string name="fm_type_file">Αρχείο</string>
+ <string name="fm_choose_act">Επιλέξτε ενέργεια</string>
+ <string name="fm_selected">%tw_fm_type% επιλέχθηκεί:</string>
+ <string name="fm_copy_btn">Αντιγραφή</string>
+ <string name="fm_copy_file_btn">Αντιγραφή αρχείου</string>
+ <string name="fm_copy_folder_btn">Αντιγραφή φακέλου</string>
+ <string name="fm_copying">Αντιγραφή</string>
+ <string name="fm_move_btn">Μετακίνηση</string>
+ <string name="fm_moving">Μετακίνηση</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Διαγραφή</string>
+ <string name="fm_deleting">Διαγραφή</string>
+ <string name="fm_rename_btn">Μετονομασία</string>
+ <string name="fm_rename_file_btn">Μετονοσία αρχείου</string>
+ <string name="fm_rename_folder_btn">Μετονομασία φακέλου</string>
+ <string name="fm_renaming">Μετονομασία</string>
+ <string name="fm_sel_dest">Επιλέξτε φάκελο προορισμού</string>
+ <string name="fm_sel_curr_folder">Επιλέξτε τρέχοντα φάκελο</string>
+ <string name="fm_rename_hdr">Μετονομασία</string>
+ <string name="fm_set_perms_hdr">Ορισμός δικαιωμάτων</string>
+ <string name="fm_perms">Δικαιώματα:</string>
+ <string name="fm_complete">Η Λειτουργία Αρχείου Ολοκληρώθηκε</string>
+ <string name="decrypt_data_hdr">Αποκρυπτογράφηση δεδομένων</string>
+ <string name="decrypt_data_enter_pass">Εισάγετε Κωδικό</string>
+ <string name="decrypt_data_failed">Κωδικός απέτυχε, παρακαλώ προσπαθήστε ξανά!</string>
+ <string name="decrypt_data_failed_pattern">Το Μοτίβο απέτυχε, παρακαλώ προσπαθήστε ξανά!</string>
+ <string name="decrypt_data_enter_pattern">Εισαγάγετε το μοτίβο.</string>
+ <string name="decrypt_data_trying">Προσπάθεια αποκρυπτογράφησης</string>
+ <string name="term_hdr">Εντολή τερματικού</string>
+ <string name="term_s_hdr">Τερματικό</string>
+ <string name="term_kill_btn">ΤΕΡΜΑΤΙΣΕ</string>
+ <string name="term_sel_folder_hdr">Περιηγηθείτε στον αρχικό φάκελο</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Εκκαθάριση Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Εκκαθάριση Cache</string>
+ <string name="swipe_to_sideload">Σύρετε για Sideload</string>
+ <string name="swipe_sideload"> Έναρξη</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Χρήση: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload ολοκληρώθηκε</string>
+ <string name="fix_contexts_hdr">Διορθώσετε τα δικαιώματα</string>
+ <string name="fix_contexts_note1">Σημείωση: Διόρθωση δικαιωμάτων, σπάνια χρειάζεται.</string>
+ <string name="fix_contexts_note2">Η διόρθωση περιεχομένων SELinux μπορεί να</string>
+ <string name="fix_contexts_note3">κάνει την συσκευή σας να μην ξεκινάει σωστά.</string>
+ <string name="swipe_to_fix_contexts">Σύρετε για Διόρθωση Δικαιωμάτων</string>
+ <string name="swipe_fix_contexts"> Διορθ. δικαιώμ.</string>
+ <string name="fixing_contexts">Διόρθωση δικαιωμάτων...</string>
+ <string name="fix_contexts_complete">Η Διόρθωση δικαιωμάτων ολοκληρώθηκε</string>
+ <string name="reboot_hdr">Επανεκκίνηση</string>
+ <string name="su_hdr">Έλεγχος SuperSU</string>
+ <string name="su_note1">Η συσκευή σας δεν φαίνεται να έχει root.</string>
+ <string name="su_note2">Εγκατάσταση SuperSU τώρα;</string>
+ <string name="su_note3">Αυτό κάνει root στην συσκευή σας.</string>
+ <string name="su_cancel">Μην εγκαταστήσετε</string>
+ <string name="swipe_su_to_install">Σύρετε για εγκατάσταση</string>
+ <string name="swipe_su_install"> Εγκατάσταση</string>
+ <string name="su_installing">Εγκατάσταση SuperSU</string>
+ <string name="sel_storage_list">Επιλέξτε Αποθ. χώρο</string>
+ <string name="ok_btn">OΚ</string>
+ <string name="no_kernel_selinux">Το Kernel δεν υποστηρίζει την ανάγνωση περιεχομένων SELinux.</string>
+ <string name="full_selinux">Υπάρχει πλήρης υποστήριξη SELinux.</string>
+ <string name="no_selinux">Δεν υπάρχει υποστήριξη SELinux (libselinux).</string>
+ <string name="mtp_enabled">MTP ενεργοποιημένο</string>
+ <string name="mtp_crash">MTP συνετρίβη, δεν αρχίζει το MTP κατά την εκκίνηση.</string>
+ <string name="decrypt_success">Αποκρυπτογραφήθηκε με επιτυχία με τον προεπιλεγμένο κωδικό.</string>
+ <string name="unable_to_decrypt">Δεν είναι δυνατή η αποκρυπτογράφηση με τον προεπιλεγμένο κωδικός. Ίσως χρειαστεί να εκτελέσετε εκκαθάριση δεδομένων.</string>
+ <string name="generating_md51">Δημιουργία MD5</string>
+ <string name="generating_md52"> * Δημιουργία md5...</string>
+ <string name="md5_created"> * MD5 δημιουργήθηκε.</string>
+ <string name="md5_error"> * Σφάλμα MD5!</string>
+ <string name="md5_compute_error"> * Σφάλμα υπολογισμού MD5.</string>
+ <string name="current_date">(Τρέχουσα ημερομηνία)</string>
+ <string name="auto_generate">(Αυτόματη δημιουργία)</string>
+ <string name="unable_to_locate_partition">Δεν μπορεί να εντοπιστεί ο '{1}' τομέας για υπολογισμούς αντ. ασφαλ.</string>
+ <string name="no_partition_selected">Δεν επιλέχθηκαν τομείς για αντίγραφο ασφαλείας.</string>
+ <string name="total_partitions_backup"> * Συνολικός αριθμός διαμερισμάτων για να δημιουργήσετε αντίγραφα ασφαλείας: {1}</string>
+ <string name="total_backup_size"> * Συνολικό μέγεθος όλων των δεδομένων: {1}MB</string>
+ <string name="available_space"> * Διαθέσιμος χώρος: {1}MB</string>
+ <string name="unable_locate_storage">Δεν μπορεί να εντοπίσετεί ο αποθ. χώρος.</string>
+ <string name="no_space">Ανεπαρκής χώρος στην αποθ. χώρο.</string>
+ <string name="backup_started">[ΔΗΜΙΟΥΡΓΙΑ ΑΝΤΙΓΡ. ΑΣΦΑΛ.]</string>
+ <string name="backup_folder"> * Κάντε φάκελο αντιγτ. ασφ.: {1}</string>
+ <string name="fail_backup_folder">Απέτυχε δημιουργίας φακέλου αντιγρ. ασφ.</string>
+ <string name="avg_backup_fs">Μέσος ρυθμός αντιγρ. ασφ. αρχείων συστήματος: {1} MB/δευτερ.</string>
+ <string name="avg_backup_img">Μέσος ρυθμός αντιγρ. ασφ. εικονικών μονάδων: {1} MB/δευτερ.</string>
+ <string name="total_backed_size">[{1} MB ΣΥΝΟΛΙΚΑ ΑΝΤΙΓΡΑΦΑΚΑΝ]</string>
+ <string name="backup_completed">[ΔΗΜΙΟΥΡΓΙΑ ΑΝΤΙΓΡ. ΑΣΦ. ΟΛΟΚΛΗΡΩΘΗΚΕ ΣΕ {1} ΔΕΥΤΕΡΟΛΕΠΤΑ]</string>
+ <string name="restore_started">[ΕΠΑΝΑΦΟΡΑ ΞΕΚΙΗΣΕ]</string>
+ <string name="restore_folder">Επαναφορά φακέλου: '{1}'</string>
+ <string name="restore_part_done">[{1} ολοκληρώθηκαν ({2} δευτερόλεπτα)]</string>
+ <string name="verifying_md5">Επαλήθευση MD5</string>
+ <string name="skip_md5">Παράλειψη ελέγχου MD5 βάση τις ρυθμίσεις χρήστη.</string>
+ <string name="calc_restore">Υπολογισμός λεπτομερειών επαναφοράς...</string>
+ <string name="restore_read_only">Δεν είναι δυνατό να επαναφέρετε {1} -- τοποθέτηση μόνο για ανάγνωση.</string>
+ <string name="restore_unable_locate">Δεν εντοπίζετε το διαμέρισμα «{1}» για αποκατάσταση.</string>
+ <string name="no_part_restore">Δεν επιλέχθηκαν τομείς για επαναφορά.</string>
+ <string name="restore_part_count">Επαναφορά {1} τομέων...</string>
+ <string name="total_restore_size">Το συνολικό μέγεθος επαναφοράς είναι {1}MB</string>
+ <string name="updating_system_details">Ενημέρωση λεπτομερειών συστήματος</string>
+ <string name="restore_completed">[ΕΠΑΝΑΦΟΡΑ ΟΛΟΚΛΗΡΩΝΕΤΕ ΣΕ {1} ΔΕΥΤΕΡΟΛΕΠΤΑ]</string>
+ <string name="error_opening_strerr">Σφάλμα κατά το άνοιγμα: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Δεν εντοπίστηκε διαμέρισμα από το όνομα του αντίγραφου ασφαλείας: '{1}'</string>
+ <string name="unable_find_part_path">Δεν μπόρεσε να βρεθεί ο τομέας για τη διαδρομή '{1}'</string>
+ <string name="update_part_details">Ενημέρωση λεπτομερειών Τομέα...</string>
+ <string name="update_part_details_done">...ολοκληρώθηκε</string>
+ <string name="wiping_dalvik">Εκκαθάριση Καταλόγων Dalvik Cache...</string>
+ <string name="cleaned">Καθαρίστηκαν: {1}...</string>
+ <string name="dalvik_done">-- Οι κατάλογοι Dalvik Cache, Διαγράφηκαν!</string>
+ <string name="no_andsec">Δεν βρέθηκαν τομείς android secure.</string>
+ <string name="unable_to_locate">Δεν μπορεί να εντοπιστεί {1}.</string>
+ <string name="wiping_datamedia">Εκκαθάριση εσωτ. χώρου αποθ. -- /data/media...</string>
+ <string name="unable_to_mount">Αδύνατη προσάρτηση {1}</string>
+ <string name="unable_to_mount_internal">Αδύνατη προσάρτηση του internal_storage</string>
+ <string name="unable_to_mount_storage">Αδύνατη προσάρτηση του χώρου αποθ.</string>
+ <string name="fail_decrypt">Απέτυχε η αποκρυπτογράφηση δεδομένων.</string>
+ <string name="no_crypto_support">Δεν έχει μεταγλωττιστεί υποστήριξη κρυπτογράφησης σε αυτό το build.</string>
+ <string name="decrypt_success_dev">Τα δεδομένα αποκρυπτογραφήθηκαν, νέο μπλοκάρισμα συσκευής: '{1}'</string>
+ <string name="done">Έγινε.</string>
+ <string name="start_partition_sd">Διαχώριση κάρτας SD...</string>
+ <string name="partition_sd_locate">Δεν μπορείτε να εντοπίσετε η συσκευή για διαχωρισμό.</string>
+ <string name="ext_swap_size">EXT + Αλλαγή μεγέθους είναι μεγαλύτερο από το μέγεθος της κάρτας sd.</string>
+ <string name="remove_part_table">Κατάργηση πίνακα τομέων...</string>
+ <string name="unable_rm_part">Δεν είναι δυνατή η κατάργηση του πίνακα τομέων.</string>
+ <string name="create_part">Δημιουργία {1} τομέα...</string>
+ <string name="unable_to_create_part">Δεν είναι δυνατή η δημιουργία τομέα {1}.</string>
+ <string name="format_sdext_as">Διαμόρφωση sd-ext ως {1}...</string>
+ <string name="part_complete">Η Διαχώριση ολοκληρώθηκε.</string>
+ <string name="unable_to_open">Δεν είναι δυνατό το άνοιγμα '{1}'.</string>
+ <string name="mtp_already_enabled">Το MTP ενεργοποιήθηκε ήδη</string>
+ <string name="mtp_fail">Αποτυχία ενεργοποιήσεις MTP</string>
+ <string name="no_mtp">Δεν περιλαμβάνεται η υποστήριξη MTP</string>
+ <string name="image_flash_start">[ΕΓΓΡΑΦΗ ΕΙΚΟΝΑΣ ΞΕΚΙΝΗΣΕ]</string>
+ <string name="img_to_flash">Εικόνα για εγγραφή: '{1}'</string>
+ <string name="flash_unable_locate">Δεν μπορεί να εντοπιστεί ο '{1}' τομέας για εγγραφή.</string>
+ <string name="no_part_flash">Δεν επιλέχθηκαν τομείς για εγγραφή.</string>
+ <string name="too_many_flash">Έχουν επιλεγεί πολύ τομείς για εγγραφή.</string>
+ <string name="invalid_flash">Μη έγκυρη εγγραφή τομέα που καθορίζεται.</string>
+ <string name="flash_done">[ΕΓΓΡΑΦΗ ΕΙΚΟΝΑΣ ΟΛΟΚΛΗΡΩΘΗΚΕ]</string>
+ <string name="wiping">Εκκαθάριση {1}</string>
+ <string name="repair_not_exist">{1} δεν υπάρχει! Δεν μπορεί να επιδιορθώσει!</string>
+ <string name="repairing_using">Επιδιόρθωση {1} χρήση {2}...</string>
+ <string name="unable_repair">Δεν είναι δυνατή η επιδιόρθωση {1}.</string>
+ <string name="mount_data_footer">Δεν μπόρεσε να προσαρτηθεί το /data και είναι αδύνατη η εύρεση του κρύπτο υποσέλιδου.</string>
+ <string name="create_folder_strerr">Δεν μπόρεσε να δημιουργήσει '{1}' το φάκελο ({2}).</string>
+ <string name="fail_mount">Αποτυχία προσάρτησης '{1}' ({2})</string>
+ <string name="fail_unmount">Αποτυχία αποπροσάρτησης '{1}' ({2})</string>
+ <string name="cannot_resize">Δεν μπορεί να αλλαχθεί το μέγεθος {1}.</string>
+ <string name="repair_resize">Επιδιόρθωση {1} πριν την αλλαγή μεγέθους.</string>
+ <string name="unable_resize">Δεν είναι δυνατή η αλλαγή μεγέθους {1}.</string>
+ <string name="no_md5_found">Δεν βρέθηκε MD5 αρχείο για το '{1}'. Παρακαλώ απεπηλέξτε την επαλήθευση MD5 για επαναφορά.</string>
+ <string name="md5_fail_match">Το MD5 απέτυχε να ταυτίσει με το '{1}'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Αποτυχία αποκρυπτογράφησης του αρχείου tar '{1}'</string>
+ <string name="format_data_msg">Ίσως χρειαστεί να επανεκκινήσετε στο recovery για να ξαναχρησιμοποιήσετε το /data.</string>
+ <string name="format_data_err">Αδύνατη η διαμόρφωση για να καταργήσετε την κρυπτογράφηση.</string>
+ <string name="formatting_using">Διαμόρφωση {1} χρησιμοποιόντας {2}...</string>
+ <string name="unable_to_wipe">Αδυναμία εκκαθάρισης {1}.</string>
+ <string name="cannot_wipe">Ο Τομέας {1} δεν μπορεί να εκκαθαριστεί.</string>
+ <string name="remove_all">Διαγραφή όλων των αρχείων στο '{1}'</string>
+ <string name="wiping_data">Εκκαθάριση δεδομένων χωρίς την εκκαθάριση του /data/media ...</string>
+ <string name="backing_up">Δημιουργία Αντιγρ. Ασφαλ. {1}...</string>
+ <string name="backing">Δημιουργία Αντιγρ. Ασφαλ.</string>
+ <string name="backup_size">Μέγεθος αρχείο αντιγρ. ασφ. για το «{1}» είναι 0 bytes.</string>
+ <string name="datamedia_fs_restore">Προειδοποίηση: Αυτό το αντίγραφο ασφαλείας /data έγινε με το σύστημα αρχείων {1}! Η δημιουργία αντιγράφων ασφαλείας ενδέχεται να μην εκκίνηση, εκτός και αν επιστρέψετε στο {1}.</string>
+ <string name="restoring">Επαναφορά {1}...</string>
+ <string name="restoring_hdr">Επαναφορά</string>
+ <string name="recreate_folder_err">Δεν είναι δυνατή η ανασύνθεση του φακέλου {1}.</string>
+ <string name="img_size_err">Το μέγεθος της εικόνας είναι μεγαλύτερο από την συσκευή προορισμού</string>
+ <string name="flashing">Εγγραφή {1}...</string>
+ <string name="backup_folder_set">Φάκελος αντιγρ. ασφ. ορίστηκε το '{1}'</string>
+ <string name="locate_backup_err">Δεν μπόρεσενα εντοπιστεί το αντιγρ. ασφ. '{1}'</string>
+ <string name="set_restore_opt">Ρύθμιση επιλογών επαναφοράς: '{1}':</string>
+ <string name="md5_check_skip">Η παράλειψη ελέγχου MD5 είναι ενεργή</string>
+ <string name="ors_encrypt_restore_err">Δεν μπορεί να χρησιμοποιηθεί το OpenRecoveryScript για να επαναφέρετε ένα κρυπτογραφημένο αντίγραφο ασφαλείας.</string>
+ <string name="mounting">Προσάρτηση</string>
+ <string name="unmounting">Αποπροσάρτηση</string>
+ <string name="mounted">Προσαρτήθηκε '{1}'</string>
+ <string name="unmounted">Αποπροσαρτήθηκε '{1}'</string>
+ <string name="setting">Ρύθμιση '{1}' για '{2}'</string>
+ <string name="setting_empty">Ρύθμιση '{1}' για άδειασμα</string>
+ <string name="making_dir1">Δημιουργία φακέλου</string>
+ <string name="making_dir2">Δημιουργία φακέλου: '{1}'</string>
+ <string name="running_command">Εκτέλεση Εντολής</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Εκτέλεση ADB sideload...</string>
+ <string name="need_new_adb">Χρειάζεστε adb 1.0.32 ή νεότερο για sideload σε αυτήν τη συσκευή.</string>
+ <string name="no_pwd">Δεν παρέχεται κωδικός.</string>
+ <string name="done_ors">Έγινε επεξεργασία του αρχείου script</string>
+ <string name="injecttwrp">Εισαγωγή TWRP στην εικόνα εκκίνησης...</string>
+ <string name="zip_err">Σφάλμα κατά την εγκατάσταση του zip '{1}'</string>
+ <string name="installing_zip">Εγκατάσταση αρχείου zip '{1}'</string>
+ <string name="select_backup_opt">Ρύθμιση της δημιουργίας αντιγράφων ασφαλείας:</string>
+ <string name="compression_on">Η συμπίεση είναι ενεργή</string>
+ <string name="md5_off">Η δημιουργία MD5 είναι απενεργοποιημένη</string>
+ <string name="backup_fail">Η δημιουργία Αντίγραφου Ασφαλείας απέτυχε</string>
+ <string name="backup_clean">Η δημιουργία Αντίγρ. Ασφαλ. απέτυχε. Εκκαθάριση φακέλου.</string>
+ <string name="running_recovery_commands">Εκτέλεση Eντολών Recovery</string>
+ <string name="recovery_commands_complete">Οι Εντολές Recovery Ολοκληρώθηκαν</string>
+ <string name="running_ors">Εκτέλεση OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript Ολοκληρώθηκε</string>
+ <string name="no_updater_binary">Δεν βρέθηκε το '{1}' στο αρχείο zip.</string>
+ <string name="check_for_md5">Έλεγχος για MD5 αρχείο...</string>
+ <string name="fail_sysmap">Αποτυχία αντιστ. αρχείου '{1}'</string>
+ <string name="verify_zip_sig">Επαλήθευση υπογραφής zip...</string>
+ <string name="verify_zip_fail">Η επαλήθευση της υπογραφής zip απέτυχε!</string>
+ <string name="verify_zip_done">Η επαλήθευση της υπογραφής zip ολοκληρώθηκε.</string>
+ <string name="zip_corrupt">Το αρχείο zip είναι κατεστραμμένο!</string>
+ <string name="no_md5">Παράλειψη ελέγχου MD5: δεν βρέθηκε αρχείο MD5</string>
+ <string name="md5_fail">Τα MD5 δεν ταυτίζονται</string>
+ <string name="md5_match">Τα MD5 ταυτίζονται</string>
+ <string name="pid_signal">{1} διαδικασία τερματίστηκε με σήμα: {2}</string>
+ <string name="pid_error">{1} διαδικασία τερματίστηκε με ΣΦΑΛΜΑ: {2}</string>
+ <string name="install_dumlock">Εγκατάσταση HTC Dumlock στο σύστημα...</string>
+ <string name="dumlock_restore">Επαναφορά του Αρχικού Boot...</string>
+ <string name="dumlock_reflash">Επανεγγραφή recovery στο boot...</string>
+ <string name="run_script">Εκτέλεση {1} script...</string>
+ <string name="rename_stock">Μετονομασία αρχικού recovery στο /system για να αποτρέψετε την αντικατάσταση του TWRP από το λειτουργικό.</string>
+ <string name="split_backup">Σπάσιμο αντίγραφου ασφαλείας σε πολλαπλά αρχεία...</string>
+ <string name="backup_error">Σφάλμα κατά τη δημιουργία αντιγράφων ασφαλείας.</string>
+ <string name="restore_error">Σφάλμα κατά τη διαδικασία επαναφοράς.</string>
+ <string name="split_thread">Διάσπαση thread ID {1} στο αρχείο {2}</string>
+ <string name="file_progress">%llu από %llu αρχεία, %i%%</string>
+ <string name="size_progress">%lluMB από %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Προσπάθεια αποκρυπτογράφησης τομέα δεδομένων μέσω της γραμμής εντολών.</string>
+ <string name="base_pkg_err">Απέτυχε η φόρτωση των βασικών πακέτων.</string>
+ <string name="simulating">Προσομοίωση ενεργειών...</string>
+ <string name="backup_cancel">Δημιουργία αντιγρ. ασφ. ακυρώθηκε</string>
+ <string name="config_twrp">Ρύθμιση παραμέτρων TWRP...</string>
+ <string name="config_twrp_err">Αδύνατη ρύθμιση TWRP με αυτό το kernel.</string>
+ <string name="copy_log">Αντιγραφή καταγραφής αποκατάστασης στο {1}.</string>
+ <string name="max_queue">Μέγιστος αριθμός zip!</string>
+ <string name="min_queue">Ελάχιστος αριθμός zip!</string>
+ <string name="screenshot_saved">Το στιγμιότυπο αποθηκεύτηκε στο {1}</string>
+ <string name="screenshot_err">Απέτυχε η λήψη στιγμιότυπου οθόνης!</string>
+ <string name="zip_wipe_cache">Ένα ή περισσότερα zip ζήτησε εκκαθάριση cache -- Εκκαθάριση cache τώρα.</string>
+ <string name="and_sec_wipe_err">Αποτυχία εκκαθάρισης android secure</string>
+ <string name="dalvik_wipe_err">Αποτυχία εκκαθάρισης dalvik</string>
+ <string name="auto_gen">(Αυτόματη δημιουργία)</string>
+ <string name="curr_date">(Τρέχουσα ημερομηνία)</string>
+ <string name="backup_name_len">Το όνομα του αντίγραφου ασφαλείας είναι πολύ μεγάλο.</string>
+ <string name="backup_name_invalid">Το όνομα αντ. ασφ. '{1}' περιέχει μη έγκυρους χαρακτήρες: '{1}'</string>
+ <string name="no_real_sdcard">Αυτή η συσκευή δεν έχει πραγματική κάρτα SD! Ματαίωση!</string>
+ <string name="cancel_sideload">Ακύρωση ADB sideload...</string>
+ <string name="change_fs_err">Σφάλμα στην αλλαγή αρχείων συστήματος.</string>
+ <string name="theme_ver_err">Η έκδοση του θέματος δεν ταιριάζει με αυτή του TWRP. Χρήση προεπιλεγμένου θέματος.</string>
+ <string name="up_a_level">(προηγ. επίπεδο)</string>
+ <string name="install_reboot">Επανεκκίνηση σε 5 δευτ.</string>
+ </resources>
+</language> \ No newline at end of file
diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml
new file mode 100644
index 000000000..c14c3466e
--- /dev/null
+++ b/gui/theme/common/languages/en.xml
@@ -0,0 +1,696 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>English</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System Image</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="data_backup">Data (excl. storage)</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Internal Storage</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted Storage</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Battery: %tw_battery%</string>
+ <string name="sort_by_name">Sort by Name</string>
+ <string name="sort_by_date">Sort by Date</string>
+ <string name="sort_by_size">Sort by Size</string>
+ <string name="sort_by_name_only">Name</string>
+ <string name="sort_by_date_only">Date</string>
+ <string name="sort_by_size_only">Size</string>
+ <string name="tab_general">GENERAL</string>
+ <string name="tab_options">OPTIONS</string>
+ <string name="tab_backup">BACKUP</string>
+ <string name="tab_time_zone">TIME ZONE</string>
+ <string name="tab_screen">SCREEN</string>
+ <string name="tab_vibration">VIBRATION</string>
+ <string name="tab_language">LANGUAGE</string>
+
+ <string name="install_btn">Install</string>
+ <string name="wipe_btn">Wipe</string>
+ <string name="backup_btn">Backup</string>
+ <string name="restore_btn">Restore</string>
+ <string name="mount_btn">Mount</string>
+ <string name="settings_btn">Settings</string>
+ <string name="advanced_btn">Advanced</string>
+ <string name="reboot_btn">Reboot</string>
+ <string name="files_btn">Files</string>
+ <string name="copy_log_btn">Copy Log</string>
+ <string name="select_type_hdr">Select Type</string>
+ <string name="install_zip_hdr">Install Zip</string>
+ <string name="install_zip_btn">Install Zip</string>
+ <string name="install_image_hdr">Install Image</string>
+ <string name="install_image_btn">Install Image</string>
+ <string name="install_select_file_hdr">Select File</string>
+ <string name="file_selector_folders_hdr">Folders</string>
+ <string name="select_file_from_storage">Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Install</string>
+ <string name="select_storage_hdr">Select Storage</string>
+ <string name="select_storage_btn">Select Storage</string>
+ <string name="queue_hdr">Queue</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% of max of 10 Files queued</string>
+ <string name="zip_queue_count_s">File %tw_zip_queue_count% of 10:</string>
+ <string name="zip_warn1">This operation may install incompatible</string>
+ <string name="zip_warn2">software and render your device unusable.</string>
+ <string name="zip_back_cancel">Press back to cancel adding this zip.</string>
+ <string name="zip_back_clear">Press back button to clear the queue.</string>
+ <string name="folder">Folder:</string>
+ <string name="file">File:</string>
+ <string name="zip_sig_chk">Zip signature verification</string>
+ <string name="inject_twrp_chk">Inject TWRP after install</string>
+ <string name="install_reboot_chk">Reboot after installation is complete</string>
+ <string name="options_hdr">Options</string>
+ <string name="confirm_flash_hdr">Confirm Flash</string>
+ <string name="zip_queue">Queue:</string>
+ <string name="options">Options:</string>
+ <string name="swipe_confirm"> Confirm</string>
+ <string name="zip_add_btn">Add more Zips</string>
+ <string name="zip_clear_btn">Clear Zip Queue</string>
+ <string name="install_zip_count_hdr">Install Zip %tw_zip_index% of %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Installing Zip: %tw_file%</string>
+ <string name="failed">Failed</string>
+ <string name="successful">Successful</string>
+ <string name="install_failed">Installation Failed</string>
+ <string name="install_successful">Installation Successful</string>
+ <string name="wipe_cache_dalvik_btn">Wipe cache/dalvik</string>
+ <string name="reboot_system_btn">Reboot System</string>
+ <string name="install_sel_target">Select Target Partition</string>
+ <string name="flash_image_select">Select Partition to Flash Image:</string>
+ <string name="target_partition">Target Partition:</string>
+ <string name="flashing_image">Flashing Image...</string>
+ <string name="image_flashed">Image Flashed</string>
+ <string name="wipe_cache_dalvik_confirm">Wipe Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Wiping Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Cache &amp; Dalvik Wipe Complete</string>
+ <string name="swipe_wipe">Swipe to Wipe</string>
+ <string name="swipe_wipe_s"> Wipe</string>
+ <string name="no_os1">No OS Installed! Are you</string>
+ <string name="no_osrb">sure you wish to reboot?</string>
+ <string name="no_ospo">sure you wish to power off?</string>
+ <string name="rebooting">Rebooting...</string>
+ <string name="swipe_reboot">Swipe to Reboot</string>
+ <string name="swipe_reboot_s"> Reboot</string>
+ <string name="reboot_install_app_hdr">Install TWRP App?</string>
+ <string name="reboot_install_app1">Would you like to install the Official TWRP App?</string>
+ <string name="reboot_install_app2">The app can check for new TWRP versions.</string>
+ <string name="reboot_install_app_prompt_install">Prompt to install TWRP app if not installed</string>
+ <string name="reboot_install_app_system">Install as a System App</string>
+ <string name="reboot_installing_app">Installing App...</string>
+ <string name="swipe_to_install_app">Swipe to Install TWRP App</string>
+ <string name="swipe_flash">Swipe to confirm Flash</string>
+ <string name="confirm_action">Confirm Action</string>
+ <string name="back_cancel">Press back button to cancel.</string>
+ <string name="cancel_btn">Cancel</string>
+ <string name="wipe_hdr">Wipe</string>
+ <string name="factory_reset_hdr">Factory Reset</string>
+ <string name="factory_reset_btn">Factory Reset</string>
+ <string name="factory_reset1">Wipes Data, Cache, and Dalvik</string>
+ <string name="factory_reset2">(not including internal storage)</string>
+ <string name="factory_reset3">Most of the time this is</string>
+ <string name="factory_reset4">the only wipe that you need.</string>
+ <string name="factory_resetting">Factory Reset...</string>
+ <string name="advanced_wipe_hdr">Advanced Wipe</string>
+ <string name="advanced_wipe_btn">Advanced Wipe</string>
+ <string name="wipe_enc_confirm">Wipe Encryption from Data?</string>
+ <string name="formatting_data">Formatting Data...</string>
+ <string name="swipe_format_data">Swipe to Format Data</string>
+ <string name="swipe_format_data_s"> Format Data</string>
+ <string name="factory_reset_complete">Factory Reset Complete</string>
+ <string name="sel_part_hdr">Select Partitions</string>
+ <string name="wipe_sel_confirm">Wipe Selected Partition(s)?</string>
+ <string name="wiping_part">Wiping Partition(s)...</string>
+ <string name="wipe_complete">Wipe Complete</string>
+ <string name="sel_part_wipe">Select Partitions to Wipe:</string>
+ <string name="invalid_part_sel">Invalid partition selection</string>
+ <string name="format_data_hdr">Format Data</string>
+ <string name="format_data_btn">Format Data</string>
+ <string name="format_data_ptr1">Format Data will wipe all of your apps,</string>
+ <string name="format_data_ptr2">backups, pictures, videos, media, and</string>
+ <string name="format_data_ptr3">removes encryption on internal storage.</string>
+ <string name="format_data_adopted">Including Adopted Storage</string>
+ <string name="format_data_lcp1">Format Data will wipe all of your apps, backups, pictures, videos, media, and</string>
+ <string name="format_data_lcp2">removes encryption on internal storage.</string>
+ <string name="format_data_wtc1">Format Data will wipe all of your apps,</string>
+ <string name="format_data_wtc2">backups and media. This cannot be undone.</string>
+ <string name="format_data_undo">This cannot be undone.</string>
+ <string name="format_data_complete">Data Format Complete</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Type yes to continue. Press back to cancel.</string>
+ <string name="part_opt_hdr">Partition Options for: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Select Action</string>
+ <string name="file_sys_opt">File System Options</string>
+ <string name="partition">Partition: %tw_partition_name%</string>
+ <string name="part_mount_point">Mount Point: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">File system: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Present: Yes</string>
+ <string name="part_present_no">Present: No</string>
+ <string name="part_removable_yes">Removable: Yes</string>
+ <string name="part_removable_no">Removable: No</string>
+ <string name="part_size">Size: %tw_partition_size%MB</string>
+ <string name="part_used">Used: %tw_partition_used%MB</string>
+ <string name="part_free">Free: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Backup Size: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Resize File System</string>
+ <string name="resize_btn_s">Resize</string>
+ <string name="resize_confirm">Resize %tw_partition_name%?</string>
+ <string name="resizing">Resizing...</string>
+ <string name="resize_complete">Resize Complete</string>
+ <string name="swipe_resize">Swipe to Resize</string>
+ <string name="swipe_resize_s"> Resize</string>
+ <string name="repair_btn">Repair File System</string>
+ <string name="repair_btn_s">Repair</string>
+ <string name="repair_confirm">Repair %tw_partition_name%?</string>
+ <string name="repairing">Repairing...</string>
+ <string name="repair_complete">Repair Complete</string>
+ <string name="swipe_repair">Swipe to Repair</string>
+ <string name="swipe_repair_s"> Repair</string>
+ <string name="change_fs_btn">Change File System</string>
+ <string name="change_fs_btn_s">Change</string>
+ <string name="change_fs_for_hdr">Change File System for: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partition: %tw_partition_name% &gt; Select File System</string>
+ <string name="change_fs_warn1">Some ROMs or kernels may not support some</string>
+ <string name="change_fs_warn2">file systems. Proceed with caution!</string>
+ <string name="change_fs_confirm">Change %tw_partition_name%?</string>
+ <string name="formatting">Formatting...</string>
+ <string name="format_complete">Format Complete</string>
+ <string name="swipe_change_fs">Swipe to Change</string>
+ <string name="swipe_change_s"> Change</string>
+ <string name="back_btn">Back</string>
+ <string name="wipe_enc_btn">Wipe Encryption</string>
+ <string name="swipe_factory_reset">Swipe to Factory Reset</string>
+ <string name="repair_change_btn">Repair or Change File System</string>
+ <string name="storage_hdr">Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Backup</string>
+ <string name="backup_confirm_hdr">Confirm Backup</string>
+ <string name="encryption_tab">ENCRYPTION</string>
+ <string name="encryption">Encryption:</string>
+ <string name="name">Name:</string>
+ <string name="sel_part_backup">Select Partitions to Backup:</string>
+ <string name="storage">Storage:</string>
+ <string name="enc_disabled">disabled - set a password to enable</string>
+ <string name="enc_enabled">enabled</string>
+ <string name="enable_backup_comp_chk">Enable compression</string>
+ <string name="skip_md5_backup_chk">Skip MD5 generation during backup</string>
+ <string name="disable_backup_space_chk" version="2">Disable free space check before backup</string>
+ <string name="current_boot_slot">Current Slot: %tw_active_slot%</string>
+ <string name="boot_slot_a">Slot A</string>
+ <string name="boot_slot_b">Slot B</string>
+ <string name="changing_boot_slot">Changing Boot Slot</string>
+ <string name="changing_boot_slot_complete">Changing Boot Slot Complete</string>
+ <string name="refresh_sizes_btn">Refresh Sizes</string>
+ <string name="swipe_backup">Swipe to Backup</string>
+ <string name="append_date_btn">Append Date</string>
+ <string name="backup_name_exists">A backup with that name already exists!</string>
+ <string name="encrypt_backup">Encrypt your Backup?</string>
+ <string name="enter_pass">Enter Password:</string>
+ <string name="enter_pass2">Enter Password Again:</string>
+ <string name="pass_not_match">Passwords do not match!</string>
+ <string name="partitions">Partitions:</string>
+ <string name="disabled">Disabled</string>
+ <string name="enabled">Enabled</string>
+ <string name="backup_name_hdr">Set Backup Name</string>
+ <string name="progress">Progress:</string>
+ <string name="backup_complete">Backup Complete</string>
+ <string name="restore_hdr">Restore</string>
+ <string name="sel_backup_hdr">Select Backup</string>
+ <string name="restore_sel_store_hdr">Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Select Package to Restore:</string>
+ <string name="restore_enc_backup_hdr">Encrypted Backup</string>
+ <string name="restore_dec_fail">Password failed, please try again!</string>
+ <string name="del_backup_btn">Delete Backup</string>
+ <string name="del_backup_confirm">Delete Backup?</string>
+ <string name="del_backup_confirm2">This cannot be undone!</string>
+ <string name="deleting_backup">Deleting Backup...</string>
+ <string name="backup_deleted">Backup Delete Complete</string>
+ <string name="swipe_delete">Swipe to Delete</string>
+ <string name="swipe_delete_s"> Delete</string>
+ <string name="restore_try_decrypt">Encrypted Backup - Trying Decryption</string>
+ <string name="restore_try_decrypt_s">Trying Decryption</string>
+ <string name="restore_backup_date">Backup made on %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Select Partitions to Restore:</string>
+ <string name="restore_enable_md5_chk">Enable MD5 Verification of Backup Files</string>
+ <string name="restore_complete">Restore Complete</string>
+ <string name="swipe_restore">Swipe to Restore</string>
+ <string name="swipe_restore_s"> Restore</string>
+ <string name="rename_backup_hdr">Rename Backup</string>
+ <string name="rename_backup_confirm">Rename Backup?</string>
+ <string name="rename_backup_confirm2">This cannot be undone!</string>
+ <string name="renaming_backup">Renaming Backup...</string>
+ <string name="rename_backup_complete">Backup Rename Complete</string>
+ <string name="swipe_to_rename">Swipe to Rename</string>
+ <string name="swipe_rename"> Rename</string>
+ <string name="confirm_hdr">Confirm</string>
+ <string name="mount_hdr">Mount</string>
+ <string name="mount_sel_part">Select Partitions to Mount:</string>
+ <string name="mount_sys_ro_chk">Mount system partition read-only</string>
+ <string name="mount_sys_ro_s_chk">Mount System RO</string>
+ <string name="decrypt_data_btn">Decrypt Data</string>
+ <string name="disable_mtp_btn">Disable MTP</string>
+ <string name="enable_mtp_btn">Enable MTP</string>
+ <string name="mount_usb_storage_btn">Mount USB Storage</string>
+ <string name="usb_storage_hdr">USB Storage</string>
+ <string name="usb_stor_mnt1">USB Storage Mounted</string>
+ <string name="usb_stor_mnt2">Be sure to safely remove your device</string>
+ <string name="usb_stor_mnt3">from your computer before unmounting!</string>
+ <string name="unmount_btn">Unmount</string>
+ <string name="rb_system_btn">System</string>
+ <string name="rb_poweroff_btn">Power Off</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">Turning Off...</string>
+ <string name="swipe_power_off">Swipe to Power Off</string>
+ <string name="swipe_power_off_s">Power Off</string>
+ <string name="sys_ro_hdr">Unmodified System Partition</string>
+ <string name="sys_ro_keep">Keep System Read only?</string>
+ <string name="sys_rop1">TWRP can leave your system partition unmodified</string>
+ <string name="sys_rop2">to make it easier for you to take official updates.</string>
+ <string name="sys_rop3">TWRP will be unable to prevent the stock ROM from</string>
+ <string name="sys_rop4">replacing TWRP and will not offer to root your device.</string>
+ <string name="sys_rop5">Installing zips or performing adb operations may still</string>
+ <string name="sys_rop6">modify the system partition.</string>
+ <string name="sys_rol1">TWRP can leave your system partition unmodified to make it easier for you to take official updates.</string>
+ <string name="sys_rol2">TWRP will be unable to prevent the stock ROM from replacing TWRP and will not offer to root your device.</string>
+ <string name="sys_rol3">Installing zips or performing adb operations may still modify the system partition.</string>
+ <string name="sys_ro_never_show_chk">Never show this screen during boot again</string>
+ <string name="sys_ro_keep_ro_btn">Keep Read Only</string>
+ <string name="swipe_allow_mod">Swipe to Allow Modifications</string>
+ <string name="swipe_allow_mod_s">Allow Modifications</string>
+ <string name="settings_hdr">Settings</string>
+ <string name="settings_gen_hdr">General</string>
+ <string name="settings_gen_s_hdr">General</string>
+ <string name="settings_gen_btn">General</string>
+ <string name="use_rmrf_chk">Use rm -rf instead of formatting</string>
+ <string name="use24clock_chk">Use 24-hour clock</string>
+ <string name="rev_navbar_chk">Reversed navbar layout</string>
+ <string name="simact_chk">Simulate actions for theme testing</string>
+ <string name="simfail_chk">Simulate failure for actions</string>
+ <string name="ctr_navbar_rdo">Center navbar buttons</string>
+ <string name="lft_navbar_rdo">Left align navbar buttons</string>
+ <string name="rht_navbar_rdo">Right align navbar buttons</string>
+ <string name="restore_defaults_btn">Restore Defaults</string>
+ <string name="settings_tz_btn">Time Zone</string>
+ <string name="settings_screen_btn">Screen</string>
+ <string name="settings_screen_bright_btn">Screen Brightness</string>
+ <string name="settings_vibration_btn">Vibration</string>
+ <string name="settings_language_btn">Language</string>
+ <string name="time_zone_hdr">Time Zone</string>
+ <string name="sel_tz_list">Select Time Zone:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Central Time</string>
+ <string name="utcm5">(UTC -5) Eastern Time</string>
+ <string name="utcm4">(UTC -4) Atlantic Time</string>
+ <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string>
+ <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string>
+ <string name="utcp3">(UTC +3) Moscow, Baghdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Eastern Australia, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Select Offset (usually 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">None</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Use daylight savings time (DST)</string>
+ <string name="curr_tz">Current Time Zone: %tw_time_zone%</string>
+ <string name="curr_tz_s">Current Time Zone:</string>
+ <string name="set_tz_btn">Set Time Zone</string>
+ <string name="settings_screen_hdr">Screen</string>
+ <string name="settings_screen_timeout_hdr">Screen Timeout</string>
+ <string name="enable_timeout_chk">Enable screen timeout</string>
+ <string name="screen_to_slider">Screen timeout in seconds:</string>
+ <string name="screen_to_slider_s">Screen timeout in seconds (0=disabled): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Screen timeout setting unavailable</string>
+ <string name="screen_bright_slider">Brightness: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Brightness setting unavailable</string>
+ <string name="vibration_hdr">Vibration</string>
+ <string name="button_vibration_hdr">Button Vibration</string>
+ <string name="kb_vibration_hdr">Keyboard Vibration</string>
+ <string name="act_vibration_hdr">Action Vibration</string>
+ <string name="button_vibration">Button Vibration:</string>
+ <string name="kb_vibration">Keyboard Vibration:</string>
+ <string name="act_vibration">Action Vibration:</string>
+ <string name="select_language">Select Language:</string>
+ <string name="sel_lang_btn">Select Language</string>
+ <string name="set_language_btn">Set Language</string>
+ <string name="advanced_hdr">Advanced</string>
+ <string name="copy_log_confirm">Copy Log to SD Card?</string>
+ <string name="copying_log" version="2">Copying Logs to SD Card...</string>
+ <string name="copy_log_complete" version="2">Logs Copy Complete</string>
+ <string name="fix_context_btn">Fix Contexts</string>
+ <string name="part_sd_btn">Partition SD Card</string>
+ <string name="part_sd_s_btn">SD Card</string>
+ <string name="file_manager_btn">File Manager</string>
+ <string name="language_hdr">Language</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Reload Theme</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Inject TWRP</string>
+ <string name="inject_twrp_confirm">Re-Inject TWRP?</string>
+ <string name="injecting_twrp">Re-Injecting TWRP...</string>
+ <string name="inject_twrp_complete">TWRP Injection Complete</string>
+ <string name="swipe_to_confirm">Swipe to Confirm</string>
+ <string name="part_sd_hdr">Partition SD Card</string>
+ <string name="invalid_partsd_sel">You must select a removable device</string>
+ <string name="part_sd_lose">You will lose all files on your SD card!</string>
+ <string name="part_sd_undo">This action cannot be undone!</string>
+ <string name="part_sd_ext_sz">EXT Size:</string>
+ <string name="part_sd_swap_sz">Swap Size:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">File System:</string>
+ <string name="swipe_part_sd">Swipe to Partition</string>
+ <string name="swipe_part_sd_s">Partition</string>
+ <string name="partitioning_sd">Partitioning SD Card...</string>
+ <string name="partitioning_sd2">This will take a few minutes.</string>
+ <string name="part_sd_complete">Partitioning Complete</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Restore Original Boot</string>
+ <string name="dumlock_restore_confirm">Restore original boot image?</string>
+ <string name="dumlock_restoring">Restoring Original Boot...</string>
+ <string name="dumlock_restore_complete">Restore Original Boot Complete</string>
+ <string name="dumlock_reflash_btn">Reflash Recovery</string>
+ <string name="dumlock_reflash_confirm">Reflash recovery to boot?</string>
+ <string name="dumlock_reflashing">Flashing recovery to boot...</string>
+ <string name="dumlock_reflash_complete">Recovery Flash to Boot Complete</string>
+ <string name="dumlock_install_btn">Install HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Install HTC dumlock files to ROM?</string>
+ <string name="dumlock_installing">Installing HTC Dumlock...</string>
+ <string name="dumlock_install_complete">HTC Dumlock Install Complete</string>
+ <string name="swipe_to_unlock">Swipe to Unlock</string>
+ <string name="swipe_unlock"> Unlock</string>
+ <string name="fm_hdr">File Manager</string>
+ <string name="fm_sel_file">Select a File or Folder</string>
+ <string name="fm_type_folder">Folder</string>
+ <string name="fm_type_file">File</string>
+ <string name="fm_choose_act">Choose Action</string>
+ <string name="fm_selected">%tw_fm_type% selected:</string>
+ <string name="fm_copy_btn">Copy</string>
+ <string name="fm_copy_file_btn">Copy File</string>
+ <string name="fm_copy_folder_btn">Copy Folder</string>
+ <string name="fm_copying">Copying</string>
+ <string name="fm_move_btn">Move</string>
+ <string name="fm_moving">Moving</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Delete</string>
+ <string name="fm_deleting">Deleting</string>
+ <string name="fm_rename_btn">Rename</string>
+ <string name="fm_rename_file_btn">Rename File</string>
+ <string name="fm_rename_folder_btn">Rename Folder</string>
+ <string name="fm_renaming">Renaming</string>
+ <string name="fm_sel_dest">Select Destination Folder</string>
+ <string name="fm_sel_curr_folder">Select Current Folder</string>
+ <string name="fm_rename_hdr">Rename</string>
+ <string name="fm_set_perms_hdr">Set Permissions</string>
+ <string name="fm_perms">Permissions:</string>
+ <string name="fm_complete">File Operation Complete</string>
+ <string name="decrypt_data_hdr">Decrypt Data</string>
+ <string name="decrypt_data_enter_pass">Enter Password.</string>
+ <string name="decrypt_data_failed">Password failed, please try again!</string>
+ <string name="decrypt_data_failed_pattern">Pattern failed, please try again!</string>
+ <string name="decrypt_data_enter_pattern">Enter Pattern.</string>
+ <string name="decrypt_data_trying">Trying Decryption</string>
+ <string name="decrypt_data_vold_os_missing">Missing files needed for vold decrypt: {1}</string>
+ <string name="term_hdr">Terminal Command</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">KILL</string>
+ <string name="term_sel_folder_hdr">Browse to Starting Folder</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Wipe Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Wipe Cache</string>
+ <string name="swipe_to_sideload">Swipe to Start Sideload</string>
+ <string name="swipe_sideload"> Start</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Usage: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload Complete</string>
+ <string name="fix_contexts_hdr">Fix Contexts</string>
+ <string name="fix_contexts_note1">Note: Fixing contexts is rarely needed.</string>
+ <string name="fix_contexts_note2">Fixing SELinux Contexts may cause</string>
+ <string name="fix_contexts_note3">your device to not boot properly.</string>
+ <string name="swipe_to_fix_contexts">Swipe to Fix Contexts</string>
+ <string name="swipe_fix_contexts"> Fix Contexts</string>
+ <string name="fixing_contexts">Fixing Contexts...</string>
+ <string name="fix_contexts_complete">Fix Contexts Complete</string>
+ <string name="reboot_hdr">Reboot</string>
+ <string name="su_hdr">SuperSU Check</string>
+ <string name="su_note1">Your device does not appear to be rooted.</string>
+ <string name="su_note2">Install SuperSU now?</string>
+ <string name="su_note3">This will root your device.</string>
+ <string name="su_cancel">Do Not Install</string>
+ <string name="swipe_su_to_install">Swipe to Install</string>
+ <string name="swipe_su_install"> Install</string>
+ <string name="su_installing">Installing SuperSU</string>
+ <string name="sel_storage_list">Select Storage</string>
+ <string name="ok_btn">OK</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Kernel does not have support for reading SELinux contexts.</string>
+ <string name="full_selinux">Full SELinux support is present.</string>
+ <string name="no_selinux">No SELinux support (no libselinux).</string>
+ <string name="mtp_enabled">MTP Enabled</string>
+ <string name="mtp_crash">MTP Crashed, not starting MTP on boot.</string>
+ <string name="decrypt_success">Successfully decrypted with default password.</string>
+ <string name="unable_to_decrypt">Unable to decrypt with default password. You may need to perform a Format Data.</string>
+ <string name="generating_md51">Generating MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Generating md5...</string>
+ <string name="md5_created"> * MD5 Created.</string>
+ <string name="md5_error"> * MD5 Error!</string>
+ <string name="md5_compute_error"> * Error computing MD5.</string>
+ <string name="current_date">(Current Date)</string>
+ <string name="auto_generate">(Auto Generate)</string>
+ <string name="unable_to_locate_partition">Unable to locate '{1}' partition for backup calculations.</string>
+ <string name="no_partition_selected">No partitions selected for backup.</string>
+ <string name="total_partitions_backup"> * Total number of partitions to back up: {1}</string>
+ <string name="total_backup_size"> * Total size of all data: {1}MB</string>
+ <string name="available_space"> * Available space: {1}MB</string>
+ <string name="unable_locate_storage">Unable to locate storage device.</string>
+ <string name="no_space">Not enough free space on storage.</string>
+ <string name="backup_started">[BACKUP STARTED]</string>
+ <string name="backup_folder"> * Backup Folder: {1}</string>
+ <string name="fail_backup_folder">Failed to make backup folder.</string>
+ <string name="avg_backup_fs">Average backup rate for file systems: {1} MB/sec</string>
+ <string name="avg_backup_img">Average backup rate for imaged drives: {1} MB/sec</string>
+ <string name="total_backed_size">[{1} MB TOTAL BACKED UP]</string>
+ <string name="backup_completed">[BACKUP COMPLETED IN {1} SECONDS]</string>
+ <string name="restore_started">[RESTORE STARTED]</string>
+ <string name="restore_folder">Restore folder: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} done ({2} seconds)]</string>
+ <string name="verifying_md5">Verifying MD5</string>
+ <string name="skip_md5">Skipping MD5 check based on user setting.</string>
+ <string name="calc_restore">Calculating restore details...</string>
+ <string name="restore_read_only">Cannot restore {1} -- mounted read only.</string>
+ <string name="restore_unable_locate">Unable to locate '{1}' partition for restoring.</string>
+ <string name="no_part_restore">No partitions selected for restore.</string>
+ <string name="restore_part_count">Restoring {1} partitions...</string>
+ <string name="total_restore_size">Total restore size is {1}MB</string>
+ <string name="updating_system_details">Updating System Details</string>
+ <string name="restore_completed">[RESTORE COMPLETED IN {1} SECONDS]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Error opening: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Unable to locate partition by backup name: '{1}'</string>
+ <string name="unable_find_part_path">Unable to find partition for path '{1}'</string>
+ <string name="update_part_details">Updating partition details...</string>
+ <string name="update_part_details_done">...done</string>
+ <string name="wiping_dalvik">Wiping Dalvik Cache Directories...</string>
+ <string name="cleaned">Cleaned: {1}...</string>
+ <string name="dalvik_done">-- Dalvik Cache Directories Wipe Complete!</string>
+ <string name="no_andsec">No android secure partitions found.</string>
+ <string name="unable_to_locate">Unable to locate {1}.</string>
+ <string name="wiping_datamedia">Wiping internal storage -- /data/media...</string>
+ <string name="unable_to_mount">Unable to mount {1}</string>
+ <string name="unable_to_mount_internal">Unable to mount internal_storage</string>
+ <string name="unable_to_mount_storage">Unable to mount storage</string>
+ <string name="fail_decrypt">Failed to decrypt data.</string>
+ <string name="no_crypto_support">No crypto support was compiled into this build.</string>
+ <string name="decrypt_success_dev">Data successfully decrypted, new block device: '{1}'</string>
+ <string name="decrypt_success_nodev">Data successfully decrypted</string>
+ <string name="done">Done.</string>
+ <string name="start_partition_sd">Partitioning SD Card...</string>
+ <string name="partition_sd_locate">Unable to locate device to partition.</string>
+ <string name="ext_swap_size">EXT + Swap size is larger than sdcard size.</string>
+ <string name="remove_part_table">Removing partition table...</string>
+ <string name="unable_rm_part">Unable to remove partition table.</string>
+ <string name="create_part">Creating {1} partition...</string>
+ <string name="unable_to_create_part">Unable to create {1} partition.</string>
+ <string name="format_sdext_as">Formatting sd-ext as {1}...</string>
+ <string name="part_complete">Partitioning complete.</string>
+ <string name="unable_to_open">Unable to open '{1}'.</string>
+ <string name="mtp_already_enabled">MTP already enabled</string>
+ <string name="mtp_fail">Failed to enable MTP</string>
+ <string name="no_mtp">MTP support not included</string>
+ <string name="image_flash_start">[IMAGE FLASH STARTED]</string>
+ <string name="img_to_flash">Image to flash: '{1}'</string>
+ <string name="flash_unable_locate">Unable to locate '{1}' partition for flashing.</string>
+ <string name="no_part_flash">No partitions selected for flashing.</string>
+ <string name="too_many_flash">Too many partitions selected for flashing.</string>
+ <string name="invalid_flash">Invalid flash partition specified.</string>
+ <string name="flash_done">[IMAGE FLASH COMPLETED]</string>
+ <string name="wiping">Wiping {1}</string>
+ <string name="repair_not_exist">{1} does not exist! Cannot repair!</string>
+ <string name="repairing_using">Repairing {1} using {2}...</string>
+ <string name="unable_repair">Unable to repair {1}.</string>
+ <string name="mount_data_footer">Could not mount /data and unable to find crypto footer.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Can not create '{1}' folder ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Failed to mount '{1}' ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">Failed to unmount '{1}' ({2})</string>
+ <string name="cannot_resize">Cannot resize {1}.</string>
+ <string name="repair_resize">Repairing {1} before resizing.</string>
+ <string name="unable_resize">Unable to resize {1}.</string>
+ <string name="no_md5_found">No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.</string>
+ <string name="md5_fail_match">MD5 failed to match on '{1}'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Failed to decrypt tar file '{1}'</string>
+ <string name="format_data_msg">You may need to reboot recovery to be able to use /data again.</string>
+ <string name="format_data_err">Unable to format to remove encryption.</string>
+ <string name="formatting_using">Formatting {1} using {2}...</string>
+ <string name="unable_to_wipe">Unable to wipe {1}.</string>
+ <string name="cannot_wipe">Partition {1} cannot be wiped.</string>
+ <string name="remove_all">Removing all files under '{1}'</string>
+ <string name="wiping_data">Wiping data without wiping /data/media ...</string>
+ <string name="backing_up">Backing up {1}...</string>
+ <string name="backup_storage_warning">Backups of {1} do not include any files in internal storage such as pictures or downloads.</string>
+ <string name="backing">Backing Up</string>
+ <string name="backup_size">Backup file size for '{1}' is 0 bytes.</string>
+ <string name="datamedia_fs_restore">WARNING: This /data backup was made with {1} file system! The backup may not boot unless you change back to {1}.</string>
+ <string name="restoring">Restoring {1}...</string>
+ <string name="restoring_hdr">Restoring</string>
+ <string name="recreate_folder_err">Unable to recreate {1} folder.</string>
+ <string name="img_size_err">Size of image is larger than target device</string>
+ <string name="flashing">Flashing {1}...</string>
+ <string name="backup_folder_set">Backup folder set to '{1}'</string>
+ <string name="locate_backup_err">Unable to locate backup '{1}'</string>
+ <string name="set_restore_opt">Setting restore options: '{1}':</string>
+ <string name="md5_check_skip">MD5 check skip is on</string>
+ <string name="ors_encrypt_restore_err">Unable to use OpenRecoveryScript to restore an encrypted backup.</string>
+ <string name="mounting">Mounting</string>
+ <string name="unmounting">Unmounting</string>
+ <string name="mounted">Mounted '{1}'</string>
+ <string name="unmounted">Unmounted '{1}'</string>
+ <string name="setting">Setting '{1}' to '{2}'</string>
+ <string name="setting_empty">Setting '{1}' to empty</string>
+ <string name="making_dir1">Making Directory</string>
+ <string name="making_dir2">Making directory: '{1}'</string>
+ <string name="running_command">Running Command</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Starting ADB sideload feature...</string>
+ <string name="need_new_adb">You need adb 1.0.32 or newer to sideload to this device.</string>
+ <string name="no_pwd">No password provided.</string>
+ <string name="done_ors">Done processing script file</string>
+ <string name="injecttwrp">Injecting TWRP into boot image...</string>
+ <string name="zip_err">Error installing zip file '{1}'</string>
+ <string name="installing_zip">Installing zip file '{1}'</string>
+ <string name="select_backup_opt">Setting backup options:</string>
+ <string name="compression_on">Compression is on</string>
+ <string name="md5_off">MD5 Generation is off</string>
+ <string name="backup_fail">Backup Failed</string>
+ <string name="backup_clean">Backup Failed. Cleaning Backup Folder.</string>
+ <string name="running_recovery_commands">Running Recovery Commands</string>
+ <string name="recovery_commands_complete">Recovery Commands Complete</string>
+ <string name="running_ors">Running OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript Complete</string>
+ <string name="invalid_zip_format">Invalid zip file format!</string>
+ <string name="check_for_md5">Checking for MD5 file...</string>
+ <string name="fail_sysmap">Failed to map file '{1}'</string>
+ <string name="verify_zip_sig">Verifying zip signature...</string>
+ <string name="verify_zip_fail">Zip signature verification failed!</string>
+ <string name="verify_zip_done">Zip signature verified successfully.</string>
+ <string name="zip_corrupt">Zip file is corrupt!</string>
+ <string name="no_md5">Skipping MD5 check: no MD5 file found</string>
+ <string name="md5_fail">MD5 does not match</string>
+ <string name="md5_match">MD5 matched</string>
+ <string name="pid_signal">{1} process ended with signal: {2}</string>
+ <string name="pid_error">{1} process ended with ERROR: {2}</string>
+ <string name="install_dumlock">Installing HTC Dumlock to system...</string>
+ <string name="dumlock_restore">Restoring original boot...</string>
+ <string name="dumlock_reflash">Reflashing recovery to boot...</string>
+ <string name="run_script">Running {1} script...</string>
+ <string name="rename_stock">Renamed stock recovery file in /system to prevent the stock ROM from replacing TWRP.</string>
+ <string name="split_backup">Breaking backup file into multiple archives...</string>
+ <string name="backup_error">Error creating backup.</string>
+ <string name="restore_error">Error during restore process.</string>
+ <string name="split_thread">Splitting thread ID {1} into archive {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu of %llu files, %i%%</string>
+ <string name="size_progress">%lluMB of %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Attempting to decrypt data partition via command line.</string>
+ <string name="base_pkg_err">Failed to load base packages.</string>
+ <string name="simulating">Simulating actions...</string>
+ <string name="backup_cancel">Backup Cancelled</string>
+ <string name="config_twrp">Configuring TWRP...</string>
+ <string name="config_twrp_err">Unable to configure TWRP with this kernel.</string>
+ <string name="copy_log">Copied recovery log to {1}.</string>
+ <string name="max_queue">Maximum zip queue reached!</string>
+ <string name="min_queue">Minimum zip queue reached!</string>
+ <string name="screenshot_saved">Screenshot was saved to {1}</string>
+ <string name="screenshot_err">Failed to take a screenshot!</string>
+ <string name="zip_wipe_cache">One or more zip requested a cache wipe -- Wiping cache now.</string>
+ <string name="and_sec_wipe_err">Unable to wipe android secure</string>
+ <string name="dalvik_wipe_err">Failed to wipe dalvik</string>
+ <string name="auto_gen">(Auto Generate)</string>
+ <string name="curr_date">(Current Date)</string>
+ <string name="backup_name_len">Backup name is too long.</string>
+ <string name="backup_name_invalid">Backup name '{1}' contains invalid character: '{1}'</string>
+ <string name="no_real_sdcard">This device does not have a real SD Card! Aborting!</string>
+ <string name="cancel_sideload">Cancelling ADB sideload...</string>
+ <string name="change_fs_err">Error changing file system.</string>
+ <string name="theme_ver_err">Custom theme version does not match TWRP version. Using stock theme.</string>
+ <string name="up_a_level">(Up A Level)</string>
+ <string name="install_reboot" version="2">Rebooting in %tw_sleep% second(s)</string>
+ <string name="adbbackup_error">Error with ADB Backup. Quitting..."</string>
+ <string name="adbbackup_control_error">Cannot write to adb control channel</string>
+ <string name="twrp_adbbu_option">--twrp option is required to enable twrp adb backup</string>
+ <string name="partition_not_found">path: {1} not found in partititon list</string>
+ <string name="copy_kernel_log">Copied kernel log to {1}</string>
+ <string name="include_kernel_log">Include Kernel Log</string>
+ <string name="unable_set_boot_slot">Error changing bootloader boot slot to {1}</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/es.xml b/gui/theme/common/languages/es.xml
new file mode 100644
index 000000000..6fd693906
--- /dev/null
+++ b/gui/theme/common/languages/es.xml
@@ -0,0 +1,655 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Spanish</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">Sistema</string>
+ <string name="system_image">Imagen del Sistema</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Imagen del Vendor</string>
+ <string name="boot">Inicio</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Caché</string>
+ <string name="data">Datos</string>
+ <string name="sdcard">Tarjeta SD</string>
+ <string name="internal">Memoria Interna</string>
+ <string name="microsd">Tarjeta Micro SD</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Caché</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Datos adoptados</string>
+ <string name="adopted_storage">Memoria adoptada</string>
+ <string name="twrp_header">Proyecto Team Win Recovery</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Batería: %tw_battery%</string>
+ <string name="sort_by_name">Ordenar por Nombre</string>
+ <string name="sort_by_date">Ordenar por Fecha</string>
+ <string name="sort_by_size">Ordenar por Tamaño</string>
+ <string name="sort_by_name_only">Nombre</string>
+ <string name="sort_by_date_only">Fecha</string>
+ <string name="sort_by_size_only">Tamaño</string>
+ <string name="tab_general">GENERAL</string>
+ <string name="tab_options">OPCIONES</string>
+ <string name="tab_backup">COPIA DE SEGURIDAD</string>
+ <string name="tab_time_zone">ZONA HORARIA</string>
+ <string name="tab_screen">PANTALLA</string>
+ <string name="tab_vibration">VIBRACIÓN</string>
+ <string name="tab_language">LENGUAJE</string>
+ <string name="install_btn">Instalar</string>
+ <string name="wipe_btn">Limpiar</string>
+ <string name="backup_btn">Copia de seguridad</string>
+ <string name="restore_btn">Restaurar</string>
+ <string name="mount_btn">Montar</string>
+ <string name="settings_btn">Ajustes</string>
+ <string name="advanced_btn">Avanzado</string>
+ <string name="reboot_btn">Reinicio</string>
+ <string name="files_btn">Archivos</string>
+ <string name="copy_log_btn">Copiar Log</string>
+ <string name="select_type_hdr">Seleccionar Tipo</string>
+ <string name="install_zip_hdr">Instalar Zip</string>
+ <string name="install_zip_btn">Instalar Zip</string>
+ <string name="install_image_hdr">Instalar Imagen</string>
+ <string name="install_image_btn">Instalar Imagen</string>
+ <string name="install_select_file_hdr">Seleccionar Archivo</string>
+ <string name="file_selector_folders_hdr">Carpetas</string>
+ <string name="select_file_from_storage">Seleccionar Archivo desde %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">Carga archivo por ADB</string>
+ <string name="install_hdr">Instalar</string>
+ <string name="select_storage_hdr">Seleccionar Almacenamiento</string>
+ <string name="select_storage_btn">Seleccionar Almacenamiento</string>
+ <string name="queue_hdr">Cola</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% de un máximo de 10 archivos en cola</string>
+ <string name="zip_queue_count_s">Archivo %tw_zip_queue_count% de 10:</string>
+ <string name="zip_warn1">Esta operación podría instalar software</string>
+ <string name="zip_warn2">incompatible y dejar tu dispositivo inutilizable.</string>
+ <string name="zip_back_cancel">Pulsa el botón de atrás para cancelar el añadir este zip.</string>
+ <string name="zip_back_clear">Pulsa el botón de atrás para limpiar la cola.</string>
+ <string name="folder">Carpeta:</string>
+ <string name="file">Archivo:</string>
+ <string name="zip_sig_chk">Verificar la firma del archivo</string>
+ <string name="inject_twrp_chk">Injectar TWRP después de instalar</string>
+ <string name="install_reboot_chk">Reiniciar después de completar la instalación</string>
+ <string name="options_hdr">Opciones</string>
+ <string name="confirm_flash_hdr">Confirmar el Flasheo</string>
+ <string name="zip_queue">Cola:</string>
+ <string name="options">Opciones:</string>
+ <string name="swipe_confirm"> Confirmar</string>
+ <string name="zip_add_btn">Añadir más Zips</string>
+ <string name="zip_clear_btn">Limpiar cola de Zips</string>
+ <string name="install_zip_count_hdr">Instalar Zip %tw_zip_index% de %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Instalando Zip: %tw_file%</string>
+ <string name="failed">Fallido</string>
+ <string name="successful">Éxito</string>
+ <string name="install_failed">Instalación Fallida</string>
+ <string name="install_successful">Instalación Exitosa</string>
+ <string name="wipe_cache_dalvik_btn">Limpiar caché/dalvik</string>
+ <string name="reboot_system_btn">Reiniciar Sistema</string>
+ <string name="install_sel_target">Seleccionar Partición de Destino</string>
+ <string name="flash_image_select">Seleccionar Partición para Flashear Imagen:</string>
+ <string name="target_partition">Partición de Destino:</string>
+ <string name="flashing_image">Flasheando Imagen...</string>
+ <string name="image_flashed">Image Flashed</string>
+ <string name="wipe_cache_dalvik_confirm">Limpiar Caché &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Limpiando Caché &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Caché &amp; Dalvik Limpieza Completa</string>
+ <string name="swipe_wipe">Desliza para Limpiar</string>
+ <string name="swipe_wipe_s"> Limpiar</string>
+ <string name="no_os1">¡No hay SO Instalado!</string>
+ <string name="no_osrb">¿Estás seguro de que quieres reiniciar?</string>
+ <string name="no_ospo">¿Estás seguro de que quieres apagar?</string>
+ <string name="rebooting">Reiniciando…</string>
+ <string name="swipe_reboot">Desliza para Reiniciar</string>
+ <string name="swipe_reboot_s"> Reiniciar</string>
+ <string name="swipe_flash">Desliza para confirmar el Flasheo</string>
+ <string name="confirm_action">Confirmar Acción</string>
+ <string name="back_cancel">Pulsa el botón atrás para cancelar.</string>
+ <string name="cancel_btn">Cancelar</string>
+ <string name="wipe_hdr">Limpiar</string>
+ <string name="factory_reset_hdr">Restablecimiento de Fábrica</string>
+ <string name="factory_reset_btn">Restablecimiento de Fábrica</string>
+ <string name="factory_reset1">Limpiar Datos, Caché y Dalvik</string>
+ <string name="factory_reset2">(no incluye almacenamiento interno)</string>
+ <string name="factory_reset3">La mayoría de las veces esta es</string>
+ <string name="factory_reset4">la única limpieza que necesitas.</string>
+ <string name="factory_resetting">Restablecimiento de Fábrica...</string>
+ <string name="advanced_wipe_hdr">Limpieza Avanzada</string>
+ <string name="advanced_wipe_btn">Limpieza Avanzada</string>
+ <string name="wipe_enc_confirm">¿Quitar la encriptación de Datos?</string>
+ <string name="formatting_data">Formateando Datos...</string>
+ <string name="swipe_format_data">Desliza para Formatear Datos</string>
+ <string name="swipe_format_data_s"> Formatear Datos</string>
+ <string name="factory_reset_complete">Restablecimiento de Fábrica Completo</string>
+ <string name="sel_part_hdr">Seleccionar Partición(es)</string>
+ <string name="wipe_sel_confirm">Limpiar Partición(es) Seleccionadas?</string>
+ <string name="wiping_part">Limpiando Partición(es)...</string>
+ <string name="wipe_complete">Limpieza Completa</string>
+ <string name="sel_part_wipe">Seleccionar Partición(es) a Limpiar:</string>
+ <string name="invalid_part_sel">Selección de partición inválida</string>
+ <string name="format_data_hdr">Formatear Datos</string>
+ <string name="format_data_btn">Formatear Datos</string>
+ <string name="format_data_ptr1">Formatear Datos eliminará todas tus aplicaciones,</string>
+ <string name="format_data_ptr2">copias de seguridad, imágenes, vídeos, media y</string>
+ <string name="format_data_ptr3">quita la encriptación del almacenamiento interno.</string>
+ <string name="format_data_adopted">Incluyendo Almacenamiento Adoptado</string>
+ <string name="format_data_lcp1">Formatear Datos elimina todas tus aplicaciones, copias de seguridad, imágenes, vídeos, media, y</string>
+ <string name="format_data_lcp2">quita la encriptación del almacenamiento interno.</string>
+ <string name="format_data_wtc1">Formatear Datos limpiará todas tus aplicaciones,</string>
+ <string name="format_data_wtc2">copias de seguridad y media. Esto no se puede deshacer.</string>
+ <string name="format_data_undo">Esto no se puede deshacer.</string>
+ <string name="format_data_complete">Formateo de Datos Completo</string>
+ <string name="yes_continue">Escribe sí para continuar. Pulsa atrás para cancelar.</string>
+ <string name="part_opt_hdr">Opciones de Partición para: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Seleccionar Acción</string>
+ <string name="file_sys_opt">Opciones de Sistema de Archivos</string>
+ <string name="partition">Partición: %tw_partition_name%</string>
+ <string name="part_mount_point">Opción de Montaje: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Sistema de archivo: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Presente: Sí</string>
+ <string name="part_present_no">Presente: No</string>
+ <string name="part_removable_yes">Extraíble: Sí</string>
+ <string name="part_removable_no">Extraíble: No</string>
+ <string name="part_size">Tamaño: %tw_partition_size%MB</string>
+ <string name="part_used">En uso: %tw_partition_used%MB</string>
+ <string name="part_free">Libre: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Tamaño copia de seguridad: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Cambiar el tamaño del Sistema de Archivos</string>
+ <string name="resize_btn_s">Cambiar tamaño</string>
+ <string name="resize_confirm">Cambiar tamaño %tw_partition_name%?</string>
+ <string name="resizing">Cambiando el tamaño...</string>
+ <string name="resize_complete">Cambio de tamaño completo</string>
+ <string name="swipe_resize">Desliza para Cambiar el tamaño</string>
+ <string name="swipe_resize_s"> Cambiar tamaño</string>
+ <string name="repair_btn">Reparar Sistema de Archivos</string>
+ <string name="repair_btn_s">Reparar</string>
+ <string name="repair_confirm">Reparar %tw_partition_name%?</string>
+ <string name="repairing">Reparando...</string>
+ <string name="repair_complete">Reparación Completa</string>
+ <string name="swipe_repair">Desliza para Reparar</string>
+ <string name="swipe_repair_s"> Reparar</string>
+ <string name="change_fs_btn">Cambiar el Sistema de Archivos</string>
+ <string name="change_fs_btn_s">Cambio</string>
+ <string name="change_fs_for_hdr">Cambiar Sistema de Archivos a: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partición: %tw_partition_name% &gt; Seleccionar Sistema de Archivos</string>
+ <string name="change_fs_warn1">Algunas ROMs o kernels quizás no soporten algunos</string>
+ <string name="change_fs_warn2">sistemas de archivos. Procede con cautela!</string>
+ <string name="change_fs_confirm">Cambiar %tw_partition_name%?</string>
+ <string name="formatting">Formateando...</string>
+ <string name="format_complete">Formateo Completo</string>
+ <string name="swipe_change_fs">Desliza para Cambiar</string>
+ <string name="swipe_change_s"> Cambiar</string>
+ <string name="back_btn">Atrás</string>
+ <string name="wipe_enc_btn">Limpiar Encriptación</string>
+ <string name="swipe_factory_reset">Desliza para Restablecer de Fábrica</string>
+ <string name="repair_change_btn">Reparar ó Cambiar Sistema de Archivos</string>
+ <string name="storage_hdr">Almacenamiento: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Copia de Seguridad</string>
+ <string name="backup_confirm_hdr">Confirmar Copia de Seguridad</string>
+ <string name="encryption_tab">ENCRIPTACIÓN</string>
+ <string name="encryption">Encriptación:</string>
+ <string name="name">Nombre:</string>
+ <string name="sel_part_backup">Seleccionar Partición(es) para Copia de Seguridad:</string>
+ <string name="storage">Almacenamiento:</string>
+ <string name="enc_disabled">desactivado - establezca una contraseña para activar</string>
+ <string name="enc_enabled">activado</string>
+ <string name="enable_backup_comp_chk">Habilitar compresión</string>
+ <string name="skip_md5_backup_chk">Saltar generación MD5 durante respaldo</string>
+ <string name="disable_backup_space_chk">Desactivar comprobación de Espacio Libre</string>
+ <string name="refresh_sizes_btn">Refrescar Tamaños</string>
+ <string name="swipe_backup">Desliza para Respaldar</string>
+ <string name="append_date_btn">Ajustar Fecha</string>
+ <string name="backup_name_exists">Ya existe una copia de seguridad con este nombre.</string>
+ <string name="encrypt_backup">Cifrar tú Copia de seguridad?</string>
+ <string name="enter_pass">Introducir tú contraseña:</string>
+ <string name="enter_pass2">Introducir tú contraseña de nuevo:</string>
+ <string name="pass_not_match">Las Contraseñas no coinciden!</string>
+ <string name="partitions">Particiones:</string>
+ <string name="disabled">Desactivado</string>
+ <string name="enabled">Activado</string>
+ <string name="backup_name_hdr">Establecer nombre de copia de seguridad</string>
+ <string name="progress">Progreso:</string>
+ <string name="backup_complete">¡Copia de seguridad completa!</string>
+ <string name="restore_hdr">Restaurar</string>
+ <string name="sel_backup_hdr">Selecciona la Copia de Seguridad</string>
+ <string name="restore_sel_store_hdr">Seleccionar Copia de Seguridad de %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Selecciona el Paquete para Restaurar:</string>
+ <string name="restore_enc_backup_hdr">Copia de Seguridad Cifrada</string>
+ <string name="restore_dec_fail">¡Contraseña incorrecta, inténtelo de nuevo!</string>
+ <string name="del_backup_btn">Eliminar Copia de seguridad</string>
+ <string name="del_backup_confirm">Eliminar Copia de Seguridad?</string>
+ <string name="del_backup_confirm2">Esto no se puede deshacer!</string>
+ <string name="deleting_backup">Eliminando Copia de Seguridad...</string>
+ <string name="backup_deleted">Eliminar Copia de Seguridad Completado</string>
+ <string name="swipe_delete">Desliza para Eliminar</string>
+ <string name="swipe_delete_s"> Eliminar</string>
+ <string name="restore_try_decrypt">Copia de seguridad cifrada - Intentando Desencriptarla</string>
+ <string name="restore_try_decrypt_s">Intentando Desencriptarla</string>
+ <string name="restore_backup_date">Copia de seguridad creada en %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Selecciona las Particiones para Restaurar:</string>
+ <string name="restore_enable_md5_chk">Activar Verificación MD5 de la copia de seguridad</string>
+ <string name="restore_complete">Restauración Completa</string>
+ <string name="swipe_restore">Desliza para Restaurar</string>
+ <string name="swipe_restore_s"> Restaurar</string>
+ <string name="rename_backup_hdr">Renombrar Copia de Seguridad</string>
+ <string name="rename_backup_confirm">Renombrar Copia de Seguridad?</string>
+ <string name="rename_backup_confirm2">Esto no se puede Deshacer!</string>
+ <string name="renaming_backup">Renombrando Copia de Seguridad...</string>
+ <string name="rename_backup_complete">Renombrar Copia de Seguridad Completado</string>
+ <string name="swipe_to_rename">Desliza para Renombrar</string>
+ <string name="swipe_rename"> Renombrar</string>
+ <string name="confirm_hdr">Confirmar</string>
+ <string name="mount_hdr">Montar</string>
+ <string name="mount_sel_part">Selecciona las Particiones para Montar:</string>
+ <string name="mount_sys_ro_chk">Montar partición de sistema en modo lectura</string>
+ <string name="mount_sys_ro_s_chk">Montar System RO</string>
+ <string name="decrypt_data_btn">Desencritar Data</string>
+ <string name="disable_mtp_btn">Desactivar MTP</string>
+ <string name="enable_mtp_btn">Activar MTP</string>
+ <string name="mount_usb_storage_btn">Montar Almacenamiento USB</string>
+ <string name="usb_storage_hdr">Almacenamiento USB</string>
+ <string name="usb_stor_mnt1">Almacenamiento USB Montado</string>
+ <string name="usb_stor_mnt2">¡Asegúrese de retirar de forma segura el dispositivo</string>
+ <string name="usb_stor_mnt3">de el ordenador antes de desmontar!</string>
+ <string name="unmount_btn">Desmontar</string>
+ <string name="rb_system_btn">Sistema</string>
+ <string name="rb_poweroff_btn">Apagar</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Descarga</string>
+ <string name="turning_off">Apagando...</string>
+ <string name="swipe_power_off">Deslice para Apagar</string>
+ <string name="swipe_power_off_s">Apagar</string>
+ <string name="sys_ro_hdr">Particion de sistema sin modificar</string>
+ <string name="sys_ro_keep">Mantener Sitema solo lectura</string>
+ <string name="sys_rop1">TWRP puede dejar sin modificar la partición del sistema</string>
+ <string name="sys_rop2">para que sea más fácil para usted instalar actualizaciones oficiales.</string>
+ <string name="sys_rop3">TWRP será incapaz de impedir que la stock ROM</string>
+ <string name="sys_rop4">sustituya TWRP y no ofrecerá rootear su dispositivo.</string>
+ <string name="sys_rop5">Instalación de zips o la realización de operaciones adb aún puede</string>
+ <string name="sys_rop6">modificar la partición del sistema.</string>
+ <string name="sys_rol1">TWRP puede dejar sin modificar la partición del sistema para que sea más fácil para usted instalar actualizaciones oficiales.</string>
+ <string name="sys_rol2">TWRP será incapaz de impedir que la stock ROM sustituya TWRP y no ofrecerá rootear su dispositivo.</string>
+ <string name="sys_rol3">Instalación de zips o la realización de operaciones adb aún puede modificar la partición del sistema.</string>
+ <string name="sys_ro_never_show_chk">No mostrar nunca más esta pantalla durante el inicio</string>
+ <string name="sys_ro_keep_ro_btn">Mantener modo lectura</string>
+ <string name="swipe_allow_mod">Deslice para Permitir Modificaciones</string>
+ <string name="swipe_allow_mod_s">Permitir Modificaciones</string>
+ <string name="settings_hdr">Ajustes</string>
+ <string name="settings_gen_hdr">General</string>
+ <string name="settings_gen_s_hdr">General</string>
+ <string name="settings_gen_btn">General</string>
+ <string name="use_rmrf_chk">Usar rm -rf en lugar de formateo</string>
+ <string name="use24clock_chk">Usar reloj 24-horas </string>
+ <string name="rev_navbar_chk">Invertir posición de la barra de navegacion</string>
+ <string name="simact_chk">Simulate actions for theme testing</string>
+ <string name="simfail_chk">Simular fallos de acciones</string>
+ <string name="ctr_navbar_rdo">Centrar Botones de la barra de navegacion</string>
+ <string name="lft_navbar_rdo">Diseño de barra de navegación Invertida izquirda</string>
+ <string name="rht_navbar_rdo">Diseño de barra de navegación Invertida derecha</string>
+ <string name="restore_defaults_btn">Restore Defaults</string>
+ <string name="settings_tz_btn">Zona Horaria</string>
+ <string name="settings_screen_btn">Pantalla</string>
+ <string name="settings_screen_bright_btn">Brillo de Pantalla</string>
+ <string name="settings_vibration_btn">Vibración</string>
+ <string name="settings_language_btn">Idioma</string>
+ <string name="time_zone_hdr">Zona Horaria</string>
+ <string name="sel_tz_list">Seleccione Zona Horaria:</string>
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Central Time</string>
+ <string name="utcm5">(UTC -5) Eastern Time</string>
+ <string name="utcm4">(UTC -4) Atlantic Time</string>
+ <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string>
+ <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string>
+ <string name="utcp3">(UTC +3) Moscow, Baghdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Eastern Australia, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Selecciona Variación (usualmente 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Ninguno</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Utilizar el horario de verano (DST)</string>
+ <string name="curr_tz">Zona Horaria Actual: %tw_time_zone%</string>
+ <string name="curr_tz_s">Zona Horaria Actual:</string>
+ <string name="set_tz_btn">Establecer Zona Horaria</string>
+ <string name="settings_screen_hdr">Pantalla</string>
+ <string name="settings_screen_timeout_hdr">Tiempo de espera de pantalla</string>
+ <string name="enable_timeout_chk">Activar tiempo de espera de pantalla</string>
+ <string name="screen_to_slider">Tiempo de espera de pantalla en segundos:</string>
+ <string name="screen_to_slider_s">Tiempo de espera de pantalla en segundos (0=disabled): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Ajustes de tiempo de espera de la pantalla no disponibles</string>
+ <string name="screen_bright_slider">Brillo: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Configuración de brillo no diponible</string>
+ <string name="vibration_hdr">Vibración</string>
+ <string name="button_vibration_hdr">Vibración de los Botones</string>
+ <string name="kb_vibration_hdr">Vibración del Teclado</string>
+ <string name="act_vibration_hdr">Vibración de Acciones</string>
+ <string name="button_vibration">Vibración de Botón:</string>
+ <string name="kb_vibration">Vibración de Teclado:</string>
+ <string name="act_vibration">Vibración de Acciones:</string>
+ <string name="select_language">Selecciona Idioma:</string>
+ <string name="sel_lang_btn">Seleccionar Idioma</string>
+ <string name="set_language_btn">Establecer Idioma</string>
+ <string name="advanced_hdr">Avanzado</string>
+ <string name="copy_log_confirm">Copiar Log a Tarjeta SD?</string>
+ <string name="copying_log">Copiando Log a Tarjeta SD...</string>
+ <string name="copy_log_complete">Copia del Log Completada</string>
+ <string name="fix_context_btn">Reparar Contextos</string>
+ <string name="part_sd_btn">Particionar Tarjeta SD</string>
+ <string name="part_sd_s_btn">Tarjeta SD</string>
+ <string name="file_manager_btn">Administrador de Archivos</string>
+ <string name="language_hdr">Idioma</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Recargar Tema</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Injectar TWRP</string>
+ <string name="inject_twrp_confirm">Re-Injectar TWRP?</string>
+ <string name="injecting_twrp">Re-Injectando TWRP...</string>
+ <string name="inject_twrp_complete">TWRP Injección Completa</string>
+ <string name="swipe_to_confirm">Desliza para Confirmar</string>
+ <string name="part_sd_hdr">Particionar Tarjeta SD</string>
+ <string name="invalid_partsd_sel">Debes seleccionar un dispositivo extraíble</string>
+ <string name="part_sd_lose">Perderá todos los archivos de la tarjeta SD!</string>
+ <string name="part_sd_undo">Esta Acción no se puede Deshacer!</string>
+ <string name="part_sd_ext_sz">Tamaño de EXT:</string>
+ <string name="part_sd_swap_sz">Tamaño de Intercambio:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Sistema de Archivos:</string>
+ <string name="swipe_part_sd">Desliza para Particionar</string>
+ <string name="swipe_part_sd_s">Particionar</string>
+ <string name="partitioning_sd">Particionando Tarjeta SD...</string>
+ <string name="partitioning_sd2">Esto puede tomar unos Minutos.</string>
+ <string name="part_sd_complete">Particionar Completado</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Restaurar Boot Original</string>
+ <string name="dumlock_restore_confirm">¿Restaurar imagen de boot original?</string>
+ <string name="dumlock_restoring">Restaurando boot Original...</string>
+ <string name="dumlock_restore_complete">Restauración del Boot Original Completado</string>
+ <string name="dumlock_reflash_btn">Reflashear Recovery</string>
+ <string name="dumlock_reflash_confirm">¿Reflashear recovery a boot?</string>
+ <string name="dumlock_reflashing">Flasheando recovery a boot...</string>
+ <string name="dumlock_reflash_complete">Flasheo del Recovery a Boot Completado</string>
+ <string name="dumlock_install_btn">Instalar HTC Dumlock</string>
+ <string name="dumlock_install_confirm">¿Instalar los archivos de HTC dumlock en la ROM?</string>
+ <string name="dumlock_installing">Instalando HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Instalación de HTC Dumlock Completada</string>
+ <string name="swipe_to_unlock">Desliza para Desbloquear</string>
+ <string name="swipe_unlock"> Desbloquear</string>
+ <string name="fm_hdr">Administrador de Archivos </string>
+ <string name="fm_sel_file">Selecciona un Archivo ó Carpeta</string>
+ <string name="fm_type_folder">Carpeta</string>
+ <string name="fm_type_file">Archivo</string>
+ <string name="fm_choose_act">Elija una Acción</string>
+ <string name="fm_selected">%tw_fm_type% seleccionado:</string>
+ <string name="fm_copy_btn">Copiar</string>
+ <string name="fm_copy_file_btn">Copiar Archivo</string>
+ <string name="fm_copy_folder_btn">Copiar Carpeta</string>
+ <string name="fm_copying">Copiando</string>
+ <string name="fm_move_btn">Mover</string>
+ <string name="fm_moving">Moviendo</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Eliminar</string>
+ <string name="fm_deleting">Eliminando</string>
+ <string name="fm_rename_btn">Renombrar</string>
+ <string name="fm_rename_file_btn">Renombrar Archivo</string>
+ <string name="fm_rename_folder_btn">Renombrar Carpeta</string>
+ <string name="fm_renaming">Renombrando</string>
+ <string name="fm_sel_dest">Selecciona la carpeta de destino</string>
+ <string name="fm_sel_curr_folder">Selecciona la carpeta actual</string>
+ <string name="fm_rename_hdr">Renombrar</string>
+ <string name="fm_set_perms_hdr">Establecer Permisos</string>
+ <string name="fm_perms">Permisos:</string>
+ <string name="fm_complete">Operación de Archivo Completado</string>
+ <string name="decrypt_data_hdr">Desencriptar Datos</string>
+ <string name="decrypt_data_enter_pass">Introducir Contraseña.</string>
+ <string name="decrypt_data_failed">Contraseña incorrecta, intente de nuevo!</string>
+ <string name="decrypt_data_failed_pattern">Patrón incorrecto, intentelo de nuevo!</string>
+ <string name="decrypt_data_enter_pattern">Introduzca un patrón.</string>
+ <string name="decrypt_data_trying">Tratando de Desencriptar</string>
+ <string name="term_hdr">Comando de Terminal</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">MATAR</string>
+ <string name="term_sel_folder_hdr">Navegar hasta la Carpeta de Inicio</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Limpiar Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Limpiar Cache</string>
+ <string name="swipe_to_sideload">Desliza para iniciar Sideload</string>
+ <string name="swipe_sideload"> Comenzar</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Uso: adb sideload nombredearchivo.zip</string>
+ <string name="sideload_complete">ADB Sideload Completado</string>
+ <string name="fix_contexts_hdr">Fijar Contextos</string>
+ <string name="fix_contexts_note1">Nota: La fijación de los contextos rara vez es necesaria.</string>
+ <string name="fix_contexts_note2">La fijación de Contextos de SELinux puede causar</string>
+ <string name="fix_contexts_note3">que tú dispositivo no arranque correctamente.</string>
+ <string name="swipe_to_fix_contexts">Desliza para fijar Contextos</string>
+ <string name="swipe_fix_contexts"> Fijar Contextos</string>
+ <string name="fixing_contexts">Fijando Contextos...</string>
+ <string name="fix_contexts_complete">Fijar Contextos Completado</string>
+ <string name="reboot_hdr">Reiniciar</string>
+ <string name="su_hdr">Comprobar SuperSU</string>
+ <string name="su_note1">Parece que tú dispositivo no esta rooteado.</string>
+ <string name="su_note2">Instalar SuperSU ahora?</string>
+ <string name="su_note3">Esto rooteara su dispositivo.</string>
+ <string name="su_cancel">No instalar</string>
+ <string name="swipe_su_to_install">Desliza para instalar</string>
+ <string name="swipe_su_install"> Instalar</string>
+ <string name="su_installing">Instalado SuperSU</string>
+ <string name="sel_storage_list">Seleccionar Almacenamiento</string>
+ <string name="ok_btn">OK</string>
+ <string name="no_kernel_selinux">Kernel no tiene soporte para la lectura de los contextos de SELinux.</string>
+ <string name="full_selinux">Soporte completo de SELinux está presente.</string>
+ <string name="no_selinux">No hay soporte SELinux (no libselinux).</string>
+ <string name="mtp_enabled">MTP Activado</string>
+ <string name="mtp_crash">MTP falló, no se iniciará MTP en el arranque.</string>
+ <string name="decrypt_success">Datos descifrados exitosamente, nuevo dispositivo de bloque: \'{1}\'</string>
+ <string name="unable_to_decrypt">Incapaz de descifrar con la contraseña actual. Quizás necesites realizar un Formateo de Datos.</string>
+ <string name="generating_md51">Generando MD5</string>
+ <string name="generating_md52"> * Generando md5...</string>
+ <string name="md5_created"> * MD5 Creado.</string>
+ <string name="md5_error"> * ¡MD5 Error!</string>
+ <string name="md5_compute_error"> * Error creando MD5.</string>
+ <string name="current_date">(Fecha Actual)</string>
+ <string name="auto_generate">(Autogenerar)</string>
+ <string name="unable_to_locate_partition">Incapaz de localizar la partición’{1}’ para los cálculos de la copia de seguridad.</string>
+ <string name="no_partition_selected">No se han seleccionado particiones para copia de seguridad.</string>
+ <string name="total_partitions_backup"> * Número total de particiones para copia de seguridad: {1}</string>
+ <string name="total_backup_size"> * Tamaño total de todos los datos: {1}MB</string>
+ <string name="available_space"> * Espacio disponible: {1}MB</string>
+ <string name="unable_locate_storage">Incapaz de localizar el dispositivo de almacenamiento.</string>
+ <string name="no_space">No hay suficiente espacio en el almacenamiento.</string>
+ <string name="backup_started">[COPIA DE SEGURIDAD COMENZADA]</string>
+ <string name="backup_folder">Carpeta de copia seguridad establecida en \'{1}\'</string>
+ <string name="fail_backup_folder">Error al crear carpeta de copia de seguridad.</string>
+ <string name="avg_backup_fs">Tasa media de copia de seguridad para sistemas de archivo: {1} MB/seg</string>
+ <string name="avg_backup_img">Tasa media de copia de seguridad para imágenes de unidades: {1} MB/seg</string>
+ <string name="total_backed_size">[{1} MB TOTALES DE COPIA DE SEGURIDAD]</string>
+ <string name="backup_completed">[COPIA DE SEGURIDAD COMPLETADA EN {1} SEGUNDOS ]</string>
+ <string name="restore_started">[RESTAURACIÓN COMENZADA]</string>
+ <string name="restore_folder">Restaurar carpeta: \'{1}\'</string>
+ <string name="restore_part_done">[{1} completado ({2} segundos)]</string>
+ <string name="verifying_md5">Verificando MD5</string>
+ <string name="skip_md5">Saltando checkeo de MD5 basado en ajustes del usuario.</string>
+ <string name="calc_restore">Calculando detalles de la restauración...</string>
+ <string name="restore_read_only">No se puede restaurar {1} -- montado en modo leer.</string>
+ <string name="restore_unable_locate">Incapaz de localizar la partición \'{1}\' para la restauración.</string>
+ <string name="no_part_restore">No se han seleccionado particiones para restaurar.</string>
+ <string name="restore_part_count">Restaurando {1} particiones...</string>
+ <string name="total_restore_size">El tamaño total de restauración es de {1}MB</string>
+ <string name="updating_system_details">Actualizando Detalles de Sistema</string>
+ <string name="restore_completed">[RESTAURACIÓN COMPLETADA EN {1} SEGUNDOS]</string>
+ <string name="error_opening_strerr">Error abriendo: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Incapaz de localizar partición con el nombre de copia de seguridad: \'{1}\'</string>
+ <string name="unable_find_part_path">Incapaz de encontrar la partición para la dirección \'{1}\'</string>
+ <string name="update_part_details">Actualizando detalles de la partición…</string>
+ <string name="update_part_details_done">…hecho</string>
+ <string name="wiping_dalvik">Limpiando Directorios de Caché de Dalvik...</string>
+ <string name="cleaned">Limpio: {1}...</string>
+ <string name="dalvik_done">-- ¡Limpieza de Directorios de Caché de Dalvik Completa!</string>
+ <string name="no_andsec">No se encontró ninguna partición de android secure.</string>
+ <string name="unable_to_locate">Incapaz de localizar {1}.</string>
+ <string name="wiping_datamedia">Limpiando almacenamiento interno -- /data/media...</string>
+ <string name="unable_to_mount">Incapaz de montar {1}</string>
+ <string name="unable_to_mount_internal">Incapaz de montar almacenamiento_interno</string>
+ <string name="unable_to_mount_storage">Incapaz de montar almacenamiento</string>
+ <string name="fail_decrypt">Error al descifrar datos.</string>
+ <string name="no_crypto_support">No hay ningún soporte de cifrado compilado en esta compilación.</string>
+ <string name="decrypt_success_dev">Datos desencriptados satisfactoriamente, nuevo bloque de dispositivo: '{1}'</string>
+ <string name="done">Hecho.</string>
+ <string name="start_partition_sd">Particionando tarjeta SD...</string>
+ <string name="partition_sd_locate">Incapaz de localizar el dispositivo a particionar.</string>
+ <string name="ext_swap_size">El tamaño de EXT + Swap es más grande que el tamaño de la tarjeta SD.</string>
+ <string name="remove_part_table">Eliminando tabla de partición...</string>
+ <string name="unable_rm_part">Incapaz de eliminar la tabla de partición.</string>
+ <string name="create_part">Creando partición {1}...</string>
+ <string name="unable_to_create_part">Incapaz de crear partición {1}.</string>
+ <string name="format_sdext_as">Formateando sd-ext como {1}...</string>
+ <string name="part_complete">Particionamiento completo.</string>
+ <string name="unable_to_open">Incapaz de abrir \'{1}\'.</string>
+ <string name="mtp_already_enabled">MTP ya está habilitado</string>
+ <string name="mtp_fail">Error al activar MTP</string>
+ <string name="no_mtp">Soporte a MTP no incluido</string>
+ <string name="image_flash_start">[FLASHEO DE IMAGEN EMPEZADA]</string>
+ <string name="img_to_flash">Imagen a flashear: \'{1}\'</string>
+ <string name="flash_unable_locate">Incapaz de localizar la partición \'{1}\' para flashear.</string>
+ <string name="no_part_flash">No se ha seleccionado partición para flashear.</string>
+ <string name="too_many_flash">Demasiadas particiones seleccionadas para flashear.</string>
+ <string name="invalid_flash">La partición de flasheo especificada es inválida.</string>
+ <string name="flash_done">[FLASHEO DE IMAGEN COMPLETO]</string>
+ <string name="wiping">Limpiando {1}</string>
+ <string name="repair_not_exist">¡{1} no existe! ¡No se puede reparar!</string>
+ <string name="repairing_using">Reparando {1} usando {2}...</string>
+ <string name="unable_repair">Incapaz de reparar {1}.</string>
+ <string name="mount_data_footer">No se pudo montar /data e incapaz de encontrar pie de página de crypto.</string>
+ <string name="create_folder_strerr">No se pudo crear \'{1}\' en carpeta ({2}).</string>
+ <string name="fail_mount">Error al desmontar \'{1}\' ({2})</string>
+ <string name="fail_unmount">Fallo al desmontar '{1}' ({2})</string>
+ <string name="cannot_resize">No se puede cambiar el tamaño de {1}.</string>
+ <string name="repair_resize">Reparando {1} antes de cambiar de tamaño.</string>
+ <string name="unable_resize">Incapaz de cambiar el tamaño de archivo de {1}.</string>
+ <string name="no_md5_found">No se encuentra archivo md5 para \'{1}\'. Por favor, deselecciona Activar verificación de MD5 para restaurar.</string>
+ <string name="md5_fail_match">MD5 no coincide en \'{1}\'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Fallo al desencriptar el archivo tar '{1}'</string>
+ <string name="format_data_msg">Quizás necesites reiniciar el recovery para ser capaz de usar /data de nuevo.</string>
+ <string name="format_data_err">Incapaz de formatear para remover encriptación.</string>
+ <string name="formatting_using">Formateando {1} usando {2}...</string>
+ <string name="unable_to_wipe">Incapaz de limpiar {1}.</string>
+ <string name="cannot_wipe">Partición {1} no se limpiar.</string>
+ <string name="remove_all">Eliminando todos los archivos dentro de \'{1}\'</string>
+ <string name="wiping_data">Limpiando datos sin limpiar /data/media ...</string>
+ <string name="backing_up">Realizando copia de seguridad {1}...</string>
+ <string name="backing">Realizando copia de seguridad</string>
+ <string name="backup_size">El tamaño del archivo \'{1}\' de la copia seguridad es de 0 bytes.</string>
+ <string name="datamedia_fs_restore">CUIDADO: !Esta copia de seguridad de /data se hizo con el sistema de archivos {1}! La copia de seguridad puede no arrancar a no ser que cambies a {1}.</string>
+ <string name="restoring">Restaurando {1}...</string>
+ <string name="restoring_hdr">Restaurando</string>
+ <string name="recreate_folder_err">Incapaz de recrear la carpeta {1}.</string>
+ <string name="img_size_err">El tamaño de la imagen es mayor que el tamaño del dispositivo de destino.</string>
+ <string name="flashing">Flasheando {1}...</string>
+ <string name="backup_folder_set">Copia de Seguridad establecida en '{1}'</string>
+ <string name="locate_backup_err">Incapaz de localizar copia de seguridad \'{1}\'</string>
+ <string name="set_restore_opt">Ajustando opciones de restauración: \'{1}\':</string>
+ <string name="md5_check_skip">El salto de checkeo de MD5 está activado</string>
+ <string name="ors_encrypt_restore_err">Incapaz de usar OpenRecoveryScript para restaurar una copia de seguridad encriptada.</string>
+ <string name="mounting">Montando</string>
+ <string name="unmounting">Desmontando</string>
+ <string name="mounted">Montado \'{1}\'</string>
+ <string name="unmounted">Desmontado \'{1}\'</string>
+ <string name="setting">Ajustando \'{1}\' a \'{2}\'</string>
+ <string name="setting_empty">Ajustando \'{1}\' a vacío</string>
+ <string name="making_dir1">Creando Directorio</string>
+ <string name="making_dir2">Creando directorio: \'{1}\'</string>
+ <string name="running_command">Corriendo Comando</string>
+ <string name="sideload">Carga lateral de ADB</string>
+ <string name="start_sideload">Empezando carga lateral de ADB...</string>
+ <string name="need_new_adb">Necesitas de adb 1.0.32 o más nuevo para poder realizar la carga lateral en este dispositivo.</string>
+ <string name="no_pwd">No se ha proporcionado contraseña.</string>
+ <string name="done_ors">Procesamiento de comando de archivos hecho</string>
+ <string name="injecttwrp">Inyectando TWRP en imagen boot...</string>
+ <string name="zip_err">Error instalando archivo zip \'{1}\'</string>
+ <string name="installing_zip">Instalando archivo zip '{1}'</string>
+ <string name="select_backup_opt">Ajustando opciones de copia de seguridad:</string>
+ <string name="compression_on">La compresión está activada</string>
+ <string name="md5_off">La generación de MD5 está desactivada</string>
+ <string name="backup_fail">Copia de seguridad fallida</string>
+ <string name="backup_clean">La copia de seguridad falló. Limpiando carpeta de la copia de seguridad.</string>
+ <string name="running_recovery_commands">Corriendo Comandos de Recovery</string>
+ <string name="recovery_commands_complete">Comandos de Recovery Completos</string>
+ <string name="running_ors">Corriendo OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript Completo</string>
+ <string name="no_updater_binary">No fue posible encontrar \'{1}\' en el archivo zip.</string>
+ <string name="check_for_md5">Buscando archivo MD5...</string>
+ <string name="fail_sysmap">Error al mapear archivo \'{1}\'</string>
+ <string name="verify_zip_sig">Verificando firma de zip…</string>
+ <string name="verify_zip_fail">¡Verificación de firma de Zip fallida!</string>
+ <string name="verify_zip_done">Firma de Zip verificada exitosamente.</string>
+ <string name="zip_corrupt">¡Este archivo Zip es corrupto!</string>
+ <string name="no_md5">Saltando verificación de MD5: no se ha encontrado archivo MD5</string>
+ <string name="md5_fail">MD5 no coincide</string>
+ <string name="md5_match">MD5 coincide</string>
+ <string name="pid_signal">Proceso {1} terminó con señal: {2}</string>
+ <string name="pid_error">Proceso {1} terminó con ERROR: {2}</string>
+ <string name="install_dumlock">Instalando HTC Dumlock en el sistema…</string>
+ <string name="dumlock_restore">Restaurando el boot original...</string>
+ <string name="dumlock_reflash">Reflasheando el recovery en boot...</string>
+ <string name="run_script">Ejecutando script {1} ...</string>
+ <string name="rename_stock">Renombrado stock recovery en /system para prevenir que la ROM stock remplace TWRP.</string>
+ <string name="split_backup">Dividiendo copia de seguridad en múltiples archivos...</string>
+ <string name="backup_error">Error creando copia de seguridad.</string>
+ <string name="restore_error">Error durante el proceso de restauración.</string>
+ <string name="split_thread">Dividiendo hilo ID {1} en archivo {2}</string>
+ <string name="file_progress">%llu de %llu archivos, %i%%</string>
+ <string name="size_progress">%lluMB de %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Intentando decriptar partición de datos via línea de comandos.</string>
+ <string name="base_pkg_err">Carga de paquetes básicos fallido.</string>
+ <string name="simulating">Simulando acciones...</string>
+ <string name="backup_cancel">Copia de seguridad cancelada.</string>
+ <string name="config_twrp">Configurando TWRP...</string>
+ <string name="config_twrp_err">Incapaz de configurar TWRP con este kernel.</string>
+ <string name="copy_log">Log del recovery copiado en {1}.</string>
+ <string name="max_queue">¡Máximo de archivos zip en cola alcanzado!</string>
+ <string name="min_queue">¡Mínimo de archivos zip en cola alcanzado!</string>
+ <string name="screenshot_saved">Captura de pantalla guardada en {1}</string>
+ <string name="screenshot_err">¡La captura de pantalla falló!</string>
+ <string name="zip_wipe_cache">Uno o más archivos zip han pedido una limpieza de caché -- Limpiando caché ahora.</string>
+ <string name="and_sec_wipe_err">Incapaz de limpiar android secure</string>
+ <string name="dalvik_wipe_err">¡La limpieza de dalvik falló!</string>
+ <string name="auto_gen">(Autogenerar)</string>
+ <string name="curr_date">(Fecha Actual)</string>
+ <string name="backup_name_len">El nombre de esta copia de seguridad es demasiado largo.</string>
+ <string name="backup_name_invalid">El nombre de la copia de seguridad \'{1}\' contiene un carácter inválido: \'{1}\'</string>
+ <string name="no_real_sdcard">¡Este dispositivo no tiene una tarjeta SD real! ¡Abortando!</string>
+ <string name="cancel_sideload">Cancelando carga lateral ADB...</string>
+ <string name="change_fs_err">Error cambiando sistema de archivos.</string>
+ <string name="theme_ver_err">Tema personalizado no coincide con la versión de TWRP. Usando tema stock.</string>
+ <string name="up_a_level">(Subir Un Nivel)</string>
+ <string name="install_reboot">Reiniciando en 5 segundos</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/fr.xml b/gui/theme/common/languages/fr.xml
new file mode 100644
index 000000000..f38446110
--- /dev/null
+++ b/gui/theme/common/languages/fr.xml
@@ -0,0 +1,651 @@
+<?xml version="1.0"?>
+<language>
+ <display>Français</display>
+ <resources>
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+ <string name="system">Système</string>
+ <string name="system_image">Image Système</string>
+ <string name="vendor">Fabricant</string>
+ <string name="vendor_image">Image Fabricant</string>
+ <string name="boot">Amorçage</string>
+ <string name="recovery">Récupération</string>
+ <string name="cache">Cache</string>
+ <string name="data">Données</string>
+ <string name="sdcard">Carte SD</string>
+ <string name="internal">Mémoire interne</string>
+ <string name="microsd">Carte microSD</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Sécurisé</string>
+ <string name="dalvik">Cache Dalvik / ART</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Données adoptées</string>
+ <string name="adopted_storage">Stockage adopté</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU : %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Batterie : %tw_battery%</string>
+ <string name="sort_by_name">Trier par nom</string>
+ <string name="sort_by_date">Trier par Date</string>
+ <string name="sort_by_size">Trier par taille</string>
+ <string name="sort_by_name_only">Nom</string>
+ <string name="sort_by_date_only">Date</string>
+ <string name="sort_by_size_only">Taile</string>
+ <string name="tab_general">GÉNÉRAL</string>
+ <string name="tab_options">OPTIONS</string>
+ <string name="tab_backup">SAUVEGARDE</string>
+ <string name="tab_time_zone">FUSEAU HORAIRE</string>
+ <string name="tab_screen">ÉCRAN</string>
+ <string name="tab_vibration">VIBRATION</string>
+ <string name="tab_language">LANGUE</string>
+ <string name="install_btn">Installer</string>
+ <string name="wipe_btn">Formater</string>
+ <string name="backup_btn">Sauvergarder</string>
+ <string name="restore_btn">Restaurer</string>
+ <string name="mount_btn">Montage partitions</string>
+ <string name="settings_btn">Paramètres</string>
+ <string name="advanced_btn">Paramètres avancé</string>
+ <string name="reboot_btn">Redémarrer</string>
+ <string name="files_btn">Fichiers</string>
+ <string name="copy_log_btn">Copier le journal</string>
+ <string name="select_type_hdr">Selctionner le type</string>
+ <string name="install_zip_hdr">Installer le Zip</string>
+ <string name="install_zip_btn">Installer le Zip</string>
+ <string name="install_image_hdr">Installer l'Image</string>
+ <string name="install_image_btn">Installer l'Image</string>
+ <string name="install_select_file_hdr">Sélectionnez un fichier</string>
+ <string name="file_selector_folders_hdr">Dossier</string>
+ <string name="select_file_from_storage">Sélectionnez un fichier dans %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">Transfert via ADB</string>
+ <string name="install_hdr">Installer</string>
+ <string name="select_storage_hdr">Sélectionner l'emplacement</string>
+ <string name="select_storage_btn">Sélectionner l'emplacement</string>
+ <string name="queue_hdr">Mettre en file d'attente</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% de max de 10 fichiers en file d'attente</string>
+ <string name="zip_queue_count_s">Fichier %tw_zip_queue_count% sur 10 :</string>
+ <string name="zip_warn1">Cette opération pourrait intaller un logiciel</string>
+ <string name="zip_warn2">incompatible et rendre votre appareil inutilisable.</string>
+ <string name="zip_back_cancel">Appuyer sur retour pour annuler l'ajout de ce zip.</string>
+ <string name="zip_back_clear">Appuyer sur retour pour effacer la liste d'attente.</string>
+ <string name="folder">Dossier :</string>
+ <string name="file">Fichier :</string>
+ <string name="zip_sig_chk">Vérification de la signature du Zip</string>
+ <string name="inject_twrp_chk">Injecter TWRP après l'installation</string>
+ <string name="options_hdr">Options</string>
+ <string name="confirm_flash_hdr">Confirmer le Flash</string>
+ <string name="zip_queue">Mettre en file d'attente :</string>
+ <string name="options">Options :</string>
+ <string name="swipe_confirm">Confirmer</string>
+ <string name="zip_add_btn">Ajouter plus de Zips</string>
+ <string name="zip_clear_btn">Effacer la liste d'attente des Zips</string>
+ <string name="install_zip_count_hdr">Installe le Zip %tw_zip_index% sur %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Installe le Zip : %tw_file%</string>
+ <string name="failed">Échec</string>
+ <string name="successful">Réussie</string>
+ <string name="install_failed">Installation échouée</string>
+ <string name="install_successful">Installation réussie</string>
+ <string name="wipe_cache_dalvik_btn">Effacer cache/dalvik</string>
+ <string name="reboot_system_btn">Redémarrer le système</string>
+ <string name="install_sel_target">Sélectionner la Partition d'installation</string>
+ <string name="flash_image_select">Sélectionner la partition où écrire l'image :</string>
+ <string name="target_partition">Partition de destination :</string>
+ <string name="flashing_image">Image en cours de Flash...</string>
+ <string name="image_flashed">Image Flashée</string>
+ <string name="wipe_cache_dalvik_confirm">Effacer Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Effacement du Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Cache &amp; Dalvik Effacés</string>
+ <string name="swipe_wipe">Glisser pour formater</string>
+ <string name="swipe_wipe_s">Formater</string>
+ <string name="no_os1">Aucun système d'exploitation installé ! Êtes-vous</string>
+ <string name="no_osrb">certain de vouloir redémarrer ?</string>
+ <string name="no_ospo">certain de vouloir arrêter le système ?</string>
+ <string name="rebooting">En cours de redémarrage...</string>
+ <string name="swipe_reboot_s">Redémarrer</string>
+ <string name="swipe_flash">Glisser pour confirmer le flash</string>
+ <string name="confirm_action">Confirmer l'action</string>
+ <string name="back_cancel">Presser retour pour annuler.</string>
+ <string name="cancel_btn">Annuler</string>
+ <string name="wipe_hdr">Effacer</string>
+ <string name="factory_reset_hdr">Retour aux réglages d'usine</string>
+ <string name="factory_reset_btn">Retour aux réglages d'usine</string>
+ <string name="factory_reset1">Formater les données, le Cache et Dalvik</string>
+ <string name="factory_reset2">(ne comprend pas le stockage interne)</string>
+ <string name="factory_reset3">La plupart du temps il s'agit</string>
+ <string name="factory_reset4">de la seule chose que vous avez besoin de formater.</string>
+ <string name="factory_resetting">Réinitialisation d'usine...</string>
+ <string name="advanced_wipe_hdr">Formatage avancé</string>
+ <string name="advanced_wipe_btn">Formatage avancé</string>
+ <string name="wipe_enc_confirm">Effacer le chiffrement des données ?</string>
+ <string name="formatting_data">Formatage en cours ...</string>
+ <string name="swipe_format_data">Glisser pour formater les données</string>
+ <string name="swipe_format_data_s">Formater les données</string>
+ <string name="factory_reset_complete">Réinitialisation complète</string>
+ <string name="sel_part_hdr">Sélectionner les Partitions</string>
+ <string name="wipe_sel_confirm">Formater la (les) partition(s) Sélectionnée(s) ?</string>
+ <string name="wiping_part">Formatage de la (des) partition(s) en cours...</string>
+ <string name="wipe_complete">Formatage Terminé</string>
+ <string name="sel_part_wipe">Sélectionner les Partitions a formater :</string>
+ <string name="invalid_part_sel">Sélection de partition non valide</string>
+ <string name="format_data_hdr">Formater les données</string>
+ <string name="format_data_btn">Formater les données</string>
+ <string name="format_data_ptr1">Formater les données effacera toutes vos applications,</string>
+ <string name="format_data_ptr2">sauvegardes, photos, vidéos, media, et</string>
+ <string name="format_data_ptr3">retirera l'encryption sur le stockage interne.</string>
+ <string name="format_data_lcp1">Formater les données effacera toutes vos applications, sauvergardes, photos, videos, media, et</string>
+ <string name="format_data_lcp2">retirera le chiffrement du stockage interne.</string>
+ <string name="format_data_wtc1">Formater les données effacera toutes vos applications,</string>
+ <string name="format_data_wtc2">les sauvegardes et les médias. Cette action ne peut pas être annulée.</string>
+ <string name="format_data_undo">La suppression est irréversible.</string>
+ <string name="format_data_complete">Formatage des données terminé</string>
+ <string name="yes_continue">Entrer "yes" pour continuer. Appuyez sur retour pour annuler.</string>
+ <string name="part_opt_hdr">Options de la partition : %tw_partition_name%</string>
+ <string name="sel_act_hdr">Sélectionner une action</string>
+ <string name="file_sys_opt">Options de système de fichiers</string>
+ <string name="partition">Partition : %tw_partition_name%</string>
+ <string name="part_mount_point">Point de montage : %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Système de fichiers : %tw_partition_file_system%</string>
+ <string name="part_present_yes">Présent : Oui</string>
+ <string name="part_present_no">Présent : non</string>
+ <string name="part_removable_yes">Amovible : Oui</string>
+ <string name="part_removable_no">Amovible : non</string>
+ <string name="part_size">Taille : % tw_partition_size % MB</string>
+ <string name="part_used">Utilisé : % tw_partition_used % MB</string>
+ <string name="part_free">Libre: % tw_partition_free % MO</string>
+ <string name="part_backup_size">Taille de la sauvegarde : % tw_partition_backup_size % MB</string>
+ <string name="resize_btn">Redimensionner le système de fichiers</string>
+ <string name="resize_btn_s">Redimensionner</string>
+ <string name="resize_confirm">Redimensionner %tw_partition_name% ?</string>
+ <string name="resizing">Redimensionnement en cours...</string>
+ <string name="resize_complete">Redimensionnenent Terminé</string>
+ <string name="swipe_resize">Glisser pour redimensionner</string>
+ <string name="swipe_resize_s">Redimensionner</string>
+ <string name="repair_btn">Réparation du Système de fichier</string>
+ <string name="repair_btn_s">Réparer</string>
+ <string name="repair_confirm">Réparer %tw_partition_name% ?</string>
+ <string name="repairing">Réparation en cours...</string>
+ <string name="repair_complete">Réparation Terminée</string>
+ <string name="swipe_repair">Glisser pour réparer</string>
+ <string name="swipe_repair_s">Réparer</string>
+ <string name="change_fs_btn">Changer le Système de fichiers</string>
+ <string name="change_fs_btn_s">Changer</string>
+ <string name="change_fs_for_hdr">Changer le Système de fichiers pour : %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partition : %tw_partition_name% &gt; sélectionnez le Système de fichiers</string>
+ <string name="change_fs_warn1">Certains ROMs ou kernels peuvent ne pas supporter certains</string>
+ <string name="change_fs_warn2">systèmes de fichiers. Procéder avec prudence !</string>
+ <string name="change_fs_confirm">Changer %tw_partition_name%?</string>
+ <string name="formatting">Formatage en cours...</string>
+ <string name="format_complete">Formatage Terminé</string>
+ <string name="swipe_change_fs">Glisser pour changer</string>
+ <string name="swipe_change_s">Changer</string>
+ <string name="back_btn">Retour</string>
+ <string name="wipe_enc_btn">Effacer le chiffrement</string>
+ <string name="swipe_factory_reset">Glisser pour restaurer les Paramètres d'usine</string>
+ <string name="repair_change_btn">Réparer ou Changer le Système de fichiers</string>
+ <string name="storage_hdr">Stockage : %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Sauvergarder</string>
+ <string name="backup_confirm_hdr">Confirmer la sauvegarde</string>
+ <string name="encryption_tab">CHIFFREMENT</string>
+ <string name="encryption">Chiffrement :</string>
+ <string name="name">Nom:</string>
+ <string name="sel_part_backup">Sélectionner les Partitions à sauvegarder :</string>
+ <string name="storage">Stockage :</string>
+ <string name="enc_disabled">désactivé - définir un mot de passe pour activer</string>
+ <string name="enc_enabled">activé</string>
+ <string name="enable_backup_comp_chk">Activer la compression</string>
+ <string name="skip_md5_backup_chk">Ne pas générer de MD5 pendant la sauvegarde</string>
+ <string name="disable_backup_space_chk">Désactiver la vérification de l'espace libre</string>
+ <string name="refresh_sizes_btn">Actualiser l'espace disponible</string>
+ <string name="swipe_backup">Glisser pour Sauvegarder</string>
+ <string name="append_date_btn">Ajouter Date</string>
+ <string name="backup_name_exists">Une sauvegarde avec ce nom existe déjà !</string>
+ <string name="encrypt_backup">Chiffrer votre sauvegarde ?</string>
+ <string name="enter_pass">Entrez un mot de passe :</string>
+ <string name="enter_pass2">Entrez le mot de passe à nouveau :</string>
+ <string name="pass_not_match">Les Mots de passe ne correspondent pas !</string>
+ <string name="partitions">Partitions :</string>
+ <string name="disabled">Désactivé</string>
+ <string name="enabled">Activé</string>
+ <string name="backup_name_hdr">Nom de la sauvegarde</string>
+ <string name="progress">Progression :</string>
+ <string name="backup_complete">Sauvegarde terminée</string>
+ <string name="backup_cancel">Sauvegarde annulée</string>
+ <string name="restore_hdr">Restaurer</string>
+ <string name="sel_backup_hdr">Choisir la sauvegarde</string>
+ <string name="restore_sel_store_hdr">Sélectionner la Sauvegarde dans %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Sélectionner le Package à restaurer :</string>
+ <string name="restore_enc_backup_hdr">Sauvegarde chiffrée</string>
+ <string name="restore_dec_fail">Mot de passe incorrect, Veuillez réessayer !</string>
+ <string name="del_backup_btn">Supprimer la sauvegarde</string>
+ <string name="del_backup_confirm">Supprimer la sauvegarde ?</string>
+ <string name="del_backup_confirm2">Cette action ne peut pas être annulée !</string>
+ <string name="deleting_backup">Suppression de sauvegarde en cours...</string>
+ <string name="backup_deleted">Suppression de la Sauvegarde Terminée</string>
+ <string name="swipe_delete">Glisser pour supprimer</string>
+ <string name="swipe_delete_s">Supprimer</string>
+ <string name="restore_try_decrypt">Sauvegarde chiffrée - Tentative de décryptage</string>
+ <string name="restore_try_decrypt_s">Tentative de décryptage</string>
+ <string name="restore_backup_date">Sauvegarde effectuée sur %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Sélectionner les Partitions à restaurer :</string>
+ <string name="restore_enable_md5_chk">Activer la vérification MD5 des fichiers de sauvegarde</string>
+ <string name="restore_completed">Restauration terminée</string>
+ <string name="swipe_restore">Glisser pour Restaurer</string>
+ <string name="swipe_restore_s">Restaurer</string>
+ <string name="rename_backup_hdr">Renommer la sauvegarde</string>
+ <string name="rename_backup_confirm">Renommer la sauvegarde ?</string>
+ <string name="rename_backup_confirm2">Cette action ne peut pas être annulée !</string>
+ <string name="renaming_backup">Changement du nom de la sauvegarde en cours...</string>
+ <string name="rename_backup_complete">Sauvegarde Renommée</string>
+ <string name="swipe_to_rename">Glisser pour Renommer</string>
+ <string name="swipe_rename">Renommer</string>
+ <string name="confirm_hdr">Confirmer</string>
+ <string name="mount_hdr">Monter</string>
+ <string name="mount_sel_part"></string>
+ <string name="mount_sel_part">Sélectionner les Partitions à monter :</string>
+ <string name="mount_sys_ro_chk">Montez la partition système en lecture seule</string>
+ <string name="mount_sys_ro_s_chk">Monter le Système RO</string>
+ <string name="decrypt_data_btn">Chiffrer les données</string>
+ <string name="disable_mtp_btn">Désactiver MTP</string>
+ <string name="enable_mtp_btn">Activez MTP</string>
+ <string name="mount_usb_storage_btn">Monter Stockage USB</string>
+ <string name="usb_storage_hdr">Stockage USB</string>
+ <string name="usb_stor_mnt1">Stockage USB monté</string>
+ <string name="usb_stor_mnt2">Veillez à déconnecter votre appareil</string>
+ <string name="usb_stor_mnt3">de votre ordinateur avant de le libérer !</string>
+ <string name="unmount_btn">Libérer</string>
+ <string name="reboot_hdr">Redémarrer</string>
+ <string name="rb_system_btn">Système</string>
+ <string name="rb_poweroff_btn">Eteindre</string>
+ <string name="rb_recovery_btn">Récupération</string>
+ <string name="rb_bootloader_btn">Amorçage</string>
+ <string name="rb_download_btn">Télécharger</string>
+ <string name="turning_off">Arrêt en cours...</string>
+ <string name="swipe_power_off">Glisser pour éteindre</string>
+ <string name="swipe_power_off_s">Éteindre</string>
+ <string name="sys_ro_hdr">Partition système non modifiée</string>
+ <string name="sys_ro_keep">Conserver le système de fichier en lecture seule ?</string>
+ <string name="sys_rop1">TWRP peut laisser votre partition système non modifiée</string>
+ <string name="sys_rop2">pour rendre plus facile les mises à jour officielles.</string>
+ <string name="sys_rop3">TWRP sera incapable d'empêcher la ROM d'origine</string>
+ <string name="sys_rop4">de remplacer TWRP et ne pourra pas vous proposer de rooter votre appareil.</string>
+ <string name="sys_rop5">L'installation de zips ou les opérations via adb peuvent</string>
+ <string name="sys_rop6">peut-être modifier la partition système.</string>
+ <string name="sys_rol1">TWRP peut laisser votre partition système non modifiée pour rendre plus facile les mises à jour officielles.</string>
+ <string name="sys_rol2">TWRP sera incapable d'empêcher la ROM d'origine de remplacer TWRP et ne pourra pas vous proposer de rooter votre appareil.</string>
+ <string name="sys_rol3">L'installation de zips ou les opérations via adb peuvent peut-être modifier la partition système.</string>
+ <string name="sys_ro_never_show_chk">Ne plus afficher cet écran lors des prochains démarrages</string>
+ <string name="sys_ro_keep_ro_btn">Conserver la lecture seule</string>
+ <string name="swipe_allow_mod">Glisser pour autoriser les modifications</string>
+ <string name="swipe_allow_mod_s">Autoriser les modifications</string>
+ <string name="settings_hdr">Paramètres</string>
+ <string name="settings_gen_hdr">Paramètre généraux</string>
+ <string name="settings_gen_s_hdr">Général</string>
+ <string name="settings_gen_btn">Général</string>
+ <string name="use_rmrf_chk">Utiliser rm -rf au lieu de formater</string>
+ <string name="use24clock_chk">Utiliser le format d'horloge sur 24 heures</string>
+ <string name="rev_navbar_chk">Disposition de la barre de navigation inversée</string>
+ <string name="simact_chk">Simuler des actions pour tester un thème</string>
+ <string name="simfail_chk">Simuler l'échec des actions</string>
+ <string name="ctr_navbar_rdo">Centrer les Boutons de la barre de navigation</string>
+ <string name="lft_navbar_rdo">Aligner les boutons de la barre de navigation à gauche</string>
+ <string name="rht_navbar_rdo">Aligner les boutons de barre de navigation à droite</string>
+ <string name="restore_defaults_btn">Rétablir les paramètres par défaut</string>
+ <string name="settings_tz_btn">Fuseau horaire</string>
+ <string name="settings_screen_btn">Écran</string>
+ <string name="settings_screen_bright_btn">Luminosité</string>
+ <string name="settings_vibration_btn">Vibration</string>
+ <string name="settings_language_btn">Langue</string>
+ <string name="time_zone_hdr">Fuseau horaire</string>
+ <string name="sel_tz_list">Sélectionnez le fuseau horaire :</string>
+ <string name="utcm11">(UTC -11) Samoa, Îles samoanes</string>
+ <string name="utcm10">(UTC -10) Hawaï</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Heure du Pacifique</string>
+ <string name="utcm7">(UTC -7) Heure des Rocheuses</string>
+ <string name="utcm6">(UTC -6) Heure du Centre</string>
+ <string name="utcm5">(UTC -5) Heure de l'Est</string>
+ <string name="utcm4">(UTC -4) Heure de l'Atlantique</string>
+ <string name="utcm3">(UTC -3) Brésil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Brésil, São Paulo</string>
+ <string name="utcm1">(UTC -1) Açores, Le Cap-Vert</string>
+ <string name="utc0">(UTC 0) Londres, Dublin, Lisbonne</string>
+ <string name="utcp1">(UTC +1) Berlin, Bruxelles, Paris</string>
+ <string name="utcp2">(UTC +2) Athènes, Istanbul, Afrique du Sud</string>
+ <string name="utcp3">(UTC +3) Moscou, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilissi, Muscat</string>
+ <string name="utcp5">(UTC +5) Ekaterinbourg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoï, Djakarta</string>
+ <string name="utcp8">(UTC +8) Pékin, Singapour, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokyo, Séoul, Iakoutsk</string>
+ <string name="utcp10">(UTC +10) Australie orientale, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, îles Salomon</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Îles Fidji</string>
+ <string name="sel_tz_offset">Sélectionner le Décalage (habituellement 0) : %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Aucun</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Utiliser l'heure d'été/hiver (DST)</string>
+ <string name="curr_tz">Fuseau horaire : %tw_time_zone%</string>
+ <string name="curr_tz_s">Fuseau horaire :</string>
+ <string name="set_tz_btn">Régler le fuseau horaire</string>
+ <string name="settings_screen_hdr">Paramètres d'écran</string>
+ <string name="settings_screen_timeout_hdr">Mise en veille de l'écan</string>
+ <string name="enable_timeout_chk">Activer la mise en veille</string>
+ <string name="screen_to_slider">Délai avant mise en veille :</string>
+ <string name="screen_to_slider_s">Délai avant mise en veille en secondes (0 = désactivé): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Paramètre de mise en veille non disponible</string>
+ <string name="screen_bright_slider">Luminosité : %tw_brightness_pct% %</string>
+ <string name="screen_bright_na">Paramètre de luminosité non disponible</string>
+ <string name="vibration_hdr">Vibration</string>
+ <string name="button_vibration_hdr">Vibration des boutons</string>
+ <string name="kb_vibration_hdr">Vibration du clavier</string>
+ <string name="act_vibration_hdr">Vibration d'action</string>
+ <string name="button_vibration">Vibration des boutons :</string>
+ <string name="kb_vibration">Vibration du clavier :</string>
+ <string name="act_vibration">Vibration d'action :</string>
+ <string name="select_language">Choisir la langue :</string>
+ <string name="set_language_btn">Définir la langue</string>
+ <string name="advanced_hdr">Paramètres avancés</string>
+ <string name="copy_log_confirm">Copier les journaux sur carte SD ?</string>
+ <string name="copying_log">Copie des journaux sur la carte SD en cours...</string>
+ <string name="copy_log_complete">Copie des journaux Effectuée</string>
+ <string name="fix_perm_btn">Corriger les autorisations</string>
+ <string name="fix_perm_s_btn">Corriger les autorisations</string>
+ <string name="part_sd_btn">Partitionner SD Card</string>
+ <string name="part_sd_s_btn">Carte SD</string>
+ <string name="file_manager_btn">Gestionnaire de fichiers</string>
+ <string name="language_hdr">Langue</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Recharger le thème</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Injecter TWRP</string>
+ <string name="inject_twrp_confirm">Réinjecter TWRP ?</string>
+ <string name="injecting_twrp">Réinjection de TWRP en cours...</string>
+ <string name="inject_twrp_complete">Injection de TWRP Terminée</string>
+ <string name="swipe_to_confirm">Glisser pour confirmer</string>
+ <string name="part_sd_hdr">Partitionner la carte SD</string>
+ <string name="part_sd_lose">Vous allez perdre tous les fichiers sur votre carte SD !</string>
+ <string name="part_sd_undo">Cette action ne peut pas être annulée !</string>
+ <string name="part_sd_ext_sz">Taille EXT :</string>
+ <string name="part_sd_swap_sz">Taille du swap :</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Système de Fichiers :</string>
+ <string name="swipe_part_sd">Glisser pour Partitionner</string>
+ <string name="swipe_part_sd_s">Partitionner</string>
+ <string name="partitioning_sd">Partitionnement de la carte SD en cours...</string>
+ <string name="partitioning_sd2">Cela va durer quelques minutes.</string>
+ <string name="part_sd_complete">Partitionnement Terminé</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Restaurer l'image de démarrage originale</string>
+ <string name="dumlock_restore_confirm">Restaurer l'image de démarrage originale ?</string>
+ <string name="dumlock_restoring">Restauration de l'image de démarrage originale en cours...</string>
+ <string name="dumlock_restore_complete">Restauration de l'image de démarrage originale effectué</string>
+ <string name="dumlock_reflash_btn">Réinstaller le mode de Récupération</string>
+ <string name="dumlock_reflash_confirm">Réinstaller le mode de Récupération sur le Démarrage ?</string>
+ <string name="dumlock_reflashing">Réinstallation du mode de Récupération sur Démarrage...</string>
+ <string name="dumlock_reflash_complete">Réinstallation du mode de Récupération sur Démarrage effectuée</string>
+ <string name="dumlock_install_btn">Installer HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Installer les fichiers HTC Dumlock sur la ROM?</string>
+ <string name="dumlock_installing">Installation de HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Installation de HTC Dumlock complétée</string>
+ <string name="swipe_to_unlock">Glisser pour déverrouiller</string>
+ <string name="swipe_unlock">Dévérrouiller</string>
+ <string name="fm_hdr">Gestionnaire de fichiers</string>
+ <string name="fm_sel_file">Sélectionnez un fichier ou un dossier</string>
+ <string name="fm_type_folder">Dossier</string>
+ <string name="fm_type_file">Fichier </string>
+ <string name="fm_choose_act">Choisir une action</string>
+ <string name="fm_selected">%tw_fm_type% sélectionné:</string>
+ <string name="fm_copy_btn">Copier</string>
+ <string name="fm_copy_file_btn">Copier le fichier</string>
+ <string name="fm_copy_folder_btn">Copier le dossier</string>
+ <string name="fm_copying">Copie</string>
+ <string name="fm_move_btn">Déplacer</string>
+ <string name="fm_moving">Déplacement</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Supprimer</string>
+ <string name="fm_deleting">Suppression en cours</string>
+ <string name="fm_rename_btn">Renommer</string>
+ <string name="fm_rename_file_btn">Renommer le fichier</string>
+ <string name="fm_rename_folder_btn">Renommer le dossier</string>
+ <string name="fm_renaming">Renommage en cours</string>
+ <string name="fm_sel_dest">Sélectionnez le dossier de destination</string>
+ <string name="fm_sel_curr_folder">Sélectionner le dossier actuel</string>
+ <string name="fm_rename_hdr">Renommer</string>
+ <string name="fm_set_perms_hdr">Définir les permissions</string>
+ <string name="fm_perms">Permissions:</string>
+ <string name="fm_complete">Opération de fichier complétée</string>
+ <string name="decrypt_data_hdr">Décrypter les données</string>
+ <string name="decrypt_data_enter_pass"></string>
+ <string name="decrypt_data_failed">Mot de passe incorrect, veuillez réessayer!</string>
+ <string name="decrypt_data_failed_pattern">Échec du schéma, veuillez réessayer!</string>
+ <string name="decrypt_data_enter_pattern">Entrez le schéma.</string>
+ <string name="decrypt_data_trying">Tentative de décryptage</string>
+ <string name="term_hdr">Commande de terminal</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">TUER</string>
+ <string name="term_sel_folder_hdr">Naviguez jusqu'au dossier de démarrage</string>
+ <string name="adb_sideload_hdr">Transfert via ADB</string>
+ <string name="sideload_wipe_dalvik_chk">Effacer le cache Dalvik</string>
+ <string name="sideload_wipe_cache_chk">Effacer le Cache</string>
+ <string name="swipe_to_sideload">Glisser pour débuter le transfert</string>
+ <string name="swipe_sideload">Démarrer</string>
+ <string name="sideload_confirm">Transfert via ADB</string>
+ <string name="sideload_usage">Utilisation: adb sideload (nom de fichier.zip)</string>
+ <string name="sideload_complete">Transfert par ADB complété</string>
+ <string name="fix_perms_hdr">Réparer les permissions</string>
+ <string name="fix_perms_note">Note: La réparation des permissions est rarement nécessaire.</string>
+ <string name="fix_perms_selinux_chk">Réparer aussi les contextes SELinux</string>
+ <string name="fix_perms_sel_note1">La réparation des contextes SELinux pourrait</string>
+ <string name="fix_perms_sel_note2">empêcher l'appareil de démarrer correctement.</string>
+ <string name="swipe_to_fix_perms">Glisser pour réparer les permissions</string>
+ <string name="swipe_fix_perms">Réparer les permissions</string>
+ <string name="fixing_perms">Réparation des permissions...</string>
+ <string name="fix_perms_complete">Réparation des permissions complétée</string>
+ <string name="reboot_hdr">Redémarrer</string>
+ <string name="su_hdr">Vérification SuperSU</string>
+ <string name="su_note1">Votre appareil ne semble pas être rooté.</string>
+ <string name="su_note2">Installer SuperSU maintenant?</string>
+ <string name="su_note3">Ceci va rooter votre appareil.</string>
+ <string name="su_cancel">Ne pas installer</string>
+ <string name="swipe_su_to_install">Glisser pour installer</string>
+ <string name="swipe_su_install">Installer</string>
+ <string name="su_installing">Installation de SuperSU</string>
+ <string name="sel_storage_list">Sélection du stockage</string>
+ <string name="ok_btn">OK</string>
+ <string name="no_kernel_selinux">Le noyau ne supporte pas la lecture des contextes SELinux.</string>
+ <string name="full_selinux">Le support complet de SELinux est présent.</string>
+ <string name="no_selinux">Aucun support SELinux (pas de libselinux).</string>
+ <string name="mtp_enabled">MTP activé</string>
+ <string name="mtp_crash">MTP a planté, pas de démarrage de MTP à l'allumage.</string>
+ <string name="rebooting">Redémarrage...</string>
+ <string name="decrypt_success">Décryption réussie avec le mot de passe par défaut.</string>
+ <string name="unable_to_decrypt">Incapable de décrypter avec le mot de passe par défaut. Vous devrez peut-être formater la partition Données.</string>
+ <string name="generating_md51">Génération du MD5</string>
+ <string name="generating_md52">* Génération du MD5...</string>
+ <string name="md5_created">* MD5 créé.</string>
+ <string name="md5_error">* Erreur MD5 !</string>
+ <string name="md5_compute_error">* Erreur dans le calcul du MD5.</string>
+ <string name="md5_created">* MD5 créé.</string>
+ <string name="current_date">(Date du jour)</string>
+ <string name="auto_generate">(Génération automatisée)</string>
+ <string name="unable_to_locate_partition">Impossible de localiser la partition '{1}' pour le calcul de la sauvegarde.</string>
+ <string name="no_partition_selected">Aucune partition sélectionnée pour la sauvegarde.</string>
+ <string name="total_partitions_backup">* Nombre de partitions à sauvegarder : {1}</string>
+ <string name="total_backup_size">* Taille totale des données: {1}MB</string>
+ <string name="available_space">* Espace disponible: {1}MB</string>
+ <string name="unable_locate_storage">Impossible de trouver le périphérique de stockage.</string>
+ <string name="no_space">Pas assez d'espace libre.</string>
+ <string name="backup_started">[SAUVEGARDE COMMENCÉE]</string>
+ <string name="backup_folder">* Dossier de sauvegarde: {1}</string>
+ <string name="fail_backup_folder">Échec de la création du dossier de sauvegarde.</string>
+ <string name="avg_backup_fs">Vitesse moyenne pour les systèmes de fichiers: {1} MB/sec</string>
+ <string name="avg_backup_img">Vitesse moyenne pour les images de disque: {1} MB/sec</string>
+ <string name="total_backed_size">[{1} MB TOTAL SAUVEGARDÉES]</string>
+ <string name="backup_completed">[SAUVEGARDE TERMINÉE EN {1} SECONDES]</string>
+ <string name="restore_started">[RESTAURATION COMMENCÉE]</string>
+ <string name="restore_folder">Restauration du dossier: '{1}'</string>
+ <string name="restore_part_done">[{1} complété ({2} secondes)]</string>
+ <string name="verifying_md5">Vérification du MD5</string>
+ <string name="skip_md5">Omission de la vérification des MD5 selon le réglage utilisateur.</string>
+ <string name="calc_restore">Calcul des détails de la restauration...</string>
+ <string name="restore_read_only">Impossible de restaurer {1} -- monté en lecture seule.</string>
+ <string name="restore_unable_locate">Impossible de localiser la partition '{1}' pour la restauration.</string>
+ <string name="no_part_restore">Aucune partition sélectionnée pour la restauration.</string>
+ <string name="restore_part_count">Restauration de {1} partitions...</string>
+ <string name="total_restore_size">Taille totale de la restauration: {1}MB</string>
+ <string name="updating_system_details">Mise à jour des détails du système</string>
+ <string name="restore_complete">[RESTAURATION COMPLÉTÉE EN {1} SECONDES]</string>
+ <string name="error_opening_strerr">Erreur d'ouverture: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Impossible de localiser la partition nommée: '{1}'</string>
+ <string name="unable_find_part_path">Impossible de trouver la partition pour le chemin '{1}'</string>
+ <string name="update_part_details">Mise à jour des informations de partition...</string>
+ <string name="update_part_details_done">...terminé</string>
+ <string name="wiping_dalvik">Effacement des dossiers du cache Dalvik...</string>
+ <string name="cleaned">Nettoyé: {1}...</string>
+ <string name="dalvik_done">-- Effacement des dossiers du cache Dalvik complété!</string>
+ <string name="no_andsec">Pas de partitions Android sécurisé trouvées.</string>
+ <string name="unable_to_locate">Impossible de trouver {1}.</string>
+ <string name="wiping_datamedia">Effacement du stockage interne -- /data/media...</string>
+ <string name="unable_to_mount">Incapable de monter {1}</string>
+ <string name="unable_to_mount_internal">Incapable de monter internal_storage</string>
+ <string name="unable_to_mount_storage">Incapable de monter le stockage</string>
+ <string name="fail_decrypt">Échec de la décryption des données.</string>
+ <string name="no_crypto_support">Le support cryptographique n'a pas été inclus dans cette compilation.</string>
+ <string name="decrypt_success">Données décryptées correctement, nouvel appareil bloc: '{1}'</string>
+ <string name="done">Terminé.</string>
+ <string name="start_partition_sd">Partitionnement de la carte SD en cours...</string>
+ <string name="partition_sd_locate">Incapable de localiser le bloc à partitioner.</string>
+ <string name="ext_swap_size">EXT + Swap est plus grand que la taille de sdcard.</string>
+ <string name="remove_part_table">Suppression de table de partition...</string>
+ <string name="unable_rm_part">Impossible de supprimer la table de partition.</string>
+ <string name="create_part">Création de la partition {1}...</string>
+ <string name="unable_to_create_part">Impossible de créer la partition {1}.</string>
+ <string name="format_sdext_as">Formatage sd-ext en {1}...</string>
+ <string name="part_complete">Partitionnement terminé.</string>
+ <string name="unable_to_open">Impossible d'ouvrir '{1}'.</string>
+ <string name="mtp_already_enabled">MTP déjà activé</string>
+ <string name="mtp_fail">Échec de l'activation du MTP</string>
+ <string name="no_mtp">Support MTP non inclus</string>
+ <string name="image_flash_start">[ÉCRITURE IMAGE COMMENCÉE]</string>
+ <string name="img_to_flash">Image à écrire: '{1}'</string>
+ <string name="flash_unable_locate">Impossible de localiser la partition '{1}' pour l'écriture.</string>
+ <string name="no_part_flash">Pas de partition sélectionnée pour l'écriture.</string>
+ <string name="too_many_flash">Trop de partitions sélectionnées pour l'écriture.</string>
+ <string name="invalid_flash">Partition invalide pour l'écriture.</string>
+ <string name="flash_done">[ÉCRITURE IMAGE COMPLÉTÉE]</string>
+ <string name="wiping">Effacement {1}</string>
+ <string name="repair_not_exist">{1} n'existe pas! Incapable de réparer!</string>
+ <string name="repairing_using">Réparation de {1} à l'aide de {2}...</string>
+ <string name="unable_repair">Incapable de réparer {1}.</string>
+ <string name="mount_data_footer">Échec du montage de /data et incapable de trouver la fin du bloc crypto.</string>
+ <string name="create_folder_strerr">Incapable de créer le dossier '{1}' ({2}).</string>
+ <string name="fail_mount">Échec du montage '{1}' ({2})</string>
+ <string name="fail_mount">Échec du démontage '{1}' ({2})</string>
+ <string name="cannot_resize">Incapable de redimensionner {1}.</string>
+ <string name="repair_resize">Réparation de {1} avant de redimensionner.</string>
+ <string name="unable_resize">Incapable de redimensionner {1}.</string>
+ <string name="no_md5_found">Pas de fichier md5 trouvé pour '{1}'. Veuillez désactiver la vérification MD5 pour effectuer la restauration.</string>
+ <string name="md5_fail_match">Le MD5 ne correspond pas pour '{1}'.</string>
+ <string name="md5_matched">Le MD5 correspond pour '{1}'.</string>
+ <string name="restoring">Restauration en cours</string>
+ <string name="format_data_msg">Vous aurez peut-être à redémarrer pour pouvoir utiliser /data à nouveau.</string>
+ <string name="format_data_err">Incapable de formater pour enlever l'encryption.</string>
+ <string name="formatting_using">Formatage {1} en utilisant {2}...</string>
+ <string name="unable_to_wipe">Incapable d'effacer {1}.</string>
+ <string name="remove_all">Supression de tout les fichiers sous '{1}'</string>
+ <string name="wiping_data">Effacement de /data sauf /data/media...</string>
+ <string name="backing_up">Sauvegarde {1}...</string>
+ <string name="backing">Sauvegarde en cours</string>
+ <string name="backup_size">La taille de la sauvegarde de '{1}' est de 0 octets.</string>
+ <string name="datamedia_fs_restore">AVERTISSEMENT: Cette sauvegarde de /data a été faite avec un système de fichier {1}! Il est possible que cette restauration ne fonctionne pas correctement sans que vous retourniez au format {1}.</string>
+ <string name="restoring">Restauration de {1}...</string>
+ <string name="restoring_hdr">Restauration en cours</string>
+ <string name="recreate_folder_err">Incapable de recréer le dossier {1}.</string>
+ <string name="img_size_err">La taille de l'image est plus grande que la cible</string>
+ <string name="flashing">Écriture de {1}...</string>
+ <string name="backup_folder">Dossier de sauvegarde à '{1}'</string>
+ <string name="locate_backup_err">Impossible de localiser la sauvegarde '{1}'</string>
+ <string name="set_restore_opt">Définition des options de restauration: '{1}':</string>
+ <string name="md5_check_skip">La vérification MD5 est omise</string>
+ <string name="ors_encrypt_restore_err">Impossible d'utiliser OpenRecoveryScript pour restaurer une sauvegarde chiffrée.</string>
+ <string name="mounting">Montage</string>
+ <string name="unmounting">Démontage</string>
+ <string name="mounted">Monté la partition '{1}'</string>
+ <string name="unmounted">Démonté la partition '{1}'</string>
+ <string name="setting">Réglage de '{1}' à '{2}'</string>
+ <string name="setting_empty">Réglage de '{1}' à vide</string>
+ <string name="making_dir1">Création du répertoire</string>
+ <string name="making_dir2">Création du répertoire: '{1}'</string>
+ <string name="running_command">Éxécution de la commande</string>
+ <string name="sideload">Transfert via ADB</string>
+ <string name="start_sideload">Démarrage de la fonctionalité de transfert par ADB...</string>
+ <string name="need_new_adb">Vous avez besoin d'adb 1.0.32 ou plus récent pour utiliser le transfert (sideload) sur cet appareil.</string>
+ <string name="no_pwd">Aucun mot de passe fourni.</string>
+ <string name="done_ors">Traitement du fichier de script terminé</string>
+ <string name="injecttwrp">Injection de TWRP dans l'image de démarrage...</string>
+ <string name="zip_err">Erreur lors de l'installation du fichier zip '{1}'</string>
+ <string name="installing_zip">Installation du fichier zip '{1}'</string>
+ <string name="select_backup_opt">Définition des options de sauvegarde:</string>
+ <string name="compression_on">Compression activée</string>
+ <string name="md5_off">La génération de MD5 est désactivée</string>
+ <string name="backup_fail">Échec de la sauvegarde</string>
+ <string name="backup_complete">Sauvegarde terminée!</string>
+ <string name="running_recovery_commands">Exécution des commandes de récupération</string>
+ <string name="recovery_commands_complete">Commandes de récupération complétées</string>
+ <string name="running_ors">OpenRecoveryScript en cours d'exécution</string>
+ <string name="ors_complete">OpenRecoveryScript complété</string>
+ <string name="no_updater_binary">'{1}' introuvable dans le fichier zip.</string>
+ <string name="check_for_md5">Vérification des fichiers MD5...</string>
+ <string name="fail_sysmap">Impossible de mapper le fichier '{1}'</string>
+ <string name="verify_zip_sig">Vérification de la signature du zip...</string>
+ <string name="verify_zip_fail">Échec de la vérification des signatures du zip!</string>
+ <string name="verify_zip_done">Signature du zip vérifiée correctement.</string>
+ <string name="zip_corrupt">Le fichier zip est corrompu!</string>
+ <string name="no_md5">Pas de vérification MD5: aucun fichier MD5 trouvé</string>
+ <string name="md5_fail">Le MD5 ne correspond pas</string>
+ <string name="md5_match">Le MD5 correspond</string>
+ <string name="pid_signal">Le processus {1} s'est terminé avec le signal: {2}</string>
+ <string name="pid_error">Le processus {1} s'est terminé avec ERREUR: {2}</string>
+ <string name="install_dumlock">Installation de HTC Dumlock...</string>
+ <string name="dumlock_restore">Restauration de l'image de démarrage originale en cours...</string>
+ <string name="dumlock_reflash">Réécriture de l'image de récupération sur celle de démarrage...</string>
+ <string name="run_script">Exécution du script {1}...</string>
+ <string name="rename_stock">Renommé le fichier de récupération original dans /system pour empêcher le système d'exploitation original de remplacer TWRP.</string>
+ <string name="split_backup">Morcellement des fichiers de sauvegarde en plusieurs archives...</string>
+ <string name="backup_error">Erreur dans la création de la sauvegarde.</string>
+ <string name="restore_error">Erreur durant le procédé de restauration.</string>
+ <string name="split_thread">Division du thread ID {1} en archive {2}</string>
+ <string name="file_progress">%llu de %llu fichiers, %i%%</string>
+ <string name="size_progress">%lluMO de %lluMO, %i%%</string>
+ <string name="decrypt_cmd">Tentative de décryption de la partition de données via la ligne de commande.</string>
+ <string name="base_pkg_err">Incapable de charger les paquets de base.</string>
+ <string name="simulating">Simulation des actions...</string>
+ <string name="backup_cancel">Sauvegarde annulée.</string>
+ <string name="config_twrp">Configuration de TWRP...</string>
+ <string name="config_twrp_err">Impossible de configurer TWRP avec ce noyau.</string>
+ <string name="copy_log">Copié le journal de récupération sur {1}.</string>
+ <string name="max_queue">File d'attente pour fichiers zip maximale atteinte!</string>
+ <string name="min_queue">File d'attente pour fichiers zip minimale atteinte!</string>
+ <string name="screenshot_saved">La capture d'écran a été sauvegardée à {1}</string>
+ <string name="screenshot_err">Échec de la capture d'écran!</string>
+ <string name="zip_wipe_cache">Un ou plusieurs zip ont demandé un effacement du cache -- E/n cours maintenant.</string>
+ <string name="and_sec_wipe_err">Impossible d'effacer "Android Secure"</string>
+ <string name="dalvik_wipe_err">Échec de l'effacement de Dalvik</string>
+ <string name="auto_gen">(Génération automatisée)</string>
+ <string name="curr_date">(Date du jour)</string>
+ <string name="backup_name_len">Le nom de la sauvegarde est trop long.</string>
+ <string name="backup_name_invalid">Le nom de la sauvegarde '{1}' contient le caractère non valide: '{1}'</string>
+ <string name="backup_name_exists">Une sauvegarde avec ce nom existe déjà.</string>
+ <string name="no_real_sdcard">Cet appareil n'a pas une vraie carte SD! Abandon!</string>
+ <string name="cancel_sideload">Annulation du transfert par ADB...</string>
+ <string name="change_fs_err">Erreur lors du changement du système de fichier.</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/hu.xml b/gui/theme/common/languages/hu.xml
new file mode 100644
index 000000000..77b1ba46d
--- /dev/null
+++ b/gui/theme/common/languages/hu.xml
@@ -0,0 +1,695 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Magyar</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">Rendszer</string>
+ <string name="system_image">Rendszerkép</string>
+ <string name="vendor">Gyártó</string>
+ <string name="vendor_image">Gyártói kép</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Gyorsítótár</string>
+ <string name="data">Adat</string>
+ <string name="data_backup">Adat (data/media nélkül)</string>
+ <string name="sdcard">SD-kártya</string>
+ <string name="internal">Belső tárhely</string>
+ <string name="microsd">Mikro SD-kártya</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART-gyorsítótár</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adoptált adatok</string>
+ <string name="adopted_storage">Adoptált tároló</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Akkumulátor: %tw_battery%</string>
+ <string name="sort_by_name">Rendezés név szerint</string>
+ <string name="sort_by_date">Rendezés dátum szerint</string>
+ <string name="sort_by_size">Rendezés méret szerint</string>
+ <string name="sort_by_name_only">Név</string>
+ <string name="sort_by_date_only">Dátum</string>
+ <string name="sort_by_size_only">Méret</string>
+ <string name="tab_general">ÁLTALÁNOS</string>
+ <string name="tab_options">BEÁLLÍTÁSOK</string>
+ <string name="tab_backup">BIZTONSÁGI MENTÉS</string>
+ <string name="tab_time_zone">IDŐZÓNA</string>
+ <string name="tab_screen">KÉPERNYŐ</string>
+ <string name="tab_vibration">REZGÉS</string>
+ <string name="tab_language">NYELV</string>
+
+ <string name="install_btn">Telepítés</string>
+ <string name="wipe_btn">Törlés</string>
+ <string name="backup_btn">Biztonsági mentés</string>
+ <string name="restore_btn">Visszaállítás</string>
+ <string name="mount_btn">Csatolás</string>
+ <string name="settings_btn">Beállítások</string>
+ <string name="advanced_btn">Haladó</string>
+ <string name="reboot_btn">Újraindítás</string>
+ <string name="files_btn">Fájlok</string>
+ <string name="copy_log_btn">Napló másolása</string>
+ <string name="select_type_hdr">Válasszon típust</string>
+ <string name="install_zip_hdr">Zip telepítése</string>
+ <string name="install_zip_btn">Zip telepítése</string>
+ <string name="install_image_hdr">Képfájl telepítése</string>
+ <string name="install_image_btn">Képfájl telepítése</string>
+ <string name="install_select_file_hdr">Fájl kiválasztása</string>
+ <string name="file_selector_folders_hdr">Mappák</string>
+ <string name="select_file_from_storage">Fájl kiválasztása innen: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Telepítés</string>
+ <string name="select_storage_hdr">Válasszon tárolót</string>
+ <string name="select_storage_btn">Válasszon tárolót</string>
+ <string name="queue_hdr">Várólista</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% / max 10 fájl a várólistán</string>
+ <string name="zip_queue_count_s">%tw_zip_queue_count% / 10 fájl:</string>
+ <string name="zip_warn1">Ez a művelet nem kompatibilis szoftvert telepíthet,</string>
+ <string name="zip_warn2">és a készüléket használhatatlanná teheti.</string>
+ <string name="zip_back_cancel">Nyomja meg a vissza gombot a zip hozzáadásának visszavonásához.</string>
+ <string name="zip_back_clear">Nyomja meg a vissza gombot a várólista törléséhez.</string>
+ <string name="folder">Mappa:</string>
+ <string name="file">Fájl:</string>
+ <string name="zip_sig_chk">Zip aláírás ellenőrzése</string>
+ <string name="inject_twrp_chk">TWRP injektálása telepítés után</string>
+ <string name="install_reboot_chk">Újraindítás telepítés vége után</string>
+ <string name="options_hdr">Beállítások</string>
+ <string name="confirm_flash_hdr">Flashelés megerősítése</string>
+ <string name="zip_queue">Várólista:</string>
+ <string name="options">Beállítások:</string>
+ <string name="swipe_confirm"> Megerősítés</string>
+ <string name="zip_add_btn">Több Zip hozzáadása</string>
+ <string name="zip_clear_btn">Zip várólista törlése</string>
+ <string name="install_zip_count_hdr">%tw_zip_index% / %tw_zip_queue_count% Zip telepítése</string>
+ <string name="installing_zip_xml">Zip telepítése: %tw_file%</string>
+ <string name="failed">Sikertelen</string>
+ <string name="successful">Sikeres</string>
+ <string name="install_failed">A telepítés sikertelen</string>
+ <string name="install_successful">A telepítés sikeres</string>
+ <string name="wipe_cache_dalvik_btn">Gyorsítótár/dalvik törlése</string>
+ <string name="reboot_system_btn">Rendszer újraindítása</string>
+ <string name="install_sel_target">Válassza ki a célpartíciót</string>
+ <string name="flash_image_select">Kép flasheléséhez vállaszon partíciót:</string>
+ <string name="target_partition">Célpartíció:</string>
+ <string name="flashing_image">Kép flashelése...</string>
+ <string name="image_flashed">Kép flashelve</string>
+ <string name="wipe_cache_dalvik_confirm">Gyorsítótár &amp; Dalvik törlése?</string>
+ <string name="wiping_cache_dalvik">Gyorsítótár &amp; Dalvik törlése...</string>
+ <string name="wipe_cache_dalvik_complete">Gyorsítótár &amp; Dalvik törlése kész</string>
+ <string name="swipe_wipe">Csúsztasson a törléshez</string>
+ <string name="swipe_wipe_s"> Törlés</string>
+ <string name="no_os1">Nincs telepített operációs rendszer!</string>
+ <string name="no_osrb">Biztosan újra kívánja indítani?</string>
+ <string name="no_ospo">Biztosan ki szeretné kapcsolni?</string>
+ <string name="rebooting">Újraindítás...</string>
+ <string name="swipe_reboot">Csúsztasson az újraindításhoz</string>
+ <string name="swipe_reboot_s"> Újraindítás</string>
+ <string name="reboot_install_app_hdr">TWRP alkalmazás telepítése?</string>
+ <string name="reboot_install_app1">Szeretné telepíteni a hivatalos TWRP alkalmazást?</string>
+ <string name="reboot_install_app2">Az alkalmazás képes az új TWRP verziók ellenőrzésére.</string>
+ <string name="reboot_install_app_prompt_install">Azonnal telepítse a TWRP alkalmazást, ha nincs telepítve</string>
+ <string name="reboot_install_app_system">Telepítés rendszeralkalmazásként</string>
+ <string name="reboot_installing_app">Alkalmazás telepítése...</string>
+ <string name="swipe_to_install_app">Csúsztasson a TWRP alkalmazás telepítéséhez</string>
+ <string name="swipe_flash">Csúsztasson a flashelés megerősítéséhez</string>
+ <string name="confirm_action">Művelet megerősítése</string>
+ <string name="back_cancel">Nyomja meg a vissza gombot a megszakításhoz.</string>
+ <string name="cancel_btn">Mégsem</string>
+ <string name="wipe_hdr">Törlés</string>
+ <string name="factory_reset_hdr">Gyári beállítások visszaállítása</string>
+ <string name="factory_reset_btn">Gyári beállítások visszaállítása</string>
+ <string name="factory_reset1">Törli az Adatot, Gyorsítótárat, és Dalvikot</string>
+ <string name="factory_reset2">(nem érinti a belső tárolót)</string>
+ <string name="factory_reset3">Leggyakrabban ez az</string>
+ <string name="factory_reset4">amire szüksége van.</string>
+ <string name="factory_resetting">Gyári beállítások visszaállítása...</string>
+ <string name="advanced_wipe_hdr">Speciális törlés</string>
+ <string name="advanced_wipe_btn">Speciális törlés</string>
+ <string name="wipe_enc_confirm">Törli az adatok titkosítását?</string>
+ <string name="formatting_data">Adatok formázása...</string>
+ <string name="swipe_format_data">Csúsztasson az Adatok formázásához</string>
+ <string name="swipe_format_data_s"> Adatok formázása</string>
+ <string name="factory_reset_complete">Gyári beállítások visszaállítása kész</string>
+ <string name="sel_part_hdr">Válassza ki a partíciókat</string>
+ <string name="wipe_sel_confirm">Törli a kiválasztott partíció(ka)t?</string>
+ <string name="wiping_part">Partíció(k) törlése...</string>
+ <string name="wipe_complete">Törlés kész</string>
+ <string name="sel_part_wipe">Válassza ki a törlendő partíciókat:</string>
+ <string name="invalid_part_sel">Érvénytelen partíciós kiválasztás</string>
+ <string name="format_data_hdr">Adatok formázása</string>
+ <string name="format_data_btn">Adatok formázása</string>
+ <string name="format_data_ptr1">Adatok formázása törli az összes alkalmazását,</string>
+ <string name="format_data_ptr2">mentését, képét, videóját, médiáját és</string>
+ <string name="format_data_ptr3">eltávolítja a titkosítást a belső tárolón.</string>
+ <string name="format_data_adopted">Beleértve az adoptált tárolót</string>
+ <string name="format_data_lcp1">Adatok formázása törli az összes alkalmazását, mentését, képét, videóját, médiáját és</string>
+ <string name="format_data_lcp2">eltávolítja a titkosítást a belső tárolón.</string>
+ <string name="format_data_wtc1">Adatok formázása törli az összes alkalmazását,</string>
+ <string name="format_data_wtc2">mentését és médiáját. Nem lehet visszavonni.</string>
+ <string name="format_data_undo">Ezt nem lehet visszavonni.</string>
+ <string name="format_data_complete">Adatok formázása kész</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Folytatáshoz gépelje be: yes. Nyomja meg a vissza gombot a megszakításhoz.</string>
+ <string name="part_opt_hdr">Partíció lehetőségei: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Válasszon műveletet</string>
+ <string name="file_sys_opt">Fájlrendszer beállítások</string>
+ <string name="partition">Partíció: %tw_partition_name%</string>
+ <string name="part_mount_point">Csatlakoztatási pont: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Fájlrendszer: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Jelen: igen</string>
+ <string name="part_present_no">Jelen: nem</string>
+ <string name="part_removable_yes">Cserélhető: igen</string>
+ <string name="part_removable_no">Cserélhető: nem</string>
+ <string name="part_size">Méret: %tw_partition_size%MB</string>
+ <string name="part_used">Használt: %tw_partition_used%MB</string>
+ <string name="part_free">Szabad: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Biztonsági mentés mérete: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Fájlrendszer átméretezése</string>
+ <string name="resize_btn_s">Átméretezés</string>
+ <string name="resize_confirm">Átméretezi: %tw_partition_name%?</string>
+ <string name="resizing">Átméretezés...</string>
+ <string name="resize_complete">Átméretezés kész</string>
+ <string name="swipe_resize">Csúsztasson az átméretezéshez</string>
+ <string name="swipe_resize_s"> Átméretezés</string>
+ <string name="repair_btn">Fájlrendszer javítása</string>
+ <string name="repair_btn_s">Javítás</string>
+ <string name="repair_confirm">Javítja: %tw_partition_name%?</string>
+ <string name="repairing">Javítás...</string>
+ <string name="repair_complete">Javítás kész</string>
+ <string name="swipe_repair">Csúsztasson a javításhoz</string>
+ <string name="swipe_repair_s"> Javítás</string>
+ <string name="change_fs_btn">Fájlrendszer módosítása</string>
+ <string name="change_fs_btn_s">Módosítás</string>
+ <string name="change_fs_for_hdr">Fájlrendszer módosítása: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partíció: %tw_partition_name% &gt; Válasszon fájlrendszert</string>
+ <string name="change_fs_warn1">Néhány ROM vagy a kernel nem támogat bizonyos</string>
+ <string name="change_fs_warn2">fájlrendszert. Óvatosan folytassa!</string>
+ <string name="change_fs_confirm">Módosítja: %tw_partition_name%?</string>
+ <string name="formatting">Formázás...</string>
+ <string name="format_complete">Formázás kész</string>
+ <string name="swipe_change_fs">Csúsztasson a módosításhoz</string>
+ <string name="swipe_change_s"> Módosítás</string>
+ <string name="back_btn">Vissza</string>
+ <string name="wipe_enc_btn">Titkosítás törlése</string>
+ <string name="swipe_factory_reset">Csúsztasson a gyári beállítások visszaállításához</string>
+ <string name="repair_change_btn">Fájlrendszer javítása vagy módosítása</string>
+ <string name="storage_hdr">Tároló: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Biztonsági mentés</string>
+ <string name="backup_confirm_hdr">Biztonsági mentés megerősítése</string>
+ <string name="encryption_tab">TITKOSÍTÁS</string>
+ <string name="encryption">Titkosítás:</string>
+ <string name="name">Név:</string>
+ <string name="sel_part_backup">Válassza ki a menteni kívánt partíciókat:</string>
+ <string name="storage">Tárhely:</string>
+ <string name="enc_disabled">letiltva - állítson be jelszót az engedélyezéshez</string>
+ <string name="enc_enabled">engedélyezve</string>
+ <string name="enable_backup_comp_chk">Tömörítés engedélyezése</string>
+ <string name="skip_md5_backup_chk">Mentés közbeni MD5 generálás kihagyása</string>
+ <string name="disable_backup_space_chk" version="2">Szabad hely ellenőrzésének letiltása</string>
+ <string name="current_boot_slot">Jelenlegi Slot: %tw_active_slot%</string>
+ <string name="boot_slot_a">Slot A</string>
+ <string name="boot_slot_b">Slot B</string>
+ <string name="changing_boot_slot">Boot Slot váltása</string>
+ <string name="changing_boot_slot_complete">Boot Slot váltása befejezve</string>
+ <string name="refresh_sizes_btn">Méretek frissítése</string>
+ <string name="swipe_backup">Csúsztasson a biztonsági mentéshez</string>
+ <string name="append_date_btn">Hozzáadás dátuma</string>
+ <string name="backup_name_exists">Egy biztonsági mentés az adott névvel már létezik!</string>
+ <string name="encrypt_backup">Biztonsági mentését titkosítani szeretné?</string>
+ <string name="enter_pass">Adja meg a jelszót:</string>
+ <string name="enter_pass2">Adja meg a jelszót újra:</string>
+ <string name="pass_not_match">A jelszavak nem egyeznek!</string>
+ <string name="partitions">Partíciók:</string>
+ <string name="disabled">Letiltva</string>
+ <string name="enabled">Engedélyezve</string>
+ <string name="backup_name_hdr">Biztonsági mentés nevének beállítása</string>
+ <string name="progress">Folyamat:</string>
+ <string name="backup_complete">Biztonsági mentés kész</string>
+ <string name="restore_hdr">Visszaállítás</string>
+ <string name="sel_backup_hdr">Biztonsági mentés kiválasztása</string>
+ <string name="restore_sel_store_hdr">Mentés kiválasztása innen: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Válassza ki a visszaállítandó csomagot:</string>
+ <string name="restore_enc_backup_hdr">Titkosított biztonsági mentés</string>
+ <string name="restore_dec_fail">Jelszó hibás, próbálja meg újra!</string>
+ <string name="del_backup_btn">Biztonsági mentés törlése</string>
+ <string name="del_backup_confirm">Biztonsági mentés törlése?</string>
+ <string name="del_backup_confirm2">Ezt nem lehet visszavonni!</string>
+ <string name="deleting_backup">Biztonsági mentés törlése...</string>
+ <string name="backup_deleted">Biztonsági mentés törlése kész</string>
+ <string name="swipe_delete">Csúsztasson a törléshez</string>
+ <string name="swipe_delete_s"> Törlés</string>
+ <string name="restore_try_decrypt">Titkosított biztonsági mentés - Dekódolás megpróbálása</string>
+ <string name="restore_try_decrypt_s">Dekódolás megpróbálása</string>
+ <string name="restore_backup_date">Biztonsági mentés ideje: %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Válassza ki a visszaállítandó partíciókat:</string>
+ <string name="restore_enable_md5_chk">A biztonsági mentési fájlok MD5 ellenőrzésének engedélyezése</string>
+ <string name="restore_complete">Mentés helyreállítása kész</string>
+ <string name="swipe_restore">Csúsztasson a visszaállításhoz</string>
+ <string name="swipe_restore_s"> Visszaállítás</string>
+ <string name="rename_backup_hdr">Biztonsági mentés átnevezése</string>
+ <string name="rename_backup_confirm">Biztonsági mentés átnevezése?</string>
+ <string name="rename_backup_confirm2">Ezt nem lehet visszavonni!</string>
+ <string name="renaming_backup">Biztonsági mentés átnevezése...</string>
+ <string name="rename_backup_complete">Biztonsági mentés átnevezése kész</string>
+ <string name="swipe_to_rename">Csúsztasson az átnevezéshez</string>
+ <string name="swipe_rename"> Átnevezés</string>
+ <string name="confirm_hdr">Megerösítés</string>
+ <string name="mount_hdr">Csatolás</string>
+ <string name="mount_sel_part">Válassza ki a csatolandó partíciókat:</string>
+ <string name="mount_sys_ro_chk">Rendszerpartíció csatolása csak olvashatóként</string>
+ <string name="mount_sys_ro_s_chk">Rendszer csatolása RO</string>
+ <string name="decrypt_data_btn">Adat dekódolása</string>
+ <string name="disable_mtp_btn">MTP letiltása</string>
+ <string name="enable_mtp_btn">MTP engedélyezése</string>
+ <string name="mount_usb_storage_btn">USB-tár csatolása</string>
+ <string name="usb_storage_hdr">USB-tár</string>
+ <string name="usb_stor_mnt1">USB-tár csatolva</string>
+ <string name="usb_stor_mnt2">Győződjön meg róla, hogy biztonságosan távolítja el az eszközt</string>
+ <string name="usb_stor_mnt3">a számítógépről való leválasztás előtt!</string>
+ <string name="unmount_btn">Leválasztás</string>
+ <string name="rb_system_btn">Rendszer</string>
+ <string name="rb_poweroff_btn">Kikapcsolás</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download mód</string>
+ <string name="turning_off">Kikapcsolás...</string>
+ <string name="swipe_power_off">Csúsztasson a kikapcsoláshoz</string>
+ <string name="swipe_power_off_s">Kikapcsolás</string>
+ <string name="sys_ro_hdr">Változatlan rendszerpartíció</string>
+ <string name="sys_ro_keep">A rendszert továbbra is csak olvashatónak hagyja?</string>
+ <string name="sys_rop1">TWRP a rendszerpartícióját változatlanul hagyhatja,</string>
+ <string name="sys_rop2">hogy megkönnyítse a hivatalos frissítéseket.</string>
+ <string name="sys_rop3">TWRP nem lesz képes megakadályozni a gyári ROM-ot abban,</string>
+ <string name="sys_rop4">hogy lecserélje a TWRP-t és nem ajánlja fel a rootolást eszközéhez.</string>
+ <string name="sys_rop5">Zip-ek telepítése, vagy az adb műveletek továbbra is</string>
+ <string name="sys_rop6">módosítják a rendszer partícióit.</string>
+ <string name="sys_rol1">TWRP a rendszerpartícióját változatlanul hagyhatja, hogy megkönnyítse a hivatalos frissítéseket.</string>
+ <string name="sys_rol2">TWRP nem lesz képes megakadályozni a gyári ROM-ot abban, hogy lecserélje a TWRP-t és nem ajánlja fel a rootolást eszközéhez.</string>
+ <string name="sys_rol3">Zip-ek telepítése, vagy az adb műveletek továbbra is módosítják a rendszer partícióit.</string>
+ <string name="sys_ro_never_show_chk">Többé ne mutassa ezt a képernyőt</string>
+ <string name="sys_ro_keep_ro_btn">Csak olvasható megtartása</string>
+ <string name="swipe_allow_mod">Csúsztasson a módosítások engedélyezéséhez</string>
+ <string name="swipe_allow_mod_s">Módosítások engedélyezése</string>
+ <string name="settings_hdr">Beállítások</string>
+ <string name="settings_gen_hdr">Általános</string>
+ <string name="settings_gen_s_hdr">Általános</string>
+ <string name="settings_gen_btn">Általános</string>
+ <string name="use_rmrf_chk">Az rm -rf használata a formázás helyett</string>
+ <string name="use24clock_chk">24-órás idő használata</string>
+ <string name="rev_navbar_chk">Fordított navigációs sáv elrendezés</string>
+ <string name="simact_chk">Műveletek szimulálása téma teszteléséhez</string>
+ <string name="simfail_chk">Sikertelen műveletek szimulálása</string>
+ <string name="ctr_navbar_rdo">Navigációs sáv gombjai középre</string>
+ <string name="lft_navbar_rdo">Navigációs sáv gombjai balra igazítva</string>
+ <string name="rht_navbar_rdo">Navigációs sáv gombjai jobbra igazítva</string>
+ <string name="restore_defaults_btn">Alapértelmezés visszaállítása</string>
+ <string name="settings_tz_btn">Időzóna</string>
+ <string name="settings_screen_btn">Képernyő</string>
+ <string name="settings_screen_bright_btn">Képernyő fényereje</string>
+ <string name="settings_vibration_btn">Rezgés</string>
+ <string name="settings_language_btn">Nyelv</string>
+ <string name="time_zone_hdr">Időzóna</string>
+ <string name="sel_tz_list">Időzóna választása:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC-11) Szamoa, Midway-szigetek</string>
+ <string name="utcm10">(UTC-10) Hawaii</string>
+ <string name="utcm9">(UTC-9) Alaszka</string>
+ <string name="utcm8">(UTC -8) Csendes-óceáni idő</string>
+ <string name="utcm7">(UTC-7) Hegyvidéki idő</string>
+ <string name="utcm6">(UTC -6) Közép idő</string>
+ <string name="utcm5">(UTC -5) Keleti idő</string>
+ <string name="utcm4">(UTC -4) Atlanti idő</string>
+ <string name="utcm3">(UTC -3) Brazília, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Közép-Atlanti</string>
+ <string name="utcm1">(UTC -1) Azori-szigetek, Zöld-foki Köztársaság</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisszabon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brüsszel, Párizs</string>
+ <string name="utcp2">(UTC +2) Athén, Isztambul, Dél-afrikai Köztársaság</string>
+ <string name="utcp3">(UTC +3) Moszkva, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu-Dzabi, Tbiliszi, Maszkat</string>
+ <string name="utcp5">(UTC +5) Jekatyerinburg, Iszlámábád</string>
+ <string name="utcp6">(UTC +6) Almati, Dakka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Peking, Szingapúr, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokió, Szöul, Jakutszk</string>
+ <string name="utcp10">(UTC +10) Kelet-Ausztrália, Guam</string>
+ <string name="utcp11">(UTC +11) Vlagyivosztok, Salamon-szigetek</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fidzsi-szigetek</string>
+ <string name="sel_tz_offset">Válasszon eltolást (általában 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Nincs</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Nyári időszámítás használata (DST)</string>
+ <string name="curr_tz">Jelenlegi időzóna: %tw_time_zone%</string>
+ <string name="curr_tz_s">Jelenlegi időzóna:</string>
+ <string name="set_tz_btn">Időzóna beállítása</string>
+ <string name="settings_screen_hdr">Képernyő</string>
+ <string name="settings_screen_timeout_hdr">Képernyő időkorlátja</string>
+ <string name="enable_timeout_chk">Képernyő időkorlát engedélyezése</string>
+ <string name="screen_to_slider">Képernyő időkorlát másodpercben:</string>
+ <string name="screen_to_slider_s">Képernyő időkorlát másodpercben (0=letiltva): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Képernyő időkorlát beállítás nem érhető el</string>
+ <string name="screen_bright_slider">Fényerő: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Fényerő beállítás nem érhető el</string>
+ <string name="vibration_hdr">Rezgés</string>
+ <string name="button_vibration_hdr">Gombok rezgése</string>
+ <string name="kb_vibration_hdr">Billentyűzet rezgése</string>
+ <string name="act_vibration_hdr">Művelet rezgése</string>
+ <string name="button_vibration">Gomb rezgés:</string>
+ <string name="kb_vibration">Billentyűzet rezgés:</string>
+ <string name="act_vibration">Művelet rezgés:</string>
+ <string name="select_language">Nyelv kiválasztása:</string>
+ <string name="sel_lang_btn">Nyelv kiválasztása</string>
+ <string name="set_language_btn">Nyelv beállítása</string>
+ <string name="advanced_hdr">Haladó</string>
+ <string name="copy_log_confirm">Napló másolása SD-kártyára?</string>
+ <string name="copying_log" version="2">Napló másolása az SD-kártyára...</string>
+ <string name="copy_log_complete" version="2">Napló másolása kész</string>
+ <string name="fix_context_btn">Kontextus javítása</string>
+ <string name="part_sd_btn">SD-kártya particionálása</string>
+ <string name="part_sd_s_btn">SD-kártya</string>
+ <string name="file_manager_btn">Fájlkezelő</string>
+ <string name="language_hdr">Nyelv</string>
+ <string name="terminal_btn">Terminál</string>
+ <string name="reload_theme_btn">Téma újratöltése</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">TWRP injektálása</string>
+ <string name="inject_twrp_confirm">TWRP újrainjektálása?</string>
+ <string name="injecting_twrp">TWRP újrainjektálása...</string>
+ <string name="inject_twrp_complete">TWRP injektálása kész</string>
+ <string name="swipe_to_confirm">Csúsztasson a megerősítéshez</string>
+ <string name="part_sd_hdr">SD-kártya particionálása</string>
+ <string name="invalid_partsd_sel">Ki kell választania egy eltávolítható eszközt</string>
+ <string name="part_sd_lose">Minden fájl el fog veszni az SD-kártyán!</string>
+ <string name="part_sd_undo">Ez a művelet nem vonható vissza!</string>
+ <string name="part_sd_ext_sz">EXT méret:</string>
+ <string name="part_sd_swap_sz">Swap méret:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Fájlrendszer:</string>
+ <string name="swipe_part_sd">Csúsztasson a particionáláshoz</string>
+ <string name="swipe_part_sd_s">Particionálás</string>
+ <string name="partitioning_sd">SD-kártya particionálása...</string>
+ <string name="partitioning_sd2">Ez néhány percet igénybe vesz.</string>
+ <string name="part_sd_complete">Particionálás kész</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Eredeti boot visszaállítása</string>
+ <string name="dumlock_restore_confirm">Visszaállítja az eredeti boot lemezképet?</string>
+ <string name="dumlock_restoring">Eredeti boot visszaállítása...</string>
+ <string name="dumlock_restore_complete">Eredeti boot visszaállítása kész</string>
+ <string name="dumlock_reflash_btn">Recovery újraflashelése</string>
+ <string name="dumlock_reflash_confirm">Recovery újraflashelése bootba?</string>
+ <string name="dumlock_reflashing">Recovery újraflashelése bootba...</string>
+ <string name="dumlock_reflash_complete">Recovery flashelése bootba kész</string>
+ <string name="dumlock_install_btn">HTC Dumlock telepítése</string>
+ <string name="dumlock_install_confirm">HTC Dumlock telepítése a ROM-hoz?</string>
+ <string name="dumlock_installing">HTC Dumlock telepítése...</string>
+ <string name="dumlock_install_complete">HTC Dumlock telepítése kész</string>
+ <string name="swipe_to_unlock">Csúsztasson a feloldáshoz</string>
+ <string name="swipe_unlock"> Feloldás</string>
+ <string name="fm_hdr">Fájlkezelő</string>
+ <string name="fm_sel_file">Válasszon fájlt vagy mappát</string>
+ <string name="fm_type_folder">Mappa</string>
+ <string name="fm_type_file">Fájl</string>
+ <string name="fm_choose_act">Válasszon műveletet</string>
+ <string name="fm_selected">%tw_fm_type% kiválasztva:</string>
+ <string name="fm_copy_btn">Másolás</string>
+ <string name="fm_copy_file_btn">Fájl másolása</string>
+ <string name="fm_copy_folder_btn">Mappa másolása</string>
+ <string name="fm_copying">Másolás</string>
+ <string name="fm_move_btn">Áthelyezés</string>
+ <string name="fm_moving">Áthelyezés</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Törlés</string>
+ <string name="fm_deleting">Törlés</string>
+ <string name="fm_rename_btn">Átnevezés</string>
+ <string name="fm_rename_file_btn">Fájl átnevezése</string>
+ <string name="fm_rename_folder_btn">Mappa átnevezése</string>
+ <string name="fm_renaming">Átnevezés</string>
+ <string name="fm_sel_dest">Válassza ki a célmappát</string>
+ <string name="fm_sel_curr_folder">Válassza ki az aktuális mappát</string>
+ <string name="fm_rename_hdr">Átnevezés</string>
+ <string name="fm_set_perms_hdr">Engedélyek beállítása</string>
+ <string name="fm_perms">Engedélyek:</string>
+ <string name="fm_complete">Fájlművelet kész</string>
+ <string name="decrypt_data_hdr">Adat dekódolása</string>
+ <string name="decrypt_data_enter_pass">Adja meg a jelszót.</string>
+ <string name="decrypt_data_enter_pattern">Adja meg a mintát.</string>
+ <string name="decrypt_data_failed">Helytelen jelszó, próbálja újra!</string>
+ <string name="decrypt_data_failed_pattern">Helytelen minta, próbálja újra!</string>
+ <string name="decrypt_data_trying">Dekódolás megpróbálása</string>
+ <string name="term_hdr">Terminál parancs</string>
+ <string name="term_s_hdr">Terminál</string>
+ <string name="term_kill_btn">MEGÖL</string>
+ <string name="term_sel_folder_hdr">Navigáljon a kezdőmappához</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Dalvik gyorsítótár törlése</string>
+ <string name="sideload_wipe_cache_chk">Gyorsítótár törlése</string>
+ <string name="swipe_to_sideload">Csúsztasson a Sideload indításához</string>
+ <string name="swipe_sideload"> Indítás</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Használat: adb sideload fájlnév.zip</string>
+ <string name="sideload_complete">ADB Sideload kész</string>
+ <string name="fix_contexts_hdr">Kontextus javítása</string>
+ <string name="fix_contexts_note1">Megjegyzés: kontextus javítására ritkán van szükség.</string>
+ <string name="fix_contexts_note2">SELinux kontextus javítása a készülék</string>
+ <string name="fix_contexts_note3">nem megfelelő elindulását okozhatja.</string>
+ <string name="swipe_to_fix_contexts">Csúsztasson a kontextus javításához</string>
+ <string name="swipe_fix_contexts"> Kontextus javítása</string>
+ <string name="fixing_contexts">Kontextus javítása...</string>
+ <string name="fix_contexts_complete">Kontextus javítása kész</string>
+ <string name="reboot_hdr">Újraindítás</string>
+ <string name="su_hdr">SuperSU ellenőrzés</string>
+ <string name="su_note1">A készüléke nem tűnik rootoltnak.</string>
+ <string name="su_note2">SuperSU telepítése most?</string>
+ <string name="su_note3">Ez rootolni fogja a készülékét.</string>
+ <string name="su_cancel">Ne telepítse</string>
+ <string name="swipe_su_to_install">Csúsztasson a telepítéshez</string>
+ <string name="swipe_su_install"> Telepítés</string>
+ <string name="su_installing">SuperSU telepítése</string>
+ <string name="sel_storage_list">Válasszon tárolót</string>
+ <string name="ok_btn">OK</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Kernel nem támogatja a SELinux összefüggések olvasását.</string>
+ <string name="full_selinux">Teljes SELinux támogatás jelen van.</string>
+ <string name="no_selinux">Nincs SELinux támogatás (nincs libselinux).</string>
+ <string name="mtp_enabled">MTP engedélyezve</string>
+ <string name="mtp_crash">MTP összeomlott, MTP nem indul bootoláskor.</string>
+ <string name="decrypt_success">Sikeresen visszafejtve az alapértelmezett jelszóval.</string>
+ <string name="unable_to_decrypt">Visszafejtés sikertelen az alapértelmezett jelszóval. Szükség lehet az adatok formázására.</string>
+ <string name="generating_md51">MD5 generálása</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * MD5 generálása...</string>
+ <string name="md5_created"> * MD5 létrehozva.</string>
+ <string name="md5_error"> * MD5 hiba!</string>
+ <string name="md5_compute_error"> * MD5 számítási hiba.</string>
+ <string name="current_date">(Aktuális dátum)</string>
+ <string name="auto_generate">(Automatikus létrehozás)</string>
+ <string name="unable_to_locate_partition">'{1}' partíció nem található a biztonsági mentési számításokhoz.</string>
+ <string name="no_partition_selected">Nincs biztonsági mentésre kijelölt partíció.</string>
+ <string name="total_partitions_backup"> * A biztonsági mentésre jelölt partíciók teljes száma: {1}</string>
+ <string name="total_backup_size"> * Az összes adat teljes mérete: {1}MB</string>
+ <string name="available_space"> * A rendelkezésre álló terület: {1}MB</string>
+ <string name="unable_locate_storage">Nem található tárolóeszköz.</string>
+ <string name="no_space">Nincs elég szabad hely a tárolón.</string>
+ <string name="backup_started">[BIZTONSÁGI MENTÉS ELINDÍTVA]</string>
+ <string name="backup_folder"> * Biztonsági mentés mappa: {1}</string>
+ <string name="fail_backup_folder">Nem sikerült biztonsági mentés mappát létrehozni.</string>
+ <string name="avg_backup_fs">Fájlrendszer átlagos mentési sebessége: {1} MB/mp</string>
+ <string name="avg_backup_img">Lemezképpel rendelkező meghajtók átlagos mentési sebessége: {1} MB/mp</string>
+ <string name="total_backed_size">[TELJES MENTÉSI MÉRET: {1} MB]</string>
+ <string name="backup_completed">[BIZTONSÁGI MENTÉS KÉSZ {1} MÁSODPERC ALATT]</string>
+ <string name="restore_started">[VISSZAÁLLÍTÁS ELINDÍTVA]</string>
+ <string name="restore_folder">Mappa visszaállítása: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} kész ({2} másodperc)]</string>
+ <string name="verifying_md5">MD5 ellenőrzése</string>
+ <string name="skip_md5">MD5 ellenőrzés átugrása felhasználói beállítás alapján.</string>
+ <string name="calc_restore">Visszaállítási részletek számítása...</string>
+ <string name="restore_read_only">{1} nem állítható vissza -- csak olvashatóként csatolva.</string>
+ <string name="restore_unable_locate">Nem található a(z) '{1}' partíció a visszaállításhoz.</string>
+ <string name="no_part_restore">Nincs partíció kijelölve a visszaállításhoz.</string>
+ <string name="restore_part_count">{1} partíciók visszaállítása...</string>
+ <string name="total_restore_size">Teljes visszaállítás mérete: {1}MB</string>
+ <string name="updating_system_details">Rendszer részleteinek frissítése</string>
+ <string name="restore_completed">[VISSZAÁLLÍTÁS BEFEJEZŐDÖTT {1} MÁSODPERC ALATT]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Megnyitási hiba: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Nem található partíció a biztonsági mentés neve alapján: '{1}'</string>
+ <string name="unable_find_part_path">Nem található partíció a(z) '{1}' elérési útnak</string>
+ <string name="update_part_details">Partíciós adatok frissítése...</string>
+ <string name="update_part_details_done">...kész</string>
+ <string name="wiping_dalvik">Dalvik gyorsítótár mappák törlése...</string>
+ <string name="cleaned">Törölve: {1}...</string>
+ <string name="dalvik_done">-- Dalvik gyorsítótár mappák törlése kész!</string>
+ <string name="no_andsec">Nem találhatóak android secure partíciók.</string>
+ <string name="unable_to_locate">{1} nem található.</string>
+ <string name="wiping_datamedia">Belső tároló törlése -- /data/media...</string>
+ <string name="unable_to_mount">{1} nem csatolható</string>
+ <string name="unable_to_mount_internal">Belső tároló csatolása sikertelen</string>
+ <string name="unable_to_mount_storage">Tároló csatolása sikertelen</string>
+ <string name="fail_decrypt">Nem sikerült visszafejteni az adatokat.</string>
+ <string name="no_crypto_support">Nincs titkosítási támogatás beleépítve ebbe a változatba.</string>
+ <string name="decrypt_success_dev">Adatok sikeresen visszafejtve, új blokk eszköz: '{1}'</string>
+ <string name="decrypt_success_nodev">Adatok sikeresen visszafejtve</string>
+ <string name="done">Kész.</string>
+ <string name="start_partition_sd">SD-kártya particionálása...</string>
+ <string name="partition_sd_locate">Nem található eszköz a particionálásra.</string>
+ <string name="ext_swap_size">EXT + Swap mérete nagyobb az SD-kártya méreténél.</string>
+ <string name="remove_part_table">Partíciós tábla eltávolítása...</string>
+ <string name="unable_rm_part">A partíciós tábla eltávolítása sikertelen.</string>
+ <string name="create_part">{1} partíció létrehozása...</string>
+ <string name="unable_to_create_part">{1} partíció létrehozása sikertelen.</string>
+ <string name="format_sdext_as">Sd-ext formázása, mint {1}...</string>
+ <string name="part_complete">Particionálás kész.</string>
+ <string name="unable_to_open">'{1}' megnyitása sikertelen.</string>
+ <string name="mtp_already_enabled">MTP már engedélyezve van</string>
+ <string name="mtp_fail">MTP engedélyezése sikertelen</string>
+ <string name="no_mtp">Nem tartalmaz MTP támogatást</string>
+ <string name="image_flash_start">[KÉP FLASHELÉSE ELINDULT]</string>
+ <string name="img_to_flash">Kép a flasheléshez: '{1}'</string>
+ <string name="flash_unable_locate">Nem található a(z) '{1}' partíció a flasheléshez.</string>
+ <string name="no_part_flash">Nincs kijelölve partíció a flasheléshez.</string>
+ <string name="too_many_flash">Túl sok partíció kijelölve a flasheléshez.</string>
+ <string name="invalid_flash">Érvénytelen partíció megjelölve a flasheléshez.</string>
+ <string name="flash_done">[KÉP FLASHELÉSE KÉSZ]</string>
+ <string name="wiping">{1} törlése</string>
+ <string name="repair_not_exist">{1} nem létezik! Nem javítható!</string>
+ <string name="repairing_using">{1} javítása {2} segítségével...</string>
+ <string name="unable_repair">{1} nem javítható.</string>
+ <string name="mount_data_footer">Nem sikerült csatolni az /adat partíciót és a titkosítási lábléc sem található.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">'{1}' mappa létrehozása sikertelen ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">'{1}' csatolása sikertlelen ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">'{1}' leválasztása sikertlelen ({2})</string>
+ <string name="cannot_resize">{1} átméretezése sikertelen.</string>
+ <string name="repair_resize">{1} javítása az átméretezés előtt.</string>
+ <string name="unable_resize">Nem lehet átméretezni: {1}.</string>
+ <string name="no_md5_found">Nem található MD5 fájl ehhez: '{1}'. Kérjük, a visszaállításhoz szüntesse meg a kijelölést: \"MD5 ellenőrzés engedélyezése\".</string>
+ <string name="md5_fail_match">MD5 nem egyezik ezzel: '{1}'.</string>
+ <string name="md5_matched">MD5 egyezik ezzel: '{1}'.</string>
+ <string name="fail_decrypt_tar">Nem sikerült visszafejteni a(z) '{1}' tar fájlt</string>
+ <string name="format_data_msg">Lehet, hogy a recovery-be kell újraindítania ahhoz, hogy képes legyen használni az /adat partíciót.</string>
+ <string name="format_data_err">Nem sikerült formázni a titkosítás eltávolításához.</string>
+ <string name="formatting_using">{1} formázása {2} segítségével...</string>
+ <string name="unable_to_wipe">{1} törlése sikertelen.</string>
+ <string name="cannot_wipe">Nem lehet törölni a(z) {1} partíciót.</string>
+ <string name="remove_all">'{1}' alatt található összes fájl eltávolítása</string>
+ <string name="wiping_data">Adatok törlése a /data/media kivételével ...</string>
+ <string name="backing_up">{1} biztonsági mentése...</string>
+ <string name="backup_storage_warning">{1} biztonsági mentése nem tartalmaz belső tárhely fájlokat, mint pl. képek vagy letöltések.</string>
+ <string name="backing">Biztonsági mentés</string>
+ <string name="backup_size">Az '{1}' biztonsági mentés fájl mérete 0 bájt.</string>
+ <string name="datamedia_fs_restore">FIGYELMEZTETÉS: ez az /adat biztonsági mentés {1} fájlrendszerrel készült! A biztonsági mentés nem fog bootolni, hacsak nem tér vissza erre: {1}.</string>
+ <string name="restoring">{1} visszaállítása...</string>
+ <string name="restoring_hdr">Visszaállítás</string>
+ <string name="recreate_folder_err">{1} mappa újra létrehozása sikertelen.</string>
+ <string name="img_size_err">Kép mérete nagyobb, mint a céleszköz</string>
+ <string name="flashing">{1} flashelése...</string>
+ <string name="backup_folder_set">Biztonsági mentés mappája beállítva erre: '{1}'</string>
+ <string name="locate_backup_err">Nem található a(z) '{1}' biztonsági mentés</string>
+ <string name="set_restore_opt">Visszaállítási beállítások beállítása: '{1}':</string>
+ <string name="md5_check_skip">MD5 ellenőrzés kihagyása bekapcsolva</string>
+ <string name="ors_encrypt_restore_err">Nem sikerült az OpenRecoveryScript futtatása egy titkosított biztonsági mentés visszaállításához.</string>
+ <string name="mounting">Csatolás</string>
+ <string name="unmounting">Leválasztás</string>
+ <string name="mounted">'{1}' csatolva</string>
+ <string name="unmounted">'{1}' leválasztva</string>
+ <string name="setting">'{1}' beállítása erre: '{2}'</string>
+ <string name="setting_empty">'{1}' beállítása üres értékre</string>
+ <string name="making_dir1">Mappa létrehozása</string>
+ <string name="making_dir2">Mappa létrehozása: '{1}'</string>
+ <string name="running_command">Parancs futtatása</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">ADB sideload funkció indítása...</string>
+ <string name="need_new_adb">Adb 1.0.32, vagy frissebbre van szüksége ahhoz, hogy a sideload funkciót használhassa ehhez a készülékhez.</string>
+ <string name="no_pwd">Nincs megadott jelszó.</string>
+ <string name="done_ors">Kész feldolgozó script fájl</string>
+ <string name="injecttwrp">TWRP injektálása a boot lemezképbe...</string>
+ <string name="zip_err">'{1}' zip fájl telepítési hiba</string>
+ <string name="installing_zip">'{1}' zip fájl telepítése</string>
+ <string name="select_backup_opt">Biztonsági mentési beállítások:</string>
+ <string name="compression_on">Tömörítés bekapcsolva</string>
+ <string name="md5_off">MD5 generálás kikapcsolva</string>
+ <string name="backup_fail">Biztonsági mentés készítése sikertelen</string>
+ <string name="backup_clean">Biztonsági mentés nem sikerült. Mentési mappa tisztítása.</string>
+ <string name="running_recovery_commands">Recovery parancsok futtatása</string>
+ <string name="recovery_commands_complete">Recovery parancsok készen vannak</string>
+ <string name="running_ors">OpenRecoveryScript futtatása</string>
+ <string name="ors_complete">OpenRecoveryScript kész</string>
+ <string name="invalid_zip_format">Érvénytelen zip fájlformátum!</string>
+ <string name="check_for_md5">MD5 fájl ellenőrzése...</string>
+ <string name="fail_sysmap">'{1}' fájl feltérképezése sikertelen</string>
+ <string name="verify_zip_sig">Zip aláírás ellenőrzése...</string>
+ <string name="verify_zip_fail">Zip aláírás ellenőrzése nem sikerült!</string>
+ <string name="verify_zip_done">Zip aláírás ellenőrzése sikeres.</string>
+ <string name="zip_corrupt">Zip fájl sérült!</string>
+ <string name="no_md5">MD5 ellenőrzés kihagyása: nem található MD5 fájl</string>
+ <string name="md5_fail">MD5 nem egyezik meg</string>
+ <string name="md5_match">MD5 egyezik</string>
+ <string name="pid_signal">{1} folyamat véget ért a következő jellel: {2}</string>
+ <string name="pid_error">{1} folyamat véget ért a következő HIBÁVAL: {2}</string>
+ <string name="install_dumlock">HTC Dumlock telepítése a rendszerbe...</string>
+ <string name="dumlock_restore">Eredeti boot visszaállítása...</string>
+ <string name="dumlock_reflash">Recovery újraflashelése a bootba...</string>
+ <string name="run_script">{1} script futtatása...</string>
+ <string name="rename_stock">Gyári recovery fájl a /rendszer partíción átnevezve, annak megakadályozására, hogy a gyári ROM lecserélje TWRP-t.</string>
+ <string name="split_backup">Biztonsági mentés fájljának tördelése több archívumba...</string>
+ <string name="backup_error">Hiba a biztonsági mentés létrehozásakor.</string>
+ <string name="restore_error">Hiba a visszaállítási folyamat közben.</string>
+ <string name="split_thread">{1} szálazonosító tördelése {2} archívumba</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu / %llu fájl, %i%%</string>
+ <string name="size_progress">%lluMB / %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Adatpartíció visszafejtésének megpróbálása parancssor segítségével.</string>
+ <string name="base_pkg_err">Nem sikerült betölteni az alap csomagokat.</string>
+ <string name="simulating">Műveletek szimulálása...</string>
+ <string name="backup_cancel">Biztonsági mentés megszakítva</string>
+ <string name="config_twrp">TWRP konfigurálása...</string>
+ <string name="config_twrp_err">TWRP konfigurálása ezzel a kernellel sikertelen.</string>
+ <string name="copy_log">Recovery napló másolva ide: {1}.</string>
+ <string name="max_queue">Elérte a Zip várólista maximumát!</string>
+ <string name="min_queue">Elérte a Zip várólista minimumát!</string>
+ <string name="screenshot_saved">Képernyőmentés elmentve ide: {1}</string>
+ <string name="screenshot_err">Képernyőmentés készítése sikertelen!</string>
+ <string name="zip_wipe_cache">Egy vagy több zip kérte a gyorsítótár törlését - Gyorsítótár törlése most.</string>
+ <string name="and_sec_wipe_err">Android secure törlése sikertelen</string>
+ <string name="dalvik_wipe_err">Dalvik törlése nem sikerült</string>
+ <string name="auto_gen">(Automatikus létrehozás)</string>
+ <string name="curr_date">(Aktuális dátum)</string>
+ <string name="backup_name_len">Biztonsági mentés neve túl hosszú.</string>
+ <string name="backup_name_invalid">'{1}' biztonsági mentés név érvénytelen karaktert tartalmaz: '{1}'</string>
+ <string name="no_real_sdcard">Ez az eszköz nem rendelkezik igazi SD-kártyával! Megszakítás!</string>
+ <string name="cancel_sideload">ADB sideload megszakítva...</string>
+ <string name="change_fs_err">Fájlrendszer módosítási hiba.</string>
+ <string name="theme_ver_err">Egyéni téma verziója nem egyezik a TWRP verziójával. Gyári téma használata.</string>
+ <string name="up_a_level">(Egy szinttel feljebb)</string>
+ <string name="install_reboot" version="2">Újraindítás %tw_sleep% mp múlva</string>
+ <string name="adbbackup_error">Hiba az ADB Backup során. Kilépés..."</string>
+ <string name="adbbackup_control_error">Nincs hozzáférés: adb control channel</string>
+ <string name="twrp_adbbu_option">--twrp opció szükséges az ADB Backup-hoz </string>
+ <string name="partition_not_found">útvonal: {1} nem található a partíciós listában</string>
+ <string name="copy_kernel_log">Kernel log másolva: {1}</string>
+ <string name="include_kernel_log">Emellett Kernel Log másolása</string>
+ <string name="unable_set_boot_slot">Hiba a boot slot váltása során erre: {1}</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/it.xml b/gui/theme/common/languages/it.xml
new file mode 100644
index 000000000..b89528328
--- /dev/null
+++ b/gui/theme/common/languages/it.xml
@@ -0,0 +1,695 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Italiano</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">Immagine System</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Immagine Vendor</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="data_backup">Data (escl. archivio)</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Archivio interno</string>
+ <string name="microsd">Micro SD</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Data annessa</string>
+ <string name="adopted_storage">Archivio annesso</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Batteria: %tw_battery%</string>
+ <string name="sort_by_name">Ordina per Nome</string>
+ <string name="sort_by_date">Ordina per Data</string>
+ <string name="sort_by_size">Ordina per Dimensione</string>
+ <string name="sort_by_name_only">Nome</string>
+ <string name="sort_by_date_only">Data</string>
+ <string name="sort_by_size_only">Dimensione</string>
+ <string name="tab_general">GENERALE</string>
+ <string name="tab_options">OPZIONI</string>
+ <string name="tab_backup">BACKUP</string>
+ <string name="tab_time_zone">FUSO ORARIO</string>
+ <string name="tab_screen">SCHERMO</string>
+ <string name="tab_vibration">VIBRAZIONE</string>
+ <string name="tab_language">LINGUA</string>
+
+ <string name="install_btn">Installa</string>
+ <string name="wipe_btn">Pulisci</string>
+ <string name="backup_btn">Backup</string>
+ <string name="restore_btn">Ripristina</string>
+ <string name="mount_btn">Monta</string>
+ <string name="settings_btn">Impostazioni</string>
+ <string name="advanced_btn">Avanzate</string>
+ <string name="reboot_btn">Riavvia</string>
+ <string name="files_btn">File</string>
+ <string name="copy_log_btn">Copia Log</string>
+ <string name="select_type_hdr">Scegli tipologia</string>
+ <string name="install_zip_hdr">Installa Zip</string>
+ <string name="install_zip_btn">Installa Zip</string>
+ <string name="install_image_hdr">Installa Immagine</string>
+ <string name="install_image_btn">Installa Immagine</string>
+ <string name="install_select_file_hdr">Seleziona il file</string>
+ <string name="file_selector_folders_hdr">Cartelle</string>
+ <string name="select_file_from_storage">Seleziona il file da %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Installa</string>
+ <string name="select_storage_hdr">Scegli archivio</string>
+ <string name="select_storage_btn">Scegli archivio</string>
+ <string name="queue_hdr">Coda</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% file accodati su un max di 10</string>
+ <string name="zip_queue_count_s">File %tw_zip_queue_count% di 10:</string>
+ <string name="zip_warn1">Questa operazione potrebbe installare software</string>
+ <string name="zip_warn2">incompatibile e rendere il tuo dispositivo inutilizzabile.</string>
+ <string name="zip_back_cancel">Premi indietro per annullare la selezione di questo file.</string>
+ <string name="zip_back_clear">Premi indietro per eliminare la coda di Zip.</string>
+ <string name="folder">Cartella:</string>
+ <string name="file">File:</string>
+ <string name="zip_sig_chk">Verifica della firma del file Zip</string>
+ <string name="inject_twrp_chk">Esegui TWRP Inject dopo l'installazione</string>
+ <string name="install_reboot_chk">Riavvia dopo che l'installazione è completata</string>
+ <string name="options_hdr">Opzioni</string>
+ <string name="confirm_flash_hdr">Conferma installazione</string>
+ <string name="zip_queue">Coda:</string>
+ <string name="options">Opzioni:</string>
+ <string name="swipe_confirm"> Conferma</string>
+ <string name="zip_add_btn">Aggiungi altri Zip</string>
+ <string name="zip_clear_btn">Elimina la coda di Zip</string>
+ <string name="install_zip_count_hdr">Installazione Zip %tw_zip_index% di %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Installazione Zip %tw_file% in corso...</string>
+ <string name="failed">Operazione fallita</string>
+ <string name="successful">Operazione riuscita</string>
+ <string name="install_failed">Installazione fallita</string>
+ <string name="install_successful">Installazione riuscita</string>
+ <string name="wipe_cache_dalvik_btn">Pulisci Cache/Dalvik</string>
+ <string name="reboot_system_btn">Riavvia sistema</string>
+ <string name="install_sel_target">Scegli partizione</string>
+ <string name="flash_image_select">Scegli la partizione su cui installare:</string>
+ <string name="target_partition">Partizione scelta:</string>
+ <string name="flashing_image">Installazione Immagine...</string>
+ <string name="image_flashed">Immagine installata</string>
+ <string name="wipe_cache_dalvik_confirm">Pulire Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Pulizia Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Pulizia Cache &amp; Dalvik completata</string>
+ <string name="swipe_wipe">Scorri per pulire</string>
+ <string name="swipe_wipe_s"> Pulisci</string>
+ <string name="no_os1">Nessun SO installato. Sei</string>
+ <string name="no_osrb">certo di voler riavviare?</string>
+ <string name="no_ospo">certo di voler spegnere?</string>
+ <string name="rebooting">Riavvio...</string>
+ <string name="swipe_reboot">Scorri per riavviare</string>
+ <string name="swipe_reboot_s"> Riavvia</string>
+ <string name="reboot_install_app_hdr">Installazione app di TWRP</string>
+ <string name="reboot_install_app1">Ti piacerebbe installare l'app ufficiale di TWRP?</string>
+ <string name="reboot_install_app2">L'app può verificare nuove versioni di TWRP.</string>
+ <string name="reboot_install_app_prompt_install">Chiedi di installare l'app TWRP se non è installata</string>
+ <string name="reboot_install_app_system">Installa come app di Sistema</string>
+ <string name="reboot_installing_app">Installazione dell'app...</string>
+ <string name="swipe_to_install_app">Scorri per installare l'app</string>
+ <string name="swipe_flash">Scorri per installare</string>
+ <string name="confirm_action">Conferma l'azione</string>
+ <string name="back_cancel">Premi indietro per annullare.</string>
+ <string name="cancel_btn">Annulla</string>
+ <string name="wipe_hdr">Pulizia</string>
+ <string name="factory_reset_hdr">Reset di fabbrica</string>
+ <string name="factory_reset_btn">Reset di fabbrica</string>
+ <string name="factory_reset1">Data, Cache e Dalvik saranno puliti</string>
+ <string name="factory_reset2">(l'archivio interno sarà escluso)</string>
+ <string name="factory_reset3">La maggior parte delle volte, questo</string>
+ <string name="factory_reset4">sarà l'unico tipo di pulizia necessario.</string>
+ <string name="factory_resetting">Reset in corso...</string>
+ <string name="advanced_wipe_hdr">Pulizia avanzata</string>
+ <string name="advanced_wipe_btn">Pulizia avanzata</string>
+ <string name="wipe_enc_confirm">Eliminare la crittografia da Data?</string>
+ <string name="formatting_data">Formattazione di Data in corso...</string>
+ <string name="swipe_format_data">Scorri per formattare Data...</string>
+ <string name="swipe_format_data_s"> Formattazione Data</string>
+ <string name="factory_reset_complete">Reset di fabbrica completato</string>
+ <string name="sel_part_hdr">Selezione partizioni</string>
+ <string name="wipe_sel_confirm">Pulire questa(e) partizione(i)?</string>
+ <string name="wiping_part">Pulizia partizione(i) in corso...</string>
+ <string name="wipe_complete">Pulizia completata</string>
+ <string name="sel_part_wipe">Scegli le partizioni da pulire:</string>
+ <string name="invalid_part_sel">Scelta non valida</string>
+ <string name="format_data_hdr">Formattazione Data</string>
+ <string name="format_data_btn">Formatta Data</string>
+ <string name="format_data_ptr1">Formattare Data eliminerà tutte le tue app,</string>
+ <string name="format_data_ptr2">backup, immagini, video e file. Inoltre, la</string>
+ <string name="format_data_ptr3">crittografia dell'archivio interno sarà rimossa.</string>
+ <string name="format_data_adopted">Includi Archivio annesso</string>
+ <string name="format_data_lcp1">Formattare Data eliminerà tutte le app, backup, immagini, video e file.</string>
+ <string name="format_data_lcp2">Inoltre, la crittografia dell'archivio interno sarà rimossa.</string>
+ <string name="format_data_wtc1">Formattare Data eliminerà tutte le tue app,</string>
+ <string name="format_data_wtc2">backup e file. L'operazione è irreversibile.</string>
+ <string name="format_data_undo">L'operazione è irreversibile.</string>
+ <string name="format_data_complete">Formattazione di Data completata</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Scrivi yes per continuare. Premi indietro per annullare.</string>
+ <string name="part_opt_hdr">Opzioni partizione per: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Scegli azione</string>
+ <string name="file_sys_opt">Opzioni filesystem</string>
+ <string name="partition">Partizione: %tw_partition_name%</string>
+ <string name="part_mount_point">Punto di montaggio: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Filesystem: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Presente: Sì</string>
+ <string name="part_present_no">Presente: No</string>
+ <string name="part_removable_yes">Rimovibile: Sì</string>
+ <string name="part_removable_no">Rimovibile: No</string>
+ <string name="part_size">Dimensione: %tw_partition_size%MB</string>
+ <string name="part_used">Utilizzati: %tw_partition_used%MB</string>
+ <string name="part_free">Liberi: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Dimensione backup: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Ridimensiona filesystem</string>
+ <string name="resize_btn_s">Ridimensiona</string>
+ <string name="resize_confirm">Ridimensionare %tw_partition_name%?</string>
+ <string name="resizing">Ridimensionamento in corso...</string>
+ <string name="resize_complete">Ridimensionamento completato</string>
+ <string name="swipe_resize">Scorri per ridimensionare</string>
+ <string name="swipe_resize_s"> Ridimensiona</string>
+ <string name="repair_btn">Ripara filesystem</string>
+ <string name="repair_btn_s">Ripara</string>
+ <string name="repair_confirm">Riparare %tw_partition_name%?</string>
+ <string name="repairing">Riparazione in corso...</string>
+ <string name="repair_complete">Riparazione completata</string>
+ <string name="swipe_repair">Scorri per riparare</string>
+ <string name="swipe_repair_s"> Ripara</string>
+ <string name="change_fs_btn">Cambia filesystem</string>
+ <string name="change_fs_btn_s">Cambia</string>
+ <string name="change_fs_for_hdr">Cambia il filesystem di: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partizione: %tw_partition_name% &gt; Scegli filesystem</string>
+ <string name="change_fs_warn1">Alcune ROM o kernel non supportano determinati</string>
+ <string name="change_fs_warn2">filesystem. Procedi con cautela!</string>
+ <string name="change_fs_confirm">Modificare %tw_partition_name%?</string>
+ <string name="formatting">Formattazione in corso...</string>
+ <string name="format_complete">Formattazione completata</string>
+ <string name="swipe_change_fs">Scorri per modificare</string>
+ <string name="swipe_change_s"> Modifica</string>
+ <string name="back_btn">Indietro</string>
+ <string name="wipe_enc_btn">Elimina crittografia</string>
+ <string name="swipe_factory_reset">Scorri per eseguire reset di fabbrica</string>
+ <string name="repair_change_btn">Ripara o Modifica filesystem</string>
+ <string name="storage_hdr">Archivio: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Backup</string>
+ <string name="backup_confirm_hdr">Conferma Backup</string>
+ <string name="encryption_tab">CRITTOGRAFIA</string>
+ <string name="encryption">Crittografia:</string>
+ <string name="name">Nome:</string>
+ <string name="sel_part_backup">Seleziona le partizioni di cui eseguire un Backup:</string>
+ <string name="storage">Archivio:</string>
+ <string name="enc_disabled">disabilitata - imposta una password per abilitarla</string>
+ <string name="enc_enabled">abilitata</string>
+ <string name="enable_backup_comp_chk">Abilita compressione</string>
+ <string name="skip_md5_backup_chk">Salta la generazione di MD5 durante il backup</string>
+ <string name="disable_backup_space_chk" version="2">Disabilita controllo dello spazio libero prima del backup</string>
+ <string name="current_boot_slot">Slot attuale: %tw_active_slot%</string>
+ <string name="boot_slot_a">Slot A</string>
+ <string name="boot_slot_b">Slot B</string>
+ <string name="changing_boot_slot">Cambiamento Slot d'avvio</string>
+ <string name="changing_boot_slot_complete">Cambiamento Slot d'avvio completato</string>
+ <string name="refresh_sizes_btn">Aggiorna dimensioni</string>
+ <string name="swipe_backup">Scorri per eseguire il backup</string>
+ <string name="append_date_btn">Includi la data</string>
+ <string name="backup_name_exists">Esiste già un backup con lo stesso nome!</string>
+ <string name="encrypt_backup">Crittografare il backup?</string>
+ <string name="enter_pass">Inserisci una password:</string>
+ <string name="enter_pass2">Inserisci nuovamente la password:</string>
+ <string name="pass_not_match">Le password non corrispondono!</string>
+ <string name="partitions">Partizioni:</string>
+ <string name="disabled">Disabilitato</string>
+ <string name="enabled">Abilitato</string>
+ <string name="backup_name_hdr">Imposta nome backup</string>
+ <string name="progress">Avanzamento:</string>
+ <string name="backup_complete">Backup completato</string>
+ <string name="restore_hdr">Ripristina backup</string>
+ <string name="sel_backup_hdr">Scegli backup</string>
+ <string name="restore_sel_store_hdr">Seleziona un backup da %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Scegli i contenuti da ripristinare:</string>
+ <string name="restore_enc_backup_hdr">Backup crittografato</string>
+ <string name="restore_dec_fail">Password errata! Riprova.</string>
+ <string name="del_backup_btn">Elimina backup</string>
+ <string name="del_backup_confirm">Eliminare il backup?</string>
+ <string name="del_backup_confirm2">L'operazione è irreversibile!</string>
+ <string name="deleting_backup">Eliminazione backup in corso...</string>
+ <string name="backup_deleted">Eliminazione backup completata</string>
+ <string name="swipe_delete">Scorri per eliminare</string>
+ <string name="swipe_delete_s"> Elimina</string>
+ <string name="restore_try_decrypt">Backup crittografato - tentativo di decriptazione</string>
+ <string name="restore_try_decrypt_s">Tentativo di decriptazione</string>
+ <string name="restore_backup_date">Backup creato il %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Seleziona le partizioni da ripristinare:</string>
+ <string name="restore_enable_md5_chk">Abilita verifica MD5</string>
+ <string name="restore_complete">Ripristino completato</string>
+ <string name="swipe_restore">Scorri per ripristinare</string>
+ <string name="swipe_restore_s"> Ripristina</string>
+ <string name="rename_backup_hdr">Rinomina backup</string>
+ <string name="rename_backup_confirm">Rinominare il backup?</string>
+ <string name="rename_backup_confirm2">L'operazione è irreversibile!</string>
+ <string name="renaming_backup">Rinominazione del backup in corso...</string>
+ <string name="rename_backup_complete">Rinominazione del backup completata</string>
+ <string name="swipe_to_rename">Scorri per rinominare</string>
+ <string name="swipe_rename"> Rinomina</string>
+ <string name="confirm_hdr">Conferma</string>
+ <string name="mount_hdr">Monta</string>
+ <string name="mount_sel_part">Seleziona le partizioni da montare:</string>
+ <string name="mount_sys_ro_chk">Monta la partizione System in sola lettura</string>
+ <string name="mount_sys_ro_s_chk">Monta System in sola lettura</string>
+ <string name="decrypt_data_btn">Decripta Data</string>
+ <string name="disable_mtp_btn">Disabilita MTP</string>
+ <string name="enable_mtp_btn">Abilita MTP</string>
+ <string name="mount_usb_storage_btn">Monta archivio USB</string>
+ <string name="usb_storage_hdr">Archivio USB</string>
+ <string name="usb_stor_mnt1">Archivio USB montato</string>
+ <string name="usb_stor_mnt2">Accertati di aver eseguito la rimozione sicura</string>
+ <string name="usb_stor_mnt3">dal tuo computer prima di smontare l'archivio!</string>
+ <string name="unmount_btn">Smonta</string>
+ <string name="rb_system_btn">Sistema</string>
+ <string name="rb_poweroff_btn">Spegni</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">Spegnimento in corso...</string>
+ <string name="swipe_power_off">Scorri per spegnere</string>
+ <string name="swipe_power_off_s">Spegni</string>
+ <string name="sys_ro_hdr">Partizione System non modificata</string>
+ <string name="sys_ro_keep">Mantenere System in sola lettura?</string>
+ <string name="sys_rop1">TWRP può preservare la partizione System dalle modifiche</string>
+ <string name="sys_rop2">per facilitarti l'installazione di aggiornamenti ufficiali.</string>
+ <string name="sys_rop3">TWRP non potrà prevenire la sostituzione della Recovery da parte</string>
+ <string name="sys_rop4">della ROM, e non ti chiederà se desideri ottenere accesso root.</string>
+ <string name="sys_rop5">Installare Zip o eseguire operazioni mediante adb</string>
+ <string name="sys_rop6">potrà ugualmente operare modifiche su System.</string>
+ <string name="sys_rol1">TWRP può preservare la partizione System dalle modifiche per facilitarti l'installazione di aggiornamenti ufficiali.</string>
+ <string name="sys_rol2">TWRP non potrà prevenire la sostituzione della Recovery da parte della ROM, e non ti chiederà se desideri ottenere accesso root.</string>
+ <string name="sys_rol3">Installare Zip o eseguire operazioni mediante adb potrà ugualmente operare modifiche su System.</string>
+ <string name="sys_ro_never_show_chk">Non mostrare più questa schermata all'avvio</string>
+ <string name="sys_ro_keep_ro_btn">Mantieni sola lettura</string>
+ <string name="swipe_allow_mod">Scorri per permettere le modifiche</string>
+ <string name="swipe_allow_mod_s">Permetti modifiche</string>
+ <string name="settings_hdr">Impostazioni</string>
+ <string name="settings_gen_hdr">Generale</string>
+ <string name="settings_gen_s_hdr">Generale</string>
+ <string name="settings_gen_btn">Generale</string>
+ <string name="use_rmrf_chk">Usa rm -rf invece di formattare</string>
+ <string name="use24clock_chk">Usa orologio a 24 ore</string>
+ <string name="rev_navbar_chk">Rovescia la navbar</string>
+ <string name="simact_chk">Simula le azioni per il testing dei temi</string>
+ <string name="simfail_chk">Simula fallimenti per le azioni</string>
+ <string name="ctr_navbar_rdo">Centra pulsanti della navbar</string>
+ <string name="lft_navbar_rdo">Allinea pulsanti della navbar a SX</string>
+ <string name="rht_navbar_rdo">Allinea pulsanti della navbar a DX</string>
+ <string name="restore_defaults_btn">Ripristina predefinite</string>
+ <string name="settings_tz_btn">Fuso orario</string>
+ <string name="settings_screen_btn">Schermo</string>
+ <string name="settings_screen_bright_btn">Luminosità</string>
+ <string name="settings_vibration_btn">Vibrazione</string>
+ <string name="settings_language_btn">Lingua</string>
+ <string name="time_zone_hdr">Fuso orario</string>
+ <string name="sel_tz_list">Scegli fuso orario:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Central Time</string>
+ <string name="utcm5">(UTC -5) Eastern Time</string>
+ <string name="utcm4">(UTC -4) Atlantic Time</string>
+ <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string>
+ <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string>
+ <string name="utcp3">(UTC +3) Moscow, Baghdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Eastern Australia, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Scegli offset (solitamente 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Nessuno</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Usa ora legale</string>
+ <string name="curr_tz">Fuso orario attuale: %tw_time_zone%</string>
+ <string name="curr_tz_s">Fuso orario attuale:</string>
+ <string name="set_tz_btn">Imposta fuso orario</string>
+ <string name="settings_screen_hdr">Schermo</string>
+ <string name="settings_screen_timeout_hdr">Timeout schermo</string>
+ <string name="enable_timeout_chk">Abilita timeout schermo</string>
+ <string name="screen_to_slider">Timeout in secondi:</string>
+ <string name="screen_to_slider_s">Timeout in secondi (0=disabilitato): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Impostazione del timeout non disponibile</string>
+ <string name="screen_bright_slider">Luminosità: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Impostazione luminosità non disponibile</string>
+ <string name="vibration_hdr">Vibrazione</string>
+ <string name="button_vibration_hdr">Vibrazione pulsanti</string>
+ <string name="kb_vibration_hdr">Vibrazione tastiera</string>
+ <string name="act_vibration_hdr">Vibrazione azioni</string>
+ <string name="button_vibration">Vibrazione pulsanti:</string>
+ <string name="kb_vibration">Vibrazione tastiera:</string>
+ <string name="act_vibration">Vibrazione azioni:</string>
+ <string name="select_language">Scegli lingua:</string>
+ <string name="sel_lang_btn">Scegli lingua</string>
+ <string name="set_language_btn">Imposta lingua</string>
+ <string name="advanced_hdr">Avanzate</string>
+ <string name="copy_log_confirm">Copiare il log su scheda SD?</string>
+ <string name="copying_log" version="2">Copia i log nella scheda SD...</string>
+ <string name="copy_log_complete" version="2">Copia dei log completata</string>
+ <string name="fix_context_btn">Ripara contesti</string>
+ <string name="part_sd_btn">Partiziona SD</string>
+ <string name="part_sd_s_btn">Scheda SD</string>
+ <string name="file_manager_btn">File manager</string>
+ <string name="language_hdr">Lingua</string>
+ <string name="terminal_btn">Terminale</string>
+ <string name="reload_theme_btn">Ricarica tema</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">TWRP Inject</string>
+ <string name="inject_twrp_confirm">Eseguire nuovamente TWRP Inject?</string>
+ <string name="injecting_twrp">Esecuzione di TWRP Inject in corso...</string>
+ <string name="inject_twrp_complete">TWRP Inject completato</string>
+ <string name="swipe_to_confirm">Scorri per confermare</string>
+ <string name="part_sd_hdr">Partiziona scheda SD</string>
+ <string name="invalid_partsd_sel">Devi selezionare un dispositivo rimovibile</string>
+ <string name="part_sd_lose">Tutti i file sulla scheda SD andranno perduti!</string>
+ <string name="part_sd_undo">L'operazione è irreversibile!</string>
+ <string name="part_sd_ext_sz">Dimensione EXT:</string>
+ <string name="part_sd_swap_sz">Dimensione Swap:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Filesystem:</string>
+ <string name="swipe_part_sd">Scorri per partizionare</string>
+ <string name="swipe_part_sd_s">Partiziona</string>
+ <string name="partitioning_sd">Partizionamento scheda SD in corso...</string>
+ <string name="partitioning_sd2">Ci vorranno un paio di minuti.</string>
+ <string name="part_sd_complete">Partizionamento completato</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Ripristina Boot originale</string>
+ <string name="dumlock_restore_confirm">Ripristinare l'immagine di Boot originale?</string>
+ <string name="dumlock_restoring">Ripristino del Boot originale in corso...</string>
+ <string name="dumlock_restore_complete">Ripristino del Boot originale completato</string>
+ <string name="dumlock_reflash_btn">Reinstalla Recovery</string>
+ <string name="dumlock_reflash_confirm">Reinstallare la Recovery in Boot?</string>
+ <string name="dumlock_reflashing">Installazione Recovery in Boot in corso...</string>
+ <string name="dumlock_reflash_complete">Installazione della Recovery in Boot completata</string>
+ <string name="dumlock_install_btn">Installa HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Installare i file di HTC Dumlock nella ROM?</string>
+ <string name="dumlock_installing">Installazione di HTC Dumlock in corso...</string>
+ <string name="dumlock_install_complete">Installazione di HTC Dumlock Install completata</string>
+ <string name="swipe_to_unlock">Scorri per sbloccare</string>
+ <string name="swipe_unlock"> Sblocca</string>
+ <string name="fm_hdr">File manager</string>
+ <string name="fm_sel_file">Seleziona un file o una cartella</string>
+ <string name="fm_type_folder">Cartella</string>
+ <string name="fm_type_file">File</string>
+ <string name="fm_choose_act">Scegli azione</string>
+ <string name="fm_selected">%tw_fm_type% selezionato(a):</string>
+ <string name="fm_copy_btn">Copia</string>
+ <string name="fm_copy_file_btn">Copia</string>
+ <string name="fm_copy_folder_btn">Copia</string>
+ <string name="fm_copying">Copia di</string>
+ <string name="fm_move_btn">Sposta</string>
+ <string name="fm_moving">Spostamento di</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755 di</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Elimina</string>
+ <string name="fm_deleting">Eliminazione di</string>
+ <string name="fm_rename_btn">Rinomina</string>
+ <string name="fm_rename_file_btn">Rinomina</string>
+ <string name="fm_rename_folder_btn">Rinomina</string>
+ <string name="fm_renaming">Rinominazione di</string>
+ <string name="fm_sel_dest">Scegli cartella di destinazione</string>
+ <string name="fm_sel_curr_folder">Scegli cartella attuale</string>
+ <string name="fm_rename_hdr">Rinomina</string>
+ <string name="fm_set_perms_hdr">Imposta permessi</string>
+ <string name="fm_perms">Permessi:</string>
+ <string name="fm_complete">Operazione completata</string>
+ <string name="decrypt_data_hdr">Decripta Data</string>
+ <string name="decrypt_data_enter_pass">Inserisci la password.</string>
+ <string name="decrypt_data_failed">Password errata! Riprova.</string>
+ <string name="decrypt_data_failed_pattern">Sequenza errata! Riprova.</string>
+ <string name="decrypt_data_enter_pattern">Inserisci sequenza di sblocco.</string>
+ <string name="decrypt_data_trying">Tentativo di decriptazione in corso...</string>
+ <string name="term_hdr">Terminale</string>
+ <string name="term_s_hdr">Terminale</string>
+ <string name="term_kill_btn">TERMINA</string>
+ <string name="term_sel_folder_hdr">Scegli la cartella d'inizio</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Pulisci la cache Dalvik</string>
+ <string name="sideload_wipe_cache_chk">Pulisci Cache</string>
+ <string name="swipe_to_sideload">Scorri per avviare Sideload</string>
+ <string name="swipe_sideload"> Avvia</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Utilizzo: adb sideload nomefile.zip</string>
+ <string name="sideload_complete">ADB Sideload completato</string>
+ <string name="fix_contexts_hdr">Ripristina contesti</string>
+ <string name="fix_contexts_note1">Nota: il ripristino dei contesti è raramente necessario.</string>
+ <string name="fix_contexts_note2">Il ripristino dei contesti SELinux può impedire</string>
+ <string name="fix_contexts_note3">il corretto avvio del tuo dispositivo.</string>
+ <string name="swipe_to_fix_contexts">Scorri per ripristinare i contesti</string>
+ <string name="swipe_fix_contexts"> Ripristina contesti</string>
+ <string name="fixing_contexts">Ripristino dei contesti in corso...</string>
+ <string name="fix_contexts_complete">Ripristino dei contesti completato</string>
+ <string name="reboot_hdr">Riavvio</string>
+ <string name="su_hdr">Verifica SuperSU</string>
+ <string name="su_note1">Il tuo dispositivo non sembra disporre di accesso root.</string>
+ <string name="su_note2">Installare SuperSU ora?</string>
+ <string name="su_note3">Ciò ti garantirà privilegi di root.</string>
+ <string name="su_cancel">Non installare</string>
+ <string name="swipe_su_to_install">Scorri per installare</string>
+ <string name="swipe_su_install"> Installa</string>
+ <string name="su_installing">Installazione di SuperSU in corso...</string>
+ <string name="sel_storage_list">Scegli archivio</string>
+ <string name="ok_btn">OK</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Il kernel non supporta la lettura dei contesti SELinux.</string>
+ <string name="full_selinux">Supporto per SELinux completo non presente.</string>
+ <string name="no_selinux">Nessun supporto per SELinux (libselinux assente).</string>
+ <string name="mtp_enabled">MTP abilitato</string>
+ <string name="mtp_crash">MTP si è arrestato. Non sarà più inizializzato all'avvio.</string>
+ <string name="decrypt_success">Decriptazione con password predefinita avvenuta con successo.</string>
+ <string name="unable_to_decrypt">Impossibile decriptare con password predefinita. Potresti dover formattare Data.</string>
+ <string name="generating_md51">Generazione MD5 in corso...</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Generazione MD5 in corso...</string>
+ <string name="md5_created"> * MD5 creato.</string>
+ <string name="md5_error"> * Errore nell'MD5!</string>
+ <string name="md5_compute_error"> * Errore nel calcolo dell'MD5.</string>
+ <string name="current_date">(Data attuale)</string>
+ <string name="auto_generate">(Genera automaticamente)</string>
+ <string name="unable_to_locate_partition">Impossibile localizzare la partizione '{1}' per il calcolo delle dimensioni del backup.</string>
+ <string name="no_partition_selected">Nessuna partizione selezionata.</string>
+ <string name="total_partitions_backup"> * Numero di partizioni di cui eseguire il backup: {1}</string>
+ <string name="total_backup_size"> * Dimensione complessiva: {1}MB</string>
+ <string name="available_space"> * Spazio disponibile: {1}MB</string>
+ <string name="unable_locate_storage">Impossibile localizzare l'archivio.</string>
+ <string name="no_space">Lo spazio libero dell'archivio scelto è insufficiente.</string>
+ <string name="backup_started">[INIZIO DEL BACKUP]</string>
+ <string name="backup_folder"> * Cartella dei backup: {1}</string>
+ <string name="fail_backup_folder">Creazione della cartella dei backup fallita.</string>
+ <string name="avg_backup_fs">Velocità media di backup del filesystem: {1} MB/sec</string>
+ <string name="avg_backup_img">Velocità media di backup del drive: {1} MB/sec</string>
+ <string name="total_backed_size">[DIMENSIONE TOTALE SALVATA: {1} MB]</string>
+ <string name="backup_completed">[BACKUP COMPLETATO IN {1} SECONDI]</string>
+ <string name="restore_started">[INIZIO DEL RIPRISTINO]</string>
+ <string name="restore_folder">Cartella da cui ripristinare: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[Partizione {1} ripristinata ({2} secondi)]</string>
+ <string name="verifying_md5">Verifica MD5 in corso...</string>
+ <string name="skip_md5">Saltando la verifica del MD5 in base alle impostazioni stabilite.</string>
+ <string name="calc_restore">Calcolo dei dettagli del ripristino in corso...</string>
+ <string name="restore_read_only">Impossibile ripristinare {1} -- partizione montata in sola lettura.</string>
+ <string name="restore_unable_locate">Impossibile localizzare la partizione '{1}' per il ripristino.</string>
+ <string name="no_part_restore">Nessuna partizione selezionata per il ripristino.</string>
+ <string name="restore_part_count">Ripristino di {1} partizioni in corso...</string>
+ <string name="total_restore_size">Dimensione complessiva da ripristinare: {1}MB</string>
+ <string name="updating_system_details">Aggiornamento dei dettagli di System...</string>
+ <string name="restore_completed">[RIPRISTINO COMPLETATO IN {1} SECONDI]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Errore durante l'apertura di: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Impossibile localizzare la partizione dal nome di backup: '{1}'</string>
+ <string name="unable_find_part_path">Impossibile localizzare la partizione associata al percorso '{1}'</string>
+ <string name="update_part_details">Aggiornamento dei dettagli della partizione...</string>
+ <string name="update_part_details_done">...fatto</string>
+ <string name="wiping_dalvik">Pulizia delle cartelle della cache Dalvik...</string>
+ <string name="cleaned">Cartella pulita: {1}...</string>
+ <string name="dalvik_done">-- pulizia delle cartelle della cache Dalvik completata!</string>
+ <string name="no_andsec">Nessuna partizione Android protetta trovata.</string>
+ <string name="unable_to_locate">Impossibile localizzare {1}.</string>
+ <string name="wiping_datamedia">Pulizia dell'archivio interno -- /data/media...</string>
+ <string name="unable_to_mount">Impossibile montare {1}</string>
+ <string name="unable_to_mount_internal">Impossibile montare l'archivio interno</string>
+ <string name="unable_to_mount_storage">Impossibile montare l'archivio</string>
+ <string name="fail_decrypt">Decriptazione dei dati fallita.</string>
+ <string name="no_crypto_support">In questa build non è stato integrato alcun supporto per la crittografia.</string>
+ <string name="decrypt_success_dev">Dati decriptati con successo. Nuovo dispositivo di memoria: '{1}'</string>
+ <string name="decrypt_success_nodev">Dati decriptati con successo</string>
+ <string name="done">Fatto.</string>
+ <string name="start_partition_sd">Partizionamento scheda SD in corso...</string>
+ <string name="partition_sd_locate">Impossibile localizzare il dispositivo da partizionare.</string>
+ <string name="ext_swap_size">La dimensione complessiva di EXT e Swap eccede la capacità della scheda SD.</string>
+ <string name="remove_part_table">Rimozione della tabella delle partizioni in corso...</string>
+ <string name="unable_rm_part">Impossibile rimuovere la tabella delle partizioni.</string>
+ <string name="create_part">Creazione della partizione {1} in corso...</string>
+ <string name="unable_to_create_part">Impossibile creare la partizione {1}.</string>
+ <string name="format_sdext_as">Formattazione di sd-ext come {1}...</string>
+ <string name="part_complete">Partizionamento completato.</string>
+ <string name="unable_to_open">Impossibile aprire '{1}'.</string>
+ <string name="mtp_already_enabled">MTP è stato già abilitato</string>
+ <string name="mtp_fail">Impossibile abilitare MTP</string>
+ <string name="no_mtp">Supporto per MTP non incluso</string>
+ <string name="image_flash_start">[INIZIO INSTALLAZIONE DELL'IMMAGINE]</string>
+ <string name="img_to_flash">Immagine da installare: '{1}'</string>
+ <string name="flash_unable_locate">Impossibile localizzare la partizione '{1}' per l'installazione.</string>
+ <string name="no_part_flash">Nessuna partizione scelta per l'installazione.</string>
+ <string name="too_many_flash">Troppe partizioni scelte per l'installazione.</string>
+ <string name="invalid_flash">La partizione specificata non è valida.</string>
+ <string name="flash_done">[INSTALLAZIONE COMPLETATA]</string>
+ <string name="wiping">Pulizia di {1} in corso...</string>
+ <string name="repair_not_exist">{1} non esiste! Impossibile riparare!</string>
+ <string name="repairing_using">Riparazione di {1} utilizzando {2}...</string>
+ <string name="unable_repair">Impossibile riparare {1}.</string>
+ <string name="mount_data_footer">Impossibile montare la partizione Data. Footer criptato non trovato.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Impossibile creare la cartella '{1}' ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Impossibile montare '{1}' ({2}).</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">Impossibile smontare '{1}' ({2}).</string>
+ <string name="cannot_resize">Impossibile ridimensionare {1}.</string>
+ <string name="repair_resize">Riparazione di {1} prima del ridimensionamento.</string>
+ <string name="unable_resize">Impossibile ridimensionare {1}.</string>
+ <string name="no_md5_found">Nessun MD5 trovato per '{1}'. Deseleziona "Abilita verifica MD5" per procedere con il ripristino.</string>
+ <string name="md5_fail_match">Il valore MD5 non corrisponde per '{1}'.</string>
+ <string name="md5_matched">MD5 trovato per '{1}'.</string>
+ <string name="fail_decrypt_tar">Decriptazione fallita per il file Tar '{1}'</string>
+ <string name="format_data_msg">Potresti dover riavviare la Recovery per accedere nuovamente a Data.</string>
+ <string name="format_data_err">Impossibile formattare al fine di rimuovere la crittografia.</string>
+ <string name="formatting_using">Formattazione di {1} tramite {2}...</string>
+ <string name="unable_to_wipe">Impossibile pulire {1}.</string>
+ <string name="cannot_wipe">La partizione {1} non può essere pulita.</string>
+ <string name="remove_all">Eliminazione di tutti i file in '{1}'...</string>
+ <string name="wiping_data">Pulizia di Data tralasciando /data/media...</string>
+ <string name="backing_up">Backup di {1} in corso...</string>
+ <string name="backup_storage_warning">Backup di {1} esso non include nessun file dell'archivio interno come foto o download.</string>
+ <string name="backing">Backup in corso...</string>
+ <string name="backup_size">La dimensione del backup di '{1}' è 0 byte.</string>
+ <string name="datamedia_fs_restore">ATTENZIONE: Il backup di Data è stato fatto mentre il filesystem era {1}! Il dispositivo potrebbe non avviarsi finché non reimposti il filesystem {1}.</string>
+ <string name="restoring">Ripristino di {1} in corso...</string>
+ <string name="restoring_hdr">Ripristino in corso...</string>
+ <string name="recreate_folder_err">Impossibile ripristinare la cartella {1}.</string>
+ <string name="img_size_err">La dimensione dell'immagine eccede la capacità del dispositivo</string>
+ <string name="flashing">Installazione di {1}...</string>
+ <string name="backup_folder_set">Cartella dei backup impostata in '{1}'</string>
+ <string name="locate_backup_err">Impossibile localizzare il backup '{1}'</string>
+ <string name="set_restore_opt">Impostazione opzioni di ripristino: '{1}':</string>
+ <string name="md5_check_skip">Tralascia controllo MD5: attivo</string>
+ <string name="ors_encrypt_restore_err">Impossibile utilizzare OpenRecoveryScript per ripristinare un backup criptato.</string>
+ <string name="mounting">Montaggio</string>
+ <string name="unmounting">Smontaggio</string>
+ <string name="mounted">'{1}' montata</string>
+ <string name="unmounted">'{1}' smontata</string>
+ <string name="setting">Impostazione di '{1}' a '{2}'</string>
+ <string name="setting_empty">Impostazione di '{1}' a vuoto</string>
+ <string name="making_dir1">Creazione cartella</string>
+ <string name="making_dir2">Creazione cartella: '{1}'</string>
+ <string name="running_command">Esecuzione comando</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Avvio di ADB Sideload...</string>
+ <string name="need_new_adb">Necessiti di adb 1.0.32 o più recente, per inviare dati tramite Sideload.</string>
+ <string name="no_pwd">Nessuna password fornita.</string>
+ <string name="done_ors">Elaborazione script terminata</string>
+ <string name="injecttwrp">Installazione di TWRP in Boot tramite TWRP Inject...</string>
+ <string name="zip_err">Errore durante l'installazione dello Zip '{1}'</string>
+ <string name="installing_zip">Installazione dello Zip '{1}' in corso...</string>
+ <string name="select_backup_opt">Impostazione opzioni di backup:</string>
+ <string name="compression_on">La compressione è attiva</string>
+ <string name="md5_off">La generazione di MD5 è disattiva</string>
+ <string name="backup_fail">Backup non riuscito</string>
+ <string name="backup_clean">Backup non riuscito. Pulizia della cartella dei backup in corso...</string>
+ <string name="running_recovery_commands">Esecuzione dei comandi di ripristino...</string>
+ <string name="recovery_commands_complete">Esecuzione dei comandi completata</string>
+ <string name="running_ors">Esecuzione di OpenRecoveryScript...</string>
+ <string name="ors_complete">Esecuzione di OpenRecoveryScript completata</string>
+ <string name="invalid_zip_format">File zip non valido!</string>
+ <string name="check_for_md5">Controllo sull'MD5 in corso...</string>
+ <string name="fail_sysmap">Impossibile mappare '{1}'</string>
+ <string name="verify_zip_sig">Verifica della firma dello Zip in corso...</string>
+ <string name="verify_zip_fail">Verifica della firma non riuscita!</string>
+ <string name="verify_zip_done">Verifica della firma completata con successo.</string>
+ <string name="zip_corrupt">Il file Zip è corrotto!</string>
+ <string name="no_md5">Nessun MD5 trovato: la verifica non sarà eseguita</string>
+ <string name="md5_fail">L'MD5 non corrisponde</string>
+ <string name="md5_match">L'MD5 corrisponde</string>
+ <string name="pid_signal">Il processo {1} è terminato con segnale: {2}</string>
+ <string name="pid_error">Il processo {1} è terminato con ERRORE: {2}</string>
+ <string name="install_dumlock">Installazione di HTC Dumlock in System...</string>
+ <string name="dumlock_restore">Ripristino del Boot originale...</string>
+ <string name="dumlock_reflash">Reinstallazione della Recovery in Boot...</string>
+ <string name="run_script">Esecuzione dello script {1}...</string>
+ <string name="rename_stock">Il file della Recovery stock, in System, è stato rinominato per prevenire la sostituzione di TWRP da paete della ROM.</string>
+ <string name="split_backup">Divisione del backup in archivi multipli...</string>
+ <string name="backup_error">Errore nella creazione del backup.</string>
+ <string name="restore_error">Errore durante il ripristino.</string>
+ <string name="split_thread">Divisione del thread {1} nell'archivio {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">File %llu di %llu, %i%%</string>
+ <string name="size_progress">%lluMB di %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Tentativo di decriptare Data da riga di comando.</string>
+ <string name="base_pkg_err">Errore nel caricamento dei pacchetti base.</string>
+ <string name="simulating">Simulazione azioni in corso...</string>
+ <string name="backup_cancel">Backup annullato</string>
+ <string name="config_twrp">Configurazione di TWRP in corso...</string>
+ <string name="config_twrp_err">Impossibile configurare TWRP con questo kernel.</string>
+ <string name="copy_log">Log della Recovery copiato in {1}.</string>
+ <string name="max_queue">È stata raggiunta la dimensione massima della coda di Zip!</string>
+ <string name="min_queue">È stata raggiunta la dimensione minima della coda di Zip!</string>
+ <string name="screenshot_saved">Lo screenshot è stato salvato in {1}</string>
+ <string name="screenshot_err">Cattura dello screenshot non riuscita!</string>
+ <string name="zip_wipe_cache">Uno o più Zip ha richiesto la pulizia della Cache -- La Cache sarà pulita immediatamente.</string>
+ <string name="and_sec_wipe_err">Impossibile pulire android_secure</string>
+ <string name="dalvik_wipe_err">Pulizia della cache Dalvik fallita</string>
+ <string name="auto_gen">(Genera automaticamente)</string>
+ <string name="curr_date">(Data attuale)</string>
+ <string name="backup_name_len">Il nome del backup eccede la lunghezza massima.</string>
+ <string name="backup_name_invalid">Il nome del backup '{1}' contiene uno o più caratteri non validi: '{1}'</string>
+ <string name="no_real_sdcard">Questo dispositivo non possiede una scheda SD reale! Interruzione immediata!</string>
+ <string name="cancel_sideload">Annullamento di ADB sideload...</string>
+ <string name="change_fs_err">Errore nella modifica del filesystem.</string>
+ <string name="theme_ver_err">La versione del tema personalizzato non corrisponde alla versione di TWRP. Sarà utilizzato il tema predefinito.</string>
+ <string name="up_a_level">(Livello superiore)</string>
+ <string name="install_reboot" version="2">Riavvio in %tw_sleep% secondo(i)</string>
+ <string name="adbbackup_error">Errore con ADB Backup. Abbandono..."</string>
+ <string name="adbbackup_control_error">Impossibile scrivere nel canale di controllo adb</string>
+ <string name="twrp_adbbu_option">--twrp opzione richiesta per abilitare twrp adb backup</string>
+ <string name="partition_not_found">percorso: {1} non trovato nella lista delle partizioni</string>
+ <string name="copy_kernel_log">Log del kernel copiato in {1}</string>
+ <string name="include_kernel_log">Includi Log del Kernel</string>
+ <string name="unable_set_boot_slot">Errore nel cambio slot d'avvio del bootloader in {1}</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/nl.xml b/gui/theme/common/languages/nl.xml
new file mode 100644
index 000000000..340ce6d24
--- /dev/null
+++ b/gui/theme/common/languages/nl.xml
@@ -0,0 +1,673 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<language>
+ <display>Dutch</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">Systeem</string>
+ <string name="system_image">Systeem-Image</string>
+ <string name="vendor">Leverancier</string>
+ <string name="vendor_image">Leverancier-Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SD Kaart</string>
+ <string name="internal">Interne opslag</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Geadopteerde Data</string>
+ <string name="adopted_storage">Geadopteerde Opslag</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% ° C</string>
+ <string name="battery_pct">Accu: %tw_battery%</string>
+ <string name="sort_by_name">Sorteer op naam</string>
+ <string name="sort_by_date">Sorteer op datum</string>
+ <string name="sort_by_size">Sorteer op grootte</string>
+ <string name="sort_by_name_only">Naam</string>
+ <string name="sort_by_date_only">Datum</string>
+ <string name="sort_by_size_only">Grootte</string>
+ <string name="tab_general">ALGEMEEN</string>
+ <string name="tab_options">OPTIES</string>
+ <string name="tab_backup">BACK-UP</string>
+ <string name="tab_time_zone">TIJDZONE</string>
+ <string name="tab_screen">SCHERM</string>
+ <string name="tab_vibration">TRILLINGEN</string>
+ <string name="tab_language">TAAL</string>
+
+ <string name="install_btn">Installeren</string>
+ <string name="wipe_btn">Wissen</string>
+ <string name="backup_btn">Back-up</string>
+ <string name="restore_btn">Herstel</string>
+ <string name="mount_btn">Koppelen</string>
+ <string name="settings_btn">Instellingen</string>
+ <string name="advanced_btn">Geavanceerd</string>
+ <string name="reboot_btn">Herstarten</string>
+ <string name="files_btn">Bestanden</string>
+ <string name="copy_log_btn">Log kopiëren</string>
+ <string name="select_type_hdr">Type selecteren</string>
+ <string name="install_zip_hdr">Zip installeren</string>
+ <string name="install_zip_btn">Zip installeren</string>
+ <string name="install_image_hdr">Image installeren</string>
+ <string name="install_image_btn">Image installeren</string>
+ <string name="install_select_file_hdr">Bestand selecteren</string>
+ <string name="file_selector_folders_hdr">Mappen</string>
+ <string name="select_file_from_storage">Selecteer bestand in %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Installeren</string>
+ <string name="select_storage_hdr">Selecteer opslag</string>
+ <string name="select_storage_btn">Selecteer opslag</string>
+ <string name="queue_hdr">Wachtrij</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% van max 10 bestanden in de wachtrij</string>
+ <string name="zip_queue_count_s">Bestand %tw_zip_queue_count% van 10:</string>
+ <string name="zip_warn1">Deze toepassing kan niet-compatibele software installeren</string>
+ <string name="zip_warn2">en je apparaat onbruikbaar maken.</string>
+ <string name="zip_back_cancel">Klik op terug om het toevoegen van de Zip te annuleren.</string>
+ <string name="zip_back_clear">Klik op terug om de wachtrij op te schonen.</string>
+ <string name="folder">Map:</string>
+ <string name="file">Bestand:</string>
+ <string name="zip_sig_chk">Verificatie van de ondertekening van de zip</string>
+ <string name="inject_twrp_chk">TWRP injecteren na installeren</string>
+ <string name="install_reboot_chk">Herstart nadat de installatie compleet is</string>
+ <string name="options_hdr">Opties</string>
+ <string name="confirm_flash_hdr">Flash bevestigen</string>
+ <string name="zip_queue">Wachtrij:</string>
+ <string name="options">Instellingen:</string>
+ <string name="swipe_confirm"> Bevestigen</string>
+ <string name="zip_add_btn">Meer Zips toevoegen</string>
+ <string name="zip_clear_btn">Leeg zip wachtrij</string>
+ <string name="install_zip_count_hdr">Installeer Zip %tw_zip_index% van %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Zip Installeren: %tw_file%</string>
+ <string name="failed">Mislukt</string>
+ <string name="successful">Geslaagd</string>
+ <string name="install_failed">Installatie mislukt</string>
+ <string name="install_successful">Installatie is geslaagd</string>
+ <string name="wipe_cache_dalvik_btn">Wis cache / dalvik</string>
+ <string name="reboot_system_btn">Herstart systeem</string>
+ <string name="install_sel_target">Selecteer doelpartitie</string>
+ <string name="flash_image_select">Selecteer partitie om op te installeren:</string>
+ <string name="target_partition">Doelpartitie:</string>
+ <string name="flashing_image">Image installeren...</string>
+ <string name="image_flashed">Image geïnstalleerd</string>
+ <string name="wipe_cache_dalvik_confirm">Wis Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Cache &amp; Dalvik aan het wissen...</string>
+ <string name="wipe_cache_dalvik_complete">Cache &amp; Dalvik opschoning afgerond</string>
+ <string name="swipe_wipe">Veeg om te wissen</string>
+ <string name="swipe_wipe_s"> Wissen</string>
+ <string name="no_os1">Geen OS geïnstalleerd! Bent u</string>
+ <string name="no_osrb">weet u zeker dat u wilt herstarten?</string>
+ <string name="no_ospo">weet u zeker dat u uw apparaat wilt uitschakelen?</string>
+ <string name="rebooting">Herstarten...</string>
+ <string name="swipe_reboot">Veeg om te herstarten</string>
+ <string name="swipe_reboot_s"> Herstarten</string>
+ <string name="swipe_flash">Veeg om de installatie te bevestigen</string>
+ <string name="confirm_action">Bevestig actie</string>
+ <string name="back_cancel">Klik op terug om te annuleren.</string>
+ <string name="cancel_btn">Annuleren</string>
+ <string name="wipe_hdr">Wissen</string>
+ <string name="factory_reset_hdr">Fabrieksinstellingen</string>
+ <string name="factory_reset_btn">Fabrieksinstellingen</string>
+ <string name="factory_reset1">Wist data, cache en Dalvik</string>
+ <string name="factory_reset2">(Interne opslag niet meegenomen)</string>
+ <string name="factory_reset3">Merendeel van de tijd dit is</string>
+ <string name="factory_reset4">de enigste opschoning die nodig is.</string>
+ <string name="factory_resetting">Fabrieksinstellingen...</string>
+ <string name="advanced_wipe_hdr">Geavanceerd wissen</string>
+ <string name="advanced_wipe_btn">Geavanceerd wissen</string>
+ <string name="wipe_enc_confirm">Encryptie wissen van de data-partitie?</string>
+ <string name="formatting_data">Data formatteren...</string>
+ <string name="swipe_format_data">Veeg om Data te formatteren</string>
+ <string name="swipe_format_data_s"> Data formatteren</string>
+ <string name="factory_reset_complete">Fabrieksinstellingen hersteld</string>
+ <string name="sel_part_hdr">Partitie selecteren</string>
+ <string name="wipe_sel_confirm">Wis geselecteerde partitie(s)?</string>
+ <string name="wiping_part">Partitie(s) aan het wissen...</string>
+ <string name="wipe_complete">Wissen voltooid</string>
+ <string name="sel_part_wipe">Selecteer partities om te wissen:</string>
+ <string name="invalid_part_sel">Ongeldige partitie selectie</string>
+ <string name="format_data_hdr">Formatteer Data</string>
+ <string name="format_data_btn">Formatteer Data</string>
+ <string name="format_data_ptr1">Het formatteren van Data, verwijderd al uw apps,</string>
+ <string name="format_data_ptr2">backups, foto\'s, video\'s, media, en</string>
+ <string name="format_data_ptr3">verwijderd de versleuteling van de interne opslag.</string>
+ <string name="format_data_adopted">Geadopteerde opslag inbegrepen</string>
+ <string name="format_data_lcp1">Data formatteren verwijdert alle apps, back-ups, foto\'s, videos, media, en</string>
+ <string name="format_data_lcp2">verwijderd de versleuteling van de interne opslag.</string>
+ <string name="format_data_wtc1">Het formatteren van Data, verwijderd al uw apps,</string>
+ <string name="format_data_wtc2">back-ups en media. Dit kan niet ongedaan worden gemaakt.</string>
+ <string name="format_data_undo">Dit kan niet ongedaan worden gemaakt.</string>
+ <string name="format_data_complete">Data formattering voltooid</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Type Yes om door te gaan. Druk op terug om te annuleren.</string>
+ <string name="part_opt_hdr">Opties voor partitioneren: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Selecteer Actie</string>
+ <string name="file_sys_opt">Opties voor bestandssysteem</string>
+ <string name="partition">Partitie: %tw_partition_name%</string>
+ <string name="part_mount_point">Koppel Punt: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Bestandssysteem: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Aanwezig: Ja</string>
+ <string name="part_present_no">Aanwezig: Nee</string>
+ <string name="part_removable_yes">Verwijderbaar: Ja</string>
+ <string name="part_removable_no">Verwijderbaar: Nee</string>
+ <string name="part_size">Grootte: % tw_partition_size % MB</string>
+ <string name="part_used">Gebruikt: % tw_partition_used % MB</string>
+ <string name="part_free">Vrij: % tw_partition_free % MB</string>
+ <string name="part_backup_size">Back-up grootte: % tw_partition_backup_size % MB</string>
+ <string name="resize_btn">Bestandssysteem grootte aanpassen</string>
+ <string name="resize_btn_s">Grootte aanpassen</string>
+ <string name="resize_confirm">Grootte van %tw_partition_name% aanpassen?</string>
+ <string name="resizing">Grootte aanpassen...</string>
+ <string name="resize_complete">Aanpassen voltooid</string>
+ <string name="swipe_resize">Veeg om de grootte aan te passen</string>
+ <string name="swipe_resize_s"> Grootte aanpassen</string>
+ <string name="repair_btn">Bestandssysteem Repareren</string>
+ <string name="repair_btn_s">Repareren</string>
+ <string name="repair_confirm">%tw_partition_name% repareren?</string>
+ <string name="repairing">Aan het repareren...</string>
+ <string name="repair_complete">Reparartie voltooid</string>
+ <string name="swipe_repair">Veeg om te repareren</string>
+ <string name="swipe_repair_s"> Repareren</string>
+ <string name="change_fs_btn">Bestandssysteem Wijzigen</string>
+ <string name="change_fs_btn_s">Wijzigen</string>
+ <string name="change_fs_for_hdr">Bestandssysteem Wijzigen voor: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partitie: %tw_partition_name% &gt; selecteer bestandssysteem</string>
+ <string name="change_fs_warn1">Sommige ROMs of kernels hebben mogelijk geen ondersteuning voor sommige</string>
+ <string name="change_fs_warn2">bestandssystemen. Let daar op!</string>
+ <string name="change_fs_confirm">%tw_partition_name% wijzigen?</string>
+ <string name="formatting">Formatteren...</string>
+ <string name="format_complete">Formatteren voltooid</string>
+ <string name="swipe_change_fs">Veeg om te wijzigen</string>
+ <string name="swipe_change_s"> Wijzigen</string>
+ <string name="back_btn">Terug</string>
+ <string name="wipe_enc_btn">Versleuteling verwijderen</string>
+ <string name="swipe_factory_reset">Veeg voor Fabrieksinstellingen</string>
+ <string name="repair_change_btn">Repareer of verander het bestandssysteem</string>
+ <string name="storage_hdr">Opslag: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Back-up</string>
+ <string name="backup_confirm_hdr">Back-up bevestigen</string>
+ <string name="encryption_tab">VERSLEUTELING</string>
+ <string name="encryption">Versleuteling:</string>
+ <string name="name">Naam:</string>
+ <string name="sel_part_backup">Selecteer partities om te back-uppen:</string>
+ <string name="storage">Opslag:</string>
+ <string name="enc_disabled">uitgeschakeld - stel een wachtwoord in om in te schakelen</string>
+ <string name="enc_enabled">ingeschakeld</string>
+ <string name="enable_backup_comp_chk">Compressie inschakelen</string>
+ <string name="skip_md5_backup_chk">MD5 generatie tijdens back-up overslaan</string>
+ <string name="disable_backup_space_chk">Vrije ruimte controle uitschakelen</string>
+ <string name="refresh_sizes_btn">Grootte vernieuwen</string>
+ <string name="swipe_backup">Veeg voor back-up</string>
+ <string name="append_date_btn">Datum toevoegen</string>
+ <string name="backup_name_exists">Een back-up met die naam bestaat al!</string>
+ <string name="encrypt_backup">Back-up versleutelen?</string>
+ <string name="enter_pass">Wachtwoord invoeren:</string>
+ <string name="enter_pass2">Wachtwoord opnieuw invoeren:</string>
+ <string name="pass_not_match">Wachtwoorden komen niet overeen!</string>
+ <string name="partitions">Partities:</string>
+ <string name="disabled">Uitgeschakeld</string>
+ <string name="enabled">Ingeschakeld</string>
+ <string name="backup_name_hdr">Naam van de back-up</string>
+ <string name="progress">Voortgang:</string>
+ <string name="backup_complete">Back-up compleet</string>
+ <string name="restore_hdr">Herstellen</string>
+ <string name="sel_backup_hdr">Selecteer back-up</string>
+ <string name="restore_sel_store_hdr">Selecteer back-up van %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Selecteer pakket om te herstellen:</string>
+ <string name="restore_enc_backup_hdr">Versleutelde back-up</string>
+ <string name="restore_dec_fail">Wachtwoord is mislukt, probeer het opnieuw!</string>
+ <string name="del_backup_btn">Back-up verwijderen</string>
+ <string name="del_backup_confirm">Back-up verwijderen?</string>
+ <string name="del_backup_confirm2">Dit kan niet ongedaan worden gemaakt!</string>
+ <string name="deleting_backup">Back-up verwijderen...</string>
+ <string name="backup_deleted">Verwijderen van back-up voltooid</string>
+ <string name="swipe_delete">Veeg om te verwijderen</string>
+ <string name="swipe_delete_s"> Verwijderen</string>
+ <string name="restore_try_decrypt">Versleutelde back-up - proberen te decoderen</string>
+ <string name="restore_try_decrypt_s">Decodering proberen</string>
+ <string name="restore_backup_date">Back-up gemaakt op %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Selecteer partities om te herstellen:</string>
+ <string name="restore_enable_md5_chk">MD5 controle van back-up bestanden Inschakelen</string>
+ <string name="restore_complete">Herstellen voltooid</string>
+ <string name="swipe_restore">Veeg om te herstellen</string>
+ <string name="swipe_restore_s"> Herstellen</string>
+ <string name="rename_backup_hdr">Back-up hernoemen</string>
+ <string name="rename_backup_confirm">Back-up hernoemen?</string>
+ <string name="rename_backup_confirm2">Dit kan niet ongedaan worden gemaakt!</string>
+ <string name="renaming_backup">Back-up hernoemen...</string>
+ <string name="rename_backup_complete">Back-up hernoemen voltooid</string>
+ <string name="swipe_to_rename">Veeg om te hernoemen</string>
+ <string name="swipe_rename"> Hernoem</string>
+ <string name="confirm_hdr">Bevestig</string>
+ <string name="mount_hdr">Koppelen</string>
+ <string name="mount_sel_part">Selecteer partities om te koppelen:</string>
+ <string name="mount_sys_ro_chk">Systeem partitie als alleen-lezen koppelen</string>
+ <string name="mount_sys_ro_s_chk">Koppel Systeem RO</string>
+ <string name="decrypt_data_btn">Gegevens ontsleutelen</string>
+ <string name="disable_mtp_btn">MTP uitschakelen</string>
+ <string name="enable_mtp_btn">MTP Inschakelen</string>
+ <string name="mount_usb_storage_btn">USB-opslag koppelen</string>
+ <string name="usb_storage_hdr">USB-opslag</string>
+ <string name="usb_stor_mnt1">USB opslag gekoppeld</string>
+ <string name="usb_stor_mnt2">Zorg ervoor dat u uw apparaat veilig verwijdert</string>
+ <string name="usb_stor_mnt3">van de computer voordat u ontkoppeld!</string>
+ <string name="unmount_btn">Ontkoppelen</string>
+ <string name="rb_system_btn">Systeem</string>
+ <string name="rb_poweroff_btn">Uitzetten</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">Uitschakelen...</string>
+ <string name="swipe_power_off">Veeg om uit te schakelen</string>
+ <string name="swipe_power_off_s">Uitschakelen</string>
+ <string name="sys_ro_hdr">Ongewijzigde systeempartitie</string>
+ <string name="sys_ro_keep">Systeem als alleen lezen houden?</string>
+ <string name="sys_rop1">TWRP kan je systeempartitie ongewijzigd laten</string>
+ <string name="sys_rop2">om het verkrijgen van officiële updates makkelijker te maken.</string>
+ <string name="sys_rop3">TWRP zal niet in staat zijn om te voorkomen dat de originele ROM</string>
+ <string name="sys_rop4">TRWP vervangt en zal niet aanbieden het device te rooten.</string>
+ <string name="sys_rop5">Het installeren van zips of adb bewerkingen kunnen nog steeds</string>
+ <string name="sys_rop6">de systeem partitie wijzigen.</string>
+ <string name="sys_rol1">TWRP kan je system partitie ongewijzigd laten om het verkrijgen van officiële updates makkelijker te maken.</string>
+ <string name="sys_rol2">TWRP zal niet kunnen voorkomen dat de originele ROM TWRP vervangt en zal niet aanbieden om uw apparaat te rooten.</string>
+ <string name="sys_rol3">Het installeren van zips of adb bewerkingen kunnen nog steeds de systeem partitie wijzigen.</string>
+ <string name="sys_ro_never_show_chk">Dit scherm niet meer weergeven tijdens het opstarten</string>
+ <string name="sys_ro_keep_ro_btn">Alleen lezen behouden</string>
+ <string name="swipe_allow_mod">Veeg om modificaties toe te staan</string>
+ <string name="swipe_allow_mod_s">Wijzigingen toestaan</string>
+ <string name="settings_hdr">Instellingen</string>
+ <string name="settings_gen_hdr">Algemeen</string>
+ <string name="settings_gen_s_hdr">Algemeen</string>
+ <string name="settings_gen_btn">Algemeen</string>
+ <string name="use_rmrf_chk">Gebruik rm -rf in plaats van formatteren</string>
+ <string name="use24clock_chk">Gebruik 24-uurs klok</string>
+ <string name="rev_navbar_chk">Omgekeerde navbar lay-out</string>
+ <string name="simact_chk">Simuleren van acties voor het testen van het thema</string>
+ <string name="simfail_chk">Simuleren van mislukkingen van acties</string>
+ <string name="ctr_navbar_rdo">Navbar knoppen centreren</string>
+ <string name="lft_navbar_rdo">Navbar knoppen links uitlijnen</string>
+ <string name="rht_navbar_rdo">Navbar knoppen rechts uitlijnen</string>
+ <string name="restore_defaults_btn">Standaardwaarden herstellen</string>
+ <string name="settings_tz_btn">Tijdzone</string>
+ <string name="settings_screen_btn">Scherm</string>
+ <string name="settings_screen_bright_btn">Scherm helderheid</string>
+ <string name="settings_vibration_btn">Vibratie</string>
+ <string name="settings_language_btn">Taal</string>
+ <string name="time_zone_hdr">Tijdzone</string>
+ <string name="sel_tz_list">Selecteer tijdzone:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Midway-eilanden</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain-time</string>
+ <string name="utcm6">(UTC -6) Central-time, Mexico</string>
+ <string name="utcm5">(UTC -5) Eastern-time</string>
+ <string name="utcm4">(UTC -4) Atlantic-time</string>
+ <string name="utcm3">(UTC -3) Brazilië, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantische</string>
+ <string name="utcm1">(UTC -1) Azoren, Kaapverdië</string>
+ <string name="utc0">(UTC 0) Londen, Dublin, Lissabon</string>
+ <string name="utcp1">(UTC +1) Berlijn, Brussel, Parijs</string>
+ <string name="utcp2">(UTC +2) Athene, Istanboel, Zuid-Afrika</string>
+ <string name="utcp3">(UTC +3) Moskou, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Jekaterinenburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Alma-Ata, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokio, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Oost-Australië, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Salomoneilanden</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Compensatie selecteren (meestal 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Geen</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Gebruik zomertijd(DST)</string>
+ <string name="curr_tz">Huidige tijdzone: %tw_time_zone%</string>
+ <string name="curr_tz_s">Huidige tijdzone:</string>
+ <string name="set_tz_btn">Tijdzone instellen</string>
+ <string name="settings_screen_hdr">Scherm</string>
+ <string name="settings_screen_timeout_hdr">Scherm Timeout</string>
+ <string name="enable_timeout_chk">Scherm Timeout inschakelen</string>
+ <string name="screen_to_slider">Scherm timeout in seconden:</string>
+ <string name="screen_to_slider_s">Scherm timeout in seconden (0 = uitgeschakeld): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Scherm timeout instelling niet beschikbaar</string>
+ <string name="screen_bright_slider">Helderheid: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Helderheid instelling niet beschikbaar</string>
+ <string name="vibration_hdr">Vibratie</string>
+ <string name="button_vibration_hdr">Knop vibratie</string>
+ <string name="kb_vibration_hdr">Toetsenbord vibratie</string>
+ <string name="act_vibration_hdr">Actie vibratie</string>
+ <string name="button_vibration">Knop vibratie:</string>
+ <string name="kb_vibration">Toetsenbord vibratie:</string>
+ <string name="act_vibration">Actie vibratie:</string>
+ <string name="select_language">Taal selecteren:</string>
+ <string name="sel_lang_btn">Taal selecteren</string>
+ <string name="set_language_btn">Taal instellen</string>
+ <string name="advanced_hdr">Geavanceerd</string>
+ <string name="copy_log_confirm">Log naar SD-kaart kopiëren?</string>
+ <string name="copying_log">Log naar SD-kaart kopiëren...</string>
+ <string name="copy_log_complete">Log kopie voltooid</string>
+ <string name="fix_context_btn">Context repareren</string>
+ <string name="part_sd_btn">SD-kaart Partitioneren</string>
+ <string name="part_sd_s_btn">SD-kaart</string>
+ <string name="file_manager_btn">Bestandsbeheer</string>
+ <string name="language_hdr">Taal</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Thema herladen</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">TWRP Injecteren</string>
+ <string name="inject_twrp_confirm">TWRP opnieuw injecteren?</string>
+ <string name="injecting_twrp">TWRP Opnieuw injecteren...</string>
+ <string name="inject_twrp_complete">TWRP injectie voltooid</string>
+ <string name="swipe_to_confirm">Veeg om te bevestigen</string>
+ <string name="part_sd_hdr">SD-kaart Partitioneren</string>
+ <string name="invalid_partsd_sel">U moet een verwisselbaar apparaat selecteren</string>
+ <string name="part_sd_lose">U verliest alle bestanden op uw SD-kaart!</string>
+ <string name="part_sd_undo">Deze actie kan niet ongedaan gemaakt worden!</string>
+ <string name="part_sd_ext_sz">EXT-grootte:</string>
+ <string name="part_sd_swap_sz">Swap grootte:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Bestandsysteem:</string>
+ <string name="swipe_part_sd">Veeg om te partitioneren</string>
+ <string name="swipe_part_sd_s">Partitie</string>
+ <string name="partitioning_sd">SD-kaart partitioneren...</string>
+ <string name="partitioning_sd2">Dit duurt een paar minuten.</string>
+ <string name="part_sd_complete">Partitionering voltooid</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Originele boot herstellen</string>
+ <string name="dumlock_restore_confirm">De originele boot image herstellen?</string>
+ <string name="dumlock_restoring">Originele boot herstellen...</string>
+ <string name="dumlock_restore_complete">Originele Boot herstellen voltooid</string>
+ <string name="dumlock_reflash_btn">Recovery herflashen</string>
+ <string name="dumlock_reflash_confirm">Recovery naar boot herflashen?</string>
+ <string name="dumlock_reflashing">Recovery naar boot flashen...</string>
+ <string name="dumlock_reflash_complete">Recovery naar boot flashen voltooid</string>
+ <string name="dumlock_install_btn">HTC Dumlock installeren</string>
+ <string name="dumlock_install_confirm">HTC Dumlock bestanden in de ROM installeren?</string>
+ <string name="dumlock_installing">HTC Dumlock installeren...</string>
+ <string name="dumlock_install_complete">HTC Dumlock installatie voltooid</string>
+ <string name="swipe_to_unlock">Veeg om te ontgrendelen</string>
+ <string name="swipe_unlock"> Ontgrendelen</string>
+ <string name="fm_hdr">Bestandsbeheer</string>
+ <string name="fm_sel_file">Een bestand of map selecteren</string>
+ <string name="fm_type_folder">Map</string>
+ <string name="fm_type_file">Bestand</string>
+ <string name="fm_choose_act">Actie selecteren</string>
+ <string name="fm_selected">%tw_fm_type% geselecteerd:</string>
+ <string name="fm_copy_btn">Kopiëer</string>
+ <string name="fm_copy_file_btn">Bestand kopiëren</string>
+ <string name="fm_copy_folder_btn">Map kopiëren</string>
+ <string name="fm_copying">Kopiëren</string>
+ <string name="fm_move_btn">Verplaatsen</string>
+ <string name="fm_moving">Verplaatsen</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Verwijder</string>
+ <string name="fm_deleting">Verwijderen</string>
+ <string name="fm_rename_btn">Hernoemen</string>
+ <string name="fm_rename_file_btn">Bestand hernoemen</string>
+ <string name="fm_rename_folder_btn">Map hernoemen</string>
+ <string name="fm_renaming">Hernoemen</string>
+ <string name="fm_sel_dest">Selecteer doelmap</string>
+ <string name="fm_sel_curr_folder">Selecteer huidige map</string>
+ <string name="fm_rename_hdr">Hernoemen</string>
+ <string name="fm_set_perms_hdr">Machtigingen instellen</string>
+ <string name="fm_perms">Machtigingen:</string>
+ <string name="fm_complete">Bestandsbewerking gereed</string>
+ <string name="decrypt_data_hdr">Gegevens decoderen</string>
+ <string name="decrypt_data_enter_pass">Wachtwoord invoeren.</string>
+ <string name="decrypt_data_failed">Wachtwoord mislukt, probeer het opnieuw!</string>
+ <string name="decrypt_data_failed_pattern">Patroon mislukt, probeer het opnieuw!</string>
+ <string name="decrypt_data_enter_pattern">Patroon invoeren.</string>
+ <string name="decrypt_data_trying">Ontsleuteling proberen</string>
+ <string name="term_hdr">Terminal commandos</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">KILL</string>
+ <string name="term_sel_folder_hdr">Naar begin folder gaan</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Dalvik Cache legen</string>
+ <string name="sideload_wipe_cache_chk">Cache legen</string>
+ <string name="swipe_to_sideload">Veeg om sideloaden te beginnen</string>
+ <string name="swipe_sideload"> Start</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Gebruik: adb sideload bestandsnaam.zip</string>
+ <string name="sideload_complete">ADB Sideload voltooid</string>
+ <string name="fix_contexts_hdr">Context repareren</string>
+ <string name="fix_contexts_note1">Note: Het repareren van de context is zelden nodig.</string>
+ <string name="fix_contexts_note2">Het repareren van SELinux Contexts kan ervoor</string>
+ <string name="fix_contexts_note3">zorgen dat uw apparaat niet meer correct opstart.</string>
+ <string name="swipe_to_fix_contexts">Veeg om Contexts te repareren</string>
+ <string name="swipe_fix_contexts"> Contexts repareren</string>
+ <string name="fixing_contexts">Repareren van Contexts...</string>
+ <string name="fix_contexts_complete">Het repareren van Contexts is gereed</string>
+ <string name="reboot_hdr">Herstart</string>
+ <string name="su_hdr">SuperSU Controle</string>
+ <string name="su_note1">Uw apparaat lijkt niet geroot te zijn.</string>
+ <string name="su_note2">Installeer SuperSU nu?</string>
+ <string name="su_note3">Dit zal uw apparaat rooten.</string>
+ <string name="su_cancel">Installeer niet</string>
+ <string name="swipe_su_to_install">Veeg om te installeren</string>
+ <string name="swipe_su_install"> Installeren</string>
+ <string name="su_installing">Installeren van SuperSU</string>
+ <string name="sel_storage_list">Selecteer opslag</string>
+ <string name="ok_btn">Oké</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Kernel heeft geen ondersteuning voor het lezen van SELinux contexten.</string>
+ <string name="full_selinux">Volledige SELinux ondersteuning is aanwezig.</string>
+ <string name="no_selinux">Geen SELinux ondersteuning (geen libselinux).</string>
+ <string name="mtp_enabled">MTP ingeschakeld</string>
+ <string name="mtp_crash">MTP crashte, MTP niet starten tijdens boot.</string>
+ <string name="decrypt_success">Succesvol gedecodeerd met standaardwachtwoord.</string>
+ <string name="unable_to_decrypt">Kan niet decoderen met het standaardwachtwoord. U zal wellicht een Data format moeten uitvoeren.</string>
+ <string name="generating_md51">MD5 genereren</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * md5 genereren...</string>
+ <string name="md5_created"> * MD5 gemaakt.</string>
+ <string name="md5_error"> * MD5 fout!</string>
+ <string name="md5_compute_error"> * Fout tijdens het genereren van de MD5.</string>
+ <string name="current_date">(Huidige datum)</string>
+ <string name="auto_generate">(Automatisch genereren)</string>
+ <string name="unable_to_locate_partition">Kan partitie \'{1}\' niet vinden voor back-up berekeningen.</string>
+ <string name="no_partition_selected">Geen partities geselecteerd voor back-up.</string>
+ <string name="total_partitions_backup"> * Totaal aantal partities voor de back-up: {1}</string>
+ <string name="total_backup_size"> * Totale omvang van alle gegevens: {1}MB</string>
+ <string name="available_space"> * Beschikbare ruimte: {1}MB</string>
+ <string name="unable_locate_storage">Kan opslagapparaat niet vinden.</string>
+ <string name="no_space">Er is onvoldoende vrije ruimte op de opslag.</string>
+ <string name="backup_started">[BACK-UP GESTART]</string>
+ <string name="backup_folder"> * Back-up map: {1}</string>
+ <string name="fail_backup_folder">Het maken van de back-up folder is mislukt.</string>
+ <string name="avg_backup_fs">Gemiddelde back-up snelheid voor bestandssystemen: {1} MB/sec</string>
+ <string name="avg_backup_img">Gemiddelde back-up snelheid voor images: {1} MB/sec</string>
+ <string name="total_backed_size">[{1} MB TOTALE BACK-UP]</string>
+ <string name="backup_completed">[BACK-UP VOLTOOID IN {1} SECONDEN]</string>
+ <string name="restore_started">[HERSTEL BEGONNEN]</string>
+ <string name="restore_folder">Herstel map: \'{1}\'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} gereed ({2} seconden)]</string>
+ <string name="verifying_md5">MD5 Controleren</string>
+ <string name="skip_md5">MD5 controle op basis van gebruikersinstelling overslaan.</string>
+ <string name="calc_restore">Herstel details berekenen...</string>
+ <string name="restore_read_only">Kan {1} niet herstellen -- Als alleen lezen gekoppeld.</string>
+ <string name="restore_unable_locate">Kan \'{1}\' niet vinden voor herstellen.</string>
+ <string name="no_part_restore">Geen partities geselecteerd om te worden hersteld.</string>
+ <string name="restore_part_count">{1}-partities herstellen...</string>
+ <string name="total_restore_size">Totale herstel grootte is {1}MB</string>
+ <string name="updating_system_details">Systeemgegevens bijwerken</string>
+ <string name="restore_completed">[HERSTELLEN VOLTOOID IN {1} SECONDEN]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Fout bij het openen: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Kan geen partitie vinden met de naam van de back-up: \'{1}\'</string>
+ <string name="unable_find_part_path">Kan geen partitie vinden voor pad \'{1}\'</string>
+ <string name="update_part_details">Partitie gegevens bijwerken...</string>
+ <string name="update_part_details_done">...gedaan</string>
+ <string name="wiping_dalvik">Dalvik Cache folders legen...</string>
+ <string name="cleaned">Schoongemaakt: {1}...</string>
+ <string name="dalvik_done">--Dalvik Cache mappen legen voltooid!</string>
+ <string name="no_andsec">Geen beveiligde android partities gevonden.</string>
+ <string name="unable_to_locate">Kan {1} niet vinden.</string>
+ <string name="wiping_datamedia">Interne opslag legen --/data/media...</string>
+ <string name="unable_to_mount">Kan {1} niet koppelen</string>
+ <string name="unable_to_mount_internal">Kan internal_storage niet koppelen</string>
+ <string name="unable_to_mount_storage">Kan opslag niet koppelen</string>
+ <string name="fail_decrypt">Gegevens decoderen mislukt.</string>
+ <string name="no_crypto_support">Er is geen crypto ondersteuning gecompileerd in deze build.</string>
+ <string name="decrypt_success_dev">Data succesvol gedecodeerd, nieuw block device: \'{1}\'</string>
+ <string name="done">Gereed.</string>
+ <string name="start_partition_sd">SD-kaart partitioneren...</string>
+ <string name="partition_sd_locate">Kan apparaat om te partitioneren niet vinden.</string>
+ <string name="ext_swap_size">EXT + Swap grootte zijn groter dan de sd-kaart.</string>
+ <string name="remove_part_table">Partitie-tabel word verwijderd...</string>
+ <string name="unable_rm_part">Kan partitie-tabel niet verwijderen.</string>
+ <string name="create_part">Partitie {1} aanmaken...</string>
+ <string name="unable_to_create_part">Niet in staat om partitie {1} te maken.</string>
+ <string name="format_sdext_as">Sd-ext formatteren als {1}...</string>
+ <string name="part_complete">Partitionering voltooid.</string>
+ <string name="unable_to_open">Kan \'{1}\' niet openen.</string>
+ <string name="mtp_already_enabled">MTP al ingeschakeld</string>
+ <string name="mtp_fail">Kan MTP niet inschakelen</string>
+ <string name="no_mtp">MTP ondersteuning niet inbegrepen</string>
+ <string name="image_flash_start">[IMAGE FLASH BEGONNEN]</string>
+ <string name="img_to_flash">Image om te flashen: \'{1}\'</string>
+ <string name="flash_unable_locate">Kan partitie \'{1}\' niet vinden om te flashen.</string>
+ <string name="no_part_flash">Geen partities geselecteerd voor het flashen.</string>
+ <string name="too_many_flash">Teveel partities geselecteerd voor het flashen.</string>
+ <string name="invalid_flash">Ongeldige partitie om te flashen opgegeven.</string>
+ <string name="flash_done">[IMAGE FLASH VOLTOOID]</string>
+ <string name="wiping">Wissen {1}</string>
+ <string name="repair_not_exist">{1} bestaat niet! Kan niet herstellen!</string>
+ <string name="repairing_using">{1} Herstellen met behulp van {2}...</string>
+ <string name="unable_repair">Niet in staat om {1} te herstellen.</string>
+ <string name="mount_data_footer">Kan /data niet koppelen en kan de crypto voettekst niet vinden.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Kan map \'{1}\' niet maken ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Kan \'{1}\' niet koppelen ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">Kan \'{1}\' niet ontkoppelen ({2})</string>
+ <string name="cannot_resize">Kan het formaat van {1} niet wijzigen.</string>
+ <string name="repair_resize">Herstellen van {1} vóór het vergroten/verkleinen.</string>
+ <string name="unable_resize">Kan de grootte van {1} niet wijzigen.</string>
+ <string name="no_md5_found">Geen md5 bestand gevonden voor \'{1}\'. Gelieve MD5 controle inschakelen uitzetten om te herstellen.</string>
+ <string name="md5_fail_match">MD5 vergelijken mislukt op \'{1}\'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Het decoderen van tar bestand \'{1}\' is mislukt</string>
+ <string name="format_data_msg">U zou in recovery moeten herstarten om /data opnieuw te kunnen gebruiken.</string>
+ <string name="format_data_err">Kan niet formatteren om encryptie te verwijderen.</string>
+ <string name="formatting_using">{1} formatteren met behulp van {2}...</string>
+ <string name="unable_to_wipe">Kan niet wissen {1}.</string>
+ <string name="cannot_wipe">Partitie {1} kan niet gewist worden.</string>
+ <string name="remove_all">Alle bestanden onder \'{1}\' verwijderen</string>
+ <string name="wiping_data">Data wissen zonder het wissen van /data/media...</string>
+ <string name="backing_up">Back-up van {1}...</string>
+ <string name="backing">Bezig met back-up</string>
+ <string name="backup_size">Back-up grootte van \'{1}\' is 0 bytes.</string>
+ <string name="datamedia_fs_restore">Waarschuwing: Deze /data back-up is gemaakt met het {1} bestandssysteem! De back-up kan niet opstarten, tenzij u terug naar {1} gaat.</string>
+ <string name="restoring">Herstellen van {1}...</string>
+ <string name="restoring_hdr">Herstellen</string>
+ <string name="recreate_folder_err">Kan map {1} niet recreëren.</string>
+ <string name="img_size_err">Grootte van de image is groter dan het doelapparaat</string>
+ <string name="flashing">Flashen {1}...</string>
+ <string name="backup_folder_set">Back-up map ingesteld op \'{1}\'</string>
+ <string name="locate_backup_err">Kan de back-up niet vinden \'{1}\'</string>
+ <string name="set_restore_opt">Opties voor terugzetten instellen: \'{1}\':</string>
+ <string name="md5_check_skip">MD5 controle overslaan staat aan</string>
+ <string name="ors_encrypt_restore_err">Kan OpenRecoveryScript niet gebruiken om een versleutelde back-up te herstellen.</string>
+ <string name="mounting">Koppelen</string>
+ <string name="unmounting">Ontkoppelen</string>
+ <string name="mounted">Gekoppeld \'{1}\'</string>
+ <string name="unmounted">Ontkoppeld \'{1}\'</string>
+ <string name="setting">Instellen van \'{1}\' naar \'{2}\'</string>
+ <string name="setting_empty">Instellen van \'{1}\' naar leeg</string>
+ <string name="making_dir1">Map maken</string>
+ <string name="making_dir2">Map: \'{1}\' maken</string>
+ <string name="running_command">Commando uitvoeren</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">ADB sideload functie wordt gestart...</string>
+ <string name="need_new_adb">U moet adb 1.0.32 of nieuwer hebben om te sideloaden naar dit apparaat.</string>
+ <string name="no_pwd">Geen wachtwoord opgegeven.</string>
+ <string name="done_ors">Scriptbestand verwerking voltooid</string>
+ <string name="injecttwrp">Injecteren van TWRP in de boot image...</string>
+ <string name="zip_err">Fout bij het installeren van zip-bestand \'{1}\'</string>
+ <string name="installing_zip">Installeren van zip-bestand \'{1}\'</string>
+ <string name="select_backup_opt">Back-up opties instellen:</string>
+ <string name="compression_on">Compressie staat aan</string>
+ <string name="md5_off">MD5 Generatie is uitgeschakeld</string>
+ <string name="backup_fail">Back-up mislukt</string>
+ <string name="backup_clean">Back-up mislukt. Back-up map schoonmaken.</string>
+ <string name="running_recovery_commands">Herstel commando\'s uitvoeren</string>
+ <string name="recovery_commands_complete">Herstel commando\'s voltooien</string>
+ <string name="running_ors">OpenRecoveryScript is bezig</string>
+ <string name="ors_complete">OpenRecoveryScript is voltooid</string>
+ <string name="no_updater_binary">Kan \'{1}\' niet vinden in het zip-bestand.</string>
+ <string name="check_for_md5">Controle voor een MD5 bestand...</string>
+ <string name="fail_sysmap">Toewijzen van bestand \'{1}\' is mislukt</string>
+ <string name="verify_zip_sig">Zip handtekening controleren...</string>
+ <string name="verify_zip_fail">Zip handtekeningverificatie is mislukt!</string>
+ <string name="verify_zip_done">De handtekening van de zip met succes geverifieerd.</string>
+ <string name="zip_corrupt">Zip-bestand is beschadigd!</string>
+ <string name="no_md5">MD5 controle overslaan: geen MD5 bestand gevonden</string>
+ <string name="md5_fail">MD5 komt niet overeen</string>
+ <string name="md5_match">MD5 komt overeen</string>
+ <string name="pid_signal">{1} proces eindigde met signaal: {2}</string>
+ <string name="pid_error">{1} proces beëindigd met fout: {2}</string>
+ <string name="install_dumlock">HTC Dumlock installeren op het systeem...</string>
+ <string name="dumlock_restore">Originele boot herstellen...</string>
+ <string name="dumlock_reflash">Recovery herflashen op boot...</string>
+ <string name="run_script">Script {1} word uitgevoerd...</string>
+ <string name="rename_stock">Originele recovery bestand hernoemt in /system om te voorkomen dat de ROM TWRP vervangt.</string>
+ <string name="split_backup">Back-up bestand in meerdere archieven opbreken...</string>
+ <string name="backup_error">Fout bij het maken van backup.</string>
+ <string name="restore_error">Fout tijdens herstelproces.</string>
+ <string name="split_thread">Thread-ID {1} splitsen in archief {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu van %llu bestanden, %i%%</string>
+ <string name="size_progress">%lluMB van %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Probeert de data-partitie te decoderen via de command line.</string>
+ <string name="base_pkg_err">Fout bij het laden van de basispakketten.</string>
+ <string name="simulating">Acties simuleren...</string>
+ <string name="backup_cancel">Back-up geannuleerd</string>
+ <string name="config_twrp">TWRP configureren...</string>
+ <string name="config_twrp_err">Kan TWRP niet configureren met deze kernel.</string>
+ <string name="copy_log">Herstel log gekopieerd naar {1}.</string>
+ <string name="max_queue">Maximale zip wachtrij bereikt!</string>
+ <string name="min_queue">Minimale zip wachtrij bereikt!</string>
+ <string name="screenshot_saved">Screenshot is opgeslagen in {1}</string>
+ <string name="screenshot_err">Screenshot nemen mislukt!</string>
+ <string name="zip_wipe_cache">Een of meer zips verzochten een cache verwijdering -- Cache nu verwijderen.</string>
+ <string name="and_sec_wipe_err">Kan android secure niet wissen</string>
+ <string name="dalvik_wipe_err">Dalvik legen mislukt</string>
+ <string name="auto_gen">(Automatisch genereren)</string>
+ <string name="curr_date">(Huidige datum)</string>
+ <string name="backup_name_len">Back-up naam is te lang.</string>
+ <string name="backup_name_invalid">Back-up naam \'{1}\' bevat een ongeldig teken: \'{1}\'</string>
+ <string name="no_real_sdcard">Dit apparaat beschikt niet over een echte SD kaart! Afbreken!</string>
+ <string name="cancel_sideload">ADB sideload annuleren...</string>
+ <string name="change_fs_err">Fout tijdens het veranderen van het bestandssysteem.</string>
+ <string name="theme_ver_err">Aangepaste thema versie komt niet overeen met TWRP versie. Stock thema gebruiken.</string>
+ <string name="up_a_level">(Niveau omhoog)</string>
+ <string name="install_reboot">Herstarten in 5 seconden</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/pl.xml b/gui/theme/common/languages/pl.xml
new file mode 100644
index 000000000..7721421a4
--- /dev/null
+++ b/gui/theme/common/languages/pl.xml
@@ -0,0 +1,673 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Polish</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">Obraz Systemu</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Obraz Vendor</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">Karta SD</string>
+ <string name="internal">Pamięć Wewnętrzna</string>
+ <string name="microsd">Karta MicroSD</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted Storage</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Projekt Team Win Recovery</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Bateria: %tw_battery%</string>
+ <string name="sort_by_name">Sortuj wg nazwy</string>
+ <string name="sort_by_date">Sortuj wg daty</string>
+ <string name="sort_by_size">Sortuj wg rozmiaru</string>
+ <string name="sort_by_name_only">Nazwa</string>
+ <string name="sort_by_date_only">Data</string>
+ <string name="sort_by_size_only">Rozmiar</string>
+ <string name="tab_general">GŁÓWNE</string>
+ <string name="tab_options">OPCJE</string>
+ <string name="tab_backup">KOPIA ZAPASOWA</string>
+ <string name="tab_time_zone">STREFA CZASOWA</string>
+ <string name="tab_screen">EKRAN</string>
+ <string name="tab_vibration">WIBRACJE</string>
+ <string name="tab_language">JĘZYK</string>
+
+ <string name="install_btn">Instaluj</string>
+ <string name="wipe_btn">Wyczyść</string>
+ <string name="backup_btn">Kopia</string>
+ <string name="restore_btn">Przywróć</string>
+ <string name="mount_btn">Zamontuj</string>
+ <string name="settings_btn">Ustawienia</string>
+ <string name="advanced_btn">Zaawansowane</string>
+ <string name="reboot_btn">Restart</string>
+ <string name="files_btn">Pliki</string>
+ <string name="copy_log_btn">Kopiuj Log</string>
+ <string name="select_type_hdr">Wybierz Typ</string>
+ <string name="install_zip_hdr">Instaluj Zip</string>
+ <string name="install_zip_btn">Instaluj Zip</string>
+ <string name="install_image_hdr">Instaluj Obraz</string>
+ <string name="install_image_btn">Instaluj Obraz</string>
+ <string name="install_select_file_hdr">Wybierz Plik</string>
+ <string name="file_selector_folders_hdr">Foldery</string>
+ <string name="select_file_from_storage">Wybierz plik z %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Instaluj</string>
+ <string name="select_storage_hdr">Wybierz Pamięć</string>
+ <string name="select_storage_btn">Wybierz Pamięć</string>
+ <string name="queue_hdr">Kolejka</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% z max. 10 plików w kolejce</string>
+ <string name="zip_queue_count_s">Plik %tw_zip_queue_count% z 10:</string>
+ <string name="zip_warn1">Ta operacja może zainstalować niekompatybilne oprogramowanie</string>
+ <string name="zip_warn2">i uczynić urządzenie nie nadającym się do użytku.</string>
+ <string name="zip_back_cancel">Naciśnij wstecz, aby anulować dodawanie tego pliku.</string>
+ <string name="zip_back_clear">Naciśnij wstecz, aby wyczyścić kolejkę.</string>
+ <string name="folder">Folder:</string>
+ <string name="file">Plik:</string>
+ <string name="zip_sig_chk">Weryfikacja sygnatury pliku zip</string>
+ <string name="inject_twrp_chk">Zaszczep TWRP po instalacji</string>
+ <string name="install_reboot_chk">Uruchom ponownie po instalacji</string>
+ <string name="options_hdr">Opcje</string>
+ <string name="confirm_flash_hdr">Potwierdź instalację</string>
+ <string name="zip_queue">Kolejka:</string>
+ <string name="options">Opcje:</string>
+ <string name="swipe_confirm"> Potwierdź</string>
+ <string name="zip_add_btn">Dodaj więcej plików</string>
+ <string name="zip_clear_btn">Wyczyść kolejkę plików</string>
+ <string name="install_zip_count_hdr">Zainstaluj plik %tw_zip_index% z %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Instalowanie plików: %tw_file%</string>
+ <string name="failed">Niepowodzenie</string>
+ <string name="successful">Sukces</string>
+ <string name="install_failed">Instalacja nieudana</string>
+ <string name="install_successful">Instalacja zakończona pomyślnie</string>
+ <string name="wipe_cache_dalvik_btn">Wyczyść Cache/Dalvik</string>
+ <string name="reboot_system_btn">Uruchom System</string>
+ <string name="install_sel_target">Wybierz partycję docelową</string>
+ <string name="flash_image_select">Wybierz partycję do zainstalowania obrazu:</string>
+ <string name="target_partition">Partycja docelowa:</string>
+ <string name="flashing_image">Instalowanie obrazu...</string>
+ <string name="image_flashed">Obraz zainstalowany</string>
+ <string name="wipe_cache_dalvik_confirm">Wyczyścić Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Czyszczenie Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Czyszczenie Cache &amp; Dalvik zakończone</string>
+ <string name="swipe_wipe">Przesuń, aby wyczyścić</string>
+ <string name="swipe_wipe_s"> Wyczyść</string>
+ <string name="no_os1">Brak zainstalowanego systemu! Jesteś</string>
+ <string name="no_osrb">pewien, że chcesz uruchomić urządzenie?</string>
+ <string name="no_ospo">pewien, że chcesz wyłączyć?</string>
+ <string name="rebooting">Restartowanie...</string>
+ <string name="swipe_reboot">Przesuń, aby zrestartować</string>
+ <string name="swipe_reboot_s"> Zrestartuj</string>
+ <string name="swipe_flash">Przesuń, aby zainstalować</string>
+ <string name="confirm_action">Potwierdź czynność</string>
+ <string name="back_cancel">Naciśnij wstecz, aby anulować.</string>
+ <string name="cancel_btn">Anuluj</string>
+ <string name="wipe_hdr">Wyczyść</string>
+ <string name="factory_reset_hdr">Przywrócenie ustawień fabrycznych</string>
+ <string name="factory_reset_btn">Przywrócenie ustawień fabrycznych</string>
+ <string name="factory_reset1">Czyści Data, Cache i Dalvik</string>
+ <string name="factory_reset2">(nie czyści pamięci wewnętrznej)</string>
+ <string name="factory_reset3">W większości przypadków jest to</string>
+ <string name="factory_reset4">jedyne czyszczenie jakiego potrzebujesz.</string>
+ <string name="factory_resetting">Przywracanie ustawień fabrycznych...</string>
+ <string name="advanced_wipe_hdr">Zaawansowane czyszczenie</string>
+ <string name="advanced_wipe_btn">Zaaw. czyszczenie</string>
+ <string name="wipe_enc_confirm">Usunąć szyfrowanie Data?</string>
+ <string name="formatting_data">Formatowanie Data...</string>
+ <string name="swipe_format_data">Przesuń, aby sformatować Data</string>
+ <string name="swipe_format_data_s"> Sformatuj Data</string>
+ <string name="factory_reset_complete">Przywracanie ustawień fabrycznych zakończone</string>
+ <string name="sel_part_hdr">Wybierz partycje</string>
+ <string name="wipe_sel_confirm">Sformatować wybrane partycje?</string>
+ <string name="wiping_part">Formatowanie partycji...</string>
+ <string name="wipe_complete">Formatowanie zakończone</string>
+ <string name="sel_part_wipe">Partycje do sformatowania:</string>
+ <string name="invalid_part_sel">Nieprawidłowy wybór partycji</string>
+ <string name="format_data_hdr">Formatuj Data</string>
+ <string name="format_data_btn">Formatuj Data</string>
+ <string name="format_data_ptr1">Formatowanie Data usunie wszystkie aplikacje,</string>
+ <string name="format_data_ptr2">kopie zapasowe, zdjęcia, filmy, media, oraz</string>
+ <string name="format_data_ptr3">szyfrowanie pamięci wewnętrznej.</string>
+ <string name="format_data_adopted">Łącznie z Adopted Storage</string>
+ <string name="format_data_lcp1">Formatowanie Data usunie wszystkie aplikacje, kopie zapasowe, zdjęcia, filmy, media, oraz</string>
+ <string name="format_data_lcp2">usuwa szyfrowanie pamięci wewnętrznej.</string>
+ <string name="format_data_wtc1">Format Data usunie wszystkie aplikacje,</string>
+ <string name="format_data_wtc2">kopie zapasowe i media. To nieodwracalne.</string>
+ <string name="format_data_undo">To nieodwracalne.</string>
+ <string name="format_data_complete">Formatowanie Data zakończone</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Wpisz "yes", by kontynuować. Naciśnij wstecz, aby anulować.</string>
+ <string name="part_opt_hdr">Opcje partycji dla: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Wybierz działanie</string>
+ <string name="file_sys_opt">Opcje systemu plików</string>
+ <string name="partition">Partycja: %tw_partition_name%</string>
+ <string name="part_mount_point">Punkt montowania: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">System plików: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Obecna: Tak</string>
+ <string name="part_present_no">Obecna: Nie</string>
+ <string name="part_removable_yes">Przenośna: Tak</string>
+ <string name="part_removable_no">Przenośna: Nie</string>
+ <string name="part_size">Rozmiar: %tw_partition_size%MB</string>
+ <string name="part_used">Użyte: %tw_partition_used%MB</string>
+ <string name="part_free">Wolne: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Rozmiar kopii zapasowej: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Zmiana rozmiaru systemu plików</string>
+ <string name="resize_btn_s">Zmień rozmiar</string>
+ <string name="resize_confirm">Zmienić rozmiar %tw_partition_name%?</string>
+ <string name="resizing">Zmienianie rozmiaru...</string>
+ <string name="resize_complete">Zmienianie rozmiaru zakończone</string>
+ <string name="swipe_resize">Przesuń, aby zmienić rozmiar</string>
+ <string name="swipe_resize_s"> Zmień rozmiar</string>
+ <string name="repair_btn">Napraw system plików</string>
+ <string name="repair_btn_s">Napraw</string>
+ <string name="repair_confirm">Naprawić %tw_partition_name%?</string>
+ <string name="repairing">Naprawianie...</string>
+ <string name="repair_complete">Naprawianie zakończone</string>
+ <string name="swipe_repair">Przesuń, aby naprawić</string>
+ <string name="swipe_repair_s"> Napraw</string>
+ <string name="change_fs_btn">Zmień system plików</string>
+ <string name="change_fs_btn_s">Zmień</string>
+ <string name="change_fs_for_hdr">Zmień system plików na: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partycja: %tw_partition_name% &gt; Wybierz system plików</string>
+ <string name="change_fs_warn1">Niektore ROMy i kernele mogą nie obsługiwac niektórych</string>
+ <string name="change_fs_warn2">systemów plików. Postępuj ostrożnie!</string>
+ <string name="change_fs_confirm">Zmienić %tw_partition_name%?</string>
+ <string name="formatting">Formatowanie...</string>
+ <string name="format_complete">Formatowanie zakończone</string>
+ <string name="swipe_change_fs">Przesuń, aby zmienić</string>
+ <string name="swipe_change_s"> Zmień</string>
+ <string name="back_btn">Wstecz</string>
+ <string name="wipe_enc_btn">Usuń szyfrowanie</string>
+ <string name="swipe_factory_reset">Przesuń, aby wykonać</string>
+ <string name="repair_change_btn">Napraw lub zmień system plików</string>
+ <string name="storage_hdr">Pamięć: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Kopia zapasowa</string>
+ <string name="backup_confirm_hdr">Potwierdź kopię zapasową</string>
+ <string name="encryption_tab">SZYFROWANIE</string>
+ <string name="encryption">Szyfrowanie:</string>
+ <string name="name">Nazwa:</string>
+ <string name="sel_part_backup">Wybierz partycje do skopiowania:</string>
+ <string name="storage">Pamięć:</string>
+ <string name="enc_disabled">wyłączone - ustaw hasło, aby włączyć</string>
+ <string name="enc_enabled">włączone</string>
+ <string name="enable_backup_comp_chk">Włącz kompresję</string>
+ <string name="skip_md5_backup_chk">Pomiń generowanie MD5 kopii zapasowej</string>
+ <string name="disable_backup_space_chk">Wyłącz sprawdzanie wolnego miejsca</string>
+ <string name="refresh_sizes_btn">Odśwież rozmiary</string>
+ <string name="swipe_backup">Przesuń, aby wykonać kopię</string>
+ <string name="append_date_btn">Dodaj datę</string>
+ <string name="backup_name_exists">Kopia zapasowa o takiej nazwie już istnieje!</string>
+ <string name="encrypt_backup">Zaszyfrować kopię zapasową?</string>
+ <string name="enter_pass">Wpisz hasło:</string>
+ <string name="enter_pass2">Wpisz hasło ponownie:</string>
+ <string name="pass_not_match">Hasła się nie zgadzają!</string>
+ <string name="partitions">Partycje:</string>
+ <string name="disabled">Wyłączone</string>
+ <string name="enabled">Włączone</string>
+ <string name="backup_name_hdr">Ustaw nazwę kopii zapasowej</string>
+ <string name="progress">Postęp:</string>
+ <string name="backup_complete">Kopia zapasowa wykonana</string>
+ <string name="restore_hdr">Przywróć</string>
+ <string name="sel_backup_hdr">Wybierz kopię zapasową</string>
+ <string name="restore_sel_store_hdr">Wybierz kopię zapasową z %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Wybierz zestaw do przywrócenia:</string>
+ <string name="restore_enc_backup_hdr">Szyfrowana kopia</string>
+ <string name="restore_dec_fail">Hasło nieprawidłowe, spróbuj ponownie!</string>
+ <string name="del_backup_btn">Usuń kopię zapasową</string>
+ <string name="del_backup_confirm">Usunąć kopię zapasową?</string>
+ <string name="del_backup_confirm2">To nieodwracalne!</string>
+ <string name="deleting_backup">Usuwanie kopii zapasowej...</string>
+ <string name="backup_deleted">Usuwanie kopii zapasowej zakończone</string>
+ <string name="swipe_delete">Przesuń, aby usunąć</string>
+ <string name="swipe_delete_s"> Usuń</string>
+ <string name="restore_try_decrypt">Kopia zapasowa zaszyfrowana - próbuję rozszyfrować</string>
+ <string name="restore_try_decrypt_s">Spróbuj rozszyfrować</string>
+ <string name="restore_backup_date">Kopia zapasowa utworzona %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Wybierz partycje do przywrócenia:</string>
+ <string name="restore_enable_md5_chk">Włącz weryfikację MD5 kopii zapasowych</string>
+ <string name="restore_complete">Przywracanie zakończone</string>
+ <string name="swipe_restore">Przesuń, aby przywrócić</string>
+ <string name="swipe_restore_s"> Przywróć</string>
+ <string name="rename_backup_hdr">Zmień nazwę kopii zapasowej</string>
+ <string name="rename_backup_confirm">Zmienić nazwę kopii zapasowej?</string>
+ <string name="rename_backup_confirm2">To nieodwracalne!</string>
+ <string name="renaming_backup">Zmienianie nazwy kopii zapasowej...</string>
+ <string name="rename_backup_complete">Zmienianie nazwy kopii zapasowej zakończone</string>
+ <string name="swipe_to_rename">Przesuń, aby zmienić nazwę</string>
+ <string name="swipe_rename"> Zmień nazwę</string>
+ <string name="confirm_hdr">Potwierdź</string>
+ <string name="mount_hdr">Zamontuj</string>
+ <string name="mount_sel_part">Wybierz partycje do zamontowania:</string>
+ <string name="mount_sys_ro_chk">Zamontuj partycję systemową tylko do odczytu</string>
+ <string name="mount_sys_ro_s_chk">Zamontuj system tylko do odczytu</string>
+ <string name="decrypt_data_btn">Rozszyfruj Data</string>
+ <string name="disable_mtp_btn">Wyłącz MTP</string>
+ <string name="enable_mtp_btn">Włącz MTP</string>
+ <string name="mount_usb_storage_btn">Zamontuj pamięć USB</string>
+ <string name="usb_storage_hdr">Pamięć USB</string>
+ <string name="usb_stor_mnt1">Pamięć USB zamontowana</string>
+ <string name="usb_stor_mnt2">Pamiętaj, aby bezpiecznie usunąć urządzenie</string>
+ <string name="usb_stor_mnt3">z komputera przed odmontowaniem!</string>
+ <string name="unmount_btn">Odmontuj</string>
+ <string name="rb_system_btn">System</string>
+ <string name="rb_poweroff_btn">Wyłącz</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">Wyłączanie...</string>
+ <string name="swipe_power_off">Przesuń, aby wyłączyć</string>
+ <string name="swipe_power_off_s">Wyłącz</string>
+ <string name="sys_ro_hdr">Niezmodyfikowana partycja systemowa</string>
+ <string name="sys_ro_keep">Zachować system tylko do odczytu?</string>
+ <string name="sys_rop1">TWRP możę pozostawić system niezmodyfikowany,</string>
+ <string name="sys_rop2">aby ułatwić ci otrzymywanie oficjalnych aktualizacji.</string>
+ <string name="sys_rop3">TWRP nie może zapobiec przed podmianą recovery przez</string>
+ <string name="sys_rop4">oficjalny system i nie będzie oferowało rootowania urządzenia.</string>
+ <string name="sys_rop5">Instalowanie plików i operacje przez ADB mogą wciąż</string>
+ <string name="sys_rop6">modyfikować partycję systemową.</string>
+ <string name="sys_rol1">TWRP może pozostawić system niezmodyfikowany, aby ułatwić ci otrzymywanie oficjalnych aktualizacji.</string>
+ <string name="sys_rol2">TWRP nie może zapobiec przed podmianą recovery przez oficjalny system i nie będzie oferowało rootowania urządzenia.</string>
+ <string name="sys_rol3">Instalowanie plików i operacje przez ADB mogą wciąż modyfikować partycję systemową.</string>
+ <string name="sys_ro_never_show_chk">Nie pokazuj tego ekranu ponownie po uruchomieniu</string>
+ <string name="sys_ro_keep_ro_btn">Tylko do odczytu</string>
+ <string name="swipe_allow_mod">Przesuń, aby zmodyfikować</string>
+ <string name="swipe_allow_mod_s">Zezwól na modyfikacje</string>
+ <string name="settings_hdr">Ustawienia</string>
+ <string name="settings_gen_hdr">Główne</string>
+ <string name="settings_gen_s_hdr">Główne</string>
+ <string name="settings_gen_btn">Główne</string>
+ <string name="use_rmrf_chk">Używaj rm -rf zamiast formatowania</string>
+ <string name="use24clock_chk">Użyj 24-godzinnego zegara</string>
+ <string name="rev_navbar_chk">Odwrócony układ paska nawigacji</string>
+ <string name="simact_chk">Symuluj akcje do testowania motywów</string>
+ <string name="simfail_chk">Symuluj niepowodzenia do testów</string>
+ <string name="ctr_navbar_rdo">Wyśrodkuj przyciski paska nawigacji</string>
+ <string name="lft_navbar_rdo">Wyrównaj do lewej przyciski paska nawigacyji</string>
+ <string name="rht_navbar_rdo">Wyrównaj do prawej przyciski paska nawigacyji</string>
+ <string name="restore_defaults_btn">Przywróć domyślne</string>
+ <string name="settings_tz_btn">Strefa czasowa</string>
+ <string name="settings_screen_btn">Ekran</string>
+ <string name="settings_screen_bright_btn">Jasność ekranu</string>
+ <string name="settings_vibration_btn">Wibracje</string>
+ <string name="settings_language_btn">Język</string>
+ <string name="time_zone_hdr">Strefa czasowa</string>
+ <string name="sel_tz_list">Wybierz strefę czasową:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Wyspy Midway</string>
+ <string name="utcm10">(UTC -10) Hawaje</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Czas pacyficzny</string>
+ <string name="utcm7">(UTC -7) Czas górski</string>
+ <string name="utcm6">(UTC -6) Czas centralny</string>
+ <string name="utcm5">(UTC -5) Czas wschodni</string>
+ <string name="utcm4">(UTC -4) Czas atlantycki</string>
+ <string name="utcm3">(UTC -3) Brazylia, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Wybrzeże Atlantyku</string>
+ <string name="utcm1">(UTC -1) Azory, Przylądek Zielony</string>
+ <string name="utc0">(UTC 0) Londyn, Dublin, Lizbona</string>
+ <string name="utcp1">(UTC +1) Berlin, Bruksela, Paryż, Warszawa</string>
+ <string name="utcp2">(UTC +2) Ateny, Stambuł, Afryka Południowa</string>
+ <string name="utcp3">(UTC +3) Moskwa, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu Zabi, Tbilisi, Maskat</string>
+ <string name="utcp5">(UTC +5) Jekaterynburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Ałmaty, Dhaka, Kolombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Dżakarta</string>
+ <string name="utcp8">(UTC +8) Pekin, Singapur, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokio, Seul, Jakuck</string>
+ <string name="utcp10">(UTC +10) Australia Wschodnia, Guam</string>
+ <string name="utcp11">(UTC +11) Władywostok, Wyspy Salomona</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fidżi</string>
+ <string name="sel_tz_offset">Wyrównianie czasu (najczęściej 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Brak</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Użyj czasu letniego (DST)</string>
+ <string name="curr_tz">Obecna strefa czasowa: %tw_time_zone%</string>
+ <string name="curr_tz_s">Obecna strefa czasowa:</string>
+ <string name="set_tz_btn">Ustaw strefę czasową</string>
+ <string name="settings_screen_hdr">Ekran</string>
+ <string name="settings_screen_timeout_hdr">Wygaszanie ekranu</string>
+ <string name="enable_timeout_chk">Włącz wygaszanie ekranu</string>
+ <string name="screen_to_slider">Wygaszanie ekranu w sekundach:</string>
+ <string name="screen_to_slider_s">Wygaszanie ekranu w sekundach (0=wyłączone): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Ustawienia wygaszania ekranu niedostępne</string>
+ <string name="screen_bright_slider">Jasność: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Ustawienia jasności ekranu niedostępne</string>
+ <string name="vibration_hdr">Wibracje</string>
+ <string name="button_vibration_hdr">Wibracje przycisków</string>
+ <string name="kb_vibration_hdr">Wibracje klawiatury</string>
+ <string name="act_vibration_hdr">Wibracje działań</string>
+ <string name="button_vibration">Wibracje przycisków:</string>
+ <string name="kb_vibration">Wibracje klawiatury:</string>
+ <string name="act_vibration">Wibracje działań:</string>
+ <string name="select_language">Wybierz język:</string>
+ <string name="sel_lang_btn">Wybierz język</string>
+ <string name="set_language_btn">Wybierz język</string>
+ <string name="advanced_hdr">Zaawansowane</string>
+ <string name="copy_log_confirm">Skopiować log na kartę SD?</string>
+ <string name="copying_log">Kopiowanie pliku log na kartę SD...</string>
+ <string name="copy_log_complete">Kopiowanie pliku log zakończone</string>
+ <string name="fix_context_btn">Uprawnienia</string>
+ <string name="part_sd_btn">Partycjonowanie</string>
+ <string name="part_sd_s_btn">Karta SD</string>
+ <string name="file_manager_btn">Menedżer Plików</string>
+ <string name="language_hdr">Język</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Odśwież Motyw</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Zaszczep TWRP</string>
+ <string name="inject_twrp_confirm">Ponownie zaszczepić TWRP?</string>
+ <string name="injecting_twrp">Szczepienie TWRP...</string>
+ <string name="inject_twrp_complete">Szczepienie TWRP zakończone</string>
+ <string name="swipe_to_confirm">Przesuń, aby potwierdzić</string>
+ <string name="part_sd_hdr">Partycjonowanie Karty SD</string>
+ <string name="invalid_partsd_sel">Musisz wybrać urządzenie przenośne</string>
+ <string name="part_sd_lose">Stracisz wszystkie pliki na Karcie SD!</string>
+ <string name="part_sd_undo">To nieodwracalne!</string>
+ <string name="part_sd_ext_sz">Rozmiar EXT:</string>
+ <string name="part_sd_swap_sz">Rozmiar Swap:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">System plików:</string>
+ <string name="swipe_part_sd">Przesuń, aby partycjonować</string>
+ <string name="swipe_part_sd_s">Partycjonuj</string>
+ <string name="partitioning_sd">Partycjonowanie Karty SD...</string>
+ <string name="partitioning_sd2">To potrwa parę minut.</string>
+ <string name="part_sd_complete">Partycjonowanie zakończone</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Przywróć oryginalny Boot</string>
+ <string name="dumlock_restore_confirm">Przywrócić oryginalny obraz Boot?</string>
+ <string name="dumlock_restoring">Przywracanie oryginalnego obrazu Boot...</string>
+ <string name="dumlock_restore_complete">Przywracanie oryginalnego obrazu Boot zakończone</string>
+ <string name="dumlock_reflash_btn">Reinstaluj Recovery</string>
+ <string name="dumlock_reflash_confirm">Instalować recovery do boot?</string>
+ <string name="dumlock_reflashing">Instalowanie recovery do boot...</string>
+ <string name="dumlock_reflash_complete">Instalowanie recovery do boot zakończone</string>
+ <string name="dumlock_install_btn">Instaluj HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Instalować pliki HTC Dumlock do ROMu?</string>
+ <string name="dumlock_installing">Instalowanie HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Instalowanie HTC Dumlock zakończone</string>
+ <string name="swipe_to_unlock">Przesuń, aby odblokować</string>
+ <string name="swipe_unlock"> Odblokuj</string>
+ <string name="fm_hdr">Menedżer Plików</string>
+ <string name="fm_sel_file">Wybierz plik lub folder</string>
+ <string name="fm_type_folder">Folder</string>
+ <string name="fm_type_file">Plik</string>
+ <string name="fm_choose_act">Wybierz działanie</string>
+ <string name="fm_selected">%tw_fm_type% wybrane:</string>
+ <string name="fm_copy_btn">Kopiuj</string>
+ <string name="fm_copy_file_btn">Kopiuj plik</string>
+ <string name="fm_copy_folder_btn">Kopiuj folder</string>
+ <string name="fm_copying">Kopiowanie</string>
+ <string name="fm_move_btn">Przenieś</string>
+ <string name="fm_moving">Przenoszenie</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Usuń</string>
+ <string name="fm_deleting">Usuwanie</string>
+ <string name="fm_rename_btn">Zmień nazwę</string>
+ <string name="fm_rename_file_btn">Zmień nazwę pliku</string>
+ <string name="fm_rename_folder_btn">Zmień nazwę folderu</string>
+ <string name="fm_renaming">Zmienianie nazwy</string>
+ <string name="fm_sel_dest">Wybierz folder docelowy</string>
+ <string name="fm_sel_curr_folder">Wybierz bierzący folder</string>
+ <string name="fm_rename_hdr">Zmień nazwę</string>
+ <string name="fm_set_perms_hdr">Ustaw uprawnienia</string>
+ <string name="fm_perms">Uprawnienia:</string>
+ <string name="fm_complete">Działanie na plikach zakończone</string>
+ <string name="decrypt_data_hdr">Deszyfrowanie danych</string>
+ <string name="decrypt_data_enter_pass">Wprowadź hasło.</string>
+ <string name="decrypt_data_failed">Hasło nieprawidłowe, spróbuj ponownie!</string>
+ <string name="decrypt_data_failed_pattern">Wzór nieprawidłowy, spróbuj ponownie!</string>
+ <string name="decrypt_data_enter_pattern">Wprowadź wzór.</string>
+ <string name="decrypt_data_trying">Próbuję rozszyfrować</string>
+ <string name="term_hdr">Polecenia Terminala</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">ZABIJ</string>
+ <string name="term_sel_folder_hdr">Przejdź do folderu startowego</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Wyczyść Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Wyczyść Cache</string>
+ <string name="swipe_to_sideload">Przesuń, aby włączyć Sideload</string>
+ <string name="swipe_sideload"> Włącz</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Użycie: adb sideload nazwapliku.zip</string>
+ <string name="sideload_complete">ADB Sideload zakończone</string>
+ <string name="fix_contexts_hdr">Naprawa uprawnień</string>
+ <string name="fix_contexts_note1">Uwaga: Naprawa uprawnień jest rzadko potrzebna.</string>
+ <string name="fix_contexts_note2">Naprawa uprawnień SELinux może spowodować</string>
+ <string name="fix_contexts_note3">problemy z włączeniem urządzenia.</string>
+ <string name="swipe_to_fix_contexts">Przesuń, aby naprawić</string>
+ <string name="swipe_fix_contexts"> Napraw uprawnienia</string>
+ <string name="fixing_contexts">Naprawianie uprawnień...</string>
+ <string name="fix_contexts_complete">Naprawianie uprawnień zakończone</string>
+ <string name="reboot_hdr">Restart</string>
+ <string name="su_hdr">Sprawdzanie SuperSU</string>
+ <string name="su_note1">Twoje urządzenie nie jest zrootowane.</string>
+ <string name="su_note2">Zainstalować SuperSU teraz?</string>
+ <string name="su_note3">To zrootuje twoje urządzenie.</string>
+ <string name="su_cancel">Nie instaluj</string>
+ <string name="swipe_su_to_install">Przesuń, aby zainstalować</string>
+ <string name="swipe_su_install"> Instaluj</string>
+ <string name="su_installing">Instalowanie SuperSU</string>
+ <string name="sel_storage_list">Wybierz pamięć</string>
+ <string name="ok_btn">OK</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Kernel nie posiada obsługi odczytu uprawnień SELinux.</string>
+ <string name="full_selinux">Pełna obsługa SELinux jest dostępna.</string>
+ <string name="no_selinux">Brak obsługi SELinux (brak libselinux).</string>
+ <string name="mtp_enabled">MTP Włączone</string>
+ <string name="mtp_crash">MTP uległo awarii, wyłączczam MTP przy starcie.</string>
+ <string name="decrypt_success">Pomyślnie rozszyfrowano z domyślnym hasłem.</string>
+ <string name="unable_to_decrypt">Nie można odszyfrować z domyślnym hasłem. Może trzeba będzie wykonać Format Data.</string>
+ <string name="generating_md51">Generowanie MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Generowanie md5...</string>
+ <string name="md5_created"> * MD5 utworzone.</string>
+ <string name="md5_error"> * Błąd MD5!</string>
+ <string name="md5_compute_error"> * Błąd przetwarzania MD5.</string>
+ <string name="current_date">(Obecna data)</string>
+ <string name="auto_generate">(Generuj automatycznie)</string>
+ <string name="unable_to_locate_partition">Nie można zlokalizować partycji '{1}' do obliczenia kopii zapasowej.</string>
+ <string name="no_partition_selected">Nie wybrano partycji do utworzenia kopii zapasowych.</string>
+ <string name="total_partitions_backup"> * Łączna liczba partycji do tworzenia kopii zapasowych: {1}</string>
+ <string name="total_backup_size"> * Łączna wielkość wszystkich danych: {1}MB</string>
+ <string name="available_space"> * Dostępne miejsce: {1}MB</string>
+ <string name="unable_locate_storage">Nie można zlokalizować urządzenia magazynującego.</string>
+ <string name="no_space">Zbyt mało wolnego miejsca w pamięci urządzenia.</string>
+ <string name="backup_started">[KOPIA ROZPOCZĘTA]</string>
+ <string name="backup_folder"> * Folder kopii zapasowej: {1}</string>
+ <string name="fail_backup_folder">Nie udało się utworzyć folderu kopii zapasowej.</string>
+ <string name="avg_backup_fs">Średnie tempo tworzenia kopii zapasowych systemu plików: {1} MB/sek</string>
+ <string name="avg_backup_img">Średnie tempo tworzenia kopii zapasowych obrazu dysku: {1} MB/sek</string>
+ <string name="total_backed_size">[UTWORZONO KOPIĘ {1} MB]</string>
+ <string name="backup_completed">[KOPIA ZAKOŃCZONA W {1} SEKUND]</string>
+ <string name="restore_started">[PRZYWRACANIE ROZPOCZĘTE]</string>
+ <string name="restore_folder">Folder przywracania: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} zakończono ({2} sekund)]</string>
+ <string name="verifying_md5">Weryfikowanie MD5</string>
+ <string name="skip_md5">Pomijanie sprawdzania MD5 włączone przez użytkownika.</string>
+ <string name="calc_restore">Obliczanie danych przywracania...</string>
+ <string name="restore_read_only">Nie można przywrócić {1} -- zamontowane tylko do odczytu.</string>
+ <string name="restore_unable_locate">Nie można zlokalizować partycji '{1}' do przywrócenia.</string>
+ <string name="no_part_restore">Nie wybrano partycji do przywrócenia.</string>
+ <string name="restore_part_count">Przywracanie {1} partycji...</string>
+ <string name="total_restore_size">Całkowity rozmiar przywracania {1}MB</string>
+ <string name="updating_system_details">Aktualizowanie szczegółów systemu</string>
+ <string name="restore_completed">[PRZYWRACANIE ZAKOŃCZONE W {1} SEKUND]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Błąd otwierania: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Nie można zlokalizować partycji wg nazwy kopii zapasowej: '{1}'</string>
+ <string name="unable_find_part_path">Nie można zlokalizować partycji dla ścieżki '{1}'</string>
+ <string name="update_part_details">Aktualizowanie szczegółów partycji...</string>
+ <string name="update_part_details_done">...ukończono</string>
+ <string name="wiping_dalvik">Czyszczenie katalogów Dalvik Cache...</string>
+ <string name="cleaned">Wyczyszczono: {1}...</string>
+ <string name="dalvik_done">-- Czyszczenie Dalvik Cache zakończone!</string>
+ <string name="no_andsec">Nie znaleziono partycji android_secure.</string>
+ <string name="unable_to_locate">Nie można zlokalizować {1}.</string>
+ <string name="wiping_datamedia">Czyszczenie Pamięci Wewnętrznej -- /data/media...</string>
+ <string name="unable_to_mount">Nie można zamontować {1}</string>
+ <string name="unable_to_mount_internal">Nie można zamontować pamięci wewnętrznej</string>
+ <string name="unable_to_mount_storage">Nie można zamontować pamięci</string>
+ <string name="fail_decrypt">Niepowodzenie rozszyfrowywania danych.</string>
+ <string name="no_crypto_support">Brak obsługi crypto w tej kompilacji.</string>
+ <string name="decrypt_success_dev">Dane pomyślnie rozszyfrowane, nowe urządzenie blokowe: '{1}'</string>
+ <string name="done">Ukończono.</string>
+ <string name="start_partition_sd">Partycjonowanie Karty SD...</string>
+ <string name="partition_sd_locate">Nie można zlokalizować urządzenia do partycjonowania.</string>
+ <string name="ext_swap_size">Rozmiar EXT + Swap jest większy niż rozmiar Karty SD.</string>
+ <string name="remove_part_table">Usuwanie tablicy partycji...</string>
+ <string name="unable_rm_part">Unable to remove partition table.</string>
+ <string name="create_part">Tworzenie {1} partycji...</string>
+ <string name="unable_to_create_part">Nie można utworzyć {1} partycji.</string>
+ <string name="format_sdext_as">Formatowanie SD-EXT jako {1}...</string>
+ <string name="part_complete">Partycjonowanie zakończone.</string>
+ <string name="unable_to_open">Nie można otworzyć '{1}'.</string>
+ <string name="mtp_already_enabled">MTP jest już włączone</string>
+ <string name="mtp_fail">Nie udało się włączyć MTP</string>
+ <string name="no_mtp">Wsparcie MTP nieuwzględnione</string>
+ <string name="image_flash_start">[FLASHOWANIE OBRAZU ROZPOCZĘTE]</string>
+ <string name="img_to_flash">Obraz do flashowania: '{1}'</string>
+ <string name="flash_unable_locate">Nie można zlokalizować partycji '{1}' do flashowania.</string>
+ <string name="no_part_flash">Nie wybrano partycji do flashowania.</string>
+ <string name="too_many_flash">Zbyt wiele partycji wybranych do flashowania.</string>
+ <string name="invalid_flash">Wybrano nieprawidłową partycję do flashowania.</string>
+ <string name="flash_done">[FLASHOWANIE OBRAZU ZAKOŃCZONE]</string>
+ <string name="wiping">Czyszczenie {1}</string>
+ <string name="repair_not_exist">{1} nie istnieje! Nie można naprawić!</string>
+ <string name="repairing_using">Naprawianie {1} przy użyciu {2}...</string>
+ <string name="unable_repair">Nie udało się naprawić {1}.</string>
+ <string name="mount_data_footer">Nie można zamontować /data i odnaleźć stopki crypto.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Nie można utworzyć folderu '{1}' {2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Nie można zamontować '{1}' ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">Nie można odmontować '{1}' ({2})</string>
+ <string name="cannot_resize">Nie można zmienić rozmiaru {1}.</string>
+ <string name="repair_resize">Naprawianie {1} przed zmianą rozmiaru.</string>
+ <string name="unable_resize">Nie można zmienić rozmiaru {1}.</string>
+ <string name="no_md5_found">Nie znaleziono pliku MD5 '{1}'. Proszę wyłączyć weryfikację MD5, aby przywrócić.</string>
+ <string name="md5_fail_match">MD5 nie pasuje do '{1}'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Nie udało się odszyfrować pliku tar '{1}'</string>
+ <string name="format_data_msg">Może być konieczne ponowne uruchomienie recovery, aby móc ponownie użyć /date.</string>
+ <string name="format_data_err">Nie można sformatować, aby usunąć szyfrowanie.</string>
+ <string name="formatting_using">Formatowanie {1} przy użyciu {2}...</string>
+ <string name="unable_to_wipe">Nie można wyczyścić {1}.</string>
+ <string name="cannot_wipe">Partycja {1} nie może zostać wyczyszczona.</string>
+ <string name="remove_all">Usuwanie wszystkich plików w '{1}'</string>
+ <string name="wiping_data">Czyszczenie Data bez /data/media ...</string>
+ <string name="backing_up">Tworzenie kopii zapasowej {1}...</string>
+ <string name="backing">Tworzenie kopii zapasowej</string>
+ <string name="backup_size">Rozmiar kopii zapasowej '{1}' to 0 bajtów.</string>
+ <string name="datamedia_fs_restore">UWAGA: Ta kopia /data została wykonana w sytemie plików {1}! Kopia może się nie uruchomić jeśli nie wrócisz do {1}.</string>
+ <string name="restoring">Przywracanie {1}...</string>
+ <string name="restoring_hdr">Przywracanie</string>
+ <string name="recreate_folder_err">Nie można odtworzyć {1} folderu.</string>
+ <string name="img_size_err">Rozmiar obrazu jest większy niż urządzenia docelowego</string>
+ <string name="flashing">Instalowanie {1}...</string>
+ <string name="backup_folder_set">'{1}' ustawiony jako folder kopii zapasowych</string>
+ <string name="locate_backup_err">Nie udało się zlokalizować kopii '{1}'</string>
+ <string name="set_restore_opt">Ustawienia przywracania: '{1}':</string>
+ <string name="md5_check_skip">Sprawdzanie MD5 jest włączone</string>
+ <string name="ors_encrypt_restore_err">Nie można użyć OpenRecoveryScript do przywrócenia zaszyfrowanej kopii zapasowej.</string>
+ <string name="mounting">Montowanie</string>
+ <string name="unmounting">Odmontowywanie</string>
+ <string name="mounted">Zamontowano '{1}'</string>
+ <string name="unmounted">Odmontowano '{1}'</string>
+ <string name="setting">Ustawianie '{1}' do '{2}'</string>
+ <string name="setting_empty">Ustawianie '{1}' jako pusty</string>
+ <string name="making_dir1">Tworzenie Folderu</string>
+ <string name="making_dir2">Tworzenie folderu: '{1}'</string>
+ <string name="running_command">Uruchamianie poleceń</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Uruchomiono funkcję ADB Sideload...</string>
+ <string name="need_new_adb">Wymagane ADB 1.0.32 lub nowsze, aby użyć sideload na tym urządzeniu.</string>
+ <string name="no_pwd">Hasło nie zostało podane.</string>
+ <string name="done_ors">Zakończono przetwarzanie skryptu</string>
+ <string name="injecttwrp">Zaszczepianie TWRP w obrazie boot...</string>
+ <string name="zip_err">Błąd instalowania pliku zip '{1}'</string>
+ <string name="installing_zip">Instalowanie pliku zip '{1}'</string>
+ <string name="select_backup_opt">Ustawienia kopii zapasowych:</string>
+ <string name="compression_on">Kompresja jest włączona</string>
+ <string name="md5_off">Generowanie MD5 jest wyłączone</string>
+ <string name="backup_fail">Niepowodzenie wykonywania kopii zapasowej</string>
+ <string name="backup_clean">Niepowodzenie wykonywania kopii zapasowej. Oczyszczanie folderu kopii zapasowej.</string>
+ <string name="running_recovery_commands">Wykonywanie komend trybu odzyskiwania</string>
+ <string name="recovery_commands_complete">Ukończono komendy trybu odzyskiwania</string>
+ <string name="running_ors">Wykonywanie Skryptu OpenRecovery</string>
+ <string name="ors_complete">Ukończono Skrypt OpenRecovery</string>
+ <string name="no_updater_binary">Nie można znaleźć '{1}' w pliku zip.</string>
+ <string name="check_for_md5">Sprawdzanie pliku MD5...</string>
+ <string name="fail_sysmap">Nieudane mapowanie pliku '{1}'</string>
+ <string name="verify_zip_sig">Weryfikowanie sygnatury pliku zip...</string>
+ <string name="verify_zip_fail">Niewłaściwa sygnatura pliku zip!</string>
+ <string name="verify_zip_done">Sygnatura pliku zip zweryfikowana pomyślnie.</string>
+ <string name="zip_corrupt">Plik zip uszkodzony!</string>
+ <string name="no_md5">Pomijanie sprawdzania MD5: brak pliku MD5</string>
+ <string name="md5_fail">MD5 niezgodne</string>
+ <string name="md5_match">MD5 zgodne</string>
+ <string name="pid_signal">Proces {1} zakończony z sygnałem: {2}</string>
+ <string name="pid_error">Proces {1} zakończony z błędem: {2}</string>
+ <string name="install_dumlock">Instalowanie HTC Dumlock do systemu...</string>
+ <string name="dumlock_restore">Przywracanie oryginalnego obrazu boot...</string>
+ <string name="dumlock_reflash">Reinstalowanie recovery do boot...</string>
+ <string name="run_script">Uruchomiono skrypt {1}...</string>
+ <string name="rename_stock">Zmieniono nazwę stock recovery w /system w celu uniknięcia podmiany TWRP przez stock ROM.</string>
+ <string name="split_backup">Dzielenie pliku kopii zapasowej na wiele plików...</string>
+ <string name="backup_error">Błąd podczas tworzenia kopii zapasowej.</string>
+ <string name="restore_error">Błąd podczas procesu przywracania.</string>
+ <string name="split_thread">Dzielenie {1} na {2} archiwa</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu z %llu plików, %i%%</string>
+ <string name="size_progress">%lluMB z %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Próba odszyfrowania partycji danych poprzez linię poleceń.</string>
+ <string name="base_pkg_err">Nie udało się załadować pakietów podstawowych.</string>
+ <string name="simulating">Symulowanie działań...</string>
+ <string name="backup_cancel">Anulowano wykonywanie kopii zapasowej</string>
+ <string name="config_twrp">Konfigurowanie TWRP...</string>
+ <string name="config_twrp_err">Nie można skonfigurować TWRP z tym kernelem.</string>
+ <string name="copy_log">Skopiowano log recovery do {1}.</string>
+ <string name="max_queue">Maksymalna kolejka plików osiągnięta!</string>
+ <string name="min_queue">Minimalna kolejka plików osiągnięta!</string>
+ <string name="screenshot_saved">Zrzut ekranu zapisany do {1}</string>
+ <string name="screenshot_err">Niepowodzenie wykonywania zrzutu ekranu!</string>
+ <string name="zip_wipe_cache">Jeden lub więcej plików wymaga czyszczenia Cache -- Czyszczę Cache.</string>
+ <string name="and_sec_wipe_err">Nie można wyczyścić android secure</string>
+ <string name="dalvik_wipe_err">Błąd czyszczenia Dalvik</string>
+ <string name="auto_gen">(Generuj automatycznie)</string>
+ <string name="curr_date">(Aktualna data)</string>
+ <string name="backup_name_len">Nazwa kopii zapasowej jest zbyt długa.</string>
+ <string name="backup_name_invalid">Nazwa kopii zapasowej '{1}' zawiera niedozwolony znak: '{1}'</string>
+ <string name="no_real_sdcard">To urządzenie nie ma karty SD! Przerywanie...</string>
+ <string name="cancel_sideload">Anulowanie ADB sideload...</string>
+ <string name="change_fs_err">Niepowodzenie zmiany systemu plików.</string>
+ <string name="theme_ver_err">Wersja niestandardowego motywu nie zgadza się z wersją TWRP. Użyto domyślnego motywu.</string>
+ <string name="up_a_level">(Cofnij)</string>
+ <string name="install_reboot">Ponowne uruchomienie za 5 sekund</string>
+ </resources>
+</language> \ No newline at end of file
diff --git a/gui/theme/common/languages/pt_BR.xml b/gui/theme/common/languages/pt_BR.xml
new file mode 100644
index 000000000..f747631cb
--- /dev/null
+++ b/gui/theme/common/languages/pt_BR.xml
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Portuguese (Brazilian)</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">Sistema</string>
+ <string name="system_image">Imagem do sistema</string>
+ <string name="vendor">Fornecedor</string>
+ <string name="vendor_image">Imagem do fornecedor</string>
+ <string name="boot">Inicio</string>
+ <string name="recovery">Recuperação</string>
+ <string name="cache">Cache</string>
+ <string name="data">Dados</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Armazenamento interno</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Seguro</string>
+ <string name="dalvik">Dalvik / Cache de arte</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Dados adotados</string>
+ <string name="adopted_storage">Armazenamento adotado</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% ° C</string>
+ <string name="battery_pct">Bateria: %tw_battery%</string>
+ <string name="sort_by_name">Ordenar por nome</string>
+ <string name="sort_by_date">Ordenar por data</string>
+ <string name="sort_by_size">Ordenar por tamanho</string>
+ <string name="sort_by_name_only">Nome</string>
+ <string name="sort_by_date_only">Data</string>
+ <string name="sort_by_size_only">Tamanho</string>
+ <string name="tab_general">GERAL</string>
+ <string name="tab_options">OPÇÕES</string>
+ <string name="tab_backup">CÓPIA DE SEGURANÇA</string>
+ <string name="tab_time_zone">FUSO HORÁRIO</string>
+ <string name="tab_screen">TELA</string>
+ <string name="tab_vibration">VIBRAÇÃO</string>
+ <string name="tab_language">LÍNGUA</string>
+ <string name="install_btn">Instalar</string>
+ <string name="wipe_btn">Apagar a memória</string>
+ <string name="backup_btn">Cópia de segurança</string>
+ <string name="restore_btn">Restaurar</string>
+ <string name="mount_btn">Monte</string>
+ <string name="settings_btn">Configurações</string>
+ <string name="advanced_btn">Avançado</string>
+ <string name="reboot_btn">Reiniciar</string>
+ <string name="files_btn">Arquivos</string>
+ <string name="copy_log_btn">Log da cópia</string>
+ <string name="select_type_hdr">Selecione o tipo</string>
+ <string name="install_zip_hdr">Instalar o Zip</string>
+ <string name="install_zip_btn">Instalar o Zip</string>
+ <string name="install_image_hdr">Imagem de instalação</string>
+ <string name="install_image_btn">Imagem de instalação</string>
+ <string name="install_select_file_hdr">Selecione o arquivo</string>
+ <string name="file_selector_folders_hdr">Pastas</string>
+ <string name="select_file_from_storage">Selecione o arquivo de %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Instalar</string>
+ <string name="select_storage_hdr">Selecionar armazenamento</string>
+ <string name="select_storage_btn">Selecionar armazenamento</string>
+ <string name="queue_hdr">Lista</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% de máximo de 10 arquivos na fila</string>
+ <string name="zip_queue_count_s">Arquivo %tw_zip_queue_count% de 10:</string>
+ <string name="zip_warn1">Esta operação pode instalar incompatível</string>
+ <string name="zip_warn2">software e tornar seu aparelho inutilizável.</string>
+ <string name="zip_back_cancel">Pressione para cancelar a adicionar este postal.</string>
+ <string name="zip_back_clear">Pressione o botão voltar para limpar a fila.</string>
+ <string name="folder">Pasta:</string>
+ <string name="file">Arquivo:</string>
+ <string name="zip_sig_chk">Verificação de assinatura do arquivo zipado</string>
+ <string name="inject_twrp_chk">Injetar TWRP após a instalação</string>
+ <string name="options_hdr">Opções</string>
+ <string name="confirm_flash_hdr">Confirmar o Flash</string>
+ <string name="zip_queue">Lista:</string>
+ <string name="options">Opcões:</string>
+ <string name="swipe_confirm"> Confirmar</string>
+ <string name="zip_add_btn">Adicionar mais Zips</string>
+ <string name="zip_clear_btn">Limpar fila de Zip</string>
+ <string name="install_zip_count_hdr">Instalar o Zip %tw_zip_index% de %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Instalar o Zip: %tw_file%</string>
+ <string name="failed">Falhou</string>
+ <string name="successful">Sucesso</string>
+ <string name="install_failed">Instalação falhou</string>
+ <string name="install_successful">Instalação bem sucedida</string>
+ <string name="wipe_cache_dalvik_btn">Limpe o cache/dalvik</string>
+ <string name="reboot_system_btn">Reiniciar o sistema</string>
+ <string name="install_sel_target">Selecione a partição de destino</string>
+ <string name="flash_image_select">Selecione a partição para Flash imagem:</string>
+ <string name="target_partition">Partição de destino:</string>
+ <string name="flashing_image">Piscando a imagem...</string>
+ <string name="image_flashed">Um flash de imagem</string>
+ <string name="wipe_cache_dalvik_confirm">Limpe o Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Limpando o Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Cache de &amp; Dalvik limpar completas</string>
+ <string name="swipe_wipe">Deslize para limpar</string>
+ <string name="swipe_wipe_s"> Limpe</string>
+ <string name="no_os1">Sem OS instalado! Você é</string>
+ <string name="no_osrb">tem certeza que deseja reiniciar?</string>
+ <string name="no_ospo">claro que gostaria de poder fora?</string>
+ <string name="rebooting">Reiniciando...</string>
+ <string name="swipe_reboot">Deslize para reiniciar</string>
+ <string name="swipe_reboot_s"> Reiniciar</string>
+ <string name="swipe_flash">Deslize para confirmar Flash</string>
+ <string name="confirm_action">Confirmar a ação</string>
+ <string name="back_cancel">Pressione o botão voltar para cancelar.</string>
+ <string name="cancel_btn">Cancelar</string>
+ <string name="wipe_hdr">Apagar a memória</string>
+ <string name="factory_reset_hdr">Reset de fábrica</string>
+ <string name="factory_reset_btn">Reset de fábrica</string>
+ <string name="factory_reset1">Apaga dados, Cache e Dalvik</string>
+ <string name="factory_reset2">(não incluindo armazenamento interno)</string>
+ <string name="factory_reset3">Na maioria das vezes isto é</string>
+ <string name="factory_reset4">a única limpeza que você precisa.</string>
+ <string name="factory_resetting">Reset de fábrica...</string>
+ <string name="advanced_wipe_hdr">Limpeza avançada</string>
+ <string name="advanced_wipe_btn">Limpeza avançada</string>
+ <string name="wipe_enc_confirm">Limpe a criptografia de dados?</string>
+ <string name="formatting_data">Formatação de dados...</string>
+ <string name="swipe_format_data">Deslize para formatar dados</string>
+ <string name="swipe_format_data_s"> Formato de dados</string>
+ <string name="factory_reset_complete">Reset de fábrica completa</string>
+ <string name="sel_part_hdr">Selecione as partições</string>
+ <string name="wipe_sel_confirm">Limpar partição (s) selecionada (s)?</string>
+ <string name="wiping_part">Limpar partição (s)...</string>
+ <string name="wipe_complete">Limpeza completa</string>
+ <string name="sel_part_wipe">Selecione as partições para limpeza:</string>
+ <string name="invalid_part_sel">Seleção de partição inválida</string>
+ <string name="format_data_hdr">Formatação de dados</string>
+ <string name="format_data_btn">Formatação de dados</string>
+ <string name="format_data_ptr1">Formatar dados limpará todos seus aplicativos</string>
+ <string name="format_data_ptr2">os backups, mídia, fotos, vídeos e</string>
+ <string name="format_data_ptr3">remove a criptografia no armazenamento interno.</string>
+ <string name="format_data_adopted">Incluindo o armazenamento adotado</string>
+ <string name="format_data_lcp1">Formatar dados limpará todos seus apps, backups, fotos, vídeos, mídia, e</string>
+ <string name="format_data_lcp2">remove a criptografia no armazenamento interno.</string>
+ <string name="format_data_wtc1">Formatar dados limpará todos seus aplicativos,</string>
+ <string name="format_data_wtc2">cópia de segurança e mídia. Isto não pode ser desfeito.</string>
+ <string name="format_data_undo">Isto não pode ser desfeito.</string>
+ <string name="format_data_complete">Formatação de dados completa</string>
+ <string name="yes_continue">Digite Sim para continuar. Pressione para cancelar.</string>
+ <string name="part_opt_hdr">Partição de opções para: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Selecionar Ação</string>
+ <string name="file_sys_opt">Opções de sistema de arquivo</string>
+ <string name="partition">Partição: %tw_partition_name%</string>
+ <string name="part_mount_point">Ponto de montagem: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Sistema de arquivos: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Presente: Sim</string>
+ <string name="part_present_no">Presente: não</string>
+ <string name="part_removable_yes">Removível: Sim</string>
+ <string name="part_removable_no">Removível: não</string>
+ <string name="part_size">Tamanho: % tw_partition_size % MB</string>
+ <string name="part_used">Usado: % tw_partition_used % MB</string>
+ <string name="part_free">Livre: % tw_partition_free % MB</string>
+ <string name="part_backup_size">Tamanho do backup: % tw_partition_backup_size % MB</string>
+ <string name="resize_btn">Redimensionar o sistema de arquivos</string>
+ <string name="resize_btn_s">Redimensionar</string>
+ <string name="resize_confirm">Redimensionar o %tw_partition_name%?</string>
+ <string name="resizing">Redimensionamento...</string>
+ <string name="resize_complete">Redimensionamento completo</string>
+ <string name="swipe_resize">Deslize para redimensionar</string>
+ <string name="swipe_resize_s"> Redimensionar</string>
+ <string name="repair_btn">Reparação de sistema de arquivos</string>
+ <string name="repair_btn_s">Reparar</string>
+ <string name="repair_confirm">%tw_partition_name% de reparação?</string>
+ <string name="repairing">Reparando...</string>
+ <string name="repair_complete">Reparo completo</string>
+ <string name="swipe_repair">Deslize para reparar</string>
+ <string name="swipe_repair_s"> Reparação</string>
+ <string name="change_fs_btn">Mudança de sistema de arquivos</string>
+ <string name="change_fs_btn_s">Modificar</string>
+ <string name="change_fs_for_hdr">Alterar o sistema de arquivos para: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partição: %tw_partition_name% &gt; selecione sistema de arquivos</string>
+ <string name="change_fs_warn1">Algumas ROMs ou kernel pode não oferecer suporte a alguns</string>
+ <string name="change_fs_warn2">sistemas de arquivos. Proceda com cautela!</string>
+ <string name="change_fs_confirm">Mudar %tw_partition_name%?</string>
+ <string name="formatting">Formatação...</string>
+ <string name="format_complete">Formatação completa</string>
+ <string name="swipe_change_fs">Deslize para a mudança</string>
+ <string name="swipe_change_s"> Mudança</string>
+ <string name="back_btn">Retornar</string>
+ <string name="wipe_enc_btn">Limpe a criptografia</string>
+ <string name="swipe_factory_reset">Deslize para o Reset de fábrica</string>
+ <string name="repair_change_btn">Reparação ou mudança de sistema de arquivos</string>
+ <string name="storage_hdr">Armazenamento: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Cópia de segurança</string>
+ <string name="backup_confirm_hdr">Confirmar a Cópia de Segurança</string>
+ <string name="encryption_tab">CRIPTOGRAFIA</string>
+ <string name="encryption">Criptografia:</string>
+ <string name="name">Nome:</string>
+ <string name="sel_part_backup">Selecione as partições de Cópia de Segurança:</string>
+ <string name="storage">Armazenamento:</string>
+ <string name="enc_disabled">desativado - definir uma senha para habilitar</string>
+ <string name="enc_enabled">ativado</string>
+ <string name="enable_backup_comp_chk">Habilitar a compactação</string>
+ <string name="skip_md5_backup_chk">Geração de Skip MD5 durante a cópia de segurança</string>
+ <string name="disable_backup_space_chk">Desativar a verificação de espaço livre</string>
+ <string name="refresh_sizes_btn">Atualizar os tamanhos</string>
+ <string name="swipe_backup">Deslize para a Cópia de Segurança</string>
+ <string name="append_date_btn">Acrescentar a data</string>
+ <string name="backup_name_exists">Uma Cópia de Segurança com esse nome já existe!</string>
+ <string name="encrypt_backup">Criptografar sua cópia de segurança?</string>
+ <string name="enter_pass">Digite a senha:</string>
+ <string name="enter_pass2">Digite a senha novamente:</string>
+ <string name="pass_not_match">As senhas digitadas não conferem!</string>
+ <string name="partitions">Partições:</string>
+ <string name="disabled">Desabilitar</string>
+ <string name="enabled">Ativado</string>
+ <string name="backup_name_hdr">Nome do conjunto de Backup</string>
+ <string name="progress">Progresso:</string>
+ <string name="backup_complete">Cópia de segurança concluído</string>
+ <string name="restore_hdr">Restaurar</string>
+ <string name="sel_backup_hdr">Selecione a cópia de segurança</string>
+ <string name="restore_sel_store_hdr">Selecione a cópia de segurança de %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Selecione o pacote para restaurar:</string>
+ <string name="restore_enc_backup_hdr">Cópia de segurança criptografada</string>
+ <string name="restore_dec_fail">Senha falhou, por favor tente novamente!</string>
+ <string name="del_backup_btn">Excluir Cópia de Segurança</string>
+ <string name="del_backup_confirm">Excluir Cópia de Segurança?</string>
+ <string name="del_backup_confirm2">Isto não pode ser desfeito!</string>
+ <string name="deleting_backup">Exclusão de Cópia de Segurança...</string>
+ <string name="backup_deleted">Exclusão de Cópia de Segurança completa</string>
+ <string name="swipe_delete">Deslize para excluir</string>
+ <string name="swipe_delete_s"> Excluir</string>
+ <string name="restore_try_decrypt">Cópia de Segurança criptografada - tentando descriptografia</string>
+ <string name="restore_try_decrypt_s">Tentando a descriptografia</string>
+ <string name="restore_backup_date">Cópia de Segurança feita em %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Selecione partições a restaurar:</string>
+ <string name="restore_enable_md5_chk">Habilitar verificação de MD5 dos arquivos de Cópia de Segurança</string>
+ <string name="restore_complete">Restauração completa</string>
+ <string name="swipe_restore">Deslize para restaurar</string>
+ <string name="swipe_restore_s"> Restauração</string>
+ <string name="rename_backup_hdr">Renomear a Cópia de Segurança</string>
+ <string name="rename_backup_confirm">Renomear a Cópia de Segurança?</string>
+ <string name="rename_backup_confirm2">Isto não pode ser desfeito!</string>
+ <string name="renaming_backup">Renomear a Cópia de Segurança...</string>
+ <string name="rename_backup_complete">Renomear a Cópia de Segurança completa</string>
+ <string name="swipe_to_rename">Deslize para renomear</string>
+ <string name="swipe_rename"> Renomear</string>
+ <string name="confirm_hdr">Confirme</string>
+ <string name="mount_hdr">Monte</string>
+ <string name="mount_sel_part">Selecione as partições para montagem:</string>
+ <string name="mount_sys_ro_chk">Montar a partição de sistema somente leitura</string>
+ <string name="mount_sys_ro_s_chk">Sistema de montagem RO</string>
+ <string name="decrypt_data_btn">Descriptografar dados</string>
+ <string name="disable_mtp_btn">Desabilitar o MTP</string>
+ <string name="enable_mtp_btn">Habilitar o MTP</string>
+ <string name="mount_usb_storage_btn">Montar armazenamento USB</string>
+ <string name="usb_storage_hdr">Armazenamento USB</string>
+ <string name="usb_stor_mnt1">Armazenamento USB montado</string>
+ <string name="usb_stor_mnt2">Não se esqueça de remover com segurança seu dispositivo</string>
+ <string name="usb_stor_mnt3">do seu computador antes de desmontar!</string>
+ <string name="unmount_btn">Desmonte</string>
+ <string name="rb_system_btn">Sistema</string>
+ <string name="rb_poweroff_btn">Desligar</string>
+ <string name="rb_recovery_btn">Recuperação</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Baixar</string>
+ <string name="turning_off">Desligar...</string>
+ <string name="swipe_power_off">Deslize para desligar</string>
+ <string name="swipe_power_off_s">Desligar</string>
+ <string name="sys_ro_hdr">Partição do sistema não modificado</string>
+ <string name="sys_ro_keep">Manter o sistema apenas leitura?</string>
+ <string name="sys_rop1">TWRP pode deixar sua partição do sistema não modificada</string>
+ <string name="sys_rop2">para tornar mais fácil para você tomar atualizações oficiais.</string>
+ <string name="sys_rop3">TWRP será incapaz de impedir o stock ROM de</string>
+ <string name="sys_rop4">substituindo TWRP e não oferecerá a raiz do seu dispositivo.</string>
+ <string name="sys_rop5">Instalar zips ou executar operações adb pode ainda</string>
+ <string name="sys_rop6">modifica a partição do sistema.</string>
+ <string name="sys_rol1">TWRP pode deixar sua partição do sistema não-modificada para torná-lo mais fácil para você tomar atualizações oficiais.</string>
+ <string name="sys_rol2">TWRP será incapaz de impedir que o stock ROM substituindo TWRP e não oferecerá a raiz do seu dispositivo.</string>
+ <string name="sys_rol3">Instalar zips ou executar operações adb ainda pode modificar a partição do sistema.</string>
+ <string name="sys_ro_never_show_chk">Nunca mostrar esta tela durante a inicialização de novo</string>
+ <string name="sys_ro_keep_ro_btn">Manter apenas leitura</string>
+ <string name="swipe_allow_mod">Deslize para permitir modificações</string>
+ <string name="swipe_allow_mod_s">Permitir modificações</string>
+ <string name="settings_hdr">Configurações</string>
+ <string name="settings_gen_hdr">Geral</string>
+ <string name="settings_gen_s_hdr">Geral</string>
+ <string name="settings_gen_btn">Geral</string>
+ <string name="use_rmrf_chk">Usar o rm -rf em vez de formatação</string>
+ <string name="use24clock_chk">Relógio 24 horas de uso</string>
+ <string name="rev_navbar_chk">Layout de barra invertida</string>
+ <string name="simact_chk">Simular ações para tema de teste</string>
+ <string name="simfail_chk">Simular falha para ações</string>
+ <string name="ctr_navbar_rdo">Botões de barra de navegação do centro</string>
+ <string name="lft_navbar_rdo">Alinhar à esquerda os botões de navegação</string>
+ <string name="rht_navbar_rdo">Bem, alinhar botões da barra de navegação</string>
+ <string name="restore_defaults_btn">Restaurar padrões</string>
+ <string name="settings_tz_btn">Fuso Horário</string>
+ <string name="settings_screen_btn">Tela</string>
+ <string name="settings_screen_bright_btn">Brilho da tela</string>
+ <string name="settings_vibration_btn">Vibração</string>
+ <string name="settings_language_btn">Idioma</string>
+ <string name="time_zone_hdr">Fuso Horário</string>
+ <string name="sel_tz_list">Selecione o Fuso Horário:</string>
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Havaí</string>
+ <string name="utcm9">(UTC -9) Alasca</string>
+ <string name="utcm8">(UTC -8) Hora do Pacífico</string>
+ <string name="utcm7">(UTC -7) Tempo de Mountain</string>
+ <string name="utcm6">(UTC -6) Horário central</string>
+ <string name="utcm5">(UTC -5) Hora do leste</string>
+ <string name="utcm4">(UTC -4) Horário do Atlântico</string>
+ <string name="utcm3">(UTC -3) Brasil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Açores, Cabo Verde</string>
+ <string name="utc0">(UTC 0) Londres, Dublin, Lisboa</string>
+ <string name="utcp1">(UTC + 1) Berlim, Bruxelas, Paris</string>
+ <string name="utcp2">(UTC + 2) Atenas, Istambul, África do Sul</string>
+ <string name="utcp3">(UTC + 3) Moscou, Bagdá</string>
+ <string name="utcp4">(UTC + 4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC + 5) Ecaterimburgo, Islamabad</string>
+ <string name="utcp6">(UTC + 6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC + 7) Bangcoc, Hanói, Jacarta</string>
+ <string name="utcp8">(UTC + 8) Beijing, Singapura, Hong Kong</string>
+ <string name="utcp9">(UTC + 9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC + 10) Austrália oriental, Guam</string>
+ <string name="utcp11">(UTC + 11) Vladivostok, Ilhas Salomão</string>
+ <string name="utcp12">(UTC + 12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Selecione o deslocamento (geralmente 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Nenhum</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Use o horário de Verão (DST)</string>
+ <string name="curr_tz">Fuso horário atual: %tw_time_zone%</string>
+ <string name="curr_tz_s">Fuso horário atual:</string>
+ <string name="set_tz_btn">Definir fuso horário</string>
+ <string name="settings_screen_hdr">Tela</string>
+ <string name="settings_screen_timeout_hdr">Tempo limite da Tela</string>
+ <string name="enable_timeout_chk">Habilitar tempo de tela</string>
+ <string name="screen_to_slider">Tempo limite de tela em segundos:</string>
+ <string name="screen_to_slider_s">Tempo limite de tela em segundos (0 = desativado): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Tempo limite de tela configuração indisponível</string>
+ <string name="screen_bright_slider">Brilho: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Configuração de brilho não está disponível</string>
+ <string name="vibration_hdr">Vibração</string>
+ <string name="button_vibration_hdr">Botão de vibração</string>
+ <string name="kb_vibration_hdr">Vibração de teclado</string>
+ <string name="act_vibration_hdr">Ação de vibração</string>
+ <string name="button_vibration">Botão de vibração:</string>
+ <string name="kb_vibration">Vibração de teclado:</string>
+ <string name="act_vibration">Ação de vibração:</string>
+ <string name="select_language">Selecionar idioma:</string>
+ <string name="sel_lang_btn">Selecionar idioma</string>
+ <string name="set_language_btn">Definir idioma</string>
+ <string name="advanced_hdr">Avançado</string>
+ <string name="copy_log_confirm">Copiar o Log para o cartão SD?</string>
+ <string name="copying_log">Copiar o Log para o cartão SD...</string>
+ <string name="copy_log_complete">Cópia de registro completo</string>
+ <string name="part_sd_btn">Cartão SD de partição</string>
+ <string name="part_sd_s_btn">Cartão SD</string>
+ <string name="file_manager_btn">Gerenciador de Arquivos</string>
+ <string name="language_hdr">Idioma</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Tema carregado</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Injetar TWRP</string>
+ <string name="inject_twrp_confirm">Re-injetar TWRP?</string>
+ <string name="injecting_twrp">Re-injetar TWRP...</string>
+ <string name="inject_twrp_complete">TWRP injeção completa</string>
+ <string name="swipe_to_confirm">Deslize para confirmar</string>
+ <string name="part_sd_hdr">Cartão SD de partição</string>
+ <string name="invalid_partsd_sel">Você deve selecionar um dispositivo removível</string>
+ <string name="part_sd_lose">Você vai perder todos os arquivos no cartão SD!</string>
+ <string name="part_sd_undo">Esta ação não pode ser desfeita!</string>
+ <string name="part_sd_ext_sz">Tamanho EXT:</string>
+ <string name="part_sd_swap_sz">Tamanho de swap:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Sistema de arquivos:</string>
+ <string name="swipe_part_sd">Deslize para particionar</string>
+ <string name="swipe_part_sd_s">Partição</string>
+ <string name="partitioning_sd">Particionando o cartão SD...</string>
+ <string name="partitioning_sd2">Isso levará alguns minutos.</string>
+ <string name="part_sd_complete">Particionamento completo</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Restaurar a Inicialização Original</string>
+ <string name="dumlock_restore_confirm">Restaurar a imagem de inicialização original?</string>
+ <string name="dumlock_restoring">Restauração de inicialização Original...</string>
+ <string name="dumlock_restore_complete">Restauração completa de inicialização Original</string>
+ <string name="dumlock_reflash_btn">Reflash recuperação</string>
+ <string name="dumlock_reflash_confirm">Reflash recuperação para arrancar?</string>
+ <string name="dumlock_reflashing">Reflash recuperação para arrancar...</string>
+ <string name="dumlock_reflash_complete">Flash de recuperação de inicialização completa</string>
+ <string name="dumlock_install_btn">Instalar o HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Instalar HTC dumlock arquivos de ROM?</string>
+ <string name="dumlock_installing">Instalando o HTC Dumlock...</string>
+ <string name="dumlock_install_complete">HTC Dumlock instalação completa</string>
+ <string name="swipe_to_unlock">Deslize para desbloquear</string>
+ <string name="swipe_unlock"> Desbloquear</string>
+ <string name="fm_hdr">Gerenciador de arquivos</string>
+ <string name="fm_sel_file">Selecione um arquivo ou pasta</string>
+ <string name="fm_type_folder">Pasta</string>
+ <string name="fm_type_file">Arquivo</string>
+ <string name="fm_choose_act">Escolha uma Ação</string>
+ <string name="fm_selected">%tw_fm_type% selecionado:</string>
+ <string name="fm_copy_btn">Cópia</string>
+ <string name="fm_copy_file_btn">Copiar arquivo</string>
+ <string name="fm_copy_folder_btn">Copiar pasta</string>
+ <string name="fm_copying">Copiando</string>
+ <string name="fm_move_btn">Mover</string>
+ <string name="fm_moving">Movendo</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Excluir</string>
+ <string name="fm_deleting">Excluíndo</string>
+ <string name="fm_rename_btn">Renomear</string>
+ <string name="fm_rename_file_btn">Renomear arquivo</string>
+ <string name="fm_rename_folder_btn">Renomear Pasta</string>
+ <string name="fm_renaming">Renomeando</string>
+ <string name="fm_sel_dest">Selecione a pasta de destino</string>
+ <string name="fm_sel_curr_folder">Selecione a pasta atual</string>
+ <string name="fm_rename_hdr">Renomear</string>
+ <string name="fm_set_perms_hdr">Definir permissões</string>
+ <string name="fm_perms">Permissões:</string>
+ <string name="fm_complete">Operação de arquivo completo</string>
+ <string name="decrypt_data_hdr">Descriptografar dados</string>
+ <string name="decrypt_data_enter_pass">Digite a senha.</string>
+ <string name="decrypt_data_enter_pattern">Digite padrão.</string>
+ <string name="decrypt_data_trying">Tentando a descriptografia</string>
+ <string name="term_hdr">Comando no terminal</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">MATAR</string>
+ <string name="term_sel_folder_hdr">Navegue até a pasta a começar</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Limpe Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Limpe o Cache</string>
+ <string name="swipe_to_sideload">Deslize para começar Sideload</string>
+ <string name="swipe_sideload"> Início</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Uso: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload completa</string>
+ <string name="reboot_hdr">Reiniciar</string>
+ <string name="su_hdr">Seleção de Super Usuário</string>
+ <string name="su_note1">Seu dispositivo não aparece para ser enraizado.</string>
+ <string name="su_note2">Instalar Super Usuário agora?</string>
+ <string name="su_note3">Isto enraizará seu dispositivo.</string>
+ <string name="su_cancel">Não instale</string>
+ <string name="swipe_su_to_install">Deslize para instalar</string>
+ <string name="swipe_su_install"> Instalar</string>
+ <string name="su_installing">Instalação Super Usuário</string>
+ <string name="sel_storage_list">Selecionar armazenamento</string>
+ <string name="ok_btn">OK</string>
+ <string name="no_kernel_selinux">Kernel não tem suporte para leitura de contextos do SELinux.</string>
+ <string name="full_selinux">Suporte completo do SELinux está presente.</string>
+ <string name="no_selinux">Não há suporte SELinux (não libselinux).</string>
+ <string name="mtp_enabled">MTP-habilitado</string>
+ <string name="mtp_crash">MTP caiu, não começando MTP na inicialização.</string>
+ <string name="decrypt_success">Com êxito descriptografada com a senha padrão.</string>
+ <string name="unable_to_decrypt">Não é possível descriptografar com senha padrão. Você pode precisar executar um formato de dados.</string>
+ <string name="generating_md51">Gerar o MD5</string>
+ <string name="generating_md52"> * Gerar o md5...</string>
+ <string name="md5_created"> * MD5 criado.</string>
+ <string name="md5_error"> * MD5 erro!</string>
+ <string name="md5_compute_error"> * Erro MD5 de computação.</string>
+ <string name="current_date">(Data atual)</string>
+ <string name="auto_generate">(Auto gerar)</string>
+ <string name="unable_to_locate_partition">Não é possível localizar a partição \'{1}\' para cálculos de cópia de segurança.</string>
+ <string name="no_partition_selected">Sem partições selecionadas para a cópia de segurança.</string>
+ <string name="total_partitions_backup"> * Total número de partições de cópia de segurança: {1}</string>
+ <string name="total_backup_size"> * O tamanho total de todos os dados: {1}MB</string>
+ <string name="available_space"> * Espaço disponível: {1}MB</string>
+ <string name="unable_locate_storage">Não é possível localizar o dispositivo de armazenamento.</string>
+ <string name="no_space">Não há suficiente espaço livre no armazenamento.</string>
+ <string name="backup_started">[CÓPIA DE SEGURANÇA COMEÇADO]</string>
+ <string name="backup_folder"> * Cópia de segurança da pasta: {1}</string>
+ <string name="fail_backup_folder">Não conseguiu fazer a pasta de cópia de segurança.</string>
+ <string name="avg_backup_fs">Taxa média da cópia de segurança para sistemas de arquivo: {1} MB/seg</string>
+ <string name="avg_backup_img">Taxa média de cópia de segurança para drives de imagens: {1} MB/seg</string>
+ <string name="total_backed_size">[{1} MB TOTAL CÓPIA DE SEGURANÇA]</string>
+ <string name="backup_completed">[CÓPIA DE SEGURANÇA CONCLUÍDO EM {1} SEGUNDOS]</string>
+ <string name="restore_started">[RESTAURAÇÃO COMEÇADA]</string>
+ <string name="restore_folder">Restaurar a pasta: \'{1}\'</string>
+ <string name="verifying_md5">Verificando o MD5</string>
+ <string name="skip_md5">Saltando de verificação MD5 com base na configuração de usuário.</string>
+ <string name="calc_restore">Cálculo de restauração de detalhes...</string>
+ <string name="restore_read_only">Não é possível restaurar {1}..--montada somente leitura.</string>
+ <string name="restore_unable_locate">Não é possível localizar a partição \'{1}\' para restaurar.</string>
+ <string name="no_part_restore">Sem partições selecionadas para restauração.</string>
+ <string name="restore_part_count">Restaurando partições {1}...</string>
+ <string name="total_restore_size">Tamanho total da restauração é {1}MB</string>
+ <string name="updating_system_details">Detalhes do sistema de atualização</string>
+ <string name="restore_completed">[RESTAURAÇÃO COMPLETADA EM {1} SEGUNDOS]</string>
+ <string name="error_opening_strerr">Erro ao abrir: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Não é possível localizar a partição pelo nome da cópia de segurança: \'{1}\'</string>
+ <string name="unable_find_part_path">Não é possível localizar a partição para o caminho \'{1}\'</string>
+ <string name="update_part_details">Atualização de partição de detalhes...</string>
+ <string name="update_part_details_done">... feito</string>
+ <string name="wiping_dalvik">Limpando diretórios Dalvik Cache...</string>
+ <string name="cleaned">Limpeza: {1}...</string>
+ <string name="dalvik_done">-Limpado completamente diretórios Dalvik Cache!</string>
+ <string name="no_andsec">Não encontradas partições seguras android.</string>
+ <string name="unable_to_locate">Não é possível localizar o {1}.</string>
+ <string name="wiping_datamedia">Limpando o armazenamento interno... /data/media...</string>
+ <string name="unable_to_mount">Incapaz de montar {1}</string>
+ <string name="unable_to_mount_internal">Incapaz de montar memória interna</string>
+ <string name="unable_to_mount_storage">Incapaz de montar o armazenamento</string>
+ <string name="fail_decrypt">Falha ao descriptografar os dados.</string>
+ <string name="no_crypto_support">Não há suporte para criptografia compilada para esta compilação.</string>
+ <string name="decrypt_success_dev">Dados descriptografados com sucesso, o novo dispositivo de bloco: \'{1}\'</string>
+ <string name="done">Concluído.</string>
+ <string name="start_partition_sd">Particionando o cartão SD...</string>
+ <string name="partition_sd_locate">Não é possível localizar o dispositivo para a partição.</string>
+ <string name="ext_swap_size">EXT + Swap tamanho é maior do que o tamanho do sdcard.</string>
+ <string name="remove_part_table">Remoção de tabela de partição...</string>
+ <string name="unable_rm_part">Não é possível remover a tabela de partição.</string>
+ <string name="create_part">Criando a partição de {1}...</string>
+ <string name="unable_to_create_part">Não é possível criar partição de {1}.</string>
+ <string name="format_sdext_as">Formatando sd-ext como {1}...</string>
+ <string name="part_complete">Particionamento completo.</string>
+ <string name="unable_to_open">Não é possível abrir \'{1}\'.</string>
+ <string name="mtp_already_enabled">MTP já habilitado</string>
+ <string name="mtp_fail">Falha ao ativar o MTP</string>
+ <string name="no_mtp">Suporte MTP não incluído</string>
+ <string name="image_flash_start">[IMAGEM FLASH COMEÇADO]</string>
+ <string name="img_to_flash">Imagem a piscar: \'{1}\'</string>
+ <string name="flash_unable_locate">Não é possível localizar a partição \'{1}\' para piscar.</string>
+ <string name="no_part_flash">Sem partições seleccionadas para piscar.</string>
+ <string name="too_many_flash">Muitas partições selecionadas para piscar.</string>
+ <string name="invalid_flash">Partição especificada inválida para flash.</string>
+ <string name="flash_done">[IMAGEM FLASH CONCLUÍDO]</string>
+ <string name="wiping">Limpando {1}</string>
+ <string name="repair_not_exist">{1} não existe! Não pode reparar!</string>
+ <string name="repairing_using">Reparação de {1} usando {2}...</string>
+ <string name="unable_repair">Não é possível reparar {1}.</string>
+ <string name="mount_data_footer">Não poderia montar /data e incapaz de encontrar o rodapé de criptografia.</string>
+ <string name="create_folder_strerr">Não foi possível criar a pasta \'{1}\' ({2}).</string>
+ <string name="fail_mount">Falha ao montar \'{1}\' ({2})</string>
+ <string name="fail_unmount">Falha ao montar \'{1}\' ({2})</string>
+ <string name="cannot_resize">Não é possível redimensionar {1}.</string>
+ <string name="repair_resize">Reparação de {1} antes de redimensionamento.</string>
+ <string name="unable_resize">Não é possível redimensionar {1}.</string>
+ <string name="no_md5_found">Nenhum arquivo md5 foi encontrado para \'{1}\'. Por favor, cancelar a seleção de verificação MD5 habilitar para restaurar.</string>
+ <string name="md5_fail_match">MD5 não conseguiram corresponder na \'{1}\'.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Falha ao descriptografar arquivo tar \'{1}\'</string>
+ <string name="format_data_msg">Você pode precisar reiniciar recuperação para ser capaz de usar /data novamente.</string>
+ <string name="format_data_err">Não é possível formatar para remover a criptografia.</string>
+ <string name="formatting_using">Formatação {1} usando {2}...</string>
+ <string name="unable_to_wipe">Não é possível limpar {1}.</string>
+ <string name="cannot_wipe">Partição {1} não pode ser apagada.</string>
+ <string name="remove_all">Remover todos os arquivos em \'{1}\'</string>
+ <string name="wiping_data">Limpando os dados sem limpar /data/media...</string>
+ <string name="backing_up">Cópia de Segurança de {1}...</string>
+ <string name="backing">Fazendo cópia de segurança</string>
+ <string name="backup_size">Tamanho do arquivo de cópia de segurança para \'{1}\' é 0 bytes.</string>
+ <string name="datamedia_fs_restore">Aviso: Essa cópia de segurança /data foi feita com o sistema de arquivos de {1}! A cópia de segurança não pode arrancar a menos que você muda de volta para {1}.</string>
+ <string name="restoring">Restauração de {1}...</string>
+ <string name="restoring_hdr">Restaurando</string>
+ <string name="recreate_folder_err">Não é possível recriar a pasta de {1}.</string>
+ <string name="img_size_err">Tamanho da imagem é maior do que o dispositivo de destino</string>
+ <string name="flashing">Piscando {1}...</string>
+ <string name="backup_folder_set">Pasta da cópia de segurança definida como \'{1}\'</string>
+ <string name="locate_backup_err">Não é possível localizar a cópia de segurança \'{1}\'</string>
+ <string name="set_restore_opt">Definir opções de restauração: \'{1}\':</string>
+ <string name="md5_check_skip">Ignorar verificação de MD5 é na</string>
+ <string name="ors_encrypt_restore_err">Não é possível usar OpenRecoveryScript para restaurar uma cópia de segurança criptografada.</string>
+ <string name="mounting">Montando</string>
+ <string name="unmounting">Desmontando</string>
+ <string name="mounted">Montada \'{1}\'</string>
+ <string name="unmounted">Desmontado \'{1}\'</string>
+ <string name="setting">Configuração \'{1}\' para \'{2}\'</string>
+ <string name="setting_empty">Configuração \'{1}\' para o vazio</string>
+ <string name="making_dir1">Fazendo o diretório</string>
+ <string name="making_dir2">Fazendo o diretório: \'{1}\'</string>
+ <string name="running_command">Executando o comando</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Iniciado sideload ADB característica...</string>
+ <string name="need_new_adb">Você precisa adb 1.0.32 ou mais recente para sideload para este dispositivo.</string>
+ <string name="no_pwd">Nenhuma senha fornecida.</string>
+ <string name="done_ors">Arquivo de script de processamento feito</string>
+ <string name="injecttwrp">Injetando TWRP na imagem de inicialização...</string>
+ <string name="zip_err">Erro ao instalar o arquivo zip \'{1}\'</string>
+ <string name="installing_zip">Instalando o arquivo zip \'{1}\'</string>
+ <string name="select_backup_opt">Definir opções da cópia de segurança:</string>
+ <string name="compression_on">Compressão é na</string>
+ <string name="md5_off">Geração de MD5 está fora</string>
+ <string name="backup_fail">Cópia de segurança falhou</string>
+ <string name="backup_clean">Falha de backup. Limpar a pasta de Backup.</string>
+ <string name="running_recovery_commands">Executando comandos de recuperação</string>
+ <string name="recovery_commands_complete">Comandos de recuperação completa</string>
+ <string name="running_ors">OpenRecoveryScript em execução</string>
+ <string name="ors_complete">OpenRecoveryScript completa</string>
+ <string name="no_updater_binary">Não foi possível encontrar \'{1}\' no arquivo zip.</string>
+ <string name="check_for_md5">Verificação de arquivo MD5...</string>
+ <string name="fail_sysmap">Falha ao mapear o arquivo \'{1}\'</string>
+ <string name="verify_zip_sig">Verificar a assinatura do zip...</string>
+ <string name="verify_zip_fail">Falha de verificação de assinatura do arquivo zip!</string>
+ <string name="verify_zip_done">Assinatura zip é verificada com êxito.</string>
+ <string name="zip_corrupt">O arquivo zip está corrompido!</string>
+ <string name="no_md5">Saltando de verificação MD5: nenhum arquivo MD5 encontrado</string>
+ <string name="md5_fail">Não coincide com MD5</string>
+ <string name="md5_match">Correspondência de MD5</string>
+ <string name="pid_signal">{1} processo terminou com sinal: {2}</string>
+ <string name="pid_error">{1} processo terminou com erro: {2}</string>
+ <string name="install_dumlock">Instalação HTC Dumlock sistema...</string>
+ <string name="dumlock_restore">Restauração de inicialização Original...</string>
+ <string name="dumlock_reflash">Regravando recuperação para arrancar...</string>
+ <string name="run_script">Executando o script {1}...</string>
+ <string name="rename_stock">Renomeado o arquivo de recuperação das ações em / / sistema para impedir que o stock ROM substituindo TWRP.</string>
+ <string name="split_backup">Quebrando o arquivo de cópia de segurança em vários arquivos...</string>
+ <string name="backup_error">Erro ao criar a cópia de segurança.</string>
+ <string name="restore_error">Erro durante o processo de restauração.</string>
+ <string name="split_thread">Dividindo o segmento ID {1} em {2} de arquivo</string>
+ <string name="file_progress">%llu de arquivos %llu, %i%%</string>
+ <string name="size_progress">%lluMB de %lluMB, %i%%</string>
+ <string name="decrypt_cmd">A tentativa de decifrar a partição de dados via linha de comando.</string>
+ <string name="base_pkg_err">Falha ao carregar pacotes base.</string>
+ <string name="simulating">Simulando ações...</string>
+ <string name="backup_cancel">Cópia de segurança cancelado</string>
+ <string name="config_twrp">Configurando TWRP...</string>
+ <string name="config_twrp_err">Não é possível configurar TWRP com este kernel.</string>
+ <string name="copy_log">Copiado o registro de recuperação para {1}.</string>
+ <string name="max_queue">Arquivo zip máximo alcançado!</string>
+ <string name="min_queue">Arquivo zip mínimo alcançado!</string>
+ <string name="screenshot_saved">Captura de tela foi salvo em {1}</string>
+ <string name="screenshot_err">Não foi possível tirar uma cópia de tela!</string>
+ <string name="zip_wipe_cache">Um ou mais zip solicitado uma limpeza de cache..--limpando cache agora.</string>
+ <string name="and_sec_wipe_err">Não é possível limpar o andróide seguro</string>
+ <string name="dalvik_wipe_err">Falha ao limpar dalvik</string>
+ <string name="auto_gen">(Auto gerar)</string>
+ <string name="curr_date">(Data atual)</string>
+ <string name="backup_name_len">Nome da cópia de segurança é muito longo.</string>
+ <string name="backup_name_invalid">\'{1}\' nome da cópia de segurança contém o caractere inválido: \'{1}\'</string>
+ <string name="no_real_sdcard">Este dispositivo não tem um cartão SD real! Abortando!</string>
+ <string name="cancel_sideload">Cancelamento de sideload ADB...</string>
+ <string name="change_fs_err">Sistema de arquivo erro em mudança.</string>
+ <string name="theme_ver_err">Versão personalizada do tema não coincide com a versão TWRP. Usando o tema conservado em estoque.</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/ru.xml b/gui/theme/common/languages/ru.xml
new file mode 100644
index 000000000..4de1ea811
--- /dev/null
+++ b/gui/theme/common/languages/ru.xml
@@ -0,0 +1,691 @@
+<?xml version="1.0" encoding="utf-8"?>
+<language>
+ <display>Русский</display>
+ <!-- Translated by Jemmini; modified by agur4ik, SevenMaxs, S-trace 2017 -->
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource filename="RobotoCondensed-Regular.ttf" name="font_l" scale="90" type="fontoverride"/>
+ <resource filename="RobotoCondensed-Regular.ttf" name="font_m" scale="90" type="fontoverride"/>
+ <resource filename="RobotoCondensed-Regular.ttf" name="font_s" scale="90" type="fontoverride"/>
+ <resource filename="DroidSansMono.ttf" name="fixed" scale="100" type="fontoverride"/>
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System Image</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="data_backup">Data (искл. Storage)</string>
+ <string name="sdcard">SDcard</string>
+ <string name="internal">Память устройства</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik/ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted Storage</string>
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">ЦП: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Батарея: %tw_battery%</string>
+ <string name="sort_by_name">Сорт.по имени</string>
+ <string name="sort_by_date">Сорт.по дате</string>
+ <string name="sort_by_size">Сорт.по размеру</string>
+ <string name="sort_by_name_only">Имя</string>
+ <string name="sort_by_date_only">Дата</string>
+ <string name="sort_by_size_only">Размер</string>
+ <string name="tab_general">ОСНОВНЫЕ</string>
+ <string name="tab_options">ОПЦИИ</string>
+ <string name="tab_backup">КОПИИ</string>
+ <string name="tab_time_zone">ЧАСОВОЙ ПОЯС</string>
+ <string name="tab_screen">ЭКРАН</string>
+ <string name="tab_vibration">ВИБРАЦИЯ</string>
+ <string name="tab_language">ЯЗЫК</string>
+ <string name="install_btn">Установка</string>
+ <string name="wipe_btn">Очистка</string>
+ <string name="backup_btn">Резервное коп-ние</string>
+ <string name="restore_btn">Восстановление</string>
+ <string name="mount_btn">Монтирование</string>
+ <string name="settings_btn">Настройки</string>
+ <string name="advanced_btn">Дополнительно</string>
+ <string name="reboot_btn">Перезагрузка</string>
+ <string name="files_btn">Файлы</string>
+ <string name="copy_log_btn">Копировать лог</string>
+ <string name="select_type_hdr">Выбор типа</string>
+ <string name="install_zip_hdr">Установка Zip</string>
+ <string name="install_zip_btn">Установка Zip</string>
+ <string name="install_image_hdr">Установка Img-образа</string>
+ <string name="install_image_btn">Установка Img</string>
+ <string name="install_select_file_hdr">Выбор файла</string>
+ <string name="file_selector_folders_hdr">Папки</string>
+ <string name="select_file_from_storage">Текущий накопитель: %tw_storage_display_name% (%tw_storage_free_size% МБ)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Установка</string>
+ <string name="select_storage_hdr">Выберите накопитель</string>
+ <string name="select_storage_btn">Выбор накопителя</string>
+ <string name="queue_hdr">Очередь</string>
+ <string name="zip_queue_count">Файлов в очереди: %tw_zip_queue_count% из 10 возможных</string>
+ <string name="zip_queue_count_s">Файл %tw_zip_queue_count% из 10:</string>
+ <string name="zip_warn1">Эта операция может установить несовместимое ПО на</string>
+ <string name="zip_warn2">ваше устройство и сделать загрузку системы невозможной.</string>
+ <string name="zip_back_cancel">Нажмите назад для отмены установки этого zip.</string>
+ <string name="zip_back_clear">Нажмите назад для очистки очереди.</string>
+ <string name="folder">Папка:</string>
+ <string name="file">Файл:</string>
+ <string name="zip_sig_chk">Проверка подписи Zip</string>
+ <string name="inject_twrp_chk">Интегрировать TWRP после установки</string>
+ <string name="install_reboot_chk">Автоматическая перезагрузка после установки</string>
+ <string name="options_hdr">Опции</string>
+ <string name="confirm_flash_hdr">Подтвердите установку</string>
+ <string name="zip_queue">Очередь:</string>
+ <string name="options">Опции:</string>
+ <string name="swipe_confirm"> Подтвердить</string>
+ <string name="zip_add_btn">Добавить еще Zip</string>
+ <string name="zip_clear_btn">Очистить очередь Zip</string>
+ <string name="install_zip_count_hdr">Установка Zip %tw_zip_index% из %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Установка Zip: %tw_file%</string>
+ <string name="failed">Неудача</string>
+ <string name="successful">Успешно</string>
+ <string name="install_failed">Установка не удалась</string>
+ <string name="install_successful">Установка выполнена успешно</string>
+ <string name="wipe_cache_dalvik_btn">Очистка cache/dalvik</string>
+ <string name="reboot_system_btn">Перезагрузка в ОС</string>
+ <string name="install_sel_target">Выбор раздела</string>
+ <string name="flash_image_select">Выберите раздел для прошивки образа:</string>
+ <string name="target_partition">Целевой раздел:</string>
+ <string name="flashing_image">Прошивка образа...</string>
+ <string name="image_flashed">Прошивка образа завершена</string>
+ <string name="wipe_cache_dalvik_confirm">Очистить Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Очистка Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Очистка Cache &amp; Dalvik завершена</string>
+ <string name="swipe_wipe">Свайп для очистки</string>
+ <string name="swipe_wipe_s"> Очистка</string>
+ <string name="no_os1">Система не установлена! Вы уверены,</string>
+ <string name="no_osrb">что хотите перезагрузить?</string>
+ <string name="no_ospo">что хотите выключить?</string>
+ <string name="rebooting">Перезагрузка...</string>
+ <string name="swipe_reboot">Свайп для перезагрузки</string>
+ <string name="swipe_reboot_s"> Перезагрузка</string>
+ <string name="reboot_install_app_hdr">Установить TWRP App?</string>
+ <string name="reboot_install_app1">Вы хотите установить официальное приложение TWRP?</string>
+ <string name="reboot_install_app2">Оно позволит вам проверять наличие новой версии TWRP.</string>
+ <string name="reboot_install_app_prompt_install">Предлагать установку TWRP App при его отсутствии</string>
+ <string name="reboot_install_app_system">Установить как системное приложение</string>
+ <string name="reboot_installing_app">Установка TWRP приложения...</string>
+ <string name="swipe_to_install_app">Свайп для установки TWRP App</string>
+ <string name="swipe_flash">Свайп для прошивки</string>
+ <string name="confirm_action">Подтвердить действие</string>
+ <string name="back_cancel">Нажмите назад для отмены.</string>
+ <string name="cancel_btn">Отмена</string>
+ <string name="wipe_hdr">Очистка</string>
+ <string name="factory_reset_hdr">Сброс до заводского состояния</string>
+ <string name="factory_reset_btn">Сброс на фабричные</string>
+ <string name="factory_reset1">Очистка Data, Cache, и Dalvik</string>
+ <string name="factory_reset2">(исключая внутреннее хранилище)</string>
+ <string name="factory_reset3">В большинстве случаев очистка</string>
+ <string name="factory_reset4">этих разделов достаточна.</string>
+ <string name="factory_resetting">Сброс до заводского состояния...</string>
+ <string name="advanced_wipe_hdr">Выборочная очистка</string>
+ <string name="advanced_wipe_btn">Выборочная очистка</string>
+ <string name="wipe_enc_confirm">Очистить шифрованные данные?</string>
+ <string name="formatting_data">Форматирование Data...</string>
+ <string name="swipe_format_data">Свайп для форматирования</string>
+ <string name="swipe_format_data_s"> Форматировать Data</string>
+ <string name="factory_reset_complete">Сброс до заводского состояния завершен</string>
+ <string name="sel_part_hdr">Выбор разделов</string>
+ <string name="wipe_sel_confirm">Очистить выбранные разделы?</string>
+ <string name="wiping_part">Очистка разделов...</string>
+ <string name="wipe_complete">Очистка завершена</string>
+ <string name="sel_part_wipe">Выберите разделы для очистки:</string>
+ <string name="invalid_part_sel">Выбран неверный раздел</string>
+ <string name="format_data_hdr">Форматировать Data</string>
+ <string name="format_data_btn">Форматировать Data</string>
+ <string name="format_data_ptr1">Форматирование Data удалит все приложения,</string>
+ <string name="format_data_ptr2">резервные копии, картинки, видео, медиафайлы</string>
+ <string name="format_data_ptr3">и зашифрованные файлы во внутренней памяти,</string>
+ <string name="format_data_adopted">включая расширенное хранилище.</string>
+ <string name="format_data_lcp1">Форматирование данных удалит все приложения, резервные копии, картинки, видео, медиафайлы</string>
+ <string name="format_data_lcp2">и зашифрованные файлы во внутренней памяти.</string>
+ <string name="format_data_wtc1">Форматирование данных удалит все приложения,</string>
+ <string name="format_data_wtc2">резервные копии и медиа. Это не может быть отменено.</string>
+ <string name="format_data_undo">Это не может быть отменено.</string>
+ <string name="format_data_complete">Форматирование данных завершено</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Введите yes для продолжения. Нажмите назад для отмены.</string>
+ <string name="part_opt_hdr">Опции для раздела %tw_partition_name%</string>
+ <string name="sel_act_hdr">Выбор действия</string>
+ <string name="file_sys_opt">Опции файловой системы</string>
+ <string name="partition">Раздел: %tw_partition_name%</string>
+ <string name="part_mount_point">Точка монтирования: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Файловая система: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Присутствует: да</string>
+ <string name="part_present_no">Присутствует: нет</string>
+ <string name="part_removable_yes">Съемное: да</string>
+ <string name="part_removable_no">Съемное: нет</string>
+ <string name="part_size">Размер: %tw_partition_size% МБ</string>
+ <string name="part_used">Использовано: %tw_partition_used% МБ</string>
+ <string name="part_free">Свободно: %tw_partition_free% МБ</string>
+ <string name="part_backup_size">Размер резервных копий: %tw_partition_backup_size% МБ</string>
+ <string name="resize_btn">Измен. размер</string>
+ <string name="resize_btn_s">Изм. размер</string>
+ <string name="resize_confirm">Изменить размер %tw_partition_name%?</string>
+ <string name="resizing">Изменение размера...</string>
+ <string name="resize_complete">Размер раздела изменён</string>
+ <string name="swipe_resize">Свайп для изменения размера</string>
+ <string name="swipe_resize_s"> Измен. размер</string>
+ <string name="repair_btn">Восст-ть файл. систему</string>
+ <string name="repair_btn_s">Восстановление</string>
+ <string name="repair_confirm">Восстановить %tw_partition_name%?</string>
+ <string name="repairing">Восстановление...</string>
+ <string name="repair_complete">Восстановление завершено</string>
+ <string name="swipe_repair">Свайп для восстановления</string>
+ <string name="swipe_repair_s"> Восстановление</string>
+ <string name="change_fs_btn">Изм. файловую систему</string>
+ <string name="change_fs_btn_s">Измен. ФС</string>
+ <string name="change_fs_for_hdr">Изменить файловую систему для %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Раздел: %tw_partition_name% &gt; Select File System</string>
+ <string name="change_fs_warn1">Некоторые прошивки или ядра могут не поддерживать</string>
+ <string name="change_fs_warn2">некоторые файловые системы. Действуйте с осторожностью!</string>
+ <string name="change_fs_confirm">Изменить %tw_partition_name%?</string>
+ <string name="formatting">Форматирование...</string>
+ <string name="format_complete">Форматирование завершено</string>
+ <string name="swipe_change_fs">Свайп для изменения</string>
+ <string name="swipe_change_s"> Изменить</string>
+ <string name="back_btn">Назад</string>
+ <string name="wipe_enc_btn">Стереть шифрование</string>
+ <string name="swipe_factory_reset">Свайп для подтверждения</string>
+ <string name="repair_change_btn">Восстановить или изменить файловую систему</string>
+ <string name="storage_hdr">Текущий накопитель: %tw_storage_display_name% (%tw_storage_free_size% МБ)</string>
+ <string name="backup_hdr">Резервное копирование</string>
+ <string name="backup_confirm_hdr">Подтверждение резервного копирования</string>
+ <string name="encryption_tab">ШИФРОВАНИЕ</string>
+ <string name="encryption">Шифрование:</string>
+ <string name="name">Имя:</string>
+ <string name="sel_part_backup">Выберите разделы для резервного копирования:</string>
+ <string name="storage">Хранилище:</string>
+ <string name="enc_disabled">выключено - установите пароль для включения</string>
+ <string name="enc_enabled">включено</string>
+ <string name="enable_backup_comp_chk">Использовать сжатие</string>
+ <string name="skip_md5_backup_chk">Пропустить вычисление MD5</string>
+ <string name="disable_backup_space_chk" version="2">Отключить проверку свободного места</string>
+ <string name="current_boot_slot">Текущий слот: %tw_active_slot%</string>
+ <string name="boot_slot_a">Слот A</string>
+ <string name="boot_slot_b">Слот B</string>
+ <string name="changing_boot_slot">Изменение слота загрузки</string>
+ <string name="changing_boot_slot_complete">Изменение слота загрузки завершено</string>
+ <string name="refresh_sizes_btn">Обновить размеры</string>
+ <string name="swipe_backup">Свайп для начала</string>
+ <string name="append_date_btn">Добавить дату</string>
+ <string name="backup_name_exists">Резервная копия с таким именем уже существует!</string>
+ <string name="encrypt_backup">Зашифровать вашу резервную копию?</string>
+ <string name="enter_pass">Введите пароль:</string>
+ <string name="enter_pass2">Введите пароль еще раз:</string>
+ <string name="pass_not_match">Пароли не совпадают!</string>
+ <string name="partitions">Разделы:</string>
+ <string name="disabled">Выключено</string>
+ <string name="enabled">Включено</string>
+ <string name="backup_name_hdr">Установка имени резервной копии</string>
+ <string name="progress">Выполнение:</string>
+ <string name="backup_complete">Резервное копирование завершено</string>
+ <string name="restore_hdr">Восстановление</string>
+ <string name="sel_backup_hdr">Выбор резервной копии</string>
+ <string name="restore_sel_store_hdr">Текущий накопитель: %tw_storage_display_name% (%tw_storage_free_size% МБ)</string>
+ <string name="restore_sel_pack_fs">Выбор резервной копии для восстановления:</string>
+ <string name="restore_enc_backup_hdr">Зашифрованная резервная копия</string>
+ <string name="restore_dec_fail">Пароль неверный, попробуйте снова!</string>
+ <string name="del_backup_btn">Удаление рез.копии</string>
+ <string name="del_backup_confirm">Удалить резервную копию?</string>
+ <string name="del_backup_confirm2">Это не может быть отменено!</string>
+ <string name="deleting_backup">Удаление резервной копии...</string>
+ <string name="backup_deleted">Удаление завершено</string>
+ <string name="swipe_delete">Свайп для удаления</string>
+ <string name="swipe_delete_s"> Удаление</string>
+ <string name="restore_try_decrypt">Зашифрованная резервная копия - попытка расшифровки</string>
+ <string name="restore_try_decrypt_s">Попытка расшифровки</string>
+ <string name="restore_backup_date">Резервная копия создана: %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Выбор раздела для восстановления:</string>
+ <string name="restore_enable_md5_chk">Включить проверку MD5 файлов резервной копии</string>
+ <string name="restore_complete">Восстановление завершено</string>
+ <string name="swipe_restore">Свайп для восстановления</string>
+ <string name="swipe_restore_s"> Восстановление</string>
+ <string name="rename_backup_hdr">Переименование резервной копии</string>
+ <string name="rename_backup_confirm">Переименовать резервную копию?</string>
+ <string name="rename_backup_confirm2">Это не может быть отменено!</string>
+ <string name="renaming_backup">Переименование резервной копии...</string>
+ <string name="rename_backup_complete">Переименование завершено</string>
+ <string name="swipe_to_rename">Свайп для переименования</string>
+ <string name="swipe_rename"> Переименовать</string>
+ <string name="confirm_hdr">Подтвердить</string>
+ <string name="mount_hdr">Монтирование</string>
+ <string name="mount_sel_part">Выбор разделов для монтирования:</string>
+ <string name="mount_sys_ro_chk">Системный раздел только для чтения</string>
+ <string name="mount_sys_ro_s_chk"> Система RO</string>
+ <string name="decrypt_data_btn">Расшифровать данные</string>
+ <string name="disable_mtp_btn">Выключить MTP</string>
+ <string name="enable_mtp_btn">Включить MTP</string>
+ <string name="mount_usb_storage_btn">Включить UMS</string>
+ <string name="usb_storage_hdr">USB накопитель</string>
+ <string name="usb_stor_mnt1">Режим USB накопителя включен</string>
+ <string name="usb_stor_mnt2">Перед отключением вашего устройства от компьютера,</string>
+ <string name="usb_stor_mnt3">выполните размонтирование (выключите UMS)!</string>
+ <string name="unmount_btn">Выключить UMS</string>
+ <string name="rb_system_btn">Система</string>
+ <string name="rb_poweroff_btn">Выключение</string>
+ <string name="rb_recovery_btn">Рекавери</string>
+ <string name="rb_bootloader_btn">Загрузчик</string>
+ <string name="rb_download_btn">Режим загрузки</string>
+ <string name="turning_off">Выключение...</string>
+ <string name="swipe_power_off">Свайп для выключения</string>
+ <string name="swipe_power_off_s">Выключение</string>
+ <string name="sys_ro_hdr">Модификация системного раздела</string>
+ <string name="sys_ro_keep">Оставить системный раздел только для чтения?</string>
+ <string name="sys_rop1">TWRP может оставить системный раздел неизменным,</string>
+ <string name="sys_rop2">чтобы сохранить возможность официальных обновлений.</string>
+ <string name="sys_rop3">При этом система сможет вернуть обратно стоковый</string>
+ <string name="sys_rop4">рекавери, а TWRP не будет предлагать установку root.</string>
+ <string name="sys_rop5">Установка zip или работа adb все равно смогут изменять</string>
+ <string name="sys_rop6">системный раздел.</string>
+ <string name="sys_rol1">TWRP может оставить системный раздел неизменным, чтобы сохранить возможность официальних обновлений.</string>
+ <string name="sys_rol2">При этом система сможет вернуть обратно стоковый рекавери, а TWRP не будет предлагать установку root.</string>
+ <string name="sys_rol3">Установка zip или работа adb все равно смогут изменять системный раздел.</string>
+ <string name="sys_ro_never_show_chk">Больше не показывать это при загрузке</string>
+ <string name="sys_ro_keep_ro_btn">Только для чтения</string>
+ <string name="swipe_allow_mod">Разрешить изменения</string>
+ <string name="swipe_allow_mod_s">Разрешить изменения</string>
+ <string name="settings_hdr">Настройки</string>
+ <string name="settings_gen_hdr">Основные</string>
+ <string name="settings_gen_s_hdr">Основные</string>
+ <string name="settings_gen_btn">Основные</string>
+ <string name="use_rmrf_chk">Использовать rm -rf вместо форматирования</string>
+ <string name="use24clock_chk">Использовать 24-часовой формат времени</string>
+ <string name="rev_navbar_chk">Инвертировать порядок навигационных кнопок</string>
+ <string name="simact_chk">Имитация действий для тестирования темы</string>
+ <string name="simfail_chk">Имитация отказа для действий</string>
+ <string name="ctr_navbar_rdo">Кнопки нав.панели по центру</string>
+ <string name="lft_navbar_rdo">Выровнять кнопки нав.панели слева</string>
+ <string name="rht_navbar_rdo">Выровнять кнопки нав.панели справа</string>
+ <string name="restore_defaults_btn">Сброс настроек</string>
+ <string name="settings_tz_btn">Часовой пояс</string>
+ <string name="settings_screen_btn">Экран</string>
+ <string name="settings_screen_bright_btn">Яркость</string>
+ <string name="settings_vibration_btn">Вибрация</string>
+ <string name="settings_language_btn">Язык</string>
+ <string name="time_zone_hdr">Часовой пояс</string>
+ <string name="sel_tz_list">Выбор часового пояса:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) о. Мидуэй, Самоа</string>
+ <string name="utcm10">(UTC -10) Гавайи</string>
+ <string name="utcm9">(UTC -9) Аляска</string>
+ <string name="utcm8">(UTC -8) Тихоокеанский часовой пояс</string>
+ <string name="utcm7">(UTC -7) Горное время (США и Канада), Аризона</string>
+ <string name="utcm6">(UTC -6) Центральное время (США и Канада), Центральная Америка</string>
+ <string name="utcm5">(UTC -5) Восточное время (США и Канада), Индиана (восток)</string>
+ <string name="utcm4">(UTC -4) Атлантическое время (Канада), Каракас</string>
+ <string name="utcm3">(UTC -3) Бразилия, Буэнос-Айрес</string>
+ <string name="utcm2">(UTC -2) Среднеатлантическое время</string>
+ <string name="utcm1">(UTC -1) Азорские о-ва, о-ва Зелёного мыса</string>
+ <string name="utc0">(UTC 0) Лондон, Дублин, Лиссабон</string>
+ <string name="utcp1">(UTC +1) Берлин, Брюссель, Париж</string>
+ <string name="utcp2">(UTC +2) Киев, Минск, Рига, Таллин, Стамбул</string>
+ <string name="utcp3">(UTC +3) Москва, Санкт-Петербург, Волгоград, Багдад</string>
+ <string name="utcp4">(UTC +4) Баку, Ереван, Тбилиси, Абу-Даби, Мускат</string>
+ <string name="utcp5">(UTC +5) Ташкент, Исламабад, Карачи</string>
+ <string name="utcp6">(UTC +6) Алматы, Астана, Дхака, Екатеринбург</string>
+ <string name="utcp7">(UTC +7) Омск, Новосибирск, Бангкок, Джакарта, Ханой</string>
+ <string name="utcp8">(UTC +8) Красноярск, Пекин, Улан-Батор, Иркутск</string>
+ <string name="utcp9">(UTC +9) Осака, Саппоро, Токио, Сеул, Якутск</string>
+ <string name="utcp10">(UTC +10) Гуам, Канберра, Мельбурн, Сидней</string>
+ <string name="utcp11">(UTC +11) Владивосток, Сахалин, Соломоновы о-ва</string>
+ <string name="utcp12">(UTC +12) Магадан, Камчатка, Фиджи, Маршаловы о-ва</string>
+ <string name="sel_tz_offset">Выбор смещения (как правило 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Нет</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Использовать летнее время (DST)</string>
+ <string name="curr_tz">Текущий часовой пояс: %tw_time_zone%</string>
+ <string name="curr_tz_s">Текущий часовой пояс:</string>
+ <string name="set_tz_btn">Установ.часовой пояс</string>
+ <string name="settings_screen_hdr">Экран</string>
+ <string name="settings_screen_timeout_hdr">Таймаут экрана</string>
+ <string name="enable_timeout_chk">Включить таймаут экрана</string>
+ <string name="screen_to_slider">Выключение экрана через n сек:</string>
+ <string name="screen_to_slider_s">Выключение экрана через n сек (0=выключен): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Установка таймаута экрана недоступна</string>
+ <string name="screen_bright_slider">Яркость: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Установка яркости недоступна</string>
+ <string name="vibration_hdr">Вибрация</string>
+ <string name="button_vibration_hdr">Вибрация при нажатии кнопок</string>
+ <string name="kb_vibration_hdr">Вибрация при работе с клавиатурой</string>
+ <string name="act_vibration_hdr">Вибрация при выборе действия</string>
+ <string name="button_vibration">Вибрация при нажатии кнопок:</string>
+ <string name="kb_vibration">Вибрация при работе с клавиатурой:</string>
+ <string name="act_vibration">Вибрация при завершении действия:</string>
+ <string name="select_language">Выбор языка:</string>
+ <string name="sel_lang_btn">Выбор языка</string>
+ <string name="set_language_btn">Установить язык</string>
+ <string name="advanced_hdr">Дополнительно</string>
+ <string name="copy_log_confirm">Копировать лог на SD?</string>
+ <string name="copying_log" version="2">Копирование лога на SD...</string>
+ <string name="copy_log_complete" version="2">Копирование лога завершено.</string>
+ <string name="fix_context_btn">Исправить контекст</string>
+ <string name="part_sd_btn">Разметка SD-карты</string>
+ <string name="part_sd_s_btn">Разм-ка SD</string>
+ <string name="file_manager_btn">Проводник</string>
+ <string name="language_hdr">Язык</string>
+ <string name="terminal_btn">Терминал</string>
+ <string name="reload_theme_btn">Перезагрузить тему</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Интегрировать TWRP</string>
+ <string name="inject_twrp_confirm">Интегрировать TWRP заново?</string>
+ <string name="injecting_twrp">Интегрирование TWRP...</string>
+ <string name="inject_twrp_complete">Интегрирование TWRP завершено</string>
+ <string name="swipe_to_confirm">Свайп для подтверждения</string>
+ <string name="part_sd_hdr">Разметка SD-карты</string>
+ <string name="invalid_partsd_sel">Вы должны выбрать съемное устройство</string>
+ <string name="part_sd_lose">Все файлы на вашей SD-карте будут стерты!</string>
+ <string name="part_sd_undo">Это действие не может быть отменено!</string>
+ <string name="part_sd_ext_sz">Размер EXT-раздела:</string>
+ <string name="part_sd_swap_sz">Размер swap-раздела:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Файловая система:</string>
+ <string name="swipe_part_sd">Свайп для разметки</string>
+ <string name="swipe_part_sd_s">Разметка</string>
+ <string name="partitioning_sd">Разметка SD-карты...</string>
+ <string name="partitioning_sd2">Это может занять несколько минут.</string>
+ <string name="part_sd_complete">Разметка завершена</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Восстановление оригинального Boot</string>
+ <string name="dumlock_restore_confirm">Восстановить оригинальный образ boot?</string>
+ <string name="dumlock_restoring">Восстановление оригинального Boot...</string>
+ <string name="dumlock_restore_complete">Восстановление оригинального Boot завершено</string>
+ <string name="dumlock_reflash_btn">Перепрошивка рекавери</string>
+ <string name="dumlock_reflash_confirm">Перепрошить recovery в boot?</string>
+ <string name="dumlock_reflashing">Прошивка recovery в boot...</string>
+ <string name="dumlock_reflash_complete">Прошивка recovery в boot завершена</string>
+ <string name="dumlock_install_btn">Установка HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Установить HTC dumlock файлы в прошивку?</string>
+ <string name="dumlock_installing">Установка HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Установка HTC Dumlock завершена</string>
+ <string name="swipe_to_unlock">Свайп для разблокировки</string>
+ <string name="swipe_unlock"> Разблокировать</string>
+ <string name="fm_hdr">Файловый менеджер</string>
+ <string name="fm_sel_file">Выбор файла или папки</string>
+ <string name="fm_type_folder">Папка</string>
+ <string name="fm_type_file">Файл</string>
+ <string name="fm_choose_act">Выбор действия</string>
+ <string name="fm_selected">%tw_fm_type% :</string>
+ <string name="fm_copy_btn">Копировать</string>
+ <string name="fm_copy_file_btn">Копировать файл</string>
+ <string name="fm_copy_folder_btn">Копировать папку</string>
+ <string name="fm_copying">Копирование</string>
+ <string name="fm_move_btn">Переместить</string>
+ <string name="fm_moving">Перемещение</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Удалить</string>
+ <string name="fm_deleting">Удаление</string>
+ <string name="fm_rename_btn">Переименовать</string>
+ <string name="fm_rename_file_btn">Переименовать файл</string>
+ <string name="fm_rename_folder_btn">Переименовать папку</string>
+ <string name="fm_renaming">Переименование</string>
+ <string name="fm_sel_dest">Выбор целевой папки</string>
+ <string name="fm_sel_curr_folder">Выбор текущей папки</string>
+ <string name="fm_rename_hdr">Переименовать</string>
+ <string name="fm_set_perms_hdr">Установить права</string>
+ <string name="fm_perms">Права:</string>
+ <string name="fm_complete">Операция завершена</string>
+ <string name="decrypt_data_hdr">Расшифровать данные</string>
+ <string name="decrypt_data_enter_pass">Введите пароль.</string>
+ <string name="decrypt_data_failed">Пароль неверный, попробуйте снова!</string>
+ <string name="decrypt_data_failed_pattern">Шаблон неверный, попробуйте снова!</string>
+ <string name="decrypt_data_enter_pattern">Введите шаблон.</string>
+ <string name="decrypt_data_trying">Попытка расшифровки</string>
+ <string name="term_hdr">Команда терминала</string>
+ <string name="term_s_hdr">Терминал</string>
+ <string name="term_kill_btn">УБИТЬ</string>
+ <string name="term_sel_folder_hdr">Перейдите к стартовой папке</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Очистка Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Очистка Cache</string>
+ <string name="swipe_to_sideload">Свайп для начала sideload</string>
+ <string name="swipe_sideload"> Старт</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Пример: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload завершен</string>
+ <string name="fix_contexts_hdr">Исправление контекста SELinux</string>
+ <string name="fix_contexts_note1">Примечание: исправление контекста SELinux требуется редко.</string>
+ <string name="fix_contexts_note2">Исправление SELinux-контекста может привести</string>
+ <string name="fix_contexts_note3">к тому, что система не будет запускаться.</string>
+ <string name="swipe_to_fix_contexts">Свайп для исправлен. контекста</string>
+ <string name="swipe_fix_contexts"> Исправить контекст</string>
+ <string name="fixing_contexts">Исправление контекста...</string>
+ <string name="fix_contexts_complete">Исправление контекста завершено</string>
+ <string name="reboot_hdr">Перезагрузка</string>
+ <string name="su_hdr">Проверика SuperSU</string>
+ <string name="su_note1">В вашем устройстве отсутствует рут-доступ.</string>
+ <string name="su_note2">Установить SuperSU сейчас?</string>
+ <string name="su_note3">Рут-доступ будет активирован.</string>
+ <string name="su_cancel">Не устанавливать</string>
+ <string name="swipe_su_to_install">Свайп для установки</string>
+ <string name="swipe_su_install"> Установка</string>
+ <string name="su_installing">Установка SuperSU</string>
+ <string name="sel_storage_list">Выберите накопитель</string>
+ <string name="ok_btn">OK</string>
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Чтение SELinux-контекста не поддерживается ядром.</string>
+ <string name="full_selinux">Присутствует полная поддержка SELinux.</string>
+ <string name="no_selinux">Отсутствует поддержка SELinux (нет libselinux).</string>
+ <string name="mtp_enabled">MTP Включено</string>
+ <string name="mtp_crash">Сбой MTP: MTP не запущен при загрузке.</string>
+ <string name="decrypt_success">Расшифровка выполнена успешно с паролем по умолчанию.</string>
+ <string name="unable_to_decrypt">Невозможно расшифровать с паролем по умолчанию. Возможно потребуется выполнить форматирование Data.</string>
+ <string name="generating_md51">Вычисление MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Вычисление md5...</string>
+ <string name="md5_created"> * MD5 создана.</string>
+ <string name="md5_error"> * Ошибка MD5!</string>
+ <string name="md5_compute_error"> * Ошибка вычисления MD5.</string>
+ <string name="current_date">(Текущая дата)</string>
+ <string name="auto_generate">(Создать автоматически)</string>
+ <string name="unable_to_locate_partition">Не удается найти '{1}' раздел для расчета копирования.</string>
+ <string name="no_partition_selected">Не выбраны разделы для резервного копирования.</string>
+ <string name="total_partitions_backup"> * Общее количество разделов для резервного копирования: {1}</string>
+ <string name="total_backup_size"> * Общий объем данных: {1} МБ</string>
+ <string name="available_space"> * Доступный объем: {1} МБ</string>
+ <string name="unable_locate_storage">Не удается найти накопитель для хранения.</string>
+ <string name="no_space">В накопителе для хранения недостаточно свободного места.</string>
+ <string name="backup_started">[РЕЗЕРВНОЕ КОПИРОВАНИЕ НАЧАТО]</string>
+ <string name="backup_folder"> * Папка для резервной копии: {1}</string>
+ <string name="fail_backup_folder">Не удается создать папку для резервной копии.</string>
+ <string name="avg_backup_fs">Средняя скорость копирования для файлов: {1} МБ/сек</string>
+ <string name="avg_backup_img">Средняя скорость копирования для образов: {1} МБ/сек</string>
+ <string name="total_backed_size">[ВСЕГО СКОПИРОВАНО {1} МБ]</string>
+ <string name="backup_completed">[КОПИРОВАНИЕ ЗАВЕРШЕНО ЗА {1} СЕКУНД(Ы)]</string>
+ <string name="restore_started">[ВОССТАНОВЛЕНИЕ НАЧАТО]</string>
+ <string name="restore_folder">Папка для восстановления: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} выполнено за {2} секунд(ы)]</string>
+ <string name="verifying_md5">Проверка MD5</string>
+ <string name="skip_md5">Пропуск проверки MD5 согласно настройкам.</string>
+ <string name="calc_restore">Вычисление информации о восстановлении...</string>
+ <string name="restore_read_only">Невозможно восстановить {1} -- смонтировано только для чтения.</string>
+ <string name="restore_unable_locate">Не удается найти '{1}' раздел для восстановления.</string>
+ <string name="no_part_restore">Не выбраны разделы для восстановления.</string>
+ <string name="restore_part_count">Восстановление {1} разделов...</string>
+ <string name="total_restore_size">Общий размер для восстановления: {1} МБ</string>
+ <string name="updating_system_details">Обновление информации о системе</string>
+ <string name="restore_completed">[ВОССТАНОВЛЕНИЕ ЗАВЕРШЕНО ЗА {1} СЕКУНД(Ы)]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Ошибка открытия: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Не удается найти раздел для копирования: '{1}'</string>
+ <string name="unable_find_part_path">Не удается найти раздел по пути '{1}'</string>
+ <string name="update_part_details">Обновление информации о разделах...</string>
+ <string name="update_part_details_done">...готово</string>
+ <string name="wiping_dalvik">Очистка директорий Dalvik Cache...</string>
+ <string name="cleaned">Очищены: {1}...</string>
+ <string name="dalvik_done">-- Очистка директорий Dalvik Cache завершена!</string>
+ <string name="no_andsec">Не найдены разделы android secure.</string>
+ <string name="unable_to_locate">{1} не найден.</string>
+ <string name="wiping_datamedia">Очистка внутренней памяти -- /data/media...</string>
+ <string name="unable_to_mount">Не удается смонтировать {1}</string>
+ <string name="unable_to_mount_internal">Не удается смонтировать internal_storage</string>
+ <string name="unable_to_mount_storage">Не удается смонтировать накопитель</string>
+ <string name="fail_decrypt">Не удается расшифровать data.</string>
+ <string name="no_crypto_support">Шифрование не добавлено в эту сборку, пинайте разработчика.</string>
+ <string name="decrypt_success_dev">Раздел Data успешно расшифрован, новое блочное устройство: '{1}'</string>
+ <string name="decrypt_success_nodev">Раздел Data успешно расшифрован</string>
+ <string name="done">Готово.</string>
+ <string name="start_partition_sd">Разметка SD-карты...</string>
+ <string name="partition_sd_locate">Не удалось найти устройство для разметки.</string>
+ <string name="ext_swap_size">Размер EXT + Swap превышает размер sdcard.</string>
+ <string name="remove_part_table">Удаление таблицы разделов...</string>
+ <string name="unable_rm_part">Не удается удалить таблицу разделов.</string>
+ <string name="create_part">Создание раздела {1}...</string>
+ <string name="unable_to_create_part">Не удается создать раздел {1}.</string>
+ <string name="format_sdext_as">Форматирование sd-ext в {1}...</string>
+ <string name="part_complete">Разметка завершена.</string>
+ <string name="unable_to_open">Не удается открыть '{1}'.</string>
+ <string name="mtp_already_enabled">MTP уже включен</string>
+ <string name="mtp_fail">Не удалось включить MTP</string>
+ <string name="no_mtp">Поддержка MTP отсутствует</string>
+ <string name="image_flash_start">[ПРОШИВКА ОБРАЗА НАЧАТА]</string>
+ <string name="img_to_flash">Образ для прошивки: '{1}'</string>
+ <string name="flash_unable_locate">Не удается найти раздел '{1}'.</string>
+ <string name="no_part_flash">Не выбраны разделы для прошивки.</string>
+ <string name="too_many_flash">Выбрано слишком много разделов для прошивки.</string>
+ <string name="invalid_flash">Указан неверный раздел для прошивки.</string>
+ <string name="flash_done">[ПРОШИВКА ОБРАЗА ЗАВЕРШЕНА]</string>
+ <string name="wiping">Очистка {1}</string>
+ <string name="repair_not_exist">{1} не существует! Невозможно восстановить!</string>
+ <string name="repairing_using">Восстановление {1} с помощью {2}...</string>
+ <string name="unable_repair">Невозможно восстановить {1}.</string>
+ <string name="mount_data_footer">Не удалось смонтировать /data, не найден крипто-ключ.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Невозможно создать папку '{1}' ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Не удается смонтировать '{1}' ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">Не удается размонтировать '{1}' ({2})</string>
+ <string name="cannot_resize">Невозможно изменить размер {1}.</string>
+ <string name="repair_resize">Восстановление {1} перед изменением размера.</string>
+ <string name="unable_resize">Не удается изменить размер {1}.</string>
+ <string name="no_md5_found">Отсутствует файл md5 для '{1}'. Пожалуйста отмените выбор проверки MD5 при восстановлении.</string>
+ <string name="md5_fail_match">MD5 не соответствует '{1}'.</string>
+ <string name="md5_matched">MD5 соответствует '{1}'.</string>
+ <string name="fail_decrypt_tar">Не удается расшифровать tar-файл '{1}'</string>
+ <string name="format_data_msg">Вам, возможно, потребуется перезагрузись рекавери, чтобы иметь возможность использовать /data снова.</string>
+ <string name="format_data_err">Невозможно отформатировать и удалить шифрование.</string>
+ <string name="formatting_using">Форматирование {1} с помощью {2}...</string>
+ <string name="unable_to_wipe">Невозможно очистить {1}.</string>
+ <string name="cannot_wipe">Раздел {1} не может быть очищен.</string>
+ <string name="remove_all">Удаление всех файлов в '{1}'</string>
+ <string name="wiping_data">Очистка /data без очистки /data/media ...</string>
+ <string name="backing_up">Резервное копирование {1}...</string>
+ <string name="backup_storage_warning">Резервное копирование {1}, за исключением файлов во внутренней памяти, таких как фотографии или загрузки.</string>
+ <string name="backing">Резервное копирование</string>
+ <string name="backup_size">Размер файла резервной копии для '{1}' 0 байт.</string>
+ <string name="datamedia_fs_restore">ВНИМАНИЕ: Эта резервная копия /data была создана с файловой системы {1}! Резервная копия может не загрузиться, если вы не измените обратно на {1}.</string>
+ <string name="restoring">Восстановление {1}...</string>
+ <string name="restoring_hdr">Восстановление</string>
+ <string name="recreate_folder_err">Невозможно заново создать папку {1}.</string>
+ <string name="img_size_err">Размер образа больше размера целевого устройства</string>
+ <string name="flashing">Прошивка {1}...</string>
+ <string name="backup_folder_set">Папка для резервной копии установлена в '{1}'</string>
+ <string name="locate_backup_err">Не удается найти резервную копию '{1}'</string>
+ <string name="set_restore_opt">Установки опций восстановления: '{1}':</string>
+ <string name="md5_check_skip">Пропуск проверки MD5 включен</string>
+ <string name="ors_encrypt_restore_err">Не удается использовать OpenRecoveryScript для восстановления зашифрованной резервной копии.</string>
+ <string name="mounting">Монтирование</string>
+ <string name="unmounting">Размонтирование</string>
+ <string name="mounted">'{1}' смонтирован</string>
+ <string name="unmounted">'{1}' размонтирован</string>
+ <string name="setting">Установка '{1}' в '{2}'</string>
+ <string name="setting_empty">Установка значения '{1}' в пустое</string>
+ <string name="making_dir1">Создание директории</string>
+ <string name="making_dir2">Создание директории '{1}'</string>
+ <string name="running_command">Запуск команды</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Запуск ADB Sideload...</string>
+ <string name="need_new_adb">Вам необходим adb 1.0.32 или новее для выполнения sideload на этом устр-ве.</string>
+ <string name="no_pwd">Не предоставлен пароль.</string>
+ <string name="done_ors">Завершено выполнение файла сценария</string>
+ <string name="injecttwrp">Введение TWRP в образ boot...</string>
+ <string name="zip_err">Ошибка при установке zip файла '{1}'</string>
+ <string name="installing_zip">Установка zip файла '{1}'</string>
+ <string name="select_backup_opt">Установка опций резервного копирования:</string>
+ <string name="compression_on">Сжатие включено</string>
+ <string name="md5_off">Вычисление MD5 выключено</string>
+ <string name="backup_fail">Ошибка резервного копирования</string>
+ <string name="backup_clean">Ошибка резервного копирования. Очистка папки с резервной копией.</string>
+ <string name="running_recovery_commands">Выполнение команд рекавери</string>
+ <string name="recovery_commands_complete">Команды рекавери завершены</string>
+ <string name="running_ors">Выполнение OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript выполнен</string>
+ <string name="invalid_zip_format">Неверный формат zip файла!</string>
+ <string name="check_for_md5">Проверка MD5-файлов...</string>
+ <string name="fail_sysmap">Не удалось отобразить в память файл '{1}'</string>
+ <string name="verify_zip_sig">Проверка подписи zip...</string>
+ <string name="verify_zip_fail">Подпись Zip не прошла проверку!</string>
+ <string name="verify_zip_done">Подпись Zip проверена успешно.</string>
+ <string name="zip_corrupt">Zip-файл поврежден!</string>
+ <string name="no_md5">Пропуск проверки MD5: не найден MD5-файл</string>
+ <string name="md5_fail">MD5 не соответствует</string>
+ <string name="md5_match">MD5 соответствует</string>
+ <string name="pid_signal">Процесс {1} завершился с кодом {2}</string>
+ <string name="pid_error">Процесс {1} завершился с ОШИБКОЙ: {2}</string>
+ <string name="install_dumlock">Установка HTC Dumlock в систему...</string>
+ <string name="dumlock_restore">Восстановление оригинального boot...</string>
+ <string name="dumlock_reflash">Перепрошивка recovery в boot...</string>
+ <string name="run_script">Запуск сценария {1}...</string>
+ <string name="rename_stock">Переименование файла стокового рекавери в /system для предотвращения возврата на стоковое рекавери вместо TWRP.</string>
+ <string name="split_backup">Разделение резервной копии на несколько архивов...</string>
+ <string name="backup_error">Ошибка создания резервной копии.</string>
+ <string name="restore_error">Ошибка восстановления резервной копии.</string>
+ <string name="split_thread">Разделение идентификатора потока {1} в архив {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu из %llu файлов, %i%%</string>
+ <string name="size_progress">%llu МБ из %llu МБ, %i%%</string>
+ <string name="decrypt_cmd">Попытка расшифровать раздел данных с помощью командной строки.</string>
+ <string name="base_pkg_err">Неудача при загрузке базовых пакетов.</string>
+ <string name="simulating">Имитация действий...</string>
+ <string name="backup_cancel">Резервное копирование отменено</string>
+ <string name="config_twrp">Конфигурирование TWRP...</string>
+ <string name="config_twrp_err">Невозможно сконфигурировать TWRP с этим ядром.</string>
+ <string name="copy_log">recovery.log скопирован в {1}.</string>
+ <string name="max_queue">Максимум zip в очереди достигнут!</string>
+ <string name="min_queue">Минимум zip в очереди достигнут!</string>
+ <string name="screenshot_saved">Скриншот сохранен в {1}</string>
+ <string name="screenshot_err">Не удалось сделать скриншот!</string>
+ <string name="zip_wipe_cache">Один или более zip запрашивают очистку cache -- Очистка cache...</string>
+ <string name="and_sec_wipe_err">Невозможно очистить android secure</string>
+ <string name="dalvik_wipe_err">Не удалось очистить dalvik</string>
+ <string name="auto_gen">(Создать автоматически)</string>
+ <string name="curr_date">(Текущая дата)</string>
+ <string name="backup_name_len">Имя резервной копии слишком длинное.</string>
+ <string name="backup_name_invalid">Имя резервной копии '{1}' содержит недопустимые символы: '{1}'</string>
+ <string name="no_real_sdcard">Отмена, т.к. в устройстве отсутствует реальная SD-карта!</string>
+ <string name="cancel_sideload">Отмена ADB Sideload...</string>
+ <string name="change_fs_err">Ошибка при изменении файловой системы.</string>
+ <string name="theme_ver_err">Версия темы не соответствует версии TWRP. Используется тема по умолчанию.</string>
+ <string name="up_a_level">(в родительский каталог)</string>
+ <string name="install_reboot" version="2">Устройство будет перезагружено через %tw_sleep% сек.</string>
+ <string name="adbbackup_error">Ошибка резервного копирования по ADB. Выход...</string>
+ <string name="adbbackup_control_error">Невозможно записать в канал управления ADB.</string>
+ <string name="twrp_adbbu_option">-- эта опция позволяет делать резервное копирование по adb</string>
+ <string name="partition_not_found">путь: {1} отсутсвует в списке разделов.</string>
+ <string name="copy_kernel_log">Kernel Log скопирован в {1}</string>
+ <string name="include_kernel_log">Добавить Kernel Log</string>
+ <string name="unable_set_boot_slot">Ошибка смены слота загрузки bootloader на {1}</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/sk.xml b/gui/theme/common/languages/sk.xml
new file mode 100644
index 000000000..42f713ba7
--- /dev/null
+++ b/gui/theme/common/languages/sk.xml
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Slovak</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">Systém</string>
+ <string name="system_image">Image systému</string>
+ <string name="vendor">Dodávateľ</string>
+ <string name="vendor_image">Logo dodávateľa</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SD karta</string>
+ <string name="internal">Interné úložisko</string>
+ <string name="microsd">Mikro SD karta</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Prijaté dáta</string>
+ <string name="adopted_storage">Prijaté úložisko</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Batéria: %tw_battery%</string>
+ <string name="sort_by_name">Zoradiť podľa názvu</string>
+ <string name="sort_by_date">Zoradiť podľa dátumu</string>
+ <string name="sort_by_size">Zoradiť podľa veľkosti</string>
+ <string name="sort_by_name_only">Názov</string>
+ <string name="sort_by_date_only">Dátum</string>
+ <string name="sort_by_size_only">Veľkosť</string>
+ <string name="tab_general">VŠEOBECNÉ</string>
+ <string name="tab_options">MOŽNOSTI</string>
+ <string name="tab_backup">ZÁLOHOVANIE</string>
+ <string name="tab_time_zone">ČASOVÉ PÁSMO</string>
+ <string name="tab_screen">OBRAZOVKA</string>
+ <string name="tab_vibration">VIBRÁCIE</string>
+ <string name="tab_language">JAZYK</string>
+ <string name="install_btn">Inštalovať</string>
+ <string name="wipe_btn">Vymazať</string>
+ <string name="backup_btn">Zálohovať</string>
+ <string name="restore_btn">Obnoviť</string>
+ <string name="mount_btn">Pripojiť</string>
+ <string name="settings_btn">Nastavenia</string>
+ <string name="advanced_btn">Rozšírené</string>
+ <string name="reboot_btn">Reštartovať</string>
+ <string name="files_btn">Súbory</string>
+ <string name="copy_log_btn">Kopírovať log</string>
+ <string name="select_type_hdr">Vyberte typ</string>
+ <string name="install_zip_hdr">Inštalovať Zip</string>
+ <string name="install_zip_btn">Inštalovať Zip</string>
+ <string name="install_image_hdr">Inštalovať image</string>
+ <string name="install_image_btn">Inštalovať image</string>
+ <string name="install_select_file_hdr">Vybrať súbor</string>
+ <string name="file_selector_folders_hdr">Priečinky</string>
+ <string name="select_file_from_storage">Vyberte súbor z: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Inštalovať</string>
+ <string name="select_storage_hdr">Vyberte úložisko</string>
+ <string name="select_storage_btn">Vyberte úložisko</string>
+ <string name="queue_hdr">Poradie</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% / max 10 súborov v poradí</string>
+ <string name="zip_queue_count_s">Súbor %tw_zip_queue_count% z 10:</string>
+ <string name="zip_warn1">Táto operácia môže nainštalovať nekompatibilný</string>
+ <string name="zip_warn2">softvér a znefunkčniť zariadenie.</string>
+ <string name="zip_back_cancel">Stlačte Naspäť pre zrušenie pridania zip.</string>
+ <string name="zip_back_clear">Stlačte Naspäť pre vyčistenie zoznamu.</string>
+ <string name="folder">Zložka:</string>
+ <string name="file">Súbor:</string>
+ <string name="zip_sig_chk">Overenie podpisu zip</string>
+ <string name="inject_twrp_chk">Nainštalovať TWRP po inštalácií</string>
+ <string name="options_hdr">Nastavenia</string>
+ <string name="confirm_flash_hdr">Potvrdiť inštaláciu</string>
+ <string name="zip_queue">Poradie:</string>
+ <string name="options">Nastavenia:</string>
+ <string name="swipe_confirm"> Potvrdiť</string>
+ <string name="zip_add_btn">Pridať viac Zip</string>
+ <string name="zip_clear_btn">Vyčistiť zoznam Zip</string>
+ <string name="install_zip_count_hdr">Nainštalovať Zip %tw_zip_index% z %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Inštalácia Zip: %tw_file%</string>
+ <string name="failed">Neúspešné</string>
+ <string name="successful">Úspešné</string>
+ <string name="install_failed">Inštalácia zlyhala</string>
+ <string name="install_successful">Inštalácia dokončená</string>
+ <string name="wipe_cache_dalvik_btn">Vymazať cache/dalvik</string>
+ <string name="reboot_system_btn">Reštartovať systém</string>
+ <string name="install_sel_target">Vyberte cieľovú partíciu</string>
+ <string name="flash_image_select">Vyberte cieľovú partíciu pre zápis image:</string>
+ <string name="target_partition">Cieľová partícia:</string>
+ <string name="flashing_image">Zapisovanie image...</string>
+ <string name="image_flashed">Image nainštalovaný</string>
+ <string name="wipe_cache_dalvik_confirm">Vymazať cache &amp; dalvik?</string>
+ <string name="wiping_cache_dalvik">Mazanie cache &amp; dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Vymazanie cache &amp; dalvik dokončené</string>
+ <string name="swipe_wipe">Potiahnite pre vymazanie</string>
+ <string name="swipe_wipe_s"> Vymazanie</string>
+ <string name="no_os1">Nie je nainštalovaný OS! Ste</string>
+ <string name="no_osrb">si istý, že chcete reštartovať?</string>
+ <string name="no_ospo">si istý, že chcete vypnúť zariadenie?</string>
+ <string name="rebooting">Reštartovanie...</string>
+ <string name="swipe_reboot">Potiahnite pre reštart</string>
+ <string name="swipe_reboot_s"> Reštart</string>
+ <string name="swipe_flash">Potiahnite pre potvrdenie</string>
+ <string name="confirm_action">Potvrdiť akciu</string>
+ <string name="back_cancel">Pre zrušenie stlačte tlačidlo naspäť.</string>
+ <string name="cancel_btn">Zrušiť</string>
+ <string name="wipe_hdr">Vymazať</string>
+ <string name="factory_reset_hdr">Továrne nastavenia</string>
+ <string name="factory_reset_btn">Továrne nastavenia</string>
+ <string name="factory_reset1">Vymazať Dáta, Cache a Dalvik</string>
+ <string name="factory_reset2">(nezahŕňa vnútornú pamäť)</string>
+ <string name="factory_reset3">Väčšinou je</string>
+ <string name="factory_reset4">potrebné len vymazanie.</string>
+ <string name="factory_resetting">Továrne nastavenia...</string>
+ <string name="advanced_wipe_hdr">Rozšírené vymazanie</string>
+ <string name="advanced_wipe_btn">Rozšírené vymazanie</string>
+ <string name="wipe_enc_confirm">Vymazať šifrovanie z Data?</string>
+ <string name="formatting_data">Formátovanie Data partície...</string>
+ <string name="swipe_format_data">Potiahnite pre voľbu Formátovať Data</string>
+ <string name="swipe_format_data_s"> Formátovať Data</string>
+ <string name="factory_reset_complete">Továrne nastavenia ukončené</string>
+ <string name="sel_part_hdr">Vyberte partície</string>
+ <string name="wipe_sel_confirm">Vymazať vybrané partície?</string>
+ <string name="wiping_part">Mazanie partícií...</string>
+ <string name="wipe_complete">Mazanie dokončené</string>
+ <string name="sel_part_wipe">Vyberte partície na vymazanie:</string>
+ <string name="invalid_part_sel">Neplatný výber partície</string>
+ <string name="format_data_hdr">Formátovať Data</string>
+ <string name="format_data_btn">Formátovať Data</string>
+ <string name="format_data_ptr1">Formátovanie Data vymaže všetky aplikácie,</string>
+ <string name="format_data_ptr2">zálohy, fotky, videá, hudbu</string>
+ <string name="format_data_ptr3">a vymaže šifrovanie interného úložiska.</string>
+ <string name="format_data_adopted">Zahŕňa adoptovanú pamäť</string>
+ <string name="format_data_lcp1">Formátovanie Data vymaže všetky aplikácie, zálohy, fotografie, videá, hudbu</string>
+ <string name="format_data_lcp2">a vymaže šifrovanie interného úložiska.</string>
+ <string name="format_data_wtc1">Formátovanie Data vymaže všetky aplikácie,</string>
+ <string name="format_data_wtc2">zálohy a hudbu. Tento proces je nezvratný.</string>
+ <string name="format_data_undo">Toto je nezvratné.</string>
+ <string name="format_data_complete">Formátovanie Data je hotové</string>
+ <string name="yes_continue">Napíšte \"yes\" pre pokračovanie. Stlačte naspäť pre zrušenie.</string>
+ <string name="part_opt_hdr">Možnosti pre: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Vyberte akciu</string>
+ <string name="file_sys_opt">Nastavenia súborového systému</string>
+ <string name="partition">Partície: %tw_partition_name%</string>
+ <string name="part_mount_point">Mount point: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Súborový systém: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Prítomný: Áno</string>
+ <string name="part_present_no">Prítomný: Nie</string>
+ <string name="part_removable_yes">Vymeniteľný: Áno</string>
+ <string name="part_removable_no">Vymeniteľný: Nie</string>
+ <string name="part_size">Veľkosť: %tw_partition_size%MB</string>
+ <string name="part_used">Použité: %tw_partition_used%MB</string>
+ <string name="part_free">Voľné: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Veľkosť zálohy: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Zväčšiť súborový systém</string>
+ <string name="resize_btn_s">Zväčšiť</string>
+ <string name="resize_confirm">Zväčšiť %tw_partition_name%?</string>
+ <string name="resizing">Zväčšenie...</string>
+ <string name="resize_complete">Zväčšenie dokončené</string>
+ <string name="swipe_resize">Potiahnite pre zväčšenie</string>
+ <string name="swipe_resize_s"> Zväčšenie</string>
+ <string name="repair_btn">Opraviť súborový systém</string>
+ <string name="repair_btn_s">Oprava</string>
+ <string name="repair_confirm">Opraviť %tw_partition_name%?</string>
+ <string name="repairing">Opravovanie...</string>
+ <string name="repair_complete">Oprava dokončená</string>
+ <string name="swipe_repair">Potiahnite pre opravu</string>
+ <string name="swipe_repair_s"> Oprava</string>
+ <string name="change_fs_btn">Zmeniť súborový systém</string>
+ <string name="change_fs_btn_s">Zmeniť</string>
+ <string name="change_fs_for_hdr">Zmeniť súborový systém pre: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partícia: %tw_partition_name% &gt; Zvoľte súborový systém</string>
+ <string name="change_fs_warn1">Niektoré ROM alebo kernely nemusia podporovať niektoré</string>
+ <string name="change_fs_warn2">súborové systémy. Pokračujte opatrne!</string>
+ <string name="change_fs_confirm">Zmeniť %tw_partition_name%?</string>
+ <string name="formatting">Formátovanie...</string>
+ <string name="format_complete">Formátovanie dokončené</string>
+ <string name="swipe_change_fs">Potiahnite pre zmenu</string>
+ <string name="swipe_change_s"> Zmena</string>
+ <string name="back_btn">Naspäť</string>
+ <string name="wipe_enc_btn">Vymazať šifrovanie</string>
+ <string name="swipe_factory_reset">Potiahnite pre továrne nastavenia</string>
+ <string name="repair_change_btn">Opraviť alebo zmeniť súborový systém</string>
+ <string name="storage_hdr">Úložisko: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Záloha</string>
+ <string name="backup_confirm_hdr">Potvrdiť zálohu</string>
+ <string name="encryption_tab">ŠIFROVANIE</string>
+ <string name="encryption">Šifrovanie:</string>
+ <string name="name">Názov:</string>
+ <string name="sel_part_backup">Vybrať partície pre zálohovanie:</string>
+ <string name="storage">Pamäť:</string>
+ <string name="enc_disabled">zakázané - pre povolenie zadajte heslo</string>
+ <string name="enc_enabled">povolené</string>
+ <string name="enable_backup_comp_chk">Povoliť kompresiu</string>
+ <string name="skip_md5_backup_chk">Vynechať generovanie MD5 počas zálohy</string>
+ <string name="disable_backup_space_chk">Nekontrolovať voľné miesto</string>
+ <string name="refresh_sizes_btn">Obnoviť veľkosti</string>
+ <string name="swipe_backup">Potiahnite pre zálohu</string>
+ <string name="append_date_btn">Pripojiť dátum</string>
+ <string name="backup_name_exists">Záloha s rovnakým názvom už existuje!</string>
+ <string name="encrypt_backup">Šifrovať zálohu?</string>
+ <string name="enter_pass">Zadajte heslo:</string>
+ <string name="enter_pass2">Zopakujte heslo:</string>
+ <string name="pass_not_match">Heslá sa nezhodujú!</string>
+ <string name="partitions">Partície:</string>
+ <string name="disabled">Zakázané</string>
+ <string name="enabled">Povolené</string>
+ <string name="backup_name_hdr">Názov zálohy</string>
+ <string name="progress">Priebeh:</string>
+ <string name="backup_complete">Zálohovanie je dokončené</string>
+ <string name="restore_hdr">Obnovenie</string>
+ <string name="sel_backup_hdr">Vyberte zálohu</string>
+ <string name="restore_sel_store_hdr">Vyberte zálohu z %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Vyberte balíček pre obnovu:</string>
+ <string name="restore_enc_backup_hdr">Šifrovaná záloha</string>
+ <string name="restore_dec_fail">Heslo je nesprávne, skúste to znova!</string>
+ <string name="del_backup_btn">Vymazať zálohu</string>
+ <string name="del_backup_confirm">Vymazať zálohu?</string>
+ <string name="del_backup_confirm2">Toto je nezvratné!</string>
+ <string name="deleting_backup">Vymazávanie zálohy...</string>
+ <string name="backup_deleted">Vymazanie zálohy dokončené</string>
+ <string name="swipe_delete">Potiahnite pre vymazanie</string>
+ <string name="swipe_delete_s"> Vymazať</string>
+ <string name="restore_try_decrypt">Šifrovaná záloha - pokus o dešifrovanie</string>
+ <string name="restore_try_decrypt_s">Pokus o dešifrovanie</string>
+ <string name="restore_backup_date">Záloha vytvorená %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Vybrať partície pre obnovu:</string>
+ <string name="restore_enable_md5_chk">Povoliť kontrolu MD5 na zálohovaných súboroch</string>
+ <string name="restore_complete">Obnova dokončená</string>
+ <string name="swipe_restore">Potiahnite pre obnovu</string>
+ <string name="swipe_restore_s"> Obnoviť</string>
+ <string name="rename_backup_hdr">Premenovať zálohu</string>
+ <string name="rename_backup_confirm">Premenovať zálohu?</string>
+ <string name="rename_backup_confirm2">Toto je nezvratné!</string>
+ <string name="renaming_backup">Premenovanie zálohy...</string>
+ <string name="rename_backup_complete">Premenovanie zálohy dokončené</string>
+ <string name="swipe_to_rename">Potiahnutím premenujete</string>
+ <string name="swipe_rename"> Premenovať</string>
+ <string name="confirm_hdr">Potvrdiť</string>
+ <string name="mount_hdr">Pripojiť</string>
+ <string name="mount_sel_part">Vybrať partície pre pripojenie:</string>
+ <string name="mount_sys_ro_chk">Pripojiť partície v režime na čítanie</string>
+ <string name="mount_sys_ro_s_chk">Pripojiť systém v režime na čítanie</string>
+ <string name="decrypt_data_btn">Dešifrovať Data</string>
+ <string name="disable_mtp_btn">Zakázať MTP</string>
+ <string name="enable_mtp_btn">Povoliť MTP</string>
+ <string name="mount_usb_storage_btn">Pripoj. ukl. priestor USB</string>
+ <string name="usb_storage_hdr">Ukladací priestor USB</string>
+ <string name="usb_stor_mnt1">Ukladací priestor USB pripojený</string>
+ <string name="usb_stor_mnt2">Uistite sa, ze ste zariadenie odobrali</string>
+ <string name="usb_stor_mnt3">z počítača pred odpojením!</string>
+ <string name="unmount_btn">Odpojiť</string>
+ <string name="rb_system_btn">Systém</string>
+ <string name="rb_poweroff_btn">Vypnúť</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Stiahnuť</string>
+ <string name="turning_off">Vypínanie...</string>
+ <string name="swipe_power_off">Potiahnite pre vypnutie</string>
+ <string name="swipe_power_off_s">Vypnúť</string>
+ <string name="sys_ro_hdr">Nezmenená systémová partícia</string>
+ <string name="sys_ro_keep">Ponechať System v režime na čítanie?</string>
+ <string name="sys_rop1">TWRP môže ponechať systémovú partíciu nezmenenú</string>
+ <string name="sys_rop2">čo zjednoduší inštaláciu oficiálnych aktualizácií.</string>
+ <string name="sys_rop3">TWRP sa nezabráni oficiálnej ROM</string>
+ <string name="sys_rop4">prepísať TWRP a nebude ponúkať rootovanie zariadenia.</string>
+ <string name="sys_rop5">Inštalovanie Zip alebo operácie cez adb môžu stále</string>
+ <string name="sys_rop6">modifikovať systémovú partíciu.</string>
+ <string name="sys_rol1">TWRP môže ponechať systémovú partíciu nezmenenú čo zjednoduší inštaláciu oficiálnych aktualizácií.</string>
+ <string name="sys_rol2">TWRP nezabráni oficiálnej ROM prepísať TWRP a nebude ponúkať rootovanie zariadenia.</string>
+ <string name="sys_rol3">Inštalovanie Zip alebo operácie cez adb môžu stále modifikovať systémovú partíciu.</string>
+ <string name="sys_ro_never_show_chk">Viac nezobrazovať túto obrazovku pri štarte</string>
+ <string name="sys_ro_keep_ro_btn">Ponechať v režime na čítanie</string>
+ <string name="swipe_allow_mod">Potiahnuť pre povolenie zmien</string>
+ <string name="swipe_allow_mod_s">Povoliť zmeny</string>
+ <string name="settings_hdr">Nastavenia</string>
+ <string name="settings_gen_hdr">Všeobecné</string>
+ <string name="settings_gen_s_hdr">Všeobecné</string>
+ <string name="settings_gen_btn">Všeobecné</string>
+ <string name="use_rmrf_chk">Použiť rm -rf namiesto formátovania</string>
+ <string name="use24clock_chk">Používať 24h formát času</string>
+ <string name="rev_navbar_chk">Prevrátené usporiadanie lišty</string>
+ <string name="simact_chk">Simulovať akcie pre testovanie témy</string>
+ <string name="simfail_chk">Simulovať neúspechy akcií</string>
+ <string name="ctr_navbar_rdo">Centrovať tlačidlá navigácie</string>
+ <string name="lft_navbar_rdo">Zarovnať tlačidlá navigácie vľavo</string>
+ <string name="rht_navbar_rdo">Zarovnať tlačidlá navigácie vpravo</string>
+ <string name="restore_defaults_btn">Obnoviť predvolené</string>
+ <string name="settings_tz_btn">Časové pásmo</string>
+ <string name="settings_screen_btn">Obrazovka</string>
+ <string name="settings_screen_bright_btn">Jas obrazovky</string>
+ <string name="settings_vibration_btn">Vibrovať</string>
+ <string name="settings_language_btn">Jazyk</string>
+ <string name="time_zone_hdr">Časové pásmo</string>
+ <string name="sel_tz_list">Vyberte časové pásmo:</string>
+ <string name="utcm11">(UTC -11) Samoa, Midwayské ostrovy</string>
+ <string name="utcm10">(UTC -10) Havaj</string>
+ <string name="utcm9">(UTC -9) Aljaška</string>
+ <string name="utcm8">(UTC -8) Tichomorský čas</string>
+ <string name="utcm7">(UTC -7) Západný (Horský) čas USA, Arizona</string>
+ <string name="utcm6">(UTC -6) Centrálny čas USA, Mexiko</string>
+ <string name="utcm5">(UTC -5) Východný čas USA, Indiana</string>
+ <string name="utcm4">(UTC -4) Atlantický čas, Caracas</string>
+ <string name="utcm3">(UTC -3) Brazília, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Stredoatlantický čas</string>
+ <string name="utcm1">(UTC -1) Azory, Cape Verde</string>
+ <string name="utc0">(UTC 0) Greenwichský čas, Londýn, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Stredoeurópsky čas, Bratislava, Berlín, Brusel, Paríž</string>
+ <string name="utcp2">(UTC +2) Atény, Istanbul, Minsk, Káhira</string>
+ <string name="utcp3">(UTC +3) Moskva, Bagdad, Teherán</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Islamabád, Karáčí, Jekaterinsburg</string>
+ <string name="utcp6">(UTC +6) Astana, Colombo, Dhakar</string>
+ <string name="utcp7">(UTC +7) Bangkok, Džakarta, Hanoj</string>
+ <string name="utcp8">(UTC +8) Peking, Hong Kong, Singapur</string>
+ <string name="utcp9">(UTC +9) Jakutsk, Tokyo, Soul</string>
+ <string name="utcp10">(UTC +10) Vladivostok, Sydney, Guam</string>
+ <string name="utcp11">(UTC +11) Magadan, Šalamúnové ostrovy</string>
+ <string name="utcp12">(UTC +12) Wellington, Fidži, Kamčatka</string>
+ <string name="sel_tz_offset">Zvoľte odchýlku (zvyčajne 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Žiadna</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Použiť letný čas (DST)</string>
+ <string name="curr_tz">Aktuálne časové pásmo: %tw_time_zone%</string>
+ <string name="curr_tz_s">Aktuálne časové pásmo:</string>
+ <string name="set_tz_btn">Nastav časové pásmo</string>
+ <string name="settings_screen_hdr">Obrazovka</string>
+ <string name="settings_screen_timeout_hdr">Vypnutie obrazovky</string>
+ <string name="enable_timeout_chk">Povoliť vypnutie obrazovky</string>
+ <string name="screen_to_slider">Vypnutie obrazovky v sekundách:</string>
+ <string name="screen_to_slider_s">Vypnutie obrazovky v sekundách (0=zakázané): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Nastavenie vypnutia obrazovky je nedostupné</string>
+ <string name="screen_bright_slider">Jas: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Nastavenie jasu je nedostupné</string>
+ <string name="vibration_hdr">Vibrovať</string>
+ <string name="button_vibration_hdr">Vibrovať pri dotyku</string>
+ <string name="kb_vibration_hdr">Vibrovať pri písaní</string>
+ <string name="act_vibration_hdr">Vibrovať pri akcii</string>
+ <string name="button_vibration">Vibrovať pri dotyku:</string>
+ <string name="kb_vibration">Vibrovať pri písaní:</string>
+ <string name="act_vibration">Vibrovať pri akcii:</string>
+ <string name="select_language">Výber jazyka:</string>
+ <string name="sel_lang_btn">Výber jazyka</string>
+ <string name="set_language_btn">Nastaviť jazyk</string>
+ <string name="advanced_hdr">Rozšírené</string>
+ <string name="copy_log_confirm">Skopírovať log na SD kartu?</string>
+ <string name="copying_log">Kopírovanie logu na SD kartu...</string>
+ <string name="copy_log_complete">Kopírovanie logu dokončené</string>
+ <string name="part_sd_btn">Rozdeliť SD kartu</string>
+ <string name="part_sd_s_btn">SD karta</string>
+ <string name="file_manager_btn">Súborový manažér</string>
+ <string name="language_hdr">Jazyk</string>
+ <string name="terminal_btn">Terminál</string>
+ <string name="reload_theme_btn">Načítať tému</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Vložiť TWRP</string>
+ <string name="inject_twrp_confirm">Znova vložiť TWRP?</string>
+ <string name="injecting_twrp">Vkladanie TWRP...</string>
+ <string name="inject_twrp_complete">Vloženie TWRP dokončené</string>
+ <string name="swipe_to_confirm">Potiahnite pre potvrdenie</string>
+ <string name="part_sd_hdr">Rozdeliť SD kartu</string>
+ <string name="invalid_partsd_sel">Musíte zvoliť odpojiteľné zariadenie</string>
+ <string name="part_sd_lose">Prídete o všetky súbory na vloženej SD karte!</string>
+ <string name="part_sd_undo">Toto je nezvratná akcia!</string>
+ <string name="part_sd_ext_sz">Veľkosť EXT:</string>
+ <string name="part_sd_swap_sz">Veľkosť Swap:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Súborový systém:</string>
+ <string name="swipe_part_sd">Potiahnutím rozdelíte</string>
+ <string name="swipe_part_sd_s">Rozdelenie</string>
+ <string name="partitioning_sd">Delenie SD karty...</string>
+ <string name="partitioning_sd2">Môže to trvať niekoľko minút.</string>
+ <string name="part_sd_complete">Rozdelenie kompletné</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Obnoviť pôvodný boot.img</string>
+ <string name="dumlock_restore_confirm">Obnoviť pôvodný boot.img?</string>
+ <string name="dumlock_restoring">Obnovenie pôvodného boot.img...</string>
+ <string name="dumlock_restore_complete">Obnova pôvodného boot.img dokončená</string>
+ <string name="dumlock_reflash_btn">Prepísanie recovery</string>
+ <string name="dumlock_reflash_confirm">Prepísať recovery pri štarte?</string>
+ <string name="dumlock_reflashing">Prepísanie recovery pri štarte...</string>
+ <string name="dumlock_reflash_complete">Prepísanie recovery pri štarte dokončené</string>
+ <string name="dumlock_install_btn">Inštalovať HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Inštalovať súbory HTC Dumlock do ROM?</string>
+ <string name="dumlock_installing">Inštalácia HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Inštalácia HTC Dumlock dokončená</string>
+ <string name="swipe_to_unlock">Potiahnutím odomknúť</string>
+ <string name="swipe_unlock"> Odomknúť</string>
+ <string name="fm_hdr">Súborový manažér</string>
+ <string name="fm_sel_file">Vyberte súbor alebo adresár</string>
+ <string name="fm_type_folder">Adresár</string>
+ <string name="fm_type_file">Súbor</string>
+ <string name="fm_choose_act">Zvoľte akciu</string>
+ <string name="fm_selected">Zvolené %tw_fm_type%:</string>
+ <string name="fm_copy_btn">Kopírovať</string>
+ <string name="fm_copy_file_btn">Kopírovať súbor</string>
+ <string name="fm_copy_folder_btn">Kopírovať adresár</string>
+ <string name="fm_copying">Kopírovanie</string>
+ <string name="fm_move_btn">Presunúť</string>
+ <string name="fm_moving">Presúvanie</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Vymazať</string>
+ <string name="fm_deleting">Vymazávanie</string>
+ <string name="fm_rename_btn">Premenovať</string>
+ <string name="fm_rename_file_btn">Premenovať súbor</string>
+ <string name="fm_rename_folder_btn">Premenovať adresár</string>
+ <string name="fm_renaming">Premenovávanie</string>
+ <string name="fm_sel_dest">Vyberte cieľový adresár</string>
+ <string name="fm_sel_curr_folder">Vyberte súčasný adresár</string>
+ <string name="fm_rename_hdr">Premenovať</string>
+ <string name="fm_set_perms_hdr">Nastaviť práva</string>
+ <string name="fm_perms">Práva:</string>
+ <string name="fm_complete">Operácia na súbore dokončená</string>
+ <string name="decrypt_data_hdr">Dešifrovať dáta</string>
+ <string name="decrypt_data_enter_pass">Zadajte heslo.</string>
+ <string name="decrypt_data_enter_pattern">Zadajte vzor.</string>
+ <string name="decrypt_data_trying">Pokus o dešifrovanie</string>
+ <string name="term_hdr">Príkaz terminálu</string>
+ <string name="term_s_hdr">Terminál</string>
+ <string name="term_kill_btn">ZABI</string>
+ <string name="term_sel_folder_hdr">Navigovať do počiatočného adresára</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Vymazať dalvik cache</string>
+ <string name="sideload_wipe_cache_chk">Vymazať cache</string>
+ <string name="swipe_to_sideload">Potiahnite pre spustenie sideload</string>
+ <string name="swipe_sideload"> Štart</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Použitie: adb sideload názov.zip</string>
+ <string name="sideload_complete">ADB Sideload dokončený</string>
+ <string name="reboot_hdr">Reštart</string>
+ <string name="su_hdr">Kontrola SuperSU</string>
+ <string name="su_note1">Vaše zariadenie nemá ROOT.</string>
+ <string name="su_note2">Chcete nainštalovať SuperSU?</string>
+ <string name="su_note3">Toto povolí ROOT práva na vašom zariadení.</string>
+ <string name="su_cancel">Neinštalovať</string>
+ <string name="swipe_su_to_install">Potiahnite pre inštaláciu ROOT</string>
+ <string name="swipe_su_install"> Inštalovať</string>
+ <string name="su_installing">Inštalácia SuperSU</string>
+ <string name="sel_storage_list">Vyberte úložisko</string>
+ <string name="ok_btn">OK</string>
+ <string name="no_kernel_selinux">Kernel nemá podporu pre čítanie obsahu SELinux.</string>
+ <string name="full_selinux">Plná podpora SELinux.</string>
+ <string name="no_selinux">Bez podpory SELinux (chýba libselinux).</string>
+ <string name="mtp_enabled">MTP povolené</string>
+ <string name="mtp_crash">MTP zlyhalo, MTP nebude spustené pri štarte.</string>
+ <string name="decrypt_success">Úspešne dešifrované s prednastaveným heslom.</string>
+ <string name="unable_to_decrypt">Nemožno dešifrovať s prednastaveným heslom. Možno budete musieť naformátovať partíciu Data.</string>
+ <string name="generating_md51">Generuje sa MD5</string>
+ <string name="generating_md52"> *Generuje sa Md5...</string>
+ <string name="md5_created"> *MD5 vygenerované.</string>
+ <string name="md5_error"> * chyba MD5!</string>
+ <string name="md5_compute_error"> * chyba pri výpočte MD5.</string>
+ <string name="current_date">(Aktuálny dátum)</string>
+ <string name="auto_generate">(Generovať automaticky)</string>
+ <string name="unable_to_locate_partition">Nemožno nájsť partíciu \'{1}\' pre výpočet zálohy.</string>
+ <string name="no_partition_selected">Žiadne partície vybrané na zálohovanie.</string>
+ <string name="total_partitions_backup"> * Počet partícií označených na zálohovanie: {1}</string>
+ <string name="total_backup_size"> * Konečná veľkosť zálohy: {1}MB</string>
+ <string name="available_space"> * Voľné miesto na úložisku: {1}MB</string>
+ <string name="unable_locate_storage">Nie je možné nájsť uložisko.</string>
+ <string name="no_space">Nedostatok miesta na úložisku.</string>
+ <string name="backup_started">[ZÁLOHOVANIE ZAČALO]</string>
+ <string name="backup_folder"> * Adresár zálohy: {1}</string>
+ <string name="fail_backup_folder">Nie je možné vytvoriť adresár zálohy.</string>
+ <string name="avg_backup_fs">Priemerná miera zálohovania súborových systémov: {1} MB/sek</string>
+ <string name="avg_backup_img">Priemerná miera zálohovania diskov: {1} MB/sek</string>
+ <string name="total_backed_size">[{1} MB ZÁLOH SPOLU]</string>
+ <string name="backup_completed">[ZÁLOHA DOKONČENÁ ZA {1} SEKÚND]</string>
+ <string name="restore_started">[ZAČIATOK OBNOVY]</string>
+ <string name="restore_folder">Obnoviť adresár: \'{1}\'</string>
+ <string name="verifying_md5">Kontrolovanie MD5</string>
+ <string name="skip_md5">Vynechanie kontroly MD5 na základe užívateľského nastavenia.</string>
+ <string name="calc_restore">Výpočet detailov obnovy...</string>
+ <string name="restore_read_only">Nie je možné obnoviť {1} -- pripojené len na čítanie.</string>
+ <string name="restore_unable_locate">Nie je možné nájsť partíciu \'{1}\' pre obnovu.</string>
+ <string name="no_part_restore">Žiadne partície neboli vybrané pre obnovu.</string>
+ <string name="restore_part_count">Obnova {1} partiícií...</string>
+ <string name="total_restore_size">Veľkosť obnovy je spolu {1}MB</string>
+ <string name="updating_system_details">Obnovovanie detailov systému</string>
+ <string name="restore_completed">[OBNOVA DOKONČENÁ ZA {1} SEKÚND]</string>
+ <string name="error_opening_strerr">Chyba pri otváraní: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Nie je možné nájsť partíciu podľa názvu zálohy: \'{1}\'</string>
+ <string name="unable_find_part_path">Nie je možné nájsť partíciu na adrese \'{1}\'</string>
+ <string name="update_part_details">Obnova detailov partície...</string>
+ <string name="update_part_details_done">...hotovo</string>
+ <string name="wiping_dalvik">Vymazávanie adresárov dalvik cache...</string>
+ <string name="cleaned">Vyčistené: {1}...</string>
+ <string name="dalvik_done">-- Vyčistenie adresára Dalvik cache bolo dokončené!</string>
+ <string name="no_andsec">Žiadne zabezpečené android partície neboli nájdené.</string>
+ <string name="unable_to_locate">{1} nie je možné nájsť.</string>
+ <string name="wiping_datamedia">Vymazávanie interného úložiska -- /data/media...</string>
+ <string name="unable_to_mount">{1} nie je možné pripojiť</string>
+ <string name="unable_to_mount_internal">Nie je možné pripojiť interné úložisko</string>
+ <string name="unable_to_mount_storage">Nie je možné pripojiť úložisko</string>
+ <string name="fail_decrypt">Nie je možné dešifrovať data.</string>
+ <string name="no_crypto_support">Táto verzia bola skompilovaná bez podpory šifrovania.</string>
+ <string name="decrypt_success_dev">Dáta boli úspešne dešifrované, nový block device: \'{1}\'</string>
+ <string name="done">Hotovo.</string>
+ <string name="start_partition_sd">Delenie SD karty...</string>
+ <string name="partition_sd_locate">Nie je možné nájsť zariadenie na rozdelenie.</string>
+ <string name="ext_swap_size">Veľkosť EXT + Swap je väčšia ako veľkosť SD-karty.</string>
+ <string name="remove_part_table">Vymazávanie tabuľky rozdelenia...</string>
+ <string name="unable_rm_part">Nie je možné vymazať tabuľku rozdelenia.</string>
+ <string name="create_part">Vytváranie partície {1}...</string>
+ <string name="unable_to_create_part">Partíciu {1} nie je možné vytvoriť.</string>
+ <string name="format_sdext_as">Formátovanie sd-ext ako {1}...</string>
+ <string name="part_complete">Rozdelenie dokončené.</string>
+ <string name="unable_to_open">Nie je možné otvoriť \'{1}\'.</string>
+ <string name="mtp_already_enabled">MTP je už povolené</string>
+ <string name="mtp_fail">Nie je možné povoliť MTP</string>
+ <string name="no_mtp">Podpora MTP nie je zahrnutá</string>
+ <string name="image_flash_start">[ZÁPIS IMAGE SPUSTENÝ]</string>
+ <string name="img_to_flash">Obraz na zápis: \'{1}\'</string>
+ <string name="flash_unable_locate">Nie je možné nájsť partíciu \'{1}\' pre zápis.</string>
+ <string name="no_part_flash">Ná zápis neboli zvolené žiadne partície.</string>
+ <string name="too_many_flash">Na zápis je zvolených príliš veľa partícií.</string>
+ <string name="invalid_flash">Zvolená partícia nie je správna pre zápis.</string>
+ <string name="flash_done">[ZÁPIS IMAGE DOKONČENÝ]</string>
+ <string name="wiping">Mazanie {1}</string>
+ <string name="repair_not_exist">{1} neexistuje! Oprava nie je možná!</string>
+ <string name="repairing_using">Oprava {1} pomocou {2}...</string>
+ <string name="unable_repair">Nie je možné opraviť {1}.</string>
+ <string name="mount_data_footer">Nie je možné pripojiť /data a nájsť parametre šifrovania.</string>
+ <string name="create_folder_strerr">Adresár \'{1}\' nie je možné vytvoriť ({2}).</string>
+ <string name="fail_mount">Nie je možné pripojiť \'{1}\' ({2})</string>
+ <string name="fail_unmount">Nie je možné odpojiť \'{1}\' ({2})</string>
+ <string name="cannot_resize">Nie je možné zväčšiť {1}.</string>
+ <string name="repair_resize">Opravovanie {1} pred zväčšením.</string>
+ <string name="unable_resize">Nie je možné zväčšiť {1}.</string>
+ <string name="no_md5_found">Súbor MD5 sa nenašiel pre \'{1}\'. Prosím zvoľte Vypnúť kontrolu MD5 počas obnovy.</string>
+ <string name="md5_fail_match">MD5 nezodpovedá súboru \'{1}\'.</string>
+ <string name="md5_matched">MD5 sa zhoduje pre '{1}'.</string>
+ <string name="fail_decrypt_tar">Nie je možné dešifrovať súbor tar \'{1}\'</string>
+ <string name="format_data_msg">Mali by ste reštartovať recovery aby ste mohli znova používať /data.</string>
+ <string name="format_data_err">Nie je možné formátovať pre zrušenie šifrovania.</string>
+ <string name="formatting_using">Formátovanie {1} použitím {2}...</string>
+ <string name="unable_to_wipe">Nie je možné vymazať {1}.</string>
+ <string name="cannot_wipe">Partíciu {1} nie je možné vymazať.</string>
+ <string name="remove_all">Vymazanie všetkých súborov v \'{1}\'</string>
+ <string name="wiping_data">Vymazanie Data bez vymazania zložky /data/media...</string>
+ <string name="backing_up">Zálohovanie {1}...</string>
+ <string name="backing">Zálohovanie</string>
+ <string name="backup_size">Veľkosť zálohy pre \'{1}\' je 0 bajtov.</string>
+ <string name="datamedia_fs_restore">UPOZORNENIE: Táto záloha /data bola vytvorená pomocou systému súborov {1}! Záloha nebude bootovať pokiaľ sa nezmení naspäť na {1}.</string>
+ <string name="restoring">Obnovenie {1}...</string>
+ <string name="restoring_hdr">Obnovenie</string>
+ <string name="recreate_folder_err">Nie je možné vytvoriť adresár {1}.</string>
+ <string name="img_size_err">Veľkosť image je väčšia ako cieľová partícia</string>
+ <string name="flashing">Zapisovanie {1}...</string>
+ <string name="backup_folder_set">Adresár záloh nastavený na: \'{1}\'</string>
+ <string name="locate_backup_err">Zálohu \'{1}\' nie je možné nájsť</string>
+ <string name="set_restore_opt">Nastavenie možností obnovy: \'{1}\':</string>
+ <string name="md5_check_skip">Vynechanie kontroly MD5 zapnuté</string>
+ <string name="ors_encrypt_restore_err">Nie je možné použiť OpenRecoveryScript pre obnovu zašifrovanej zálohy.</string>
+ <string name="mounting">Pripájanie</string>
+ <string name="unmounting">Odpájanie</string>
+ <string name="mounted">\'{1}\' pripojený</string>
+ <string name="unmounted">\'{1}\' odpojený</string>
+ <string name="setting">Nastavenie \'{1}\' na \'{2}\'</string>
+ <string name="setting_empty">Nastavenie \'{1}\' na prázdne</string>
+ <string name="making_dir1">Vytváranie adresára</string>
+ <string name="making_dir2">Vytváranie adresára: \'{1}\'</string>
+ <string name="running_command">Spúšťanie príkazu</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Spúšťanie funkcie ADB sideload...</string>
+ <string name="need_new_adb">Pre použitie sideload na toto zariadenie potrebujete ADB 1.0.32 alebo novšie.</string>
+ <string name="no_pwd">Heslo nebolo zadané.</string>
+ <string name="done_ors">Vykonávanie skriptu dokončené</string>
+ <string name="injecttwrp">Vkladanie TWRP do boot.img...</string>
+ <string name="zip_err">Chyba pri inštalácií zip súboru \'{1}\'</string>
+ <string name="installing_zip">Inštalácia zip súboru \'{1}\'</string>
+ <string name="select_backup_opt">Nastavenie možností zálohy:</string>
+ <string name="compression_on">Kompresia zapnutá</string>
+ <string name="md5_off">Generovanie MD5 vypnuté</string>
+ <string name="backup_fail">Zálohovanie zlyhalo</string>
+ <string name="backup_clean">Zálohovanie zlyhalo. Čistenie adresára záloh.</string>
+ <string name="running_recovery_commands">Spúšťanie príkazov recovery</string>
+ <string name="recovery_commands_complete">Príkazy recovery dokončené</string>
+ <string name="running_ors">Spúšťanie OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript dokončený</string>
+ <string name="no_updater_binary">Nie je možné nájsť \'{1}\' v súbore zip.</string>
+ <string name="check_for_md5">Kontrola MD5 súboru...</string>
+ <string name="fail_sysmap">Nie je možné namapovať súbor \'{1}\'</string>
+ <string name="verify_zip_sig">Overovanie podpisu zip súboru...</string>
+ <string name="verify_zip_fail">Overenie podpisu zip súboru zlyhalo!</string>
+ <string name="verify_zip_done">Podpis súboru zip úspešne overený.</string>
+ <string name="zip_corrupt">Súbor zip je poškodený!</string>
+ <string name="no_md5">Vynechanie kontroly MD5: súbor s MD5 nenájdený</string>
+ <string name="md5_fail">MD5 sa nezhoduje</string>
+ <string name="md5_match">MD5 sa zhoduje</string>
+ <string name="pid_signal">Proces {1} skončil so signálom: {2}</string>
+ <string name="pid_error">Proces {1} skončil s CHYBOU: {2}</string>
+ <string name="install_dumlock">Inštalovanie HTC Dumlock do systému...</string>
+ <string name="dumlock_restore">Obnovenie pôvodného boot.img...</string>
+ <string name="dumlock_reflash">Zapisovanie recovery do boot.img...</string>
+ <string name="run_script">Beh skriptu {1}...</string>
+ <string name="rename_stock">Premenovaný originál recovery súbor v /system pre zabránenie prepísania TWRP originál ROM.</string>
+ <string name="split_backup">Rozdelenie zálohy do viacerých archívov...</string>
+ <string name="backup_error">Chyba pri vytváraní zálohy.</string>
+ <string name="restore_error">Chyba počas procesu obnovy.</string>
+ <string name="split_thread">Rozdelenie ID vlákna {1} do archívu {2}</string>
+ <string name="file_progress">%llu z %llu súborov, %i%%</string>
+ <string name="size_progress">%lluMB z %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Pokus o dešifrovanie data partície cez príkazový riadok.</string>
+ <string name="base_pkg_err">Nie je možné načítať základné balíčky.</string>
+ <string name="simulating">Simulovanie akcií...</string>
+ <string name="backup_cancel">Zálohovanie prerušené</string>
+ <string name="config_twrp">Konfigurovanie TWRP...</string>
+ <string name="config_twrp_err">Nie je možné konfigurovať TWRP s týmto kernelom.</string>
+ <string name="copy_log">Recovery log skopírovaný do {1}.</string>
+ <string name="max_queue">Dosiahnutý maximálny počet zip v zozname!</string>
+ <string name="min_queue">Dosiahnutý minimálny počet zip v zozname!</string>
+ <string name="screenshot_saved">Screenshot bol uložený do {1}</string>
+ <string name="screenshot_err">Nie je možné vytvoriť screenshot!</string>
+ <string name="zip_wipe_cache">Jeden alebo viac zip súborov vyžiadalo vymazanie cache -- Vymazávanie cache.</string>
+ <string name="and_sec_wipe_err">Nie je možné vymazať android secure</string>
+ <string name="dalvik_wipe_err">Nie je možné vymazať dalvik</string>
+ <string name="auto_gen">(Generovať automaticky)</string>
+ <string name="curr_date">(Aktuálny dátum)</string>
+ <string name="backup_name_len">Názov zálohy je príliš dlhý.</string>
+ <string name="backup_name_invalid">Názov zálohy \'{1}\' obsahuje neplatný znak: \'{1}\'</string>
+ <string name="no_real_sdcard">Toto zariadenie nemá skutočnú SD kartu! Prerušujem!</string>
+ <string name="cancel_sideload">Rušenie ADB sideload...</string>
+ <string name="change_fs_err">Chyba pri zmene súborového systému.</string>
+ <string name="theme_ver_err">Vlastná téma sa nezhoduje s verziou TWRP. Používa sa originál téma.</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/sl.xml b/gui/theme/common/languages/sl.xml
new file mode 100644
index 000000000..2bf2ffe7b
--- /dev/null
+++ b/gui/theme/common/languages/sl.xml
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Slovenian</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">Sistem</string>
+ <string name="system_image">Sistemski odtis</string>
+ <string name="vendor">Prodajalec</string>
+ <string name="vendor_image">Odtis prodajalca</string>
+ <string name="boot">Zagon</string>
+ <string name="recovery">Obnovitev</string>
+ <string name="cache">Predpomnilnik</string>
+ <string name="data">Podatki</string>
+ <string name="sdcard">Kartica SD</string>
+ <string name="internal">Notranja pomnilniška naprava</string>
+ <string name="microsd">Kartica mikro SD</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Varni Android</string>
+ <string name="dalvik">Predpomnilnik Dalvik/ART</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Prevzeti podatki</string>
+ <string name="adopted_storage">Prevzeta pomnilniška naprava</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPE: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Baterija: %tw_battery%</string>
+ <string name="sort_by_name">Razvrsti po imenu</string>
+ <string name="sort_by_date">Razvrsti po datumu</string>
+ <string name="sort_by_size">Razvrsti po velikosti</string>
+ <string name="sort_by_name_only">Ime</string>
+ <string name="sort_by_date_only">Datum</string>
+ <string name="sort_by_size_only">Velikost</string>
+ <string name="tab_general">SPLOŠNO</string>
+ <string name="tab_options">MOŽNOSTI</string>
+ <string name="tab_backup">VAR. KOP.</string>
+ <string name="tab_time_zone">ČASOVNI PAS</string>
+ <string name="tab_screen">ZASLON</string>
+ <string name="tab_vibration">VIBRIRANJE</string>
+ <string name="tab_language">JEZIK</string>
+ <string name="install_btn">Namesti</string>
+ <string name="wipe_btn">Počisti</string>
+ <string name="backup_btn">Var. kopiraj</string>
+ <string name="restore_btn">Obnovi</string>
+ <string name="mount_btn">Priklopi</string>
+ <string name="settings_btn">Nastavitve</string>
+ <string name="advanced_btn">Napredno</string>
+ <string name="reboot_btn">Pon. zaženi</string>
+ <string name="files_btn">Datoteke</string>
+ <string name="copy_log_btn">Kopiraj dnevnik</string>
+ <string name="select_type_hdr">Izberite vrsto</string>
+ <string name="install_zip_hdr">Namesti ZIP</string>
+ <string name="install_zip_btn">Namesti ZIP</string>
+ <string name="install_image_hdr">Namesti odtis</string>
+ <string name="install_image_btn">Namesti odtis</string>
+ <string name="install_select_file_hdr">Izberite datoteko</string>
+ <string name="file_selector_folders_hdr">Mape</string>
+ <string name="select_file_from_storage">Izberite datoteko iz %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">Stransko nalaganje ADB</string>
+ <string name="install_hdr">Namesti</string>
+ <string name="select_storage_hdr">Izberite pomnilniško napravo</string>
+ <string name="select_storage_btn">Izberite pomnilniško napravo</string>
+ <string name="queue_hdr">Čakalna vrsta</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% od največ 10 datotek v čakalni vrsti</string>
+ <string name="zip_queue_count_s">Datoteka %tw_zip_queue_count% od 10:</string>
+ <string name="zip_warn1">To opravilo lahko namesti nezdružljivo</string>
+ <string name="zip_warn2">programsko opremo in naredi napravo neuporabno.</string>
+ <string name="zip_back_cancel">Pritisnite Nazaj za preklic dodajanja tega ZIP-a.</string>
+ <string name="zip_back_clear">Pritisnite Nazaj za čiščenje čakalne vrste.</string>
+ <string name="folder">Mapa:</string>
+ <string name="file">Datoteka:</string>
+ <string name="zip_sig_chk">Preverjanje podpisa ZIP</string>
+ <string name="inject_twrp_chk">Vstavi TWRP po namestitvi</string>
+ <string name="options_hdr">Možnosti</string>
+ <string name="confirm_flash_hdr">Potrdite namestitev</string>
+ <string name="zip_queue">Čakalna vrsta:</string>
+ <string name="options">Možnosti:</string>
+ <string name="swipe_confirm"> Potrdi</string>
+ <string name="zip_add_btn">Dodaj več ZIP-ov</string>
+ <string name="zip_clear_btn">Počisti čakalno vrsto ZIP-ov</string>
+ <string name="install_zip_count_hdr">Namesti ZIP %tw_zip_index% od %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Nameščanje ZIP-a: %tw_file%</string>
+ <string name="failed">Spodletelo</string>
+ <string name="successful">Uspelo</string>
+ <string name="install_failed">Namestitev je spodletela</string>
+ <string name="install_successful">Namestitev je uspela</string>
+ <string name="wipe_cache_dalvik_btn">Počisti predpomnilnik/Dalvik</string>
+ <string name="reboot_system_btn">Ponovno zaženi sistem</string>
+ <string name="install_sel_target">Izberite ciljni razdelek</string>
+ <string name="flash_image_select">Izberite razdelek za namestitev odtisa:</string>
+ <string name="target_partition">Ciljni razdelek:</string>
+ <string name="flashing_image">Nameščanje odtisa …</string>
+ <string name="image_flashed">Odtis nameščen</string>
+ <string name="wipe_cache_dalvik_confirm">Počisti predpomnilnik in Dalvik?</string>
+ <string name="wiping_cache_dalvik">Čiščenje predpomnilnika in Dalvika …</string>
+ <string name="wipe_cache_dalvik_complete">Čiščenje predpomnilnika in Dalvika končano</string>
+ <string name="swipe_wipe">Povlecite za čiščenje</string>
+ <string name="swipe_wipe_s"> Počisti</string>
+ <string name="no_os1">OS-a ni nameščenega! Ali res</string>
+ <string name="no_osrb">želite ponovno zagnati?</string>
+ <string name="no_ospo">želite izklopiti?</string>
+ <string name="rebooting">Ponovno zaganjanje …</string>
+ <string name="swipe_reboot">Povlecite za ponovni zagon</string>
+ <string name="swipe_reboot_s"> Ponovno zaženi</string>
+ <string name="swipe_flash">Povlecite za potrditev namestive</string>
+ <string name="confirm_action">Potrdite dejanje</string>
+ <string name="back_cancel">Pritisnite Nazaj za preklic.</string>
+ <string name="cancel_btn">Prekliči</string>
+ <string name="wipe_hdr">Počisti</string>
+ <string name="factory_reset_hdr">Ponastavitev na tov. vred.</string>
+ <string name="factory_reset_btn">Ponastavitev na tov. vred.</string>
+ <string name="factory_reset1">Počisti podatke, predpomnilnik in Dalvik</string>
+ <string name="factory_reset2">(brez notranje pomnilniške naprave)</string>
+ <string name="factory_reset3">Večinoma je to</string>
+ <string name="factory_reset4">edino čiščenje, ki ga potrebujete.</string>
+ <string name="factory_resetting">Ponastavitev na tov. vred. …</string>
+ <string name="advanced_wipe_hdr">Napredno čiščenje</string>
+ <string name="advanced_wipe_btn">Napredno čiščenje</string>
+ <string name="wipe_enc_confirm">Počisti šifriranje podatkov?</string>
+ <string name="formatting_data">Formatiranje podatkov …</string>
+ <string name="swipe_format_data">Povlecite za formatiranje podatkov</string>
+ <string name="swipe_format_data_s"> Formatiraj podatke</string>
+ <string name="factory_reset_complete">Ponastavitev na tovarniške vrednosti končana</string>
+ <string name="sel_part_hdr">Izberite razdelke</string>
+ <string name="wipe_sel_confirm">Počisti izbrane razdelke?</string>
+ <string name="wiping_part">Čiščenje razdelkov …</string>
+ <string name="wipe_complete">Čiščenje končano</string>
+ <string name="sel_part_wipe">Izberite razdelke za čiščenje:</string>
+ <string name="invalid_part_sel">Neveljavna izbira razdelkov</string>
+ <string name="format_data_hdr">Formatiraj podatke</string>
+ <string name="format_data_btn">Formatiraj podatke</string>
+ <string name="format_data_ptr1">Formatiranje podatkov bo počistilo vse programe,</string>
+ <string name="format_data_ptr2">varnostne kopije, slike, videoposnetke, predstavnost in</string>
+ <string name="format_data_ptr3">odstranilo šifriranje na notranji pomnilniški napravi.</string>
+ <string name="format_data_adopted">Vključno s prevzeto pomnilniško napravo</string>
+ <string name="format_data_lcp1">Formatiranje podatkov bo počistilo vse vaše programe, varnostne kopije, slike, videoposnetke, predstavnost in</string>
+ <string name="format_data_lcp2">odstranilo šifriranje na notranji pomnilniški napravi.</string>
+ <string name="format_data_wtc1">Formatiranje podatkov bo počistilo vse programe,</string>
+ <string name="format_data_wtc2">varnostne kopije in predstavnost. Tega ni mogoče razveljaviti.</string>
+ <string name="format_data_undo">Tega ni mogoče razveljaviti.</string>
+ <string name="format_data_complete">Formatiranje podatkov končano</string>
+ <string name="yes_continue">Vtipkajte \'yes\' za nadaljevanje. Pritisnite Nazaj za preklic.</string>
+ <string name="part_opt_hdr">Možnosti razdelkov za: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Izberite dejanje</string>
+ <string name="file_sys_opt">Možnosti datotečnega sistema</string>
+ <string name="partition">Razdelek: %tw_partition_name%</string>
+ <string name="part_mount_point">Priklopna točka: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Datotečni sistem: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Prisoten: da</string>
+ <string name="part_present_no">Prisoten: ne</string>
+ <string name="part_removable_yes">Odstranljiv: da</string>
+ <string name="part_removable_no">Odstranljiv: ne</string>
+ <string name="part_size">Velikost: %tw_partition_size% MB</string>
+ <string name="part_used">Uporabljeno: %tw_partition_used% MB</string>
+ <string name="part_free">Nezasedeno: %tw_partition_free% MB</string>
+ <string name="part_backup_size">Velikost varnostne kopije: %tw_partition_backup_size% MB</string>
+ <string name="resize_btn">Spremeni velikost dat. sistema</string>
+ <string name="resize_btn_s">Spr. velik.</string>
+ <string name="resize_confirm">Spremeni velikost %tw_partition_name%?</string>
+ <string name="resizing">Spreminjanje velikosti …</string>
+ <string name="resize_complete">Spreminjanje velikosti končano</string>
+ <string name="swipe_resize">Povlecite za spr. velikosti</string>
+ <string name="swipe_resize_s"> Spr. velikost</string>
+ <string name="repair_btn">Popravi datotečni sistem</string>
+ <string name="repair_btn_s">Popravi</string>
+ <string name="repair_confirm">Popravi %tw_partition_name%?</string>
+ <string name="repairing">Popravljanje …</string>
+ <string name="repair_complete">Popravljanje končano</string>
+ <string name="swipe_repair">Povlecite za popravilo</string>
+ <string name="swipe_repair_s"> Popravi</string>
+ <string name="change_fs_btn">Spremeni datotečni sistem</string>
+ <string name="change_fs_btn_s">Spremeni</string>
+ <string name="change_fs_for_hdr">Spremeni datotečni sistem za: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Razdelek: %tw_partition_name% &gt; izberite datotečni sistem</string>
+ <string name="change_fs_warn1">Nekateri ROM-i ali jedra ne podpirajo vseh</string>
+ <string name="change_fs_warn2">datotečnih sistemov. Nadaljujte previdno!</string>
+ <string name="change_fs_confirm">Spremeni %tw_partition_name%?</string>
+ <string name="formatting">Formatiranje …</string>
+ <string name="format_complete">Formatiranje končano</string>
+ <string name="swipe_change_fs">Povlecite za spremembo</string>
+ <string name="swipe_change_s"> Spremeni</string>
+ <string name="back_btn">Nazaj</string>
+ <string name="wipe_enc_btn">Počisti šifriranje</string>
+ <string name="swipe_factory_reset">Povlecite za ponastavitev na tov. vrednosti</string>
+ <string name="repair_change_btn">Popravi ali Spremeni datotečni sistem</string>
+ <string name="storage_hdr">Pomnilniška naprava: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Var. kopiraj</string>
+ <string name="backup_confirm_hdr">Potrdite varnostno kopiranje</string>
+ <string name="encryption_tab">ŠIFRIRANJE</string>
+ <string name="encryption">Šifriranje:</string>
+ <string name="name">Ime:</string>
+ <string name="sel_part_backup">Izberite razdelke za varnostno kopiranje:</string>
+ <string name="storage">Pom. naprava:</string>
+ <string name="enc_disabled">onemogočeno - nastavite geslo za omogočanje</string>
+ <string name="enc_enabled">omogočeno</string>
+ <string name="enable_backup_comp_chk">Omogoči stiskanje</string>
+ <string name="skip_md5_backup_chk">Preskoči ustvarjanje razpršila MD5 med varnostnim kopiranjem</string>
+ <string name="disable_backup_space_chk">Onemogoči preverjanje nezasedenega prostora</string>
+ <string name="refresh_sizes_btn">Osveži velikosti</string>
+ <string name="swipe_backup">Povlecite za var. kopiranje</string>
+ <string name="append_date_btn">Pripni datum</string>
+ <string name="backup_name_exists">Varnostna kopija z enakim imenom že obstaja!</string>
+ <string name="encrypt_backup">Šifriraj varnostno kopijo?</string>
+ <string name="enter_pass">Vnesite geslo:</string>
+ <string name="enter_pass2">Ponovno vnesite geslo:</string>
+ <string name="pass_not_match">Gesli se ne ujemata!</string>
+ <string name="partitions">Razdelki:</string>
+ <string name="disabled">Onemogočeno</string>
+ <string name="enabled">Omogočeno</string>
+ <string name="backup_name_hdr">Nastavite ime varnostne kopije</string>
+ <string name="progress">Napredek:</string>
+ <string name="backup_complete">Varnostno kopiranje končano</string>
+ <string name="restore_hdr">Obnovi</string>
+ <string name="sel_backup_hdr">Izberite varnostno kopijo</string>
+ <string name="restore_sel_store_hdr">Izberite varnostno kopijo iz %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Izberite paket za obnovitev:</string>
+ <string name="restore_enc_backup_hdr">Šifrirana varnostna kopija</string>
+ <string name="restore_dec_fail">Geslo je spodletelo, poizkusite znova!</string>
+ <string name="del_backup_btn">Izbriši varnostno kopijo</string>
+ <string name="del_backup_confirm">Izbriši varnostno kopijo?</string>
+ <string name="del_backup_confirm2">Tega ni mogoče razveljaviti!</string>
+ <string name="deleting_backup">Brisanje varnostne kopije …</string>
+ <string name="backup_deleted">Brisanje varnostne kopije končano</string>
+ <string name="swipe_delete">Povlecite za izbris</string>
+ <string name="swipe_delete_s"> Izbriši</string>
+ <string name="restore_try_decrypt">Šifrirana varnostna kopija - poizkušanje odšifriranja</string>
+ <string name="restore_try_decrypt_s">Poizkušanje odšifriranja</string>
+ <string name="restore_backup_date">Varnostna kopija ustvarjena %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Izberite razdelke za obnovitev:</string>
+ <string name="restore_enable_md5_chk">Omogoči preverjanje razpršila MD5 varnostnih kopij</string>
+ <string name="restore_complete">Obnavljanje končano</string>
+ <string name="swipe_restore">Povlecite za obnovitev</string>
+ <string name="swipe_restore_s"> Obnovi</string>
+ <string name="rename_backup_hdr">Preimenuj varnostno kopijo</string>
+ <string name="rename_backup_confirm">Preimenuj varnostno kopijo?</string>
+ <string name="rename_backup_confirm2">Tega ni mogoče razveljaviti!</string>
+ <string name="renaming_backup">Preimenovanje varnostne kopije …</string>
+ <string name="rename_backup_complete">Preimenovanje varnostne kopije končano</string>
+ <string name="swipe_to_rename">Povlecite za preimeovanje</string>
+ <string name="swipe_rename"> Preimenuj</string>
+ <string name="confirm_hdr">Potrdi</string>
+ <string name="mount_hdr">Priklopi</string>
+ <string name="mount_sel_part">Izberite razdelke za priklop:</string>
+ <string name="mount_sys_ro_chk">Priklopi sistemski razdelek samo za branje</string>
+ <string name="mount_sys_ro_s_chk">Priklopi sistem samo za branje</string>
+ <string name="decrypt_data_btn">Odšifriraj podatke</string>
+ <string name="disable_mtp_btn">Onemogoči MTP</string>
+ <string name="enable_mtp_btn">Omogoči MTP</string>
+ <string name="mount_usb_storage_btn">Priklopi pomnilniško napravo USB</string>
+ <string name="usb_storage_hdr">Pom. naprava USB</string>
+ <string name="usb_stor_mnt1">Pomnilniška naprava USB priklopljena</string>
+ <string name="usb_stor_mnt2">Prepričajte se, da varno odstranite napravo</string>
+ <string name="usb_stor_mnt3">iz računalnika pred odklopom!</string>
+ <string name="unmount_btn">Odklopi</string>
+ <string name="rb_system_btn">Sistem</string>
+ <string name="rb_poweroff_btn">Izklopi</string>
+ <string name="rb_recovery_btn">Obnovitev</string>
+ <string name="rb_bootloader_btn">Zagonski nalagalnik</string>
+ <string name="rb_download_btn">Prejmi</string>
+ <string name="turning_off">Izklapljanje …</string>
+ <string name="swipe_power_off">Povlecite za izklop</string>
+ <string name="swipe_power_off_s">Izklopi</string>
+ <string name="sys_ro_hdr">Nespremenjeni sistemski razdelek</string>
+ <string name="sys_ro_keep">Ohrani sistem samo za branje?</string>
+ <string name="sys_rop1">TWRP lahko pusti sistemski razdelek nespremenjen</string>
+ <string name="sys_rop2">za lažje uradno posodabljanje.</string>
+ <string name="sys_rop3">TWRP tovarniškemu ROM-u ne bo mogel preprečiti</string>
+ <string name="sys_rop4">nadomestitev TWRP-ja in ne bo ponudil skrbniškega dostopa do naprave.</string>
+ <string name="sys_rop5">Nameščenje ZIP-ov ali izvajanje opravil ADB lahko še vedno</string>
+ <string name="sys_rop6">spremeni sistemski razdelek.</string>
+ <string name="sys_rol1">TWRP lahko pusti sistemski razdelek nespremenjen za lažje uradno posodabljanje.</string>
+ <string name="sys_rol2">TWRP tovarniškemu ROM-u ne bo mogel preprečiti nadomestitev TWRP-ja in ne bo ponudil skrbniškega dostopa do naprave.</string>
+ <string name="sys_rol3">Nameščenje ZIP-ov ali izvajanje opravil ADB lahko še vedno spremeni sistemski razdelek.</string>
+ <string name="sys_ro_never_show_chk">Nikoli več ne prikaži tega zaslona med zagonom</string>
+ <string name="sys_ro_keep_ro_btn">Ohrani samo za branje</string>
+ <string name="swipe_allow_mod">Povlecite, da dovolite spremembe</string>
+ <string name="swipe_allow_mod_s">Dovoli spremembe</string>
+ <string name="settings_hdr">Nastavitve</string>
+ <string name="settings_gen_hdr">Splošno</string>
+ <string name="settings_gen_s_hdr">Splošno</string>
+ <string name="settings_gen_btn">Splošno</string>
+ <string name="use_rmrf_chk">Namesto formatiranja uporabite rm -rf</string>
+ <string name="use24clock_chk">Uporabi 24-urno obliko</string>
+ <string name="rev_navbar_chk">Obratna razporeditev vrstice za krmarjenje</string>
+ <string name="simact_chk">Simuliraj dejanja za preizkušanje tem</string>
+ <string name="simfail_chk">Simuliraj spodletela dejanja</string>
+ <string name="ctr_navbar_rdo">Gumbi vrstice za krmarjenje na sredini</string>
+ <string name="lft_navbar_rdo">Gumbi vrstice za krmarjenje na levi</string>
+ <string name="rht_navbar_rdo">Gumbi vrstice za krmarjenje na desni</string>
+ <string name="restore_defaults_btn">Obnovi privzete</string>
+ <string name="settings_tz_btn">Časovni pas</string>
+ <string name="settings_screen_btn">Zaslon</string>
+ <string name="settings_screen_bright_btn">Svetlost zaslona</string>
+ <string name="settings_vibration_btn">Vibriranje</string>
+ <string name="settings_language_btn">Jezik</string>
+ <string name="time_zone_hdr">Časovni pas</string>
+ <string name="sel_tz_list">Izberite časovni pas:</string>
+ <string name="utcm11">(UTC -11) Samoa, Otoki Midway</string>
+ <string name="utcm10">(UTC -10) Havaji</string>
+ <string name="utcm9">(UTC -9) Aljaska</string>
+ <string name="utcm8">(UTC -8) Tihooceanski čas</string>
+ <string name="utcm7">(UTC -7) Ameriški gorski čas</string>
+ <string name="utcm6">(UTC -6) Ameriški osrednji čas</string>
+ <string name="utcm5">(UTC -5) Ameriški vzhodni čas</string>
+ <string name="utcm4">(UTC -4) Atlantski čas</string>
+ <string name="utcm3">(UTC -3) Brazilija, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Srednji Atlantik</string>
+ <string name="utcm1">(UTC -1) Azori, Zelenortski otoki</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbona</string>
+ <string name="utcp1">(UTC +1) Berlin, Bruselj, Pariz</string>
+ <string name="utcp2">(UTC +2) Atene, Istanbul, Južna Afrika</string>
+ <string name="utcp3">(UTC +3) Moskva, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Ekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Džakarta</string>
+ <string name="utcp8">(UTC +8) Peking, Singapur, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokio, Seul, Jakutsk</string>
+ <string name="utcp10">(UTC +10) Vzhodna Avstralija, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Salomonovi otoki</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fidži</string>
+ <string name="sel_tz_offset">Izberite zamik (običajno 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Brez</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Uporabi poletni čas (DST)</string>
+ <string name="curr_tz">Trenutni časovni pas: %tw_time_zone%</string>
+ <string name="curr_tz_s">Trenutni časovni pas:</string>
+ <string name="set_tz_btn">Nastavi časovni pas</string>
+ <string name="settings_screen_hdr">Zaslon</string>
+ <string name="settings_screen_timeout_hdr">Časovna omejitev zaslona</string>
+ <string name="enable_timeout_chk">Omogoči časovno omejitev zaslona</string>
+ <string name="screen_to_slider">Časovna omejitev zaslona v sekundah:</string>
+ <string name="screen_to_slider_s">Časovna omejitev zaslona v sekundah: (0 = onemogočeno): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Nastavitev časovne omejitve zaslona ni na voljo</string>
+ <string name="screen_bright_slider">Svetlost: %tw_brightness_pct% %</string>
+ <string name="screen_bright_na">Nastavitev svetlosti ni na voljo</string>
+ <string name="vibration_hdr">Vibriranje</string>
+ <string name="button_vibration_hdr">Vibriranje gumbov</string>
+ <string name="kb_vibration_hdr">Vibriranje tipkovnice</string>
+ <string name="act_vibration_hdr">Vibriranje dejanj</string>
+ <string name="button_vibration">Vibriranje gumbov:</string>
+ <string name="kb_vibration">Vibriranje tipkovnice:</string>
+ <string name="act_vibration">Vibriranje dejanj:</string>
+ <string name="select_language">Izberite jezik:</string>
+ <string name="sel_lang_btn">Izberite jezik</string>
+ <string name="set_language_btn">Nastavi jezik</string>
+ <string name="advanced_hdr">Napredno</string>
+ <string name="copy_log_confirm">Kopiraj dnevnik na kartico SD?</string>
+ <string name="copying_log">Kopiranje dnevnika na kartico SD …</string>
+ <string name="copy_log_complete">Kopiranje dnevnika končano</string>
+ <string name="part_sd_btn">Razdeli kartico SD</string>
+ <string name="part_sd_s_btn">Kartica SD</string>
+ <string name="file_manager_btn">Upravljalnik datotek</string>
+ <string name="language_hdr">Jezik</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Ponovno naloži temo</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Vstavi TWRP</string>
+ <string name="inject_twrp_confirm">Ponovno vstavi TWRP?</string>
+ <string name="injecting_twrp">Ponovno vstavljanje TWRP-ja …</string>
+ <string name="inject_twrp_complete">Vstavljanje TWRP-ja končano</string>
+ <string name="swipe_to_confirm">Povlecite za potrditev</string>
+ <string name="part_sd_hdr">Razdeli kartico SD</string>
+ <string name="invalid_partsd_sel">Izbrati morate odstranljivo napravo</string>
+ <string name="part_sd_lose">Izgubili boste vse datoteke na kartici SD!</string>
+ <string name="part_sd_undo">Tega dejanja ni mogoče razveljaviti!</string>
+ <string name="part_sd_ext_sz">Velikost EXT:</string>
+ <string name="part_sd_swap_sz">Izmen. velikost:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Datotečni sistem:</string>
+ <string name="swipe_part_sd">Povlecite za razdelitev</string>
+ <string name="swipe_part_sd_s">Razdelek</string>
+ <string name="partitioning_sd">Razdeljevanje kartice SD …</string>
+ <string name="partitioning_sd2">To bo trajalo nekaj minut.</string>
+ <string name="part_sd_complete">Razdeljevanje končano</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Obnovi izvirni zagon</string>
+ <string name="dumlock_restore_confirm">Obnovi izvirni zagonski odtis?</string>
+ <string name="dumlock_restoring">Obnavljanje izvirnega zagona …</string>
+ <string name="dumlock_restore_complete">Obnavljanje izvirnega zagona končano</string>
+ <string name="dumlock_reflash_btn">Ponovno namesti obnovitev</string>
+ <string name="dumlock_reflash_confirm">Ponovno namesti obnovitev v zagon?</string>
+ <string name="dumlock_reflashing">Nameščanje obnovitve v zagon …</string>
+ <string name="dumlock_reflash_complete">Namestite v obnovitve v zagon končana</string>
+ <string name="dumlock_install_btn">Namesti HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Namesti datoteke HTC Dumlock v ROM?</string>
+ <string name="dumlock_installing">Nameščanje HTC Dumlocka …</string>
+ <string name="dumlock_install_complete">Nameščanje HTC Dumlocka končano</string>
+ <string name="swipe_to_unlock">Povlecite za odklepanje</string>
+ <string name="swipe_unlock"> Odkleni</string>
+ <string name="fm_hdr">Upravljalnik datotek</string>
+ <string name="fm_sel_file">Izberite datoteko ali mapo</string>
+ <string name="fm_type_folder">Mapa</string>
+ <string name="fm_type_file">Datoteka</string>
+ <string name="fm_choose_act">Izberite dejanje</string>
+ <string name="fm_selected">Izbrano %tw_fm_type%:</string>
+ <string name="fm_copy_btn">Kopiraj</string>
+ <string name="fm_copy_file_btn">Kopiraj datoteko</string>
+ <string name="fm_copy_folder_btn">Kopiraj mapo</string>
+ <string name="fm_copying">Kopiranje …</string>
+ <string name="fm_move_btn">Premakni</string>
+ <string name="fm_moving">Premikanje</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Izbriši</string>
+ <string name="fm_deleting">Brisanje …</string>
+ <string name="fm_rename_btn">Preimenuj</string>
+ <string name="fm_rename_file_btn">Preimenuj datoteko</string>
+ <string name="fm_rename_folder_btn">Preimenuj mapo</string>
+ <string name="fm_renaming">Preimenovanje</string>
+ <string name="fm_sel_dest">Izberite ciljno mapo</string>
+ <string name="fm_sel_curr_folder">Izberite trenutno mapo</string>
+ <string name="fm_rename_hdr">Preimenuj</string>
+ <string name="fm_set_perms_hdr">Nastavi dovoljenja</string>
+ <string name="fm_perms">Dovoljenja:</string>
+ <string name="fm_complete">Opravilo na datotekah končano</string>
+ <string name="decrypt_data_hdr">Odšifriraj podatke</string>
+ <string name="decrypt_data_enter_pass">Vnesite geslo.</string>
+ <string name="decrypt_data_enter_pattern">Vnesite vzorec.</string>
+ <string name="decrypt_data_trying">Poizkušanje odšifriranja</string>
+ <string name="term_hdr">Ukaz za terminal</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">UNIČI</string>
+ <string name="term_sel_folder_hdr">Brskajte do začetne mape</string>
+ <string name="adb_sideload_hdr">Stransko nalaganje ADB</string>
+ <string name="sideload_wipe_dalvik_chk">Počisti predpomnilnik Dalvik</string>
+ <string name="sideload_wipe_cache_chk">Počisti predpom.</string>
+ <string name="swipe_to_sideload">Povlecite za začetek stranskega nalaganja</string>
+ <string name="swipe_sideload"> Začni</string>
+ <string name="sideload_confirm">Stransko nalaganje ADB</string>
+ <string name="sideload_usage">Uporaba: adb sideload filename.zip</string>
+ <string name="sideload_complete">Stransko nalaganje ADB končano</string>
+ <string name="reboot_hdr">Pon. zaženi</string>
+ <string name="su_hdr">Preveri SuperSU</string>
+ <string name="su_note1">Videti je, da vaša naprava nima skrbniškega dostopa.</string>
+ <string name="su_note2">Namesti SuperSU zdaj?</string>
+ <string name="su_note3">To bo omogočilo skrbniški dostop na napravi.</string>
+ <string name="su_cancel">Ne namesti</string>
+ <string name="swipe_su_to_install">Povlecite za namestitev</string>
+ <string name="swipe_su_install"> Namesti</string>
+ <string name="su_installing">Nameščanje SuperSU-ja</string>
+ <string name="sel_storage_list">Izberite pomnilniško napravo</string>
+ <string name="ok_btn">V redu</string>
+ <string name="no_kernel_selinux">Jedro nima podpore za branje vsebin SELinux.</string>
+ <string name="full_selinux">Prisotna je polna podpora za SELinux.</string>
+ <string name="no_selinux">Ni podpore za SELinux (libselinux manjka).</string>
+ <string name="mtp_enabled">MTP omogočen</string>
+ <string name="mtp_crash">MTP se je sesul, MTP se ob zagonu ne bo začel.</string>
+ <string name="decrypt_success">Uspešno odšifrirano s privzetim geslom.</string>
+ <string name="unable_to_decrypt">Odšifriranje s privzetim geslom ni mogoče. Morda boste moral sformatirati podatke.</string>
+ <string name="generating_md51">Ustvarjanje razpršila MD5</string>
+ <string name="generating_md52"> * Ustvarjanje razpršila MD5 …</string>
+ <string name="md5_created"> * Razpršilo MD5 ustvarjeno.</string>
+ <string name="md5_error"> * Napaka razpršila MD5!</string>
+ <string name="md5_compute_error"> * Napaka pri računanju razpršila MD5.</string>
+ <string name="current_date">(trenutni datum)</string>
+ <string name="auto_generate">(samodejno ustvari)</string>
+ <string name="unable_to_locate_partition">Razdelka \'{1}\' za računanje varnostnih kopij ni mogoče najti.</string>
+ <string name="no_partition_selected">Ni izbranih razdelkov za varnostno kopiranje.</string>
+ <string name="total_partitions_backup"> * Skupno število razdelkov za varnostno kopiranje: {1}</string>
+ <string name="total_backup_size"> * Skupna velikost vseh podatkov: {1} MB</string>
+ <string name="available_space"> * Nezaseden prostor: {1} MB</string>
+ <string name="unable_locate_storage">Pomnilniške naprave ni mogoče najti.</string>
+ <string name="no_space">Ni dovolj prostora na pomnilniški napravi.</string>
+ <string name="backup_started">[VAR. KOPIRANJE SE JE ZAČELO]</string>
+ <string name="backup_folder"> * Mapa varnostnega kopiranja: {1}</string>
+ <string name="fail_backup_folder">Ustvarjanje mape varnostnega kopiranja je spodletelo.</string>
+ <string name="avg_backup_fs">Povprečna hitrost varnostnega kopiranja za datotečne sisteme: {1} MB/s</string>
+ <string name="avg_backup_img">Povprečna hitrost varnostnega kopiranja za odtise pogonov: {1} MB/s</string>
+ <string name="total_backed_size">[VARNOSTNO KOPIRANO SKUPAJ {1} MB]</string>
+ <string name="backup_completed">[VARNOSTNO KOPIRANJE KONČANO V {1} S]</string>
+ <string name="restore_started">[OBNOVITEV SE JE ZAČELA]</string>
+ <string name="restore_folder">Mapa obnovitve: \'{1}\'</string>
+ <string name="verifying_md5">Preverjanje razpršila MD5</string>
+ <string name="skip_md5">Preskakovanje preverjanja razpršila MD5 glede na uporabniško nastavitev.</string>
+ <string name="calc_restore">Računanje podrobnosti obnovitve …</string>
+ <string name="restore_read_only">{1} ni mogoče obnoviti -- priklopljen je samo za branje.</string>
+ <string name="restore_unable_locate">Razdelka \'{1}\' za obnovitev ni mogoče najti.</string>
+ <string name="no_part_restore">Ni izbranih razdelkov za obnovitev.</string>
+ <string name="restore_part_count">Obnavljanje {1} razdelkov …</string>
+ <string name="total_restore_size">Skupna velikost obnovitve je {1} MB</string>
+ <string name="updating_system_details">Posodabljanje sistemskih podrobnosti</string>
+ <string name="restore_completed">[OBNOVITEV KONČANA V {1} S]</string>
+ <string name="error_opening_strerr">Napaka odpiranja: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Razdelka po imenu varnostne kopije ni mogoče najti: \'{1}\'</string>
+ <string name="unable_find_part_path">Razdelka za pot \'{1}\' ni mogoče najti</string>
+ <string name="update_part_details">Posodabljanje podrobnosti razdelka …</string>
+ <string name="update_part_details_done">… končano</string>
+ <string name="wiping_dalvik">Čiščenje map predpomnilnika Dalvik …</string>
+ <string name="cleaned">Počiščeno: {1} …</string>
+ <string name="dalvik_done">-- Čiščenje map predpomnilnika Dalvik končano!</string>
+ <string name="no_andsec">Varnih razdelkov Android ni bilo najdenih.</string>
+ <string name="unable_to_locate">{1} ni mogoče najti.</string>
+ <string name="wiping_datamedia">Čiščenje notranje pomnilniške naprave -- /data/media …</string>
+ <string name="unable_to_mount">{1} ni mogoče priklopiti.</string>
+ <string name="unable_to_mount_internal">Notranje pomnilniške naprave ni mogoče priklopiti</string>
+ <string name="unable_to_mount_storage">Pomnilniške naprave ni mogoče priklopiti</string>
+ <string name="fail_decrypt">Odšifriranje podatkov je spodletelo.</string>
+ <string name="no_crypto_support">Podpora za šifriranje ni bila vgrajena v to izgradnjo.</string>
+ <string name="decrypt_success_dev">Podatki so bili uspešno odšifrirani, nova bločna naprava: \'{1}\'</string>
+ <string name="done">Končano.</string>
+ <string name="start_partition_sd">Razdeljevanje kartice SD …</string>
+ <string name="partition_sd_locate">Naprave za razdeljevanje ni mogoče najti.</string>
+ <string name="ext_swap_size">EXT + izmenjevalna velikost sta večja od velikosti kartice SD.</string>
+ <string name="remove_part_table">Odstranjevanje preglednice razdelka …</string>
+ <string name="unable_rm_part">Preglednice razdelka ni mogoče odstraniti.</string>
+ <string name="create_part">Ustvarjanje razdelka {1} …</string>
+ <string name="unable_to_create_part">Razdelka {1} ni mogoče ustvariti.</string>
+ <string name="format_sdext_as">Formatiranje SD-EXT kot {1} …</string>
+ <string name="part_complete">Razdeljevanje končano.</string>
+ <string name="unable_to_open">\'{1}\' ni mogoče odpreti.</string>
+ <string name="mtp_already_enabled">MTP je že omogočen</string>
+ <string name="mtp_fail">Omogočanje MTP-ja je spodletelo</string>
+ <string name="no_mtp">Podpora za MTP ni vključena</string>
+ <string name="image_flash_start">[NAMESTITEV ODTISA SE JE ZAČELA]</string>
+ <string name="img_to_flash">Odtis za namestitev: \'{1}\'</string>
+ <string name="flash_unable_locate">Razdelka \'{1}\' za namestitev ni mogoče najti.</string>
+ <string name="no_part_flash">Ni izbranih razdelkov za namestitev.</string>
+ <string name="too_many_flash">Izbranih preveč razdelkov za namestitev.</string>
+ <string name="invalid_flash">Naveden neveljaven razdelek za namestitev.</string>
+ <string name="flash_done">[NAMESTITEV ODTISA KONČANA]</string>
+ <string name="wiping">Čiščenje {1}</string>
+ <string name="repair_not_exist">{1} ne obstaja! Popravilo ni mogoče!</string>
+ <string name="repairing_using">Popravljanje {1} s/z {2} …</string>
+ <string name="unable_repair">Popravilo {1} ni mogoče.</string>
+ <string name="mount_data_footer">/data ni bilo mogoče priklopiti in vnožja za šifriranje ni mogoče najti.</string>
+ <string name="create_folder_strerr">Mape \'{1}\' ni mogoče ustvariti ({2}).</string>
+ <string name="fail_mount">Priklop \'{1}\' je spodletel ({2})</string>
+ <string name="fail_unmount">Odklop \'{1}\' je spodletel ({2})</string>
+ <string name="cannot_resize">Velikosti {1} ni mogoče spremeniti.</string>
+ <string name="repair_resize">Popravljanje {1} pred spremembo velikosti.</string>
+ <string name="unable_resize">Velikosti {1} ni mogoče spremeniti.</string>
+ <string name="no_md5_found">Za \'{1}\' ni bilo najdene datoteke MD5. Odstranite izbiro \'Omogoči preverjanje razpršila MD5\' za obnovitev.</string>
+ <string name="md5_fail_match">Ujemanje razpršila MD5 na \'{1}\' je spodletelo.</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">Odšifriranje datoteke TAR \'{1}\' je spodletelo</string>
+ <string name="format_data_msg">Za ponovno uporabo /data boste morda morali ponovno zagnati obnovitev.</string>
+ <string name="format_data_err">Formatiranje za odstranitev šifriranja ni mogoče.</string>
+ <string name="formatting_using">Formatiranje {1} s/z {2} …</string>
+ <string name="unable_to_wipe">Čiščenje {1} ni mogoče.</string>
+ <string name="cannot_wipe">Razdelka {1} ni mogoče počistiti.</string>
+ <string name="remove_all">Odstranjevanje vseh datotek v \'{1}\'</string>
+ <string name="wiping_data">Čiščenje podatkov brez čiščenja /data/media …</string>
+ <string name="backing_up">Varnostno kopiranje {1} …</string>
+ <string name="backing">Varnostno kopiranje</string>
+ <string name="backup_size">Velikost varnostne kopije za \'{1}\' je 0 B.</string>
+ <string name="datamedia_fs_restore">OPOZORILO: ta varnostna kopija /data je bila ustvarjena z datotečnim sistemom {1}! Varnostna kopija se morda ne bo zagnala, če je ne spremenite nazaj na {1}.</string>
+ <string name="restoring">Obnavljanje {1} …</string>
+ <string name="restoring_hdr">Obnavljanje</string>
+ <string name="recreate_folder_err">Mape {1} ni mogoče ponovno ustvariti.</string>
+ <string name="img_size_err">Velikost odtisa je večja od ciljne naprave</string>
+ <string name="flashing">Nameščanje {1} …</string>
+ <string name="backup_folder_set">Mapa varnostnega kopiranja nastavljena na \'{1}\'</string>
+ <string name="locate_backup_err">Varnostne kopije \'{1}\' ni mogoče najti</string>
+ <string name="set_restore_opt">Nastavljanje možnosti za varnostno kopiranje: \'{1}\':</string>
+ <string name="md5_check_skip">Preskak. preverjanja raz. MD5 je vkl.</string>
+ <string name="ors_encrypt_restore_err">OpenRecoveryScript ni mogoče uporabiti za obnavljanje šifriranih varnostnih kopij.</string>
+ <string name="mounting">Priklapljanje</string>
+ <string name="unmounting">Odklapljanje</string>
+ <string name="mounted">\'{1}\' priklopljen</string>
+ <string name="unmounted">\'{1}\' odklopljen</string>
+ <string name="setting">Nastavljanje \'{1}\' na \'{2}\'</string>
+ <string name="setting_empty">Nastavljanje \'{1}\' na prazno</string>
+ <string name="making_dir1">Ustvarjanje mape</string>
+ <string name="making_dir2">Ustvarjanje mape: \'{1}\'</string>
+ <string name="running_command">Izvajanje ukaza</string>
+ <string name="sideload">Stransko nalaganje ADB</string>
+ <string name="start_sideload">Začenjanje značilnosti stranskega nalaganja ADB …</string>
+ <string name="need_new_adb">Za stransko nalaganje na to napravo potrebujete ADB 1.0.32 ali novejši</string>
+ <string name="no_pwd">Geslo ni bilo navedeno.</string>
+ <string name="done_ors">Obdelava datoteke skripta je končana</string>
+ <string name="injecttwrp">Vstavljanje TWRP-ja v zagonski odtis …</string>
+ <string name="zip_err">Napaka pri nameščanju datoteke ZIP \'{1}\'</string>
+ <string name="installing_zip">Nameščanje datoteke ZIP \'{1}\'</string>
+ <string name="select_backup_opt">Nastavljanje možnosti varnostnega kopiranja:</string>
+ <string name="compression_on">Stiskanje je vklopljeno</string>
+ <string name="md5_off">Ustvarjanje razpršila MD5 je izklopljeno</string>
+ <string name="backup_fail">Var. kop. je spodletelo</string>
+ <string name="backup_clean">Varnostno kopiranje je spodletelo. Čiščenje mape varnostnega kopiranja.</string>
+ <string name="running_recovery_commands">Izvajanje ukazov za obnovitev</string>
+ <string name="recovery_commands_complete">Ukazi za obnovitev kočani</string>
+ <string name="running_ors">Izvajanje OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript končan</string>
+ <string name="no_updater_binary">V datoteki ZIP ni bilo mogoče najti \'{1}\'</string>
+ <string name="check_for_md5">Preverjanje za datoteko razpršila MD5 …</string>
+ <string name="fail_sysmap">Preslikava datoteke \'{1}\' je spodletela</string>
+ <string name="verify_zip_sig">Preverjanje podpisa ZIP</string>
+ <string name="verify_zip_fail">Preverjanje podpisa ZIP je spodletelo!</string>
+ <string name="verify_zip_done">Preverjanje podpisa ZIP je bilo uspešno!</string>
+ <string name="zip_corrupt">Datoteka ZIP je poškodovana!</string>
+ <string name="no_md5">Preskakovanje preverjanja razpršila MD5: datoteka MD5 ni bila najdena</string>
+ <string name="md5_fail">MD5 se ne ujema</string>
+ <string name="md5_match">MD5 se ujema</string>
+ <string name="pid_signal">{1} opravilo se je končalo s signalom: {2}</string>
+ <string name="pid_error">{1} opravilo se je končalo z NAPAKO: {2}</string>
+ <string name="install_dumlock">Nameščanje HTC Dumlocka na sistem …</string>
+ <string name="dumlock_restore">Obnavljanje izvirnega zagona …</string>
+ <string name="dumlock_reflash">Ponovno nameščanje obnovitve v zagon …</string>
+ <string name="run_script">Izvajanje skripta {1} …</string>
+ <string name="rename_stock">Tovarniška datoteka obnovitve v /system je bila preimenovana, da tovarniškemu ROM-u prepreči nadomestitev TWRP-ja.</string>
+ <string name="split_backup">Razcepljanje varnostne kopije v več arhivov …</string>
+ <string name="backup_error">Napaka pri ustvarjanju varnostne kopije.</string>
+ <string name="restore_error">Napaka med postopkom obnovitve.</string>
+ <string name="split_thread">Razcepljanje ID-ja niti {1} v arhiv {2}</string>
+ <string name="file_progress">%llu od %llu datotek, %i %%</string>
+ <string name="size_progress">%llu MB od %llu MB, %i %%</string>
+ <string name="decrypt_cmd">Poizkušanje odšifriranja podatkovnega razdelka preko ukazne vrstice.</string>
+ <string name="base_pkg_err">Nalaganje osnovnih paketov je spodletelo.</string>
+ <string name="simulating">Simuliranje dejanj …</string>
+ <string name="backup_cancel">Varnostno kopiranje preklicano</string>
+ <string name="config_twrp">Nastavljanje TWRP-ja …</string>
+ <string name="config_twrp_err">TWRP-ja ni mogoče nastaviti s tem jedrom.</string>
+ <string name="copy_log">Dnevnik obnovitve kopiran v {1}.</string>
+ <string name="max_queue">Dosežena največja velikost čakalne vrste ZIP!</string>
+ <string name="min_queue">Dosežena najmanjša velikost čakalne vrste ZIP!</string>
+ <string name="screenshot_saved">Zaslonska slika je bila shranjena v {1}</string>
+ <string name="screenshot_err">Zajem zaslonske slike je spodletel!</string>
+ <string name="zip_wipe_cache">Eden ali več ZIP-ov je zahteval čiščenje predpomnilnika -- čiščenje.</string>
+ <string name="and_sec_wipe_err">Varnega razdelka Android ni mogoče počistiti</string>
+ <string name="dalvik_wipe_err">Čiščenje Dalvika je spodletelo</string>
+ <string name="auto_gen">(samodejno ustvari)</string>
+ <string name="curr_date">(trenutni datum)</string>
+ <string name="backup_name_len">Ime varnostne kopije je predolgo.</string>
+ <string name="backup_name_invalid">Ime varnostne kopije \'{1}\' vsebuje neveljavni znak: \'{1}\'</string>
+ <string name="no_real_sdcard">Ta naprava nima resnične kartice SD! Prekinjanje!</string>
+ <string name="cancel_sideload">Preklicevanje stranskega nalaganja ADB …</string>
+ <string name="change_fs_err">Napaka pri spreminjanju datotečnega sistema.</string>
+ <string name="theme_ver_err">Različica teme po meri se ne ujema z različico TWRP-ja. Uporabljena bo tovarniška tema.</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/sv.xml b/gui/theme/common/languages/sv.xml
new file mode 100644
index 000000000..f9978fc6c
--- /dev/null
+++ b/gui/theme/common/languages/sv.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Swedish</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">System</string>
+ <string name="vendor">Leverantör</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Intern lagring</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <string name="sdext">SD-EXT</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="sort_by_name">Sortera efter namn</string>
+ <string name="sort_by_date">Sortera efter datum</string>
+ <string name="sort_by_size">Sortera efter storlek</string>
+ <string name="sort_by_name_only">Namn</string>
+ <string name="sort_by_date_only">Datum</string>
+ <string name="sort_by_size_only">Storlek</string>
+ <string name="tab_general">ALLMÄNT</string>
+ <string name="tab_options">ALTERNATIV</string>
+ <string name="tab_time_zone">TIDSZON</string>
+ <string name="tab_screen">SKÄRM</string>
+ <string name="tab_vibration">VIBRATION</string>
+ <string name="tab_language">SPRÅK</string>
+ <string name="install_btn">Installera</string>
+ <string name="restore_btn">Återställ</string>
+ <string name="settings_btn">Inställningar</string>
+ <string name="advanced_btn">Avancerad</string>
+ <string name="reboot_btn">Starta om</string>
+ <string name="files_btn">Filer</string>
+ <string name="copy_log_btn">Kopiera logg</string>
+ <string name="select_type_hdr">Välj typ</string>
+ <string name="install_zip_hdr">Installera Zip</string>
+ <string name="install_zip_btn">Installera Zip</string>
+ <string name="install_select_file_hdr">Välj fil</string>
+ <string name="file_selector_folders_hdr">Mappar</string>
+ <string name="install_hdr">Installera</string>
+ <string name="select_storage_hdr">Välj lagring</string>
+ <string name="select_storage_btn">Välj lagring</string>
+ <string name="queue_hdr">Kö</string>
+ <string name="folder">Mapp:</string>
+ <string name="file">Fil:</string>
+ <string name="options_hdr">Alternativ</string>
+ <string name="confirm_flash_hdr">Bekräfta Flash</string>
+ <string name="zip_queue">Kö:</string>
+ <string name="options">Alternativ:</string>
+ <string name="swipe_confirm"> Bekräfta</string>
+ <string name="failed">Misslyckades</string>
+ <string name="install_failed">Installationen misslyckades</string>
+ <string name="install_sel_target">Välj målpartition</string>
+ <string name="swipe_reboot_s"> Starta om</string>
+ <string name="confirm_action">Bekräfta åtgärd</string>
+ <string name="cancel_btn">Avbryt</string>
+ <string name="factory_reset_hdr">Fabriksåterställning</string>
+ <string name="factory_reset_btn">Fabriksåterställning</string>
+ <string name="factory_resetting">Fabriksåterställning...</string>
+ <string name="swipe_format_data_s"> Formattera data</string>
+ <string name="sel_part_hdr">Välj partitioner</string>
+ <string name="format_data_hdr">Formattera data</string>
+ <string name="format_data_btn">Formattera data</string>
+ <string name="sel_act_hdr">Välj åtgärd</string>
+ <string name="repair_btn_s">Reparera</string>
+ <string name="repairing">Reparerar...</string>
+ <string name="swipe_repair_s"> Reparera</string>
+ <string name="change_fs_btn_s">Ändra</string>
+ <string name="formatting">Formatterar...</string>
+ <string name="swipe_change_s"> Ändra</string>
+ <string name="back_btn">Tillbaka</string>
+ <string name="encryption_tab">KRYPTERING</string>
+ <string name="encryption">Kryptering:</string>
+ <string name="name">Namn:</string>
+ <string name="storage">Lagring:</string>
+ <string name="enc_enabled">aktiverad</string>
+ <string name="append_date_btn">Lägg till datum</string>
+ <string name="enter_pass">Ange lösenord:</string>
+ <string name="enter_pass2">Ange lösenordet igen:</string>
+ <string name="partitions">Partitioner:</string>
+ <string name="disabled">Inaktiverad</string>
+ <string name="enabled">Aktiverad</string>
+ <string name="progress">Förlopp:</string>
+ <string name="restore_hdr">Återställ</string>
+ <string name="swipe_delete_s"> Ta bort</string>
+ <string name="restore_sel_part">Välj partitioner att återställa:</string>
+ <string name="swipe_restore_s"> Återställ</string>
+ <string name="swipe_rename"> Byt namn</string>
+ <string name="confirm_hdr">Bekräfta</string>
+ <string name="decrypt_data_btn">Dekryptera data</string>
+ <string name="disable_mtp_btn">Inaktivera MTP</string>
+ <string name="enable_mtp_btn">Aktivera MTP</string>
+ <string name="usb_storage_hdr">USB-lagring</string>
+ <string name="rb_system_btn">System</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Ladda ner</string>
+ <string name="turning_off">Stänger av...</string>
+ <string name="settings_hdr">Inställningar</string>
+ <string name="settings_gen_s_hdr">Allmänt</string>
+ <string name="settings_gen_btn">Allmänt</string>
+ <string name="settings_tz_btn">Tidszon</string>
+ <string name="settings_screen_btn">Skärm</string>
+ <string name="settings_vibration_btn">Vibration</string>
+ <string name="settings_language_btn">Språk</string>
+ <string name="time_zone_hdr">Tidszon</string>
+ <string name="sel_tz_list">Välj tidszon:</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm3">(UTC -3) Brasilien, Buenos Aires</string>
+ <string name="utcm1">(UTC -1) Azorerna, Kap Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lissabon</string>
+ <string name="utcp1">(UTC +1) Berlin, Bryssel, Paris</string>
+ <string name="utcp2">(UTC +2) Aten, Istanbul, Sydafrika</string>
+ <string name="utcp3">(UTC +3) Moskva, Bagdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Östra Australien, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Salomonöarna</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="tz_offset_none">Ingen</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="curr_tz_s">Aktuell tidszon:</string>
+ <string name="set_tz_btn">Ställ in tidszon</string>
+ <string name="vibration_hdr">Vibration</string>
+ <string name="select_language">Välj språk:</string>
+ <string name="set_language_btn">Ställ in språk</string>
+ <string name="advanced_hdr">Avancerad</string>
+ <string name="part_sd_s_btn">SD-kort</string>
+ <string name="file_manager_btn">Filhanterare</string>
+ <string name="language_hdr">Språk</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Injicera TWRP</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Filsystem:</string>
+ <string name="swipe_part_sd_s">Partition</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_install_btn">Installera HTC Dumlock</string>
+ <string name="dumlock_installing">Installerar HTC Dumlock...</string>
+ <string name="swipe_unlock"> Lås upp</string>
+ <string name="fm_hdr">Filhanterare</string>
+ <string name="fm_type_folder">Mapp</string>
+ <string name="fm_type_file">Fil</string>
+ <string name="fm_choose_act">Välj åtgärd</string>
+ <string name="fm_copy_btn">Kopiera</string>
+ <string name="fm_copy_file_btn">Kopiera fil</string>
+ <string name="fm_copy_folder_btn">Kopiera mapp</string>
+ <string name="fm_copying">Kopierar</string>
+ <string name="fm_move_btn">Flytta</string>
+ <string name="fm_moving">Flyttar</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Ta bort</string>
+ <string name="fm_deleting">Tar bort</string>
+ <string name="fm_rename_btn">Byt namn</string>
+ <string name="fm_renaming">Byter namn på</string>
+ <string name="fm_sel_dest">Välj målmapp</string>
+ <string name="fm_sel_curr_folder">Välj aktuell mapp</string>
+ <string name="fm_rename_hdr">Byt namn</string>
+ <string name="decrypt_data_hdr">Dekryptera data</string>
+ <string name="decrypt_data_enter_pattern">Ange mönster.</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">DÖDA</string>
+ <string name="swipe_sideload"> Start</string>
+ <string name="reboot_hdr">Starta om</string>
+ <string name="su_note2">Installera SuperSU nu?</string>
+ <string name="su_cancel">Installera inte</string>
+ <string name="swipe_su_install"> Installera</string>
+ <string name="su_installing">Installerar SuperSU</string>
+ <string name="sel_storage_list">Välj lagring</string>
+ <string name="ok_btn">OK</string>
+ <string name="generating_md51">Genererar MD5</string>
+ <string name="generating_md52"> * Genererar MD5...</string>
+ <string name="md5_created"> * MD5 skapad.</string>
+ <string name="md5_error"> * MD5-fel!</string>
+ <string name="current_date">(Dagens datum)</string>
+ <string name="auto_generate">(Auto-generera)</string>
+ <string name="available_space"> * Tillgängligt utrymme: {1}MB</string>
+ <string name="verifying_md5">Verifierar MD5</string>
+ <string name="update_part_details_done">...klar</string>
+ <string name="done">Klar.</string>
+ <string name="create_part">Skapar {1} partition...</string>
+ <string name="mtp_already_enabled">MTP redan aktiverat</string>
+ <string name="flashing">Blinkande {1}...</string>
+ <string name="installing_zip">Installerar zipfil \"{1}\"</string>
+ <string name="compression_on">Komprimering är på</string>
+ <string name="verify_zip_sig">Verifierar zip-signatur...</string>
+ <string name="config_twrp">Konfigurerar TWRP...</string>
+ <string name="auto_gen">(Auto-generera)</string>
+ <string name="curr_date">(Dagens datum)</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/tr.xml b/gui/theme/common/languages/tr.xml
new file mode 100644
index 000000000..d9ba276b3
--- /dev/null
+++ b/gui/theme/common/languages/tr.xml
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<language>
+ <display>Turkish</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <string name="system">Sistem</string>
+ <string name="system_image">Sistem İmajı</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor İmajı</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Önbellek</string>
+ <string name="data">Veri</string>
+ <string name="sdcard">SD Kart</string>
+ <string name="internal">Dahili Depolama</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Önbelleği</string>
+ <string name="sdext">Harici SD</string>
+ <string name="adopted_data">Kabul Edilen Veri</string>
+ <string name="adopted_storage">Kabul Edilen Depolama</string>
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">İşlemci: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Pil: %tw_battery%</string>
+ <string name="sort_by_name">Ada göre sırala</string>
+ <string name="sort_by_date">Tarihe göre sırala</string>
+ <string name="sort_by_size">Boyuta göre sırala</string>
+ <string name="sort_by_name_only">Ad</string>
+ <string name="sort_by_date_only">Tarih</string>
+ <string name="sort_by_size_only">Boyut</string>
+ <string name="tab_general">GENEL</string>
+ <string name="tab_options">SEÇENEKLER</string>
+ <string name="tab_backup">YEDEKLE</string>
+ <string name="tab_time_zone">ZAMAN DİLİMİ</string>
+ <string name="tab_screen">EKRAN</string>
+ <string name="tab_vibration">TİTREŞİM</string>
+ <string name="tab_language">DİL</string>
+ <string name="install_btn">Yükle</string>
+ <string name="wipe_btn">Temizle</string>
+ <string name="backup_btn">Yedekle</string>
+ <string name="restore_btn">Geri Yükle</string>
+ <string name="mount_btn">Bağla</string>
+ <string name="settings_btn">Ayarlar</string>
+ <string name="advanced_btn">Gelişmiş</string>
+ <string name="reboot_btn">Yeniden Başlat</string>
+ <string name="files_btn">Dosyalar</string>
+ <string name="copy_log_btn">Kaydı Kopyala</string>
+ <string name="select_type_hdr">Tür Seç</string>
+ <string name="install_zip_hdr">Zip Yükle</string>
+ <string name="install_zip_btn">Zip Yükle</string>
+ <string name="install_image_hdr">İmaj Yükle</string>
+ <string name="install_image_btn">İmaj Yükle</string>
+ <string name="install_select_file_hdr">Dosya Seç</string>
+ <string name="file_selector_folders_hdr">Klasörler</string>
+ <string name="select_file_from_storage">%tw_storage_display_name%\'dan dosya seç (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Yükle</string>
+ <string name="select_storage_hdr">Depolama Seç</string>
+ <string name="select_storage_btn">Depolama Seç</string>
+ <string name="queue_hdr">Sıra</string>
+ <string name="zip_queue_count">%tw_zip_queue_count%/10 dosya sıraya alındı</string>
+ <string name="zip_queue_count_s">%tw_zip_queue_count%/10 dosya:</string>
+ <string name="zip_warn1">Bu işlem uyumsuz yazılım yükleyebilir</string>
+ <string name="zip_warn2">ve cihazınızı kullanılamaz hale getirebilir.</string>
+ <string name="zip_back_cancel">Bu zipi eklememek için geriye basın.</string>
+ <string name="zip_back_clear">Sırayı temizlemek için geri düğmesine basın.</string>
+ <string name="folder">Klasör:</string>
+ <string name="file">Dosya:</string>
+ <string name="zip_sig_chk">Zip imza doğrulaması</string>
+ <string name="inject_twrp_chk">Yükledikten sonra TWRP ekle</string>
+ <string name="options_hdr">Seçenekler</string>
+ <string name="confirm_flash_hdr">Flashlamayı Onayla</string>
+ <string name="zip_queue">Sıra:</string>
+ <string name="options">Seçenekler:</string>
+ <string name="swipe_confirm"> Onayla</string>
+ <string name="zip_add_btn">Daha fazla zip ekle</string>
+ <string name="zip_clear_btn">Zip sırasını temizle</string>
+ <string name="install_zip_count_hdr">Zipi yükle %tw_zip_index%/%tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Zip yükleniyor: %tw_file%</string>
+ <string name="failed">Başarısız</string>
+ <string name="successful">Başarılı</string>
+ <string name="install_failed">Kurulum Başarısız</string>
+ <string name="install_successful">Kurulum Başarılı</string>
+ <string name="wipe_cache_dalvik_btn">Cache/dalvik temizle</string>
+ <string name="reboot_system_btn">Sistemi Yeniden Başlat</string>
+ <string name="install_sel_target">Hedef Bölümü Seç</string>
+ <string name="flash_image_select">İmajı Flashlamak için Bölüm Seç:</string>
+ <string name="target_partition">Hedef Bölüm:</string>
+ <string name="flashing_image">İmaj Flashlanıyor...</string>
+ <string name="image_flashed">İmaj Flashlandı</string>
+ <string name="wipe_cache_dalvik_confirm">Önbellek ve Dalvik temizlensin mi?</string>
+ <string name="wiping_cache_dalvik">Önbellek ve Dalvik temizleniyor...</string>
+ <string name="wipe_cache_dalvik_complete">Önbellek ve Dalvik temizliği tamamlandı</string>
+ <string name="swipe_wipe">Temizlemek için Kaydır</string>
+ <string name="swipe_wipe_s"> Temizle</string>
+ <string name="no_os1">İS yüklü değil!</string>
+ <string name="no_osrb">Yeniden başlatmak istediğine emin misin?</string>
+ <string name="no_ospo">Kapatmak istediğine emin misin?</string>
+ <string name="rebooting">Yeniden Başlatılıyor...</string>
+ <string name="swipe_reboot">Yeniden Başlatmak için Kaydır</string>
+ <string name="swipe_reboot_s"> Yeniden başlat</string>
+ <string name="swipe_flash">Flashlamayı onaylamak için kaydır</string>
+ <string name="confirm_action">Eylemi Onayla</string>
+ <string name="back_cancel">İptal etmek için geri düğmesine basın.</string>
+ <string name="cancel_btn">İptal</string>
+ <string name="wipe_hdr">Temizle</string>
+ <string name="factory_reset_hdr">Sıfırla</string>
+ <string name="factory_reset_btn">Sıfırla</string>
+ <string name="factory_reset1">Veriyi, Önbelleği, ve Dalvik\'i temizler</string>
+ <string name="factory_reset2">(dahili depolama hariç)</string>
+ <string name="factory_reset3">Çoğu zaman ihtiyacınız olan</string>
+ <string name="factory_reset4">tek temizlik budur.</string>
+ <string name="factory_resetting">Sıfırla...</string>
+ <string name="advanced_wipe_hdr">Gelişmiş Temizlik</string>
+ <string name="advanced_wipe_btn">Gelişmiş Temizlik</string>
+ <string name="wipe_enc_confirm">Şifreleme Verilerden Silinsin mi?</string>
+ <string name="formatting_data">Veri Biçimlendiriliyor...</string>
+ <string name="swipe_format_data">Veriyi Biçimlendirmek için Kaydır</string>
+ <string name="swipe_format_data_s"> Veriyi Biçimlendir</string>
+ <string name="factory_reset_complete">Sıfırlama Tamamlandı</string>
+ <string name="sel_part_hdr">Bölümleri Seç</string>
+ <string name="wipe_sel_confirm">Seçili Bölüm(ler) Temizlensin Mi?</string>
+ <string name="wiping_part">Bölüm(ler) Temizleniyor...</string>
+ <string name="wipe_complete">Temizlik Tamamlandı</string>
+ <string name="sel_part_wipe">Temizlenecek Bölümleri Seçin:</string>
+ <string name="invalid_part_sel">Geçersiz bölüm seçimi</string>
+ <string name="format_data_hdr">Veriyi Biçimlendir</string>
+ <string name="format_data_btn">Veriyi Biçimlendir</string>
+ <string name="format_data_ptr1">Veriyi biçimlendirmek tüm uygulamalarınızı,</string>
+ <string name="format_data_ptr2">yedeklerinizi, resimlerinizi, videolarınızı, medyanızı, temizleyecek ve</string>
+ <string name="format_data_ptr3">dahili depolama üzerindeki şifrelemeyi kaldıracak.</string>
+ <string name="format_data_adopted">Adapte Dahili Depolama</string>
+ <string name="format_data_lcp1">Veriyi biçimlendirmek tüm uygulamalarınızı, yedeklerinizi, resimlerinizi, videolarınızı, medyanızı, temizleyecek ve</string>
+ <string name="format_data_lcp2">dahili depolama üzerindeki şifrelemeyi kaldıracak.</string>
+ <string name="format_data_wtc1">Veriyi biçimlendirmek tüm uygulamalarınızı,</string>
+ <string name="format_data_wtc2">yedeklerinizi ve medyanızı temizleyecek. Bu işlem geri alınamaz.</string>
+ <string name="format_data_undo">Bu işlem geri alınamaz.</string>
+ <string name="format_data_complete">Veriyi Biçimlendirme Tamamlandı</string>
+ <string name="yes_continue">Devam etmek için evet yazın. İptal etmek için geriye basın.</string>
+ <string name="part_opt_hdr">Şu bölüm için bölümleme seçenekleri: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Eylem Seç</string>
+ <string name="file_sys_opt">Dosya Sistemi Seçenekleri</string>
+ <string name="partition">Bölüm: %tw_partition_name%</string>
+ <string name="part_mount_point">Bağlama Noktası: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Dosya sistemi: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Mevcut: Evet</string>
+ <string name="part_present_no">Mevcut: Hayır</string>
+ <string name="part_removable_yes">Çıkarılabilir: Evet</string>
+ <string name="part_removable_no">Çıkarılabilir: Hayır</string>
+ <string name="part_size">Boyut: %tw_partition_size%MB</string>
+ <string name="part_used">Kullanılan: %tw_partition_used%MB</string>
+ <string name="part_free">Boş: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Yedek Boyutu: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Dosya Sistemini Yeniden Boyutlandır</string>
+ <string name="resize_btn_s">Yeniden Boyutlandır</string>
+ <string name="resize_confirm">%tw_partition_name% yeniden boyutlandırılsın mı?</string>
+ <string name="resizing">Yeniden boyutlandırılıyor...</string>
+ <string name="resize_complete">Yeniden boyutlandırma tamamlandı</string>
+ <string name="swipe_resize">Yeniden Boyutlandırmak için Kaydır</string>
+ <string name="swipe_resize_s"> Yeniden Boyutlandır</string>
+ <string name="repair_btn">Dosya Sistemini Onar</string>
+ <string name="repair_btn_s">Onar</string>
+ <string name="repair_confirm">%tw_partition_name% onarılsın mı?</string>
+ <string name="repairing">Onarılıyor...</string>
+ <string name="repair_complete">Onarma tamamlandı</string>
+ <string name="swipe_repair">Onarmak için Kaydır</string>
+ <string name="swipe_repair_s"> Onar</string>
+ <string name="change_fs_btn">Dosya Sistemini Değiştir</string>
+ <string name="change_fs_btn_s">Değiştir</string>
+ <string name="change_fs_for_hdr">Dosya Sistemini Değiştir: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Bölüm: %tw_partition_name% &gt; Dosya Sistemini Seç</string>
+ <string name="change_fs_warn1">Bazı ROM\'lar veya kerneller bazı dosya sistemlerini</string>
+ <string name="change_fs_warn2">desteklemeyebilir. Dikkatli olun!</string>
+ <string name="change_fs_confirm">%tw_partition_name% değiştirilsin mi?</string>
+ <string name="formatting">Biçimlendiriliyor...</string>
+ <string name="format_complete">Biçimlendirme tamamlandı</string>
+ <string name="swipe_change_fs">Değiştirmek için Kaydır</string>
+ <string name="swipe_change_s"> Değiştir</string>
+ <string name="back_btn">Geri</string>
+ <string name="wipe_enc_btn">Şifrelemeyi Temizle</string>
+ <string name="swipe_factory_reset">Sıfırlamak için Kaydır</string>
+ <string name="repair_change_btn">Dosya Sistemini Onar veya Değiştir</string>
+ <string name="storage_hdr">Depolama: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Yedekle</string>
+ <string name="backup_confirm_hdr">Yedeklemeyi Onayla</string>
+ <string name="encryption_tab">ŞİFRELEME</string>
+ <string name="encryption">Şifreleme:</string>
+ <string name="name">Ad:</string>
+ <string name="sel_part_backup">Yedeklenecek Bölümleri Seç:</string>
+ <string name="storage">Depolama:</string>
+ <string name="enc_disabled">devre dışı - etkinleştirmek için bir şifre ayarlayın</string>
+ <string name="enc_enabled">etkin</string>
+ <string name="enable_backup_comp_chk">Sıkıştırmayı etkinleştir</string>
+ <string name="skip_md5_backup_chk">Yedekleme sırasında MD5 oluşturmayı geç</string>
+ <string name="disable_backup_space_chk">Boş Alan Denetimini Devre Dışı Bırak</string>
+ <string name="refresh_sizes_btn">Boyutları Yenile</string>
+ <string name="swipe_backup">Yedeklemek için Kaydır</string>
+ <string name="append_date_btn">Tarih Ekle</string>
+ <string name="backup_name_exists">Bu adda bir yedek zaten var!</string>
+ <string name="encrypt_backup">Yedeklemeniz şifrelensin mi?</string>
+ <string name="enter_pass">Şifre Gir:</string>
+ <string name="enter_pass2">Şifreyi Tekrar Girin:</string>
+ <string name="pass_not_match">Şifreler eşleşmiyor!</string>
+ <string name="partitions">Bölümler:</string>
+ <string name="disabled">Devre dışı</string>
+ <string name="enabled">Etkin</string>
+ <string name="backup_name_hdr">Yedek Adı</string>
+ <string name="progress">İlerleme:</string>
+ <string name="backup_complete">Yedekleme Tamamlandı</string>
+ <string name="restore_hdr">Geri Yükle</string>
+ <string name="sel_backup_hdr">Yedek Seç</string>
+ <string name="restore_sel_store_hdr">%tw_storage_display_name%\'dan yedek seç (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Geri Yüklenecek Paketi Seçin:</string>
+ <string name="restore_enc_backup_hdr">Şifreli Yedek</string>
+ <string name="restore_dec_fail">Şifre yanlış, lütfen tekrar deneyin!</string>
+ <string name="del_backup_btn">Yedeği Sil</string>
+ <string name="del_backup_confirm">Yedek Silinsin Mi?</string>
+ <string name="del_backup_confirm2">Bu işlem geri alınamaz!</string>
+ <string name="deleting_backup">Yedek Siliniyor...</string>
+ <string name="backup_deleted">Yedek Silme Tamamlandı</string>
+ <string name="swipe_delete">Silmek için Kaydır</string>
+ <string name="swipe_delete_s"> Sil</string>
+ <string name="restore_try_decrypt">Şifreli Yedek - Çözülmeye Çalışılıyor</string>
+ <string name="restore_try_decrypt_s">Çözülmeye Çalışılıyor</string>
+ <string name="restore_backup_date">Yedek tarihi %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Geri Yüklenecek Bölümleri Seç:</string>
+ <string name="restore_enable_md5_chk">Yedek Dosyalarının MD5 Doğrulamasını Etkinleştir</string>
+ <string name="restore_complete">Geri Yükleme Tamamlandı</string>
+ <string name="swipe_restore">Geri Yüklemek için Kaydır</string>
+ <string name="swipe_restore_s"> Geri Yükle</string>
+ <string name="rename_backup_hdr">Yedeği Yeniden Adlandır</string>
+ <string name="rename_backup_confirm">Yedek Yeniden Adlandırılsın Mı?</string>
+ <string name="rename_backup_confirm2">Bu işlem geri alınamaz!</string>
+ <string name="renaming_backup">Yedek Yeniden Adlandırılıyor...</string>
+ <string name="rename_backup_complete">Yedek Yeniden Adlandırıldı</string>
+ <string name="swipe_to_rename">Yeniden Adlandırmak için Kaydır</string>
+ <string name="swipe_rename"> Yeniden Adlandır</string>
+ <string name="confirm_hdr">Onayla</string>
+ <string name="mount_hdr">Bağla</string>
+ <string name="mount_sel_part">Bağlanacak Bölümleri Seç:</string>
+ <string name="mount_sys_ro_chk">Sistem bölümünü salt okunur bağla</string>
+ <string name="mount_sys_ro_s_chk">System RO Bağla</string>
+ <string name="decrypt_data_btn">Veri Şifresini Çöz</string>
+ <string name="disable_mtp_btn">MTP\'yi Devre Dışı Bırak</string>
+ <string name="enable_mtp_btn">MTP\'yi Etkinleştir</string>
+ <string name="mount_usb_storage_btn">USB Depolamayı Bağla</string>
+ <string name="usb_storage_hdr">USB Depolama</string>
+ <string name="usb_stor_mnt1">USB Depolama Bağlandı</string>
+ <string name="usb_stor_mnt2">Çıkarmadan önce cihazınızı bilgisayarınızdan</string>
+ <string name="usb_stor_mnt3">güvenle çıkardığınızdan emin olun!</string>
+ <string name="unmount_btn">Çıkar</string>
+ <string name="rb_system_btn">Sistem</string>
+ <string name="rb_poweroff_btn">Kapat</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">İndir</string>
+ <string name="turning_off">Kapatılıyor...</string>
+ <string name="swipe_power_off">Kapatmak için Kaydır</string>
+ <string name="swipe_power_off_s">Kapat</string>
+ <string name="sys_ro_hdr">Değiştirilmemiş Sistem Bölümü</string>
+ <string name="sys_ro_keep">Sistem bölümü salt okunur kalsın mı?</string>
+ <string name="sys_rop1">TWRP resmi güncellemeleri almanızı kolaylaştırmak</string>
+ <string name="sys_rop2">için sistem bölümünüzü değiştirmeyebilir.</string>
+ <string name="sys_rop3">TWRP stock ROM\'un kendisini değiştirmesini</string>
+ <string name="sys_rop4">engelleyemeyecek ve cihazınızı rootlamanızı istemeyecek.</string>
+ <string name="sys_rop5">Zip yüklemek veya adb işlemleri gerçekleştirmek</string>
+ <string name="sys_rop6">sistem bölümünü değiştirebilir.</string>
+ <string name="sys_rol1">TWRP resmi güncellemeleri almanızı kolaylaştırmak için sistem bölümünüzü değiştirmeyebilir.</string>
+ <string name="sys_rol2">TWRP stock ROM\'un kendisini değiştirmesini engelleyemeyecek ve cihazınızı rootlamanızı istemeyecek.</string>
+ <string name="sys_rol3">Zip yüklemek veya adb işlemleri gerçekleştirmek sistem bölümünü değiştirebilir.</string>
+ <string name="sys_ro_never_show_chk">Bu ekranı açılış sırasında tekrar gösterme</string>
+ <string name="sys_ro_keep_ro_btn">Salt Okunur Bırak</string>
+ <string name="swipe_allow_mod">Değişikliklere İzin Vermek için Kaydır</string>
+ <string name="swipe_allow_mod_s">Değişikliklere İzin Ver</string>
+ <string name="settings_hdr">Ayarlar</string>
+ <string name="settings_gen_hdr">Genel</string>
+ <string name="settings_gen_s_hdr">Genel</string>
+ <string name="settings_gen_btn">Genel</string>
+ <string name="use_rmrf_chk">Biçimlendirme yerine rm -rf kullan</string>
+ <string name="use24clock_chk">24-saat biçimini kullan</string>
+ <string name="rev_navbar_chk">Tersine çevrilmiş gezinti çubuğu düzeni</string>
+ <string name="simact_chk">Tema testi için eylemleri canlandır</string>
+ <string name="simfail_chk">Eylemler canlandırılamadı</string>
+ <string name="ctr_navbar_rdo">Merkezi gezinti çubuğu düğmeleri</string>
+ <string name="lft_navbar_rdo">Gezinti çubuğu düğmelerini sola hizala</string>
+ <string name="rht_navbar_rdo">Gezinti çubuğu düğmelerini sağa hizala</string>
+ <string name="restore_defaults_btn">Varsayılanları Geri Yükle</string>
+ <string name="settings_tz_btn">Zaman Dilimi</string>
+ <string name="settings_screen_btn">Ekran</string>
+ <string name="settings_screen_bright_btn">Ekran Parlaklığı</string>
+ <string name="settings_vibration_btn">Titreşim</string>
+ <string name="settings_language_btn">Dil</string>
+ <string name="time_zone_hdr">Zaman Dilimi</string>
+ <string name="sel_tz_list">Zaman Dilimi Seç:</string>
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Central Time</string>
+ <string name="utcm5">(UTC -5) Eastern Time</string>
+ <string name="utcm4">(UTC -4) Atlantic Time</string>
+ <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string>
+ <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string>
+ <string name="utcp3">(UTC +3) Moscow, Baghdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Eastern Australia, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Ofset Seçin (Genellikle 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Hiçbiri</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Gün ışığından yararlanma saati (DST) kullan</string>
+ <string name="curr_tz">Geçerli Zaman Dilimi: %tw_time_zone%</string>
+ <string name="curr_tz_s">Geçerli Zaman Dilimi:</string>
+ <string name="set_tz_btn">Zaman Dilimini Ayarla</string>
+ <string name="settings_screen_hdr">Ekran</string>
+ <string name="settings_screen_timeout_hdr">Ekran Zaman Aşımı</string>
+ <string name="enable_timeout_chk">Ekran zaman aşımını etkinleştir</string>
+ <string name="screen_to_slider">Ekran zaman aşımı:</string>
+ <string name="screen_to_slider_s">Ekran zaman aşımı (0=devre dışı): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Ekran zaman aşımı ayarı kullanılabilir değil</string>
+ <string name="screen_bright_slider">Parlaklık: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Parlaklık ayarı kullanılabilir değil</string>
+ <string name="vibration_hdr">Titreşim</string>
+ <string name="button_vibration_hdr">Düğme Titireşimi</string>
+ <string name="kb_vibration_hdr">Klavye Titreşimi</string>
+ <string name="act_vibration_hdr">Eylem Titreşimi</string>
+ <string name="button_vibration">Düğme Titreşimi:</string>
+ <string name="kb_vibration">Klavye Titreşimi:</string>
+ <string name="act_vibration">Eylem Titreşimi:</string>
+ <string name="select_language">Dil Seç:</string>
+ <string name="sel_lang_btn">Dil Seç</string>
+ <string name="set_language_btn">Dili Ayarla</string>
+ <string name="advanced_hdr">Gelişmiş</string>
+ <string name="copy_log_confirm">Kayıt SD Karta Kopyalansın Mı?</string>
+ <string name="copying_log">Kayıt SD Karta Kopyalanıyor...</string>
+ <string name="copy_log_complete">Kayıt Kopyalama Tamamlandı</string>
+ <string name="part_sd_btn">SD Kartı Bölümle</string>
+ <string name="part_sd_s_btn">SD Kart</string>
+ <string name="file_manager_btn">Dosya Yöneticisi</string>
+ <string name="language_hdr">Dil</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Temayı Yeniden Yükle</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">TWRP Ekle</string>
+ <string name="inject_twrp_confirm">TWRP yeniden eklensin mi?</string>
+ <string name="injecting_twrp">TWRP yeniden ekleniyor...</string>
+ <string name="inject_twrp_complete">TWRP Ekleme Tamamlandı</string>
+ <string name="swipe_to_confirm">Onaylamak için Kaydır</string>
+ <string name="part_sd_hdr">SD Kartı Bölümle</string>
+ <string name="invalid_partsd_sel">Çıkarılabilir bir cihaz seçmelisiniz</string>
+ <string name="part_sd_lose">SD kartınız üzerindeki tüm dosyaları kaybedeceksiniz!</string>
+ <string name="part_sd_undo">Bu işlem geri alınamaz!</string>
+ <string name="part_sd_ext_sz">EXT Boyutu:</string>
+ <string name="part_sd_swap_sz">Swap Boyutu:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">Dosya Sistemi:</string>
+ <string name="swipe_part_sd">Bölümlemek için Kaydır</string>
+ <string name="swipe_part_sd_s">Bölümle</string>
+ <string name="partitioning_sd">SD Kart Bölümleniyor...</string>
+ <string name="partitioning_sd2">Bu işlem birkaç dakika sürecek.</string>
+ <string name="part_sd_complete">Bölümleme Tamamlandı</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Orijinal Boot\'u Geri Yükle</string>
+ <string name="dumlock_restore_confirm">Orijinal boot imajı geri yüklensin mi?</string>
+ <string name="dumlock_restoring">Orijinal Boot Geri Yükleniyor...</string>
+ <string name="dumlock_restore_complete">Orijinal Boot Geri Yüklemesi Tamamlandı</string>
+ <string name="dumlock_reflash_btn">Recovery\'i Yeniden Flashla</string>
+ <string name="dumlock_reflash_confirm">Cihazın açılması için kurtarma yazılımı tekrar yüklensin mi?</string>
+ <string name="dumlock_reflashing">Cihazın açılması için kurtarma yazılımı tekrar yükleniyor...</string>
+ <string name="dumlock_reflash_complete">Cihazın açılması için kurtarma yazılımı tekrar yükleme tamamlandı</string>
+ <string name="dumlock_install_btn">HTC Dumlock Yükle</string>
+ <string name="dumlock_install_confirm">HTC dumlock dosyaları ROM\'a yüklensin mi?</string>
+ <string name="dumlock_installing">HTC Dumlock Yükleniyor...</string>
+ <string name="dumlock_install_complete">HTC Dumlock Yüklemesi Tamamlandı</string>
+ <string name="swipe_to_unlock">Kilidi Açmak için Kaydır</string>
+ <string name="swipe_unlock"> Kilidi Aç</string>
+ <string name="fm_hdr">Dosya Yöneticisi</string>
+ <string name="fm_sel_file">Bir Dosya veya Klasör Seçin</string>
+ <string name="fm_type_folder">Klasör</string>
+ <string name="fm_type_file">Dosya</string>
+ <string name="fm_choose_act">Eylem Seçin</string>
+ <string name="fm_selected">%tw_fm_type% seçili:</string>
+ <string name="fm_copy_btn">Kopyala</string>
+ <string name="fm_copy_file_btn">Dosya Kopyala</string>
+ <string name="fm_copy_folder_btn">Klasör Kopyala</string>
+ <string name="fm_copying">Kopyalanıyor</string>
+ <string name="fm_move_btn">Taşı</string>
+ <string name="fm_moving">Taşınıyor</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Sil</string>
+ <string name="fm_deleting">Siliniyor</string>
+ <string name="fm_rename_btn">Yeniden Adlandır</string>
+ <string name="fm_rename_file_btn">Dosyayı Yeniden Adlandır</string>
+ <string name="fm_rename_folder_btn">Klasörü Yeniden Adlandır</string>
+ <string name="fm_renaming">Yeniden Adlandırılıyor</string>
+ <string name="fm_sel_dest">Hedef Klasörü Seçin</string>
+ <string name="fm_sel_curr_folder">Geçerli Klasörü Seç</string>
+ <string name="fm_rename_hdr">Yeniden Adlandır</string>
+ <string name="fm_set_perms_hdr">İzinleri Ayarla</string>
+ <string name="fm_perms">İzinler:</string>
+ <string name="fm_complete">Dosya İşlemi Tamamlandı</string>
+ <string name="decrypt_data_hdr">Veri Şifresini Çöz</string>
+ <string name="decrypt_data_enter_pass">Şifre Gir.</string>
+ <string name="decrypt_data_enter_pattern">Desen Girin.</string>
+ <string name="decrypt_data_trying">Şifre Çözülmeye Çalışılıyor</string>
+ <string name="term_hdr">Terminal Komutu</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">SONLANDIR</string>
+ <string name="term_sel_folder_hdr">Başlangıç Klasörüne Gözat</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Dalvik Önbelleğini Temizle</string>
+ <string name="sideload_wipe_cache_chk">Önbelleği Temizle</string>
+ <string name="swipe_to_sideload">Sideload\'u Başlatmak için Kaydır</string>
+ <string name="swipe_sideload"> Başlat</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Kullanım: adb sideload dosyaadı.zip</string>
+ <string name="sideload_complete">ADB Sideload Tamamlandı</string>
+ <string name="reboot_hdr">Yeniden Başlat</string>
+ <string name="su_hdr">SuperSU Denetimi</string>
+ <string name="su_note1">Cihazınız rootlanmamış görünüyor.</string>
+ <string name="su_note2">SuperSU şimdi yüklensin mi?</string>
+ <string name="su_note3">Bu işlem cihazınızı rootlayacaktır.</string>
+ <string name="su_cancel">Yükleme</string>
+ <string name="swipe_su_to_install">Yüklemek için Kaydır</string>
+ <string name="swipe_su_install"> Yükle</string>
+ <string name="su_installing">SuperSU Yükleniyor</string>
+ <string name="sel_storage_list">Depolama Seç</string>
+ <string name="ok_btn">Tamam</string>
+ <string name="no_kernel_selinux">Kernel SELinux içeriklerini okuma desteğine sahip değil.</string>
+ <string name="full_selinux">Tam SELinux desteği mevcut.</string>
+ <string name="no_selinux">SELinux desteği yok (libselinux yok).</string>
+ <string name="mtp_enabled">MTP Etkin</string>
+ <string name="mtp_crash">MTP Çöktü, açılışta başlatılmıyor.</string>
+ <string name="decrypt_success">Varsayılan şifre ile çözüldü.</string>
+ <string name="unable_to_decrypt">Varsayılan şifre ile çözülemedi. Veri Biçimlendirmesi yapmanız gerekebilir.</string>
+ <string name="generating_md51">MD5 Oluşturuluyor</string>
+ <string name="generating_md52"> * Md5 oluşturuluyor...</string>
+ <string name="md5_created"> * MD5 Oluşturuldu.</string>
+ <string name="md5_error"> * MD5 Hatası!</string>
+ <string name="md5_compute_error"> * MD5 hesaplama hatası.</string>
+ <string name="current_date">(Geçerli Tarih)</string>
+ <string name="auto_generate">(Otomatik Oluştur)</string>
+ <string name="unable_to_locate_partition">Yedekleme hesaplamaları için \'{1}\' bölümü bulunamıyor.</string>
+ <string name="no_partition_selected">Yedekleme için bölüm seçilmedi.</string>
+ <string name="total_partitions_backup"> * Toplam yedeklenecek bölüm sayısı: {1}</string>
+ <string name="total_backup_size"> * Toplam veri boyutu: {1}MB</string>
+ <string name="available_space"> * Kullanılabilir alan: {1}MB</string>
+ <string name="unable_locate_storage">Depolama aygıtı bulunamıyor.</string>
+ <string name="no_space">Yeteri kadar boş alan yok.</string>
+ <string name="backup_started">[YEDEKLEME BAŞLATILDI]</string>
+ <string name="backup_folder"> * Yedekleme Klasörü: {1}</string>
+ <string name="fail_backup_folder">Yedekleme klasörü oluşturulamadı.</string>
+ <string name="avg_backup_fs">Dosya sistemleri için ortalama yedekleme oranı: {1} MB/sec</string>
+ <string name="avg_backup_img">Görüntülü sürücüler için ortalama yedekleme hızı: {1} MB/sec</string>
+ <string name="total_backed_size">[{1} MB YEDEKLENDİ]</string>
+ <string name="backup_completed">[YEDEKLEME {1} SANİYEDE TAMAMLANDI]</string>
+ <string name="restore_started">[GERİ YÜKLEME BAŞLATILDI]</string>
+ <string name="restore_folder">Geri yükleme klasörü: \'{1}\'</string>
+ <string name="verifying_md5">MD5 Doğrulanıyor</string>
+ <string name="skip_md5">Kullanıcı ayarına göre MD5 denetimi geçiliyor.</string>
+ <string name="calc_restore">Geri yükleme ayrıntıları hesaplanıyor...</string>
+ <string name="restore_read_only">{1} geri yüklenemiyor -- salt okunur bağlanmış.</string>
+ <string name="restore_unable_locate">Geri yüklemek için \'{1}\' bölümü bulunamıyor.</string>
+ <string name="no_part_restore">Geri yüklemek için bölüm seçilmedi.</string>
+ <string name="restore_part_count">{1} bölüm geri yükleniyor...</string>
+ <string name="total_restore_size">Toplam geri yükleme boyutu {1}MB</string>
+ <string name="updating_system_details">Sistem Ayrıntıları Güncelleniyor</string>
+ <string name="restore_completed">[GERİ YÜKLEME {1} SANİYE İÇİNDE TAMAMLANDI]</string>
+ <string name="error_opening_strerr">Açma hatası: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">Bölüm yedek adına göre bulunamadı: \'{1}\'</string>
+ <string name="unable_find_part_path">\'{1}\' yolu için bölüm bulunamıyor</string>
+ <string name="update_part_details">Bölüm ayrıntıları güncelleniyor...</string>
+ <string name="update_part_details_done">...bitti</string>
+ <string name="wiping_dalvik">Dalvik Önbelleği Dizinleri Temizleniyor...</string>
+ <string name="cleaned">Temizlendi: {1}...</string>
+ <string name="dalvik_done">-- Dalvik Önbelleği Dizinleri Temizleme Tamamlandı!</string>
+ <string name="no_andsec">Android secure bölümü yok.</string>
+ <string name="unable_to_locate">{1} bulunamıyor.</string>
+ <string name="wiping_datamedia">Dahili depolama temizleniyor -- /veri/ortam...</string>
+ <string name="unable_to_mount">{1} bağlanamadı</string>
+ <string name="unable_to_mount_internal">Dahili depolama bağlanamadı</string>
+ <string name="unable_to_mount_storage">Depolama bağlanamadı</string>
+ <string name="fail_decrypt">Verilerin şifresi çözülemedi.</string>
+ <string name="no_crypto_support">Şifreleme desteği bu yapı içine derlenmemiştir.</string>
+ <string name="decrypt_success_dev">Veri başarıyla deşifre edildi, yeni blok aygıtı: \'{1}\'</string>
+ <string name="done">Bitti.</string>
+ <string name="start_partition_sd">SD Kart Bölümleniyor...</string>
+ <string name="partition_sd_locate">Bölümlenecek cihaz bulunamadı.</string>
+ <string name="ext_swap_size">EXT + Swap boyutu sd kart boyutundan daha büyük.</string>
+ <string name="remove_part_table">Bölüm tablosu kaldırılıyor...</string>
+ <string name="unable_rm_part">Bölüm tablosu kaldırılamadı.</string>
+ <string name="create_part">{1} bölümü oluşturuluyor...</string>
+ <string name="unable_to_create_part">{1} bölümü oluşturulamadı.</string>
+ <string name="format_sdext_as">Sd-ext, {1} olarak biçimlendiriliyor...</string>
+ <string name="part_complete">Bölümleme tamamlandı.</string>
+ <string name="unable_to_open">\'{1}\' açılamadı.</string>
+ <string name="mtp_already_enabled">MTP zaten etkin</string>
+ <string name="mtp_fail">MTP etkinleştirilemedi</string>
+ <string name="no_mtp">MTP desteği dahil değil</string>
+ <string name="image_flash_start">[İMAJ FLASHLAMA BAŞLATILDI]</string>
+ <string name="img_to_flash">Flashlanacak imaj: \'{1}\'</string>
+ <string name="flash_unable_locate">Flashlama için \'{1}\' bölümü bulunamıyor.</string>
+ <string name="no_part_flash">Flashlama için bölüm seçilmedi.</string>
+ <string name="too_many_flash">Flashlama için çok fazla bölüm seçildi.</string>
+ <string name="invalid_flash">Geçersiz flash bölümü belirtildi.</string>
+ <string name="flash_done">[İMAJ FLASHLAMA TAMAMLANDI]</string>
+ <string name="wiping">{1} temizleniyor</string>
+ <string name="repair_not_exist">{1} yok! Onarılamıyor!</string>
+ <string name="repairing_using">{2} kullanılarak {1} onarılıyor...</string>
+ <string name="unable_repair">{1} onarılamıyor.</string>
+ <string name="create_folder_strerr">\'{1}\' klasörü oluşturulamıyor ({2}).</string>
+ <string name="fail_mount">\'{1}\' bağlanamıyor ({2})</string>
+ <string name="fail_unmount">\'{1}\' çıkarılamıyor ({2})</string>
+ <string name="cannot_resize">{1} yeniden boyutlandırılamıyor.</string>
+ <string name="repair_resize">Yeniden boyutlandırmadan önce {1} onarılıyor.</string>
+ <string name="unable_resize">{1} yeniden boyutlandırılamıyor.</string>
+ <string name="formatting_using">{2} kullanılarak {1} biçimlendiriliyor...</string>
+ <string name="unable_to_wipe">{1} temizlenemiyor.</string>
+ <string name="cannot_wipe">{1} bölümü temizlenemiyor.</string>
+ <string name="remove_all">\'{1}\' altındaki tüm dosyalar kaldırılıyor</string>
+ <string name="wiping_data">/data/media temizlenmeden data temizleniyor ...</string>
+ <string name="backing_up">{1} yedekleniyor...</string>
+ <string name="backup_cancel">Yedekleme İptal Edildi</string>
+ </resources>
+</language> \ No newline at end of file
diff --git a/gui/theme/common/languages/uk.xml b/gui/theme/common/languages/uk.xml
new file mode 100644
index 000000000..c27f0683b
--- /dev/null
+++ b/gui/theme/common/languages/uk.xml
@@ -0,0 +1,681 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+
+<language>
+ <display>Українська</display>
+
+ <!-- Translated by Bukwaezhka and Jemmini, 2016 -->
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="90" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System Image</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Internal Storage</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted Storage</string>
+
+ <!-- GUI XML strings -->
+
+
+ <string name="cpu_temp">Процесор: %tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">Батарея: %tw_battery%</string>
+ <string name="sort_by_name">Сортувати за назвою</string>
+ <string name="sort_by_date">Сортувати по даті</string>
+ <string name="sort_by_size">Сортувати за розміром</string>
+ <string name="sort_by_name_only">Назва</string>
+ <string name="sort_by_date_only">Дата</string>
+ <string name="sort_by_size_only">Розмір</string>
+ <string name="tab_general">ЗАГАЛЬНІ</string>
+ <string name="tab_options">ПАРАМЕТРИ</string>
+ <string name="tab_backup">РЕЗЕРВУВАННЯ</string>
+ <string name="tab_time_zone">ЧАСОВИЙ ПОЯС</string>
+ <string name="tab_screen">ЕКРАН</string>
+ <string name="tab_vibration">ВІБРАЦІЯ</string>
+ <string name="tab_language">МОВА</string>
+ <string name="install_btn">Встановити</string>
+ <string name="wipe_btn">Витерти</string>
+ <string name="backup_btn">Резервувати</string>
+ <string name="restore_btn">Відновити</string>
+ <string name="mount_btn">Монтувати</string>
+ <string name="settings_btn">Налаштування</string>
+ <string name="advanced_btn">Додатково</string>
+ <string name="reboot_btn">Перезавантажити</string>
+ <string name="files_btn">Файли</string>
+ <string name="copy_log_btn">Копіювати Log</string>
+ <string name="select_type_hdr">Вибрати тип</string>
+ <string name="install_zip_hdr">Встановити Zip</string>
+ <string name="install_zip_btn">Встановити Zip</string>
+ <string name="install_image_hdr">Встановити Img-образ</string>
+ <string name="install_image_btn">Встановити Img</string>
+ <string name="install_select_file_hdr">Вибрати файл</string>
+ <string name="file_selector_folders_hdr">Папки</string>
+ <string name="select_file_from_storage">Виберіть файл з %tw_storage_display_name% (%tw_storage_free_size% МБ)</string>
+ <string name="adb_sideload_btn">ADB завантаження</string>
+ <string name="install_hdr">Встановлення</string>
+ <string name="select_storage_hdr">Обрати сховище</string>
+ <string name="select_storage_btn">Обрати сховище</string>
+ <string name="queue_hdr">Черга</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% з максимум 10 файлів у черзі</string>
+ <string name="zip_queue_count_s">Файл %tw_zip_queue_count% з 10:</string>
+ <string name="zip_warn1">Ця операція може встановити несумісні</string>
+ <string name="zip_warn2">файли і зламати прошивку.</string>
+ <string name="zip_back_cancel">Натисніть Назад, щоб скасувати додавання цього zip.</string>
+ <string name="zip_back_clear">Натисніть Назад, щоб очистити чергу.</string>
+ <string name="folder">Папка:</string>
+ <string name="file">Файл:</string>
+ <string name="zip_sig_chk">Перевірка підпису Zip</string>
+ <string name="install_reboot_chk">Автоматичне перезавантаження після встановлення</string>
+ <string name="inject_twrp_chk">Інтегрувати TWRP після встановлення</string>
+ <string name="options_hdr">Параметри</string>
+ <string name="confirm_flash_hdr">Підтвердити Прошивку</string>
+ <string name="zip_queue">Черга:</string>
+ <string name="options">Параметри:</string>
+ <string name="swipe_confirm"> Підтвердити</string>
+ <string name="zip_add_btn">Додати ще Zip</string>
+ <string name="zip_clear_btn">Очистити чергу Zip</string>
+ <string name="install_zip_count_hdr">Встановлення Zip %tw_zip_index% з %tw_zip_queue_count%</string>
+ <string name="installing_zip_xml">Встановлення Zip: %tw_file%</string>
+ <string name="failed">Не вдалося</string>
+ <string name="successful">Успішно</string>
+ <string name="install_failed">Помилка встановлення</string>
+ <string name="install_successful">Успішно встановлено</string>
+ <string name="wipe_cache_dalvik_btn">Очистка cache/dalvik</string>
+ <string name="reboot_system_btn">Завантажити систему</string>
+ <string name="install_sel_target">Вибір розділу</string>
+ <string name="flash_image_select">Виберіть разділ для прошивки образу:</string>
+ <string name="target_partition">Цільовий розділ:</string>
+ <string name="flashing_image">Прошивка образу...</string>
+ <string name="image_flashed">Прошивка образу завершена</string>
+ <string name="wipe_cache_dalvik_confirm">Очистити Cache &amp; Dalvik?</string>
+ <string name="wiping_cache_dalvik">Очищення Cache &amp; Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Очищення Cache &amp; Dalvik завершено</string>
+ <string name="swipe_wipe">Очистити</string>
+ <string name="swipe_wipe_s"> Очистка</string>
+ <string name="no_os1">Система не встановлена! Ви впевнені,</string>
+ <string name="no_osrb">що хочете перезавантажити?</string>
+ <string name="no_ospo">що хочете вимкнути?</string>
+ <string name="rebooting">Перезавантаження...</string>
+ <string name="swipe_reboot">Перезавантажити</string>
+ <string name="swipe_reboot_s"> Перезавантаження</string>
+ <string name="swipe_flash">Прошити</string>
+ <string name="confirm_action">Підтвердити</string>
+ <string name="back_cancel">Натисніть Назад щоб скасувати.</string>
+ <string name="cancel_btn">Скасувати</string>
+ <string name="wipe_hdr">Очистка</string>
+ <string name="factory_reset_hdr">Скинути до заводських налаштувань</string>
+ <string name="factory_reset_btn">Скинути налаштування</string>
+ <string name="factory_reset1">Очистка Data, Cache та Dalvik</string>
+ <string name="factory_reset2">(не включаючи внутрішню пам'ять)</string>
+ <string name="factory_reset3">У більшості випадків достатньо</string>
+ <string name="factory_reset4">очистити ці розділи.</string>
+ <string name="factory_resetting">Скидання до заводських налаштувань...</string>
+ <string name="advanced_wipe_hdr">Вибіркове очищення</string>
+ <string name="advanced_wipe_btn">Вибіркове очищення</string>
+ <string name="wipe_enc_confirm">Скинути Шифрування Data?</string>
+ <string name="formatting_data">Форматування Data...</string>
+ <string name="swipe_format_data">Форматувати Data</string>
+ <string name="swipe_format_data_s"> Форматування Data</string>
+ <string name="factory_reset_complete">Скидання до заводських налаштувань завершено</string>
+ <string name="sel_part_hdr">Вибір розділів</string>
+ <string name="wipe_sel_confirm">Очистити вибрані розділи?</string>
+ <string name="wiping_part">Очищення розділів...</string>
+ <string name="wipe_complete">Очищення завершено</string>
+ <string name="sel_part_wipe">Виберіть розділи для очищення:</string>
+ <string name="invalid_part_sel">Вибрано невірний розділ</string>
+ <string name="format_data_hdr">Форматувати Data</string>
+ <string name="format_data_btn">Форматувати Data</string>
+ <string name="format_data_ptr1">Форматування Data очистить всі ваші додатки,</string>
+ <string name="format_data_ptr2">резервні копії, фотографії, відео, медіафайли</string>
+ <string name="format_data_ptr3">та видалить шифровані файли з внутрішньої пам'яті.</string>
+ <string name="format_data_adopted">Включаючи пристосовану пам'ять</string>
+ <string name="format_data_lcp1">Форматування Data очистить всі ваші додатки, резервні копії, відео, медіафайли</string>
+ <string name="format_data_lcp2">та видалить шифровані файли з внутрішньої пам'яті.</string>
+ <string name="format_data_wtc1">Форматування Data очистить всі ваші додатки,</string>
+ <string name="format_data_wtc2">резервні копії та медіафайли. Скасування цього неможливе.</string>
+ <string name="format_data_undo">Скасування цього неможливе.</string>
+ <string name="format_data_complete">Форматування Data завершено</string>
+
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">Введіть yes щоб продовжити. Натисніть Назад щоб скасувати.</string>
+ <string name="part_opt_hdr">Параметри розділу %tw_partition_name%</string>
+ <string name="sel_act_hdr">Оберіть дію</string>
+ <string name="file_sys_opt">Параметри файлової системи</string>
+ <string name="partition">Розділ: %tw_partition_name%</string>
+ <string name="part_mount_point">Точка монтування: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">Файлова система: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Присутній: Так</string>
+ <string name="part_present_no">Присутній: Ні</string>
+ <string name="part_removable_yes">Знімний: так</string>
+ <string name="part_removable_no">Знімний: ні</string>
+ <string name="part_size">Розмір: %tw_partition_size%MБ</string>
+ <string name="part_used">Зайнято: %tw_partition_used%МБ</string>
+ <string name="part_free">Вільно: %tw_partition_free%МБ</string>
+ <string name="part_backup_size">Розмір РК: %tw_partition_backup_size%МБ</string>
+ <string name="resize_btn">Змінити розмір файлової системи</string>
+ <string name="resize_btn_s">Змінити розмір</string>
+ <string name="resize_confirm">Змінити розмір %tw_partition_name%?</string>
+ <string name="resizing">Зміна розміру...</string>
+ <string name="resize_complete">Зміна розміру завершена</string>
+ <string name="swipe_resize">Змінити</string>
+ <string name="swipe_resize_s"> Зміна розміру</string>
+ <string name="repair_btn">Відновити файлову систему</string>
+ <string name="repair_btn_s">Відновити</string>
+ <string name="repair_confirm">Відновити %tw_partition_name%?</string>
+ <string name="repairing">Відновлення...</string>
+ <string name="repair_complete">Відновлення завершено</string>
+ <string name="swipe_repair">Відновити</string>
+ <string name="swipe_repair_s"> Відновлення</string>
+ <string name="change_fs_btn">Змінити файлову систему</string>
+ <string name="change_fs_btn_s">Змінити</string>
+ <string name="change_fs_for_hdr">Змінити файлову систему для: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Розділ: %tw_partition_name% &gt; виберіть файлову систему</string>
+ <string name="change_fs_warn1">Деякі прошивки або ядра можуть не підтримувати деякі</string>
+ <string name="change_fs_warn2">файлові системи. Користуйтесь обережно!</string>
+ <string name="change_fs_confirm">Змінити %tw_partition_name%?</string>
+ <string name="formatting">Форматування...</string>
+ <string name="format_complete">Форматування Завершено</string>
+ <string name="swipe_change_fs">Змінити</string>
+ <string name="swipe_change_s"> Зміна</string>
+ <string name="back_btn">Назад</string>
+ <string name="wipe_enc_btn">Стерти Шифрування</string>
+ <string name="swipe_factory_reset">Скинути</string>
+ <string name="repair_change_btn">Відновити або змінити Файлову Систему</string>
+ <string name="storage_hdr">Сховище: (%tw_storage_display_name% МБ)</string>
+ <string name="backup_hdr">Резервне копіювання</string>
+ <string name="backup_confirm_hdr">Підтвердження Резервування</string>
+ <string name="encryption_tab">ШИФРУВАННЯ</string>
+ <string name="encryption">Шифрування:</string>
+ <string name="name">Ім’я:</string>
+ <string name="sel_part_backup">Вибрати Розділ для Резервування:</string>
+ <string name="storage">Сховище:</string>
+ <string name="enc_disabled">вимкнено - встановіть пароль</string>
+ <string name="enc_enabled">увімкнено</string>
+ <string name="enable_backup_comp_chk">Увімкнути стискання</string>
+ <string name="skip_md5_backup_chk">Пропустити генерацію MD5 під час Резервного Копіювання</string>
+ <string name="disable_backup_space_chk">Вимкнути перевірку вільного місця</string>
+ <string name="refresh_sizes_btn">Оновити розміри</string>
+ <string name="swipe_backup">Резервувати</string>
+ <string name="append_date_btn">Додати дату</string>
+ <string name="backup_name_exists">Резервна копія з такою назвою вже існує!</string>
+ <string name="encrypt_backup">Шифрувати резервну копію?</string>
+ <string name="enter_pass">Введіть пароль:</string>
+ <string name="enter_pass2">Введіть пароль ще раз:</string>
+ <string name="pass_not_match">Паролі не співпадають!</string>
+ <string name="partitions">Розділи:</string>
+ <string name="disabled">Вимкнено</string>
+ <string name="enabled">Увімкнено</string>
+ <string name="backup_name_hdr">Введіть назву для Резервної копії</string>
+ <string name="progress">Прогрес:</string>
+ <string name="backup_complete">Резервне копіювання завершено</string>
+ <string name="restore_hdr">Відновити</string>
+ <string name="sel_backup_hdr">Виберіть резервну копію</string>
+ <string name="restore_sel_store_hdr">Оберіть резервну копію з %tw_storage_display_name% (%tw_storage_free_size% МБ)</string>
+ <string name="restore_sel_pack_fs">Виберіть пакунок для відновлення:</string>
+ <string name="restore_enc_backup_hdr">Зашифрована Резервна копія</string>
+ <string name="restore_dec_fail">Неправильний пароль, будь ласка, спробуйте ще раз!</string>
+ <string name="del_backup_btn">Видалити резервну копію</string>
+ <string name="del_backup_confirm">Видалити резервну копію?</string>
+ <string name="del_backup_confirm2">Це неможливо скасувати!</string>
+ <string name="deleting_backup">Видалення резервної копії...</string>
+ <string name="backup_deleted">Видалення резервної копії завершено</string>
+ <string name="swipe_delete">Видалити</string>
+ <string name="swipe_delete_s"> Видалення</string>
+ <string name="restore_try_decrypt">Шифрована Резервна копія - спроба дешифрувати</string>
+ <string name="restore_try_decrypt_s">Спроба дешифрувати</string>
+ <string name="restore_backup_date">Резервна копія створена: %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Виберіть розділ для відновлення:</string>
+ <string name="restore_enable_md5_chk">Увімкнути перевірку MD5 для файлів резервних копій</string>
+ <string name="restore_complete">Відновлення завершено</string>
+ <string name="swipe_restore">Відновити</string>
+ <string name="swipe_restore_s"> Відновлення</string>
+ <string name="rename_backup_hdr">Перейменування резервної копії</string>
+ <string name="rename_backup_confirm">Перейменувати резервну копію?</string>
+ <string name="rename_backup_confirm2">Це неможливо скасувати!</string>
+ <string name="renaming_backup">Перейменування резервної копії...</string>
+ <string name="rename_backup_complete">Перейменування резервної копії завершено</string>
+ <string name="swipe_to_rename">Перейменувати</string>
+ <string name="swipe_rename"> Перейменування</string>
+ <string name="confirm_hdr">Підтвердити</string>
+ <string name="mount_hdr">Монтувати</string>
+ <string name="mount_sel_part">Виберіть розділи для монтування:</string>
+ <string name="mount_sys_ro_chk">Системний розділ тільки для читання</string>
+ <string name="mount_sys_ro_s_chk"> Система RO</string>
+ <string name="decrypt_data_btn">Розшифрувати Data</string>
+ <string name="disable_mtp_btn">Вимкнути MTP</string>
+ <string name="enable_mtp_btn">Увімкнути MTP</string>
+ <string name="mount_usb_storage_btn">Змонтувати USB</string>
+ <string name="usb_storage_hdr">USB накопичувач</string>
+ <string name="usb_stor_mnt1">USB накопичувач змонтований</string>
+ <string name="usb_stor_mnt2">Для безпечного від'єднання вашого пристрою</string>
+ <string name="usb_stor_mnt3">від компьютера виконайте розмонтування!</string>
+ <string name="unmount_btn">Розмонтувати</string>
+ <string name="rb_system_btn">Система</string>
+ <string name="rb_poweroff_btn">Вимкнення</string>
+ <string name="rb_recovery_btn">Рекавері</string>
+ <string name="rb_bootloader_btn">Завантажувач</string>
+ <string name="rb_download_btn">Режим завантаження</string>
+ <string name="turning_off">Вимкнення...</string>
+ <string name="swipe_power_off">Вимкнути</string>
+ <string name="swipe_power_off_s">Вимкнення</string>
+ <string name="sys_ro_hdr">Модифікація системного розділу</string>
+ <string name="sys_ro_keep">Залишити System тільки для читання?</string>
+ <string name="sys_rop1">TWRP може залишити системний розділ незмінним,</string>
+ <string name="sys_rop2">щоб зберегти можливість отримання офіційних оновлень.</string>
+ <string name="sys_rop3">TWRP не зможе попередити перезапис рекавері офіційною прошивкою </string>
+ <string name="sys_rop4">та не буде пропонувати отримати привілеї суперкористувача.</string>
+ <string name="sys_rop5">Встановлення zip та робота через adb зможе</string>
+ <string name="sys_rop6">модифікувати системний розділ.</string>
+ <string name="sys_rol1">TWRP може залишити системний розділ незмінним, щоб зберегти можливість отримання офіційних оновлень.</string>
+ <string name="sys_rol2">TWRP не зможе попредити перезапис рекавері офіційною прошивкою та не буде пропонувати отримати привілеї суперкористувача.</string>
+ <string name="sys_rol3">Встановлення zip та робота через adb зможе модифікувати системний розділ.</string>
+ <string name="sys_ro_never_show_chk">Більше не показувати при завантаженні</string>
+ <string name="sys_ro_keep_ro_btn">Тільки читання</string>
+ <string name="swipe_allow_mod">Дозволити зміни</string>
+ <string name="swipe_allow_mod_s">Дозволити зміни</string>
+ <string name="settings_hdr">Налаштування</string>
+ <string name="settings_gen_hdr">Загальні</string>
+ <string name="settings_gen_s_hdr">Загальні</string>
+ <string name="settings_gen_btn">Загальні</string>
+ <string name="use_rmrf_chk">Використовувати rm -rf замість форматування</string>
+ <string name="use24clock_chk">Використовувати 24-часовий годинник</string>
+ <string name="rev_navbar_chk">Віддзеркалити навігаційні клавіші</string>
+ <string name="simact_chk">Імітувати дії для тестування теми</string>
+ <string name="simfail_chk">Імітація відмови для дій</string>
+ <string name="ctr_navbar_rdo">Навігаційні кнопки по центру</string>
+ <string name="lft_navbar_rdo">Навігаційні кнопки зліва</string>
+ <string name="rht_navbar_rdo">Навігаційні кнопки зправа</string>
+ <string name="restore_defaults_btn">За замовчуванням</string>
+ <string name="settings_tz_btn">Часовий пояс</string>
+ <string name="settings_screen_btn">Екран</string>
+ <string name="settings_screen_bright_btn">Яскравість екрану</string>
+ <string name="settings_vibration_btn">Вібрація</string>
+ <string name="settings_language_btn">Мова</string>
+ <string name="time_zone_hdr">Часовий пояс</string>
+ <string name="sel_tz_list">Виберіть часовий пояс:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) о. Мидуей, Самоа</string>
+ <string name="utcm10">(UTC -10) Гаваї</string>
+ <string name="utcm9">(UTC -9) Аляска</string>
+ <string name="utcm8">(UTC -8) Тихоокеанський часовий пояс</string>
+ <string name="utcm7">(UTC -7) Гірський час (США і Канада), Аризона</string>
+ <string name="utcm6">(UTC -6) Центральний час (США і Канада), Центральна Америка</string>
+ <string name="utcm5">(UTC -5) Східний час (США і Канада), Індіана (схід)</string>
+ <string name="utcm4">(UTC -4) Атлантичний час (Канада), Каракас</string>
+ <string name="utcm3">(UTC -3) Бразилія, Буенос-Айрес</string>
+ <string name="utcm2">(UTC -2) Середньоатлантичний час</string>
+ <string name="utcm1">(UTC -1) Азорські о-ва, о-ва Зеленого мису</string>
+ <string name="utc0">(UTC 0) Лондон, Дублін, Лісабон</string>
+ <string name="utcp1">(UTC +1) Берлін, Брюсель, Париж</string>
+ <string name="utcp2">(UTC +2) Київ, Мінськ, Рига, Талін, Стамбул</string>
+ <string name="utcp3">(UTC +3) Москва, Санкт-Петербург, Волгоград, Багдад</string>
+ <string name="utcp4">(UTC +4) Баку, Ереван, Тбілісі, Абу-Дабі, Мускат</string>
+ <string name="utcp5">(UTC +5) Ташкент, Ісламабад, Карачі</string>
+ <string name="utcp6">(UTC +6) Алмати, Астана, Дхака, Катеринбург</string>
+ <string name="utcp7">(UTC +7) Омськ, Новосибірськ, Бангкок, Джакарта, Ханой</string>
+ <string name="utcp8">(UTC +8) Красноярськ, Пекін, Улан-Батор, Іркутськ</string>
+ <string name="utcp9">(UTC +9) Осака, Саппоро, Токіо, Сеул, Якутськ</string>
+ <string name="utcp10">(UTC +10) Гуам, Канберра, Мельбурн, Сідней</string>
+ <string name="utcp11">(UTC +11) Владивосток, Сахалін, Соломоновы о-ва</string>
+ <string name="utcp12">(UTC +12) Магадан, Камчатка, Фіджи, Маршалови о-ва</string>
+ <string name="sel_tz_offset">Вибір зміщення (як правило 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">Немає</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Використовувати літній час (DST)</string>
+ <string name="curr_tz">Часовий пояс: %tw_time_zone%</string>
+ <string name="curr_tz_s">Часовий пояс:</string>
+ <string name="set_tz_btn">Встановити часовий пояс</string>
+ <string name="settings_screen_hdr">Екран</string>
+ <string name="settings_screen_timeout_hdr">Таймаут екрану</string>
+ <string name="enable_timeout_chk">Увімкнути таймаут екрану</string>
+ <string name="screen_to_slider">Таймаут екрану, сек:</string>
+ <string name="screen_to_slider_s">Таймаут екрану через, сек(0=вимкнений): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Налаштування таймаута екрану недоступне</string>
+ <string name="screen_bright_slider">Яскравість: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Налаштування яскравості недоступні</string>
+ <string name="vibration_hdr">Вібрація</string>
+ <string name="button_vibration_hdr">Натискання клавіш</string>
+ <string name="kb_vibration_hdr">Клавіатури</string>
+ <string name="act_vibration_hdr">При виборі дій</string>
+ <string name="button_vibration">Натискання клавіш:</string>
+ <string name="kb_vibration">Клавіатури:</string>
+ <string name="act_vibration">При виборі дій:</string>
+ <string name="select_language">Вибір мови:</string>
+ <string name="sel_lang_btn">Вибір мови</string>
+ <string name="set_language_btn">Встановити мову</string>
+ <string name="advanced_hdr">Додатково</string>
+ <string name="copy_log_confirm">Копіювати лог SD?</string>
+ <string name="copying_log">Копіювання логу на SD...</string>
+ <string name="copy_log_complete">Копіювання логу завершено</string>
+ <string name="fix_context_btn">Виправити контексти</string>
+ <string name="part_sd_btn">Розмітка SD Card</string>
+ <string name="part_sd_s_btn">SD Card</string>
+ <string name="file_manager_btn">Файл менеджер</string>
+ <string name="language_hdr">Мова</string>
+ <string name="terminal_btn">Термінал</string>
+ <string name="reload_theme_btn">Завантажити тему</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Інтегрувати TWRP</string>
+ <string name="inject_twrp_confirm">Інтегрувати TWRP наново?</string>
+ <string name="injecting_twrp">Інтегрування TWRP...</string>
+ <string name="inject_twrp_complete">Інтегрування TWRP завершено</string>
+ <string name="swipe_to_confirm">Підтвердити</string>
+ <string name="part_sd_hdr">Розмітка SD Card</string>
+ <string name="invalid_partsd_sel">Виберіть знімний пристрій</string>
+ <string name="part_sd_lose">Всі ваші файли на SD карті будуть стерті!</string>
+ <string name="part_sd_undo">Це буде неможливо скасувати!</string>
+ <string name="part_sd_ext_sz">EXT розмір:</string>
+ <string name="part_sd_swap_sz">Swap розмір:</string>
+
+
+ <string name="file_system">Файлова система:</string>
+ <string name="swipe_part_sd">Розмітити</string>
+ <string name="swipe_part_sd_s">Розмітка</string>
+ <string name="partitioning_sd">Розмітка SD карти...</string>
+ <string name="partitioning_sd2">Це може зайняти кілька хвилин.</string>
+ <string name="part_sd_complete">Розмітка завершена</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Відновлення оригінального Boot</string>
+ <string name="dumlock_restore_confirm">Відновити оригінальний образ Boot?</string>
+ <string name="dumlock_restoring">Відновлення оригінального Boot...</string>
+ <string name="dumlock_restore_complete">Відновлення оригінального Boot завершено</string>
+ <string name="dumlock_reflash_btn">Перепрошивка Recovery</string>
+ <string name="dumlock_reflash_confirm">Прошити recovery в boot?</string>
+ <string name="dumlock_reflashing">Прошивка recovery в boot...</string>
+ <string name="dumlock_reflash_complete">Прошивка recovery в boot завершена</string>
+ <string name="dumlock_install_btn">Встановлення HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Встановити HTC dumlock до прошивки?</string>
+ <string name="dumlock_installing">Встановлення HTC Dumlock...</string>
+ <string name="dumlock_install_complete">Встановлення HTC Dumlock завершено</string>
+ <string name="swipe_to_unlock">Розблокувати</string>
+ <string name="swipe_unlock"> Разблокування</string>
+ <string name="fm_hdr">Файловий менеджер</string>
+ <string name="fm_sel_file">Вибір Файла або Папки</string>
+ <string name="fm_type_folder">Папка</string>
+ <string name="fm_type_file">Файл</string>
+ <string name="fm_choose_act">Вибір дії</string>
+ <string name="fm_selected">%tw_fm_type% обрано:</string>
+ <string name="fm_copy_btn">Копіювати</string>
+ <string name="fm_copy_file_btn">Копіювати Файл</string>
+ <string name="fm_copy_folder_btn">Копіювати Папку</string>
+ <string name="fm_copying">Копіювання</string>
+ <string name="fm_move_btn">Перемістити</string>
+ <string name="fm_moving">Переміщення</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Видалити</string>
+ <string name="fm_deleting">Видалення</string>
+ <string name="fm_rename_btn">Перейменувати</string>
+ <string name="fm_rename_file_btn">Перейменувати Файл</string>
+ <string name="fm_rename_folder_btn">Перейменувати Папку</string>
+ <string name="fm_renaming">Перейменування</string>
+ <string name="fm_sel_dest">Обрати цільову Папку</string>
+ <string name="fm_sel_curr_folder">Обрати поточну Папку</string>
+ <string name="fm_rename_hdr">Перейменувати</string>
+ <string name="fm_set_perms_hdr">Встановити дозволи</string>
+ <string name="fm_perms">Дозволи:</string>
+ <string name="fm_complete">Операція завершена</string>
+ <string name="decrypt_data_hdr">Розшифрувати Data</string>
+ <string name="decrypt_data_enter_pass">Введіть пароль.</string>
+ <string name="decrypt_data_failed">Пароль неправильний, спробуйте ще!</string>
+ <string name="decrypt_data_failed_pattern">Шаблон неправильний, спробуйте ще!</string>
+ <string name="decrypt_data_enter_pattern">Введіть шаблон</string>
+ <string name="decrypt_data_trying">Спроба розшифровки</string>
+ <string name="term_hdr">Команди терміналу</string>
+ <string name="term_s_hdr">Термінал</string>
+ <string name="term_kill_btn">ВБИТИ</string>
+ <string name="term_sel_folder_hdr">Перейти до початкової папки</string>
+ <string name="adb_sideload_hdr">ADB завантаження</string>
+ <string name="sideload_wipe_dalvik_chk">Очистка Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Очистка Cache</string>
+ <string name="swipe_to_sideload">Почати завантаження</string>
+ <string name="swipe_sideload"> Почати</string>
+ <string name="sideload_confirm">ADB завантаження</string>
+ <string name="sideload_usage">Приклад: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB завантаження завершено</string>
+ <string name="fix_contexts_hdr">Виправлення контекста SELinux</string>
+ <string name="fix_contexts_note1">Примітка: Виправлення контексту рідко потребується.</string>
+ <string name="fix_contexts_note2">Виправлення SELinux контексту може призвести</string>
+ <string name="fix_contexts_note3">до того, що система не запуститься.</string>
+ <string name="swipe_to_fix_contexts">Виправити контексти</string>
+ <string name="swipe_fix_contexts"> Виправлення контексту</string>
+ <string name="fixing_contexts">Виправлення контексту...</string>
+ <string name="fix_contexts_complete">Виправлення контексту завершено</string>
+ <string name="reboot_hdr">Перезавантаження</string>
+ <string name="su_hdr">Перевірити SuperSU</string>
+ <string name="su_note1">Пристрій не має рут.</string>
+ <string name="su_note2">Встановити SuperSU зараз?</string>
+ <string name="su_note3">Пристрій буде рутовано.</string>
+ <string name="su_cancel">Не встановлювати</string>
+ <string name="swipe_su_to_install">Встановити</string>
+ <string name="swipe_su_install"> Встановлення</string>
+ <string name="su_installing">Встановлення SuperSU</string>
+ <string name="sel_storage_list">Вибір сховища</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Ядро не підтримує читання SELinux контексту.</string>
+ <string name="full_selinux">Присутня повна підтримка SELinux.</string>
+ <string name="no_selinux">Відсутня підтримка SELinux (немає libselinux).</string>
+ <string name="mtp_enabled">MTP Увімкнено</string>
+ <string name="mtp_crash">Збій MTP: MTP не запущений при завантаженні.</string>
+ <string name="decrypt_success">Розшифровка виконана успішно з паролем за замовчуванням.</string>
+ <string name="unable_to_decrypt">Неможливо розшифрувати з паролем за замовчуванням. Можливо буде потрібно форматувати Data.</string>
+ <string name="generating_md51">Генерація MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Генерація MD5...</string>
+ <string name="md5_created"> * MD5 сгенеровано.</string>
+ <string name="md5_error"> * MD5 Помилка!</string>
+ <string name="md5_compute_error"> * Помилка розрахунку MD5.</string>
+ <string name="current_date">(Поточна дата)</string>
+ <string name="auto_generate">(автогенерація)</string>
+ <string name="unable_to_locate_partition">Не вдається знайти '{1}' розділ для розрахунку копіювання.</string>
+ <string name="no_partition_selected">Не обрані розділи для резервного копіювання.</string>
+ <string name="total_partitions_backup"> * Загальна кількість розділів для резервного копіювання: {1}</string>
+ <string name="total_backup_size"> * Загальний об'єм даних: {1}MБ</string>
+ <string name="available_space"> * Доступний об'єм: {1}MБ</string>
+ <string name="unable_locate_storage">Не вдається знайти сховище для зберігання.</string>
+ <string name="no_space">У сховищі недостатньо місця.</string>
+ <string name="backup_started">[РОЗПОЧАТО РЕЗЕРВНЕ КОПІЮВАННЯ]</string>
+ <string name="backup_folder"> * Папка для резервної копії: {1}</string>
+ <string name="fail_backup_folder">Невдається створити папку для резервної копії.</string>
+ <string name="avg_backup_fs">Середня швидкість копіювання файлів: {1} МБ/сек</string>
+ <string name="avg_backup_img">Середня швидкість копіювання образів: {1} МБ/сек</string>
+ <string name="total_backed_size">[{1} MБ ВСЬОГО ЗАРЕЗЕРВОВАНО]</string>
+ <string name="backup_completed">[КОПІЮВАННЯ ВИКОНАНО ЗА {1} СЕКУНД(И)]</string>
+ <string name="restore_started">[ВІДНОВЛЕННЯ РОЗПОЧАТО]</string>
+ <string name="restore_folder">Папка відновлення: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} завершено за {2} секунд(и)]</string>
+ <string name="verifying_md5">Перевірка MD5</string>
+ <string name="skip_md5">Пропуск перевірки MD5 згідно системним налаштуванням.</string>
+ <string name="calc_restore">Розрахування інформації о відновленні...</string>
+ <string name="restore_read_only">Неможливо відновити {1} -- змонтовано тільки для читання.</string>
+ <string name="restore_unable_locate">Невдається знайти розділ '{1}' для відновлення.</string>
+ <string name="no_part_restore">Не обрані розділи для відновлення.</string>
+ <string name="restore_part_count">Відновлення розділу {1} ...</string>
+ <string name="total_restore_size">Загальний обсяг відновлення {1}MБ</string>
+ <string name="updating_system_details">Оновлення інформації о системі</string>
+ <string name="restore_completed">[ВІДНОВЛЕННЯ ЗАВЕРШЕНО ЗА {1} СЕКУНД(И)]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Помилка відкриття: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Невдається знайти розділ для копії: '{1}'</string>
+ <string name="unable_find_part_path">Невдається знайти розділ за шляхом '{1}'</string>
+ <string name="update_part_details">Оновлення інформації о розділах...</string>
+ <string name="update_part_details_done">...готово</string>
+ <string name="wiping_dalvik">Очищення директорій Dalvik Cache...</string>
+ <string name="cleaned">Очищено: {1}...</string>
+ <string name="dalvik_done">-- Очищення директорій Dalvik Cache завершено!</string>
+ <string name="no_andsec">Розділи android secure не знайдені.</string>
+ <string name="unable_to_locate">Не знайдено {1}.</string>
+ <string name="wiping_datamedia">Очищення внутрішньої пам'яті -- /data/media...</string>
+ <string name="unable_to_mount">Не вдається змонтувати {1}</string>
+ <string name="unable_to_mount_internal">Не вдається змонтувати internal_storage</string>
+ <string name="unable_to_mount_storage">Не вдається змонтувати storage</string>
+ <string name="fail_decrypt">Не вдається розшифрувати data.</string>
+ <string name="no_crypto_support">Шифрування не підтримується у цій версії.</string>
+ <string name="decrypt_success_dev">Data успішно розшифрований, новий блочний пристрій: '{1}'</string>
+ <string name="done">Готово.</string>
+ <string name="start_partition_sd">Розмітка SD Card...</string>
+ <string name="partition_sd_locate">Не вдалось знайти пристрій для розмітки.</string>
+ <string name="ext_swap_size">Розмір EXT + Swap перевищує розмір sdcard.</string>
+ <string name="remove_part_table">Видалення таблиці розділів...</string>
+ <string name="unable_rm_part">Не вдалось видалити таблицю розділів.</string>
+ <string name="create_part">Створення розділу {1} ...</string>
+ <string name="unable_to_create_part">Не вдалось створити розділ {1} .</string>
+ <string name="format_sdext_as">Форматування sd-ext у {1}...</string>
+ <string name="part_complete">Розмітка завершена.</string>
+ <string name="unable_to_open">Не вдалось відкрити '{1}'.</string>
+ <string name="mtp_already_enabled">MTP вже увімкнуто</string>
+ <string name="mtp_fail">Не вдалося увімкнути MTP</string>
+ <string name="no_mtp">Підтримка MTP відсутня</string>
+ <string name="image_flash_start">[РОЗПОЧАТО ПРОШИВКУ ОБРАЗУ]</string>
+ <string name="img_to_flash">Образ для прошивки: '{1}'</string>
+ <string name="flash_unable_locate">Не вдається знайти розділ '{1}' для прошивки.</string>
+ <string name="no_part_flash">Не обрані розділи для прошивки.</string>
+ <string name="too_many_flash">Забагато розділів для прошивки.</string>
+ <string name="invalid_flash">Вказан хибний розділ для прошивки.</string>
+ <string name="flash_done">[ПРОШИВКУ РОЗДІЛУ ЗАВЕРШЕНО]</string>
+ <string name="wiping">Очистка {1}</string>
+ <string name="repair_not_exist">{1} не існує! Неможливо відновити!</string>
+ <string name="repairing_using">Відновлення {1} з використанням {2}...</string>
+ <string name="unable_repair">Неможливо відновити {1}.</string>
+ <string name="mount_data_footer">Не вдалось змонтувати /data, не знайдено крипто-ключ.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Не вдалось створити папку '{1}' ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Не вдалось змонтувати '{1}' ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">Не вдалось розмонтувати '{1}' ({2})</string>
+ <string name="cannot_resize">Не вдалось розмітити {1}.</string>
+ <string name="repair_resize">Відновлення {1} перед розміткою.</string>
+ <string name="unable_resize">Не вдалось розмітити {1}.</string>
+ <string name="no_md5_found">Відсутній файл md5 для '{1}'. Будь ласка зніміть вибір з перевірки MD5 при відновленні.</string>
+ <string name="md5_fail_match">MD5 не співпадає для '{1}'.</string>
+ <string name="fail_decrypt_tar">Не вдалось розшифрувати tar-файл '{1}'</string>
+ <string name="format_data_msg">Можливо вам доведеться перезавантажити рекавері, щоб мати можливість доступу до /data знову.</string>
+ <string name="format_data_err">Неможливо відформатувати, щоб видалити шифрування.</string>
+ <string name="formatting_using">Форматування {1} з використанням {2}...</string>
+ <string name="unable_to_wipe">Неможливо очистити {1}.</string>
+ <string name="cannot_wipe">Розділ {1} не може бути очищений.</string>
+ <string name="remove_all">Видалення всіх файлів з '{1}'</string>
+ <string name="wiping_data">Очистка data без очистки /data/media ...</string>
+ <string name="backing_up">Резервування {1}...</string>
+ <string name="backing">Резервне копіювання</string>
+ <string name="backup_size">Розмір файлу резервної копії для '{1}' 0 байт.</string>
+ <string name="datamedia_fs_restore">УВАГА: Ця резервна копія /data була зроблена з файловою системою {1}! Резервна копія може не завантажитись, якщо ви не повернетесь на {1}.</string>
+ <string name="restoring">Відновлення {1}...</string>
+ <string name="restoring_hdr">Відновлення</string>
+ <string name="recreate_folder_err">Неможливо створити папку {1} наново.</string>
+ <string name="img_size_err">Розмір образу більший за цільовий пристрій</string>
+ <string name="flashing">Прошивка {1}...</string>
+ <string name="backup_folder_set">Для резервного копіювавння встановлена папка '{1}'</string>
+ <string name="locate_backup_err">Не вдається знайти резервну копію '{1}'</string>
+ <string name="set_restore_opt">Установки опцій відновлення: '{1}':</string>
+ <string name="md5_check_skip">Пропуск перевірки MD5 увімкнено</string>
+ <string name="ors_encrypt_restore_err">Не вдалось використати OpenRecoveryScript для відновлення зашифрованої резервної копії.</string>
+ <string name="mounting">Монтування</string>
+ <string name="unmounting">Розмонтування</string>
+ <string name="mounted">Змонтовано '{1}'</string>
+ <string name="unmounted">Розмонтоване '{1}'</string>
+ <string name="setting">Установка '{1}' у '{2}'</string>
+ <string name="setting_empty">Установка '{1}' в нікуди</string>
+ <string name="making_dir1">Створення директорії</string>
+ <string name="making_dir2">Створення директорії: '{1}'</string>
+ <string name="running_command">Запуск команди</string>
+ <string name="sideload">ADB завантаження</string>
+ <string name="start_sideload">Запуск ADB завантаження...</string>
+ <string name="need_new_adb">Вам необхідний adb 1.0.32 чи новіший для завантаження цього пристрою.</string>
+ <string name="no_pwd">Пароль не надано.</string>
+ <string name="done_ors">Завершено виконання файлу сценарію</string>
+ <string name="injecttwrp">Введення TWRP до образу boot...</string>
+ <string name="zip_err">Помилка встановлення zip файлу '{1}'</string>
+ <string name="installing_zip">Встановлення zip файлу '{1}'</string>
+ <string name="select_backup_opt">Налаштування резервного копіювання:</string>
+ <string name="compression_on">Стискання увімкнено</string>
+ <string name="md5_off">Генерація MD5 вимкнена</string>
+ <string name="backup_fail">Помилка резервного копіювання</string>
+ <string name="backup_clean">Помилка резервного копіювання. Очистка папки резервного копіювання.</string>
+ <string name="running_recovery_commands">Запуск команд Recovery</string>
+ <string name="recovery_commands_complete">Команди Recovery виконані</string>
+ <string name="running_ors">Виконання OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript виконано</string>
+ <string name="no_updater_binary">Не вдається знайти '{1}' у zip файлі.</string>
+ <string name="check_for_md5">Перевіка MD5 файлу...</string>
+
+ <string name="verify_zip_sig">Перевірка підпису zip...</string>
+ <string name="verify_zip_fail">Підпис Zip не пройшов перевірку!</string>
+ <string name="verify_zip_done">Підпис Zip успішно перевірено.</string>
+ <string name="zip_corrupt">Zip файл пошкоджено!</string>
+ <string name="no_md5">Пропуск перевірки MD5: не знайдено MD5 файл</string>
+ <string name="md5_fail">MD5 не співпадає</string>
+ <string name="md5_match">MD5 співпадає</string>
+ <string name="pid_signal">{1} процес завершився з кодом: {2}</string>
+ <string name="pid_error">{1} процес завершився з ПОМИЛКОЮ: {2}</string>
+ <string name="install_dumlock">Встановлення HTC Dumlock у систему...</string>
+ <string name="dumlock_restore">Відновлення оригінального boot...</string>
+ <string name="dumlock_reflash">Прошивка recovery до boot...</string>
+ <string name="run_script">Виконання сценарію {1}...</string>
+ <string name="rename_stock">Перейменування файлу стокового рекавері у /system для попередження відновлення стокового замість TWRP.</string>
+ <string name="split_backup">Розбиття резервної копії на частини...</string>
+ <string name="backup_error">Помилка створення резервної копії.</string>
+ <string name="restore_error">Помилка під час відновлення.</string>
+ <string name="split_thread">Розщеплення ID {1} в архіві {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu з %llu файлів, %i%%</string>
+ <string name="size_progress">%llu МБ з %llu МБ, %i%%</string>
+ <string name="decrypt_cmd">Спроба розшифрувати розділ data за допомогою командного рядка.</string>
+ <string name="base_pkg_err">Невдача при завантаженні базових пакетів.</string>
+ <string name="simulating">Імітування дій...</string>
+ <string name="backup_cancel">Резервне копіювання перервано</string>
+ <string name="config_twrp">Конфігурування TWRP...</string>
+ <string name="config_twrp_err">Неможливо зконфігурувати TWRP з цим ядром.</string>
+ <string name="copy_log">recovery.log скопійовано до {1}.</string>
+ <string name="max_queue">Досягнута максимальна черга zip!</string>
+ <string name="min_queue">Досягнута мінімальна черга zip!</string>
+ <string name="screenshot_saved">Знімок екрану збережено до {1}</string>
+ <string name="screenshot_err">Не вдалось зробити знімок екрану!</string>
+ <string name="zip_wipe_cache">Один чи декілька zip запросили очистку cache -- Очистка cache.</string>
+ <string name="and_sec_wipe_err">Не вдалось очисти android secure</string>
+ <string name="dalvik_wipe_err">Не вдалось очистити dalvik</string>
+ <string name="auto_gen">(Автогенерація)</string>
+ <string name="curr_date">(Поточна дата)</string>
+ <string name="backup_name_len">Ім'я резервної копії надто довге.</string>
+ <string name="backup_name_invalid">Ім'я резервної копії '{1}' має недопустимі символи: '{1}'</string>
+ <string name="no_real_sdcard">Цей пристрій не має реальної SD карти! Відміна!</string>
+ <string name="cancel_sideload">Відміна ADB завантаження...</string>
+ <string name="change_fs_err">Помилка зміни файлової системи.</string>
+ <string name="theme_ver_err">Версія теми не збігається з версією TWRP. Використовується тема за замовченням.</string>
+ <string name="install_reboot">Пристрій буде перезавантажений через 5 секунд.</string>
+ <string name="up_a_level">(на рівень уверх)</string>
+ <string name="adbbackup_error">Помилка ADB копіювання. Вихід..."</string>
+ <string name="adbbackup_control_error">Не вдається запис у adb канал контролю</string>
+ <string name="twrp_adbbu_option">--опція twrp потребує увімкнення adb копіювання</string>
+ <string name="partition_not_found">шлях: {1} не знайдено у списку розділів</string>
+ <string name="copy_kernel_log">Копіювання kernel log у {1}</string>
+ <string name="include_kernel_log">Увімкнути Kernel Log</string>
+
+ </resources>
+</language> \ No newline at end of file
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
new file mode 100644
index 000000000..fd35364b0
--- /dev/null
+++ b/gui/theme/common/portrait.xml
@@ -0,0 +1,4938 @@
+<?xml version="1.0"?>
+<recovery>
+ <styles>
+ <style name="text_l">
+ <font resource="font_l" color="%text_color%"/>
+ </style>
+
+ <style name="text_m">
+ <font resource="font_m" color="%text_color%"/>
+ </style>
+
+ <style name="text_m_accent">
+ <font resource="font_m" color="%accent_color%"/>
+ </style>
+
+ <style name="text_m_fail">
+ <font resource="font_m" color="%text_fail_color%"/>
+ </style>
+
+ <style name="text_s">
+ <font resource="font_s" color="%text_color%"/>
+ </style>
+
+ <style name="input">
+ <background color="%background_color%"/>
+ <cursor color="%accent_color%" hasfocus="1" width="%input_line_width%"/>
+ <font resource="font_m" color="%text_color%"/>
+ </style>
+
+ <style name="checkbox">
+ <font resource="font_m" color="%text_color%"/>
+ <image checked="checkbox_true" unchecked="checkbox_false"/>
+ </style>
+
+ <style name="main_button">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_l" color="%text_button_color%"/>
+ <image resource="main_button"/>
+ </style>
+
+ <style name="main_button_half_height">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button_half_height"/>
+ </style>
+
+ <style name="main_button_half_height_full_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button_half_height_full_width"/>
+ </style>
+
+ <style name="button_third_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="tab_3"/>
+ </style>
+
+ <style name="button_quarter_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="tab_4"/>
+ </style>
+
+ <style name="fab">
+ <highlight color="%highlight_color%"/>
+ <placement x="%indent_right%" y="%row21a_y%" placement="1"/>
+ <font resource="font_m" color="%button_text_color%"/>
+ </style>
+
+ <style name="tab">
+ <highlight color="%highlight_color%"/>
+ <fill color="%transparent%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ </style>
+
+ <style name="console">
+ <fastscroll rectcolor="%accent_color%" w="%fastscroll_w%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <color foreground="%text_color%" background="%background_color%" scroll="%background_color%"/>
+ <font resource="fixed"/>
+ </style>
+
+ <style name="terminal">
+ <fastscroll linecolor="%transparent%" rectcolor="%accent_color%" w="%fastscroll_w%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <background color="%background_color%"/>
+ <font resource="fixed" spacing="3" color="%text_color%"/>
+ </style>
+
+ <style name="fileselector">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <sort name="tw_gui_sort_order"/>
+ <icon folder="folder" file="file"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="listbox">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="scrolllist">
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%"/>
+ </style>
+
+ <style name="partitionlist">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="partitionlist_storage">
+ <highlight color="%fileselector_highlight_color%"/>
+ <placement x="%col1_x_left%" y="%row5_y%" w="%content_overlay_width%" h="%partitionlist_storage_height%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="slider">
+ <placement x="%center_x%" y="%row23_y%"/>
+ <font resource="font_s" color="%text_color%"/>
+ <resource base="slider" used="slider_used" touch="slider_touch"/>
+ </style>
+
+ <style name="slidervalue">
+ <resource handle="handle"/>
+ <font resource="font_m" color="%text_color%"/>
+ <colors line="%fileselector_linecolor%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ </style>
+
+ <style name="patternpassword">
+ <size name="tw_gui_pattern_grid_size" default="3"/>
+ </style>
+ </styles>
+
+ <pages>
+ <page name="main">
+ <action>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="main2">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@twrp_header=Team Win Recovery Project}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_version%</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row2a_y%"/>
+ <text>{@install_btn=Install}</text>
+ <actions>
+ <action function="queueclear"/>
+ <action function="set">tw_selectimage=0</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row2a_y%"/>
+ <text>{@wipe_btn=Wipe}</text>
+ <action function="page">wipe</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row8_y%"/>
+ <text>{@backup_btn=Backup}</text>
+ <action function="page">backup</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row8_y%"/>
+ <text>{@restore_btn=Restore}</text>
+ <action function="page">restore</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row13a_y%"/>
+ <text>{@mount_btn=Mount}</text>
+ <action function="page">mount</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row13a_y%"/>
+ <text>{@settings_btn=Settings}</text>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row19_y%"/>
+ <text>{@advanced_btn=Advanced}</text>
+ <action function="page">advanced</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row19_y%"/>
+ <text>{@reboot_btn=Reboot}</text>
+ <action function="page">reboot</action>
+ </button>
+ </page>
+
+ <page name="install">
+ <template name="page"/>
+
+ <text style="text_l">
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_l">
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_image_hdr=Install Image}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@select_file_from_storage=Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%fileselector_install_height%"/>
+ <text>%tw_zip_location%</text>
+ <filter extn=".zip" folders="1" files="1"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="tw_filename"/>
+ <selection name="tw_file"/>
+ </fileselector>
+
+ <fileselector>
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%fileselector_install_height%"/>
+ <text>%tw_zip_location%</text>
+ <filter extn=".img" folders="1" files="1"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="tw_filename"/>
+ <selection name="tw_file"/>
+ </fileselector>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=install</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@install_image_btn=Install Image}</text>
+ <actions>
+ <action function="set">tw_selectimage=1</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@install_zip_btn=Install Zip}</text>
+ <actions>
+ <action function="set">tw_selectimage=0</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <action>
+ <conditions>
+ <condition var1="tw_selectimage" var2="0"/>
+ <condition var1="tw_filename" op="modified"/>
+ </conditions>
+ <actions>
+ <action function="queuezip"/>
+ <action function="page">flash_confirm</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_selectimage" var2="1"/>
+ <condition var1="tw_filename" op="modified"/>
+ </conditions>
+ <action function="page">flashimage_confirm</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_confirm">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@zip_queue_count=%tw_zip_queue_count% of max of 10 Files queued}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@zip_warn1=This operation may install incompatible}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@zip_warn2=software and render your device unusable.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@zip_back_cancel=Press back to cancel adding this zip.}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row7_y%"/>
+ <text>{@folder=Folder:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row8_y%"/>
+ <text>%tw_zip_location%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row9a_y%"/>
+ <text>{@file=File:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row10a_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row12_y%"/>
+ <text>{@zip_sig_chk=Zip signature verification}</text>
+ <data variable="tw_signed_zip_verify"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%indent%" y="%row13a_y%"/>
+ <text>{@install_reboot_chk=Reboot after installation is complete}</text>
+ <data variable="tw_install_reboot"/>
+ </checkbox>
+
+ <checkbox>
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <placement x="%indent%" y="%row15_y%"/>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
+ <data variable="tw_inject_after_zip"/>
+ </checkbox>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@zip_add_btn=Add more Zips}</text>
+ <action function="page">install</action>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@zip_clear_btn=Clear Zip Queue}</text>
+ <actions>
+ <action function="queueclear"/>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
+ <action function="flash">flash_zip</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="cancelzip"/>
+ <action function="page">install</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_zip">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_count_hdr=Install Zip %tw_zip_index% of %tw_zip_queue_count%}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <action function="page">flash_done</action>
+ </action>
+ </page>
+
+ <page name="flash_done">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@failed=Failed}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_operation_status" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@successful=Successful}</text>
+ </text>
+
+ <template name="console"/>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
+ <actions>
+ <action function="set">tw_back=flash_done</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=/cache</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=wipe</action>
+ <action function="set">tw_action2_param=dalvik</action>
+ <action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache &amp; Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache &amp; Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache &amp; Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@reboot_system_btn=Reboot System}</text>
+ <actions>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=install</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_install_reboot" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ <condition var1="tw_reboot_system" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_sleep=%tw_sleep_total%</action>
+ <action function="page">flash_sleep_and_reboot</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="flash_sleep_and_reboot">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@install_reboot=Rebooting in %tw_sleep% second(s)}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_sleep" op="&gt;" var2="0"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_install_reboot=0</action>
+ <action function="page">flash_done</action>
+ </actions>
+ </button>
+
+ <action>
+ <conditions>
+ <condition var1="tw_sleep" var2="tw_sleep_total"/>
+ <condition var1="tw_install_reboot" var2="1"/>
+ </conditions>
+ <action function="sleepcounter">%tw_sleep_total%</action>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_sleep" var2="0"/>
+ <condition var1="tw_install_reboot" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="sleep">50000</action>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="flashimage_confirm">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@install_image_hdr=Install Image}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@install_sel_target=Select Target Partition}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@folder=Folder:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row3_y%"/>
+ <text>%tw_zip_location%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row4a_y%"/>
+ <text>{@file=File:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row5a_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%indent%" y="%row7_y%" w="%content_width%" h="%partitionlist_flashimage_height%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <text>{@flash_image_select=Select Partition to Flash Image:}</text>
+ <data name="tw_flash_partition"/>
+ <listtype name="flashimg"/>
+ </partitionlist>
+
+ <slider>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
+ <actions>
+ <action function="set">tw_back=flashimage_confirm</action>
+ <action function="set">tw_action=flashimage</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@flashing_image=Flashing Image...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@image_flashed=Image Flashed}</action>
+ <action function="page">action_page</action>
+ </actions>
+ <action function="flashimage"/>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=install</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="clear_vars">
+ <action>
+ <action function="set">tw_operation_state=0</action>
+ <action function="set">tw_text1=</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_text3=</action>
+ <action function="set">tw_text4=</action>
+ <action function="set">tw_action_text1=</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_action_param=</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action2=</action>
+ <action function="set">tw_action2_param=</action>
+ <action function="set">tw_has_cancel=0</action>
+ <action function="set">tw_cancel_action=</action>
+ <action function="set">tw_cancel_param=</action>
+ <action function="set">tw_show_exclamation=0</action>
+ <action function="set">tw_show_reboot=0</action>
+ <action function="page">%tw_clear_destination%</action>
+ </action>
+ </page>
+
+ <page name="reboot_system_routine">
+ <action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=system</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_text3=</action>
+ <action function="set">tw_text4=</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </action>
+ </page>
+
+ <page name="confirm_action">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@confirm_action=Confirm Action}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text/>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>%tw_text1%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>%tw_text2%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>%tw_text3%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_text4%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider>
+ <text>%tw_slider_text%</text>
+ <action function="page">action_page</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="action_page">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_action_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_action_text2%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_has_cancel" var2="1"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="%tw_cancel_action%">%tw_cancel_param%</action>
+ </button>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="0"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="1"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="singleaction_page">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_action_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_action_text2%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="0"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="1"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="action_complete">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_complete_text1%</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@failed=Failed}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_operation_status" var2="0"/>
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@successful=Successful}</text>
+ </text>
+
+ <template name="console"/>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@back_btn=Back}</text>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@reboot_system_btn=Reboot System}</text>
+ <actions>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="filecheck">
+ <action>
+ <action function="fileexists">%tw_filecheck%</action>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_fileexists=1</action>
+ <action function="page">%tw_existpage%</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">%tw_notexistpage%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="rebootcheck">
+ <action>
+ <condition var1="tw_backup_system_size" op="&gt;=" var2="%tw_min_system%"/>
+ <action function="page">appcheck</action>
+ </action>
+
+ <action>
+ <condition var1="tw_backup_system_size" op="&lt;" var2="%tw_min_system%"/>
+ <action function="page">confirm_action</action>
+ </action>
+ </page>
+
+ <page name="appcheck">
+ <action>
+ <condition var1="tw_app_prompt" var2="1"/>
+ <action function="checkforapp"></action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_prompt" op="!=" var2="1"/>
+ <action function="reboot">%tw_reboot_param%</action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_install_status" var2="1"/>
+ <action function="page">rebootapp</action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_install_status" var2="2"/>
+ <action function="reboot">%tw_reboot_param%</action>
+ </action>
+ </page>
+
+ <page name="wipe">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@factory_reset_hdr=Factory Reset}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@factory_reset1=Wipes Data, Cache, and Dalvik}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@factory_reset2=(not including internal storage)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <conditions>
+ <condition var1="tw_has_android_secure" var2="1"/>
+ <condition var1="fileexists" var2="/and-sec"/>
+ </conditions>
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@android_secure=Android Secure}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_has_sdext_partition" var2="1"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@sdext=SD-EXT}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@factory_reset3=Most of the time this is}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@factory_reset4=the only wipe that you need.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row10_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@advanced_wipe_btn=Advanced Wipe}</text>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@format_data_btn=Format Data}</text>
+ <action function="page">formatdata</action>
+ </button>
+
+ <button style="main_button_half_height">
+ <conditions>
+ <condition var1="tw_is_encrypted" var2="1"/>
+ <condition var1="tw_has_data_media" var2="0"/>
+ </conditions>
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@wipe_enc_btn=Wipe Encryption}</text>
+ <actions>
+ <action function="set">tw_back=wipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=DATAMEDIA</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@wipe_enc_confirm=Wipe Encryption from Data?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_format_data=Swipe to Format Data}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_factory_reset=Swipe to Factory Reset}</text>
+ <actions>
+ <action function="set">tw_back=wipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=data</action>
+ <action function="set">tw_action_text1={@factory_resetting=Factory Reset...}</action>
+ <action function="set">tw_complete_text1={@factory_reset_complete=Factory Reset Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="advancedwipe">
+ <template name="page"/>
+
+ <action>
+ <action function="set">tw_wipe_list=</action>
+ </action>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@advanced_wipe_hdr=Advanced Wipe}</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%indent%" y="%row1a_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <text>{@sel_part_wipe=Select Partitions to Wipe:}</text>
+ <data name="tw_wipe_list"/>
+ <listtype name="wipe"/>
+ </partitionlist>
+
+ <text style="text_m_fail">
+ <condition var1="partitionlisterror" var2="1"/>
+ <placement x="%center_x%" y="%row17_y%" placement="5"/>
+ <text>{@invalid_part_sel=Invalid partition selection}</text>
+ </text>
+
+ <button style="main_button_half_height_full_width">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@repair_change_btn=Repair or Change File System}</text>
+ <actions>
+ <action function="checkpartitionlist">tw_wipe_list</action>
+ <action function="page">checkpartitionlist</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_wipe=Swipe to Wipe}</text>
+ <actions>
+ <action function="set">tw_back=advancedwipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=LIST</action>
+ <action function="set">tw_text1={@wipe_sel_confirm=Wipe Selected Partition(s)?}</action>
+ <action function="set">tw_action_text1={@wiping_part=Wiping Partition(s)...}</action>
+ <action function="set">tw_complete_text1={@wipe_complete=Wipe Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe</action>
+ </action>
+ </page>
+
+ <page name="formatdata">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@format_data_hdr=Format Data}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@format_data_ptr1=Format Data will wipe all of your apps,}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@format_data_ptr2=backups, pictures, videos, media, and}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@format_data_ptr3=removes encryption on internal storage.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_has_adopted_storage" var2="1"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@format_data_adopted=Including Adopted Storage}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@format_data_undo=This cannot be undone.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@yes_continue=Type yes to continue. Press back to cancel.}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row10_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_confirm_formatdata%</text>
+ <data name="tw_confirm_formatdata"/>
+ <restrict minlen="3" maxlen="3" allow="yes"/>
+ <action function="page">formatdata_confirm</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row11_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe</action>
+ </action>
+ </page>
+
+ <page name="formatdata_confirm">
+ <action>
+ <condition var1="tw_confirm_formatdata" op="=" var2="yes"/>
+ <actions>
+ <action function="set">tw_back=formatdata</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=DATAMEDIA</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_confirm_formatdata" op="!=" var2="yes"/>
+ <action function="page">formatdata</action>
+ </action>
+ </page>
+
+ <page name="checkpartitionlist">
+ <action>
+ <condition var1="tw_check_partition_list" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="getpartitiondetails">tw_wipe_list</action>
+ <action function="page">partitionoptions</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_check_partition_list" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="partitionoptions">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@part_opt_hdr=Partition Options for: %tw_partition_name%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_is_present" var2="1"/>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@part_present_yes=Present: Yes}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_is_present" var2="0"/>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@part_present_no=Present: No}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_removable" var2="1"/>
+ <placement x="%center_x%" y="%row5_y%"/>
+ <text>{@part_removable_yes=Removable: Yes}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_removable" var2="0"/>
+ <placement x="%center_x%" y="%row5_y%"/>
+ <text>{@part_removable_no=Removable: No}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row7_y%"/>
+ <text>{@part_size=Size: %tw_partition_size%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%"/>
+ <text>{@part_used=Used: %tw_partition_used%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row9_y%"/>
+ <text>{@part_free=Free: %tw_partition_free%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row9_y%"/>
+ <text>{@part_backup_size=Backup Size: %tw_partition_backup_size%MB}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_can_resize" op="=" var2="1"/>
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@resize_btn=Resize File System}</text>
+ <actions>
+ <action function="set">tw_back=partitionoptions</action>
+ <action function="set">tw_action=resize</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=getpartitiondetails</action>
+ <action function="set">tw_action2_param=tw_wipe_list</action>
+ <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@resizing=Resizing...}</action>
+ <action function="set">tw_complete_text1={@resize_complete=Resize Complete}</action>
+ <action function="set">tw_slider_text={@swipe_resize=Swipe to Resize}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_can_repair" op="=" var2="1"/>
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@repair_btn=Repair File System}</text>
+ <actions>
+ <action function="set">tw_back=partitionoptions</action>
+ <action function="set">tw_action=repair</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@repair_confirm=Repair %tw_partition_name%?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@repairing=Repairing...}</action>
+ <action function="set">tw_complete_text1={@repair_complete=Repair Complete}</action>
+ <action function="set">tw_slider_text={@swipe_repair=Swipe to Repair}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@change_fs_btn=Change File System}</text>
+ <action function="page">selectfilesystem</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advancedwipe</action>
+ </action>
+ </page>
+
+ <page name="refreshfilesystem">
+ <action>
+ <condition var1="tw_check_partition_list" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="getpartitiondetails">tw_wipe_list</action>
+ <action function="page">selectfilesystem</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_check_partition_list" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="set">tw_wipe_list=</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="selectfilesystem">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@wipe_hdr=Wipe}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@change_fs_for_hdr=Change File System for: %tw_partition_name%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@change_fs_warn1=Some ROMs or kernels may not support some}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@change_fs_warn2=file systems. Proceed with caution!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%indent%" y="%row15a_y%"/>
+ <text>EXT2</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext2</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT2</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>EXT3</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext3</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT3</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>EXT4</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext4</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT4</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_vfat" op="=" var2="1"/>
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>FAT</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=vfat</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=FAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_exfat" op="=" var2="1"/>
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>exFAT</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=exfat</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=exFAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_partition_f2fs" op="=" var2="1"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>F2FS</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=f2fs</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=F2FS</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">partitionoptions</action>
+ </action>
+ </page>
+
+ <page name="backup">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="tabs_backup"/>
+
+ <fill color="%text_color%">
+ <placement x="0" y="%row_tab_y%" w="%tab3_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_success_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row3a_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row4a_y%"/>
+ <text>%tw_backup_name%</text>
+ </text>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row5a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ <placement x="indent" y="%row3a_y%" w="%content_width%" h="%navbar_height%"/>
+ <fill color="%transparent%"/>
+ <actions>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">backupname1</action>
+ </actions>
+ </button>
+
+ <partitionlist>
+ <placement x="%indent%" y="%row6_y%" w="%content_width%" h="%partitionlist_backup_height%"/>
+ <text>{@sel_part_backup=Select Partitions to Backup:}</text>
+ <data name="tw_backup_list"/>
+ <listtype name="backup"/>
+ </partitionlist>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@refresh_sizes_btn=Refresh Sizes}</text>
+ <actions>
+ <action function="refreshsizes"/>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_backup=Swipe to Backup}</text>
+ <action function="page">backup_run</action>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="backup_options">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="tabs_backup"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab3_col2_x%" y="%row_tab_y%" w="%tab3_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_success_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <checkbox>
+ <placement x="%indent%" y="%row3a_y%"/>
+ <text>{@enable_backup_comp_chk=Enable compression}</text>
+ <data variable="tw_use_compression"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@skip_md5_backup_chk=Skip MD5 generation during backup}</text>
+ <data variable="tw_skip_md5_generate"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%indent%" y="%row6a_y%"/>
+ <text>{@disable_backup_space_chk=Disable free space check before backup}</text>
+ <data variable="tw_disable_free_space"/>
+ </checkbox>
+
+ <text style="text_m">
+ <condition var1="tw_has_boot_slots" var2="1"/>
+ <placement x="%center_x%" y="%row17_y%" placement="5"/>
+ <text>{@current_boot_slot=Current Slot: %tw_active_slot%}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_has_boot_slots" var2="1"/>
+ <placement x="%indent%" y="%row19_y%"/>
+ <text>{@boot_slot_a=Slot A}</text>
+ <actions>
+ <action function="set">tw_back=backup_options</action>
+ <action function="set">tw_action=setbootslot</action>
+ <action function="set">tw_action_param=A</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@changing_boot_slot=Changing Boot Slot}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@changing_boot_slot_complete=Change Boot Slot Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_boot_slots" var2="1"/>
+ <placement x="%center_x%" y="%row19_y%"/>
+ <text>{@boot_slot_b=Slot B}</text>
+ <actions>
+ <action function="set">tw_back=backup_options</action>
+ <action function="set">tw_action=setbootslot</action>
+ <action function="set">tw_action_param=B</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@changing_boot_slot=Changing Boot Slot}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@changing_boot_slot_complete=Change Boot Slot Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">backup</action>
+ </action>
+ </page>
+
+ <page name="backupname1">
+ <action>
+ <condition var1="tw_backup_name" op="=" var2="{@auto_generate=(Auto Generate)}"/>
+ <action function="generatebackupname"/>
+ </action>
+
+ <action>
+ <action function="page">backupname2</action>
+ </action>
+ </page>
+
+ <page name="backupname2">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="tabs_backup"/>
+
+ <fill color="%text_color%">
+ <placement x="0" y="%row_tab_y%" w="%tab3_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_success_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row3a_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row4_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_name%</text>
+ <data name="tw_backup_name"/>
+ <restrict minlen="1" maxlen="64" allow=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.{}[]"/>
+ <actions>
+ <action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_name%</action>
+ <action function="set">tw_existpage=backupname2</action>
+ <action function="set">tw_notexistpage=backup</action>
+ <action function="page">filecheck</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row5a_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%indent%" y="row5a_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row10_y%"/>
+ <text>{@append_date_btn=Append Date}</text>
+ <action function="appenddatetobackupname"/>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">backup</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="backupencryption">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="tabs_backup"/>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_success_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <fill color="%text_color%">
+ <placement x="%tab3_col3_x%" y="%row_tab_y%" w="%tab3_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3a_y%" placement="5"/>
+ <text>{@encrypt_backup=Encrypt your Backup?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row7_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_encrypt_display%</text>
+ <data name="tw_backup_password" mask="*" maskvariable="tw_backup_encrypt_display"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">backupencryption2</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row8_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_not_match" var2="1"/>
+ <placement x="%indent%" y="row8_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_not_match" var2="1"/>
+ <placement x="%indent%" y="%row8a_y%"/>
+ <text>{@pass_not_match=Passwords do not match!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">backup</action>
+ </action>
+ </page>
+
+ <page name="backupencryption2">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@backup_hdr=Backup}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="tabs_backup"/>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button style="tab">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@encryption_tab=ENCRYPTION}</text>
+ <font resource="font_s" color="%text_success_color%"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <fill color="%text_color%">
+ <placement x="%tab3_col3_x%" y="%row_tab_y%" w="%tab3_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3a_y%" placement="5"/>
+ <text>{@encrypt_backup=Encrypt your Backup?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@enter_pass2=Enter Password again:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row7_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_encrypt_display2%</text>
+ <data name="tw_backup_password2" mask="*" maskvariable="tw_backup_encrypt_display2"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">checkbackuppassword</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row8_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">backup</action>
+ </action>
+ </page>
+
+ <page name="checkbackuppassword">
+ <action>
+ <condition var1="tw_backup_password2" var2="tw_backup_password"/>
+ <actions>
+ <action function="set">tw_encrypt_backup=1</action>
+ <action function="page">backup</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_backup_password2" op="!=" var2="tw_backup_password"/>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_password_not_match=1</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="backup_run">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>%tw_operation%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_partition% Partition</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row19_y%"/>
+ <text>{@progress=Progress:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row20_y%"/>
+ <text>%tw_file_progress%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row21_y%"/>
+ <text>%tw_size_progress%</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="cancelbackup"/>
+ </button>
+
+ <action>
+ <action function="nandroid">backup</action>
+ </action>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_cancel_backup" var2="0"/>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="set">tw_complete_text1={@backup_complete=Backup Complete}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_cancel_backup" var2="1"/>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="set">tw_complete_text1={@backup_cancel=Backup Cancelled}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_sel_store_hdr=Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%fileselector_install_height%"/>
+ <text>{@restore_sel_pack_fs=Select Package to Restore:}</text>
+ <filter folders="1" files="0" nav="0"/>
+ <path name="tw_backups_folder"/>
+ <data name="tw_restore" default=""/>
+ <selection name="tw_restore_name"/>
+ </fileselector>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <action>
+ <condition var1="tw_restore" op="modified"/>
+ <actions>
+ <action function="readBackup"/>
+ <action function="page">restore_read</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="restore_read">
+ <action>
+ <condition var1="tw_restore_encrypted" var2="1"/>
+ <actions>
+ <action function="set">tw_password_fail=0</action>
+ <action function="page">restore_decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_restore_encrypted" var2="0"/>
+ <actions>
+ <action function="page">restore_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore_decrypt">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_enc_backup_hdr=Encrypted Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row3_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_restore_display%</text>
+ <data name="tw_restore_password" mask="*" maskvariable="tw_restore_display"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">try_restore_decrypt</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row4a_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%indent%" y="row4a_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@restore_dec_fail=Password failed, please try again!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">restore</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row10_y%"/>
+ <text>{@del_backup_btn=Delete Backup}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; rm -rf "%tw_restore_name%"</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore</action>
+ </action>
+ </page>
+
+ <page name="try_restore_decrypt">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_try_decrypt=Encrypted Backup - Trying Decryption}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <action function="decrypt_backup"/>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_password_fail=1</action>
+ <action function="page">restore_decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">restore_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore_select">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@restore_backup_date=Backup made on %tw_restore_file_date%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row3_y%"/>
+ <text>%tw_restore_name%</text>
+ </text>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row4_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <placement x="indent" y="%row2_y%" w="%content_width%" h="%navbar_height%"/>
+ <fill color="%transparent%"/>
+ <actions>
+ <action function="set">tw_backup_rename=%tw_restore_name%</action>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">renamebackup</action>
+ </actions>
+ </button>
+
+ <partitionlist>
+ <placement x="%indent%" y="%row4a_y%" w="%content_width%" h="%partitionlist_backup_height%"/>
+ <text>{@restore_sel_part=Select Partitions to Restore:}</text>
+ <data name="tw_restore_list" selectedlist="tw_restore_selected"/>
+ <listtype name="restore"/>
+ </partitionlist>
+
+ <checkbox>
+ <placement x="%indent%" y="%row17_y%"/>
+ <text>{@restore_enable_md5_chk=Enable MD5 Verification of Backup Files}</text>
+ <data variable="tw_skip_md5_check"/>
+ </checkbox>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@del_backup_btn=Delete Backup}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; rm -rf "%tw_restore_name%"</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_restore=Swipe to Restore}</text>
+ <action function="page">restore_run</action>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore</action>
+ </action>
+ </page>
+
+ <page name="renamebackup">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@rename_backup_hdr=Rename Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_rename%</text>
+ <data name="tw_backup_rename"/>
+ <restrict minlen="1" maxlen="64" allow=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.{}[]"/>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; mv "%tw_restore_name%" "%tw_backup_rename%"</action>
+ <action function="set">tw_text1={@rename_backup_confirm=Rename Backup?}</action>
+ <action function="set">tw_text2={@rename_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@renaming_backup=Renaming Backup...}</action>
+ <action function="set">tw_complete_text1={@rename_backup_complete=Backup Rename Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_rename=Swipe to Rename}</action>
+ <action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_rename%</action>
+ <action function="set">tw_existpage=renamebackup</action>
+ <action function="set">tw_notexistpage=confirm_action</action>
+ <action function="page">filecheck</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%indent%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%indent%" y="%row4a_y%"/>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">restore_select</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore_select</action>
+ </action>
+ </page>
+
+ <page name="restore_run">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@restore_hdr=Restore}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_operation% %tw_partition%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row19_y%"/>
+ <text>{@progress=Progress:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row20_y%"/>
+ <text>%tw_size_progress%</text>
+ </text>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="set">tw_back=restore_select</action>
+ <action function="set">tw_complete_text1={@restore_complete=Restore Complete}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <action function="nandroid">restore</action>
+ </action>
+ </page>
+
+ <page name="mount">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%indent%" y="%row1a_y%" w="%content_width%" h="%partitionlist_mount_height%"/>
+ <text>{@mount_sel_part=Select Partitions to Mount:}</text>
+ <listtype name="mount"/>
+ </partitionlist>
+
+ <button style="checkbox">
+ <condition var1="tw_mount_system_ro" op="=" var2="0"/>
+ <placement x="%indent%" y="%row15a_y%" textplacement="6"/>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
+ <image resource="checkbox_false"/>
+ <action function="mountsystemtoggle">1</action>
+ </button>
+
+ <button style="checkbox">
+ <condition var1="tw_mount_system_ro" op="!=" var2="0"/>
+ <placement x="%indent%" y="%row15a_y%" textplacement="6"/>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
+ <image resource="checkbox_true"/>
+ <actions>
+ <action function="set">tw_lifetime_writes=2</action>
+ <action function="page">system_readonly_check</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_has_usb_storage" var2="1"/>
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@mount_usb_storage_btn=Mount USB Storage}</text>
+ <action function="page">usb_mount</action>
+ </button>
+
+ <button style="main_button_half_height">
+ <conditions>
+ <condition var1="tw_is_encrypted" var2="1"/>
+ <condition var1="tw_is_decrypted" var2="0"/>
+ </conditions>
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@decrypt_data_btn=Decrypt Data}</text>
+ <action function="page">decrypt</action>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@select_storage_btn=Select Storage}</text>
+ <actions>
+ <action function="set">tw_back=mount</action>
+ <action function="overlay">select_storage</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <conditions>
+ <condition var1="tw_has_mtp" var2="1"/>
+ <condition var1="tw_mtp_enabled" var2="0"/>
+ </conditions>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@enable_mtp_btn=Enable MTP}</text>
+ <action function="startmtp"/>
+ </button>
+
+ <button style="main_button_half_height">
+ <conditions>
+ <condition var1="tw_has_mtp" var2="1"/>
+ <condition var1="tw_mtp_enabled" var2="1"/>
+ </conditions>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@disable_mtp_btn=Disable MTP}</text>
+ <action function="stopmtp"/>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="usb_mount">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@usb_storage_hdr=USB Storage}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@usb_stor_mnt1=USB Storage Mounted}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@usb_stor_mnt2=Be sure to safely remove your device}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@usb_stor_mnt3=from your computer before unmounting!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@unmount_btn=Unmount}</text>
+ <action function="page">usb_umount</action>
+ </button>
+
+ <action>
+ <action function="mount">usb</action>
+ <action function="set">tw_busy=1</action>
+ </action>
+ </page>
+
+ <page name="usb_umount">
+ <action>
+ <action function="unmount">usb</action>
+ </action>
+
+ <action>
+ <action function="page">mount</action>
+ <action function="set">tw_busy=0</action>
+ </action>
+ </page>
+
+ <page name="system_readonly_check">
+ <action>
+ <action function="checkpartitionlifetimewrites">/system</action>
+ </action>
+
+ <action>
+ <condition var1="tw_lifetime_writes" var2="1"/>
+ <actions>
+ <action function="mountsystemtoggle">0</action>
+ <action function="page">mount</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_lifetime_writes" var2="0"/>
+ <actions>
+ <action function="set">tw_back=mount</action>
+ <action function="page">system_readonly</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="reboot">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_system" var2="1"/>
+ <placement x="%indent%" y="%row2a_y%"/>
+ <text>{@rb_system_btn=System}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_poweroff" var2="1"/>
+ <placement x="%center_x%" y="%row2a_y%"/>
+ <text>{@rb_poweroff_btn=Power Off}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=poweroff</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_ospo=sure you wish to power off?}</action>
+ <action function="set">tw_action_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_complete_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_slider_text={@swipe_power_off=Swipe to Power Off}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_recovery" var2="1"/>
+ <placement x="%indent%" y="%row8_y%"/>
+ <text>{@rb_recovery_btn=Recovery}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=recovery</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_bootloader" var2="1"/>
+ <placement x="%center_x%" y="%row8_y%"/>
+ <text>{@rb_bootloader_btn=Bootloader}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=bootloader</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_download_mode" var2="1"/>
+ <placement x="%indent%" y="%row13a_y%"/>
+ <text>{@rb_download_btn=Download}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=download</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <text style="text_m">
+ <condition var1="tw_has_boot_slots" var2="1"/>
+ <placement x="%center_x%" y="%row17_y%" placement="5"/>
+ <text>{@current_boot_slot=Current Slot: %tw_active_slot%}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_has_boot_slots" var2="1"/>
+ <placement x="%indent%" y="%row19_y%"/>
+ <text>{@boot_slot_a=Slot A}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=setbootslot</action>
+ <action function="set">tw_action_param=A</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@changing_boot_slot=Changing Boot Slot}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@changing_boot_slot_complete=Change Boot Slot Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_boot_slots" var2="1"/>
+ <placement x="%center_x%" y="%row19_y%"/>
+ <text>{@boot_slot_b=Slot B}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=setbootslot</action>
+ <action function="set">tw_action_param=B</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@changing_boot_slot=Changing Boot Slot}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@changing_boot_slot_complete=Change Boot Slot Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="rebootapp">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@reboot_install_app_hdr=Install TWRP App?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@reboot_install_app1=Would you like to install the Official TWRP App?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@reboot_install_app2=The app can check for new TWRP versions.}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@reboot_install_app_prompt_install=Prompt to install TWRP app if not installed}</text>
+ <data variable="tw_app_prompt"/>
+ </checkbox>
+
+ <checkbox>
+ <condition var1="tw_mount_system_ro" var2="0"/>
+ <placement x="%indent%" y="%row7_y%"/>
+ <text>{@reboot_install_app_system=Install as a System App}</text>
+ <data variable="tw_app_install_system"/>
+ </checkbox>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row16_y%"/>
+ <text>{@su_cancel=Do not Install}</text>
+ <action function="reboot">%tw_reboot_param%</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_to_install_app=Swipe to Install TWRP App}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=installapp</action>
+ <action function="set">tw_action_text1={@reboot_installing_app=Installing App...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=reboot</action>
+ <action function="set">tw_action2_param=%tw_reboot_param%</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_app_install_status=0</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_app_install_status=0</action>
+ <action function="page">reboot</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="system_readonly">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@sys_ro_hdr=Unmodified System Partition}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@sys_ro_keep=Keep System Read only?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@sys_rop1=TWRP can leave your system partition unmodified}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@sys_rop2=to make it easier for you to take official updates.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@sys_rop3=TWRP will be unable to prevent the stock ROM from}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@sys_rop4=replacing TWRP and will not offer to root your device.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row9_y%" placement="5"/>
+ <text>{@sys_rop5=Installing zips or performing adb operations may still}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row10_y%" placement="5"/>
+ <text>{@sys_rop6=modify the system partition.}</text>
+ </text>
+
+ <checkbox>
+ <condition var1="tw_is_encrypted" var2="0"/>
+ <placement x="%indent%" y="%row15_y%"/>
+ <text>{@sys_ro_never_show_chk=Never show this screen during boot again}</text>
+ <data variable="tw_never_show_system_ro_page"/>
+ </checkbox>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@sys_ro_keep_ro_btn=Keep Read Only}</text>
+ <actions>
+ <action function="mountsystemtoggle">1</action>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="overlay">select_language</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_allow_mod=Swipe to Allow Modifications}</text>
+ <actions>
+ <action function="mountsystemtoggle">0</action>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </slider>
+ </page>
+
+ <page name="settings">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@settings_gen_hdr=General Settings}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="0" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox style="scrolllist">
+ <placement x="%indent%" y="%row3a_y%" w="%content_width%" h="%listbox_settings_height%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
+ <data variable="tw_signed_zip_verify"/>
+ </listitem>
+ <listitem name="{@install_reboot_chk=Reboot after installation is complete}">
+ <data variable="tw_install_reboot"/>
+ </listitem>
+ <listitem name="{@use_rmrf_chk=Use rm -rf instead of formatting}">
+ <data variable="tw_rm_rf"/>
+ </listitem>
+ <listitem name="{@disable_backup_space_chk=Disable free space check before backup}">
+ <data variable="tw_disable_free_space"/>
+ </listitem>
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
+ <data variable="tw_skip_md5_generate"/>
+ </listitem>
+ <listitem name="{@restore_enable_md5_chk=Enable MD5 verification of backup files}">
+ <data variable="tw_skip_md5_check"/>
+ </listitem>
+ <listitem name="{@use24clock_chk=Use 24-hour clock}">
+ <data variable="tw_military_time"/>
+ </listitem>
+ <listitem name="{@rev_navbar_chk=Reversed navbar layout}">
+ <data variable="tw_samsung_navbar"/>
+ </listitem>
+ <listitem name="{@reboot_install_app_prompt_install=Prompt to install TWRP app on every reboot}">
+ <data variable="tw_app_prompt"/>
+ </listitem>
+ <listitem name="{@simact_chk=Simulate actions for theme testing}">
+ <data variable="tw_simulate_actions"/>
+ </listitem>
+ <listitem name="{@simfail_chk=Simulate failure for actions}">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <data variable="tw_simulate_fail"/>
+ </listitem>
+ </listbox>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@restore_defaults_btn=Restore Defaults}</text>
+ <actions>
+ <action function="set">tw_samsung_navbar=0</action>
+ <action function="set">tw_tab_icons=0</action>
+ <action function="restoredefaultsettings"/>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_timezone">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@time_zone_hdr=Time Zone}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col2_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%listbox_timezone_height%"/>
+ <text>{@sel_tz_list=Select Time Zone:}</text>
+ <data name="tw_time_zone_guisel"/>
+ <listitem name="{@utcm11=(UTC -11) Samoa, Midway Island}">BST11;BDT</listitem>
+ <listitem name="{@utcm10=(UTC -10) Hawaii}">HST10;HDT</listitem>
+ <listitem name="{@utcm9=(UTC -9) Alaska}">AST9;ADT</listitem>
+ <listitem name="{@utcm8=(UTC -8) Pacific Time}">PST8;PDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm7=(UTC -7) Mountain Time}">MST7;MDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm6=(UTC -6) Central Time}">CST6;CDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm5=(UTC -5) Eastern Time}">EST5;EDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm4=(UTC -4) Atlantic Time}">AST4;ADT</listitem>
+ <listitem name="{@utcm3=(UTC -3) Brazil, Buenos Aires}">GRNLNDST3;GRNLNDDT</listitem>
+ <listitem name="{@utcm2=(UTC -2) Mid-Atlantic}">FALKST2;FALKDT</listitem>
+ <listitem name="{@utcm1=(UTC -1) Azores, Cape Verde}">AZOREST1;AZOREDT</listitem>
+ <listitem name="{@utc0=(UTC 0) London, Dublin, Lisbon}">GMT0;BST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp1=(UTC +1) Berlin, Brussels, Paris}">CET-1;CEST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp2=(UTC +2) Athens, Istanbul, South Africa}">WET-2;WET,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp3=(UTC +3) Moscow, Baghdad}">SAUST-3;SAUDT</listitem>
+ <listitem name="{@utcp4=(UTC +4) Abu Dhabi, Tbilisi, Muscat}">WST-4;WDT</listitem>
+ <listitem name="{@utcp5=(UTC +5) Yekaterinburg, Islamabad}">PAKST-5;PAKDT</listitem>
+ <listitem name="{@utcp6=(UTC +6) Almaty, Dhaka, Colombo}">TASHST-6;TASHDT</listitem>
+ <listitem name="{@utcp7=(UTC +7) Bangkok, Hanoi, Jakarta}">THAIST-7;THAIDT</listitem>
+ <listitem name="{@utcp8=(UTC +8) Beijing, Singapore, Hong Kong}">TAIST-8;TAIDT</listitem>
+ <listitem name="{@utcp9=(UTC +9) Tokyo, Seoul, Yakutsk}">JST-9;JSTDT</listitem>
+ <listitem name="{@utcp10=(UTC +10) Eastern Australia, Guam}">EET-10;EETDT</listitem>
+ <listitem name="{@utcp11=(UTC +11) Vladivostok, Solomon Islands}">MET-11;METDT</listitem>
+ <listitem name="{@utcp12=(UTC +12) Auckland, Wellington, Fiji}">NZST-12;NZDT</listitem>
+ </listbox>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row15a_y%"/>
+ <text>{@sel_tz_offset=Select Offset (usually 0): %tw_time_zone_guioffset%}</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%indent%" y="%row16a_y%"/>
+ <text>{@tz_offset_none=None}</text>
+ <action function="set">tw_time_zone_guioffset=0</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col2_x%" y="%row16a_y%"/>
+ <text>{@tz_offset_15=15}</text>
+ <action function="set">tw_time_zone_guioffset=15</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col3_x%" y="%row16a_y%"/>
+ <text>{@tz_offset_30=30}</text>
+ <action function="set">tw_time_zone_guioffset=30</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row16a_y%"/>
+ <text>{@tz_offset_45=45}</text>
+ <action function="set">tw_time_zone_guioffset=45</action>
+ </button>
+
+ <checkbox>
+ <placement x="%indent%" y="%row18a_y%"/>
+ <font resource="font_m" color="%text_color%"/>
+ <text>{@use_dst_chk=Use daylight savings time (DST)}</text>
+ <data variable="tw_time_zone_guidst"/>
+ <image checked="checkbox_true" unchecked="checkbox_false"/>
+ </checkbox>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row20_y%"/>
+ <text>{@curr_tz=Current Time Zone: %tw_time_zone%}</text>
+ </text>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <text>{@set_tz_btn=Set Time Zone}</text>
+ <image resource="main_button_half_height"/>
+ <action function="setguitimezone"/>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_screen">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@settings_screen_hdr=Screen Settings}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col3_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <button>
+ <placement x="%indent%" y="%row3a_y%" textplacement="6"/>
+ <font resource="font_m" color="%text_color%"/>
+ <condition var1="tw_screen_timeout_secs" op="=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
+ <image resource="checkbox_false"/>
+ <action function="set">tw_screen_timeout_secs=60</action>
+ </button>
+
+ <button>
+ <placement x="%indent%" y="%row3a_y%" textplacement="6"/>
+ <font resource="font_m" color="%text_color%"/>
+ <condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
+ <image resource="checkbox_true"/>
+ <action function="set">tw_screen_timeout_secs=0</action>
+ </button>
+
+ <slidervalue>
+ <condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <placement x="indent" y="%row5_y%" w="%content_width%"/>
+ <text>{@screen_to_slider=Screen timeout in seconds:}</text>
+ <data variable="tw_screen_timeout_secs" min="15" max="300"/>
+ </slidervalue>
+
+ <slidervalue>
+ <condition var1="tw_has_brightnesss_file" var2="1"/>
+ <placement x="indent" y="%row10_y%" w="%content_width%"/>
+ <text>{@screen_bright_slider=Brightness: %tw_brightness_pct%%}</text>
+ <data variable="tw_brightness_pct" min="10" max="100"/>
+ <actions>
+ <action function="set">tw_brightness=%tw_brightness_max%</action>
+ <action function="compute">tw_brightness*%tw_brightness_pct%</action>
+ <action function="compute">tw_brightness/100</action>
+ <action function="setbrightness">%tw_brightness%</action>
+ </actions>
+ </slidervalue>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_vibration">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@vibration_hdr=Vibration}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col4_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <slidervalue>
+ <placement x="indent" y="%row4_y%" w="%content_width%"/>
+ <text>{@button_vibration=Button Vibration:}</text>
+ <data variable="tw_button_vibrate" min="0" max="300"/>
+ </slidervalue>
+
+ <slidervalue>
+ <placement x="indent" y="%row9_y%" w="%content_width%"/>
+ <text>{@kb_vibration=Keyboard Vibration:}</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300"/>
+ </slidervalue>
+
+ <slidervalue>
+ <placement x="indent" y="%row14_y%" w="%content_width%"/>
+ <text>{@act_vibration=Action Vibration:}</text>
+ <data variable="tw_action_vibrate" min="0" max="500"/>
+ </slidervalue>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="settings_language">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@language_hdr=Language - %tw_language_display%}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col5_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%listbox_settings_height%"/>
+ <text>{@select_language=Select Language:}</text>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@set_language_btn=Set Language}</text>
+ <action function="setlanguage"></action>
+ </button>
+
+ <action>
+ <touch key="home" />
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back" />
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="copylog">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@copying_log=Copy Logs to SD Card}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row4_y%"/>
+ <text>{@include_kernel_log=Include Kernel Log}</text>
+ <data variable="tw_include_kernel_log" value="1"/>
+ </checkbox>
+
+ <slider>
+ <text>{@copying_log=Copy Logs to SD Card}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=copylog</action>
+ <action function="set">tw_action_text1={@copying_log=Copy Logs to SD Card}</action>
+ <action function="set">tw_complete_text1={@copy_log_complete=Logs Copy Completed}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="page">advanced</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="advanced">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row2a_y%"/>
+ <text>{@copy_log_btn=Copy Log}</text>
+ <action function="page">copylog</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%center_x%" y="%row2a_y%"/>
+ <text>{@fix_context_btn=Fix Contexts}</text>
+ <action function="page">fixcontexts</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_allow_partition_sdcard" var2="1"/>
+ <placement x="%indent%" y="%row8_y%"/>
+ <text>{@part_sd_btn=Partition SD Card}</text>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row8_y%"/>
+ <text>{@file_manager_btn=File Manager}</text>
+ <action function="page">filemanagerlist</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row13a_y%"/>
+ <text>{@terminal_btn=Terminal}</text>
+ <action function="page">terminalcommand</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%center_x%" y="%row13a_y%"/>
+ <text>{@reload_theme_btn=Reload Theme}</text>
+ <action function="reload"/>
+ </button>
+
+ <button style="main_button">
+ <placement x="%indent%" y="%row19_y%"/>
+ <text>{@adb_sideload_btn=ADB Sideload}</text>
+ <action function="page">sideload</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_show_dumlock" var2="1"/>
+ <placement x="%center_x%" y="%row19_y%"/>
+ <text>{@dumlock_btn=HTC Dumlock}</text>
+ <action function="page">htcdumlock</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <placement x="%center_x%" y="%row19_y%"/>
+ <text>{@inject_twrp_btn=Inject TWRP}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=reinjecttwrp</action>
+ <action function="set">tw_text1={@inject_twrp_confirm=Re-Inject TWRP?}</action>
+ <action function="set">tw_action_text1={@injecting_twrp=Re-Injecting TWRP...}</action>
+ <action function="set">tw_complete_text1={@inject_twrp_complete=TWRP Injection Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="partsdcardsel">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <partitionlist>
+ <placement x="%indent%" y="%row1a_y%" w="%content_width%" h="%partitionlist_storage_height%"/>
+ <text>{@sel_storage_list=Select Storage}</text>
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <text style="text_m_fail">
+ <condition var1="partitionlisterror" var2="1"/>
+ <placement x="%center_x%" y="%row20_y%" placement="5"/>
+ <text>{@invalid_partsd_sel=You must select a removable device}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@ok_btn=OK}</text>
+ <actions>
+ <action function="getpartitiondetails">tw_storage_path</action>
+ <action function="page">partsdcardcheck</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="partsdcardcheck">
+ <action>
+ <condition var1="tw_partition_removable" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcard</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_partition_removable" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="partsdcard">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@part_sd_ext_sz=EXT Size:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6a_y%" placement="5"/>
+ <text>%tw_sdext_size%</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@part_sd_m=-}</text>
+ <action function="addsubtract">tw_sdext_size-256</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row6_y%"/>
+ <text>{@part_sd_p=+}</text>
+ <action function="addsubtract">tw_sdext_size+256</action>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row9_y%" placement="5"/>
+ <text>{@part_sd_swap_sz=Swap Size:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row10a_y%" placement="5"/>
+ <text>%tw_swap_size%</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@part_sd_m=-}</text>
+ <action function="addsubtract">tw_swap_size-64</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row10_y%"/>
+ <text>{@part_sd_p=+}</text>
+ <action function="addsubtract">tw_swap_size+64</action>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row13_y%" placement="5"/>
+ <text>{@file_system=File System:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row14a_y%" placement="5"/>
+ <text>%tw_sdpart_file_system%</text>
+ </text>
+
+ <button style="button_quarter_width">
+ <placement x="%indent%" y="%row14_y%"/>
+ <text>EXT3</text>
+ <action function="set">tw_sdpart_file_system=ext3</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row14_y%"/>
+ <text>EXT4</text>
+ <action function="set">tw_sdpart_file_system=ext4</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_part_sd=Swipe to Partition}</text>
+ <action function="page">partsdcardaction</action>
+ <actions>
+ <action function="set">tw_back=partsdcard</action>
+ <action function="set">tw_action=partitionsd</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=set</action>
+ <action function="set">tw_action2_param=tw_zip_location=/sdcard</action>
+ <action function="set">tw_action_text1={@partitioning_sd=Partitioning SD Card...}</action>
+ <action function="set">tw_action_text2={@partitioning_sd2=This will take a few minutes.}</action>
+ <action function="set">tw_complete_text1={@part_sd_complete=Partitioning Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="htcdumlock">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@dumlock_hdr=HTC Dumlock}</text>
+ </text>
+
+ <button style="main_button_half_height_full_width">
+ <placement x="%indent%" y="%row15a_y%"/>
+ <text>{@dumlock_restore_btn=Restore Original Boot}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=htcdumlockrestoreboot</action>
+ <action function="set">tw_text1={@dumlock_restore_confirm=Restore original boot image?}</action>
+ <action function="set">tw_action_text1={@dumlock_restoring=Restoring Original Boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_restore_complete=Restore Original Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height_full_width">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@dumlock_reflash_btn=Reflash Recovery}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=htcdumlockreflashrecovery</action>
+ <action function="set">tw_text1={@dumlock_reflash_confirm=Reflash recovery to boot?}</action>
+ <action function="set">tw_action_text1={@dumlock_reflashing=Flashing recovery to boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_reflash_complete=Recovery Flash to Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height_full_width">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@dumlock_install_btn=Install HTC Dumlock}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=installhtcdumlock</action>
+ <action function="set">tw_text1={@dumlock_install_confirm=Install HTC dumlock files to ROM?}</action>
+ <action function="set">tw_action_text1={@dumlock_installing=Installing HTC Dumlock...}</action>
+ <action function="set">tw_complete_text1={@dumlock_install_complete=HTC Dumlock Install Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="lock">
+ <background color="%semi_transparent%"/>
+
+ <image>
+ <image resource="unlock_icon"/>
+ <placement x="%center_x%" y="%row10_y%" placement="4"/>
+ </image>
+
+ <slider>
+ <text>{@swipe_to_unlock=Swipe to Unlock}</text>
+ <action function="overlay"/>
+ </slider>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+ </page>
+
+ <page name="filemanagerlist">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_sel_file=Select a File or Folder}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%fileselector_filemanager_height%"/>
+ <text>%tw_file_location1%</text>
+ <filter folders="1" files="1"/>
+ <path name="tw_file_location1" default="/"/>
+ <data name="tw_filename1"/>
+ <selection name="tw_selection1"/>
+ </fileselector>
+
+ <button style="fab">
+ <image resource="fab_selectfolder"/>
+ <actions>
+ <action function="set">tw_filename1=tw_file_location1</action>
+ <action function="set">tw_fm_isfolder=1</action>
+ <action function="set">tw_fm_type={@fm_type_folder=Folder}</action>
+ <action function="page">filemanageroptions</action>
+ </actions>
+ </button>
+
+ <action>
+ <actions>
+ <action function="set">tw_fm_type={@fm_type_file=File}</action>
+ <action function="set">tw_fm_isfolder=0</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+
+ <action>
+ <condition var1="tw_filename1" op="modified"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanageroptions">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_choose_act=Choose Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@fm_selected=%tw_fm_type% selected:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row3_y%"/>
+ <text>%tw_filename1%</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_fm_isfolder" var2="0"/>
+ <placement x="%indent%" y="%row15a_y%"/>
+ <text>{@fm_copy_file_btn=Copy File}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=cp</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_fm_isfolder" var2="1"/>
+ <placement x="%indent%" y="%row15a_y%"/>
+ <text>{@fm_copy_folder_btn=Copy Folder}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=cd "%tw_file_location1%" &amp;&amp; cd .. &amp;&amp; cp -R</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row15a_y%"/>
+ <text>{@fm_move_btn=Move}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=mv</action>
+ <action function="set">tw_fm_text1={@fm_moving=Moving}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@fm_chmod755_btn=chmod 755}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=chmod 755</action>
+ <action function="set">tw_fm_text1={@fm_chmod755ing=chmod 755}</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row18a_y%"/>
+ <text>{@fm_chmod_btn=chmod}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=0000</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerchmod</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@fm_delete_btn=Delete}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=rm -rf</action>
+ <action function="set">tw_fm_text1={@fm_deleting=Deleting}</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_fm_isfolder" var2="0"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@fm_rename_file_btn=Rename File}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=tw_selection1</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
+ <action function="set">tw_filemanager_command=mv</action>
+ <action function="page">filemanagerrenamefile</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_fm_isfolder" var2="1"/>
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@fm_rename_folder_btn=Rename Folder}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=tw_selection1</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
+ <action function="set">tw_filemanager_command=cd "%tw_file_location1%" &amp;&amp; cd .. &amp;&amp; mv</action>
+ <action function="page">filemanagerrenamefolder</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanagerlist</action>
+ </action>
+ </page>
+
+ <page name="choosedestinationfolder">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_sel_dest=Select Destination Folder}</text>
+ </text>
+
+ <template name="sort_options"/>
+
+ <fileselector>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%fileselector_filemanager_height%"/>
+ <text>%tw_file_location2%</text>
+ <filter folders="1" files="0"/>
+ <path name="tw_file_location2" default="/"/>
+ <data name="tw_filename2"/>
+ <selection name="tw_selection2"/>
+ </fileselector>
+
+ <button style="fab">
+ <image resource="fab_selectfolder"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3=%tw_file_location2%</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerrenamefile">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="1" maxlen="128"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3="%tw_file_location1%/%tw_filemanager_rename%"</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerrenamefolder">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="1" maxlen="128"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3=%tw_filemanager_rename%</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerchmod">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fm_set_perms_hdr=Set Permissions}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@fm_perms=Permissions:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row2_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="3" maxlen="4" allow="0123456789"/>
+ <actions>
+ <action function="set">tw_filemanager_command=chmod %tw_filemanager_rename%</action>
+ <action function="set">tw_fm_text1=chmod %tw_filemanager_rename%</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerconfirm">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@confirm_action=Confirm Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>%tw_fm_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>%tw_filename1%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_fm_text2%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>%tw_fm_text3%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider>
+ <text>{@swipe_to_confirm=Swipe to Confirm}</text>
+ <action function="page">filemanageraction</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="filemanageraction">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@fm_hdr=File Manager}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>%tw_fm_text1%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_back=filemanagerlist</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_include_text3" var2="0"/>
+ <action function="cmd">%tw_filemanager_command% "%tw_filename1%"</action>
+ </action>
+
+ <action>
+ <condition var1="tw_include_text3" var2="1"/>
+ <action function="cmd">%tw_filemanager_command% "%tw_filename1%" "%tw_fm_text3%"</action>
+ </action>
+ </page>
+
+ <page name="decrypt">
+ <template name="page"/>
+
+ <action>
+ <condition var1="tw_crypto_pwtype" var2="2"/>
+ <action function="page">decrypt_pattern</action>
+ </action>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@decrypt_data_enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%indent%" y="%row3_input_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_crypto_display%</text>
+ <data name="tw_crypto_password" mask="*" maskvariable="tw_crypto_display"/>
+ <restrict minlen="1" maxlen="254"/>
+ <action function="page">trydecrypt</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="row4a_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%indent%" y="row4a_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@decrypt_data_failed=Password failed, please try again!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row10_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row10_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="overlay">select_language</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+ </page>
+
+ <page name="decrypt_pattern">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@decrypt_data_enter_pattern=Enter Pattern.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@decrypt_data_failed_pattern=Pattern failed, please try again!}</text>
+ </text>
+
+ <patternpassword>
+ <placement x="%pattern_x%" y="%row5_y%" w="%pattern_size%" h="%pattern_size%"/>
+ <dot color="%fileselector_linecolor%" activecolor="%accent_color%" radius="%pattern_dot_dia%"/>
+ <line color="%fileselector_linecolor%" width="%pattern_line_w%"/>
+ <data name="tw_crypto_password"/>
+ <action function="page">trydecrypt</action>
+ </patternpassword>
+
+ <button style="button_quarter_width">
+ <placement x="%indent%" y="%row19a_y%"/>
+ <text>3x3</text>
+ <action function="set">tw_gui_pattern_grid_size=3</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col2_x%" y="%row19a_y%"/>
+ <text>4x4</text>
+ <action function="set">tw_gui_pattern_grid_size=4</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col3_x%" y="%row19a_y%"/>
+ <text>5x5</text>
+ <action function="set">tw_gui_pattern_grid_size=5</action>
+ </button>
+
+ <button style="button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row19a_y%"/>
+ <text>6x6</text>
+ <action function="set">tw_gui_pattern_grid_size=6</action>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="overlay">select_language</action>
+ </button>
+ </page>
+
+ <page name="trydecrypt">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@mount_hdr=Mount}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@decrypt_data_trying=Trying Decryption}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <action function="decrypt"/>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_password_fail=1</action>
+ <action function="page">decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="terminalcommand">
+ <template name="page"/>
+
+ <fill color="%background_color%">
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="%slideout_bg_height%"/>
+ </fill>
+
+ <terminal>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%row3_header_y%" w="%screen_width%" h="%console_terminal_height%"/>
+ </terminal>
+
+ <terminal>
+ <condition var1="tw_hide_kb" var2="1"/>
+ <placement x="0" y="%row3_header_y%" w="%screen_width%" h="%slideout_height%"/>
+ </terminal>
+
+ <template name="keyboardterminaltemplate"/>
+
+ <template name="keyboardtemplate"/>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%" />
+ </fill>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">back</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="0" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1" />
+ <condition var1="tw_hide_kb" op="=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1" />
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">back</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="power+voldown" />
+ <action function="screenshot" />
+ </action>
+ </page>
+
+ <page name="sideload">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@adb_sideload_hdr=ADB Sideload}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@sideload_wipe_dalvik_chk=Wipe Dalvik Cache}</text>
+ <data variable="tw_wipe_dalvik"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%indent%" y="%row3a_y%"/>
+ <text>{@sideload_wipe_cache_chk=Wipe Cache}</text>
+ <data variable="tw_wipe_cache"/>
+ </checkbox>
+
+ <slider>
+ <text>{@swipe_to_sideload=Swipe to Start Sideload}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=adbsideload</action>
+ <action function="set">tw_action_text1={@sideload_confirm=ADB Sideload}</action>
+ <action function="set">tw_action_text2={@sideload_usage=Usage: adb sideload filename.zip}</action>
+ <action function="set">tw_complete_text1={@sideload_complete=ADB Sideload Complete}</action>
+ <action function="set">tw_has_cancel=1</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="set">tw_cancel_action=adbsideloadcancel</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="fixcontexts">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@fix_contexts_hdr=Fix Contexts}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@fix_contexts_note1=Note: Fixing contexts is rarely needed.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@fix_contexts_note2=Fixing SELinux Contexts may cause}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@fix_contexts_note3=your device to not boot properly.}</text>
+ </text>
+
+ <slider>
+ <text>{@swipe_to_fix_contexts=Swipe to Fix Contexts}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=fixcontexts</action>
+ <action function="set">tw_action_text1={@fixing_contexts=Fixing Contexts...}</action>
+ <action function="set">tw_complete_text1={@fix_contexts_complete=Fix Contexts Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="installsu">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@su_hdr=SuperSU Check}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@su_note1=Your device does not appear to be rooted.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@su_note2=Install SuperSU now?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@su_note3=This will root your device.}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row18a_y%"/>
+ <text>{@su_cancel=Do not Install}</text>
+ <action function="set">tw_page_done=1</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_su_to_install=Swipe to Install}</text>
+ <actions>
+ <action function="set">tw_action=installsu</action>
+ <action function="set">tw_action_text1={@su_installing=Installing SuperSU}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="page">singleaction_page</action>
+ </actions>
+ </slider>
+ </page>
+
+ <page name="slideout">
+ <fill color="%background_color%">
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="%slideout_bg_height%"/>
+ </fill>
+
+ <console>
+ <placement x="%indent%" y="%row3_header_y%" w="%content_width%" h="%slideout_height%"/>
+ </console>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ <action function="overlay"/>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="select_storage">
+ <fill color="%semi_transparent%">
+ <placement x="0" y="0" w="%screen_width%" h="%screen_height%"/>
+ </fill>
+
+ <fill color="%background_color%">
+ <placement x="%indent%" y="row5_y" w="%content_width%" h="%dialog_height%"/>
+ </fill>
+
+ <partitionlist style="partitionlist_storage">
+ <text>{@sel_storage_list=Select Storage}</text>
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <button style="button_third_width">
+ <placement x="%dialog_button_x%" y="%row14_y%"/>
+ <text>{@ok_btn=OK}</text>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="overlay"/>
+ <action function="page">clear_vars</action>
+ </actions>
+ </button>
+
+ <fill color="#000000">
+ <placement x="0" y="row25_y" w="%screen_width%" h="%navbar_height"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="select_language">
+ <fill color="%semi_transparent%">
+ <placement x="0" y="0" w="%screen_width%" h="%screen_height%"/>
+ </fill>
+
+ <fill color="%background_color%">
+ <placement x="%indent%" y="row5_y" w="%content_width%" h="%dialog_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%col1_x_left%" y="%row5_y%" w="%content_overlay_width%" h="%partitionlist_storage_height%"/>
+ <text>{@select_language=Select Language:}</text>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button style="button_third_width">
+ <placement x="%dialog_button_x%" y="%row14_y%"/>
+ <text>{@ok_btn=OK}</text>
+ <actions>
+ <action function="overlay"/>
+ <action function="setlanguage"></action>
+ </actions>
+ </button>
+
+ <fill color="#000000">
+ <placement x="0" y="row25_y" w="%screen_width%" h="%navbar_height"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="overlay"/>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="overlay"/>
+ <action function="key">%tw_back%</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+ </pages>
+</recovery>
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
new file mode 100644
index 000000000..ebfe49727
--- /dev/null
+++ b/gui/theme/common/watch.xml
@@ -0,0 +1,5513 @@
+<?xml version="1.0"?>
+<recovery>
+ <styles>
+ <style name="text_l">
+ <font resource="font_l" color="%text_color%"/>
+ </style>
+
+ <style name="text_m">
+ <font resource="font_m" color="%text_color%"/>
+ </style>
+
+ <style name="text_m_accent">
+ <font resource="font_m" color="%accent_color%"/>
+ </style>
+
+ <style name="text_m_fail">
+ <font resource="font_m" color="%text_fail_color%"/>
+ </style>
+
+ <style name="text_s">
+ <font resource="font_s" color="%text_color%"/>
+ </style>
+
+ <style name="input">
+ <background color="%background_color%"/>
+ <cursor color="%accent_color%" hasfocus="1" width="%input_line_width%"/>
+ <font resource="font_m" color="%text_color%"/>
+ </style>
+
+ <style name="checkbox">
+ <font resource="font_m" color="%text_color%"/>
+ <image checked="checkbox_true" unchecked="checkbox_false"/>
+ </style>
+
+ <style name="main_button">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_l" color="%text_button_color%"/>
+ <image resource="main_button"/>
+ </style>
+
+ <style name="main_button_full_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_l" color="%text_button_color%"/>
+ <image resource="main_button_full_width"/>
+ </style>
+
+ <style name="main_button_quarter_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_l" color="%text_button_color%"/>
+ <image resource="main_button_quarter_width"/>
+ </style>
+
+ <style name="main_button_half_height">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button_half_height"/>
+ </style>
+
+ <style name="main_button_half_height_full_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="main_button_half_height_full_width"/>
+ </style>
+
+ <style name="button_third_width">
+ <highlight color="%highlight_color%"/>
+ <font resource="font_m" color="%text_button_color%"/>
+ <image resource="tab_3"/>
+ </style>
+
+ <style name="button_navbar">
+ <font resource="font_m" color="%text_button_color%"/>
+ </style>
+
+ <style name="console">
+ <color foreground="%text_color%" background="%background_color%" scroll="%background_color%"/>
+ <font resource="fixed"/>
+ </style>
+
+ <style name="terminal">
+ <fastscroll linecolor="%transparent%" rectcolor="%accent_color%" w="%fastscroll_w%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <background color="%background_color%"/>
+ <font resource="fixed" spacing="2" color="%text_color%"/>
+ </style>
+
+ <style name="fileselector">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%fileselector_linecolor%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <sort name="tw_gui_sort_order"/>
+ <icon folder="folder" file="file"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="listbox">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="listbox_headerless">
+ <highlight color="%fileselector_highlight_color%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%accent_color%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="listbox_options">
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ <icon selected="checkbox_true_small" unselected="checkbox_false_small"/>
+ </style>
+
+ <style name="scrolllist">
+ <highlight color="%fileselector_highlight_color%"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%fileselector_spacing%" color="%text_color%" highlightcolor="%accent_color%"/>
+ </style>
+
+ <style name="partitionlist">
+ <highlight color="%fileselector_highlight_color%"/>
+ <header background="%background_color%" textcolor="%accent_color%" separatorcolor="%accent_color%" separatorheight="%fileselector_separatorheight%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="partitionlist_summary">
+ <highlight color="%fileselector_highlight_color%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ <icon selected="checkbox_true_small" unselected="checkbox_false_small"/>
+ </style>
+
+ <style name="partitionlist_headerless_rb">
+ <highlight color="%fileselector_highlight_color%"/>
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_storage_height%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%fileselector_linecolor%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="radio_true" unselected="radio_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="partitionlist_headerless_cb">
+ <highlight color="%fileselector_highlight_color%"/>
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_storage_height%"/>
+ <fastscroll linecolor="%fileselector_linecolor%" rectcolor="%fileselector_linecolor%" w="%fastscroll_w%" linew="%fastscroll_linew%" rectw="%fastscroll_rectw%" recth="%fastscroll_recth%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ <icon selected="checkbox_true" unselected="checkbox_false"/>
+ <separator color="%fileselector_linecolor%" height="%fileselector_separatorheight%"/>
+ <background color="%background_color%"/>
+ <font resource="font_m" spacing="%partitionlist_spacing%" color="%text_color%" highlightcolor="%fileselector_highlight_font_color%"/>
+ </style>
+
+ <style name="slider">
+ <placement x="%center_x%" y="%slider_y%"/>
+ <font resource="font_l" color="%text_color%"/>
+ <resource base="slider" used="slider_used" touch="slider_touch"/>
+ </style>
+
+ <style name="slidervalue">
+ <resource handle="handle"/>
+ <font resource="font_m" color="%text_color%"/>
+ <colors line="%fileselector_linecolor%"/>
+ <dimensions lineh="%slidervalue_lineh%" linepadding="%slidervalue_padding%" sliderw="%slidervalue_sliderw%" sliderh="%slidervalue_sliderh%"/>
+ </style>
+
+ <style name="patternpassword">
+ <size name="tw_gui_pattern_grid_size" default="3"/>
+ </style>
+ </styles>
+
+ <pages>
+ <page name="main">
+ <action>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="main2">
+ <template name="page"/>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@install_btn=Install}</text>
+ <action function="page">install_type</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@wipe_btn=Wipe}</text>
+ <action function="page">wipe_type1</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@backup_btn=Backup}</text>
+ <actions>
+ <action function="set">tw_back=main</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@restore_btn=Restore}</text>
+ <action function="page">restore</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@reboot_btn=Reboot}</text>
+ <action function="page">reboot</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">main3</action>
+ </button>
+ </page>
+
+ <page name="copylog">
+ <template name="page"/>
+
+ <checkbox>
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@include_kernel_log=Include Kernel Log}</text>
+ <data variable="tw_include_kernel_log" value="1"/>
+ </checkbox>
+
+ <slider>
+ <text>{@swipe_confirm= Confirm}</text>
+ <actions>
+ <action function="set">tw_back=main3</action>
+ <action function="set">tw_action=copylog</action>
+ <action function="set">tw_action_text1={@copying_log=Copy Logs to SD Card}</action>
+ <action function="set">tw_complete_text1={@copy_log_complete=Logs Copy Completed}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main2</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="main3">
+ <template name="page"/>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@mount_btn=Mount}</text>
+ <action function="page">mount</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@settings_btn=Settings}</text>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@files_btn=Files}</text>
+ <action function="page">filemanagerlist</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@copy_log_btn=Copy Log}</text>
+ <action function="page">copylog</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row11_y%"/>
+ <text>{@advanced_btn=Advanced}</text>
+ <action function="page">advanced</action>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">main2</action>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main2</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="install_type">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_hdr=Install} &gt; {@select_type_hdr=Select Type}</text>
+ </text>
+
+ <button style="main_button_full_width">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@install_zip_btn=Install Zip}</text>
+ <actions>
+ <action function="queueclear"/>
+ <action function="set">tw_selectimage=0</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button_full_width">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@install_image_btn=Install Image}</text>
+ <actions>
+ <action function="queueclear"/>
+ <action function="set">tw_selectimage=1</action>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button style="main_button_full_width">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@adb_sideload_btn=ADB Sideload}</text>
+ <action function="page">sideload</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="install">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip} &gt; {@install_select_file_hdr=Select File}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_image_hdr=Install Image} &gt; {@install_select_file_hdr=Select File}</text>
+ </text>
+
+ <fileselector>
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%indent%" y="%row2_header_y%" w="%content_width%" h="%fileselector_install_height%"/>
+ <text>%tw_zip_location%</text>
+ <filter extn=".zip" folders="1" files="1"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="tw_filename"/>
+ <selection name="tw_file"/>
+ </fileselector>
+
+ <fileselector>
+ <condition var1="tw_selectimage" var2="1"/>
+ <placement x="%indent%" y="%row2_header_y%" w="%content_width%" h="%fileselector_install_height%"/>
+ <text>%tw_zip_location%</text>
+ <filter extn=".img" folders="1" files="1"/>
+ <path name="tw_zip_location" default="/sdcard"/>
+ <data name="tw_filename"/>
+ <selection name="tw_file"/>
+ </fileselector>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_storage"/>
+ <actions>
+ <action function="set">tw_storagetext={@install_hdr=Install} &gt; {@select_storage_hdr=Select Storage}</action>
+ <action function="set">tw_back=install</action>
+ <action function="page">select_storage</action>
+ </actions>
+ </button>
+
+ <action>
+ <conditions>
+ <condition var1="tw_selectimage" var2="0"/>
+ <condition var1="tw_filename" op="modified"/>
+ </conditions>
+ <actions>
+ <action function="queuezip"/>
+ <action function="page">flash_queue</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_selectimage" var2="1"/>
+ <condition var1="tw_filename" op="modified"/>
+ </conditions>
+ <action function="page">flashimage_type</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">install_type</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_queue">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip} &gt; {@queue_hdr=Queue}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@zip_queue_count_s=File %tw_zip_queue_count% of 10:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row4_y%"/>
+ <text>{@folder=Folder:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>%tw_zip_location%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row8_y%"/>
+ <text>{@zip_back_clear=Press back button to clear the queue.}</text>
+ </text>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <actions>
+ <action function="queueclear"/>
+ <action function="page">install</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_addzip"/>
+ <action function="page">install</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept"/>
+ <action function="page">flash_confirm</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">flash_options</action>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="queueclear"/>
+ <action function="page">install</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_options">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <condition var1="tw_selectimage" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip} &gt; {@options_hdr=Options}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@zip_sig_chk=Zip file signature verification}</text>
+ <data variable="tw_signed_zip_verify"/>
+ </checkbox>
+
+ <checkbox>
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <placement x="%indent%" y="%row2a_y%"/>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
+ <data variable="tw_inject_after_zip"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%indent%" y="%row4_y%"/>
+ <text>{@install_reboot_chk=Reboot after installation is complete}</text>
+ <data variable="tw_install_reboot"/>
+ </checkbox>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">flash_queue</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept_transp"/>
+ <action function="page">flash_confirm</action>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">flash_queue</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_confirm">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_zip_hdr=Install Zip} &gt; {@confirm_flash_hdr=Confirm Flash}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@file=File:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="48"/>
+ <action function="page">flash_queue</action>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row4_y%"/>
+ <text>{@zip_queue=Queue:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@zip_queue_count_s=File %tw_zip_queue_count% of 10:}</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row3a_y%" w="%screen_width%" h="48"/>
+ <action function="page">flash_queue</action>
+ </button>
+
+ <listbox style="listbox_options">
+ <placement x="%col1_x_left%" y="%row8_y%" w="%content_width%" h="80"/>
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
+ <data variable="tw_signed_zip_verify"/>
+ </listitem>
+ </listbox>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row7_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <condition var1="tw_inject_after_zip" var2="1"/>
+ <placement x="%indent%" y="%row9_y%"/>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row6a_y%" w="%screen_width%" h="64"/>
+ <action function="page">flash_options</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_confirm= Confirm}</text>
+ <action function="flash">flash_zip</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="cancelzip"/>
+ <action function="page">install</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flash_zip">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@installing_zip_xml=Installing Zip: %tw_file%}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <action function="page">flash_done</action>
+ </action>
+ </page>
+
+ <page name="flash_done">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m_fail">
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_failed=Installation Failed}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_operation_status" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_successful=Installation Successful}</text>
+ </text>
+
+ <template name="console"/>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row13_y%"/>
+ <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
+ <actions>
+ <action function="set">tw_back=flash_done</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=/cache</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=wipe</action>
+ <action function="set">tw_action2_param=dalvik</action>
+ <action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache &amp; Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache &amp; Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache &amp; Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe_s= Wipe}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row13_y%"/>
+ <text>{@reboot_system_btn=Reboot System}</text>
+ <actions>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=install_type</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_install_reboot" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ <condition var1="tw_reboot_system" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_sleep=%tw_sleep_total%</action>
+ <action function="page">flash_sleep_and_reboot</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="flash_sleep_and_reboot">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_reboot=Rebooting in %tw_sleep% second(s)}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_sleep" op="&gt;" var2="0"/>
+ <placement x="%col1_x_right%" y="%row13_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_install_reboot=0</action>
+ <action function="page">flash_done</action>
+ </actions>
+ </button>
+
+ <action>
+ <conditions>
+ <condition var1="tw_sleep" var2="tw_sleep_total"/>
+ <condition var1="tw_install_reboot" var2="1"/>
+ </conditions>
+ <action function="sleepcounter">%tw_sleep_total%</action>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_sleep" var2="0"/>
+ <condition var1="tw_install_reboot" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="sleep">50000</action>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="flashimage_type">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_image_hdr=Install Image} &gt; {@install_sel_target=Select Target Partition}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_rb">
+ <data name="tw_flash_partition"/>
+ <listtype name="flashimg"/>
+ </partitionlist>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">install</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept_transp"/>
+ <action function="page">flashimage_confirm</action>
+ </button>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">install</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="flashimage_confirm">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_image_hdr=Install Image} &gt; {@confirm_flash_hdr=Confirm Flash}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@file=File:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>%tw_file%</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="48"/>
+ <action function="page">install</action>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row4_y%"/>
+ <text>{@target_partition=Target Partition:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>%tw_flash_partition%</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row3a_y%" w="%screen_width%" h="48"/>
+ <action function="page">flashimage_type</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_confirm= Confirm}</text>
+ <actions>
+ <action function="set">tw_back=flashimage_confirm</action>
+ <action function="set">tw_action=flashimage</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action_text1={@flashing_image=Flashing Image...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@image_flashed=Image Flashed}</action>
+ <action function="page">action_page</action>
+ </actions>
+ <action function="flashimage"/>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=install</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="clear_vars">
+ <action>
+ <action function="set">tw_operation_state=0</action>
+ <action function="set">tw_text1=</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_text3=</action>
+ <action function="set">tw_text4=</action>
+ <action function="set">tw_action_text1=</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_action_param=</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_action2=</action>
+ <action function="set">tw_action2_param=</action>
+ <action function="set">tw_has_cancel=0</action>
+ <action function="set">tw_cancel_action=</action>
+ <action function="set">tw_cancel_param=</action>
+ <action function="set">tw_show_exclamation=0</action>
+ <action function="set">tw_show_reboot=0</action>
+ <action function="page">%tw_clear_destination%</action>
+ </action>
+ </page>
+
+ <page name="reboot_system_routine">
+ <action>
+ <action function="set">tw_back=main2</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=system</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_text3=</action>
+ <action function="set">tw_text4=</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </action>
+ </page>
+
+ <page name="confirm_action">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@confirm_action=Confirm Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>%tw_text1%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>%tw_text2%</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_action" op="!=" var2="changefilesystem"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_text3%</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_action" op="!=" var2="changefilesystem"/>
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>%tw_text4%</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_action" var2="changefilesystem"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_text3%</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_action" var2="changefilesystem"/>
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>%tw_text4%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider>
+ <text>%tw_slider_text%</text>
+ <action function="page">action_page</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="action_page">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_action_text1% %tw_action_text2%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_has_cancel" var2="1"/>
+ <placement x="%col1_x_right%" y="%row13_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="%tw_cancel_action%">%tw_cancel_param%</action>
+ </button>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="0"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="1"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="singleaction_page">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_action_text1% %tw_action_text2%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="0"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_has_action2" var2="1"/>
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="action_complete">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m_fail">
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_complete_text1% {@failed=Failed}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_operation_status" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_complete_text1% {@successful=Successful}</text>
+ </text>
+
+ <template name="console"/>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row13_y%"/>
+ <text>{@back_btn=Back}</text>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row13_y%"/>
+ <text>{@reboot_system_btn=Reboot System}</text>
+ <actions>
+ <action function="set">tw_back=main2</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_clear_destination=main2</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="filecheck">
+ <action>
+ <action function="fileexists">%tw_filecheck%</action>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_fileexists=1</action>
+ <action function="page">%tw_existpage%</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="1"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">%tw_notexistpage%</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="rebootcheck">
+ <action>
+ <condition var1="tw_backup_system_size" op="&gt;=" var2="%tw_min_system%"/>
+ <action function="page">appcheck</action>
+ </action>
+
+ <action>
+ <condition var1="tw_backup_system_size" op="&lt;" var2="%tw_min_system%"/>
+ <action function="page">confirm_action</action>
+ </action>
+ </page>
+
+ <page name="appcheck">
+ <action>
+ <condition var1="tw_app_prompt" var2="1"/>
+ <action function="checkforapp"></action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_prompt" op="!=" var2="1"/>
+ <action function="reboot">%tw_reboot_param%</action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_install_status" var2="1"/>
+ <action function="page">rebootapp</action>
+ </action>
+
+ <action>
+ <condition var1="tw_app_install_status" var2="2"/>
+ <action function="reboot">%tw_reboot_param%</action>
+ </action>
+ </page>
+
+ <page name="wipe_type1">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@select_type_hdr=Select Type}</text>
+ </text>
+
+ <button style="main_button_full_width">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@factory_reset_btn=Factory Reset}</text>
+ <action function="page">wipe</action>
+ </button>
+
+ <button style="main_button_full_width">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@advanced_wipe_btn=Advanced Wipe}</text>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">wipe_type2</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="wipe_type2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@select_type_hdr=Select Type}</text>
+ </text>
+
+ <button style="main_button_full_width">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@format_data_btn=Format Data}</text>
+ <action function="page">formatdata</action>
+ </button>
+
+ <button style="main_button_full_width">
+ <conditions>
+ <condition var1="tw_is_encrypted" var2="1"/>
+ <condition var1="tw_has_data_media" var2="0"/>
+ </conditions>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@wipe_enc_btn=Wipe Encryption}</text>
+ <actions>
+ <action function="set">tw_back=wipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=DATAMEDIA</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@wipe_enc_confirm=Wipe Encryption from Data?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_format_data_s= Format Data}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_full_width">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@file_sys_opt=File System Options}</text><actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partitionoptions_select</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">wipe_type1</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="wipe">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@factory_reset_hdr=Factory Reset}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@factory_reset1=Wipes Data, Cache, and Dalvik}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@factory_reset2=(not including internal storage)}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <conditions>
+ <condition var1="tw_has_android_secure" var2="1"/>
+ <condition var1="fileexists" var2="/and-sec"/>
+ </conditions>
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@android_secure=Android Secure}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_has_sdext_partition" var2="1"/>
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@sdext=SD-EXT}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@factory_reset3=Most of the time this is}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@factory_reset4=the only wipe that you need.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row9_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider>
+ <text>{@swipe_wipe_s= Wipe}</text>
+ <actions>
+ <action function="set">tw_back=wipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=data</action>
+ <action function="set">tw_action_text1={@factory_resetting=Factory Reset...}</action>
+ <action function="set">tw_complete_text1={@factory_reset_complete=Factory Reset Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe_type1</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="advancedwipe">
+ <action>
+ <action function="set">tw_wipe_list=</action>
+ </action>
+
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@advanced_wipe_hdr=Advanced Wipe} &gt; {@sel_part_hdr=Select Partitions}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_cb">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <data name="tw_wipe_list"/>
+ <listtype name="wipe"/>
+ </partitionlist>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row10a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <slider>
+ <text>{@swipe_wipe_s= Wipe}</text>
+ <actions>
+ <action function="set">tw_back=advancedwipe</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=LIST</action>
+ <action function="set">tw_text1={@wipe_sel_confirm=Wipe Selected Partition(s)?}</action>
+ <action function="set">tw_action_text1={@wiping_part=Wiping Partition(s)...}</action>
+ <action function="set">tw_complete_text1={@wipe_complete=Wipe Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe_type1</action>
+ </action>
+ </page>
+
+ <page name="formatdata">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@format_data_hdr=Format Data}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@format_data_wtc1=Format Data will wipe all of your apps,}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@format_data_wtc2=backups and media. This cannot be undone.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@yes_continue=Type yes to continue. Press back to cancel.}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row5_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_confirm_formatdata%</text>
+ <data name="tw_confirm_formatdata"/>
+ <restrict minlen="3" maxlen="3" allow="yes"/>
+ <action function="page">formatdata_confirm</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row6_input_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe_type2</action>
+ </action>
+ </page>
+
+ <page name="formatdata_confirm">
+ <action>
+ <condition var1="tw_confirm_formatdata" op="=" var2="yes"/>
+ <actions>
+ <action function="set">tw_back=formatdata</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=DATAMEDIA</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_confirm_formatdata" op="!=" var2="yes"/>
+ <action function="page">formatdata</action>
+ </action>
+ </page>
+
+ <page name="checkpartitionlist">
+ <action>
+ <condition var1="tw_check_partition_list" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="getpartitiondetails">tw_wipe_list</action>
+ <action function="page">partitionoptions</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_check_partition_list" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="page">partitionoptions_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="partitionoptions_select">
+ <action>
+ <action function="set">tw_wipe_list=</action>
+ </action>
+
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@file_sys_opt=File System Options} &gt; {@sel_part_hdr=Select Partitions}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_cb">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <data name="tw_wipe_list"/>
+ <listtype name="wipe"/>
+ </partitionlist>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row10a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="partitionlisterror" var2="1"/>
+ <placement x="%col1_x_left%" y="%row12_y%"/>
+ <text>{@invalid_part_sel=Invalid partition selection}</text>
+ </text>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/><actions>
+ <action function="checkpartitionlist">tw_wipe_list</action>
+ <action function="page">checkpartitionlist</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">wipe_type2</action>
+ </action>
+ </page>
+
+ <page name="partitionoptions">
+
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@wipe_hdr=Wipe} &gt; {@file_sys_opt=File System Options} &gt; {@sel_act_hdr=Select Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@partition=Partition: %tw_partition_name%}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_is_present" var2="1"/>
+ <placement x="%col1_x_left%" y="%row2a_y%"/>
+ <text>{@part_present_yes=Present: Yes}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_is_present" var2="0"/>
+ <placement x="%col1_x_left%" y="%row2a_y%"/>
+ <text>{@part_present_no=Present: No}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_removable" var2="1"/>
+ <placement x="%col1_x_right%" y="%row2a_y%"/>
+ <text>{@part_removable_yes=Removable: Yes}</text>
+ </text>
+
+ <text style="text_m">
+ <condition var1="tw_partition_removable" var2="0"/>
+ <placement x="%col1_x_right%" y="%row2a_y%"/>
+ <text>{@part_removable_no=Removable: No}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row3a_y%"/>
+ <text>{@part_size=Size: %tw_partition_size%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_right%" y="%row3a_y%"/>
+ <text>{@part_used=Used: %tw_partition_used%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row4a_y%"/>
+ <text>{@part_free=Free: %tw_partition_free%MB}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_right%" y="%row4a_y%"/>
+ <text>{@part_backup_size=Backup Size: %tw_partition_backup_size%MB}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_partition_can_resize" op="=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@resize_btn_s=Resize}</text>
+ <actions>
+ <action function="set">tw_back=partitionoptions</action>
+ <action function="set">tw_action=resize</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=getpartitiondetails</action>
+ <action function="set">tw_action2_param=tw_wipe_list</action>
+ <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@resizing=Resizing...}</action>
+ <action function="set">tw_complete_text1={@resize_complete=Resize Complete}</action>
+ <action function="set">tw_slider_text={@swipe_resize_s= Resize}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_partition_can_repair" op="=" var2="1"/>
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@repair_btn_s=Repair}</text>
+ <actions>
+ <action function="set">tw_back=partitionoptions</action>
+ <action function="set">tw_action=repair</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@repair_confirm=Repair %tw_partition_name%?}</action>
+ <action function="set">tw_text2=</action>
+ <action function="set">tw_action_text1={@repairing=Repairing...}</action>
+ <action function="set">tw_complete_text1={@repair_complete=Repair Complete}</action>
+ <action function="set">tw_slider_text={@swipe_repair_s= Repair}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">partitionoptions_select</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row11_y%"/>
+ <text>{@change_fs_btn_s=Change}</text>
+ <action function="page">selectfilesystem</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">partitionoptions_select</action>
+ </action>
+ </page>
+
+ <page name="refreshfilesystem">
+ <action>
+ <condition var1="tw_check_partition_list" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="getpartitiondetails">tw_wipe_list</action>
+ <action function="page">selectfilesystem</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_check_partition_list" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="set">tw_wipe_list=</action>
+ <action function="page">advancedwipe</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="selectfilesystem">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@change_fs_for_hdr_s=Partition: %tw_partition_name% &gt; Select File System}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>EXT2</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext2</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT2</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>EXT3</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext3</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT3</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_partition_ext" op="=" var2="1"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>EXT4</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=ext4</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT4</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_partition_vfat" op="=" var2="1"/>
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>FAT</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=vfat</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=FAT</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_partition_exfat" op="=" var2="1"/>
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>exFAT</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=exfat</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=exFAT</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_partition_f2fs" op="=" var2="1"/>
+ <placement x="%col1_x_right%" y="%row11_y%"/>
+ <text>F2FS</text>
+ <actions>
+ <action function="set">tw_back=refreshfilesystem</action>
+ <action function="set">tw_action=changefilesystem</action>
+ <action function="set">tw_action_param=%tw_partition_mount_point%</action>
+ <action function="set">tw_action_new_file_system=f2fs</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=F2FS</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">partitionoptions</action>
+ </action>
+ </page>
+
+ <page name="backup">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@select_storage_hdr=Select Storage}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_rb">
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <button>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_refresh"/>
+ <actions>
+ <action function="refreshsizes"/>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_back" var2="backup_confirm"/>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept"/>
+ <action function="page">backup_confirm</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <actions>
+ <action function="set">tw_back=backup</action>
+ <action function="page">backup_selectpartitions</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="backup_selectpartitions">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@sel_part_hdr=Select Partitions}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_cb">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <data name="tw_backup_list"/>
+ <listtype name="backup"/>
+ </partitionlist>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row10a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">backup</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_refresh"/>
+ <action function="page">backup_selectpartitions</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept"/>
+ <action function="page">backup_confirm</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <actions>
+ <action function="set">tw_back=backup_selectpartitions</action>
+ <action function="page">backup_options</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="backup_options">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@options_hdr=Options}</text>
+ </text>
+
+ <listbox style="scrolllist">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <listitem name="{@enable_backup_comp_chk=Enable compression}">
+ <data variable="tw_use_compression"/>
+ </listitem>
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
+ <data variable="tw_skip_md5_generate"/>
+ </listitem>
+ <listitem name="{@disable_backup_space_chk=Disable free space check before backup}">
+ <data variable="tw_disable_free_space"/>
+ </listitem>
+ </listbox>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">backup_selectpartitions</action>
+ </button>
+
+ <button>
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_encryption_dis"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="set">tw_back=backup_options</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button>
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_encryption_en"/>
+ <actions>
+ <action function="set">tw_password_not_match=0</action>
+ <action function="set">tw_back=backup_options</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept_transp"/>
+ <actions>
+ <action function="set">tw_back=backup_options</action>
+ <action function="page">backup_confirm</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="backup_confirm">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@backup_confirm_hdr=Confirm Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row2_y%"/>
+ <text>%tw_backup_name%</text>
+ </text>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_half_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row2_header_y%" w="%screen_half_width%" h="48"/>
+ <actions>
+ <action function="set">tw_back=backup_confirm</action>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">backup_name1</action>
+ </actions>
+ </button>
+
+ <fill color="%background_color%">
+ <placement x="%col1_x_left_negative%" y="%row2_header_y%" w="%screen_half_width%" h="48"/>
+ </fill>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row3a_y%"/>
+ <text>{@partitions=Partitions:}</text>
+ </text>
+
+ <partitionlist style="partitionlist_summary">
+ <placement x="%col1_x_left%" y="%row4a_y%" w="%content_half_width%" h="96"/>
+ <data name="tw_backup_list"/>
+ <listtype name="backup"/>
+ </partitionlist>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row3a_y%" w="%screen_half_width%" h="112"/>
+ <actions>
+ <action function="set">tw_back=backup_confirm</action>
+ <action function="page">backup_selectpartitions</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@storage=Storage:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_right%" y="%row2_y%"/>
+ <text>%tw_storage_display_name%</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="%center_x%" y="%row2_header_y%" w="%screen_half_width%" h="48"/>
+ <actions>
+ <action function="set">tw_back=backup_confirm</action>
+ <action function="page">backup</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row3a_y%"/>
+ <text>{@encryption=Encryption:}</text>
+ </text>
+
+ <text style="text_m">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="0"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%col1_x_right%" y="%row4a_y%"/>
+ <text>{@disabled=Disabled}</text>
+ </text>
+
+ <text style="text_m">
+ <conditions>
+ <condition var1="tw_include_encrypted_backup" var2="1"/>
+ <condition var1="tw_encrypt_backup" var2="1"/>
+ <condition var1="tw_enable_adb_backup" op="!=" var2="1"/>
+ </conditions>
+ <placement x="%col1_x_right%" y="%row4a_y%"/>
+ <text>{@enabled=Enabled}</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="%center_x%" y="%row3a_y%" w="%screen_half_width%" h="48"/>
+ <actions>
+ <action function="set">tw_back=backup_confirm</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </button>
+
+ <listbox style="listbox_options">
+ <placement x="%col1_x_right%" y="%row7_y%" w="%content_half_width%" h="80"/>
+ <listitem name="{@enable_backup_comp_chk=Enable compression}">
+ <data variable="tw_use_compression"/>
+ </listitem>
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
+ <data variable="tw_skip_md5_generate"/>
+ </listitem>
+ <listitem name="{@disable_backup_space_chk=Disable free space check before backup}">
+ <data variable="tw_disable_free_space"/>
+ </listitem>
+ </listbox>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="%center_x%" y="%row6_y%" w="%screen_half_width%" h="64"/>
+ <actions>
+ <action function="set">tw_back=backup_confirm</action>
+ <action function="page">backup_options</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_confirm= Confirm}</text>
+ <action function="page">backup_run</action>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">backup</action>
+ </action>
+ </page>
+
+ <page name="backup_name1">
+ <action>
+ <condition var1="tw_backup_name" op="=" var2="{@auto_generate=(Auto Generate)}"/>
+ <action function="generatebackupname"/>
+ </action>
+
+ <action>
+ <action function="page">backup_name2</action>
+ </action>
+ </page>
+
+ <page name="backup_name2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@backup_name_hdr=Set Backup Name}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_name%</text>
+ <data name="tw_backup_name"/>
+ <restrict minlen="1" maxlen="64" allow=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.{}[]"/>
+ <actions>
+ <action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_name%</action>
+ <action function="set">tw_existpage=backup_name2</action>
+ <action function="set">tw_notexistpage=backup_confirm</action>
+ <action function="page">filecheck</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%"/>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">backup_confirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@append_date_btn=Append Date}</text>
+ <action function="appenddatetobackupname"/>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
+ <action function="page">backup_confirm</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="backupencryption">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@encrypt_backup=Encrypt your Backup?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_encrypt_display%</text>
+ <data name="tw_backup_password" mask="*" maskvariable="tw_backup_encrypt_display"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">backupencryption2</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_not_match" var2="1"/>
+ <placement x="%col1_x_left%" y="row3_input_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_not_match" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%"/>
+ <text>{@pass_not_match=Passwords do not match!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+ </page>
+
+ <page name="backupencryption2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@backup_hdr=Backup} &gt; {@encrypt_backup=Encrypt your Backup?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@enter_pass2=Enter Password again:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_encrypt_display2%</text>
+ <data name="tw_backup_password2" mask="*" maskvariable="tw_backup_encrypt_display2"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">checkbackuppassword</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+ </page>
+
+ <page name="checkbackuppassword">
+ <action>
+ <condition var1="tw_backup_password2" var2="tw_backup_password"/>
+ <actions>
+ <action function="set">tw_encrypt_backup=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_backup_password2" op="!=" var2="tw_backup_password"/>
+ <actions>
+ <action function="set">tw_encrypt_backup=0</action>
+ <action function="set">tw_password_not_match=1</action>
+ <action function="set">tw_backup_password=</action>
+ <action function="set">tw_backup_password2=</action>
+ <action function="set">tw_backup_encrypt_display=</action>
+ <action function="set">tw_backup_encrypt_display2=</action>
+ <action function="page">backupencryption</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="backup_run">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_operation% %tw_partition%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row13a_y%"/>
+ <text>%tw_file_progress%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row14a_y%"/>
+ <text>%tw_size_progress%</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row13_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="cancelbackup"/>
+ </button>
+
+ <action>
+ <action function="nandroid">backup</action>
+ </action>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_cancel_backup" var2="0"/>
+ <actions>
+ <action function="set">tw_back=backup_selectpartitions</action>
+ <action function="set">tw_complete_text1={@backup_complete=Backup Complete}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_cancel_backup" var2="1"/>
+ <actions>
+ <action function="set">tw_back=backup_selectpartitions</action>
+ <action function="set">tw_complete_text1={@backup_cancel=Backup Cancelled}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@sel_backup_hdr=Select Backup}</text>
+ </text>
+
+ <fileselector>
+ <placement x="%indent%" y="%row2_header_y%" w="%content_width%" h="%fileselector_install_height%"/>
+ <text>%tw_storage_display_name%</text>
+ <filter folders="1" files="0" nav="0"/>
+ <path name="tw_backups_folder"/>
+ <data name="tw_restore" default=""/>
+ <selection name="tw_restore_name"/>
+ </fileselector>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_storage"/>
+ <actions>
+ <action function="set">tw_storagetext={@restore_btn=Restore} &gt; {@select_storage_btn=Select Storage}</action>
+ <action function="set">tw_back=restore</action>
+ <action function="page">select_storage</action>
+ </actions>
+ </button>
+
+ <action>
+ <condition var1="tw_restore" op="modified"/>
+ <actions>
+ <action function="readBackup"/>
+ <action function="set">tw_back=restore</action>
+ <action function="page">restore_read</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="restore_read">
+ <action>
+ <condition var1="tw_restore_encrypted" var2="1"/>
+ <actions>
+ <action function="set">tw_password_fail=0</action>
+ <action function="page">restore_decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_restore_encrypted" var2="0"/>
+ <actions>
+ <action function="page">restore_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore_decrypt">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@restore_enc_backup_hdr=Encrypted Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_restore_display%</text>
+ <data name="tw_restore_password" mask="*" maskvariable="tw_restore_display"/>
+ <restrict minlen="1" maxlen="32" allow="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"/>
+ <action function="page">try_restore_decrypt</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="row3_input_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%"/>
+ <text>{@restore_dec_fail=Password failed, please try again!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">restore</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@del_backup_btn=Delete Backup}</text>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; rm -rf "%tw_restore_name%"</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete_s= Delete}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore</action>
+ </action>
+ </page>
+
+ <page name="try_restore_decrypt">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@restore_try_decrypt_s=Trying Decryption}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <action function="decrypt_backup"/>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_password_fail=1</action>
+ <action function="page">restore_decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">restore_select</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="restore_select">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@sel_part_hdr=Select Partitions}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_cb">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <data name="tw_restore_list" selectedlist="tw_restore_selected"/>
+ <listtype name="restore"/>
+ </partitionlist>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row10a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">restore</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_delete"/>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; rm -rf "%tw_restore_name%"</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete_s= Delete}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept"/>
+ <action function="page">restore_confirm</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <actions>
+ <action function="set">tw_back=restore_select</action>
+ <action function="page">restore_options</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+ </page>
+
+ <page name="restore_options">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@options_hdr=Options}</text>
+ </text>
+
+ <listbox style="scrolllist">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <listitem name="{@restore_enable_md5_chk=Enable MD5 Verification of Backup Files}">
+ <data variable="tw_skip_md5_check"/>
+ </listitem>
+ </listbox>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">restore_select</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept_transp"/>
+ <actions>
+ <action function="set">tw_back=restore_options</action>
+ <action function="page">restore_confirm</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="renamebackup">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@rename_backup_hdr=Rename Backup}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_backup_rename%</text>
+ <data name="tw_backup_rename"/>
+ <restrict minlen="1" maxlen="64" allow=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.{}[]"/>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_action=cmd</action>
+ <action function="set">tw_action_param=cd %tw_backups_folder% &amp;&amp; mv "%tw_restore_name%" "%tw_backup_rename%"</action>
+ <action function="set">tw_text1={@rename_backup_confirm=Rename Backup?}</action>
+ <action function="set">tw_text2={@rename_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@renaming_backup=Renaming Backup...}</action>
+ <action function="set">tw_complete_text1={@rename_backup_complete=Backup Rename Complete}</action>
+ <action function="set">tw_slider_text={@swipe_rename= Rename}</action>
+ <action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_rename%</action>
+ <action function="set">tw_existpage=renamebackup</action>
+ <action function="set">tw_notexistpage=confirm_action</action>
+ <action function="page">filecheck</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_fileexists" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%"/>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">restore_confirm</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore_confirm</action>
+ </action>
+ </page>
+
+ <page name="restore_confirm">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@restore_hdr=Restore} &gt; {@confirm_hdr=Confirm}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>%tw_restore_name%</text>
+ </text>
+
+ <fill color="%accent_color%">
+ <placement x="%indent%" y="64" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="48"/>
+ <actions>
+ <action function="set">tw_back=restore_confirm</action>
+ <action function="set">tw_backup_rename=%tw_restore_name%</action>
+ <action function="set">tw_fileexists=0</action>
+ <action function="page">renamebackup</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row3a_y%"/>
+ <text>{@partitions=Partitions:}</text>
+ </text>
+
+ <partitionlist style="partitionlist_summary">
+ <placement x="%col1_x_left%" y="%row4a_y%" w="%content_half_width%" h="96"/>
+ <data name="tw_restore_list" selectedlist="tw_restore_selected"/>
+ <listtype name="restore"/>
+ </partitionlist>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%row3a_y%" w="%screen_half_width%" h="112"/>
+ <actions>
+ <action function="set">tw_back=restore_confirm</action>
+ <action function="page">restore_select</action>
+ </actions>
+ </button>
+
+ <listbox style="listbox_options">
+ <placement x="%col1_x_right%" y="%row4a_y%" w="%content_half_width%" h="80"/>
+ <listitem name="{@restore_enable_md5_chk=Enable MD5 Verification of Backup Files}">
+ <data variable="tw_skip_md5_check"/>
+ </listitem>
+ </listbox>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_right%" y="%row3a_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="%center_x%" y="%row3a_y%" w="%screen_half_width%" h="64"/>
+ <actions>
+ <action function="set">tw_back=restore_confirm</action>
+ <action function="page">restore_options</action>
+ </actions>
+ </button>
+
+ <slider>
+ <text>{@swipe_restore_s= Restore}</text>
+ <action function="page">restore_run</action>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">restore_options</action>
+ </action>
+ </page>
+
+ <page name="restore_run">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_operation% %tw_partition%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <text style="text_m">
+ <placement x="%indent%" y="%row14a_y%"/>
+ <text>%tw_size_progress%</text>
+ </text>
+
+ <action>
+ <condition var1="tw_operation_state" var2="1"/>
+ <actions>
+ <action function="set">tw_back=restore</action>
+ <action function="set">tw_complete_text1={@restore_complete=Restore Complete}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <action function="nandroid">restore</action>
+ </action>
+ </page>
+
+ <page name="mount">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@mount_hdr=Mount} &gt; %tw_storage_display_name%</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_cb">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
+ <listtype name="mount"/>
+ </partitionlist>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row10a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button style="checkbox">
+ <condition var1="tw_mount_system_ro" op="=" var2="0"/>
+ <placement x="%col1_x_left%" y="%row11_y%" textplacement="6"/>
+ <text>{@mount_sys_ro_s_chk=Mount System RO}</text>
+ <image resource="checkbox_false"/>
+ <action function="mountsystemtoggle">1</action>
+ </button>
+
+ <button style="checkbox">
+ <condition var1="tw_mount_system_ro" op="!=" var2="0"/>
+ <placement x="%col1_x_left%" y="%row11_y%" textplacement="6"/>
+ <text>{@mount_sys_ro_s_chk=Mount System RO}</text>
+ <image resource="checkbox_true"/>
+ <actions>
+ <action function="set">tw_lifetime_writes=2</action>
+ <action function="page">system_readonly_check</action>
+ </actions>
+ </button>
+
+ <button style="checkbox">
+ <conditions>
+ <condition var1="tw_has_mtp" var2="1"/>
+ <condition var1="tw_mtp_enabled" var2="0"/>
+ </conditions>
+ <placement x="%col1_x_left%" y="%row13_y%" textplacement="6"/>
+ <image resource="checkbox_false"/>
+ <text>{@enable_mtp_btn=Enable MTP}</text>
+ <action function="startmtp"/>
+ </button>
+
+ <button style="checkbox">
+ <conditions>
+ <condition var1="tw_has_mtp" var2="1"/>
+ <condition var1="tw_mtp_enabled" var2="1"/>
+ </conditions>
+ <placement x="%col1_x_left%" y="%row13_y%" textplacement="6"/>
+ <image resource="checkbox_true"/>
+ <text>{@disable_mtp_btn=Disable MTP}</text>
+ <action function="stopmtp"/>
+ </button>
+
+ <button>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_storage"/>
+ <actions>
+ <action function="set">tw_storagetext={@mount_hdr=Mount} &gt; {@select_storage_hdr=Select Storage}</action>
+ <action function="set">tw_back=mount</action>
+ <action function="page">select_storage</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">mount_options</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="mount_options">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@mount_hdr=Mount} &gt; %tw_storage_display_name%</text>
+ </text>
+
+ <button style="main_button_full_width">
+ <condition var1="tw_has_usb_storage" var2="1"/>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@mount_usb_storage_btn=Mount USB Storage}</text>
+ <action function="page">usb_mount</action>
+ </button>
+
+ <button style="main_button_full_width">
+ <conditions>
+ <condition var1="tw_is_encrypted" var2="1"/>
+ <condition var1="tw_is_decrypted" var2="0"/>
+ </conditions>
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@decrypt_data_btn=Decrypt Data}</text>
+ <action function="page">decrypt</action>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">mount</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">mount</action>
+ </action>
+ </page>
+
+ <page name="usb_mount">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@mount_hdr=Mount} &gt; {@usb_storage_hdr=USB Storage}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@usb_stor_mnt1=USB Storage Mounted}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@usb_stor_mnt2=Be sure to safely remove your device}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@usb_stor_mnt3=from your computer before unmounting!}</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <text>{@unmount_btn=Unmount}</text>
+ <action function="page">usb_umount</action>
+ </button>
+
+ <action>
+ <action function="mount">usb</action>
+ <action function="set">tw_busy=1</action>
+ </action>
+ </page>
+
+ <page name="usb_umount">
+ <action>
+ <action function="unmount">usb</action>
+ </action>
+
+ <action>
+ <action function="page">mount_options</action>
+ <action function="set">tw_busy=0</action>
+ </action>
+ </page>
+
+ <page name="system_readonly_check">
+ <action>
+ <action function="checkpartitionlifetimewrites">/system</action>
+ </action>
+
+ <action>
+ <condition var1="tw_lifetime_writes" var2="1"/>
+ <actions>
+ <action function="mountsystemtoggle">0</action>
+ <action function="page">mount</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_lifetime_writes" var2="0"/>
+ <actions>
+ <action function="set">tw_back=mount</action>
+ <action function="page">system_readonly</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="reboot">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@reboot_hdr=Reboot}</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_system" var2="1"/>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@rb_system_btn=System}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="page">reboot_system_routine</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_poweroff" var2="1"/>
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@rb_poweroff_btn=Power Off}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=poweroff</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_ospo=sure you wish to power off?}</action>
+ <action function="set">tw_action_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_complete_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_slider_text={@swipe_power_off_s=Power Off}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_recovery" var2="1"/>
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@rb_recovery_btn=Recovery}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=recovery</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_reboot_bootloader" var2="1"/>
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@rb_bootloader_btn=Bootloader}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=bootloader</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_download_mode" var2="1"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@rb_download_btn=Download}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=reboot</action>
+ <action function="set">tw_reboot_param=download</action>
+ <action function="set">tw_has_action2=0</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
+ <action function="page">rebootcheck</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="rebootapp">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@reboot_hdr=Reboot} &gt; {@reboot_install_app_hdr=Install TWRP App?}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@reboot_install_app1=Would you like to install the Official TWRP App?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@reboot_install_app2=The app can check for new TWRP versions.}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row3_y%"/>
+ <text>{@reboot_install_app_prompt_install=Prompt to install TWRP app if not installed}</text>
+ <data variable="tw_app_prompt"/>
+ </checkbox>
+
+ <checkbox>
+ <condition var1="tw_mount_system_ro" var2="0"/>
+ <placement x="%indent%" y="%row5_y%"/>
+ <text>{@reboot_install_app_system=Install as a System App}</text>
+ <data variable="tw_app_install_system"/>
+ </checkbox>
+
+ <button style="main_button_half_height">
+ <placement x="%indent%" y="%row7_y%"/>
+ <text>{@su_cancel=Do not Install}</text>
+ <action function="reboot">%tw_reboot_param%</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_su_install= Install}</text>
+ <actions>
+ <action function="set">tw_back=reboot</action>
+ <action function="set">tw_action=installapp</action>
+ <action function="set">tw_action_text1={@reboot_installing_app=Installing App...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=reboot</action>
+ <action function="set">tw_action2_param=%tw_reboot_param%</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_app_install_status=0</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_app_install_status=0</action>
+ <action function="page">reboot</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="system_readonly">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@sys_ro_hdr=Unmodified System Partition}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@sys_ro_keep=Keep System Read only?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@sys_rop1=TWRP can leave your system partition unmodified}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>{@sys_rop2=to make it easier for you to take official updates.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@sys_rop3=TWRP will be unable to prevent the stock ROM from}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@sys_rop4=replacing TWRP and will not offer to root your device.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@sys_rop5=Installing zips or performing adb operations may still}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row7_y%" placement="5"/>
+ <text>{@sys_rop6=modify the system partition.}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row8a_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="page">settings_language</action>
+ </button>
+
+ <checkbox>
+ <condition var1="tw_is_encrypted" var2="0"/>
+ <placement x="%indent%" y="%row11_y%"/>
+ <text>{@sys_ro_never_show_chk=Never show this screen during boot again}</text>
+ <data variable="tw_never_show_system_ro_page"/>
+ </checkbox>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row13_y%"/>
+ <text>{@sys_ro_keep_ro_btn=Keep Read Only}</text>
+ <actions>
+ <action function="mountsystemtoggle">1</action>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row13_y%"/>
+ <text>{@swipe_allow_mod_s=Allow Modifications}</text>
+ <actions>
+ <action function="mountsystemtoggle">0</action>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">%tw_back%</action>
+ </actions>
+ </button>
+ </page>
+
+ <page name="settings">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@settings_gen_btn=General}</text>
+ <action function="page">settings_general</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@settings_tz_btn=Time Zone}</text>
+ <action function="page">settings_timezone</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@settings_screen_btn=Screen}</text>
+ <action function="page">settings_screen</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@settings_vibration_btn=Vibration}</text>
+ <action function="page">settings_vibration</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@settings_language_btn=Language}</text>
+ <action function="page">settings_language</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_reset"/>
+ <action function="restoredefaultsettings"/>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main3</action>
+ </action>
+ </page>
+
+ <page name="settings_general">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@settings_gen_s_hdr=General}</text>
+ </text>
+
+ <listbox style="scrolllist">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%listbox_settings_height%"/>
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
+ <data variable="tw_signed_zip_verify"/>
+ </listitem>
+ <listitem name="{@install_reboot_chk=Reboot after installation is complete}">
+ <data variable="tw_install_reboot"/>
+ </listitem>
+ <listitem name="{@use_rmrf_chk=Use rm -rf instead of formatting}">
+ <data variable="tw_rm_rf"/>
+ </listitem>
+ <listitem name="{@disable_backup_space_chk=Disable free space check before backup}">
+ <data variable="tw_disable_free_space"/>
+ </listitem>
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
+ <data variable="tw_skip_md5_generate"/>
+ </listitem>
+ <listitem name="{@restore_enable_md5_chk=Enable MD5 verification of backup files}">
+ <data variable="tw_skip_md5_check"/>
+ </listitem>
+ <listitem name="{@use24clock_chk=Use 24-hour clock}">
+ <data variable="tw_military_time"/>
+ </listitem>
+ <listitem name="{@reboot_install_app_prompt_install=Prompt to install TWRP app on every reboot}">
+ <data variable="tw_app_prompt"/>
+ </listitem>
+ <listitem name="{@simact_chk=Simulate actions for theme testing}">
+ <data variable="tw_simulate_actions"/>
+ </listitem>
+ <listitem name="{@simfail_chk=Simulate failure for actions}">
+ <data variable="tw_simulate_fail"/>
+ <condition var1="tw_simulate_actions" var2="1"/>
+ </listitem>
+ </listbox>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="settings_timezone">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@time_zone_hdr=Time Zone}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <listbox style="listbox_headerless">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%listbox_timezone_height%"/>
+ <data name="tw_time_zone_guisel"/>
+ <listitem name="{@utcm11=(UTC -11) Samoa, Midway Island}">BST11;BDT</listitem>
+ <listitem name="{@utcm10=(UTC -10) Hawaii}">HST10;HDT</listitem>
+ <listitem name="{@utcm9=(UTC -9) Alaska}">AST9;ADT</listitem>
+ <listitem name="{@utcm8=(UTC -8) Pacific Time}">PST8;PDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm7=(UTC -7) Mountain Time}">MST7;MDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm6=(UTC -6) Central Time}">CST6;CDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm5=(UTC -5) Eastern Time}">EST5;EDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm4=(UTC -4) Atlantic Time}">AST4;ADT</listitem>
+ <listitem name="{@utcm3=(UTC -3) Brazil, Buenos Aires}">GRNLNDST3;GRNLNDDT</listitem>
+ <listitem name="{@utcm2=(UTC -2) Mid-Atlantic}">FALKST2;FALKDT</listitem>
+ <listitem name="{@utcm1=(UTC -1) Azores, Cape Verde}">AZOREST1;AZOREDT</listitem>
+ <listitem name="{@utc0=(UTC 0) London, Dublin, Lisbon}">GMT0;BST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp1=(UTC +1) Berlin, Brussels, Paris}">CET-1;CEST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp2=(UTC +2) Athens, Istanbul, South Africa}">WET-2;WET,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp3=(UTC +3) Moscow, Baghdad}">SAUST-3;SAUDT</listitem>
+ <listitem name="{@utcp4=(UTC +4) Abu Dhabi, Tbilisi, Muscat}">WST-4;WDT</listitem>
+ <listitem name="{@utcp5=(UTC +5) Yekaterinburg, Islamabad}">PAKST-5;PAKDT</listitem>
+ <listitem name="{@utcp6=(UTC +6) Almaty, Dhaka, Colombo}">TASHST-6;TASHDT</listitem>
+ <listitem name="{@utcp7=(UTC +7) Bangkok, Hanoi, Jakarta}">THAIST-7;THAIDT</listitem>
+ <listitem name="{@utcp8=(UTC +8) Beijing, Singapore, Hong Kong}">TAIST-8;TAIDT</listitem>
+ <listitem name="{@utcp9=(UTC +9) Tokyo, Seoul, Yakutsk}">JST-9;JSTDT</listitem>
+ <listitem name="{@utcp10=(UTC +10) Eastern Australia, Guam}">EET-10;EETDT</listitem>
+ <listitem name="{@utcp11=(UTC +11) Vladivostok, Solomon Islands}">MET-11;METDT</listitem>
+ <listitem name="{@utcp12=(UTC +12) Auckland, Wellington, Fiji}">NZST-12;NZDT</listitem>
+ </listbox>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <actions>
+ <action function="setguitimezone"/>
+ <action function="page">settings_timezone2</action>
+ </actions>
+ </button>
+
+ <action>
+ <condition var1="tw_time_zone_guisel" op="modified"/>
+ <action function="setguitimezone"/>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="page">main</action>
+ <action function="setguitimezone"/>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="page">settings</action>
+ <action function="setguitimezone"/>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="settings_timezone2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@time_zone_hdr=Time Zone}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <checkbox>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <font resource="font_m" color="%text_color%"/>
+ <text>{@use_dst_chk=Use daylight savings time (DST)}</text>
+ <data variable="tw_time_zone_guidst"/>
+ <image checked="checkbox_true" unchecked="checkbox_false"/>
+ </checkbox>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@sel_tz_offset=Select Offset (usually 0): %tw_time_zone_guioffset%}</text>
+ </text>
+
+ <button style="main_button_quarter_width">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@tz_offset_0=0}</text>
+ <actions>
+ <action function="set">tw_time_zone_guioffset=0</action>
+ <action function="setguitimezone"/>
+ </actions>
+ </button>
+
+ <button style="main_button_quarter_width">
+ <placement x="%btn4_col2_x%" y="%row6_y%"/>
+ <text>{@tz_offset_15=15}</text>
+ <actions>
+ <action function="set">tw_time_zone_guioffset=15</action>
+ <action function="setguitimezone"/>
+ </actions>
+ </button>
+
+ <button style="main_button_quarter_width">
+ <placement x="%btn4_col3_x%" y="%row6_y%"/>
+ <text>{@tz_offset_30=30}</text>
+ <actions>
+ <action function="set">tw_time_zone_guioffset=30</action>
+ <action function="setguitimezone"/>
+ </actions>
+ </button>
+
+ <button style="main_button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row6_y%"/>
+ <text>{@tz_offset_45=45}</text>
+ <actions>
+ <action function="set">tw_time_zone_guioffset=45</action>
+ <action function="setguitimezone"/>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <actions>
+ <action function="setguitimezone"/>
+ <action function="page">settings_timezone</action>
+ </actions>
+ </button>
+
+ <text style="text_m_accent">
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <text>{@curr_tz_s=Current Time Zone:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%btn4_col2_x%" y="%row12a_y%"/>
+ <text>%tw_time_zone%</text>
+ </text>
+
+ <action>
+ <condition var1="tw_time_zone_guidst" op="modified"/>
+ <action function="setguitimezone"/>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="setguitimezone"/>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="setguitimezone"/>
+ <action function="page">settings_timezone</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="settings_screen">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@settings_screen_timeout_hdr=Screen Timeout}</text>
+ </text>
+
+ <button style="checkbox">
+ <condition var1="tw_screen_timeout_secs" op="=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <placement x="%indent%" y="%row1_y%" textplacement="6"/>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
+ <image resource="checkbox_false"/>
+ <action function="set">tw_screen_timeout_secs=60</action>
+ </button>
+
+ <button style="checkbox">
+ <condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <placement x="%indent%" y="%row1_y%" textplacement="6"/>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
+ <image resource="checkbox_true"/>
+ <action function="set">tw_screen_timeout_secs=0</action>
+ </button>
+
+ <slidervalue>
+ <condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
+ <placement x="col1_x_left" y="%row2a_y%" w="%content_width%"/>
+ <text>{@screen_to_slider_s=Screen timeout in seconds (0=disabled): %tw_screen_timeout_secs%}</text>
+ <data variable="tw_screen_timeout_secs" min="15" max="300"/>
+ </slidervalue>
+
+ <text style="text_m_fail">
+ <condition var1="tw_no_screen_timeout" op="=" var2="1"/>
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@screen_to_na=Screen timeout setting unavailable}</text>
+ </text>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">settings_screen2</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="settings_screen2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@settings_screen_bright_btn=Screen Brightness}</text>
+ </text>
+
+ <slidervalue>
+ <condition var1="tw_has_brightnesss_file" var2="1"/>
+ <placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
+ <text>{@screen_bright_slider=Brightness: %tw_brightness_pct%%}</text>
+ <data variable="tw_brightness_pct" min="10" max="100"/>
+ <actions>
+ <action function="set">tw_brightness=%tw_brightness_max%</action>
+ <action function="compute">tw_brightness*%tw_brightness_pct%</action>
+ <action function="compute">tw_brightness/100</action>
+ <action function="setbrightness">%tw_brightness%</action>
+ </actions>
+ </slidervalue>
+
+ <text style="text_m_fail">
+ <condition var1="tw_has_brightnesss_file" var2="0"/>
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@screen_bright_na=Brightness setting unavailable}</text>
+ </text>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">settings_screen</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="settings_vibration">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@vibration_hdr=Vibration} - {@button_vibration_hdr=Button Vibration}</text>
+ </text>
+
+ <slidervalue>
+ <placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
+ <text>{@button_vibration=Button Vibration:}</text>
+ <data variable="tw_button_vibrate" min="0" max="300"/>
+ </slidervalue>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">settings_vibration2</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="settings_vibration2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@vibration_hdr=Vibration} - {@kb_vibration_hdr=Keyboard Vibration}</text>
+ </text>
+
+ <slidervalue>
+ <placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
+ <text>{@kb_vibration=Keyboard Vibration:}</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300"/>
+ </slidervalue>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">settings_vibration</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">settings_vibration3</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="settings_vibration3">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@vibration_hdr=Vibration} - {@act_vibration_hdr=Action Vibration}</text>
+ </text>
+
+ <slidervalue>
+ <placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
+ <text>{@act_vibration=Action Vibration:}</text>
+ <data variable="tw_action_vibrate" min="0" max="500"/>
+ </slidervalue>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">settings_vibration2</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="settings_language">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} &gt; {@language_hdr=Language} - %tw_language_display%</text>
+ </text>
+
+ <listbox style="scrolllist">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%fileselector_filemanager_height%"/>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept_transp"/>
+ <action function="setlanguage"></action>
+ </button>
+
+ <action>
+ <touch key="home" />
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back" />
+ <action function="page">settings</action>
+ </action>
+ </page>
+
+ <page name="advanced">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced}</text>
+ </text>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@terminal_btn=Terminal}</text>
+ <action function="page">terminalcommand</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_data_media" var2="1"/>
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@fix_context_btn=Fix Contexts}</text>
+ <action function="page">fixcontexts</action>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@reload_theme_btn=Reload Theme}</text>
+ <action function="reload"/>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_allow_partition_sdcard" var2="1"/>
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@part_sd_s_btn=SD Card}</text>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_show_dumlock" var2="1"/>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@dumlock_btn=HTC Dumlock}</text>
+ <action function="page">htcdumlock</action>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_has_injecttwrp" var2="1"/>
+ <placement x="%col1_x_right%" y="%row11_y%"/>
+ <text>{@inject_twrp_btn=Inject TWRP}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=reinjecttwrp</action>
+ <action function="set">tw_text1={@inject_twrp_confirm=Re-Inject TWRP?}</action>
+ <action function="set">tw_action_text1={@injecting_twrp=Re-Injecting TWRP...}</action>
+ <action function="set">tw_complete_text1={@inject_twrp_complete=TWRP Injection Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main3</action>
+ </action>
+ </page>
+
+ <page name="partsdcardsel">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_rb">
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <text style="text_m_fail">
+ <condition var1="partitionlisterror" var2="1"/>
+ <placement x="%center_x%" y="%row9_y%" placement="5"/>
+ <text>{@invalid_partsd_sel=You must select a removable device}</text>
+ </text>
+
+ <button>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_refresh"/>
+ <action function="refreshsizes"/>
+ </button>
+
+ <button>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept"/>
+ <actions>
+ <action function="getpartitiondetails">tw_storage_path</action>
+ <action function="page">partsdcardcheck</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="partsdcardcheck">
+ <action>
+ <condition var1="tw_partition_removable" op="=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=0</action>
+ <action function="page">partsdcard</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_partition_removable" op="!=" var2="1"/>
+ <actions>
+ <action function="set">partitionlisterror=1</action>
+ <action function="page">partsdcardsel</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="partsdcard">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@part_sd_ext_sz=EXT Size:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6a_y%" placement="5"/>
+ <text>%tw_sdext_size%</text>
+ </text>
+
+ <button style="main_button_quarter_width">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@part_sd_m=-}</text>
+ <action function="addsubtract">tw_sdext_size-256</action>
+ </button>
+
+ <button style="main_button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row6_y%"/>
+ <text>{@part_sd_p=+}</text>
+ <action function="addsubtract">tw_sdext_size+256</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">partsdcard2</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">partsdcardsel</action>
+ </action>
+ </page>
+
+ <page name="partsdcard2">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@part_sd_swap_sz=Swap Size:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6a_y%" placement="5"/>
+ <text>%tw_swap_size%</text>
+ </text>
+
+ <button style="main_button_quarter_width">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@part_sd_m=-}</text>
+ <action function="addsubtract">tw_swap_size-64</action>
+ </button>
+
+ <button style="main_button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row6_y%"/>
+ <text>{@part_sd_p=+}</text>
+ <action function="addsubtract">tw_swap_size+64</action>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">partsdcard</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">partsdcard3</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="partsdcard3">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@file_system=File System:}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6a_y%" placement="5"/>
+ <text>%tw_sdpart_file_system%</text>
+ </text>
+
+ <button style="main_button_quarter_width">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>EXT3</text>
+ <action function="set">tw_sdpart_file_system=ext3</action>
+ </button>
+
+ <button style="main_button_quarter_width">
+ <placement x="%btn4_col4_x%" y="%row6_y%"/>
+ <text>EXT4</text>
+ <action function="set">tw_sdpart_file_system=ext4</action>
+ </button>
+
+ <button>
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_left"/>
+ <action function="page">partsdcard2</action>
+ </button>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_arrow_right"/>
+ <action function="page">partsdcard_confirm</action>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="partsdcard_confirm">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@part_sd_hdr=Partition SD Card}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row1_y%" placement="5"/>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@part_sd_ext_sz=EXT Size:} %tw_sdext_size%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>{@part_sd_swap_sz=Swap Size:} %tw_swap_size%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@file_system=File System:} %tw_sdpart_file_system%</text>
+ </text>
+
+ <slider>
+ <text>{@swipe_part_sd_s=Partition}</text>
+ <action function="page">partsdcardaction</action>
+ <actions>
+ <action function="set">tw_back=partsdcard</action>
+ <action function="set">tw_action=partitionsd</action>
+ <action function="set">tw_has_action2=1</action>
+ <action function="set">tw_action2=set</action>
+ <action function="set">tw_action2_param=tw_zip_location=/sdcard</action>
+ <action function="set">tw_action_text1={@partitioning_sd=Partitioning SD Card...}</action>
+ <action function="set">tw_action_text2={@partitioning_sd2=This will take a few minutes.}</action>
+ <action function="set">tw_complete_text1={@part_sd_complete=Partitioning Complete}</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="htcdumlock">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@dumlock_hdr=HTC Dumlock}</text>
+ </text>
+
+ <button style="main_button_full_width">
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@dumlock_restore_btn=Restore Original Boot}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=htcdumlockrestoreboot</action>
+ <action function="set">tw_text1={@dumlock_restore_confirm=Restore original boot image?}</action>
+ <action function="set">tw_action_text1={@dumlock_restoring=Restoring Original Boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_restore_complete=Restore Original Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_full_width">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@dumlock_reflash_btn=Reflash Recovery}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=htcdumlockreflashrecovery</action>
+ <action function="set">tw_text1={@dumlock_reflash_confirm=Reflash recovery to boot?}</action>
+ <action function="set">tw_action_text1={@dumlock_reflashing=Flashing recovery to boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_reflash_complete=Recovery Flash to Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_full_width">
+ <placement x="%indent%" y="%row11_y%"/>
+ <text>{@dumlock_install_btn=Install HTC Dumlock}</text>
+ <actions>
+ <action function="set">tw_back=htcdumlock</action>
+ <action function="set">tw_action=installhtcdumlock</action>
+ <action function="set">tw_action_text1={@dumlock_installing=Installing HTC Dumlock...}</action>
+ <action function="set">tw_complete_text1={@dumlock_install_complete=HTC Dumlock Install Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="lock">
+ <background color="%semi_transparent%"/>
+
+ <image>
+ <image resource="unlock_icon"/>
+ <placement x="%center_x%" y="%row6_y%" placement="4"/>
+ </image>
+
+ <slider>
+ <text>{@swipe_unlock= Unlock}</text>
+ <action function="overlay"/>
+ </slider>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+ </page>
+
+ <page name="filemanagerlist">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; {@fm_sel_file=Select a File or Folder}</text>
+ </text>
+
+ <fileselector>
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%fileselector_filemanager_height%"/>
+ <text>%tw_file_location1%</text>
+ <filter folders="1" files="1"/>
+ <path name="tw_file_location1" default="/"/>
+ <data name="tw_filename1"/>
+ <selection name="tw_selection1"/>
+ </fileselector>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_folder"/>
+ <actions>
+ <action function="set">tw_filename1=tw_file_location1</action>
+ <action function="set">tw_fm_isfolder=1</action>
+ <action function="set">tw_fm_type={@fm_type_folder=Folder}</action>
+ <action function="page">filemanageroptions</action>
+ </actions>
+ </button>
+
+ <action>
+ <actions>
+ <action function="set">tw_fm_type={@fm_type_file=File}</action>
+ <action function="set">tw_fm_isfolder=0</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">main3</action>
+ </action>
+
+ <action>
+ <condition var1="tw_filename1" op="modified"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanageroptions">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_fm_type% &gt; %tw_filename1%</text>
+ </text>
+
+ <button style="main_button">
+ <condition var1="tw_fm_isfolder" var2="0"/>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@fm_copy_btn=Copy}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=cp</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_fm_isfolder" var2="1"/>
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@fm_copy_btn=Copy}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=cd "%tw_file_location1%" &amp;&amp; cd .. &amp;&amp; cp -R</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row1_y%"/>
+ <text>{@fm_move_btn=Move}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=mv</action>
+ <action function="set">tw_fm_text1={@fm_moving=Moving}</action>
+ <action function="page">choosedestinationfolder</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row6_y%"/>
+ <text>{@fm_chmod755_btn=chmod 755}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=chmod 755</action>
+ <action function="set">tw_fm_text1={@fm_chmod755ing=chmod 755}</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_right%" y="%row6_y%"/>
+ <text>{@fm_chmod_btn=chmod}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=0000</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerchmod</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <placement x="%col1_x_left%" y="%row11_y%"/>
+ <text>{@fm_delete_btn=Delete}</text>
+ <actions>
+ <action function="set">tw_filemanager_command=rm -rf</action>
+ <action function="set">tw_fm_text1={@fm_deleting=Deleting}</action>
+ <action function="set">tw_fm_text2=</action>
+ <action function="set">tw_fm_text3=</action>
+ <action function="set">tw_include_text3=0</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_fm_isfolder" var2="0"/>
+ <placement x="%col1_x_right%" y="%row11_y%"/>
+ <text>{@fm_rename_btn=Rename}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=tw_selection1</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
+ <action function="set">tw_filemanager_command=mv</action>
+ <action function="page">filemanagerrenamefile</action>
+ </actions>
+ </button>
+
+ <button style="main_button">
+ <condition var1="tw_fm_isfolder" var2="1"/>
+ <placement x="%col1_x_right%" y="%row11_y%"/>
+ <text>{@fm_rename_btn=Rename}</text>
+ <actions>
+ <action function="set">tw_filemanager_rename=tw_selection1</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
+ <action function="set">tw_filemanager_command=cd "%tw_file_location1%" &amp;&amp; cd .. &amp;&amp; mv</action>
+ <action function="page">filemanagerrenamefolder</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanagerlist</action>
+ </action>
+ </page>
+
+ <page name="choosedestinationfolder">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; {@fm_sel_dest=Select Destination Folder}</text>
+ </text>
+
+ <fileselector>
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%fileselector_filemanager_height%"/>
+ <text>%tw_file_location2%</text>
+ <filter folders="1" files="0"/>
+ <path name="tw_file_location2" default="/"/>
+ <data name="tw_filename2"/>
+ <selection name="tw_selection2"/>
+ </fileselector>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_folder"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3=%tw_file_location2%</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerrenamefile">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; {@fm_rename_hdr=Rename} %tw_fm_type%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="1" maxlen="128"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3="%tw_file_location1%/%tw_filemanager_rename%"</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="%row3_input_y%" w="%content_width%" h="%input_line_width%" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerrenamefolder">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; {@fm_rename_hdr=Rename} %tw_fm_type%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@name=Name:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="1" maxlen="128"/>
+ <actions>
+ <action function="set">tw_fm_text2=to</action>
+ <action function="set">tw_fm_text3=%tw_filemanager_rename%</action>
+ <action function="set">tw_include_text3=1</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerchmod">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; {@fm_set_perms_hdr=Set Permissions}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@fm_perms=Permissions:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_filemanager_rename%</text>
+ <data name="tw_filemanager_rename"/>
+ <restrict minlen="3" maxlen="4" allow="0123456789"/>
+ <actions>
+ <action function="set">tw_filemanager_command=chmod %tw_filemanager_rename%</action>
+ <action function="set">tw_fm_text1=chmod %tw_filemanager_rename%</action>
+ <action function="set">tw_back=filemanageroptions</action>
+ <action function="page">filemanagerconfirm</action>
+ </actions>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row4_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <action function="page">filemanageroptions</action>
+ </button>
+
+ <template name="keyboardtemplate"/>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">filemanageroptions</action>
+ </action>
+ </page>
+
+ <page name="filemanagerconfirm">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; {@confirm_action=Confirm Action}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>%tw_fm_text1%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row3_y%" placement="5"/>
+ <text>%tw_filename1%</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>%tw_fm_text2%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row6_y%" placement="5"/>
+ <text>%tw_fm_text3%</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row8_y%" placement="5"/>
+ <text>{@back_cancel=Press back button to cancel.}</text>
+ </text>
+
+ <slider>
+ <text>{@swipe_confirm= Confirm}</text>
+ <action function="page">filemanageraction</action>
+ </slider>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">%tw_back%</action>
+ </action>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+ </page>
+
+ <page name="filemanageraction">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@fm_hdr=File Manager} &gt; %tw_fm_text1%</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_back=filemanagerlist</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
+ <action function="page">action_complete</action>
+ </actions>
+ </action>
+
+ <action>
+ <condition var1="tw_include_text3" var2="0"/>
+ <action function="cmd">%tw_filemanager_command% "%tw_filename1%"</action>
+ </action>
+
+ <action>
+ <condition var1="tw_include_text3" var2="1"/>
+ <action function="cmd">%tw_filemanager_command% "%tw_filename1%" "%tw_fm_text3%"</action>
+ </action>
+ </page>
+
+ <page name="decrypt">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <action>
+ <condition var1="tw_crypto_pwtype" var2="2"/>
+ <action function="page">decrypt_pattern</action>
+ </action>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@mount_hdr=Mount} &gt; {@decrypt_data_hdr=Decrypt Data}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%col1_x_left%" y="%row1_y%"/>
+ <text>{@decrypt_data_enter_pass=Enter Password:}</text>
+ </text>
+
+ <input>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%input_height%"/>
+ <text>%tw_crypto_display%</text>
+ <data name="tw_crypto_password" mask="*" maskvariable="tw_crypto_display"/>
+ <restrict minlen="1" maxlen="254"/>
+ <action function="page">trydecrypt</action>
+ </input>
+
+ <fill color="%accent_color%">
+ <placement x="%col1_x_left%" y="row3_input_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="row3_input_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%col1_x_left%" y="%row3_input_y%"/>
+ <text>{@decrypt_data_failed=Password failed, please try again!}</text>
+ </text>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_left%" y="%row4_y%"/>
+ <text>{@sel_lang_btn=Select Language}</text>
+ <action function="page">settings_language</action>
+ </button>
+
+ <button style="main_button_half_height">
+ <placement x="%col1_x_right%" y="%row4_y%"/>
+ <text>{@cancel_btn=Cancel}</text>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </button>
+
+ <template name="keyboardtemplate"/>
+ </page>
+
+ <page name="decrypt_pattern">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <action>
+ <action function="set">tw_gui_pattern_grid_size=3</action>
+ </action>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@mount_hdr=Mount} &gt; {@decrypt_data_hdr=Decrypt Data}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <condition var1="tw_password_fail" op="!=" var2="1"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@decrypt_data_enter_pattern=Enter Pattern.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <condition var1="tw_password_fail" var2="1"/>
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@decrypt_data_failed_pattern=Pattern failed, please try again!}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row10_y%" placement="5"/>
+ <text>{@back_cancel=Press back to cancel.}</text>
+ </text>
+
+ <patternpassword>
+ <placement x="%pattern_x%" y="%row2_y%" w="%pattern_size%" h="%pattern_size%"/>
+ <dot color="%fileselector_linecolor%" activecolor="%accent_color%" radius="%pattern_dot_dia%"/>
+ <line color="%fileselector_linecolor%" width="%pattern_line_w%"/>
+ <data name="tw_crypto_password"/>
+ <action function="page">trydecrypt</action>
+ </patternpassword>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ </fill>
+
+ <button>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="3"/>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_less"/>
+ <action function="set">tw_gui_pattern_grid_size=3</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="4"/>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_less"/>
+ <action function="set">tw_gui_pattern_grid_size=3</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="5"/>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_less"/>
+ <action function="set">tw_gui_pattern_grid_size=4</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="6"/>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_less"/>
+ <action function="set">tw_gui_pattern_grid_size=5</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="3"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_more"/>
+ <action function="set">tw_gui_pattern_grid_size=4</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="4"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_more"/>
+ <action function="set">tw_gui_pattern_grid_size=5</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="5"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_more"/>
+ <action function="set">tw_gui_pattern_grid_size=6</action>
+ </button>
+
+ <button>
+ <condition var1="tw_gui_pattern_grid_size" var2="6"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="grid_more"/>
+ <action function="set">tw_gui_pattern_grid_size=6</action>
+ </button>
+ </page>
+
+ <page name="trydecrypt">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@mount_hdr=Mount} &gt; {@decrypt_data_trying=Trying Decryption}</text>
+ </text>
+
+ <template name="console"/>
+
+ <template name="progress_bar"/>
+
+ <action>
+ <action function="decrypt"/>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="!=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_password_fail=1</action>
+ <action function="page">decrypt</action>
+ </actions>
+ </action>
+
+ <action>
+ <conditions>
+ <condition var1="tw_operation_state" var2="1"/>
+ <condition var1="tw_operation_status" op="=" var2="0"/>
+ </conditions>
+ <actions>
+ <action function="set">tw_page_done=1</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+ </page>
+
+ <page name="terminalcommand">
+ <terminal>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="0" w="%screen_width%" h="%console_terminal_s_height%"/>
+ </terminal>
+
+ <terminal>
+ <condition var1="tw_hide_kb" var2="1"/>
+ <placement x="0" y="0" w="%screen_width%" h="%console_terminal_l_height%"/>
+ </terminal>
+
+ <template name="keyboardterminaltemplate"/>
+
+ <template name="keyboardtemplate"/>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%" />
+ </fill>
+
+ <button>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="back" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">back</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="home" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="key">home</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_hide" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=1</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <button>
+ <condition var1="tw_hide_kb" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4" />
+ <image resource="kb_show" />
+ <condition var1="tw_busy" var2="0" />
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">terminalcommand</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="home"/>
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">main</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <actions>
+ <action function="set">tw_hide_kb=0</action>
+ <action function="page">advanced</action>
+ </actions>
+ </action>
+
+ <action>
+ <touch key="power+voldown" />
+ <action function="screenshot" />
+ </action>
+ </page>
+
+ <page name="sideload">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@install_hdr=Install} &gt; {@adb_sideload_hdr=ADB Sideload}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%indent%" y="%row1_y%"/>
+ <text>{@options=Options:}</text>
+ </text>
+
+ <checkbox>
+ <placement x="%indent%" y="%row2_y%"/>
+ <text>{@sideload_wipe_dalvik_chk=Wipe Dalvik Cache}</text>
+ <data variable="tw_wipe_dalvik"/>
+ </checkbox>
+
+ <checkbox>
+ <placement x="%indent%" y="%row4a_y%"/>
+ <text>{@sideload_wipe_cache_chk=Wipe Cache}</text>
+ <data variable="tw_wipe_cache"/>
+ </checkbox>
+
+ <slider>
+ <text>{@swipe_sideload= Start}</text>
+ <actions>
+ <action function="set">tw_back=install_type</action>
+ <action function="set">tw_action=adbsideload</action>
+ <action function="set">tw_action_text1={@sideload_confirm=ADB Sideload}</action>
+ <action function="set">tw_action_text2={@sideload_usage=Usage: adb sideload filename.zip}</action>
+ <action function="set">tw_complete_text1={@sideload_complete=ADB Sideload Complete}</action>
+ <action function="set">tw_has_cancel=1</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="set">tw_cancel_action=adbsideloadcancel</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">install_type</action>
+ </action>
+ </page>
+
+ <page name="fixcontexts">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@advanced_hdr=Advanced} &gt; {@fix_contexts_hdr=Fix Contexts}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@fix_contexts_note1=Note: Fixing contexts is rarely needed.}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row6a_y%" placement="5"/>
+ <text>{@fix_contexts_note2=Fixing SELinux Contexts may cause}</text>
+ </text>
+
+ <text style="text_m_fail">
+ <placement x="%center_x%" y="%row7a_y%" placement="5"/>
+ <text>{@fix_contexts_note3=your device to not boot properly.}</text>
+ </text>
+
+ <slider>
+ <text>{@swipe_fix_contexts= Fix Contexts}</text>
+ <actions>
+ <action function="set">tw_back=advanced</action>
+ <action function="set">tw_action=fixcontexts</action>
+ <action function="set">tw_action_text1={@fixing_contexts=Fixing Contexts...}</action>
+ <action function="set">tw_complete_text1={@fix_contexts_complete=Fix Contexts Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
+ <action function="set">tw_show_reboot=1</action>
+ <action function="page">action_page</action>
+ </actions>
+ </slider>
+
+ <action>
+ <touch key="home"/>
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back"/>
+ <action function="page">advanced</action>
+ </action>
+ </page>
+
+ <page name="installsu">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@reboot_hdr=Reboot} &gt; {@su_hdr=SuperSU Check}</text>
+ </text>
+
+ <text style="text_m_accent">
+ <placement x="%center_x%" y="%row2_y%" placement="5"/>
+ <text>{@su_note1=Your device does not appear to be rooted.}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row4_y%" placement="5"/>
+ <text>{@su_note2=Install SuperSU now?}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%center_x%" y="%row5_y%" placement="5"/>
+ <text>{@su_note3=This will root your device.}</text>
+ </text>
+
+ <button style="main_button_full_width">
+ <placement x="%indent%" y="%row6_y%"/>
+ <text>{@su_cancel=Do not Install}</text>
+ <action function="set">tw_page_done=1</action>
+ </button>
+
+ <slider>
+ <text>{@swipe_su_install= Install}</text>
+ <actions>
+ <action function="set">tw_action=installsu</action>
+ <action function="set">tw_action_text1={@su_installing=Installing SuperSU}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="page">singleaction_page</action>
+ </actions>
+ </slider>
+ </page>
+
+ <page name="slideout">
+ <fill color="%background_color%">
+ <placement x="0" y="%row2_header_y%" w="%screen_width%" h="%slideout_bg_height%"/>
+ </fill>
+
+ <console>
+ <placement x="%indent%" y="%row1_y%" w="%content_width%" h="%slideout_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row1_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row15a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+
+ <button>
+ <fill color="%transparent%"/>
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ <action function="overlay"/>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+
+ <page name="select_storage">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>%tw_storagetext%</text>
+ </text>
+
+ <partitionlist style="partitionlist_headerless_rb">
+ <data name="tw_storage_path"/>
+ <listtype name="storage"/>
+ </partitionlist>
+
+ <button>
+ <placement x="%btn4_col2_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_refresh"/>
+ <actions>
+ <action function="refreshsizes"/>
+ <action function="page">select_storage</action>
+ </actions>
+ </button>
+
+ <button>
+ <placement x="%btn4_col3_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_accept"/>
+ <actions>
+ <action function="set">tw_clear_destination=%tw_back%</action>
+ <action function="page">clear_vars</action>
+ </actions>
+ </button>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </page>
+ </pages>
+</recovery>
diff --git a/gui/theme/extra-languages/fonts/DroidSansFallback.ttf b/gui/theme/extra-languages/fonts/DroidSansFallback.ttf
new file mode 100644
index 000000000..ba9d76f0c
--- /dev/null
+++ b/gui/theme/extra-languages/fonts/DroidSansFallback.ttf
Binary files differ
diff --git a/gui/theme/extra-languages/fonts/NotoSansCJKjp-Regular.ttf b/gui/theme/extra-languages/fonts/NotoSansCJKjp-Regular.ttf
new file mode 100644
index 000000000..bb71b6352
--- /dev/null
+++ b/gui/theme/extra-languages/fonts/NotoSansCJKjp-Regular.ttf
Binary files differ
diff --git a/gui/theme/extra-languages/fonts/OFL.txt b/gui/theme/extra-languages/fonts/OFL.txt
new file mode 100644
index 000000000..b6d942550
--- /dev/null
+++ b/gui/theme/extra-languages/fonts/OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2011, Cyreal (www.cyreal.org),
+with Reserved Font Name "Junge".
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/gui/theme/extra-languages/languages/ja.xml b/gui/theme/extra-languages/languages/ja.xml
new file mode 100644
index 000000000..552665e96
--- /dev/null
+++ b/gui/theme/extra-languages/languages/ja.xml
@@ -0,0 +1,667 @@
+<?xml version="1.0" encoding="utf-8"?>
+<language>
+ <display>Japanese</display>
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource filename="NotoSansCJKjp-Regular.ttf" name="font_l" scale="80" type="fontoverride"/>
+ <resource filename="NotoSansCJKjp-Regular.ttf" name="font_m" scale="85" type="fontoverride"/>
+ <resource filename="NotoSansCJKjp-Regular.ttf" name="font_s" scale="90" type="fontoverride"/>
+ <resource filename="NotoSansCJKjp-Regular.ttf" name="fixed" scale="90" type="fontoverride"/>
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">Systemイメージ</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendorイメージ</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SDカード</string>
+ <string name="internal">内部ストレージ</string>
+ <string name="microsd">microSD カード</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted Storage</string>
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">バッテリー: %tw_battery%</string>
+ <string name="sort_by_name">名前順で並び替え</string>
+ <string name="sort_by_date">日付順で並び替え</string>
+ <string name="sort_by_size">サイズ順で並び替え</string>
+ <string name="sort_by_name_only">名前</string>
+ <string name="sort_by_date_only">日付</string>
+ <string name="sort_by_size_only">サイズ</string>
+ <string name="tab_general">基本</string>
+ <string name="tab_options">オプション</string>
+ <string name="tab_backup">バックアップ</string>
+ <string name="tab_time_zone">タイムゾーン</string>
+ <string name="tab_screen">画面</string>
+ <string name="tab_vibration">バイブ</string>
+ <string name="tab_language">言語</string>
+ <string name="install_btn">インストール</string>
+ <string name="wipe_btn">消去</string>
+ <string name="backup_btn">バックアップ</string>
+ <string name="restore_btn">リストア</string>
+ <string name="mount_btn">マウント</string>
+ <string name="settings_btn">設定</string>
+ <string name="advanced_btn">高度な機能</string>
+ <string name="reboot_btn">再起動</string>
+ <string name="files_btn">ファイル</string>
+ <string name="copy_log_btn">ログのコピー</string>
+ <string name="select_type_hdr">形式の選択</string>
+ <string name="install_zip_hdr">ZIPのインストール</string>
+ <string name="install_zip_btn">ZIPのインストール</string>
+ <string name="install_image_hdr">イメージのインストール</string>
+ <string name="install_image_btn">イメージのインストール</string>
+ <string name="install_select_file_hdr">ファイルの選択</string>
+ <string name="file_selector_folders_hdr">フォルダ</string>
+ <string name="select_file_from_storage">%tw_storage_display_name% (%tw_storage_free_size% MB) からファイルを選択</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">インストール</string>
+ <string name="select_storage_hdr">ストレージの選択</string>
+ <string name="select_storage_btn">ストレージの選択</string>
+ <string name="queue_hdr">キュー</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% / 10ファイルキューに追加済み</string>
+ <string name="zip_queue_count_s">ファイル %tw_zip_queue_count% / 10:</string>
+ <string name="zip_warn1">この操作では互換性のないソフトウェアを</string>
+ <string name="zip_warn2">インストールして文鎮化する可能性もあります。</string>
+ <string name="zip_back_cancel">バックキーで ZIP の追加をキャンセルします。</string>
+ <string name="zip_back_clear">バックキーでキューを消去します。</string>
+ <string name="folder">フォルダ:</string>
+ <string name="file">ファイル:</string>
+ <string name="zip_sig_chk">ZIPの署名確認</string>
+ <string name="inject_twrp_chk">インストール後にTWRPを組み込む</string>
+ <string name="install_reboot_chk">インストール後に再起動する</string>
+ <string name="options_hdr">オプション</string>
+ <string name="confirm_flash_hdr">書き込みの確認</string>
+ <string name="zip_queue">キュー:</string>
+ <string name="options">オプション:</string>
+ <string name="swipe_confirm"> 確認</string>
+ <string name="zip_add_btn">ZIPを追加する</string>
+ <string name="zip_clear_btn">ZIPキューを消去する</string>
+ <string name="install_zip_count_hdr">ZIP %tw_zip_index% / %tw_zip_queue_count% のインストール</string>
+ <string name="installing_zip_xml">ZIP のインストール中: %tw_file%</string>
+ <string name="failed">失敗</string>
+ <string name="successful">成功</string>
+ <string name="install_failed">インストールに失敗しました</string>
+ <string name="install_successful">インストールしました</string>
+ <string name="wipe_cache_dalvik_btn">Cache/dalvik の消去</string>
+ <string name="reboot_system_btn">再起動</string>
+ <string name="install_sel_target">ターゲットパーティションの選択</string>
+ <string name="flash_image_select">イメージを書き込むパーティションの選択:</string>
+ <string name="target_partition">ターゲットパーティション:</string>
+ <string name="flashing_image">イメージの書き込み中...</string>
+ <string name="image_flashed">イメージを書き込みました</string>
+ <string name="wipe_cache_dalvik_confirm">Cache &amp; Dalvik を消去しますか?</string>
+ <string name="wiping_cache_dalvik">Cache &amp; Dalvik を消去中...</string>
+ <string name="wipe_cache_dalvik_complete">Cache &amp; Dalvik を消去しました</string>
+ <string name="swipe_wipe">スワイプで消去</string>
+ <string name="swipe_wipe_s"> 消去</string>
+ <string name="no_os1">OS が見つかりません!</string>
+ <string name="no_osrb">本当に再起動しますか?</string>
+ <string name="no_ospo">本当に電源を切りますか?</string>
+ <string name="rebooting">再起動中...</string>
+ <string name="swipe_reboot">スワイプで再起動</string>
+ <string name="swipe_reboot_s"> 再起動</string>
+ <string name="swipe_flash">スワイプで書き込みの確認</string>
+ <string name="confirm_action">アクションの確認</string>
+ <string name="back_cancel">バックボタンでキャンセルします。</string>
+ <string name="cancel_btn">キャンセル</string>
+ <string name="wipe_hdr">消去</string>
+ <string name="factory_reset_hdr">データの初期化</string>
+ <string name="factory_reset_btn">データの初期化</string>
+ <string name="factory_reset1">Data、Cache、Dalvikを消去します</string>
+ <string name="factory_reset2">(内部ストレージは除外されます)</string>
+ <string name="factory_reset3">ほとんどの場合、</string>
+ <string name="factory_reset4">これが最適です。</string>
+ <string name="factory_resetting">データを初期化する...</string>
+ <string name="advanced_wipe_hdr">高度な消去</string>
+ <string name="advanced_wipe_btn">高度な消去</string>
+ <string name="wipe_enc_confirm">Data の暗号化を解除しますか?</string>
+ <string name="formatting_data">Data の初期化中...</string>
+ <string name="swipe_format_data">スワイプで Data を初期化する</string>
+ <string name="swipe_format_data_s"> Data の初期化</string>
+ <string name="factory_reset_complete">データの初期化が完了しました</string>
+ <string name="sel_part_hdr">パーティションの選択</string>
+ <string name="wipe_sel_confirm">選択したパーティションを消去しますか?</string>
+ <string name="wiping_part">パーティションを消去中...</string>
+ <string name="wipe_complete">消去しました</string>
+ <string name="sel_part_wipe">消去するパーティションの選択:</string>
+ <string name="invalid_part_sel">パーティションの選択が間違っています</string>
+ <string name="format_data_hdr">Dataの初期化</string>
+ <string name="format_data_btn">Dataの初期化</string>
+ <string name="format_data_ptr1">Dataを初期化するとすべてのアプリ、</string>
+ <string name="format_data_ptr2">バックアップ、写真、動画</string>
+ <string name="format_data_ptr3">や暗号化が内部ストレージから消去されます。</string>
+ <string name="format_data_adopted">Adopted Storage を含める</string>
+ <string name="format_data_lcp1">Data を初期化するとすべてのアプリ、バックアップ、写真、動画</string>
+ <string name="format_data_lcp2">や暗号化が内部ストレージから消去されます。</string>
+ <string name="format_data_wtc1">Data を初期化するとすべてのアプリ、</string>
+ <string name="format_data_wtc2">バックアップやメディアが完全に消去されます。</string>
+ <string name="format_data_undo">この操作は元に戻せません。</string>
+ <string name="format_data_complete">Data を初期化しました</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">yes と入力すると続行します。バックキーでキャンセルします。</string>
+ <string name="part_opt_hdr">パーティションオプション: %tw_partition_name%</string>
+ <string name="sel_act_hdr">アクションの選択</string>
+ <string name="file_sys_opt">ファイルシステムオプション</string>
+ <string name="partition">パーティション: %tw_partition_name%</string>
+ <string name="part_mount_point">マウントポイント: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">ファイルシステム: %tw_partition_file_system%</string>
+ <string name="part_present_yes">現在利用可能: はい</string>
+ <string name="part_present_no">現在利用可能: いいえ</string>
+ <string name="part_removable_yes">取り外し可能: はい</string>
+ <string name="part_removable_no">取り外し可能: いいえ</string>
+ <string name="part_size">サイズ: %tw_partition_size%MB</string>
+ <string name="part_used">使用中: %tw_partition_used%MB</string>
+ <string name="part_free">空き: %tw_partition_free%MB</string>
+ <string name="part_backup_size">バックアップサイズ: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">ファイルシステムのリサイズ</string>
+ <string name="resize_btn_s">リサイズ</string>
+ <string name="resize_confirm">%tw_partition_name% をリサイズしますか?</string>
+ <string name="resizing">リサイズ中...</string>
+ <string name="resize_complete">リサイズしました</string>
+ <string name="swipe_resize">スワイプでリストア</string>
+ <string name="swipe_resize_s"> リサイズ</string>
+ <string name="repair_btn">ファイルシステムの修復</string>
+ <string name="repair_btn_s">修復</string>
+ <string name="repair_confirm">%tw_partition_name% を修復しますか?</string>
+ <string name="repairing">修復中...</string>
+ <string name="repair_complete">修復しました</string>
+ <string name="swipe_repair">スワイプで修復</string>
+ <string name="swipe_repair_s"> 修復</string>
+ <string name="change_fs_btn">ファイルシステムの変更</string>
+ <string name="change_fs_btn_s">変更</string>
+ <string name="change_fs_for_hdr">ファイルシステムの変更: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">パーティション: %tw_partition_name% &gt; ファイルシステムの選択</string>
+ <string name="change_fs_warn1">ROM やカーネルによっては一部のファイルシステムに</string>
+ <string name="change_fs_warn2">対応していません。注意してください!</string>
+ <string name="change_fs_confirm">%tw_partition_name% を変更しますか?</string>
+ <string name="formatting">初期化中...</string>
+ <string name="format_complete">初期化しました</string>
+ <string name="swipe_change_fs">スワイプで変更</string>
+ <string name="swipe_change_s"> 変更</string>
+ <string name="back_btn">戻る</string>
+ <string name="wipe_enc_btn">暗号化の消去</string>
+ <string name="swipe_factory_reset">スワイプでデータの初期化</string>
+ <string name="repair_change_btn">ファイルシステムの修復と変更</string>
+ <string name="storage_hdr">ストレージ: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">バックアップ</string>
+ <string name="backup_confirm_hdr">バックアップの確認</string>
+ <string name="encryption_tab">暗号化</string>
+ <string name="encryption">暗号化:</string>
+ <string name="name">名前:</string>
+ <string name="sel_part_backup">バックアップするパーティション:</string>
+ <string name="storage">ストレージ:</string>
+ <string name="enc_disabled">無効 - パスワード設定で有効化します</string>
+ <string name="enc_enabled">有効</string>
+ <string name="enable_backup_comp_chk">圧縮する</string>
+ <string name="skip_md5_backup_chk">バックアップ時に MD5 を生成しない</string>
+ <string name="disable_backup_space_chk">空き容量のチェックを無効化する</string>
+ <string name="refresh_sizes_btn">サイズの更新</string>
+ <string name="swipe_backup">スワイプでバックアップ</string>
+ <string name="append_date_btn">日付の追加</string>
+ <string name="backup_name_exists">同じ名前のバックアップが既に存在します!</string>
+ <string name="encrypt_backup">バックアップを暗号化しますか?</string>
+ <string name="enter_pass">パスワードを入力:</string>
+ <string name="enter_pass2">パスワードを再入力:</string>
+ <string name="pass_not_match">パスワードが一致しません!</string>
+ <string name="partitions">パーティション:</string>
+ <string name="disabled">無効</string>
+ <string name="enabled">有効</string>
+ <string name="backup_name_hdr">バックアップ名の設定</string>
+ <string name="progress">進捗:</string>
+ <string name="backup_complete">バックアップしました</string>
+ <string name="restore_hdr">リストア</string>
+ <string name="sel_backup_hdr">バックアップの選択</string>
+ <string name="restore_sel_store_hdr">%tw_storage_display_name% (%tw_storage_free_size% MB) からバックアップを選択</string>
+ <string name="restore_sel_pack_fs">リストアするパッケージの選択:</string>
+ <string name="restore_enc_backup_hdr">暗号化されたバックアップ</string>
+ <string name="restore_dec_fail">パスワードが間違っているので、入力し直してください!</string>
+ <string name="del_backup_btn">バックアップの削除</string>
+ <string name="del_backup_confirm">バックアップを削除しますか?</string>
+ <string name="del_backup_confirm2">この操作は元に戻せません!</string>
+ <string name="deleting_backup">バックアップの削除中...</string>
+ <string name="backup_deleted">バックアップを削除しました</string>
+ <string name="swipe_delete">スワイプで削除</string>
+ <string name="swipe_delete_s"> 削除</string>
+ <string name="restore_try_decrypt">暗号化されたバックアップ - 復号の試行中</string>
+ <string name="restore_try_decrypt_s">復号の試行中</string>
+ <string name="restore_backup_date">%tw_restore_file_date% に作成されたバックアップ</string>
+ <string name="restore_sel_part">リストアするパーティションの選択:</string>
+ <string name="restore_enable_md5_chk">バックアップファイルの MD5 検証を有効化する</string>
+ <string name="restore_complete">リストアしました</string>
+ <string name="swipe_restore">スワイプでリストア</string>
+ <string name="swipe_restore_s"> リストア</string>
+ <string name="rename_backup_hdr">バックアップの名前を変更</string>
+ <string name="rename_backup_confirm">バックアップの名前を変更しますか?</string>
+ <string name="rename_backup_confirm2">この操作は元に戻せません!</string>
+ <string name="renaming_backup">バックアップの名前を変更中...</string>
+ <string name="rename_backup_complete">バックアップの名前を変更しました</string>
+ <string name="swipe_to_rename">スワイプで名前の変更</string>
+ <string name="swipe_rename"> 名前の変更</string>
+ <string name="confirm_hdr">確認</string>
+ <string name="mount_hdr">マウント</string>
+ <string name="mount_sel_part">マウントするパーティションの選択:</string>
+ <string name="mount_sys_ro_chk"> System を読み取り専用でマウントする</string>
+ <string name="mount_sys_ro_s_chk">System を RO でマウント</string>
+ <string name="decrypt_data_btn">Data の復号</string>
+ <string name="disable_mtp_btn">MTP の無効化</string>
+ <string name="enable_mtp_btn">MTP の有効化</string>
+ <string name="mount_usb_storage_btn">USB ストレージのマウント</string>
+ <string name="usb_storage_hdr">USB ストレージ</string>
+ <string name="usb_stor_mnt1">USB ストレージをマウントしました</string>
+ <string name="usb_stor_mnt2">機器を安全に取り外すよう</string>
+ <string name="usb_stor_mnt3">マウント解除時は注意してください!</string>
+ <string name="unmount_btn">マウント解除</string>
+ <string name="rb_system_btn">システム</string>
+ <string name="rb_poweroff_btn">電源を切る</string>
+ <string name="rb_recovery_btn">リカバリ</string>
+ <string name="rb_bootloader_btn">ブートローダー</string>
+ <string name="rb_download_btn">ダウンロード</string>
+ <string name="turning_off">電源を切っています...</string>
+ <string name="swipe_power_off">スワイプで電源を切る</string>
+ <string name="swipe_power_off_s">電源を切る</string>
+ <string name="sys_ro_hdr">未変更の system パーティション</string>
+ <string name="sys_ro_keep">system を読み取り専用のままにしますか?</string>
+ <string name="sys_rop1">TWRP でsystemを編集しないようにして</string>
+ <string name="sys_rop2">公式なソフトウェア更新を適用しやすくできます。</string>
+ <string name="sys_rop3">TWRP は stock ROM が TWRP を取り除くのを防げず</string>
+ <string name="sys_rop4">root化することもできません。</string>
+ <string name="sys_rop5">ZIPをインストールしたりadbで操作したりすると</string>
+ <string name="sys_rop6">system パーティションが編集される可能性があります。</string>
+ <string name="sys_rol1">公式なソフトウェア更新を適用しやすくするため、TWRP は system パーティションを編集しないようにできます。</string>
+ <string name="sys_rol2">TWRP は stock ROM が TWRP を取り除くことを防げず、root化する事もできません。</string>
+ <string name="sys_rol3">ZIPのインストールや adb での操作で system が編集される可能性があります。</string>
+ <string name="sys_ro_never_show_chk">起動時にこの画面を二度と表示しない</string>
+ <string name="sys_ro_keep_ro_btn">読み取り専用のままにする</string>
+ <string name="swipe_allow_mod">スワイプで編集を許可</string>
+ <string name="swipe_allow_mod_s">編集の許可</string>
+ <string name="settings_hdr">設定</string>
+ <string name="settings_gen_hdr">基本</string>
+ <string name="settings_gen_s_hdr">基本</string>
+ <string name="settings_gen_btn">基本</string>
+ <string name="use_rmrf_chk">初期化に rm -rf コマンドを使う</string>
+ <string name="use24clock_chk">時計を24時間表示にする</string>
+ <string name="rev_navbar_chk">ナビバーの並びを逆にする</string>
+ <string name="simact_chk">テーマのテストのため動作をシミュレートする</string>
+ <string name="simfail_chk">シミュレートに失敗しました</string>
+ <string name="ctr_navbar_rdo">ナビバーのボタンを中央寄せにする</string>
+ <string name="lft_navbar_rdo">ナビバーのボタンを左寄せにする</string>
+ <string name="rht_navbar_rdo">ナビバーのボタンを右寄せにする</string>
+ <string name="restore_defaults_btn">初期設定に戻す</string>
+ <string name="settings_tz_btn">タイムゾーン</string>
+ <string name="settings_screen_btn">画面</string>
+ <string name="settings_screen_bright_btn">画面の明るさ</string>
+ <string name="settings_vibration_btn">バイブレーション</string>
+ <string name="settings_language_btn">言語</string>
+ <string name="time_zone_hdr">タイムゾーン</string>
+ <string name="sel_tz_list">タイム ゾーンの選択:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Central Time</string>
+ <string name="utcm5">(UTC -5) Eastern Time</string>
+ <string name="utcm4">(UTC -4) Atlantic Time</string>
+ <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string>
+ <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string>
+ <string name="utcp3">(UTC +3) Moscow, Baghdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) 日本標準時</string>
+ <string name="utcp10">(UTC +10) Eastern Australia, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">オフセットの選択 (通常は 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">なし</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">夏時間 (DST) を使用する</string>
+ <string name="curr_tz">現在のタイムゾーン: %tw_time_zone%</string>
+ <string name="curr_tz_s">現在のタイムゾーン:</string>
+ <string name="set_tz_btn">タイムゾーンの設定</string>
+ <string name="settings_screen_hdr">画面</string>
+ <string name="settings_screen_timeout_hdr">消灯までの時間</string>
+ <string name="enable_timeout_chk">画面の自動消灯を有効化する</string>
+ <string name="screen_to_slider">消灯までの時間 (秒):</string>
+ <string name="screen_to_slider_s">消灯までの時間 (秒、0=無効): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">画面の自動消灯設定は利用できません</string>
+ <string name="screen_bright_slider">明るさ: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">明るさ設定は利用できません</string>
+ <string name="vibration_hdr">バイブレーション</string>
+ <string name="button_vibration_hdr">ボタンバイブ</string>
+ <string name="kb_vibration_hdr">キーボードバイブ</string>
+ <string name="act_vibration_hdr">アクションバイブ</string>
+ <string name="button_vibration">ボタンバイブ:</string>
+ <string name="kb_vibration">キーボードバイブ:</string>
+ <string name="act_vibration">アクションバイブ:</string>
+ <string name="select_language">言語の選択:</string>
+ <string name="sel_lang_btn">言語の選択</string>
+ <string name="set_language_btn">言語の設定</string>
+ <string name="advanced_hdr">高度な機能</string>
+ <string name="copy_log_confirm">ログを SD カードにコピーしますか?</string>
+ <string name="copying_log">ログを SD カードにコピー中...</string>
+ <string name="copy_log_complete">ログをコピーしました</string>
+ <string name="fix_context_btn">コンテキストの修正</string>
+ <string name="part_sd_btn">SDカードの分割</string>
+ <string name="part_sd_s_btn">SD カード</string>
+ <string name="file_manager_btn">ファイルマネージャ</string>
+ <string name="language_hdr">言語</string>
+ <string name="terminal_btn">ターミナル</string>
+ <string name="reload_theme_btn">テーマの再読み込み</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">TWRP の組み込み</string>
+ <string name="inject_twrp_confirm">TWRP を再度組み込みますか?</string>
+ <string name="injecting_twrp">TWRP を組み込み中...</string>
+ <string name="inject_twrp_complete">TWRP を組み込みました</string>
+ <string name="swipe_to_confirm">スワイプで確認</string>
+ <string name="part_sd_hdr">SDカードの分割</string>
+ <string name="invalid_partsd_sel">リムーバブルデバイスを選択してください</string>
+ <string name="part_sd_lose">SD カード上のすべてのファイルを消去します!</string>
+ <string name="part_sd_undo">このアクションは取り消せません!</string>
+ <string name="part_sd_ext_sz">EXT サイズ:</string>
+ <string name="part_sd_swap_sz">Swap サイズ:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">ファイルシステム:</string>
+ <string name="swipe_part_sd">スワイプで分割</string>
+ <string name="swipe_part_sd_s">分割</string>
+ <string name="partitioning_sd">SD カードの分割中...</string>
+ <string name="partitioning_sd2">完了まで数分かかります。</string>
+ <string name="part_sd_complete">分割しました</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">元の Boot をリストアする</string>
+ <string name="dumlock_restore_confirm">元の Boot イメージをリストアしますか?</string>
+ <string name="dumlock_restoring">元の Boot をリストア中...</string>
+ <string name="dumlock_restore_complete">元の Boot をリストアしました</string>
+ <string name="dumlock_reflash_btn">リカバリの再書き込み</string>
+ <string name="dumlock_reflash_confirm">boot にリカバリを再書き込みしますか?</string>
+ <string name="dumlock_reflashing">boot にリカバリを書き込み中...</string>
+ <string name="dumlock_reflash_complete">リカバリを書き込みました</string>
+ <string name="dumlock_install_btn">HTC Dumlock のインストール</string>
+ <string name="dumlock_install_confirm">ROM に HTC dumlock をインストールしますか?</string>
+ <string name="dumlock_installing">HTC Dumlock のインストール中...</string>
+ <string name="dumlock_install_complete">HTC Dumlock をインストールしました</string>
+ <string name="swipe_to_unlock">スワイプでロック解除</string>
+ <string name="swipe_unlock"> ロック解除</string>
+ <string name="fm_hdr">ファイルマネージャ</string>
+ <string name="fm_sel_file">ファイルかフォルダの選択</string>
+ <string name="fm_type_folder">フォルダ</string>
+ <string name="fm_type_file">ファイル</string>
+ <string name="fm_choose_act">操作の選択</string>
+ <string name="fm_selected">選択中の%tw_fm_type%:</string>
+ <string name="fm_copy_btn">コピー</string>
+ <string name="fm_copy_file_btn">ファイルのコピー</string>
+ <string name="fm_copy_folder_btn">フォルダのコピー</string>
+ <string name="fm_copying">コピー中</string>
+ <string name="fm_move_btn">移動</string>
+ <string name="fm_moving">移動中</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">削除</string>
+ <string name="fm_deleting">削除中</string>
+ <string name="fm_rename_btn">名前の変更</string>
+ <string name="fm_rename_file_btn">ファイル名の変更</string>
+ <string name="fm_rename_folder_btn">フォルダ名の変更</string>
+ <string name="fm_renaming">名前の変更中</string>
+ <string name="fm_sel_dest">宛先のフォルダの選択</string>
+ <string name="fm_sel_curr_folder">現在のフォルダの選択</string>
+ <string name="fm_rename_hdr">名前の変更</string>
+ <string name="fm_set_perms_hdr">権限の設定</string>
+ <string name="fm_perms">権限:</string>
+ <string name="fm_complete">ファイル操作を完了しました</string>
+ <string name="decrypt_data_hdr">Data の復号</string>
+ <string name="decrypt_data_enter_pass">パスワードを入力してください。</string>
+ <string name="decrypt_data_failed">パスワード認証失敗、入力し直してください!</string>
+ <string name="decrypt_data_failed_pattern">パターン認証失敗、入力し直してください!</string>
+ <string name="decrypt_data_enter_pattern">パターンを入力してください。</string>
+ <string name="decrypt_data_trying">復号の試行中</string>
+ <string name="term_hdr">ターミナルコマンド</string>
+ <string name="term_s_hdr">ターミナル</string>
+ <string name="term_kill_btn">キル</string>
+ <string name="term_sel_folder_hdr">開始時のフォルダを参照</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Dalvik Cache の消去</string>
+ <string name="sideload_wipe_cache_chk">Cache の消去</string>
+ <string name="swipe_to_sideload">スワイプで Sideload の開始</string>
+ <string name="swipe_sideload"> 開始</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">使用方法: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload が完了しました</string>
+ <string name="fix_contexts_hdr">コンテキストの修正</string>
+ <string name="fix_contexts_note1">注意:コンテキストの修正は滅多に必要ありません。</string>
+ <string name="fix_contexts_note2">SELinux コンテキストの修正で</string>
+ <string name="fix_contexts_note3">機器が起動しなくなる場合があります。</string>
+ <string name="swipe_to_fix_contexts">スワイプでコンテキストの修正</string>
+ <string name="swipe_fix_contexts"> コンテキストの修正</string>
+ <string name="fixing_contexts">コンテキストの修正中...</string>
+ <string name="fix_contexts_complete">コンテキストを修正しました</string>
+ <string name="reboot_hdr">再起動</string>
+ <string name="su_hdr">SuperSU チェック</string>
+ <string name="su_note1">機器がroot化されていないようです。</string>
+ <string name="su_note2">SuperSU をインストールしますか?</string>
+ <string name="su_note3">機器をroot化します。</string>
+ <string name="su_cancel">インストールしない</string>
+ <string name="swipe_su_to_install">スワイプでインストール</string>
+ <string name="swipe_su_install"> インストール</string>
+ <string name="su_installing">SuperSU のインストール中</string>
+ <string name="sel_storage_list">ストレージの選択</string>
+ <string name="ok_btn">OK</string>
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">カーネルが SELinux コンテキストの読み取りに対応していません。</string>
+ <string name="full_selinux">SELinux に完全に対応しています。</string>
+ <string name="no_selinux">SELinux に対応していません。(libselinux なし)</string>
+ <string name="mtp_enabled">MTP 有効</string>
+ <string name="mtp_crash">MTP がクラッシュしました。起動時に開始しません。</string>
+ <string name="decrypt_success">デフォルトのパスワードで復号しました。</string>
+ <string name="unable_to_decrypt">デフォルトのパスワードで復号できません。data の初期化が必要です。</string>
+ <string name="generating_md51">MD5 の生成中</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * MD5 の生成中...</string>
+ <string name="md5_created"> * MD5 を生成しました。</string>
+ <string name="md5_error"> * MD5 エラー!</string>
+ <string name="md5_compute_error"> * MD5の計算エラーが起きました。</string>
+ <string name="current_date">(現在の日付)</string>
+ <string name="auto_generate">(自動生成)</string>
+ <string name="unable_to_locate_partition">バックアップの計算で \'{1}\' パーティションが見つかりません。</string>
+ <string name="no_partition_selected">バックアップするパーティションが選択されていません。</string>
+ <string name="total_partitions_backup"> * バックアップするパーティションの総数: {1}</string>
+ <string name="total_backup_size"> * すべてのデータの合計サイズ: {1}MB</string>
+ <string name="available_space"> * 空き容量: {1}MB</string>
+ <string name="unable_locate_storage">ストレージデバイスを見つけられません。</string>
+ <string name="no_space">十分な空き容量がありません。</string>
+ <string name="backup_started">[バックアップ開始]</string>
+ <string name="backup_folder"> * バックアップフォルダ: {1}</string>
+ <string name="fail_backup_folder">バックアップフォルダの作成に失敗しました。</string>
+ <string name="avg_backup_fs">ファイルシステムの平均バックアップ速度: {1} MB/秒</string>
+ <string name="avg_backup_img">イメージドライブの平均バックアップ速度: {1} MB/秒</string>
+ <string name="total_backed_size">[合計 {1} MB バックアップ]</string>
+ <string name="backup_completed">[{1} 秒でバックアップしました]</string>
+ <string name="restore_started">[リストア開始]</string>
+ <string name="restore_folder">リストアフォルダ: \'{1}\'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} 完了 ({2} 秒)]</string>
+ <string name="verifying_md5">MD5 の検証中</string>
+ <string name="skip_md5">ユーザー設定に基づき MD5 の検証をスキップします。</string>
+ <string name="calc_restore">リストアの詳細を計算中...</string>
+ <string name="restore_read_only">{1} をリストアできません -- 読み取り専用でマウントされています。</string>
+ <string name="restore_unable_locate">リストアする \'{1}\' パーティションが見つかりません。</string>
+ <string name="no_part_restore">リストアするパーティションが選択されていません。</string>
+ <string name="restore_part_count">{1} パーティションをリストア中...</string>
+ <string name="total_restore_size">合計リストアサイズ: {1}MB</string>
+ <string name="updating_system_details">system の詳細を更新中</string>
+ <string name="restore_completed">[{1} 秒でリストアしました]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">開けません: \'{1}\' ({2})</string>
+ <string name="unable_locate_part_backup_name">バックアップ名からパーティションを見つけられません: \'{1}\'</string>
+ <string name="unable_find_part_path">パス \'{1}\' のパーティションを見つけられません</string>
+ <string name="update_part_details">パーティションの詳細を更新中...</string>
+ <string name="update_part_details_done">...完了</string>
+ <string name="wiping_dalvik">Dalvik Cache ディレクトリを消去中...</string>
+ <string name="cleaned">掃除しました: {1}...</string>
+ <string name="dalvik_done">-- Dalvik Cache ディレクトリを消去しました!</string>
+ <string name="no_andsec">android secure パーティションが見つかりません。</string>
+ <string name="unable_to_locate">{1} が見つかりません。</string>
+ <string name="wiping_datamedia">内部ストレージを消去中 -- /data/media...</string>
+ <string name="unable_to_mount">{1} をマウントできません</string>
+ <string name="unable_to_mount_internal">内部ストレージをマウントできません</string>
+ <string name="unable_to_mount_storage">ストレージをマウントできません</string>
+ <string name="fail_decrypt">Data の復号に失敗しました。</string>
+ <string name="no_crypto_support">このビルドでは暗号化に非対応です。</string>
+ <string name="decrypt_success_dev">Data を復号しました。新しいブロックデバイス: '{1}'</string>
+ <string name="done">完了しました。</string>
+ <string name="start_partition_sd">SD カードの分割中...</string>
+ <string name="partition_sd_locate">パーティションが見つかりません。</string>
+ <string name="ext_swap_size">EXT + Swap のサイズが SD カードのサイズを超えています。</string>
+ <string name="remove_part_table">パーティションテーブルを削除中...</string>
+ <string name="unable_rm_part">パーティションテーブルを削除きません。</string>
+ <string name="create_part">{1} パーティションを作成中...</string>
+ <string name="unable_to_create_part">{1} パーティションを作成できません。</string>
+ <string name="format_sdext_as">{1} として sd-ext を初期化しています...</string>
+ <string name="part_complete">分割しました。</string>
+ <string name="unable_to_open">\'{1}\' を開けません。</string>
+ <string name="mtp_already_enabled">MTP はすでに有効です。</string>
+ <string name="mtp_fail">MTP を有効化できませんでした。</string>
+ <string name="no_mtp">MTP に対応していません。</string>
+ <string name="image_flash_start">[イメージ書き込み開始]</string>
+ <string name="img_to_flash">書き込むイメージ: \'{1}\'</string>
+ <string name="flash_unable_locate">書き込み先の \'{1}\' パーティションが見つかりません。</string>
+ <string name="no_part_flash">書き込むパーティションが選択されていません。</string>
+ <string name="too_many_flash">書き込み先として選択されたパーティションが多すぎます。</string>
+ <string name="invalid_flash">パーティションの指定が間違っています。</string>
+ <string name="flash_done">[イメージ書き込み完了]</string>
+ <string name="wiping">{1} の消去中</string>
+ <string name="repair_not_exist">{1} は存在しません! 修復できません!</string>
+ <string name="repairing_using">{2} を使用して {1} を修復中...</string>
+ <string name="unable_repair">{1} を修復できません。</string>
+ <string name="mount_data_footer">/data をマウントできず、暗号フッターを見つけられませんでした。</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">\'{1}\' フォルダを作成できません。 ({2})</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">\'{1}\' をマウントできませんでした ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">'{1}' をアンマウントできませんでした ({2})</string>
+ <string name="cannot_resize">{1} をリサイズできません。</string>
+ <string name="repair_resize">リサイズの前に {1} を修復しています。</string>
+ <string name="unable_resize">{1} をリサイズできません。</string>
+ <string name="no_md5_found">\'{1}\' の MD5 ファイルが見つかりません。リストアするには MD5 の検証を無効化してください。</string>
+ <string name="md5_fail_match">\'{1}\' で MD5 が一致しません。</string>
+ <string name="md5_matched">MD5 matched for '{1}'.</string>
+ <string name="fail_decrypt_tar">tar ファイル '{1}' を復号できませんでした</string>
+ <string name="format_data_msg">/data を再度使用するにはリカバリを再起動してください。</string>
+ <string name="format_data_err">暗号化を解除するための初期化ができません。</string>
+ <string name="formatting_using">{2} を使用して {1} をフォーマット中...</string>
+ <string name="unable_to_wipe">{1} を消去できません。</string>
+ <string name="cannot_wipe">パーティション {1} は消去できません。</string>
+ <string name="remove_all">\'{1}\' のすべてのファイルを削除中</string>
+ <string name="wiping_data">/data/media 以外のデータを消去中...</string>
+ <string name="backing_up">{1} をバックアップ中...</string>
+ <string name="backing">バックアップ中</string>
+ <string name="backup_size">\'{1}\' のバックアップファイルサイズは0バイトです。</string>
+ <string name="datamedia_fs_restore">警告: この /data バックアップは {1} ファイルシステムでされています! {1} に戻さないとバックアップは起動できません。</string>
+ <string name="restoring">{1} をリストア中...</string>
+ <string name="restoring_hdr">リストア中</string>
+ <string name="recreate_folder_err">{1} フォルダを再作成できません。</string>
+ <string name="img_size_err">イメージのサイズがターゲットデバイスのサイズを超えています。</string>
+ <string name="flashing">{1} を書き込み中...</string>
+ <string name="backup_folder_set">バックアップフォルダを '{1}' に設定しました</string>
+ <string name="locate_backup_err">バックアップ \'{1}\' が見つかりません</string>
+ <string name="set_restore_opt">リストアオプションの設定中: \'{1}\':</string>
+ <string name="md5_check_skip">MD5 チェックのスキップが有効です</string>
+ <string name="ors_encrypt_restore_err">OpenRecoveryScript を使用して暗号化されたバックアップをリストアできません。</string>
+ <string name="mounting">マウント中</string>
+ <string name="unmounting">マウント解除中</string>
+ <string name="mounted">\'{1}\' をマウントしました</string>
+ <string name="unmounted">\'{1}\' のマウントを解除しました</string>
+ <string name="setting">\'{1}\' を \'{2}\' に設定中</string>
+ <string name="setting_empty">\'{1}\' を空に設定中</string>
+ <string name="making_dir1">ディレクトリを作成中</string>
+ <string name="making_dir2">ディレクトリを作成中: \'{1}\'</string>
+ <string name="running_command">コマンドの実行中</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">ADB sideload を開始中...</string>
+ <string name="need_new_adb">Sideload 機能を使うには、adb 1.0.32 以降が必要です。</string>
+ <string name="no_pwd">パスワードが指定されていません。</string>
+ <string name="done_ors">スクリプトファイルの処理が完了しました</string>
+ <string name="injecttwrp">boot イメージに TWRP を組み込み中...</string>
+ <string name="zip_err">ZIPファイル \'{1}\' のインストール中にエラーが発生しました</string>
+ <string name="installing_zip">ZIP ファイル \'{1}\' をインストール中</string>
+ <string name="select_backup_opt">バックアップオプションの設定中:</string>
+ <string name="compression_on">圧縮は有効です</string>
+ <string name="md5_off">MD5 生成は無効です</string>
+ <string name="backup_fail">バックアップに失敗しました</string>
+ <string name="backup_clean">バックアップに失敗しました。バックアップフォルダを掃除中です。</string>
+ <string name="running_recovery_commands">リカバリコマンドの実行中</string>
+ <string name="recovery_commands_complete">リカバリコマンドを実行しました</string>
+ <string name="running_ors">OpenRecoveryScript の実行中</string>
+ <string name="ors_complete">OpenRecoveryScript を実行しました</string>
+ <string name="no_updater_binary">ZIP ファイルの中で \'{1}\' が見つかりませんでした。</string>
+ <string name="check_for_md5">MD5 ファイルをチェック中...</string>
+ <string name="fail_sysmap">ファイル \'{1}\' のマップに失敗しました</string>
+ <string name="verify_zip_sig">ZIP の署名を検証中...</string>
+ <string name="verify_zip_fail">ZIP の署名の検証に失敗しました!</string>
+ <string name="verify_zip_done">ZIP の署名の検証に成功しました。</string>
+ <string name="zip_corrupt">ZIP ファイルが破損しています!</string>
+ <string name="no_md5">MD5 チェックをスキップ中: MD5 ファイルが見つかりません</string>
+ <string name="md5_fail">MD5 が一致しません</string>
+ <string name="md5_match">MD5 が一致しました</string>
+ <string name="pid_signal">{1} プロセスはこのシグナルで終了しました: {2}</string>
+ <string name="pid_error">{1} プロセスはこのエラーで終了しました: {2}</string>
+ <string name="install_dumlock">HTC Dumlock を system にインストール中...</string>
+ <string name="dumlock_restore">元の Boot をリストア中...</string>
+ <string name="dumlock_reflash">boot にリカバリを書き込み中...</string>
+ <string name="run_script">{1} スクリプトを実行しています...</string>
+ <string name="rename_stock">stock ROM が TWRP を置き換えるのを防ぐため、 /system の stock リカバリファイルの名前を変更しました。</string>
+ <string name="split_backup">バックアップファイルを複数の書庫に分割中...</string>
+ <string name="backup_error">バックアップの作成中にエラーが発生しました。</string>
+ <string name="restore_error">リストア処理中にエラーが発生しました。</string>
+ <string name="split_thread">スレッド ID {1} を書庫 {2} に分割中</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu / %llu ファイル、%i%%</string>
+ <string name="size_progress">%lluMB / %lluMB、%i%%</string>
+ <string name="decrypt_cmd">コマンドラインで data パーティションの復号を試行中です。</string>
+ <string name="base_pkg_err">基本パッケージの読み込みに失敗しました。</string>
+ <string name="simulating">アクションのシミュレート中...</string>
+ <string name="backup_cancel">バックアップをキャンセルしました</string>
+ <string name="config_twrp">TWRP を設定中...</string>
+ <string name="config_twrp_err">このカーネルで TWRP を設定できません。</string>
+ <string name="copy_log">リカバリログを {1} にコピーしました。</string>
+ <string name="max_queue">ZIP キューの上限に達しました!</string>
+ <string name="min_queue">ZIP キューの下限に達しました!</string>
+ <string name="screenshot_saved">スクリーンショットは {1} に保存されました。</string>
+ <string name="screenshot_err">スクリーンショットの撮影に失敗しました!</string>
+ <string name="zip_wipe_cache">一つ以上の ZIP が cache の消去を要求しました -- Cache を消去中です。</string>
+ <string name="and_sec_wipe_err">android secure を消去できません</string>
+ <string name="dalvik_wipe_err">Dalvik の消去に失敗しました</string>
+ <string name="auto_gen">(自動生成)</string>
+ <string name="curr_date">(現在の日付)</string>
+ <string name="backup_name_len">バックアップ名が長すぎます。</string>
+ <string name="backup_name_invalid">バックアップ名 \'{1}\' に使用できない文字が含まれています: \'{1}\'</string>
+ <string name="no_real_sdcard">この機器には実際の SD カードがありません! 中止します!</string>
+ <string name="cancel_sideload">ADB sideload を中止中...</string>
+ <string name="change_fs_err">ファイルシステムの変更中にエラーが発生しました。</string>
+ <string name="theme_ver_err">カスタムテーマのバージョンが TWRP のバージョンと一致しません。標準のテーマを使用します。</string>
+ <string name="up_a_level">(上の階層へ)</string>
+ <string name="install_reboot">5秒後に再起動します</string>
+ </resources>
+</language>
diff --git a/gui/theme/extra-languages/languages/zh_CN.xml b/gui/theme/extra-languages/languages/zh_CN.xml
new file mode 100644
index 000000000..9abbe2161
--- /dev/null
+++ b/gui/theme/extra-languages/languages/zh_CN.xml
@@ -0,0 +1,695 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Chinese (Simplified)</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System 镜像</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor 镜像</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="data_backup">Data(不包含存储)</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">内置存储</string>
+ <string name="microsd">SD 卡</string>
+ <string name="usbotg">外置 U 盘</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted 存储</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">温度:%tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">电量:%tw_battery%</string>
+ <string name="sort_by_name">按名称排序</string>
+ <string name="sort_by_date">按日期排序</string>
+ <string name="sort_by_size">按大小排序</string>
+ <string name="sort_by_name_only">名称</string>
+ <string name="sort_by_date_only">日期</string>
+ <string name="sort_by_size_only">大小</string>
+ <string name="tab_general">常规</string>
+ <string name="tab_options">选项</string>
+ <string name="tab_backup">备份</string>
+ <string name="tab_time_zone">时区</string>
+ <string name="tab_screen">屏幕</string>
+ <string name="tab_vibration">振动</string>
+ <string name="tab_language">语言</string>
+
+ <string name="install_btn">安装</string>
+ <string name="wipe_btn">清除</string>
+ <string name="backup_btn">备份</string>
+ <string name="restore_btn">恢复</string>
+ <string name="mount_btn">挂载</string>
+ <string name="settings_btn">设置</string>
+ <string name="advanced_btn">高级</string>
+ <string name="reboot_btn">重启</string>
+ <string name="files_btn">文件</string>
+ <string name="copy_log_btn">导出日志</string>
+ <string name="select_type_hdr">选择类型</string>
+ <string name="install_zip_hdr">安装 Zip 刷机包</string>
+ <string name="install_zip_btn">安装刷机包</string>
+ <string name="install_image_hdr">刷入 Image 镜像</string>
+ <string name="install_image_btn">刷入镜像</string>
+ <string name="install_select_file_hdr">选择文件</string>
+ <string name="file_selector_folders_hdr">目录</string>
+ <string name="select_file_from_storage">从 %tw_storage_display_name% (%tw_storage_free_size% MB) 中选择文件</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">安装</string>
+ <string name="select_storage_hdr">存储位置</string>
+ <string name="select_storage_btn">存储位置</string>
+ <string name="queue_hdr">队列</string>
+ <string name="zip_queue_count">已选 %tw_zip_queue_count% 个文件(最多 10 个)</string>
+ <string name="zip_queue_count_s">已选 %tw_zip_queue_count% 个,最多 10 个:</string>
+ <string name="zip_warn1">此操作可能会刷入不兼容的固件,</string>
+ <string name="zip_warn2">致使您的设备变砖。</string>
+ <string name="zip_back_cancel">按返回按钮取消添加此刷机包。</string>
+ <string name="zip_back_clear">按返回按钮清除刷机包刷入队列。</string>
+ <string name="folder">目录:</string>
+ <string name="file">文件:</string>
+ <string name="zip_sig_chk">Zip 刷机包签名校验</string>
+ <string name="inject_twrp_chk">安装完成后注入 TWRP</string>
+ <string name="install_reboot_chk">安装完成后重启</string>
+ <string name="options_hdr">选项</string>
+ <string name="confirm_flash_hdr">确认刷入</string>
+ <string name="zip_queue">队列:</string>
+ <string name="options">选项:</string>
+ <string name="swipe_confirm"> 确认</string>
+ <string name="zip_add_btn">添加更多刷机包</string>
+ <string name="zip_clear_btn">清除刷机队列</string>
+ <string name="install_zip_count_hdr">正在刷入第 %tw_zip_index% 个,共 %tw_zip_queue_count% 个</string>
+ <string name="installing_zip_xml">正在安装:%tw_file%</string>
+ <string name="failed">失败</string>
+ <string name="successful">成功</string>
+ <string name="install_failed">安装失败</string>
+ <string name="install_successful">安装成功</string>
+ <string name="wipe_cache_dalvik_btn">清除 Cache/Dalvik</string>
+ <string name="reboot_system_btn">重启系统</string>
+ <string name="install_sel_target">选择目标分区</string>
+ <string name="flash_image_select">选择要刷入镜像的分区:</string>
+ <string name="target_partition">目标分区:</string>
+ <string name="flashing_image">正在刷入镜像…</string>
+ <string name="image_flashed">镜像已刷入。</string>
+ <string name="wipe_cache_dalvik_confirm">是否清除 Cache 和 Dalvik?</string>
+ <string name="wiping_cache_dalvik">正在清除 Cache 和 Dalvik…</string>
+ <string name="wipe_cache_dalvik_complete">Cache 和 Dalvik 清除完成</string>
+ <string name="swipe_wipe">滑动按钮确认清除</string>
+ <string name="swipe_wipe_s"> 清除</string>
+ <string name="no_os1">没有安装任何系统!</string>
+ <string name="no_osrb">您确定要重启?</string>
+ <string name="no_ospo">您确定要关机?</string>
+ <string name="rebooting">正在重启…</string>
+ <string name="swipe_reboot">滑动按钮确认重启</string>
+ <string name="swipe_reboot_s"> 重启</string>
+ <string name="reboot_install_app_hdr">安装 TWRP 应用?</string>
+ <string name="reboot_install_app1">您希望安装官方 TWRP 应用吗?</string>
+ <string name="reboot_install_app2">该应用可帮您检查 TWRP 的最新版本。</string>
+ <string name="reboot_install_app_prompt_install">如果 TWRP 应用未安装时提示我</string>
+ <string name="reboot_install_app_system">安装为系统应用</string>
+ <string name="reboot_installing_app">正在安装应用…</string>
+ <string name="swipe_to_install_app">滑动按钮确认安装</string>
+ <string name="swipe_flash">滑动按钮确认刷入</string>
+ <string name="confirm_action">确认操作</string>
+ <string name="back_cancel">按返回按钮取消。</string>
+ <string name="cancel_btn">取消</string>
+ <string name="wipe_hdr">清除</string>
+ <string name="factory_reset_hdr">恢复出厂设置(双清)</string>
+ <string name="factory_reset_btn">恢复出厂</string>
+ <string name="factory_reset1">这将会清空 Data、Cache 分区和 Dalvik 缓存</string>
+ <string name="factory_reset2">(不会清除内置存储/sdcard)</string>
+ <string name="factory_reset3">在大多数情况下,您只需要</string>
+ <string name="factory_reset4">执行此操作即可。</string>
+ <string name="factory_resetting">正在恢复出厂设置…</string>
+ <string name="advanced_wipe_hdr">高级清除选项</string>
+ <string name="advanced_wipe_btn">高级清除</string>
+ <string name="wipe_enc_confirm">是否清除 Data 分区加密?</string>
+ <string name="formatting_data">正在格式化 Data 分区…</string>
+ <string name="swipe_format_data">滑动按钮确认格式化</string>
+ <string name="swipe_format_data_s"> 格式化 Data 分区</string>
+ <string name="factory_reset_complete">恢复出厂完成</string>
+ <string name="sel_part_hdr">选择分区</string>
+ <string name="wipe_sel_confirm">是否清除所选的分区?</string>
+ <string name="wiping_part">正在清除分区…</string>
+ <string name="wipe_complete">清除完成</string>
+ <string name="sel_part_wipe">选择要清除的分区:</string>
+ <string name="invalid_part_sel">无效的分区</string>
+ <string name="format_data_hdr">格式化 Data 分区</string>
+ <string name="format_data_btn">格式化 Data 分区</string>
+ <string name="format_data_ptr1">格式化 Data 分区将会清空您安装的所有</string>
+ <string name="format_data_ptr2">软件、备份、图片、媒体,</string>
+ <string name="format_data_ptr3">以及对内置存储所做的加密等。</string>
+ <string name="format_data_adopted">也包括 Adopted 存储</string>
+ <string name="format_data_lcp1">格式化 Data 分区将会清空您安装的所有软件、备份、图片、媒体,</string>
+ <string name="format_data_lcp2">以及对内置存储所做的加密等。</string>
+ <string name="format_data_wtc1">格式化 Data 分区会清除您的所有软件</string>
+ <string name="format_data_wtc2">备份和媒体数据,无法撤销。</string>
+ <string name="format_data_undo">执行此操作后将无法恢复。</string>
+ <string name="format_data_complete">格式化 Data 分区完成</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">输入 yes 继续,按返回按钮取消。</string>
+ <string name="part_opt_hdr">分区名:%tw_partition_name%</string>
+ <string name="sel_act_hdr">选择操作</string>
+ <string name="file_sys_opt">文件系统选项</string>
+ <string name="partition">分区:%tw_partition_name%</string>
+ <string name="part_mount_point">挂载位置:%tw_partition_mount_point%</string>
+ <string name="part_curr_fs">文件系统:%tw_partition_file_system%</string>
+ <string name="part_present_yes">当前:是</string>
+ <string name="part_present_no">当前:否</string>
+ <string name="part_removable_yes">可移除:是</string>
+ <string name="part_removable_no">可移除:否</string>
+ <string name="part_size">大小:%tw_partition_size%MB</string>
+ <string name="part_used">已用:%tw_partition_used%MB</string>
+ <string name="part_free">空闲:%tw_partition_free%MB</string>
+ <string name="part_backup_size">备份大小:%tw_partition_backup_size%MB</string>
+ <string name="resize_btn">调整文件系统</string>
+ <string name="resize_btn_s">调整</string>
+ <string name="resize_confirm">是否调整 %tw_partition_name%?</string>
+ <string name="resizing">正在调整…</string>
+ <string name="resize_complete">调整完成</string>
+ <string name="swipe_resize">滑动按钮确认调整</string>
+ <string name="swipe_resize_s"> 调整</string>
+ <string name="repair_btn">修复文件系统</string>
+ <string name="repair_btn_s">修复</string>
+ <string name="repair_confirm">是否修复 %tw_partition_name%?</string>
+ <string name="repairing">正在修复…</string>
+ <string name="repair_complete">修复完成</string>
+ <string name="swipe_repair">滑动按钮确认修复</string>
+ <string name="swipe_repair_s"> 修复</string>
+ <string name="change_fs_btn">更改文件系统</string>
+ <string name="change_fs_btn_s">更改</string>
+ <string name="change_fs_for_hdr">要更改的分区:%tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">分区:%tw_partition_name%&gt;选择文件系统</string>
+ <string name="change_fs_warn1">一些固件或内核可能不支持</string>
+ <string name="change_fs_warn2">某些文件系统,请谨慎!</string>
+ <string name="change_fs_confirm">是否更改 %tw_partition_name% 为:</string>
+ <string name="formatting">正在格式化…</string>
+ <string name="format_complete">格式化完成</string>
+ <string name="swipe_change_fs">滑动按钮确认更改</string>
+ <string name="swipe_change_s"> 更改</string>
+ <string name="back_btn">返回</string>
+ <string name="wipe_enc_btn">清除加密</string>
+ <string name="swipe_factory_reset">滑动按钮确认恢复出厂</string>
+ <string name="repair_change_btn">修复或更改文件系统</string>
+ <string name="storage_hdr">存储位置:%tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">备份</string>
+ <string name="backup_confirm_hdr">确认备份</string>
+ <string name="encryption_tab">加密</string>
+ <string name="encryption">加密:</string>
+ <string name="name">名称:</string>
+ <string name="sel_part_backup">选择要备份的分区:</string>
+ <string name="storage">储存位置:</string>
+ <string name="enc_disabled">已禁用 - 设置密码以启用</string>
+ <string name="enc_enabled">已启用</string>
+ <string name="enable_backup_comp_chk">启用压缩</string>
+ <string name="skip_md5_backup_chk">当备份时跳过生成 MD5</string>
+ <string name="disable_backup_space_chk">禁用剩余空间检查</string>
+ <string name="current_boot_slot">当前分区:%tw_active_slot%</string>
+ <string name="boot_slot_a">分区 A</string>
+ <string name="boot_slot_b">分区 B</string>
+ <string name="changing_boot_slot">更改启动分区</string>
+ <string name="changing_boot_slot_complete">更改启动分区完成</string>
+ <string name="refresh_sizes_btn">刷新大小</string>
+ <string name="swipe_backup">滑动按钮确认备份</string>
+ <string name="append_date_btn">附加日期</string>
+ <string name="backup_name_exists">使用该名称的备份已经存在!</string>
+ <string name="encrypt_backup">是否加密备份?</string>
+ <string name="enter_pass">请输入密码:</string>
+ <string name="enter_pass2">请再输入一遍:</string>
+ <string name="pass_not_match">密码不匹配!</string>
+ <string name="partitions">分区:</string>
+ <string name="disabled">已禁用</string>
+ <string name="enabled">已启用</string>
+ <string name="backup_name_hdr">设置备份名称</string>
+ <string name="progress">进度:</string>
+ <string name="backup_complete">备份完成</string>
+ <string name="restore_hdr">恢复</string>
+ <string name="sel_backup_hdr">选择备份</string>
+ <string name="restore_sel_store_hdr">从 %tw_storage_display_name% (%tw_storage_free_size% MB) 中选择备份</string>
+ <string name="restore_sel_pack_fs">选择要恢复的备份包:</string>
+ <string name="restore_enc_backup_hdr">备份已被加密</string>
+ <string name="restore_dec_fail">密码错误,请重试</string>
+ <string name="del_backup_btn">删除备份</string>
+ <string name="del_backup_confirm">是否删除备份:</string>
+ <string name="del_backup_confirm2">此操作无法恢复!</string>
+ <string name="deleting_backup">正在删除备份…</string>
+ <string name="backup_deleted">备份删除完成</string>
+ <string name="swipe_delete">滑动按钮确认删除</string>
+ <string name="swipe_delete_s"> 删除</string>
+ <string name="restore_try_decrypt">加密的备份 - 尝试解密</string>
+ <string name="restore_try_decrypt_s">正在尝试解密</string>
+ <string name="restore_backup_date">备份于 %tw_restore_file_date%</string>
+ <string name="restore_sel_part">选择要恢复的分区:</string>
+ <string name="restore_enable_md5_chk">启用 MD5 校验备份文件</string>
+ <string name="restore_complete">恢复完成</string>
+ <string name="swipe_restore">滑动按钮确认恢复</string>
+ <string name="swipe_restore_s"> 恢复</string>
+ <string name="rename_backup_hdr">重命名备份</string>
+ <string name="rename_backup_confirm">是否重命名备份文件?</string>
+ <string name="rename_backup_confirm2">此操作无法恢复!</string>
+ <string name="renaming_backup">正在重命名…</string>
+ <string name="rename_backup_complete">重命名完成</string>
+ <string name="swipe_to_rename">滑动按钮确认重命名</string>
+ <string name="swipe_rename"> 重命名</string>
+ <string name="confirm_hdr">确认</string>
+ <string name="mount_hdr">挂载</string>
+ <string name="mount_sel_part">选择要挂载的分区:</string>
+ <string name="mount_sys_ro_chk">挂载 System 分区为只读</string>
+ <string name="mount_sys_ro_s_chk">挂载 System 为只读</string>
+ <string name="decrypt_data_btn">解密 Data 分区</string>
+ <string name="disable_mtp_btn">停用 MTP 模式</string>
+ <string name="enable_mtp_btn">启用 MTP 模式</string>
+ <string name="mount_usb_storage_btn">挂载 USB 存储</string>
+ <string name="usb_storage_hdr">USB 存储</string>
+ <string name="usb_stor_mnt1">已挂载 USB 存储</string>
+ <string name="usb_stor_mnt2">请确认解除挂载前先从</string>
+ <string name="usb_stor_mnt3">电脑上安全地移除设备!</string>
+ <string name="unmount_btn">卸载</string>
+ <string name="rb_system_btn">系统</string>
+ <string name="rb_poweroff_btn">关机</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">正在关机…</string>
+ <string name="swipe_power_off">滑动按钮确认关机</string>
+ <string name="swipe_power_off_s">关机</string>
+ <string name="sys_ro_hdr">未修改的 System 分区</string>
+ <string name="sys_ro_keep">是否保持系统分区为只读?</string>
+ <string name="sys_rop1">TWRP 可以保持系统分区未修改状态</string>
+ <string name="sys_rop2">使您更容易获得官方的更新。</string>
+ <string name="sys_rop3">TWRP 将无法禁止原厂固件可能</string>
+ <string name="sys_rop4">替换 TWRP 并且不能 Root 您的设备。</string>
+ <string name="sys_rop5">安装刷机包或者通过 adb 操作依然可以</string>
+ <string name="sys_rop6">修改系统分区。</string>
+ <string name="sys_rol1">TWRP 可以保持系统分区为未修改状态,使您更容易获得官方的更新。</string>
+ <string name="sys_rol2">TWRP 将无法禁止原厂固件替换 TWRP,并且不能 Root 您的设备。</string>
+ <string name="sys_rol3">安装刷机包或者通过 adb 操作依然可以修改系统分区。</string>
+ <string name="sys_ro_never_show_chk">下次启动时不再显示此界面</string>
+ <string name="sys_ro_keep_ro_btn">保持只读</string>
+ <string name="swipe_allow_mod">滑动按钮允许修改</string>
+ <string name="swipe_allow_mod_s">允许修改</string>
+ <string name="settings_hdr">设置</string>
+ <string name="settings_gen_hdr">常规</string>
+ <string name="settings_gen_s_hdr">常规</string>
+ <string name="settings_gen_btn">常规</string>
+ <string name="use_rmrf_chk">使用 rm -rf 命令代替格式化</string>
+ <string name="use24clock_chk">使用 24 小时制</string>
+ <string name="rev_navbar_chk">反转底部按钮布局</string>
+ <string name="simact_chk">为测试主题使用模拟操作</string>
+ <string name="simfail_chk">模拟失败操作</string>
+ <string name="ctr_navbar_rdo">导航栏按钮居中</string>
+ <string name="lft_navbar_rdo">导航栏按钮左对齐</string>
+ <string name="rht_navbar_rdo">导航栏按钮右对齐</string>
+ <string name="restore_defaults_btn">恢复默认设置</string>
+ <string name="settings_tz_btn">时区</string>
+ <string name="settings_screen_btn">屏幕</string>
+ <string name="settings_screen_bright_btn">屏幕亮度</string>
+ <string name="settings_vibration_btn">振动</string>
+ <string name="settings_language_btn">语言</string>
+ <string name="time_zone_hdr">时区</string>
+ <string name="sel_tz_list">选择时区:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) 美属萨摩亚、中途岛</string>
+ <string name="utcm10">(UTC -10) 夏威夷</string>
+ <string name="utcm9">(UTC -9) 阿拉斯加</string>
+ <string name="utcm8">(UTC -8) 太平洋标准时间</string>
+ <string name="utcm7">(UTC -7) 北美山区标准时间</string>
+ <string name="utcm6">(UTC -6) 北美中部标准时间</string>
+ <string name="utcm5">(UTC -5) 北美东部标准时间</string>
+ <string name="utcm4">(UTC -4) 大西洋标准时间</string>
+ <string name="utcm3">(UTC -3) 巴西、阿根廷(布宜诺斯)</string>
+ <string name="utcm2">(UTC -2) 大西洋中部</string>
+ <string name="utcm1">(UTC -1) 葡萄牙(亚速尔群岛),佛得角</string>
+ <string name="utc0">(UTC 0) 伦敦、都柏林、里斯本</string>
+ <string name="utcp1">(UTC +1) 柏林、布鲁塞尔、巴黎</string>
+ <string name="utcp2">(UTC +2) 雅典、伊斯坦布尔、南非</string>
+ <string name="utcp3">(UTC +3) 莫斯科、巴格达</string>
+ <string name="utcp4">(UTC +4) 阿布扎比、第比利斯、马斯喀特</string>
+ <string name="utcp5">(UTC +5) 叶卡捷琳堡、伊斯兰堡</string>
+ <string name="utcp6">(UTC +6) 阿拉木图、达卡、科伦坡</string>
+ <string name="utcp7">(UTC +7) 曼谷、河内、雅加达</string>
+ <string name="utcp8">(UTC +8) 北京、新加坡、香港</string>
+ <string name="utcp9">(UTC +9) 东京、首尔、雅库茨克</string>
+ <string name="utcp10">(UTC +10) 澳大利亚东部、关岛</string>
+ <string name="utcp11">(UTC +11) 符拉迪沃斯托克、索罗门群岛</string>
+ <string name="utcp12">(UTC +12) 奥克兰、惠灵顿、斐济</string>
+ <string name="sel_tz_offset">时间偏差(通常为 0):%tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">无</string>
+ <string name="tz_offset_0">0 分钟</string>
+ <string name="tz_offset_15">15 分钟</string>
+ <string name="tz_offset_30">30 分钟</string>
+ <string name="tz_offset_45">45 分钟</string>
+ <string name="use_dst_chk">使用夏令时 (DST)</string>
+ <string name="curr_tz">当前时区:%tw_time_zone%</string>
+ <string name="curr_tz_s">当前时区:</string>
+ <string name="set_tz_btn">设置时区</string>
+ <string name="settings_screen_hdr">屏幕</string>
+ <string name="settings_screen_timeout_hdr">屏幕超时</string>
+ <string name="enable_timeout_chk">启用屏幕超时</string>
+ <string name="screen_to_slider">屏幕超时时间(秒):</string>
+ <string name="screen_to_slider_s">屏幕超时(0=禁用):%tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">屏幕超时设置不可用</string>
+ <string name="screen_bright_slider">屏幕亮度:%tw_brightness_pct%%</string>
+ <string name="screen_bright_na">屏幕亮度设置不可用</string>
+ <string name="vibration_hdr">振动</string>
+ <string name="button_vibration_hdr">按钮振动</string>
+ <string name="kb_vibration_hdr">键盘振动</string>
+ <string name="act_vibration_hdr">操作振动</string>
+ <string name="button_vibration">按钮振动强度:</string>
+ <string name="kb_vibration">键盘振动强度:</string>
+ <string name="act_vibration">操作振动强度:</string>
+ <string name="select_language">选择语言:</string>
+ <string name="sel_lang_btn">选择语言</string>
+ <string name="set_language_btn">设置语言</string>
+ <string name="advanced_hdr">高级选项</string>
+ <string name="copy_log_confirm">是否导出日志到内置存储?</string>
+ <string name="copying_log" version="2">正在复制…</string>
+ <string name="copy_log_complete" version="2">日志导出完成</string>
+ <string name="fix_context_btn">修复 Context</string>
+ <string name="part_sd_btn">分区 SD 卡</string>
+ <string name="part_sd_s_btn">SD 卡</string>
+ <string name="file_manager_btn">文件管理</string>
+ <string name="language_hdr">语言</string>
+ <string name="terminal_btn">终端命令</string>
+ <string name="reload_theme_btn">重载主题</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">注入 TWRP</string>
+ <string name="inject_twrp_confirm">是否重新注入 TWRP?</string>
+ <string name="injecting_twrp">正在重新注入 TWRP…</string>
+ <string name="inject_twrp_complete">TWRP 注入完成</string>
+ <string name="swipe_to_confirm">滑动按钮确认</string>
+ <string name="part_sd_hdr">SD 卡分区</string>
+ <string name="invalid_partsd_sel">您必须选择一个可移动设备</string>
+ <string name="part_sd_lose">您将会丢失 SD 卡上的所有文件!</string>
+ <string name="part_sd_undo">此操作无法恢复!</string>
+ <string name="part_sd_ext_sz">EXT 大小:</string>
+ <string name="part_sd_swap_sz">Swap 大小:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">文件系统:</string>
+ <string name="swipe_part_sd">滑动按钮确认分区</string>
+ <string name="swipe_part_sd_s">分区</string>
+ <string name="partitioning_sd">正在对 SD 卡分区…</string>
+ <string name="partitioning_sd2">这将需要几分钟的时间。</string>
+ <string name="part_sd_complete">分区完成</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">恢复原版 Boot 镜像</string>
+ <string name="dumlock_restore_confirm">是否恢复原版 Boot 镜像?</string>
+ <string name="dumlock_restoring">正在恢复原版 Boot 镜像…</string>
+ <string name="dumlock_restore_complete">恢复原版 Boot 镜像完成</string>
+ <string name="dumlock_reflash_btn">重新刷入 Recovery</string>
+ <string name="dumlock_reflash_confirm">是否重新刷入 Recovery 至 Boot 分区?</string>
+ <string name="dumlock_reflashing">正在刷入 Recovery 至 Boot 分区…</string>
+ <string name="dumlock_reflash_complete">Recovery 刷入完成</string>
+ <string name="dumlock_install_btn">安装 HTC Dumlock</string>
+ <string name="dumlock_install_confirm">是否安装 HTC Dumlock 文件到系统中?</string>
+ <string name="dumlock_installing">正在安装 HTC Dumlock…</string>
+ <string name="dumlock_install_complete">HTC Dumlock 安装完成</string>
+ <string name="swipe_to_unlock">滑动按钮解锁</string>
+ <string name="swipe_unlock"> 解锁</string>
+ <string name="fm_hdr">文件管理</string>
+ <string name="fm_sel_file">选择文件或文件夹</string>
+ <string name="fm_type_folder">文件夹</string>
+ <string name="fm_type_file">文件</string>
+ <string name="fm_choose_act">选择操作</string>
+ <string name="fm_selected">已选择:%tw_fm_type%</string>
+ <string name="fm_copy_btn">复制</string>
+ <string name="fm_copy_file_btn">复制文件</string>
+ <string name="fm_copy_folder_btn">复制文件夹</string>
+ <string name="fm_copying">正在复制</string>
+ <string name="fm_move_btn">移动</string>
+ <string name="fm_moving">正在移动</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">删除</string>
+ <string name="fm_deleting">正在删除</string>
+ <string name="fm_rename_btn">重命名</string>
+ <string name="fm_rename_file_btn">重命名文件</string>
+ <string name="fm_rename_folder_btn">重命名文件夹</string>
+ <string name="fm_renaming">正在重命名</string>
+ <string name="fm_sel_dest">选择目标目录</string>
+ <string name="fm_sel_curr_folder">选择当前目录</string>
+ <string name="fm_rename_hdr">重命名</string>
+ <string name="fm_set_perms_hdr">设置权限</string>
+ <string name="fm_perms">权限:</string>
+ <string name="fm_complete">操作完成</string>
+ <string name="decrypt_data_hdr">解密 Data 分区</string>
+ <string name="decrypt_data_enter_pass">请输入密码。</string>
+ <string name="decrypt_data_failed">密码错误,请重试!</string>
+ <string name="decrypt_data_failed_pattern">图案错误,请重试!</string>
+ <string name="decrypt_data_enter_pattern">绘制解锁图案</string>
+ <string name="decrypt_data_trying">正在尝试解密</string>
+ <string name="term_hdr">终端命令</string>
+ <string name="term_s_hdr">终端</string>
+ <string name="term_kill_btn">终止</string>
+ <string name="term_sel_folder_hdr">选择运行目录</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">清除 Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">清除 Cache</string>
+ <string name="swipe_to_sideload">滑动按钮开始 Sideload</string>
+ <string name="swipe_sideload"> 开始</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">使用方式:adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload 完成</string>
+ <string name="fix_contexts_hdr">修复 Context</string>
+ <string name="fix_contexts_note1">注意:很少情况下需要修复 Context。</string>
+ <string name="fix_contexts_note2">修复 SELinux Context 可能会导致</string>
+ <string name="fix_contexts_note3">您的设备无法正常启动。</string>
+ <string name="swipe_to_fix_contexts">滑动按钮确认修复</string>
+ <string name="swipe_fix_contexts"> 修复 Context</string>
+ <string name="fixing_contexts">正在修复 Context…</string>
+ <string name="fix_contexts_complete">修复 Context 完成</string>
+ <string name="reboot_hdr">重启选项</string>
+ <string name="su_hdr">SuperSU 检测</string>
+ <string name="su_note1">系统目前没有 Root。</string>
+ <string name="su_note2">是否现在安装 SuperSU?</string>
+ <string name="su_note3">这将会 Root 您的设备。</string>
+ <string name="su_cancel">不,以后再说</string>
+ <string name="swipe_su_to_install">滑动按钮确认安装</string>
+ <string name="swipe_su_install"> 安装</string>
+ <string name="su_installing">正在安装 SuperSU</string>
+ <string name="sel_storage_list">选择存储位置</string>
+ <string name="ok_btn">确定</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">内核不支持读取 SELinux Context。</string>
+ <string name="full_selinux">完整 SELinux 支持。</string>
+ <string name="no_selinux">无 SELinux 支持(无 libselinux)。</string>
+ <string name="mtp_enabled">MTP 已启用</string>
+ <string name="mtp_crash">MTP 已崩溃。启动时不再加载 MTP。</string>
+ <string name="decrypt_success">已使用默认密码解密成功。</string>
+ <string name="unable_to_decrypt">无法使用默认密码来解密,您可能需要格式化 Data 分区。</string>
+ <string name="generating_md51">正在生成 MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * 正在生成 MD5…</string>
+ <string name="md5_created"> * MD5 已生成。</string>
+ <string name="md5_error"> * MD5 错误!</string>
+ <string name="md5_compute_error"> * 计算 MD5 错误。</string>
+ <string name="current_date">(Current Date)</string>
+ <string name="auto_generate">(Auto Generate)</string>
+ <string name="unable_to_locate_partition">未找到 '{1}' 分区。</string>
+ <string name="no_partition_selected">未选择备份分区。</string>
+ <string name="total_partitions_backup"> * 备份分区总数:{1}</string>
+ <string name="total_backup_size"> * 备份数据总计:{1}MB</string>
+ <string name="available_space"> * 可用空间:{1}MB</string>
+ <string name="unable_locate_storage">未找到存储设备。</string>
+ <string name="no_space">存储器上没有足够的空间。</string>
+ <string name="backup_started">[已开始备份]</string>
+ <string name="backup_folder"> * 备份文件夹:{1}</string>
+ <string name="fail_backup_folder">建立备份文件夹失败。</string>
+ <string name="avg_backup_fs">文件平均备份速度:{1}MB/秒</string>
+ <string name="avg_backup_img">镜像平均备份速度:{1}MB/秒</string>
+ <string name="total_backed_size">[总计备份 {1}MB]</string>
+ <string name="backup_completed">[备份已完成,耗时 {1} 秒]</string>
+ <string name="restore_started">[已开始还原]</string>
+ <string name="restore_folder">恢复文件夹:'{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} 恢复完成({2} 秒)]</string>
+ <string name="verifying_md5">正在校验 MD5</string>
+ <string name="skip_md5">基于用户设置,已跳过 MD5 检查。</string>
+ <string name="calc_restore">正在计算恢复详情…</string>
+ <string name="restore_read_only">无法恢复 {1} -- 已挂载为只读。</string>
+ <string name="restore_unable_locate">未找到 '{1}' 分区。</string>
+ <string name="no_part_restore">未选择要恢复的分区。</string>
+ <string name="restore_part_count">正在恢复 {1} 个分区…</string>
+ <string name="total_restore_size">恢复文件总计 {1}MB</string>
+ <string name="updating_system_details">更新系统详细信息</string>
+ <string name="restore_completed">[恢复完成,耗时 {1} 秒]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">打开出错:'{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">无法通过备份名称来查找分区:'{1}'</string>
+ <string name="unable_find_part_path">找不到分区路径 '{1}'</string>
+ <string name="update_part_details">正在更新分区详情…</string>
+ <string name="update_part_details_done">…完成</string>
+ <string name="wiping_dalvik">正在清除 Dalvik Cache 目录…</string>
+ <string name="cleaned">已清除:{1}…</string>
+ <string name="dalvik_done">-- Dalvik Cache 清除完成!</string>
+ <string name="no_andsec">未发现 android secure 分区。</string>
+ <string name="unable_to_locate">未找到 {1}。</string>
+ <string name="wiping_datamedia">清除内置存储 -- /data/media…</string>
+ <string name="unable_to_mount">无法挂载 {1}</string>
+ <string name="unable_to_mount_internal">无法挂载内置存储</string>
+ <string name="unable_to_mount_storage">无法挂载存储</string>
+ <string name="fail_decrypt">解密数据失败。</string>
+ <string name="no_crypto_support">此版本不支持加密。</string>
+ <string name="decrypt_success_dev">Data 分区成功解密,新增块设备:'{1}'</string>
+ <string name="decrypt_success_nodev">Data 分区已成功解密</string>
+ <string name="done">完成。</string>
+ <string name="start_partition_sd">正在给 SD 卡分区…</string>
+ <string name="partition_sd_locate">未找到需要分区的设备。</string>
+ <string name="ext_swap_size">EXT+Swap 大小超过 SD 卡容量。</string>
+ <string name="remove_part_table">正在删除分区表…</string>
+ <string name="unable_rm_part">无法删除分区表。</string>
+ <string name="create_part">正在建立 {1} 分区…</string>
+ <string name="unable_to_create_part">无法建立 {1} 分区。</string>
+ <string name="format_sdext_as">正在将 sd-ext 格式化为 {1}…</string>
+ <string name="part_complete">分区完成。</string>
+ <string name="unable_to_open">无法打开 '{1}'。</string>
+ <string name="mtp_already_enabled">MTP 已经启用</string>
+ <string name="mtp_fail">启用 MTP 失败</string>
+ <string name="no_mtp">不支持 MTP</string>
+ <string name="image_flash_start">[开始刷入镜像]</string>
+ <string name="img_to_flash">刷入镜像:'{1}'</string>
+ <string name="flash_unable_locate">未找到 '{1}' 分区。</string>
+ <string name="no_part_flash">未选择刷入分区。</string>
+ <string name="too_many_flash">选择刷入的分区太多。</string>
+ <string name="invalid_flash">指定的刷入分区无效。</string>
+ <string name="flash_done">[镜像刷入完成]</string>
+ <string name="wiping">正在清除 {1}</string>
+ <string name="repair_not_exist">{1} 不存在!无法修复!</string>
+ <string name="repairing_using">正在使用 {2} 修复 {1}…</string>
+ <string name="unable_repair">无法修复 {1}。</string>
+ <string name="mount_data_footer">无法挂载/data,未找到加密 footer。</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">无法创建 '{1}' 文件夹 ({2})。</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">挂载 '{1}' 失败 ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">卸载 '{1}' 失败 ({2})</string>
+ <string name="cannot_resize">无法更改 {1} 大小。</string>
+ <string name="repair_resize">在调整大小之前修复 {1}。</string>
+ <string name="unable_resize">无法调整 {1} 大小。</string>
+ <string name="no_md5_found">未找到 '{1}' 的 MD5 校验文件。请取消选中“启用 MD5 校验备份文件”复选框。</string>
+ <string name="md5_fail_match">'{1}' MD5 校验失败。</string>
+ <string name="md5_matched">MD5 匹配 '{1}'。</string>
+ <string name="fail_decrypt_tar">无法解密 tar 文件 '{1}'</string>
+ <string name="format_data_msg">您可能需要重启 Recovery 才能使用/data。</string>
+ <string name="format_data_err">无法格式化并删除加密。</string>
+ <string name="formatting_using">使用 {2} 格式化 {1}…</string>
+ <string name="unable_to_wipe">无法清除 {1}。</string>
+ <string name="cannot_wipe">无法清除 {1} 分区。</string>
+ <string name="remove_all">移除 '{1}' 下的所有文件</string>
+ <string name="wiping_data">正在清除 Data 分区,跳过清除/data/media…</string>
+ <string name="backing_up">正在备份 {1}…</string>
+ <string name="backup_storage_warning">备份的 {1} 分区不包含内置存储上的任何文件,例如照片或下载的文件等等。</string>
+ <string name="backing">正在备份</string>
+ <string name="backup_size">'{1}' 的备份文件大小为 0 字节。</string>
+ <string name="datamedia_fs_restore">警告:此/data 备份文件系统为 {1}!除非把文件系统格式设置为 {1} 否则可能无法启动。</string>
+ <string name="restoring">正在恢复 {1}…</string>
+ <string name="restoring_hdr">正在恢复</string>
+ <string name="recreate_folder_err">无法重新创建 {1} 文件夹。</string>
+ <string name="img_size_err">镜像大小大于目标设备</string>
+ <string name="flashing">正在刷入 {1}…</string>
+ <string name="backup_folder">备份文件夹设置为:'{1}'</string>
+ <string name="locate_backup_err">未找到备份文件 '{1}'</string>
+ <string name="set_restore_opt">设置恢复选项:'{1}':</string>
+ <string name="md5_check_skip">跳过校验 MD5 已开启</string>
+ <string name="ors_encrypt_restore_err">无法使用 OpenRecoveryScript 脚本恢复加密备份。</string>
+ <string name="mounting">正在挂载</string>
+ <string name="unmounting">正在卸载</string>
+ <string name="mounted">'{1}' 已挂载</string>
+ <string name="unmounted">'{1}' 已卸载</string>
+ <string name="setting">设置 '{1}' 为 '{2}'</string>
+ <string name="setting_empty">设置 '{1}' 为空</string>
+ <string name="making_dir1">创建目录</string>
+ <string name="making_dir2">创建目录:'{1}'</string>
+ <string name="running_command">运行命令</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">正在开始 ADB sideload…</string>
+ <string name="need_new_adb">您需要 1.0.32 或更高版本的 adb 才可以使用。</string>
+ <string name="no_pwd">未提供密码。</string>
+ <string name="done_ors">脚本执行完毕</string>
+ <string name="injecttwrp">正在注入 TWRP 到 Boot 镜像…</string>
+ <string name="zip_err">安装 Zip 刷机包 '{1}' 时出错</string>
+ <string name="installing_zip">正在安装 Zip 刷机包 '{1}'</string>
+ <string name="select_backup_opt">设置备份选项:</string>
+ <string name="compression_on">压缩选项已开启</string>
+ <string name="md5_off">MD5 生成已关闭</string>
+ <string name="backup_fail">备份失败</string>
+ <string name="backup_clean">备份失败。正在清理备份文件夹。</string>
+ <string name="running_recovery_commands">运行 Recovery 命令</string>
+ <string name="recovery_commands_complete">Recovery 命令执行完成</string>
+ <string name="running_ors">运行 OpenRecoveryScript 脚本</string>
+ <string name="ors_complete">运行 OpenRecoveryScript 脚本完成</string>
+ <string name="invalid_zip_format">Zip 文件格式无效!</string>
+ <string name="check_for_md5">正在检测 MD5…</string>
+ <string name="fail_sysmap">映射文件 '{1}' 失败</string>
+ <string name="verify_zip_sig">正在校验 Zip 刷机包签名…</string>
+ <string name="verify_zip_fail">刷机包签名校验失败!</string>
+ <string name="verify_zip_done">刷机包签名校验成功。</string>
+ <string name="zip_corrupt">刷机包已损坏!</string>
+ <string name="no_md5">跳过 MD5 校验:未找到 MD5 文件</string>
+ <string name="md5_fail">MD5 不匹配</string>
+ <string name="md5_match">MD5 校验成功</string>
+ <string name="pid_signal">{1} 过程结束,标志:{2}</string>
+ <string name="pid_error">{1} 过程结束,错误:{2}</string>
+ <string name="install_dumlock">安装 HTC Dumlock 到系统…</string>
+ <string name="dumlock_restore">正在恢复原版 Boot…</string>
+ <string name="dumlock_reflash">正在重新刷入 Recovery 到 Boot…</string>
+ <string name="run_script">正在运行 {1} 脚本…</string>
+ <string name="rename_stock">重命名/system 下原版 Recovery 的补丁文件,避免原厂固件替换 TWRP。</string>
+ <string name="split_backup">分解备份文件为多个压缩文件…</string>
+ <string name="backup_error">建立备份失败。</string>
+ <string name="restore_error">在恢复过程中发生错误。</string>
+ <string name="split_thread">拆分线程 ID {1} 到压缩文件 {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">已完成 %llu 个,共 %llu 个文件,进度 %i%%</string>
+ <string name="size_progress">已完成 %lluMB,共 %lluMB,进度 %i%%</string>
+ <string name="decrypt_cmd">尝试通过命令行解密 Data 分区。</string>
+ <string name="base_pkg_err">无法加载基本包。</string>
+ <string name="simulating">正在模拟操作…</string>
+ <string name="backup_cancel">备份已取消。</string>
+ <string name="config_twrp">正在配置 TWRP…</string>
+ <string name="config_twrp_err">此内核无法配置 TWRP。</string>
+ <string name="copy_log">已经导出 Recovery 日志到 {1}。</string>
+ <string name="max_queue">已达到最大刷机包刷入队列!</string>
+ <string name="min_queue">已达到最大刷机包刷入队列!</string>
+ <string name="screenshot_saved">截图已保存到:{1}</string>
+ <string name="screenshot_err">截图失败!</string>
+ <string name="zip_wipe_cache">一个或多个刷机包请求清除 cache -- 正在清除 cache。</string>
+ <string name="and_sec_wipe_err">无法清除 android secure</string>
+ <string name="dalvik_wipe_err">清除 Dalvik 失败</string>
+ <string name="auto_gen">(Auto Generate)</string>
+ <string name="curr_date">(Current Date)</string>
+ <string name="backup_name_len">备份名称太长。</string>
+ <string name="backup_name_invalid">备份名称 '{1}' 中包含无效字符:'{1}'</string>
+ <string name="no_real_sdcard">此设备没有真实的 SD 卡!正在中止!</string>
+ <string name="cancel_sideload">取消 ADB Sideload…</string>
+ <string name="change_fs_err">更换文件系统时出错。</string>
+ <string name="theme_ver_err">自定义主题和 TWRP 版本不匹配,正在使用原版主题。</string>
+ <string name="up_a_level">(上级目录)</string>
+ <string name="install_reboot" version="2">将会在 %tw_sleep% 秒内重启</string>
+ <string name="adbbackup_error">ADB 备份错误。正在退出…"</string>
+ <string name="adbbackup_control_error">无法写入 adb 控制通道</string>
+ <string name="twrp_adbbu_option">--twrp 选项需启用 twrp adb backup</string>
+ <string name="partition_not_found">分区列表中未发现路径:{1}</string>
+ <string name="copy_kernel_log">已导出内核日志至 {1}</string>
+ <string name="include_kernel_log">包含内核日志</string>
+ <string name="unable_set_boot_slot">更改 bootloader 启动分区至 {1} 错误</string>
+ </resources>
+</language>
diff --git a/gui/theme/extra-languages/languages/zh_TW.xml b/gui/theme/extra-languages/languages/zh_TW.xml
new file mode 100644
index 000000000..55a9dccce
--- /dev/null
+++ b/gui/theme/extra-languages/languages/zh_TW.xml
@@ -0,0 +1,695 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Chinese (Traditional)</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System 鏡像</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor 鏡像</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="data_backup">Data(不包含存儲)</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">內置存儲</string>
+ <string name="microsd">SD 卡</string>
+ <string name="usbotg">外置 U 盤</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted 存儲</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">溫度:%tw_cpu_temp% &#xB0;C</string>
+ <string name="battery_pct">電量:%tw_battery%</string>
+ <string name="sort_by_name">按名稱排序</string>
+ <string name="sort_by_date">按日期排序</string>
+ <string name="sort_by_size">按大小排序</string>
+ <string name="sort_by_name_only">名稱</string>
+ <string name="sort_by_date_only">日期</string>
+ <string name="sort_by_size_only">大小</string>
+ <string name="tab_general">常規</string>
+ <string name="tab_options">選項</string>
+ <string name="tab_backup">備份</string>
+ <string name="tab_time_zone">時區</string>
+ <string name="tab_screen">螢幕</string>
+ <string name="tab_vibration">振動</string>
+ <string name="tab_language">語言</string>
+
+ <string name="install_btn">安裝</string>
+ <string name="wipe_btn">清除</string>
+ <string name="backup_btn">備份</string>
+ <string name="restore_btn">恢復</string>
+ <string name="mount_btn">掛載</string>
+ <string name="settings_btn">設置</string>
+ <string name="advanced_btn">高級</string>
+ <string name="reboot_btn">重啟</string>
+ <string name="files_btn">檔案</string>
+ <string name="copy_log_btn">導出日誌</string>
+ <string name="select_type_hdr">選擇類型</string>
+ <string name="install_zip_hdr">安裝 Zip 刷機包</string>
+ <string name="install_zip_btn">安裝刷機包</string>
+ <string name="install_image_hdr">刷入 Image 鏡像</string>
+ <string name="install_image_btn">刷入鏡像</string>
+ <string name="install_select_file_hdr">選擇檔案</string>
+ <string name="file_selector_folders_hdr">目錄</string>
+ <string name="select_file_from_storage">從 %tw_storage_display_name% (%tw_storage_free_size% MB) 中選擇檔案</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">安裝</string>
+ <string name="select_storage_hdr">存儲位置</string>
+ <string name="select_storage_btn">存儲位置</string>
+ <string name="queue_hdr">佇列</string>
+ <string name="zip_queue_count">已選 %tw_zip_queue_count% 個檔案(最多 10 個)</string>
+ <string name="zip_queue_count_s">已選 %tw_zip_queue_count% 個,最多 10 個:</string>
+ <string name="zip_warn1">此操作可能會刷入不相容的固件,</string>
+ <string name="zip_warn2">致使您的設備變磚。</string>
+ <string name="zip_back_cancel">按返回按鈕取消添加此刷機包。</string>
+ <string name="zip_back_clear">按返回按鈕清除刷機包刷入佇列。</string>
+ <string name="folder">目錄:</string>
+ <string name="file">檔案:</string>
+ <string name="zip_sig_chk">Zip 刷機包簽名校驗</string>
+ <string name="inject_twrp_chk">安裝完成後注入 TWRP</string>
+ <string name="install_reboot_chk">安裝完成後重啟</string>
+ <string name="options_hdr">選項</string>
+ <string name="confirm_flash_hdr">確認刷入</string>
+ <string name="zip_queue">佇列:</string>
+ <string name="options">選項:</string>
+ <string name="swipe_confirm"> 確認</string>
+ <string name="zip_add_btn">添加更多刷機包</string>
+ <string name="zip_clear_btn">清除刷機佇列</string>
+ <string name="install_zip_count_hdr">正在刷入第 %tw_zip_index% 個,共 %tw_zip_queue_count% 個</string>
+ <string name="installing_zip_xml">正在安裝:%tw_file%</string>
+ <string name="failed">失敗</string>
+ <string name="successful">成功</string>
+ <string name="install_failed">安裝失敗</string>
+ <string name="install_successful">安裝成功</string>
+ <string name="wipe_cache_dalvik_btn">清除 Cache/Dalvik</string>
+ <string name="reboot_system_btn">重啟系統</string>
+ <string name="install_sel_target">選擇目標分區</string>
+ <string name="flash_image_select">選擇要刷入鏡像的分區:</string>
+ <string name="target_partition">目標分區:</string>
+ <string name="flashing_image">正在刷入鏡像…</string>
+ <string name="image_flashed">鏡像已刷入。</string>
+ <string name="wipe_cache_dalvik_confirm">是否清除 Cache 和 Dalvik?</string>
+ <string name="wiping_cache_dalvik">正在清除 Cache 和 Dalvik…</string>
+ <string name="wipe_cache_dalvik_complete">Cache 和 Dalvik 清除完成</string>
+ <string name="swipe_wipe">滑動按鈕確認清除</string>
+ <string name="swipe_wipe_s"> 清除</string>
+ <string name="no_os1">沒有安裝任何系統!</string>
+ <string name="no_osrb">您確定要重啟?</string>
+ <string name="no_ospo">您確定要關機?</string>
+ <string name="rebooting">正在重啟…</string>
+ <string name="swipe_reboot">滑動按鈕確認重啟</string>
+ <string name="swipe_reboot_s"> 重啟</string>
+ <string name="reboot_install_app_hdr">安裝 TWRP 應用?</string>
+ <string name="reboot_install_app1">您希望安裝官方 TWRP 應用嗎?</string>
+ <string name="reboot_install_app2">該應用可幫您檢查 TWRP 的最新版本。</string>
+ <string name="reboot_install_app_prompt_install">如果 TWRP 應用未安裝時提示我</string>
+ <string name="reboot_install_app_system">安裝為系統應用</string>
+ <string name="reboot_installing_app">正在安裝應用…</string>
+ <string name="swipe_to_install_app">滑動按鈕確認安裝</string>
+ <string name="swipe_flash">滑動按鈕確認刷入</string>
+ <string name="confirm_action">確認操作</string>
+ <string name="back_cancel">按返回按鈕取消。</string>
+ <string name="cancel_btn">取消</string>
+ <string name="wipe_hdr">清除</string>
+ <string name="factory_reset_hdr">恢復出廠設置(雙清)</string>
+ <string name="factory_reset_btn">恢復出廠</string>
+ <string name="factory_reset1">這將會清空 Data、Cache 分區和 Dalvik 緩存</string>
+ <string name="factory_reset2">(不會清除內置存儲/sdcard)</string>
+ <string name="factory_reset3">在大多數情況下,您只需要</string>
+ <string name="factory_reset4">執行此操作即可。</string>
+ <string name="factory_resetting">正在恢復出廠設置…</string>
+ <string name="advanced_wipe_hdr">高級清除選項</string>
+ <string name="advanced_wipe_btn">高級清除</string>
+ <string name="wipe_enc_confirm">是否清除 Data 分區加密?</string>
+ <string name="formatting_data">正在格式化 Data 分區…</string>
+ <string name="swipe_format_data">滑動按鈕確認格式化</string>
+ <string name="swipe_format_data_s"> 格式化 Data 分區</string>
+ <string name="factory_reset_complete">恢復出廠完成</string>
+ <string name="sel_part_hdr">選擇分區</string>
+ <string name="wipe_sel_confirm">是否清除所選的分區?</string>
+ <string name="wiping_part">正在清除分區…</string>
+ <string name="wipe_complete">清除完成</string>
+ <string name="sel_part_wipe">選擇要清除的分區:</string>
+ <string name="invalid_part_sel">無效的分區</string>
+ <string name="format_data_hdr">格式化 Data 分區</string>
+ <string name="format_data_btn">格式化 Data 分區</string>
+ <string name="format_data_ptr1">格式化 Data 分區將會清空您安裝的所有</string>
+ <string name="format_data_ptr2">軟體、備份、图片、媒體,</string>
+ <string name="format_data_ptr3">以及對內置存儲所做的加密等。</string>
+ <string name="format_data_adopted">也包括 Adopted 存儲</string>
+ <string name="format_data_lcp1">格式化 Data 分區將會清空您安裝的所有軟體、備份、圖片、媒體,</string>
+ <string name="format_data_lcp2">以及對內置存儲所做的加密等。</string>
+ <string name="format_data_wtc1">格式化 Data 分區會清除您的所有軟體</string>
+ <string name="format_data_wtc2">備份和媒體數據,無法撤銷。</string>
+ <string name="format_data_undo">執行此操作後將無法恢復。</string>
+ <string name="format_data_complete">格式化 Data 分區完成</string>
+ <!-- Translator note: the word "yes" must remain English! -->
+ <string name="yes_continue">輸入 yes 繼續,按返回按鈕取消。</string>
+ <string name="part_opt_hdr">分區名:%tw_partition_name%</string>
+ <string name="sel_act_hdr">選擇操作</string>
+ <string name="file_sys_opt">檔案系統選項</string>
+ <string name="partition">分區:%tw_partition_name%</string>
+ <string name="part_mount_point">掛載位置:%tw_partition_mount_point%</string>
+ <string name="part_curr_fs">檔案系統:%tw_partition_file_system%</string>
+ <string name="part_present_yes">當前:是</string>
+ <string name="part_present_no">當前:否</string>
+ <string name="part_removable_yes">可移除:是</string>
+ <string name="part_removable_no">可移除:否</string>
+ <string name="part_size">大小:%tw_partition_size%MB</string>
+ <string name="part_used">已用:%tw_partition_used%MB</string>
+ <string name="part_free">空閒:%tw_partition_free%MB</string>
+ <string name="part_backup_size">備份大小:%tw_partition_backup_size%MB</string>
+ <string name="resize_btn">調整檔案系統</string>
+ <string name="resize_btn_s">調整</string>
+ <string name="resize_confirm">是否調整 %tw_partition_name%?</string>
+ <string name="resizing">正在調整…</string>
+ <string name="resize_complete">調整完成</string>
+ <string name="swipe_resize">滑動按鈕確認調整</string>
+ <string name="swipe_resize_s"> 調整</string>
+ <string name="repair_btn">修復檔案系統</string>
+ <string name="repair_btn_s">修復</string>
+ <string name="repair_confirm">是否修復 %tw_partition_name%?</string>
+ <string name="repairing">正在修復…</string>
+ <string name="repair_complete">修復完成</string>
+ <string name="swipe_repair">滑動按鈕確認修復</string>
+ <string name="swipe_repair_s"> 修復</string>
+ <string name="change_fs_btn">更改檔案系統</string>
+ <string name="change_fs_btn_s">更改</string>
+ <string name="change_fs_for_hdr">要更改的分區:%tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">分區:%tw_partition_name%&gt;選擇檔案系統</string>
+ <string name="change_fs_warn1">一些固件或內核可能不支持</string>
+ <string name="change_fs_warn2">某些檔案系統,請謹慎!</string>
+ <string name="change_fs_confirm">是否更改 %tw_partition_name% 為:</string>
+ <string name="formatting">正在格式化…</string>
+ <string name="format_complete">格式化完成</string>
+ <string name="swipe_change_fs">滑動按鈕確認更改</string>
+ <string name="swipe_change_s"> 更改</string>
+ <string name="back_btn">返回</string>
+ <string name="wipe_enc_btn">清除加密</string>
+ <string name="swipe_factory_reset">滑動按鈕確認恢復出廠</string>
+ <string name="repair_change_btn">修復或更改檔案系統</string>
+ <string name="storage_hdr">存儲位置:%tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">備份</string>
+ <string name="backup_confirm_hdr">確認備份</string>
+ <string name="encryption_tab">加密</string>
+ <string name="encryption">加密:</string>
+ <string name="name">名稱:</string>
+ <string name="sel_part_backup">選擇要備份的分區:</string>
+ <string name="storage">儲存位置:</string>
+ <string name="enc_disabled">已禁用 - 設置密碼以啟用</string>
+ <string name="enc_enabled">已啟用</string>
+ <string name="enable_backup_comp_chk">啟用壓縮</string>
+ <string name="skip_md5_backup_chk">備份時跳過生成 MD5</string>
+ <string name="disable_backup_space_chk">禁用剩餘空間檢查</string>
+ <string name="current_boot_slot">當前分區:%tw_active_slot%</string>
+ <string name="boot_slot_a">分區 A</string>
+ <string name="boot_slot_b">分區 B</string>
+ <string name="changing_boot_slot">更改啟動分區</string>
+ <string name="changing_boot_slot_complete">更改啟動分區完成</string>
+ <string name="refresh_sizes_btn">刷新大小</string>
+ <string name="swipe_backup">滑動按鈕確認備份</string>
+ <string name="append_date_btn">附加日期</string>
+ <string name="backup_name_exists">使用該名稱的備份已經存在!</string>
+ <string name="encrypt_backup">是否加密備份?</string>
+ <string name="enter_pass">請輸入密碼:</string>
+ <string name="enter_pass2">請再輸入一遍:</string>
+ <string name="pass_not_match">密碼不匹配!</string>
+ <string name="partitions">分區:</string>
+ <string name="disabled">已禁用</string>
+ <string name="enabled">已啟用</string>
+ <string name="backup_name_hdr">設置備份名稱</string>
+ <string name="progress">進度:</string>
+ <string name="backup_complete">備份完成</string>
+ <string name="restore_hdr">恢復</string>
+ <string name="sel_backup_hdr">選擇備份</string>
+ <string name="restore_sel_store_hdr">從 %tw_storage_display_name% (%tw_storage_free_size% MB) 中選擇備份</string>
+ <string name="restore_sel_pack_fs">選擇要恢復的備份包:</string>
+ <string name="restore_enc_backup_hdr">備份已被加密</string>
+ <string name="restore_dec_fail">密碼錯誤,請重試</string>
+ <string name="del_backup_btn">刪除備份</string>
+ <string name="del_backup_confirm">是否刪除備份:</string>
+ <string name="del_backup_confirm2">此操作無法恢復!</string>
+ <string name="deleting_backup">正在刪除備份…</string>
+ <string name="backup_deleted">備份刪除完成</string>
+ <string name="swipe_delete">滑動按鈕確認刪除</string>
+ <string name="swipe_delete_s"> 刪除</string>
+ <string name="restore_try_decrypt">加密的備份 - 嘗試解密</string>
+ <string name="restore_try_decrypt_s">正在嘗試解密</string>
+ <string name="restore_backup_date">備份於 %tw_restore_file_date%</string>
+ <string name="restore_sel_part">選擇要恢復的分區:</string>
+ <string name="restore_enable_md5_chk">啟用 MD5 校驗備份檔案</string>
+ <string name="restore_complete">恢復完成</string>
+ <string name="swipe_restore">滑動按鈕確認恢復</string>
+ <string name="swipe_restore_s"> 恢復</string>
+ <string name="rename_backup_hdr">重命名備份</string>
+ <string name="rename_backup_confirm">是否重命名備份檔案?</string>
+ <string name="rename_backup_confirm2">此操作無法恢復!</string>
+ <string name="renaming_backup">正在重命名…</string>
+ <string name="rename_backup_complete">重命名完成</string>
+ <string name="swipe_to_rename">滑動按鈕確認重命名</string>
+ <string name="swipe_rename"> 重命名</string>
+ <string name="confirm_hdr">確認</string>
+ <string name="mount_hdr">掛載</string>
+ <string name="mount_sel_part">選擇要掛載的分區:</string>
+ <string name="mount_sys_ro_chk">掛載 System 分區為只讀</string>
+ <string name="mount_sys_ro_s_chk">掛載 System 為只讀</string>
+ <string name="decrypt_data_btn">解密 Data 分區</string>
+ <string name="disable_mtp_btn">啟用 MTP 模式</string>
+ <string name="enable_mtp_btn">停用 MTP 模式</string>
+ <string name="mount_usb_storage_btn">掛載 USB 存儲</string>
+ <string name="usb_storage_hdr">USB 存儲</string>
+ <string name="usb_stor_mnt1">已掛載 USB 存儲</string>
+ <string name="usb_stor_mnt2">從您的電腦卸載之前</string>
+ <string name="usb_stor_mnt3">一定要安全地移除設備!</string>
+ <string name="unmount_btn">卸載</string>
+ <string name="rb_system_btn">系統</string>
+ <string name="rb_poweroff_btn">關機</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">正在關機…</string>
+ <string name="swipe_power_off">滑動按鈕確認關機</string>
+ <string name="swipe_power_off_s">關機</string>
+ <string name="sys_ro_hdr">未修改的 System 分區</string>
+ <string name="sys_ro_keep">是否保持系統分區為只讀?</string>
+ <string name="sys_rop1">TWRP 可以保持系統分區未修改狀態</string>
+ <string name="sys_rop2">使您更容易獲得官方的更新。</string>
+ <string name="sys_rop3">TWRP 將無法禁止原廠固件可能</string>
+ <string name="sys_rop4">替換 TWRP 並且不能 Root 您的設備。</string>
+ <string name="sys_rop5">安裝刷機包或者通過 adb 操作依然可以</string>
+ <string name="sys_rop6">修改系統分區。</string>
+ <string name="sys_rol1">TWRP 可以保持系統分區為未修改狀態,使您更容易獲得官方的更新。</string>
+ <string name="sys_rol2">TWRP 將無法禁止原廠固件替換 TWRP,並且不能 Root 您的設備。</string>
+ <string name="sys_rol3">安裝刷機包或者通過 adb 操作依然可以修改系統分區。</string>
+ <string name="sys_ro_never_show_chk">下次啟動時不再顯示此介面</string>
+ <string name="sys_ro_keep_ro_btn">保持只讀</string>
+ <string name="swipe_allow_mod">滑動按鈕允許修改</string>
+ <string name="swipe_allow_mod_s">允許修改</string>
+ <string name="settings_hdr">設置</string>
+ <string name="settings_gen_hdr">常規</string>
+ <string name="settings_gen_s_hdr">常規</string>
+ <string name="settings_gen_btn">常規</string>
+ <string name="use_rmrf_chk">使用 rm -rf 命令代替格式化</string>
+ <string name="use24clock_chk">使用 24 小時制</string>
+ <string name="rev_navbar_chk">反轉底部按鈕佈局</string>
+ <string name="simact_chk">為測試主題使用模擬操作</string>
+ <string name="simfail_chk">模擬失敗操作</string>
+ <string name="ctr_navbar_rdo">導航欄按鈕居中</string>
+ <string name="lft_navbar_rdo">導航欄按鈕左對齊</string>
+ <string name="rht_navbar_rdo">導航欄按鈕右對齊</string>
+ <string name="restore_defaults_btn">恢復默認設置</string>
+ <string name="settings_tz_btn">時區</string>
+ <string name="settings_screen_btn">螢幕</string>
+ <string name="settings_screen_bright_btn">螢幕亮度</string>
+ <string name="settings_vibration_btn">振動</string>
+ <string name="settings_language_btn">語言</string>
+ <string name="time_zone_hdr">時區</string>
+ <string name="sel_tz_list">選擇時區:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) 美屬薩摩亞、中途島</string>
+ <string name="utcm10">(UTC -10) 夏威夷</string>
+ <string name="utcm9">(UTC -9) 阿拉斯加</string>
+ <string name="utcm8">(UTC -8) 太平洋標準時間</string>
+ <string name="utcm7">(UTC -7) 北美山區標準時間</string>
+ <string name="utcm6">(UTC -6) 北美中部標準時間</string>
+ <string name="utcm5">(UTC -5) 北美東部標準時間</string>
+ <string name="utcm4">(UTC -4) 大西洋標準時間</string>
+ <string name="utcm3">(UTC -3) 巴西、阿根廷(布宜諾斯)</string>
+ <string name="utcm2">(UTC -2) 大西洋中部</string>
+ <string name="utcm1">(UTC -1) 葡萄牙(亞速爾群島),佛得角</string>
+ <string name="utc0">(UTC 0) 倫敦、都柏林、里斯本</string>
+ <string name="utcp1">(UTC +1) 柏林、布魯塞爾、巴黎</string>
+ <string name="utcp2">(UTC +2) 雅典、伊斯坦布爾、南非</string>
+ <string name="utcp3">(UTC +3) 莫斯科、巴格達</string>
+ <string name="utcp4">(UTC +4) 阿布扎比、第比利斯、馬斯喀特</string>
+ <string name="utcp5">(UTC +5) 葉卡捷琳堡、伊斯蘭堡</string>
+ <string name="utcp6">(UTC +6) 阿拉木圖、達卡、可倫坡</string>
+ <string name="utcp7">(UTC +7) 曼谷、河內、雅加達</string>
+ <string name="utcp8">(UTC +8) 北京、新加坡、香港</string>
+ <string name="utcp9">(UTC +9) 東京、首爾、雅庫茨克</string>
+ <string name="utcp10">(UTC +10) 澳大利亞東部、關島</string>
+ <string name="utcp11">(UTC +11) 符拉迪沃斯托克、所羅門群島</string>
+ <string name="utcp12">(UTC +12) 奧克蘭、惠靈頓、斐濟</string>
+ <string name="sel_tz_offset">時間偏差(通常為 0):%tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">無</string>
+ <string name="tz_offset_0">0 分鐘</string>
+ <string name="tz_offset_15">15 分鐘</string>
+ <string name="tz_offset_30">30 分鐘</string>
+ <string name="tz_offset_45">45 分鐘</string>
+ <string name="use_dst_chk">使用夏令時 (DST)</string>
+ <string name="curr_tz">當前時區:%tw_time_zone%</string>
+ <string name="curr_tz_s">當前時區:</string>
+ <string name="set_tz_btn">設置時區</string>
+ <string name="settings_screen_hdr">螢幕</string>
+ <string name="settings_screen_timeout_hdr">螢幕超時</string>
+ <string name="enable_timeout_chk">啟用螢幕超時</string>
+ <string name="screen_to_slider">螢幕超時時間(秒):</string>
+ <string name="screen_to_slider_s">螢幕超時(0=禁用):%tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">螢幕超時設置不可用</string>
+ <string name="screen_bright_slider">螢幕亮度:%tw_brightness_pct%%</string>
+ <string name="screen_bright_na">螢幕亮度設置不可用</string>
+ <string name="vibration_hdr">振動</string>
+ <string name="button_vibration_hdr">按鈕振動</string>
+ <string name="kb_vibration_hdr">鍵盤振動</string>
+ <string name="act_vibration_hdr">操作振動</string>
+ <string name="button_vibration">按鈕振動強度:</string>
+ <string name="kb_vibration">鍵盤振動強度:</string>
+ <string name="act_vibration">操作振動強度:</string>
+ <string name="select_language">選擇語言:</string>
+ <string name="sel_lang_btn">選擇語言</string>
+ <string name="set_language_btn">設置語言</string>
+ <string name="advanced_hdr">高級選項</string>
+ <string name="copy_log_confirm">是否導出日誌到內置存儲?</string>
+ <string name="copying_log" version="2">正在複製…</string>
+ <string name="copy_log_complete" version="2">日誌導出完成</string>
+ <string name="fix_context_btn">修復 Context</string>
+ <string name="part_sd_btn">分區 SD 卡</string>
+ <string name="part_sd_s_btn">SD 卡</string>
+ <string name="file_manager_btn">檔案管理</string>
+ <string name="language_hdr">語言</string>
+ <string name="terminal_btn">終端命令</string>
+ <string name="reload_theme_btn">重載主題</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">注入 TWRP</string>
+ <string name="inject_twrp_confirm">是否重新注入 TWRP?</string>
+ <string name="injecting_twrp">正在重新注入 TWRP…</string>
+ <string name="inject_twrp_complete">TWRP 注入完成</string>
+ <string name="swipe_to_confirm">滑動按鈕確認</string>
+ <string name="part_sd_hdr">SD 卡分區</string>
+ <string name="invalid_partsd_sel">您必須選擇一個可移動設備</string>
+ <string name="part_sd_lose">您將會丟失 SD 卡上的所有檔案!</string>
+ <string name="part_sd_undo">此操作無法恢復!</string>
+ <string name="part_sd_ext_sz">EXT 大小:</string>
+ <string name="part_sd_swap_sz">Swap 大小:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">檔案系統:</string>
+ <string name="swipe_part_sd">滑動按鈕確認分區</string>
+ <string name="swipe_part_sd_s">分區</string>
+ <string name="partitioning_sd">正在對 SD 卡分區…</string>
+ <string name="partitioning_sd2">這將需要幾分鐘的時間。</string>
+ <string name="part_sd_complete">分區完成</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">恢復原版 Boot 鏡像</string>
+ <string name="dumlock_restore_confirm">是否恢復原版 Boot 鏡像?</string>
+ <string name="dumlock_restoring">正在恢復原版 Boot 鏡像…</string>
+ <string name="dumlock_restore_complete">恢復原版 Boot 鏡像完成。</string>
+ <string name="dumlock_reflash_btn">重新刷入 Recovery</string>
+ <string name="dumlock_reflash_confirm">是否重新刷入 Recovery 至 Boot 分區?</string>
+ <string name="dumlock_reflashing">正在刷入 Recovery 至 Boot 分區…</string>
+ <string name="dumlock_reflash_complete">Recovery 刷入完成</string>
+ <string name="dumlock_install_btn">安裝 HTC Dumlock</string>
+ <string name="dumlock_install_confirm">是否安裝 HTC Dumlock 檔案到系統中?</string>
+ <string name="dumlock_installing">正在安裝 HTC Dumlock…</string>
+ <string name="dumlock_install_complete">HTC Dumlock 安裝完成</string>
+ <string name="swipe_to_unlock">滑動按鈕解鎖</string>
+ <string name="swipe_unlock"> 解鎖</string>
+ <string name="fm_hdr">檔案管理</string>
+ <string name="fm_sel_file">選擇檔案或檔案夾</string>
+ <string name="fm_type_folder">檔案夾</string>
+ <string name="fm_type_file">檔案</string>
+ <string name="fm_choose_act">選擇操作</string>
+ <string name="fm_selected">已選擇:%tw_fm_type%</string>
+ <string name="fm_copy_btn">複製</string>
+ <string name="fm_copy_file_btn">複製檔案</string>
+ <string name="fm_copy_folder_btn">複製檔案夾</string>
+ <string name="fm_copying">正在複製</string>
+ <string name="fm_move_btn">移動</string>
+ <string name="fm_moving">正在移動</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">刪除</string>
+ <string name="fm_deleting">正在刪除</string>
+ <string name="fm_rename_btn">重命名</string>
+ <string name="fm_rename_file_btn">重命名檔案</string>
+ <string name="fm_rename_folder_btn">重命名檔案夾</string>
+ <string name="fm_renaming">正在重命名</string>
+ <string name="fm_sel_dest">選擇目標目錄</string>
+ <string name="fm_sel_curr_folder">選擇當前目錄</string>
+ <string name="fm_rename_hdr">重命名</string>
+ <string name="fm_set_perms_hdr">設置許可權</string>
+ <string name="fm_perms">許可權:</string>
+ <string name="fm_complete">操作完成</string>
+ <string name="decrypt_data_hdr">解密 Data 分區</string>
+ <string name="decrypt_data_enter_pass">請輸入密碼。</string>
+ <string name="decrypt_data_failed">密碼錯誤,請重試!</string>
+ <string name="decrypt_data_failed_pattern">圖案錯誤,請重試!</string>
+ <string name="decrypt_data_enter_pattern">繪製解鎖圖案</string>
+ <string name="decrypt_data_trying">正在嘗試解密</string>
+ <string name="term_hdr">終端命令</string>
+ <string name="term_s_hdr">終端</string>
+ <string name="term_kill_btn">終止</string>
+ <string name="term_sel_folder_hdr">選擇運行目錄</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">清除 Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">清除 Cache</string>
+ <string name="swipe_to_sideload">滑動按鈕開始 Sideload</string>
+ <string name="swipe_sideload"> 開始</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">使用方式:adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload 完成</string>
+ <string name="fix_contexts_hdr">修復 Context</string>
+ <string name="fix_contexts_note1">注意:很少情況下需要修復 Context。</string>
+ <string name="fix_contexts_note2">修復 SELinux Context 可能會導致</string>
+ <string name="fix_contexts_note3">您的設備無法正常啓動。</string>
+ <string name="swipe_to_fix_contexts">滑動按鈕確認修復</string>
+ <string name="swipe_fix_contexts"> 修復 Context</string>
+ <string name="fixing_contexts">正在修復 Context…</string>
+ <string name="fix_contexts_complete">修復 Context 完成</string>
+ <string name="reboot_hdr">重啟選項</string>
+ <string name="su_hdr">SuperSU 檢測</string>
+ <string name="su_note1">系統目前沒有 Root。</string>
+ <string name="su_note2">是否現在安裝 SuperSU?</string>
+ <string name="su_note3">這將會 Root 您的設備。</string>
+ <string name="su_cancel">不,以後再說</string>
+ <string name="swipe_su_to_install">滑動按鈕確認安裝</string>
+ <string name="swipe_su_install"> 安裝</string>
+ <string name="su_installing">正在安裝 SuperSU</string>
+ <string name="sel_storage_list">選擇存儲位置</string>
+ <string name="ok_btn">確定</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">內核不支持讀取 SELinux Context。</string>
+ <string name="full_selinux">完整 SELinux 支持。</string>
+ <string name="no_selinux">無 SELinux 支持(無 libselinux)。</string>
+ <string name="mtp_enabled">MTP 已啟用</string>
+ <string name="mtp_crash">MTP 已崩潰。啟動時不再加載 MTP。</string>
+ <string name="decrypt_success">已使用默認密碼解密成功。</string>
+ <string name="unable_to_decrypt">無法使用默認密碼來解密,您可能需要格式化 Data 分區。</string>
+ <string name="generating_md51">正在生成 MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * 正在生成 MD5…</string>
+ <string name="md5_created"> * MD5 已生成。</string>
+ <string name="md5_error"> * MD5 錯誤!</string>
+ <string name="md5_compute_error"> * 計算 MD5 錯誤。</string>
+ <string name="current_date">(Current Date)</string>
+ <string name="auto_generate">(Auto Generate)</string>
+ <string name="unable_to_locate_partition">未找到 '{1}' 分區。</string>
+ <string name="no_partition_selected">未選擇備份分區。</string>
+ <string name="total_partitions_backup"> * 備份分區總數:{1}</string>
+ <string name="total_backup_size"> * 備份數據總計:{1}MB</string>
+ <string name="available_space"> * 可用空間:{1}MB</string>
+ <string name="unable_locate_storage">未找到存儲設備。</string>
+ <string name="no_space">記憶體上沒有足夠的空間。</string>
+ <string name="backup_started">[已開始備份]</string>
+ <string name="backup_folder"> * 備份檔案夾:{1}</string>
+ <string name="fail_backup_folder">建立備份檔案夾失敗。</string>
+ <string name="avg_backup_fs">檔案平均備份速度:{1}MB/秒</string>
+ <string name="avg_backup_img">鏡像平均備份速度:{1}MB/秒</string>
+ <string name="total_backed_size">[總計備份 {1}MB]</string>
+ <string name="backup_completed">[備份已完成,耗時 {1} 秒]</string>
+ <string name="restore_started">[已開始恢復]</string>
+ <string name="restore_folder">恢復檔案夾:'{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restore_part_done">[{1} 恢復完成({2} 秒)]</string>
+ <string name="verifying_md5">正在校驗 MD5</string>
+ <string name="skip_md5">基於用戶設置,已跳過 MD5 檢查。</string>
+ <string name="calc_restore">正在計算恢復詳情…</string>
+ <string name="restore_read_only">無法恢復 {1} -- 已掛載為只讀。</string>
+ <string name="restore_unable_locate">未找到 '{1}' 分區。</string>
+ <string name="no_part_restore">未選擇要恢復的分區。</string>
+ <string name="restore_part_count">正在恢復 {1} 個分區…</string>
+ <string name="total_restore_size">恢復檔案總計 {1}MB</string>
+ <string name="updating_system_details">更新系統詳細資訊</string>
+ <string name="restore_completed">[恢復完成,耗時 {1} 秒]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">打開出錯:'{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">無法通過備份名稱來查找分區:'{1}'</string>
+ <string name="unable_find_part_path">找不到分區路徑 '{1}'</string>
+ <string name="update_part_details">正在更新分區詳情…</string>
+ <string name="update_part_details_done">…完成</string>
+ <string name="wiping_dalvik">正在清除 Dalvik Cache 目錄…</string>
+ <string name="cleaned">已清除:{1}…</string>
+ <string name="dalvik_done">-- Dalvik Cache 清除完成!</string>
+ <string name="no_andsec">未發現 android secure 分區。</string>
+ <string name="unable_to_locate">未找到 {1}。</string>
+ <string name="wiping_datamedia">清除內置存儲 -- /data/media…</string>
+ <string name="unable_to_mount">無法掛載 {1}</string>
+ <string name="unable_to_mount_internal">無法掛載內置存儲</string>
+ <string name="unable_to_mount_storage">無法掛載存儲</string>
+ <string name="fail_decrypt">解密數據失敗。</string>
+ <string name="no_crypto_support">此版本不支持加密。</string>
+ <string name="decrypt_success_dev">Data 分區成功解密,新增塊設備:'{1}'</string>
+ <string name="decrypt_success_nodev">Data 分區已成功解密</string>
+ <string name="done">完成。</string>
+ <string name="start_partition_sd">正在給 SD 卡分區…</string>
+ <string name="partition_sd_locate">未找到需要分區的設備。</string>
+ <string name="ext_swap_size">EXT+Swap 大小超過 SD 卡容量。</string>
+ <string name="remove_part_table">正在刪除分區表…</string>
+ <string name="unable_rm_part">無法刪除分區表。</string>
+ <string name="create_part">正在建立 {1} 分區…</string>
+ <string name="unable_to_create_part">無法建立 {1} 分區。</string>
+ <string name="format_sdext_as">正在將 sd-ext 格式化為 {1}…</string>
+ <string name="part_complete">分區完成。</string>
+ <string name="unable_to_open">無法打開 '{1}'。</string>
+ <string name="mtp_already_enabled">MTP 已經啟用</string>
+ <string name="mtp_fail">啟用 MTP 失敗</string>
+ <string name="no_mtp">不支持 MTP</string>
+ <string name="image_flash_start">[開始刷入鏡像]</string>
+ <string name="img_to_flash">刷入鏡像:'{1}'</string>
+ <string name="flash_unable_locate">未找到 '{1}' 分區。</string>
+ <string name="no_part_flash">未選擇刷入分區。</string>
+ <string name="too_many_flash">選擇刷入的分區太多。</string>
+ <string name="invalid_flash">指定的刷入分區無效。</string>
+ <string name="flash_done">[鏡像刷入完成]</string>
+ <string name="wiping">正在清除 {1}</string>
+ <string name="repair_not_exist">{1} 不存在!無法修復!</string>
+ <string name="repairing_using">正在使用 {2} 修復 {1}…</string>
+ <string name="unable_repair">無法修復 {1}。</string>
+ <string name="mount_data_footer">無法掛載/data,未找到加密 footer。</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">無法創建 '{1}' 檔案夾 ({2})。</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">掛載 '{1}' 失敗 ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_unmount">卸載 '{1}' 失敗 ({2})</string>
+ <string name="cannot_resize">無法更改 {1} 大小。</string>
+ <string name="repair_resize">在調整大小之前修復 {1}。</string>
+ <string name="unable_resize">無法調整 {1} 大小。</string>
+ <string name="no_md5_found">未找到 '{1}' 的 MD5 校驗檔案。請取消選中“啟用 MD5 校驗備份檔案”複選框。</string>
+ <string name="md5_fail_match">'{1}' MD5 校驗失敗。</string>
+ <string name="md5_matched">MD5 匹配 '{1}'。</string>
+ <string name="fail_decrypt_tar">無法解密 tar 檔案 '{1}'</string>
+ <string name="format_data_msg">您可能需要重啟 Recovery 才能使用/data。</string>
+ <string name="format_data_err">無法格式化並刪除加密。</string>
+ <string name="formatting_using">使用 {2} 格式化 {1}…</string>
+ <string name="unable_to_wipe">無法清除 {1}。</string>
+ <string name="cannot_wipe">無法清除 {1} 分區。</string>
+ <string name="remove_all">移除 '{1}' 下的所有檔案</string>
+ <string name="wiping_data">正在清除 Data 分区,跳過清除/data/media…</string>
+ <string name="backing_up">正在備份 {1}…</string>
+ <string name="backup_storage_warning">備份的 {1} 分區不包含內置存儲上的任何檔案,例如照片或下載的檔案等等。</string>
+ <string name="backing">正在備份</string>
+ <string name="backup_size">'{1}' 的備份檔案大小為 0 位元組。</string>
+ <string name="datamedia_fs_restore">警告:此/data備份檔案系統為 {1}!除非把檔案系統格式設置為 {1} 否則可能無法啟動。</string>
+ <string name="restoring">正在恢復 {1}…</string>
+ <string name="restoring_hdr">正在恢復</string>
+ <string name="recreate_folder_err">無法重新創建 {1} 檔案夾。</string>
+ <string name="img_size_err">鏡像大小大於目標設備</string>
+ <string name="flashing">正在刷入 {1}…</string>
+ <string name="backup_folder">備份檔案夾設置為:'{1}'</string>
+ <string name="locate_backup_err">未找到備份檔案 '{1}'</string>
+ <string name="set_restore_opt">設置恢復選項:'{1}':</string>
+ <string name="md5_check_skip">跳過校驗 MD5 已開啟</string>
+ <string name="ors_encrypt_restore_err">無法使用 OpenRecoveryScript 腳本恢復加密備份。</string>
+ <string name="mounting">正在掛載</string>
+ <string name="unmounting">正在卸載</string>
+ <string name="mounted">'{1}' 已掛載</string>
+ <string name="unmounted">'{1}' 已卸載</string>
+ <string name="setting">設置 '{1}' 為 '{2}'</string>
+ <string name="setting_empty">設置 '{1}' 為空</string>
+ <string name="making_dir1">創建目錄</string>
+ <string name="making_dir2">創建目錄:'{1}'</string>
+ <string name="running_command">運行命令</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">正在開始 ADB sideload…</string>
+ <string name="need_new_adb">您需要 1.0.32 或更高版本的 adb 才可以使用。</string>
+ <string name="no_pwd">未提供密碼。</string>
+ <string name="done_ors">腳本執行完畢</string>
+ <string name="injecttwrp">正在注入 TWRP 到 Boot 鏡像…</string>
+ <string name="zip_err">安裝 Zip 刷機包 '{1}' 時出錯</string>
+ <string name="installing_zip">正在安裝 Zip 刷機包 '{1}'</string>
+ <string name="select_backup_opt">設置備份選項:</string>
+ <string name="compression_on">壓縮選項已開啟</string>
+ <string name="md5_off">MD5 生成已關閉</string>
+ <string name="backup_fail">備份失敗</string>
+ <string name="backup_clean">備份失敗。正在清理備份檔案夾。</string>
+ <string name="running_recovery_commands">運行 Recovery 命令</string>
+ <string name="recovery_commands_complete">Recovery 命令執行完成</string>
+ <string name="running_ors">運行 OpenRecoveryScript 腳本</string>
+ <string name="ors_complete">運行 OpenRecoveryScript 腳本完成</string>
+ <string name="invalid_zip_format">Zip 檔案格式無效!</string>
+ <string name="check_for_md5">正在檢測 MD5…</string>
+ <string name="fail_sysmap">映射檔案 '{1}' 失敗</string>
+ <string name="verify_zip_sig">正在校驗 Zip 刷機包簽名…</string>
+ <string name="verify_zip_fail">刷機包簽名校驗失敗!</string>
+ <string name="verify_zip_done">刷機包簽名校驗成功。</string>
+ <string name="zip_corrupt">刷機包已損壞!</string>
+ <string name="no_md5">跳過 MD5 校驗:未找到 MD5 檔案</string>
+ <string name="md5_fail">MD5 不匹配</string>
+ <string name="md5_match">MD5 校驗成功</string>
+ <string name="pid_signal">{1} 過程結束,標誌:{2}</string>
+ <string name="pid_error">{1} 過程結束,錯誤:{2}</string>
+ <string name="install_dumlock">安裝 HTC Dumlock 到系統…</string>
+ <string name="dumlock_restore">正在恢復原版 Boot…</string>
+ <string name="dumlock_reflash">正在重新刷入 Recovery 到 Boot…</string>
+ <string name="run_script">正在運行 {1} 腳本…</string>
+ <string name="rename_stock">重命名/system 下原版 Recovery 的補丁,避免原廠固件替換 TWRP。</string>
+ <string name="split_backup">分解備份檔案為多個壓縮檔…</string>
+ <string name="backup_error">建立備份失敗。</string>
+ <string name="restore_error">在恢復過程中發生錯誤。</string>
+ <string name="split_thread">拆分線程 ID {1} 到壓縮檔 {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">已完成 %llu 個,共 %llu 個檔案,進度 %i%%</string>
+ <string name="size_progress">已完成 %lluMB,共 %lluMB,進度 %i%%</string>
+ <string name="decrypt_cmd">嘗試通過命令行解密 Data 分區。</string>
+ <string name="base_pkg_err">無法加載基本包。</string>
+ <string name="simulating">正在模擬操作…</string>
+ <string name="backup_cancel">備份已取消。</string>
+ <string name="config_twrp">正在配置 TWRP…</string>
+ <string name="config_twrp_err">此內核無法配置 TWRP。</string>
+ <string name="copy_log">已經導出 Recovery 日誌到 {1}。</string>
+ <string name="max_queue">已達到最大刷機包刷入佇列!</string>
+ <string name="min_queue">已達到最大刷機包刷入佇列!</string>
+ <string name="screenshot_saved">截圖已保存到:{1}</string>
+ <string name="screenshot_err">截圖失敗!</string>
+ <string name="zip_wipe_cache">一個或多個刷機包請求清除 cache -- 正在清除 cache。</string>
+ <string name="and_sec_wipe_err">無法清除 android secure</string>
+ <string name="dalvik_wipe_err">清除 Dalvik 失敗</string>
+ <string name="auto_gen">(Auto Generate)</string>
+ <string name="curr_date">(Current Date)</string>
+ <string name="backup_name_len">備份名稱太長。</string>
+ <string name="backup_name_invalid">備份名稱 '{1}' 中包含無效字元:'{1}'</string>
+ <string name="no_real_sdcard">此設備沒有真實的 SD 卡!正在中止!</string>
+ <string name="cancel_sideload">取消 ADB Sideload…</string>
+ <string name="change_fs_err">更換檔案系統时出錯。</string>
+ <string name="theme_ver_err">自定義主題和 TWRP 版本不匹配,正使用默認主題。</string>
+ <string name="up_a_level">(上級目錄)</string>
+ <string name="install_reboot" version="2">將會在 %tw_sleep% 秒內重啟</string>
+ <string name="adbbackup_error">ADB 備份錯誤。正在退出…"</string>
+ <string name="adbbackup_control_error">無法寫入 adb 控制通道</string>
+ <string name="twrp_adbbu_option">--twrp 選項需啟用 twrp adb backup</string>
+ <string name="partition_not_found">分區列表中未發現路徑:{1}</string>
+ <string name="copy_kernel_log">已導出內核日誌至 {1}</string>
+ <string name="include_kernel_log">包含內核日誌</string>
+ <string name="unable_set_boot_slot">更改 bootloader 啟動分區至 {1} 錯誤</string>
+ </resources>
+</language>
diff --git a/gui/theme/landscape_hdpi/images/back.png b/gui/theme/landscape_hdpi/images/back.png
new file mode 100644
index 000000000..e67a88b40
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/back.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/backspace.png b/gui/theme/landscape_hdpi/images/backspace.png
new file mode 100644
index 000000000..1d78402af
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/backspace.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/backspace_terminal.png b/gui/theme/landscape_hdpi/images/backspace_terminal.png
new file mode 100644
index 000000000..8686f83e1
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/backspace_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/checkbox_false.png b/gui/theme/landscape_hdpi/images/checkbox_false.png
new file mode 100644
index 000000000..5e72143f1
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/checkbox_false.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/checkbox_true.png b/gui/theme/landscape_hdpi/images/checkbox_true.png
new file mode 100644
index 000000000..aacb591c5
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/checkbox_true.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/console.png b/gui/theme/landscape_hdpi/images/console.png
new file mode 100644
index 000000000..861a7a7da
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/console.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/cursor.png b/gui/theme/landscape_hdpi/images/cursor.png
new file mode 100644
index 000000000..3513d065d
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/cursor.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/enter.png b/gui/theme/landscape_hdpi/images/enter.png
new file mode 100644
index 000000000..b7154ca97
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/enter.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/enter_terminal.png b/gui/theme/landscape_hdpi/images/enter_terminal.png
new file mode 100644
index 000000000..0e1bcf1fd
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/enter_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/file.png b/gui/theme/landscape_hdpi/images/file.png
new file mode 100644
index 000000000..f69d35f5d
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/file.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/folder.png b/gui/theme/landscape_hdpi/images/folder.png
new file mode 100644
index 000000000..656d84500
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/folder.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/handle.png b/gui/theme/landscape_hdpi/images/handle.png
new file mode 100644
index 000000000..996426dc3
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/handle.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/home.png b/gui/theme/landscape_hdpi/images/home.png
new file mode 100644
index 000000000..de2eea849
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/home.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate001.png b/gui/theme/landscape_hdpi/images/indeterminate001.png
new file mode 100644
index 000000000..7582e036f
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate001.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate002.png b/gui/theme/landscape_hdpi/images/indeterminate002.png
new file mode 100644
index 000000000..e205c9051
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate002.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate003.png b/gui/theme/landscape_hdpi/images/indeterminate003.png
new file mode 100644
index 000000000..65c3a1319
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate003.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate004.png b/gui/theme/landscape_hdpi/images/indeterminate004.png
new file mode 100644
index 000000000..7aeb1fdb7
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate004.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate005.png b/gui/theme/landscape_hdpi/images/indeterminate005.png
new file mode 100644
index 000000000..58cd2a440
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate005.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate006.png b/gui/theme/landscape_hdpi/images/indeterminate006.png
new file mode 100644
index 000000000..53cedf439
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate006.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate007.png b/gui/theme/landscape_hdpi/images/indeterminate007.png
new file mode 100644
index 000000000..a11e9101b
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate007.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate008.png b/gui/theme/landscape_hdpi/images/indeterminate008.png
new file mode 100644
index 000000000..da5b768cb
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate008.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate009.png b/gui/theme/landscape_hdpi/images/indeterminate009.png
new file mode 100644
index 000000000..302674a93
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate009.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate010.png b/gui/theme/landscape_hdpi/images/indeterminate010.png
new file mode 100644
index 000000000..17b8531a7
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate010.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate011.png b/gui/theme/landscape_hdpi/images/indeterminate011.png
new file mode 100644
index 000000000..1ed053141
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate011.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/indeterminate012.png b/gui/theme/landscape_hdpi/images/indeterminate012.png
new file mode 100644
index 000000000..977da990d
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/indeterminate012.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/kb_arrow_down.png b/gui/theme/landscape_hdpi/images/kb_arrow_down.png
new file mode 100644
index 000000000..65b384686
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/kb_arrow_down.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/kb_arrow_left.png b/gui/theme/landscape_hdpi/images/kb_arrow_left.png
new file mode 100644
index 000000000..a46e519e9
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/kb_arrow_left.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/kb_arrow_right.png b/gui/theme/landscape_hdpi/images/kb_arrow_right.png
new file mode 100644
index 000000000..3c1a59f27
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/kb_arrow_right.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/kb_arrow_up.png b/gui/theme/landscape_hdpi/images/kb_arrow_up.png
new file mode 100644
index 000000000..e5228c3fd
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/kb_arrow_up.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/kb_hide.png b/gui/theme/landscape_hdpi/images/kb_hide.png
new file mode 100644
index 000000000..88974cc86
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/kb_hide.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/kb_show.png b/gui/theme/landscape_hdpi/images/kb_show.png
new file mode 100644
index 000000000..3c09214c9
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/kb_show.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/logo.png b/gui/theme/landscape_hdpi/images/logo.png
new file mode 100644
index 000000000..a8f225451
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/logo.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/main_button.png b/gui/theme/landscape_hdpi/images/main_button.png
new file mode 100644
index 000000000..1b491ae0c
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/main_button.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/main_button_half_width.png b/gui/theme/landscape_hdpi/images/main_button_half_width.png
new file mode 100644
index 000000000..e9a47ce6a
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/main_button_half_width.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/main_button_half_width_low.png b/gui/theme/landscape_hdpi/images/main_button_half_width_low.png
new file mode 100644
index 000000000..cb7e1df37
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/main_button_half_width_low.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/progress_empty.png b/gui/theme/landscape_hdpi/images/progress_empty.png
new file mode 100644
index 000000000..4e35f3df3
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/progress_empty.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/progress_fill.png b/gui/theme/landscape_hdpi/images/progress_fill.png
new file mode 100644
index 000000000..10465982d
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/progress_fill.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/radio_false.png b/gui/theme/landscape_hdpi/images/radio_false.png
new file mode 100644
index 000000000..cc7c270bf
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/radio_false.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/radio_true.png b/gui/theme/landscape_hdpi/images/radio_true.png
new file mode 100644
index 000000000..3e041c3d5
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/radio_true.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/shift.png b/gui/theme/landscape_hdpi/images/shift.png
new file mode 100644
index 000000000..5b3e90823
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/shift.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/shift_fill.png b/gui/theme/landscape_hdpi/images/shift_fill.png
new file mode 100644
index 000000000..5c10629ad
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/shift_fill.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/shift_terminal.png b/gui/theme/landscape_hdpi/images/shift_terminal.png
new file mode 100644
index 000000000..49ebdb337
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/shift_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/shift_terminal_fill.png b/gui/theme/landscape_hdpi/images/shift_terminal_fill.png
new file mode 100644
index 000000000..4f98aaa80
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/shift_terminal_fill.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/slider.png b/gui/theme/landscape_hdpi/images/slider.png
new file mode 100644
index 000000000..2921679d4
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/slider.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/slider_touch.png b/gui/theme/landscape_hdpi/images/slider_touch.png
new file mode 100644
index 000000000..63dd52f87
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/slider_touch.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/slider_used.png b/gui/theme/landscape_hdpi/images/slider_used.png
new file mode 100644
index 000000000..355c580b9
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/slider_used.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/sort_asc.png b/gui/theme/landscape_hdpi/images/sort_asc.png
new file mode 100644
index 000000000..28e0f9d65
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/sort_asc.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/sort_desc.png b/gui/theme/landscape_hdpi/images/sort_desc.png
new file mode 100644
index 000000000..71d8695b7
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/sort_desc.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/sort_empty.png b/gui/theme/landscape_hdpi/images/sort_empty.png
new file mode 100644
index 000000000..bf6e0a5e5
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/sort_empty.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/space.png b/gui/theme/landscape_hdpi/images/space.png
new file mode 100644
index 000000000..dabbfec76
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/space.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/space_terminal.png b/gui/theme/landscape_hdpi/images/space_terminal.png
new file mode 100644
index 000000000..677256377
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/space_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/splashlogo.png b/gui/theme/landscape_hdpi/images/splashlogo.png
new file mode 100644
index 000000000..42f516c95
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/splashlogo.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/splashteamwin.png b/gui/theme/landscape_hdpi/images/splashteamwin.png
new file mode 100644
index 000000000..16a6d5994
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/splashteamwin.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/tab_3.png b/gui/theme/landscape_hdpi/images/tab_3.png
new file mode 100644
index 000000000..25997fc58
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/tab_3.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/tab_4.png b/gui/theme/landscape_hdpi/images/tab_4.png
new file mode 100644
index 000000000..fd2eee415
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/tab_4.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/images/unlock_icon.png b/gui/theme/landscape_hdpi/images/unlock_icon.png
new file mode 100644
index 000000000..5865e931d
--- /dev/null
+++ b/gui/theme/landscape_hdpi/images/unlock_icon.png
Binary files differ
diff --git a/gui/theme/landscape_hdpi/splash.xml b/gui/theme/landscape_hdpi/splash.xml
new file mode 100644
index 000000000..8da2fe6ea
--- /dev/null
+++ b/gui/theme/landscape_hdpi/splash.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="1920" height="1200"/>
+ <author>TeamWin</author>
+ <title>TWRP</title>
+ <description>splash screen</description>
+ <themeversion>2</themeversion>
+ </details>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="52"/>
+ <image name="splashlogo" filename="splashlogo" retainaspect="1"/>
+ <image name="splashteamwin" filename="splashteamwin" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="screen_width" value="1920"/>
+ <variable name="screen_height" value="1200"/>
+ <variable name="background_color" value="#222222"/>
+ <variable name="header_color" value="#555555"/>
+ <variable name="accent_color" value="#0090CA"/>
+ </variables>
+
+ <pages>
+ <page name="splash">
+ <background color="%background_color%"/>
+
+ <fill color="%header_color%">
+ <placement x="0" y="0" w="%screen_width%" h="320"/>
+ </fill>
+
+ <image>
+ <image resource="splashlogo"/>
+ <placement x="960" y="320" placement="4"/>
+ </image>
+
+ <image>
+ <image resource="splashteamwin"/>
+ <placement x="960" y="920" placement="4"/>
+ </image>
+
+ <text color="%header_color%">
+ <font resource="font_l"/>
+ <placement x="960" y="970" placement="5"/>
+ <text>Recovery Project %tw_version%</text>
+ </text>
+ </page>
+ </pages>
+</recovery>
+
diff --git a/gui/theme/landscape_hdpi/ui.xml b/gui/theme/landscape_hdpi/ui.xml
new file mode 100644
index 000000000..34ef530e3
--- /dev/null
+++ b/gui/theme/landscape_hdpi/ui.xml
@@ -0,0 +1,721 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="1920" height="1200"/>
+ <author>TeamWin</author>
+ <title>Backup Naowz</title>
+ <description>Default basic theme</description>
+ <preview>preview.png</preview>
+ <themeversion>2</themeversion>
+ </details>
+
+ <include>
+ <xmlfile name="landscape.xml"/>
+ </include>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="42"/>
+ <font name="font_m" filename="RobotoCondensed-Regular.ttf" size="32"/>
+ <font name="font_s" filename="RobotoCondensed-Regular.ttf" size="28"/>
+ <font name="fixed" filename="DroidSansMono.ttf" size="26"/>
+
+ <font name="keylabel" filename="RobotoCondensed-Regular.ttf" size="50"/>
+ <font name="keylabel-small" filename="RobotoCondensed-Regular.ttf" size="42"/>
+ <font name="keylabel-longpress" filename="RobotoCondensed-Regular.ttf" size="26"/>
+
+ <image name="logo" filename="logo" retainaspect="1"/>
+ <image name="main_button" filename="main_button"/>
+ <image name="main_button_half_width" filename="main_button_half_width"/>
+ <image name="main_button_half_width_low" filename="main_button_half_width_low"/>
+ <image name="tab_3" filename="tab_3"/>
+ <image name="tab_4" filename="tab_4"/>
+ <image name="file" filename="file" retainaspect="1"/>
+ <image name="folder" filename="folder" retainaspect="1"/>
+ <image name="unlock_icon" filename="unlock_icon" retainaspect="1"/>
+ <image name="home" filename="home" retainaspect="1"/>
+ <image name="back" filename="back" retainaspect="1"/>
+ <image name="console" filename="console" retainaspect="1"/>
+ <image name="kb_hide" filename="kb_hide" retainaspect="1"/>
+ <image name="kb_show" filename="kb_show" retainaspect="1"/>
+ <image name="checkbox_false" filename="checkbox_false" retainaspect="1"/>
+ <image name="checkbox_true" filename="checkbox_true" retainaspect="1"/>
+ <image name="radio_false" filename="radio_false" retainaspect="1"/>
+ <image name="radio_true" filename="radio_true" retainaspect="1"/>
+ <image name="sort_asc" filename="sort_asc"/>
+ <image name="sort_desc" filename="sort_desc"/>
+ <image name="sort_empty" filename="sort_empty"/>
+ <animation name="progress" filename="indeterminate"/>
+ <image name="progress_empty" filename="progress_empty"/>
+ <image name="progress_full" filename="progress_fill"/>
+ <image name="slider" filename="slider"/>
+ <image name="slider_used" filename="slider_used"/>
+ <image name="slider_touch" filename="slider_touch"/>
+ <image name="handle" filename="handle"/>
+ <image name="cursor" filename="cursor" retainaspect="1"/>
+
+ <image name="backspace" filename="backspace" retainaspect="1"/>
+ <image name="backspace_terminal" filename="backspace_terminal" retainaspect="1"/>
+ <image name="enter" filename="enter" retainaspect="1"/>
+ <image name="enter_terminal" filename="enter_terminal" retainaspect="1"/>
+ <image name="shift" filename="shift" retainaspect="1"/>
+ <image name="shift_terminal" filename="shift_terminal" retainaspect="1"/>
+ <image name="shift_fill" filename="shift_fill" retainaspect="1"/>
+ <image name="shift_terminal_fill" filename="shift_terminal_fill" retainaspect="1"/>
+ <image name="space" filename="space" retainaspect="1"/>
+ <image name="space_terminal" filename="space_terminal" retainaspect="1"/>
+ <image name="kb_arrow_left" filename="kb_arrow_left" retainaspect="1"/>
+ <image name="kb_arrow_right" filename="kb_arrow_right" retainaspect="1"/>
+ <image name="kb_arrow_up" filename="kb_arrow_up" retainaspect="1"/>
+ <image name="kb_arrow_down" filename="kb_arrow_down" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="tw_samsung_navbar" value="0" persist="1"/>
+ <variable name="tw_navbar_button_position" value="0" persist="1"/>
+
+ <variable name="tw_hide_kb" value="0"/>
+ <variable name="screen_width" value="1920"/>
+ <variable name="screen_height" value="1200"/>
+ <variable name="status_height" value="48"/>
+ <variable name="header_height" value="192"/>
+ <variable name="navbar_height" value="96"/>
+ <variable name="content_width" value="1824"/>
+ <variable name="content_quarter_width" value="1416"/>
+ <variable name="content_half_width" value="888"/>
+ <variable name="content_overlay_width" value="912"/>
+ <variable name="dialog_height" value="528"/>
+ <variable name="dialog_width" value="960"/>
+ <variable name="dialog_content_x" value="528"/>
+ <variable name="back_button_x" value="633"/>
+ <variable name="console_button_x" value="1287"/>
+ <variable name="back_button_x_1" value="120"/>
+ <variable name="home_button_x_1" value="320"/>
+ <variable name="console_button_x_1" value="520"/>
+ <variable name="back_button_x_2" value="1400"/>
+ <variable name="home_button_x_2" value="1600"/>
+ <variable name="console_button_x_2" value="1800"/>
+ <variable name="col1_x_header" value="144"/>
+ <variable name="indent" value="24"/>
+ <variable name="col1_x_left" value="48"/>
+ <variable name="col2_x_left" value="504"/>
+ <variable name="center_x" value="960"/>
+ <variable name="col1_x_right" value="984"/>
+ <variable name="col2_x_right" value="1416"/>
+ <variable name="col_button_right" value="1488"/>
+ <variable name="indent_right" value="1896"/>
+ <variable name="tab_height" value="72"/>
+ <variable name="tab_indicator_height" value="4"/>
+ <variable name="tab4_width" value="480"/>
+ <variable name="tab5_width" value="384"/>
+ <variable name="tab4_col2_x" value="480"/>
+ <variable name="tab4_col4_x" value="1440"/>
+ <variable name="tab5_col2_x" value="384"/>
+ <variable name="tab5_col3_x" value="768"/>
+ <variable name="tab5_col4_x" value="1152"/>
+ <variable name="tab5_col5_x" value="1536"/>
+ <variable name="btn4_col2_x_left" value="282"/>
+ <variable name="btn4_col3_x_left" value="516"/>
+ <variable name="btn4_col4_x_left" value="750"/>
+ <variable name="btn4_col2_x_right" value="1218"/>
+ <variable name="btn4_col3_x_right" value="1452"/>
+ <variable name="btn4_col4_x_right" value="1686"/>
+ <variable name="row1_header_y" value="0"/>
+ <variable name="row2_header_y" value="48"/>
+ <variable name="row3_header_y" value="60"/>
+ <variable name="row4_header_y" value="126"/>
+ <variable name="row1_y" value="192"/>
+ <variable name="row1a_y" value="216"/>
+ <variable name="row2_y" value="240"/>
+ <variable name="row2a_y" value="264"/>
+ <variable name="row_tab_y" value="260"/>
+ <variable name="row2_input_y" value="286"/>
+ <variable name="row3_y" value="288"/>
+ <variable name="row3a_y" value="312"/>
+ <variable name="row3_input_y" value="334"/>
+ <variable name="row4_y" value="336"/>
+ <variable name="row4a_y" value="360"/>
+ <variable name="row4_input_y" value="382"/>
+ <variable name="row5_y" value="384"/>
+ <variable name="row5a_y" value="408"/>
+ <variable name="row6_y" value="432"/>
+ <variable name="row6a_y" value="456"/>
+ <variable name="row7_y" value="480"/>
+ <variable name="row7a_y" value="504"/>
+ <variable name="row8_y" value="528"/>
+ <variable name="row8a_y" value="552"/>
+ <variable name="row9_y" value="576"/>
+ <variable name="row9a_y" value="600"/>
+ <variable name="row10_y" value="624"/>
+ <variable name="row10a_y" value="648"/>
+ <variable name="row11_y" value="672"/>
+ <variable name="row11a_y" value="696"/>
+ <variable name="row12_y" value="720"/>
+ <variable name="row12a_y" value="744"/>
+ <variable name="row13_y" value="768"/>
+ <variable name="row13a_y" value="792"/>
+ <variable name="row14_y" value="816"/>
+ <variable name="row14a_y" value="840"/>
+ <variable name="row15_y" value="864"/>
+ <variable name="row15a_y" value="888"/>
+ <variable name="row16_y" value="912"/>
+ <variable name="row16a_y" value="936"/>
+ <variable name="row17_y" value="960"/>
+ <variable name="row17a_y" value="984"/>
+ <variable name="row18_y" value="1008"/>
+ <variable name="row18a_y" value="1032"/>
+ <variable name="row19_y" value="1056"/>
+ <variable name="row19a_y" value="1080"/>
+ <variable name="row20_y" value="1104"/>
+ <variable name="navbar_y" value="1104"/>
+ <variable name="navbar_btn_y" value="1152"/>
+ <variable name="keyboard_y" value="592"/>
+ <variable name="background_color" value="#1A1A1A"/>
+ <variable name="accent_color" value="#0090CA"/>
+ <variable name="text_color" value="#EEEEEE"/>
+ <variable name="text_button_color" value="#EEEEEE"/>
+ <variable name="text_success_color" value="#76FF03"/>
+ <variable name="text_fail_color" value="#FF0101"/>
+ <variable name="highlight_color" value="#1A1A1A80"/>
+ <variable name="caps_highlight_color" value="#22222280"/>
+ <variable name="transparent" value="#00000000"/>
+ <variable name="semi_transparent" value="#00000099"/>
+ <variable name="warning" value="#F8F8A0"/>
+ <variable name="error" value="#FF0101"/>
+ <variable name="highlight" value="#0090CA"/>
+ <variable name="fileselector_linecolor" value="#555555"/>
+ <variable name="fileselector_highlight_color" value="#555555"/>
+ <variable name="fileselector_separatorheight" value="2"/>
+ <variable name="fileselector_spacing" value="0"/>
+ <variable name="fileselector_install_height" value="840"/>
+ <variable name="fileselector_install_width" value="960"/>
+ <variable name="fileselector_install_folder_width" value="408"/>
+ <variable name="fileselector_filemanager_height" value="840"/>
+ <variable name="partitionlist_spacing" value="0"/>
+ <variable name="partitionlist_storage_height" value="400"/>
+ <variable name="partitionlist_flashimage_height" value="448"/>
+ <variable name="partitionlist_wipe_height" value="600"/>
+ <variable name="partitionlist_mount_height" value="552"/>
+ <variable name="partitionlist_backup_height" value="528"/>
+ <variable name="listbox_timezone_height" value="768"/>
+ <variable name="listbox_settings_height" value="648"/>
+ <variable name="fastscroll_w" value="18"/>
+ <variable name="fastscroll_linew" value="2"/>
+ <variable name="fastscroll_rectw" value="18"/>
+ <variable name="fastscroll_recth" value="96"/>
+ <variable name="slidervalue_lineh" value="3"/>
+ <variable name="slidervalue_padding" value="0"/>
+ <variable name="slidervalue_sliderw" value="72"/>
+ <variable name="slidervalue_sliderh" value="96"/>
+ <variable name="slideout_y" value="96"/>
+ <variable name="slideout_height" value="960"/>
+ <variable name="slideout_bg_height" value="1056"/>
+ <variable name="input_height" value="48"/>
+ <variable name="input_line_width" value="3"/>
+ <variable name="console_height" value="624"/>
+ <variable name="console_terminal_height" value="420"/>
+ <variable name="terminal_s_height" value="520"/>
+ <variable name="terminal_l_height" value="1032"/>
+ <variable name="dialog_button_x" value="1176"/>
+ <variable name="date_button_x" value="552"/>
+ <variable name="progress_x" value="552"/>
+ <variable name="progress_text_x" value="96"/>
+ <variable name="progress_text_y" value="900"/>
+ <variable name="pattern_x" value="180"/>
+ <variable name="pattern_dot_dia" value="32"/>
+ <variable name="pattern_line_w" value="12"/>
+ <variable name="pattern_size" value="648"/>
+ </variables>
+
+ <mousecursor>
+ <placement w="15" h="15"/>
+ <background color="#FFFF00FF" resource="cursor"/>
+ <speed multiplier="2.5"/>
+ </mousecursor>
+
+ <templates>
+ <template name="page">
+ <background color="%background_color%"/>
+
+ <fill color="%accent_color%">
+ <placement x="0" y="0" w="%screen_width%" h="%header_height%"/>
+ </fill>
+
+ <image>
+ <condition var1="tw_busy" var2="1"/>
+ <image resource="logo"/>
+ <placement x="0" y="0"/>
+ </image>
+
+ <button>
+ <condition var1="tw_busy" var2="0"/>
+ <placement x="0" y="0"/>
+ <image resource="logo"/>
+ <action function="key">home</action>
+ </button>
+
+ <fill color="#00000030">
+ <condition var1="tw_simulate_actions" var2="0"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="1"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>%tw_version%</text>
+ </text>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%center_x%" y="%row1_header_y%" placement="5"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <text color="%text_color%">
+ <conditions>
+ <condition var1="tw_no_battery_percent" var2="0"/>
+ <condition var1="tw_battery" op="&gt;" var2="0"/>
+ <condition var1="tw_battery" op="&lt;" var2="101"/>
+ </conditions>
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
+ </text>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <placement x="%home_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <placement x="%home_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </template>
+
+ <template name="progress_bar">
+ <progressbar>
+ <placement x="%progress_x%" y="%row16_y%"/>
+ <resource empty="progress_empty" full="progress_full"/>
+ <data name="ui_progress"/>
+ </progressbar>
+
+ <animation>
+ <placement x="%progress_x%" y="%row16_y%"/>
+ <resource name="progress"/>
+ <speed fps="24" render="2"/>
+ <loop frame="1"/>
+ </animation>
+ </template>
+
+ <template name="sort_options">
+ <image>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <image resource="main_button_half_width_low"/>
+ </image>
+
+ <image>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <image resource="main_button_half_width_low"/>
+ </image>
+
+ <image>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <image resource="main_button_half_width_low"/>
+ </image>
+
+ <button style="sort_asc">
+ <condition var1="tw_gui_sort_order" op="=" var2="1"/>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>{@sort_by_name=Sort by Name}</text>
+ <action function="set">tw_gui_sort_order=-1</action>
+ </button>
+
+ <button style="sort_desc">
+ <condition var1="tw_gui_sort_order" op="=" var2="-1"/>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>{@sort_by_name=Sort by Name}</text>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button style="sort_empty">
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="1"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-1"/>
+ </conditions>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>{@sort_by_name=Sort by Name}</text>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button style="sort_asc">
+ <condition var1="tw_gui_sort_order" op="=" var2="2"/>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>{@sort_by_date=Sort by Date}</text>
+ <action function="set">tw_gui_sort_order=-2</action>
+ </button>
+
+ <button style="sort_desc">
+ <condition var1="tw_gui_sort_order" op="=" var2="-2"/>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>{@sort_by_date=Sort by Date}</text>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button style="sort_empty">
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="2"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-2"/>
+ </conditions>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>{@sort_by_date=Sort by Date}</text>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button style="sort_asc">
+ <condition var1="tw_gui_sort_order" op="=" var2="3"/>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>{@sort_by_size=Sort by Size}</text>
+ <action function="set">tw_gui_sort_order=-3</action>
+ </button>
+
+ <button style="sort_desc">
+ <condition var1="tw_gui_sort_order" op="=" var2="-3"/>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>{@sort_by_size=Sort by Size}</text>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+
+ <button style="sort_empty">
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="3"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-3"/>
+ </conditions>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>{@sort_by_size=Sort by Size}</text>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+ </template>
+
+ <template name="tabs_settings">
+ <button style="tab">
+ <placement x="0" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_general=GENERAL}</text>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col2_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_time_zone=TIME ZONE}</text>
+ <action function="page">settings_timezone</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col3_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_screen=SCREEN}</text>
+ <action function="page">settings_screen</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col4_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_vibration=VIBRATION}</text>
+ <action function="page">settings_vibration</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col5_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_language=LANGUAGE}</text>
+ <action function="page">settings_language</action>
+ </button>
+ </template>
+
+ <template name="console">
+ <console>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%console_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row2_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row15_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="console_terminal">
+ <console>
+ <placement x="%col1_x_left%" y="%row3_header_y%" w="content_width" h="%console_terminal_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="%row3_header_y%" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row7_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="keyboardterminaltemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" op="=" var2="0"/>
+ <placement x="0" y="%keyboard_y%" w="1920" h="512"/>
+ <keymargin x="6" y="6"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="40" y="4"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace_terminal"/>
+ <keylabel key="0:action" text="Enter" resource="enter_terminal"/>
+ <keylabel key=" " text="Space" resource="space_terminal"/>
+ <keylabel key="0:k:29" text="Ctrl"/>
+ <keylabel key="0:c:27" text="Esc"/>
+ <keylabel key="0:c:9" text="Tab"/>
+ <keylabel key="0:k:105" text="&lt;" resource="kb_arrow_left"/>
+ <keylabel key="0:k:108" text="v" resource="kb_arrow_down"/>
+ <keylabel key="0:k:103" text="^" resource="kb_arrow_up"/>
+ <keylabel key="0:k:106" text="&gt;" resource="kb_arrow_right"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <ctrlhighlight color="#0090CA80"/>
+ <layout1>
+ <keysize height="128" width="160"/>
+ <row1 key01="160:c:27" long01=":c:3" key02="q" long02="1" key03="w" long03="2" key04="e" long04="3" key05="r" long05="4" key06="t" long06="5" key07="y" long07="6" key08="u" long08="7" key09="i" long09="8" key10="o" long10="9" key11="p" long11="0" key12="160:k:103"/>
+ <row2 key01="160:c:9" key02="80:" key03="a" long03="@" key04="s" long04="#" key05="d" long05="$" key06="f" long06="%" key07="g" long07="&amp;" key08="h" long08="*" key09="j" long09="-" key10="k" long10="+" key11="l" long11="_" key12="80:" key13="160:k:105"/>
+ <row3 key01="160:" key02="240:layout2" key03="z" long03="!" key04="x" long04="&quot;" key05="c" long05="'" key06="v" long06=":" key07="b" long07=";" key08="n" long08="/" key09="m" long09="?" key10="240:c:8" key11="160:k:106"/>
+ <row4 key01="160:k:29" key02="240:layout3" key03="/" key04="800: " key05="." key06="240:action" key07="160:k:108"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift_terminal"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="128" width="160" capslock="0" revert_layout="1"/>
+ <row1 key01="160:c:27" long01=":c:3" key02="Q" long02="1" key03="W" long03="2" key04="E" long04="3" key05="R" long05="4" key06="T" long06="5" key07="Y" long07="6" key08="U" long08="7" key09="I" long09="8" key10="O" long10="9" key11="P" long11="0" key12="160:k:103"/>
+ <row2 key01="160:c:9" key02="80:" key03="A" long03="@" key04="S" long04="#" key05="D" long05="$" key06="F" long06="%" key07="G" long07="&amp;" key08="H" long08="*" key09="J" long09="-" key10="K" long10="+" key11="L" long11="_" key12="80:" key13="160:k:105"/>
+ <row3 key01="160:" key02="240:layout1" key03="Z" long03="!" key04="X" long04="&quot;" key05="C" long05="'" key06="V" long06=":" key07="B" long07=";" key08="N" long08="/" key09="M" long09="?" key10="240:c:8" key11="160:k:106"/>
+ <row4 key01="160:k:29" key02="240:layout3" key03="/" key04="800: " key05="." key06="240:action" key07="160:k:108"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_terminal_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="128" width="160"/>
+ <row1 key01="160:c:27" long01=":c:3" key02="1" key03="2" key04="3" key05="4" key06="5" key07="6" key08="7" key09="8" key10="9" key11="0" key12="160:k:103"/>
+ <row2 key01="160:c:9" key02="@" key03="#" key04="$" key05="%" key06="&amp;" key07="*" key08="-" key09="+" key10="(" key11=")" key12="160:k:105"/>
+ <row3 key01="160:" key02="240:layout4" key03="!" key04="160:c:34" key05="'" key06=":" key07=";" key08="/" key09="?" key10="240:c:8" key11="160:k:106"/>
+ <row4 key01="160:k:29" key02="240:layout1" key03="," key04="800: " key05="." key06="240:action" key07="160:k:108"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="128" width="160"/>
+ <row1 key01="160:c:27" long01=":c:3" key02="~" key03="`" key04="|" key05="160:" key06="160:" key07="160:" key08="%" key09="160:" key10="{" key11="}" key12="160:k:103"/>
+ <row2 key01="160:c:9" key02="160:" key03="160:" key04="160:" key05="160:" key06="160:" key07="^" key08="_" key09="=" key10="[" key11="]" key12="160:k:105"/>
+ <row3 key01="160:" key02="240:layout3" key03="160:" key04="160:" key05="160:" key06="160:" key07="\" key08="&lt;" key09="&gt;" key10="240:c:8" key11="160:k:106"/>
+ <row4 key01="160:k:29" key02="240:layout1" key03="160:c:34" key04="800: " key05="." key06="240:action" key07="160:k:108"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+
+ <template name="keyboardtemplate">
+ <keyboard>
+ <placement x="0" y="%keyboard_y%" w="1920" h="512"/>
+ <keymargin x="6" y="6"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="40" y="4"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace"/>
+ <keylabel key="0:action" text="Enter" resource="enter"/>
+ <keylabel key=" " text="Space" resource="space"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <layout1>
+ <keysize height="128" width="192"/>
+ <row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0"/>
+ <row2 key01="96:" key02="a" long02="@" key03="s" long03="#" key04="d" long04="$" key05="f" long05="%" key06="g" long06="&amp;" key07="h" long07="*" key08="j" long08="-" key09="k" long09="+" key10="l" long10="_" key11="96:"/>
+ <row3 key01="288:layout2" key02="z" long02="!" key03="x" long03="&quot;" key04="c" long04="'" key05="v" long05=":" key06="b" long06=";" key07="n" long07="/" key08="m" long08="?" key09="288:c:8"/>
+ <row4 key01="288:layout3" key02="/" key03="960: " key04="." key05="288:action"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="128" width="192" capslock="0" revert_layout="1"/>
+ <row1 key01="Q" long01="1" key02="W" long02="2" key03="E" long03="3" key04="R" long04="4" key05="T" long05="5" key06="Y" long06="6" key07="U" long07="7" key08="I" long08="8" key09="O" long09="9" key10="P" long10="0"/>
+ <row2 key01="96:" key02="A" long02="@" key03="S" long03="#" key04="D" long04="$" key05="F" long05="%" key06="G" long06="&amp;" key07="H" long07="*" key08="J" long08="-" key09="K" long09="+" key10="L" long10="_" key11="96:"/>
+ <row3 key01="288:layout1" key02="Z" long02="!" key03="X" long03="&quot;" key04="C" long04="'" key05="V" long05=":" key06="B" long06=";" key07="N" long07="/" key08="M" long08="?" key09="288:c:8"/>
+ <row4 key01="288:layout3" key02="/" key03="960: " key04="." key05="288:action"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="128" width="192"/>
+ <row1 key01="1" key02="2" key03="3" key04="4" key05="5" key06="6" key07="7" key08="8" key09="9" key10="0"/>
+ <row2 key01="@" key02="#" key03="$" key04="%" key05="&amp;" key06="*" key07="-" key08="+" key09="(" key10=")"/>
+ <row3 key01="288:layout4" key02="!" key03="192:c:34" key04="'" key05=":" key06=";" key07="/" key08="?" key09="288:c:8"/>
+ <row4 key01="288:layout1" key02="," key03="960: " key04="." key05="288:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="128" width="192"/>
+ <row1 key01="~" key02="`" key03="|" key04="192:" key05="192:" key06="192:" key07="%" key08="192:" key09="{" key10="}"/>
+ <row2 key01="192:" key02="192:" key03="192:" key04="192:" key05="192:" key06="^" key07="_" key08="=" key09="[" key10="]"/>
+ <row3 key01="288:layout3" key02="192:" key03="192:" key04="192:" key05="192:" key06="\" key07="&lt;" key08="&gt;" key09="288:c:8"/>
+ <row4 key01="288:layout1" key02="192:c:34" key03="960: " key04="." key05="288:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+ </templates>
+</recovery>
diff --git a/gui/theme/landscape_mdpi/images/back.png b/gui/theme/landscape_mdpi/images/back.png
new file mode 100644
index 000000000..a4310344d
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/back.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/backspace.png b/gui/theme/landscape_mdpi/images/backspace.png
new file mode 100644
index 000000000..a51654715
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/backspace.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/backspace_terminal.png b/gui/theme/landscape_mdpi/images/backspace_terminal.png
new file mode 100644
index 000000000..53db5aa37
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/backspace_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/checkbox_false.png b/gui/theme/landscape_mdpi/images/checkbox_false.png
new file mode 100644
index 000000000..a4ed41ede
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/checkbox_false.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/checkbox_true.png b/gui/theme/landscape_mdpi/images/checkbox_true.png
new file mode 100644
index 000000000..f7adcf506
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/checkbox_true.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/console.png b/gui/theme/landscape_mdpi/images/console.png
new file mode 100644
index 000000000..cc9bbf598
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/console.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/cursor.png b/gui/theme/landscape_mdpi/images/cursor.png
new file mode 100644
index 000000000..d5319ac89
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/cursor.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/enter.png b/gui/theme/landscape_mdpi/images/enter.png
new file mode 100644
index 000000000..209a1be4d
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/enter.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/enter_terminal.png b/gui/theme/landscape_mdpi/images/enter_terminal.png
new file mode 100644
index 000000000..8bc0e8956
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/enter_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/file.png b/gui/theme/landscape_mdpi/images/file.png
new file mode 100644
index 000000000..bb68fb76b
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/file.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/folder.png b/gui/theme/landscape_mdpi/images/folder.png
new file mode 100644
index 000000000..72b76a99e
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/folder.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/handle.png b/gui/theme/landscape_mdpi/images/handle.png
new file mode 100644
index 000000000..25e53556a
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/handle.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/home.png b/gui/theme/landscape_mdpi/images/home.png
new file mode 100644
index 000000000..71b37e0c8
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/home.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate001.png b/gui/theme/landscape_mdpi/images/indeterminate001.png
new file mode 100644
index 000000000..930d7eb2a
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate001.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate002.png b/gui/theme/landscape_mdpi/images/indeterminate002.png
new file mode 100644
index 000000000..c4d207ea4
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate002.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate003.png b/gui/theme/landscape_mdpi/images/indeterminate003.png
new file mode 100644
index 000000000..376de520d
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate003.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate004.png b/gui/theme/landscape_mdpi/images/indeterminate004.png
new file mode 100644
index 000000000..dbc13753d
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate004.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate005.png b/gui/theme/landscape_mdpi/images/indeterminate005.png
new file mode 100644
index 000000000..cae5c3b1e
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate005.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate006.png b/gui/theme/landscape_mdpi/images/indeterminate006.png
new file mode 100644
index 000000000..326799800
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate006.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate007.png b/gui/theme/landscape_mdpi/images/indeterminate007.png
new file mode 100644
index 000000000..dee4840c6
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate007.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate008.png b/gui/theme/landscape_mdpi/images/indeterminate008.png
new file mode 100644
index 000000000..470f08077
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate008.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate009.png b/gui/theme/landscape_mdpi/images/indeterminate009.png
new file mode 100644
index 000000000..08ac625c6
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate009.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate010.png b/gui/theme/landscape_mdpi/images/indeterminate010.png
new file mode 100644
index 000000000..a7ec1336c
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate010.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate011.png b/gui/theme/landscape_mdpi/images/indeterminate011.png
new file mode 100644
index 000000000..6e3bf96e9
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate011.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/indeterminate012.png b/gui/theme/landscape_mdpi/images/indeterminate012.png
new file mode 100644
index 000000000..d2f8c6a67
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/indeterminate012.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/kb_arrow_down.png b/gui/theme/landscape_mdpi/images/kb_arrow_down.png
new file mode 100644
index 000000000..16042c114
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/kb_arrow_down.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/kb_arrow_left.png b/gui/theme/landscape_mdpi/images/kb_arrow_left.png
new file mode 100644
index 000000000..e5d6eaf09
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/kb_arrow_left.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/kb_arrow_right.png b/gui/theme/landscape_mdpi/images/kb_arrow_right.png
new file mode 100644
index 000000000..3be128e32
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/kb_arrow_right.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/kb_arrow_up.png b/gui/theme/landscape_mdpi/images/kb_arrow_up.png
new file mode 100644
index 000000000..c131e0616
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/kb_arrow_up.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/kb_hide.png b/gui/theme/landscape_mdpi/images/kb_hide.png
new file mode 100644
index 000000000..3350f00d4
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/kb_hide.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/kb_show.png b/gui/theme/landscape_mdpi/images/kb_show.png
new file mode 100644
index 000000000..a01d75a5b
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/kb_show.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/logo.png b/gui/theme/landscape_mdpi/images/logo.png
new file mode 100644
index 000000000..c08babc79
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/logo.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/main_button.png b/gui/theme/landscape_mdpi/images/main_button.png
new file mode 100644
index 000000000..65b778e7e
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/main_button.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/main_button_half_width.png b/gui/theme/landscape_mdpi/images/main_button_half_width.png
new file mode 100644
index 000000000..7e644fe07
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/main_button_half_width.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/main_button_half_width_low.png b/gui/theme/landscape_mdpi/images/main_button_half_width_low.png
new file mode 100644
index 000000000..72c52f731
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/main_button_half_width_low.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/progress_empty.png b/gui/theme/landscape_mdpi/images/progress_empty.png
new file mode 100644
index 000000000..0eecb8b67
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/progress_empty.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/progress_fill.png b/gui/theme/landscape_mdpi/images/progress_fill.png
new file mode 100644
index 000000000..87b512465
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/progress_fill.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/radio_false.png b/gui/theme/landscape_mdpi/images/radio_false.png
new file mode 100644
index 000000000..e753021e0
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/radio_false.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/radio_true.png b/gui/theme/landscape_mdpi/images/radio_true.png
new file mode 100644
index 000000000..5ab1b0f59
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/radio_true.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/shift.png b/gui/theme/landscape_mdpi/images/shift.png
new file mode 100644
index 000000000..200e4c581
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/shift.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/shift_fill.png b/gui/theme/landscape_mdpi/images/shift_fill.png
new file mode 100644
index 000000000..cf46c1a71
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/shift_fill.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/shift_terminal.png b/gui/theme/landscape_mdpi/images/shift_terminal.png
new file mode 100644
index 000000000..bc2cc7dc5
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/shift_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/shift_terminal_fill.png b/gui/theme/landscape_mdpi/images/shift_terminal_fill.png
new file mode 100644
index 000000000..02190b1a2
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/shift_terminal_fill.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/slider.png b/gui/theme/landscape_mdpi/images/slider.png
new file mode 100644
index 000000000..1473c806b
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/slider.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/slider_touch.png b/gui/theme/landscape_mdpi/images/slider_touch.png
new file mode 100644
index 000000000..a701f5397
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/slider_touch.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/slider_used.png b/gui/theme/landscape_mdpi/images/slider_used.png
new file mode 100644
index 000000000..56cff27c1
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/slider_used.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/sort_asc.png b/gui/theme/landscape_mdpi/images/sort_asc.png
new file mode 100644
index 000000000..d37dbfebf
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/sort_asc.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/sort_desc.png b/gui/theme/landscape_mdpi/images/sort_desc.png
new file mode 100644
index 000000000..8c551583d
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/sort_desc.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/sort_empty.png b/gui/theme/landscape_mdpi/images/sort_empty.png
new file mode 100644
index 000000000..048354628
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/sort_empty.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/space.png b/gui/theme/landscape_mdpi/images/space.png
new file mode 100644
index 000000000..06ff8df19
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/space.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/space_terminal.png b/gui/theme/landscape_mdpi/images/space_terminal.png
new file mode 100644
index 000000000..d40133338
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/space_terminal.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/splashlogo.png b/gui/theme/landscape_mdpi/images/splashlogo.png
new file mode 100644
index 000000000..daac29442
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/splashlogo.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/splashteamwin.png b/gui/theme/landscape_mdpi/images/splashteamwin.png
new file mode 100644
index 000000000..d2fad9cc4
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/splashteamwin.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/tab_3.png b/gui/theme/landscape_mdpi/images/tab_3.png
new file mode 100644
index 000000000..1c37f98c0
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/tab_3.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/tab_4.png b/gui/theme/landscape_mdpi/images/tab_4.png
new file mode 100644
index 000000000..41f606c00
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/tab_4.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/images/unlock_icon.png b/gui/theme/landscape_mdpi/images/unlock_icon.png
new file mode 100644
index 000000000..890c38cec
--- /dev/null
+++ b/gui/theme/landscape_mdpi/images/unlock_icon.png
Binary files differ
diff --git a/gui/theme/landscape_mdpi/splash.xml b/gui/theme/landscape_mdpi/splash.xml
new file mode 100644
index 000000000..ac71c2301
--- /dev/null
+++ b/gui/theme/landscape_mdpi/splash.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="800" height="480"/>
+ <author>TeamWin</author>
+ <title>TWRP</title>
+ <description>splash screen</description>
+ <themeversion>2</themeversion>
+ </details>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="24"/>
+ <image name="splashlogo" filename="splashlogo" retainaspect="1"/>
+ <image name="splashteamwin" filename="splashteamwin" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="screen_width" value="800"/>
+ <variable name="screen_height" value="480"/>
+ <variable name="background_color" value="#222222"/>
+ <variable name="header_color" value="#555555"/>
+ <variable name="accent_color" value="#0090CA"/>
+ </variables>
+
+ <pages>
+ <page name="splash">
+ <background color="%background_color%"/>
+
+ <fill color="%header_color%">
+ <placement x="0" y="0" w="%screen_width%" h="140"/>
+ </fill>
+
+ <image>
+ <image resource="splashlogo"/>
+ <placement x="400" y="140" placement="4"/>
+ </image>
+
+ <image>
+ <image resource="splashteamwin"/>
+ <placement x="400" y="366" placement="4"/>
+ </image>
+
+ <text color="%header_color%">
+ <font resource="font_l"/>
+ <placement x="400" y="386" placement="5"/>
+ <text>Recovery Project %tw_version%</text>
+ </text>
+ </page>
+ </pages>
+</recovery>
+
diff --git a/gui/theme/landscape_mdpi/ui.xml b/gui/theme/landscape_mdpi/ui.xml
new file mode 100644
index 000000000..c2cfc4fb3
--- /dev/null
+++ b/gui/theme/landscape_mdpi/ui.xml
@@ -0,0 +1,721 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="800" height="480"/>
+ <author>TeamWin</author>
+ <title>Backup Naowz</title>
+ <description>Default basic theme</description>
+ <preview>preview.png</preview>
+ <themeversion>2</themeversion>
+ </details>
+
+ <include>
+ <xmlfile name="landscape.xml"/>
+ </include>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="18"/>
+ <font name="font_m" filename="RobotoCondensed-Regular.ttf" size="14"/>
+ <font name="font_s" filename="RobotoCondensed-Regular.ttf" size="12"/>
+ <font name="fixed" filename="DroidSansMono.ttf" size="12"/>
+
+ <font name="keylabel" filename="RobotoCondensed-Regular.ttf" size="21"/>
+ <font name="keylabel-small" filename="RobotoCondensed-Regular.ttf" size="18"/>
+ <font name="keylabel-longpress" filename="RobotoCondensed-Regular.ttf" size="11"/>
+
+ <image name="logo" filename="logo" retainaspect="1"/>
+ <image name="main_button" filename="main_button"/>
+ <image name="main_button_half_width" filename="main_button_half_width"/>
+ <image name="main_button_half_width_low" filename="main_button_half_width_low"/>
+ <image name="tab_3" filename="tab_3"/>
+ <image name="tab_4" filename="tab_4"/>
+ <image name="file" filename="file" retainaspect="1"/>
+ <image name="folder" filename="folder" retainaspect="1"/>
+ <image name="unlock_icon" filename="unlock_icon" retainaspect="1"/>
+ <image name="home" filename="home" retainaspect="1"/>
+ <image name="back" filename="back" retainaspect="1"/>
+ <image name="console" filename="console" retainaspect="1"/>
+ <image name="kb_hide" filename="kb_hide" retainaspect="1"/>
+ <image name="kb_show" filename="kb_show" retainaspect="1"/>
+ <image name="checkbox_false" filename="checkbox_false" retainaspect="1"/>
+ <image name="checkbox_true" filename="checkbox_true" retainaspect="1"/>
+ <image name="radio_false" filename="radio_false" retainaspect="1"/>
+ <image name="radio_true" filename="radio_true" retainaspect="1"/>
+ <image name="sort_asc" filename="sort_asc"/>
+ <image name="sort_desc" filename="sort_desc"/>
+ <image name="sort_empty" filename="sort_empty"/>
+ <animation name="progress" filename="indeterminate"/>
+ <image name="progress_empty" filename="progress_empty"/>
+ <image name="progress_full" filename="progress_fill"/>
+ <image name="slider" filename="slider"/>
+ <image name="slider_used" filename="slider_used"/>
+ <image name="slider_touch" filename="slider_touch"/>
+ <image name="handle" filename="handle"/>
+ <image name="cursor" filename="cursor" retainaspect="1"/>
+
+ <image name="backspace" filename="backspace" retainaspect="1"/>
+ <image name="backspace_terminal" filename="backspace_terminal" retainaspect="1"/>
+ <image name="enter" filename="enter" retainaspect="1"/>
+ <image name="enter_terminal" filename="enter_terminal" retainaspect="1"/>
+ <image name="shift" filename="shift" retainaspect="1"/>
+ <image name="shift_terminal" filename="shift_terminal" retainaspect="1"/>
+ <image name="shift_fill" filename="shift_fill" retainaspect="1"/>
+ <image name="shift_terminal_fill" filename="shift_terminal_fill" retainaspect="1"/>
+ <image name="space" filename="space" retainaspect="1"/>
+ <image name="space_terminal" filename="space_terminal" retainaspect="1"/>
+ <image name="kb_arrow_left" filename="kb_arrow_left" retainaspect="1"/>
+ <image name="kb_arrow_right" filename="kb_arrow_right" retainaspect="1"/>
+ <image name="kb_arrow_up" filename="kb_arrow_up" retainaspect="1"/>
+ <image name="kb_arrow_down" filename="kb_arrow_down" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="tw_samsung_navbar" value="0" persist="1"/>
+ <variable name="tw_navbar_button_position" value="0" persist="1"/>
+
+ <variable name="tw_hide_kb" value="0"/>
+ <variable name="screen_width" value="800"/>
+ <variable name="screen_height" value="480"/>
+ <variable name="status_height" value="20"/>
+ <variable name="header_height" value="80"/>
+ <variable name="navbar_height" value="40"/>
+ <variable name="content_width" value="760"/>
+ <variable name="content_quarter_width" value="590"/>
+ <variable name="content_half_width" value="370"/>
+ <variable name="content_overlay_width" value="380"/>
+ <variable name="dialog_height" value="207"/>
+ <variable name="dialog_width" value="400"/>
+ <variable name="dialog_content_x" value="220"/>
+ <variable name="back_button_x" value="264"/>
+ <variable name="console_button_x" value="536"/>
+ <variable name="back_button_x_1" value="50"/>
+ <variable name="home_button_x_1" value="130"/>
+ <variable name="console_button_x_1" value="210"/>
+ <variable name="back_button_x_2" value="590"/>
+ <variable name="home_button_x_2" value="670"/>
+ <variable name="console_button_x_2" value="750"/>
+ <variable name="col1_x_header" value="60"/>
+ <variable name="indent" value="10"/>
+ <variable name="col1_x_left" value="20"/>
+ <variable name="col2_x_left" value="210"/>
+ <variable name="center_x" value="400"/>
+ <variable name="col1_x_right" value="410"/>
+ <variable name="col2_x_right" value="590"/>
+ <variable name="col_button_right" value="620"/>
+ <variable name="indent_right" value="790"/>
+ <variable name="tab_height" value="30"/>
+ <variable name="tab_indicator_height" value="2"/>
+ <variable name="tab4_width" value="200"/>
+ <variable name="tab5_width" value="160"/>
+ <variable name="tab4_col2_x" value="200"/>
+ <variable name="tab4_col4_x" value="600"/>
+ <variable name="tab5_col2_x" value="160"/>
+ <variable name="tab5_col3_x" value="320"/>
+ <variable name="tab5_col4_x" value="480"/>
+ <variable name="tab5_col5_x" value="640"/>
+ <variable name="btn4_col2_x_left" value="117"/>
+ <variable name="btn4_col3_x_left" value="216"/>
+ <variable name="btn4_col4_x_left" value="313"/>
+ <variable name="btn4_col2_x_right" value="507"/>
+ <variable name="btn4_col3_x_right" value="606"/>
+ <variable name="btn4_col4_x_right" value="703"/>
+ <variable name="row1_header_y" value="0"/>
+ <variable name="row2_header_y" value="20"/>
+ <variable name="row3_header_y" value="24"/>
+ <variable name="row4_header_y" value="52"/>
+ <variable name="row1_y" value="80"/>
+ <variable name="row1a_y" value="89"/>
+ <variable name="row2_y" value="98"/>
+ <variable name="row2a_y" value="107"/>
+ <variable name="row_tab_y" value="108"/>
+ <variable name="row2_input_y" value="116"/>
+ <variable name="row3_y" value="116"/>
+ <variable name="row3a_y" value="125"/>
+ <variable name="row3_input_y" value="125"/>
+ <variable name="row4_y" value="134"/>
+ <variable name="row4a_y" value="143"/>
+ <variable name="row4_input_y" value="143"/>
+ <variable name="row5_y" value="152"/>
+ <variable name="row5a_y" value="161"/>
+ <variable name="row6_y" value="170"/>
+ <variable name="row6a_y" value="179"/>
+ <variable name="row7_y" value="188"/>
+ <variable name="row7a_y" value="197"/>
+ <variable name="row8_y" value="206"/>
+ <variable name="row8a_y" value="215"/>
+ <variable name="row9_y" value="224"/>
+ <variable name="row9a_y" value="233"/>
+ <variable name="row10_y" value="242"/>
+ <variable name="row10a_y" value="251"/>
+ <variable name="row11_y" value="260"/>
+ <variable name="row11a_y" value="269"/>
+ <variable name="row12_y" value="278"/>
+ <variable name="row12a_y" value="288"/>
+ <variable name="row13_y" value="296"/>
+ <variable name="row13a_y" value="305"/>
+ <variable name="row14_y" value="314"/>
+ <variable name="row14a_y" value="323"/>
+ <variable name="row15_y" value="332"/>
+ <variable name="row15a_y" value="341"/>
+ <variable name="row16_y" value="350"/>
+ <variable name="row16a_y" value="359"/>
+ <variable name="row17_y" value="368"/>
+ <variable name="row17a_y" value="377"/>
+ <variable name="row18_y" value="386"/>
+ <variable name="row18a_y" value="395"/>
+ <variable name="row19_y" value="404"/>
+ <variable name="row19a_y" value="413"/>
+ <variable name="row20_y" value="422"/>
+ <variable name="navbar_y" value="440"/>
+ <variable name="navbar_btn_y" value="460"/>
+ <variable name="keyboard_y" value="248"/>
+ <variable name="background_color" value="#1A1A1A"/>
+ <variable name="accent_color" value="#0090CA"/>
+ <variable name="text_color" value="#EEEEEE"/>
+ <variable name="text_button_color" value="#EEEEEE"/>
+ <variable name="text_success_color" value="#76FF03"/>
+ <variable name="text_fail_color" value="#FF0101"/>
+ <variable name="highlight_color" value="#1A1A1A80"/>
+ <variable name="caps_highlight_color" value="#22222280"/>
+ <variable name="transparent" value="#00000000"/>
+ <variable name="semi_transparent" value="#00000099"/>
+ <variable name="warning" value="#F8F8A0"/>
+ <variable name="error" value="#FF0101"/>
+ <variable name="highlight" value="#0090CA"/>
+ <variable name="fileselector_linecolor" value="#555555"/>
+ <variable name="fileselector_highlight_color" value="#555555"/>
+ <variable name="fileselector_separatorheight" value="1"/>
+ <variable name="fileselector_spacing" value="0"/>
+ <variable name="fileselector_install_height" value="333"/>
+ <variable name="fileselector_install_width" value="400"/>
+ <variable name="fileselector_install_folder_width" value="170"/>
+ <variable name="fileselector_filemanager_height" value="333"/>
+ <variable name="partitionlist_spacing" value="0"/>
+ <variable name="partitionlist_storage_height" value="160"/>
+ <variable name="partitionlist_flashimage_height" value="144"/>
+ <variable name="partitionlist_wipe_height" value="243"/>
+ <variable name="partitionlist_mount_height" value="221"/>
+ <variable name="partitionlist_backup_height" value="198"/>
+ <variable name="listbox_timezone_height" value="306"/>
+ <variable name="listbox_settings_height" value="243"/>
+ <variable name="fastscroll_w" value="7"/>
+ <variable name="fastscroll_linew" value="1"/>
+ <variable name="fastscroll_rectw" value="7"/>
+ <variable name="fastscroll_recth" value="45"/>
+ <variable name="slidervalue_lineh" value="2"/>
+ <variable name="slidervalue_padding" value="0"/>
+ <variable name="slidervalue_sliderw" value="24"/>
+ <variable name="slidervalue_sliderh" value="36"/>
+ <variable name="slideout_y" value="40"/>
+ <variable name="slideout_height" value="380"/>
+ <variable name="slideout_bg_height" value="420"/>
+ <variable name="input_height" value="18"/>
+ <variable name="input_line_width" value="1"/>
+ <variable name="console_height" value="234"/>
+ <variable name="console_terminal_height" value="164"/>
+ <variable name="terminal_s_height" value="220"/>
+ <variable name="terminal_l_height" value="412"/>
+ <variable name="dialog_button_x" value="480"/>
+ <variable name="date_button_x" value="230"/>
+ <variable name="progress_x" value="230"/>
+ <variable name="progress_text_x" value="40"/>
+ <variable name="progress_text_y" value="348"/>
+ <variable name="pattern_x" value="84"/>
+ <variable name="pattern_dot_dia" value="12"/>
+ <variable name="pattern_line_w" value="4"/>
+ <variable name="pattern_size" value="252"/>
+ </variables>
+
+ <mousecursor>
+ <placement w="15" h="15"/>
+ <background color="#FFFF00FF" resource="cursor"/>
+ <speed multiplier="2.5"/>
+ </mousecursor>
+
+ <templates>
+ <template name="page">
+ <background color="%background_color%"/>
+
+ <fill color="%accent_color%">
+ <placement x="0" y="0" w="%screen_width%" h="%header_height%"/>
+ </fill>
+
+ <image>
+ <condition var1="tw_busy" var2="1"/>
+ <image resource="logo"/>
+ <placement x="0" y="0"/>
+ </image>
+
+ <button>
+ <condition var1="tw_busy" var2="0"/>
+ <placement x="0" y="0"/>
+ <image resource="logo"/>
+ <action function="key">home</action>
+ </button>
+
+ <fill color="#00000030">
+ <condition var1="tw_simulate_actions" var2="0"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="1"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>%tw_version%</text>
+ </text>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%center_x%" y="%row1_header_y%" placement="5"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <text color="%text_color%">
+ <conditions>
+ <condition var1="tw_no_battery_percent" var2="0"/>
+ <condition var1="tw_battery" op="&gt;" var2="0"/>
+ <condition var1="tw_battery" op="&lt;" var2="101"/>
+ </conditions>
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
+ </text>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="0"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <placement x="%home_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="1"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x_1%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <placement x="%home_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_navbar_button_position" op="=" var2="2"/>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x_2%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </template>
+
+ <template name="progress_bar">
+ <progressbar>
+ <placement x="%progress_x%" y="%row16_y%"/>
+ <resource empty="progress_empty" full="progress_full"/>
+ <data name="ui_progress"/>
+ </progressbar>
+
+ <animation>
+ <placement x="%progress_x%" y="%row16_y%"/>
+ <resource name="progress"/>
+ <speed fps="24" render="2"/>
+ <loop frame="1"/>
+ </animation>
+ </template>
+
+ <template name="sort_options">
+ <image>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <image resource="main_button_half_width_low"/>
+ </image>
+
+ <image>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <image resource="main_button_half_width_low"/>
+ </image>
+
+ <image>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <image resource="main_button_half_width_low"/>
+ </image>
+
+ <button style="sort_asc">
+ <condition var1="tw_gui_sort_order" op="=" var2="1"/>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>{@sort_by_name=Sort by Name}</text>
+ <action function="set">tw_gui_sort_order=-1</action>
+ </button>
+
+ <button style="sort_desc">
+ <condition var1="tw_gui_sort_order" op="=" var2="-1"/>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>{@sort_by_name=Sort by Name}</text>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button style="sort_empty">
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="1"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-1"/>
+ </conditions>
+ <placement x="%col_button_right%" y="%row1a_y%"/>
+ <text>{@sort_by_name=Sort by Name}</text>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button style="sort_asc">
+ <condition var1="tw_gui_sort_order" op="=" var2="2"/>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>{@sort_by_date=Sort by Date}</text>
+ <action function="set">tw_gui_sort_order=-2</action>
+ </button>
+
+ <button style="sort_desc">
+ <condition var1="tw_gui_sort_order" op="=" var2="-2"/>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>{@sort_by_date=Sort by Date}</text>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button style="sort_empty">
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="2"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-2"/>
+ </conditions>
+ <placement x="%col_button_right%" y="%row4a_y%"/>
+ <text>{@sort_by_date=Sort by Date}</text>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button style="sort_asc">
+ <condition var1="tw_gui_sort_order" op="=" var2="3"/>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>{@sort_by_size=Sort by Size}</text>
+ <action function="set">tw_gui_sort_order=-3</action>
+ </button>
+
+ <button style="sort_desc">
+ <condition var1="tw_gui_sort_order" op="=" var2="-3"/>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>{@sort_by_size=Sort by Size}</text>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+
+ <button style="sort_empty">
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="3"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-3"/>
+ </conditions>
+ <placement x="%col_button_right%" y="%row7a_y%"/>
+ <text>{@sort_by_size=Sort by Size}</text>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+ </template>
+
+ <template name="tabs_settings">
+ <button style="tab">
+ <placement x="0" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_general=GENERAL}</text>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col2_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_time_zone=TIME ZONE}</text>
+ <action function="page">settings_timezone</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col3_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_screen=SCREEN}</text>
+ <action function="page">settings_screen</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col4_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_vibration=VIBRATION}</text>
+ <action function="page">settings_vibration</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_col5_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%"/>
+ <text>{@tab_language=LANGUAGE}</text>
+ <action function="page">settings_language</action>
+ </button>
+ </template>
+
+ <template name="console">
+ <console>
+ <placement x="%col1_x_left%" y="%row2_y%" w="%content_width%" h="%console_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row2_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row15_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="console_terminal">
+ <console>
+ <placement x="%col1_x_left%" y="%row3_header_y%" w="content_width" h="%console_terminal_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="%row3_header_y%" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%col1_x_left%" y="row7_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="keyboardterminaltemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" op="=" var2="0"/>
+ <placement x="0" y="%keyboard_y%" w="800" h="192"/>
+ <keymargin x="4" y="4"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="14" y="2"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace_terminal"/>
+ <keylabel key="0:action" text="Enter" resource="enter_terminal"/>
+ <keylabel key=" " text="Space" resource="space_terminal"/>
+ <keylabel key="0:k:29" text="Ctrl"/>
+ <keylabel key="0:c:27" text="Esc"/>
+ <keylabel key="0:c:9" text="Tab"/>
+ <keylabel key="0:k:105" text="&lt;" resource="kb_arrow_left"/>
+ <keylabel key="0:k:108" text="v" resource="kb_arrow_down"/>
+ <keylabel key="0:k:103" text="^" resource="kb_arrow_up"/>
+ <keylabel key="0:k:106" text="&gt;" resource="kb_arrow_right"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <ctrlhighlight color="#0090CA80"/>
+ <layout1>
+ <keysize height="48" width="68"/>
+ <row1 key01="60:c:27" long01=":c:3" key02="q" long02="1" key03="w" long03="2" key04="e" long04="3" key05="r" long05="4" key06="t" long06="5" key07="y" long07="6" key08="u" long08="7" key09="i" long09="8" key10="o" long10="9" key11="p" long11="0" key12="60:k:103"/>
+ <row2 key01="60:c:9" key02="34:" key03="a" long03="@" key04="s" long04="#" key05="d" long05="$" key06="f" long06="%" key07="g" long07="&amp;" key08="h" long08="*" key09="j" long09="-" key10="k" long10="+" key11="l" long11="_" key12="34:" key13="60:k:105"/>
+ <row3 key01="60:" key02="102:layout2" key03="z" long03="!" key04="x" long04="&quot;" key05="c" long05="'" key06="v" long06=":" key07="b" long07=";" key08="n" long08="/" key09="m" long09="?" key10="102:c:8" key11="60:k:106"/>
+ <row4 key01="60:k:29" key02="102:layout3" key03="/" key04="340: " key05="." key06="102:action" key07="60:k:108"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift_terminal"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="48" width="68" capslock="0" revert_layout="1"/>
+ <row1 key01="60:c:27" long01=":c:3" key02="Q" long02="1" key03="W" long03="2" key04="E" long04="3" key05="R" long05="4" key06="T" long06="5" key07="Y" long07="6" key08="U" long08="7" key09="I" long09="8" key10="O" long10="9" key11="P" long11="0" key12="60:k:103"/>
+ <row2 key01="60:c:9" key02="34:" key03="A" long03="@" key04="S" long04="#" key05="D" long05="$" key06="F" long06="%" key07="G" long07="&amp;" key08="H" long08="*" key09="J" long09="-" key10="K" long10="+" key11="L" long11="_" key12="34:" key13="60:k:105"/>
+ <row3 key01="60:" key02="102:layout1" key03="Z" long03="!" key04="X" long04="&quot;" key05="C" long05="'" key06="V" long06=":" key07="B" long07=";" key08="N" long08="/" key09="M" long09="?" key10="102:c:8" key11="60:k:106"/>
+ <row4 key01="60:k:29" key02="102:layout3" key03="/" key04="340: " key05="." key06="102:action" key07="60:k:108"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_terminal_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="48" width="68"/>
+ <row1 key01="60:c:27" long01=":c:3" key02="1" key03="2" key04="3" key05="4" key06="5" key07="6" key08="7" key09="8" key10="9" key11="0" key12="60:k:103"/>
+ <row2 key01="60:c:9" key02="@" key03="#" key04="$" key05="%" key06="&amp;" key07="*" key08="-" key09="+" key10="(" key11=")" key12="60:k:105"/>
+ <row3 key01="60:" key02="102:layout4" key03="!" key04="68:c:34" key05="'" key06=":" key07=";" key08="/" key09="?" key10="102:c:8" key11="60:k:106"/>
+ <row4 key01="60:k:29" key02="102:layout1" key03="," key04="340: " key05="." key06="102:action" key07="60:k:108"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="48" width="68"/>
+ <row1 key01="60:c:27" long01=":c:3" key02="~" key03="`" key04="|" key05="160:" key06="160:" key07="160:" key08="%" key09="160:" key10="{" key11="}" key12="60:k:103"/>
+ <row2 key01="60:c:9" key02="68:" key03="68:" key04="68:" key05="68:" key06="68:" key07="^" key08="_" key09="=" key10="[" key11="]" key12="60:k:105"/>
+ <row3 key01="60:" key02="102:layout3" key03="68:" key04="68:" key05="68:" key06="68:" key07="\" key08="&lt;" key09="&gt;" key10="102:c:8" key11="60:k:106"/>
+ <row4 key01="60:k:29" key02="102:layout1" key03="68:c:34" key04="340: " key05="." key06="102:action" key07="60:k:108"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+
+ <template name="keyboardtemplate">
+ <keyboard>
+ <placement x="0" y="%keyboard_y%" w="800" h="192"/>
+ <keymargin x="4" y="4"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="14" y="2"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace"/>
+ <keylabel key="0:action" text="Enter" resource="enter"/>
+ <keylabel key=" " text="Space" resource="space"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <layout1>
+ <keysize height="48" width="80"/>
+ <row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0"/>
+ <row2 key01="40:" key02="a" long02="@" key03="s" long03="#" key04="d" long04="$" key05="f" long05="%" key06="g" long06="&amp;" key07="h" long07="*" key08="j" long08="-" key09="k" long09="+" key10="l" long10="_" key11="40:"/>
+ <row3 key01="120:layout2" key02="z" long02="!" key03="x" long03="&quot;" key04="c" long04="'" key05="v" long05=":" key06="b" long06=";" key07="n" long07="/" key08="m" long08="?" key09="120:c:8"/>
+ <row4 key01="120:layout3" key02="/" key03="400: " key04="." key05="120:action"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="48" width="80" capslock="0" revert_layout="1"/>
+ <row1 key01="Q" long01="1" key02="W" long02="2" key03="E" long03="3" key04="R" long04="4" key05="T" long05="5" key06="Y" long06="6" key07="U" long07="7" key08="I" long08="8" key09="O" long09="9" key10="P" long10="0"/>
+ <row2 key01="40:" key02="A" long02="@" key03="S" long03="#" key04="D" long04="$" key05="F" long05="%" key06="G" long06="&amp;" key07="H" long07="*" key08="J" long08="-" key09="K" long09="+" key10="L" long10="_" key11="40:"/>
+ <row3 key01="120:layout1" key02="Z" long02="!" key03="X" long03="&quot;" key04="C" long04="'" key05="V" long05=":" key06="B" long06=";" key07="N" long07="/" key08="M" long08="?" key09="120:c:8"/>
+ <row4 key01="120:layout3" key02="/" key03="400: " key04="." key05="120:action"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="48" width="80"/>
+ <row1 key01="1" key02="2" key03="3" key04="4" key05="5" key06="6" key07="7" key08="8" key09="9" key10="0"/>
+ <row2 key01="@" key02="#" key03="$" key04="%" key05="&amp;" key06="*" key07="-" key08="+" key09="(" key10=")"/>
+ <row3 key01="120:layout4" key02="!" key03="80:c:34" key04="'" key05=":" key06=";" key07="/" key08="?" key09="120:c:8"/>
+ <row4 key01="120:layout1" key02="," key03="400: " key04="." key05="120:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="48" width="80"/>
+ <row1 key01="~" key02="`" key03="|" key04="80:" key05="80:" key06="80:" key07="%" key08="80:" key09="{" key10="}"/>
+ <row2 key01="80:" key02="80:" key03="80:" key04="80:" key05="80:" key06="^" key07="_" key08="=" key09="[" key10="]"/>
+ <row3 key01="120:layout3" key02="80:" key03="80:" key04="80:" key05="80:" key06="\" key07="&lt;" key08="&gt;" key09="120:c:8"/>
+ <row4 key01="120:layout1" key02="80:c:34" key03="400: " key04="." key05="120:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+ </templates>
+</recovery>
diff --git a/gui/theme/portrait_hdpi/images/back.png b/gui/theme/portrait_hdpi/images/back.png
new file mode 100644
index 000000000..7369e2baa
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/back.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/backspace.png b/gui/theme/portrait_hdpi/images/backspace.png
new file mode 100644
index 000000000..cc84f7a4e
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/backspace.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/checkbox_false.png b/gui/theme/portrait_hdpi/images/checkbox_false.png
new file mode 100644
index 000000000..b7c801383
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/checkbox_false.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/checkbox_true.png b/gui/theme/portrait_hdpi/images/checkbox_true.png
new file mode 100644
index 000000000..d8a7b5b23
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/checkbox_true.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/console.png b/gui/theme/portrait_hdpi/images/console.png
new file mode 100644
index 000000000..13fce5c5f
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/console.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/cursor.png b/gui/theme/portrait_hdpi/images/cursor.png
new file mode 100644
index 000000000..3513d065d
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/cursor.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/enter.png b/gui/theme/portrait_hdpi/images/enter.png
new file mode 100644
index 000000000..365f99e38
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/enter.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/fab_selectfolder.png b/gui/theme/portrait_hdpi/images/fab_selectfolder.png
new file mode 100644
index 000000000..3be39baf1
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/fab_selectfolder.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/file.png b/gui/theme/portrait_hdpi/images/file.png
new file mode 100644
index 000000000..7f027da54
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/file.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/folder.png b/gui/theme/portrait_hdpi/images/folder.png
new file mode 100644
index 000000000..ebdced250
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/folder.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/handle.png b/gui/theme/portrait_hdpi/images/handle.png
new file mode 100644
index 000000000..cdd20a050
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/handle.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/home.png b/gui/theme/portrait_hdpi/images/home.png
new file mode 100644
index 000000000..d2d56a5fe
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/home.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate001.png b/gui/theme/portrait_hdpi/images/indeterminate001.png
new file mode 100644
index 000000000..151c8ac0e
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate001.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate002.png b/gui/theme/portrait_hdpi/images/indeterminate002.png
new file mode 100644
index 000000000..7d663736b
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate002.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate003.png b/gui/theme/portrait_hdpi/images/indeterminate003.png
new file mode 100644
index 000000000..b235c01c9
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate003.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate004.png b/gui/theme/portrait_hdpi/images/indeterminate004.png
new file mode 100644
index 000000000..0ac66d572
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate004.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate005.png b/gui/theme/portrait_hdpi/images/indeterminate005.png
new file mode 100644
index 000000000..86992eb93
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate005.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate006.png b/gui/theme/portrait_hdpi/images/indeterminate006.png
new file mode 100644
index 000000000..e03772cf6
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate006.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate007.png b/gui/theme/portrait_hdpi/images/indeterminate007.png
new file mode 100644
index 000000000..4ff1aa40d
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate007.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate008.png b/gui/theme/portrait_hdpi/images/indeterminate008.png
new file mode 100644
index 000000000..ff757ee77
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate008.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate009.png b/gui/theme/portrait_hdpi/images/indeterminate009.png
new file mode 100644
index 000000000..9e337f9fa
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate009.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate010.png b/gui/theme/portrait_hdpi/images/indeterminate010.png
new file mode 100644
index 000000000..7dbcd79ed
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate010.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate011.png b/gui/theme/portrait_hdpi/images/indeterminate011.png
new file mode 100644
index 000000000..ab67d38a4
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate011.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/indeterminate012.png b/gui/theme/portrait_hdpi/images/indeterminate012.png
new file mode 100644
index 000000000..ceadbb058
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/indeterminate012.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/kb_arrow_down.png b/gui/theme/portrait_hdpi/images/kb_arrow_down.png
new file mode 100644
index 000000000..ba3b90aeb
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/kb_arrow_down.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/kb_arrow_left.png b/gui/theme/portrait_hdpi/images/kb_arrow_left.png
new file mode 100644
index 000000000..c6d1fd67b
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/kb_arrow_left.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/kb_arrow_right.png b/gui/theme/portrait_hdpi/images/kb_arrow_right.png
new file mode 100644
index 000000000..be0f124df
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/kb_arrow_right.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/kb_arrow_up.png b/gui/theme/portrait_hdpi/images/kb_arrow_up.png
new file mode 100644
index 000000000..16d776549
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/kb_arrow_up.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/kb_hide.png b/gui/theme/portrait_hdpi/images/kb_hide.png
new file mode 100644
index 000000000..6fa9c6d4d
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/kb_hide.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/kb_show.png b/gui/theme/portrait_hdpi/images/kb_show.png
new file mode 100644
index 000000000..69a0eedee
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/kb_show.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/logo.png b/gui/theme/portrait_hdpi/images/logo.png
new file mode 100644
index 000000000..d311a2d6f
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/logo.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/main_button.png b/gui/theme/portrait_hdpi/images/main_button.png
new file mode 100644
index 000000000..b6ca36b9c
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/main_button.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/main_button_half_height.png b/gui/theme/portrait_hdpi/images/main_button_half_height.png
new file mode 100644
index 000000000..f8a526381
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/main_button_half_height.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/main_button_half_height_full_width.png b/gui/theme/portrait_hdpi/images/main_button_half_height_full_width.png
new file mode 100644
index 000000000..33a2a1aa2
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/main_button_half_height_full_width.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/progress_empty.png b/gui/theme/portrait_hdpi/images/progress_empty.png
new file mode 100644
index 000000000..6f7d65254
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/progress_empty.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/progress_fill.png b/gui/theme/portrait_hdpi/images/progress_fill.png
new file mode 100644
index 000000000..41ca3213b
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/progress_fill.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/radio_false.png b/gui/theme/portrait_hdpi/images/radio_false.png
new file mode 100644
index 000000000..213e2be23
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/radio_false.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/radio_true.png b/gui/theme/portrait_hdpi/images/radio_true.png
new file mode 100644
index 000000000..c8499b4de
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/radio_true.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/shift.png b/gui/theme/portrait_hdpi/images/shift.png
new file mode 100644
index 000000000..53de2e2d7
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/shift.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/shift_fill.png b/gui/theme/portrait_hdpi/images/shift_fill.png
new file mode 100644
index 000000000..bc8124708
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/shift_fill.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/slider.png b/gui/theme/portrait_hdpi/images/slider.png
new file mode 100644
index 000000000..f2d67998b
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/slider.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/slider_touch.png b/gui/theme/portrait_hdpi/images/slider_touch.png
new file mode 100644
index 000000000..1157c9b2c
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/slider_touch.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/slider_used.png b/gui/theme/portrait_hdpi/images/slider_used.png
new file mode 100644
index 000000000..3501ad1d0
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/slider_used.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/sort_asc.png b/gui/theme/portrait_hdpi/images/sort_asc.png
new file mode 100644
index 000000000..19f8483cf
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/sort_asc.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/sort_desc.png b/gui/theme/portrait_hdpi/images/sort_desc.png
new file mode 100644
index 000000000..160af06e4
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/sort_desc.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/sort_empty.png b/gui/theme/portrait_hdpi/images/sort_empty.png
new file mode 100644
index 000000000..4e2c53820
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/sort_empty.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/space.png b/gui/theme/portrait_hdpi/images/space.png
new file mode 100644
index 000000000..be39629ef
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/space.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/splashlogo.png b/gui/theme/portrait_hdpi/images/splashlogo.png
new file mode 100644
index 000000000..42f516c95
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/splashlogo.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/splashteamwin.png b/gui/theme/portrait_hdpi/images/splashteamwin.png
new file mode 100644
index 000000000..16a6d5994
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/splashteamwin.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_3.png b/gui/theme/portrait_hdpi/images/tab_3.png
new file mode 100644
index 000000000..0061b6bd8
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_3.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_4.png b/gui/theme/portrait_hdpi/images/tab_4.png
new file mode 100644
index 000000000..27a3e7199
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_4.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_display.png b/gui/theme/portrait_hdpi/images/tab_display.png
new file mode 100644
index 000000000..91e2014f9
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_display.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_general.png b/gui/theme/portrait_hdpi/images/tab_general.png
new file mode 100644
index 000000000..08a8f27eb
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_general.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_language.png b/gui/theme/portrait_hdpi/images/tab_language.png
new file mode 100644
index 000000000..a664e970e
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_language.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_timezone.png b/gui/theme/portrait_hdpi/images/tab_timezone.png
new file mode 100644
index 000000000..d270ebd47
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_timezone.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/tab_vibration.png b/gui/theme/portrait_hdpi/images/tab_vibration.png
new file mode 100644
index 000000000..a227fc908
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/tab_vibration.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/images/unlock_icon.png b/gui/theme/portrait_hdpi/images/unlock_icon.png
new file mode 100644
index 000000000..5865e931d
--- /dev/null
+++ b/gui/theme/portrait_hdpi/images/unlock_icon.png
Binary files differ
diff --git a/gui/theme/portrait_hdpi/splash.xml b/gui/theme/portrait_hdpi/splash.xml
new file mode 100644
index 000000000..93932b983
--- /dev/null
+++ b/gui/theme/portrait_hdpi/splash.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="1080" height="1920"/>
+ <author>TeamWin</author>
+ <title>TWRP</title>
+ <description>splash screen</description>
+ <themeversion>2</themeversion>
+ </details>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="52"/>
+ <image name="splashlogo" filename="splashlogo" retainaspect="1"/>
+ <image name="splashteamwin" filename="splashteamwin" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="screen_width" value="1080"/>
+ <variable name="screen_height" value="1920"/>
+ <variable name="background_color" value="#222222"/>
+ <variable name="header_color" value="#555555"/>
+ <variable name="accent_color" value="#0090CA"/>
+ </variables>
+
+ <pages>
+ <page name="splash">
+ <background color="%background_color%"/>
+
+ <fill color="%header_color%">
+ <placement x="0" y="0" w="%screen_width%" h="456"/>
+ </fill>
+
+ <image>
+ <image resource="splashlogo"/>
+ <placement x="540" y="456" placement="4"/>
+ </image>
+
+ <image>
+ <image resource="splashteamwin"/>
+ <placement x="540" y="1540" placement="4"/>
+ </image>
+
+ <text color="%header_color%">
+ <font resource="font_l"/>
+ <placement x="540" y="1590" placement="5"/>
+ <text>Recovery Project %tw_version%</text>
+ </text>
+ </page>
+ </pages>
+</recovery>
+
diff --git a/gui/theme/portrait_hdpi/ui.xml b/gui/theme/portrait_hdpi/ui.xml
new file mode 100644
index 000000000..4bce1465c
--- /dev/null
+++ b/gui/theme/portrait_hdpi/ui.xml
@@ -0,0 +1,639 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="1080" height="1920"/>
+ <author>TeamWin</author>
+ <title>Backup Naowz</title>
+ <description>Default basic theme</description>
+ <preview>preview.png</preview>
+ <themeversion>2</themeversion>
+ </details>
+
+ <include>
+ <xmlfile name="portrait.xml"/>
+ </include>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="54"/>
+ <font name="font_m" filename="RobotoCondensed-Regular.ttf" size="42"/>
+ <font name="font_s" filename="RobotoCondensed-Regular.ttf" size="36"/>
+ <font name="fixed" filename="DroidSansMono.ttf" size="30"/>
+
+ <font name="keylabel" filename="RobotoCondensed-Regular.ttf" size="64"/>
+ <font name="keylabel-small" filename="RobotoCondensed-Regular.ttf" size="46"/>
+ <font name="keylabel-longpress" filename="RobotoCondensed-Regular.ttf" size="32"/>
+
+ <image name="logo" filename="logo" retainaspect="1"/>
+ <image name="main_button" filename="main_button"/>
+ <image name="main_button_half_height" filename="main_button_half_height"/>
+ <image name="main_button_half_height_full_width" filename="main_button_half_height_full_width"/>
+ <image name="fab_selectfolder" filename="fab_selectfolder" retainaspect="1"/>
+ <image name="tab_3" filename="tab_3"/>
+ <image name="tab_4" filename="tab_4"/>
+ <image name="file" filename="file" retainaspect="1"/>
+ <image name="folder" filename="folder" retainaspect="1"/>
+ <image name="unlock_icon" filename="unlock_icon" retainaspect="1"/>
+ <image name="home" filename="home" retainaspect="1"/>
+ <image name="back" filename="back" retainaspect="1"/>
+ <image name="console" filename="console" retainaspect="1"/>
+ <image name="kb_hide" filename="kb_hide" retainaspect="1"/>
+ <image name="kb_show" filename="kb_show" retainaspect="1"/>
+ <image name="checkbox_false" filename="checkbox_false" retainaspect="1"/>
+ <image name="checkbox_true" filename="checkbox_true" retainaspect="1"/>
+ <image name="radio_false" filename="radio_false" retainaspect="1"/>
+ <image name="radio_true" filename="radio_true" retainaspect="1"/>
+ <image name="sort_asc" filename="sort_asc"/>
+ <image name="sort_desc" filename="sort_desc"/>
+ <image name="sort_empty" filename="sort_empty"/>
+ <animation name="progress" filename="indeterminate"/>
+ <image name="progress_empty" filename="progress_empty"/>
+ <image name="progress_full" filename="progress_fill"/>
+ <image name="slider" filename="slider"/>
+ <image name="slider_used" filename="slider_used"/>
+ <image name="slider_touch" filename="slider_touch"/>
+ <image name="handle" filename="handle"/>
+ <image name="cursor" filename="cursor" retainaspect="1"/>
+ <image name="tab_general" filename="tab_general" retainaspect="1"/>
+ <image name="tab_timezone" filename="tab_timezone" retainaspect="1"/>
+ <image name="tab_display" filename="tab_display" retainaspect="1"/>
+ <image name="tab_vibration" filename="tab_vibration" retainaspect="1"/>
+ <image name="tab_language" filename="tab_language" retainaspect="1"/>
+
+ <image name="backspace" filename="backspace" retainaspect="1"/>
+ <image name="enter" filename="enter" retainaspect="1"/>
+ <image name="shift" filename="shift" retainaspect="1"/>
+ <image name="shift_fill" filename="shift_fill" retainaspect="1"/>
+ <image name="space" filename="space" retainaspect="1"/>
+ <image name="kb_arrow_left" filename="kb_arrow_left" retainaspect="1"/>
+ <image name="kb_arrow_right" filename="kb_arrow_right" retainaspect="1"/>
+ <image name="kb_arrow_up" filename="kb_arrow_up" retainaspect="1"/>
+ <image name="kb_arrow_down" filename="kb_arrow_down" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="tw_samsung_navbar" value="0" persist="1"/>
+
+ <variable name="tw_hide_kb" value="0"/>
+ <variable name="screen_width" value="1080"/>
+ <variable name="screen_height" value="1920"/>
+ <variable name="status_height" value="72"/>
+ <variable name="header_height" value="256"/>
+ <variable name="navbar_height" value="130"/>
+ <variable name="content_width" value="1008"/>
+ <variable name="content_overlay_width" value="936"/>
+ <variable name="dialog_height" value="704"/>
+ <variable name="back_button_x" value="240"/>
+ <variable name="console_button_x" value="840"/>
+ <variable name="indent" value="36"/>
+ <variable name="col1_x_left" value="72"/>
+ <variable name="col1_x_header" value="184"/>
+ <variable name="center_x" value="540"/>
+ <variable name="col1_x_right" value="576"/>
+ <variable name="indent_right" value="1044"/>
+ <variable name="tab_height" value="96"/>
+ <variable name="tab_indicator_height" value="6"/>
+ <variable name="tab_y" value="304"/>
+ <variable name="tab3_width" value="360"/>
+ <variable name="tab4_width" value="270"/>
+ <variable name="tab5_width" value="216"/>
+ <variable name="tab3_col2_x" value="360"/>
+ <variable name="tab3_col3_x" value="720"/>
+ <variable name="tab4_col2_x" value="270"/>
+ <variable name="tab4_col4_x" value="810"/>
+ <variable name="tab5_col2_x" value="216"/>
+ <variable name="tab5_col3_x" value="432"/>
+ <variable name="tab5_col4_x" value="648"/>
+ <variable name="tab5_col5_x" value="864"/>
+ <variable name="tab5_centered_col1_x" value="108"/>
+ <variable name="tab5_centered_col2_x" value="324"/>
+ <variable name="tab5_centered_col4_x" value="756"/>
+ <variable name="tab5_centered_col5_x" value="972"/>
+ <variable name="btn3_col2_x" value="384"/>
+ <variable name="btn3_col3_x" value="732"/>
+ <variable name="btn4_col2_x" value="297"/>
+ <variable name="btn4_col3_x" value="558"/>
+ <variable name="btn4_col4_x" value="819"/>
+ <variable name="row1_header_y" value="4"/>
+ <variable name="row2_header_y" value="72"/>
+ <variable name="row3_header_y" value="90"/>
+ <variable name="row4_header_y" value="168"/>
+ <variable name="row1_y" value="256"/>
+ <variable name="row1a_y" value="288"/>
+ <variable name="row2_y" value="320"/>
+ <variable name="row2a_y" value="352"/>
+ <variable name="row_tab_y" value="346"/>
+ <variable name="row2_input_y" value="381"/>
+ <variable name="row3_y" value="384"/>
+ <variable name="row3_input_y" value="413"/>
+ <variable name="row3a_y" value="416"/>
+ <variable name="row4_y" value="448"/>
+ <variable name="row4_input_y" value="477"/>
+ <variable name="row4a_y" value="480"/>
+ <variable name="row5_y" value="512"/>
+ <variable name="row5a_y" value="544"/>
+ <variable name="row6_y" value="576"/>
+ <variable name="row6a_y" value="608"/>
+ <variable name="row7_y" value="640"/>
+ <variable name="row7a_y" value="672"/>
+ <variable name="row8_y" value="704"/>
+ <variable name="row8a_y" value="736"/>
+ <variable name="row9_y" value="768"/>
+ <variable name="row9a_y" value="800"/>
+ <variable name="row10_y" value="832"/>
+ <variable name="row10a_y" value="864"/>
+ <variable name="row11_y" value="896"/>
+ <variable name="row11a_y" value="928"/>
+ <variable name="row12_y" value="960"/>
+ <variable name="row12a_y" value="992"/>
+ <variable name="row13_y" value="1024"/>
+ <variable name="row13a_y" value="1056"/>
+ <variable name="row14_y" value="1088"/>
+ <variable name="row14a_y" value="1120"/>
+ <variable name="row15_y" value="1152"/>
+ <variable name="row15a_y" value="1184"/>
+ <variable name="row16_y" value="1216"/>
+ <variable name="row16a_y" value="1248"/>
+ <variable name="row17_y" value="1280"/>
+ <variable name="row17a_y" value="1312"/>
+ <variable name="row18_y" value="1344"/>
+ <variable name="row18a_y" value="1376"/>
+ <variable name="row19_y" value="1408"/>
+ <variable name="row19a_y" value="1440"/>
+ <variable name="row20_y" value="1472"/>
+ <variable name="row20a_y" value="1504"/>
+ <variable name="row21_y" value="1536"/>
+ <variable name="row21a_y" value="1568"/>
+ <variable name="row22_y" value="1600"/>
+ <variable name="row22a_y" value="1632"/>
+ <variable name="row23_y" value="1664"/>
+ <variable name="row23a_y" value="1696"/>
+ <variable name="row24_y" value="1728"/>
+ <variable name="row24a_y" value="1760"/>
+ <variable name="row25_y" value="1792"/>
+ <variable name="navbar_y" value="1792"/>
+ <variable name="navbar_btn_y" value="1856"/>
+ <variable name="keyboard_y" value="1149"/>
+ <variable name="keyboard_terminal_y" value="1053"/>
+ <variable name="background_color" value="#1A1A1A"/>
+ <variable name="accent_color" value="#0090CA"/>
+ <variable name="accent_color_semitransparent" value="#0090CA30"/>
+ <variable name="text_color" value="#EEEEEE"/>
+ <variable name="text_button_color" value="#EEEEEE"/>
+ <variable name="text_success_color" value="#76FF03"/>
+ <variable name="text_fail_color" value="#FF0101"/>
+ <variable name="highlight_color" value="#1A1A1A80"/>
+ <variable name="caps_highlight_color" value="#22222280"/>
+ <variable name="transparent" value="#00000000"/>
+ <variable name="semi_transparent" value="#00000099"/>
+ <variable name="warning" value="#F8F8A0"/>
+ <variable name="error" value="#FF0101"/>
+ <variable name="highlight" value="#0090CA"/>
+ <variable name="fileselector_linecolor" value="#555555"/>
+ <variable name="fileselector_highlight_color" value="#555555"/>
+ <variable name="fileselector_separatorheight" value="2"/>
+ <variable name="fileselector_spacing" value="0"/>
+ <variable name="fileselector_install_height" value="1152"/>
+ <variable name="fileselector_filemanager_height" value="1376"/>
+ <variable name="partitionlist_spacing" value="0"/>
+ <variable name="partitionlist_storage_height" value="544"/>
+ <variable name="partitionlist_flashimage_height" value="544"/>
+ <variable name="partitionlist_wipe_height" value="1088"/>
+ <variable name="partitionlist_mount_height" value="832"/>
+ <variable name="partitionlist_backup_height" value="768"/>
+ <variable name="listbox_timezone_height" value="756"/>
+ <variable name="listbox_settings_height" value="960"/>
+ <variable name="fastscroll_w" value="24"/>
+ <variable name="fastscroll_linew" value="2"/>
+ <variable name="fastscroll_rectw" value="24"/>
+ <variable name="fastscroll_recth" value="108"/>
+ <variable name="slidervalue_lineh" value="3"/>
+ <variable name="slidervalue_padding" value="0"/>
+ <variable name="slidervalue_sliderw" value="72"/>
+ <variable name="slidervalue_sliderh" value="108"/>
+ <variable name="slideout_height" value="1686"/>
+ <variable name="slideout_bg_height" value="1720"/>
+ <variable name="input_height" value="64"/>
+ <variable name="input_line_width" value="3"/>
+ <variable name="console_height" value="960"/>
+ <variable name="console_terminal_height" value="950"/>
+ <variable name="dialog_button_x" value="696"/>
+ <variable name="pattern_x" value="126"/>
+ <variable name="pattern_dot_dia" value="32"/>
+ <variable name="pattern_line_w" value="12"/>
+ <variable name="pattern_size" value="828"/>
+ </variables>
+
+ <mousecursor>
+ <placement w="15" h="15"/>
+ <background color="#FFFF00FF" resource="cursor"/>
+ <speed multiplier="2.5"/>
+ </mousecursor>
+
+ <templates>
+ <template name="page">
+ <background color="%background_color%"/>
+
+ <fill color="%accent_color%">
+ <placement x="0" y="0" w="%screen_width%" h="%header_height%"/>
+ </fill>
+
+ <image>
+ <condition var1="tw_busy" var2="1"/>
+ <image resource="logo"/>
+ <placement x="0" y="0"/>
+ </image>
+
+ <button>
+ <condition var1="tw_busy" var2="0"/>
+ <placement x="0" y="0"/>
+ <image resource="logo"/>
+ <action function="key">home</action>
+ </button>
+
+ <fill color="#00000030">
+ <condition var1="tw_simulate_actions" var2="0"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="1"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>%tw_version%</text>
+ </text>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%center_x%" y="%row1_header_y%" placement="5"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <text color="%text_color%">
+ <conditions>
+ <condition var1="tw_no_battery_percent" var2="0"/>
+ <condition var1="tw_battery" op="&gt;" var2="0"/>
+ <condition var1="tw_battery" op="&lt;" var2="101"/>
+ </conditions>
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
+ </text>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </template>
+
+ <template name="progress_bar">
+ <progressbar>
+ <placement x="%indent%" y="%row17a_y%"/>
+ <resource empty="progress_empty" full="progress_full"/>
+ <data name="ui_progress"/>
+ </progressbar>
+
+ <animation>
+ <placement x="%indent%" y="%row17a_y%"/>
+ <resource name="progress"/>
+ <speed fps="24" render="2"/>
+ <loop frame="1"/>
+ </animation>
+ </template>
+
+ <template name="sort_options">
+ <image>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <image resource="tab_3"/>
+ </image>
+
+ <image>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <image resource="tab_3"/>
+ </image>
+
+ <image>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <image resource="tab_3"/>
+ </image>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="1"/>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_name_only=Name}</text>
+ <image resource="sort_asc"/>
+ <action function="set">tw_gui_sort_order=-1</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="-1"/>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_name_only=Name}</text>
+ <image resource="sort_desc"/>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="1"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-1"/>
+ </conditions>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_name_only=Name}</text>
+ <image resource="sort_empty"/>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="2"/>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_date_only=Date}</text>
+ <image resource="sort_asc"/>
+ <action function="set">tw_gui_sort_order=-2</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="-2"/>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_date_only=Date}</text>
+ <image resource="sort_desc"/>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="2"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-2"/>
+ </conditions>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_date_only=Date}</text>
+ <image resource="sort_empty"/>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="3"/>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_size_only=Size}</text>
+ <image resource="sort_asc"/>
+ <action function="set">tw_gui_sort_order=-3</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="-3"/>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_size_only=Size}</text>
+ <image resource="sort_desc"/>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="3"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-3"/>
+ </conditions>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_size_only=Size}</text>
+ <image resource="sort_empty"/>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+ </template>
+
+ <template name="tabs_backup">
+ <fill color="%accent_color%">
+ <placement x="0" y="row1_y" w="%screen_width%" h="tab_height"/>
+ </fill>
+
+ <button style="tab">
+ <placement x="0" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@tab_backup=BACKUP}</text>
+ <action function="page">backup</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab3_col2_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@tab_options=OPTIONS}</text>
+ <action function="page">backup_options</action>
+ </button>
+ </template>
+
+ <template name="tabs_settings">
+ <fill color="%accent_color%">
+ <placement x="0" y="row1_y" w="%screen_width%" h="tab_height"/>
+ </fill>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col1_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_general"/>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col2_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_timezone"/>
+ <action function="page">settings_timezone</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%center_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_display"/>
+ <action function="page">settings_screen</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col4_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_vibration"/>
+ <action function="page">settings_vibration</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col5_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_language"/>
+ <action function="page">settings_language</action>
+ </button>
+ </template>
+
+ <template name="console">
+ <console>
+ <placement x="%indent%" y="%row2_y%" w="%content_width%" h="%console_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row2_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row17_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="console_terminal">
+ <console>
+ <placement x="%indent%" y="%row2_y%" w="content_width" h="%console_terminal_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row2_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row11_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="keyboardterminaltemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%keyboard_terminal_y%" w="%screen_width%" h="96"/>
+ <keymargin x="0" y="0"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="12" y="0"/>
+ <keylabel key="0:k:29" text="Ctrl"/>
+ <keylabel key="0:c:27" text="Esc"/>
+ <keylabel key="0:c:9" text="Tab"/>
+ <keylabel key="0:k:105" text="&lt;" resource="kb_arrow_left"/>
+ <keylabel key="0:k:108" text="v" resource="kb_arrow_down"/>
+ <keylabel key="0:k:103" text="^" resource="kb_arrow_up"/>
+ <keylabel key="0:k:106" text="&gt;" resource="kb_arrow_right"/>
+ <highlight color="%highlight_color%"/>
+ <ctrlhighlight color="#0090CA80"/>
+ <layout1>
+ <keysize height="96" width="154"/>
+ <row1 key01="155:k:29" key02="155:c:27" long02=":c:3" key03="154:c:9" key04="154:k:105" key05="154:k:108" key06="154:k:103" key07="154:k:106"/>
+ </layout1>
+ </keyboard>
+ </template>
+
+ <template name="keyboardtemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%keyboard_y%" w="1080" h="644"/>
+ <keymargin x="8" y="8"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="12" y="0"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace"/>
+ <keylabel key="0:action" text="Enter" resource="enter"/>
+ <keylabel key=" " text="Space" resource="space"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <layout1>
+ <keysize height="161" width="108"/>
+ <row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0"/>
+ <row2 key01="54:" key02="a" long02="@" key03="s" long03="#" key04="d" long04="$" key05="f" long05="%" key06="g" long06="&amp;" key07="h" long07="*" key08="j" long08="-" key09="k" long09="+" key10="l" long10="_" key11="54:"/>
+ <row3 key01="162:layout2" key02="z" long02="!" key03="x" long03="&quot;" key04="c" long04="'" key05="v" long05=":" key06="b" long06=";" key07="n" long07="/" key08="m" long08="?" key09="162:c:8"/>
+ <row4 key01="162:layout3" key02="/" key03="540: " key04="." key05="162:action"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="161" width="108" capslock="0" revert_layout="1"/>
+ <row1 key01="Q" long01="1" key02="W" long02="2" key03="E" long03="3" key04="R" long04="4" key05="T" long05="5" key06="Y" long06="6" key07="U" long07="7" key08="I" long08="8" key09="O" long09="9" key10="P" long10="0"/>
+ <row2 key01="54:" key02="A" long02="@" key03="S" long03="#" key04="D" long04="$" key05="F" long05="%" key06="G" long06="&amp;" key07="H" long07="*" key08="J" long08="-" key09="K" long09="+" key10="L" long10="_" key11="54:"/>
+ <row3 key01="162:layout1" key02="Z" long02="!" key03="X" long03="&quot;" key04="C" long04="'" key05="V" long05=":" key06="B" long06=";" key07="N" long07="/" key08="M" long08="?" key09="162:c:8"/>
+ <row4 key01="162:layout3" key02="/" key03="540: " key04="." key05="162:action"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="161" width="108"/>
+ <row1 key01="1" key02="2" key03="3" key04="4" key05="5" key06="6" key07="7" key08="8" key09="9" key10="0"/>
+ <row2 key01="@" key02="#" key03="$" key04="%" key05="&amp;" key06="*" key07="-" key08="+" key09="(" key10=")"/>
+ <row3 key01="162:layout4" key02="!" key03="108:c:34" key04="'" key05=":" key06=";" key07="/" key08="?" key09="162:c:8"/>
+ <row4 key01="162:layout1" key02="," key03="540: " key04="." key05="162:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="161" width="108"/>
+ <row1 key01="~" key02="`" key03="|" key04="108:" key05="108:" key06="108:" key07="%" key08="108:" key09="{" key10="}"/>
+ <row2 key01="108:" key02="108:" key03="108:" key04="108:" key05="108:" key06="^" key07="_" key08="=" key09="[" key10="]"/>
+ <row3 key01="162:layout3" key02="108:" key03="108:" key04="108:" key05="108:" key06="\" key07="&lt;" key08="&gt;" key09="162:c:8"/>
+ <row4 key01="162:layout1" key02="108:c:34" key03="540: " key04="." key05="162:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+ </templates>
+</recovery>
diff --git a/gui/theme/portrait_mdpi/images/back.png b/gui/theme/portrait_mdpi/images/back.png
new file mode 100644
index 000000000..67182bf3b
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/back.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/backspace.png b/gui/theme/portrait_mdpi/images/backspace.png
new file mode 100644
index 000000000..f7d75db15
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/backspace.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/checkbox_false.png b/gui/theme/portrait_mdpi/images/checkbox_false.png
new file mode 100644
index 000000000..0fd57c151
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/checkbox_false.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/checkbox_true.png b/gui/theme/portrait_mdpi/images/checkbox_true.png
new file mode 100644
index 000000000..5a286f327
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/checkbox_true.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/console.png b/gui/theme/portrait_mdpi/images/console.png
new file mode 100644
index 000000000..7223548d2
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/console.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/cursor.png b/gui/theme/portrait_mdpi/images/cursor.png
new file mode 100644
index 000000000..0c9ae5ced
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/cursor.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/enter.png b/gui/theme/portrait_mdpi/images/enter.png
new file mode 100644
index 000000000..1132d643b
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/enter.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/fab_selectfolder.png b/gui/theme/portrait_mdpi/images/fab_selectfolder.png
new file mode 100644
index 000000000..c9470eb2b
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/fab_selectfolder.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/file.png b/gui/theme/portrait_mdpi/images/file.png
new file mode 100644
index 000000000..3d17f151d
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/file.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/folder.png b/gui/theme/portrait_mdpi/images/folder.png
new file mode 100644
index 000000000..d9d67f390
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/folder.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/handle.png b/gui/theme/portrait_mdpi/images/handle.png
new file mode 100644
index 000000000..e376523ed
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/handle.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/home.png b/gui/theme/portrait_mdpi/images/home.png
new file mode 100644
index 000000000..199602bc4
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/home.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate001.png b/gui/theme/portrait_mdpi/images/indeterminate001.png
new file mode 100644
index 000000000..d3a3e1f16
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate001.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate002.png b/gui/theme/portrait_mdpi/images/indeterminate002.png
new file mode 100644
index 000000000..975d4f351
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate002.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate003.png b/gui/theme/portrait_mdpi/images/indeterminate003.png
new file mode 100644
index 000000000..12e165c3f
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate003.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate004.png b/gui/theme/portrait_mdpi/images/indeterminate004.png
new file mode 100644
index 000000000..3aa60624b
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate004.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate005.png b/gui/theme/portrait_mdpi/images/indeterminate005.png
new file mode 100644
index 000000000..8b31bbeff
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate005.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate006.png b/gui/theme/portrait_mdpi/images/indeterminate006.png
new file mode 100644
index 000000000..a7dc4e1e8
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate006.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate007.png b/gui/theme/portrait_mdpi/images/indeterminate007.png
new file mode 100644
index 000000000..213160fdf
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate007.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate008.png b/gui/theme/portrait_mdpi/images/indeterminate008.png
new file mode 100644
index 000000000..8c63de217
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate008.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate009.png b/gui/theme/portrait_mdpi/images/indeterminate009.png
new file mode 100644
index 000000000..c90e3e052
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate009.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate010.png b/gui/theme/portrait_mdpi/images/indeterminate010.png
new file mode 100644
index 000000000..43fd2715f
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate010.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate011.png b/gui/theme/portrait_mdpi/images/indeterminate011.png
new file mode 100644
index 000000000..34b13f439
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate011.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/indeterminate012.png b/gui/theme/portrait_mdpi/images/indeterminate012.png
new file mode 100644
index 000000000..ee93701a3
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/indeterminate012.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/kb_arrow_down.png b/gui/theme/portrait_mdpi/images/kb_arrow_down.png
new file mode 100644
index 000000000..79071b1c6
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/kb_arrow_down.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/kb_arrow_left.png b/gui/theme/portrait_mdpi/images/kb_arrow_left.png
new file mode 100644
index 000000000..c44a87348
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/kb_arrow_left.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/kb_arrow_right.png b/gui/theme/portrait_mdpi/images/kb_arrow_right.png
new file mode 100644
index 000000000..9b4a91816
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/kb_arrow_right.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/kb_arrow_up.png b/gui/theme/portrait_mdpi/images/kb_arrow_up.png
new file mode 100644
index 000000000..c55d21ec1
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/kb_arrow_up.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/kb_hide.png b/gui/theme/portrait_mdpi/images/kb_hide.png
new file mode 100644
index 000000000..4c1a3bf26
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/kb_hide.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/kb_show.png b/gui/theme/portrait_mdpi/images/kb_show.png
new file mode 100644
index 000000000..3ec3fe71c
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/kb_show.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/logo.png b/gui/theme/portrait_mdpi/images/logo.png
new file mode 100644
index 000000000..6a8be5f85
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/logo.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/main_button.png b/gui/theme/portrait_mdpi/images/main_button.png
new file mode 100644
index 000000000..a4b5b6160
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/main_button.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/main_button_half_height.png b/gui/theme/portrait_mdpi/images/main_button_half_height.png
new file mode 100644
index 000000000..964c33b15
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/main_button_half_height.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/main_button_half_height_full_width.png b/gui/theme/portrait_mdpi/images/main_button_half_height_full_width.png
new file mode 100644
index 000000000..70b8f27be
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/main_button_half_height_full_width.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/progress_empty.png b/gui/theme/portrait_mdpi/images/progress_empty.png
new file mode 100644
index 000000000..6f04b81ef
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/progress_empty.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/progress_fill.png b/gui/theme/portrait_mdpi/images/progress_fill.png
new file mode 100644
index 000000000..6744d3e56
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/progress_fill.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/radio_false.png b/gui/theme/portrait_mdpi/images/radio_false.png
new file mode 100644
index 000000000..f7167a35d
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/radio_false.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/radio_true.png b/gui/theme/portrait_mdpi/images/radio_true.png
new file mode 100644
index 000000000..cd12eb4dc
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/radio_true.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/shift.png b/gui/theme/portrait_mdpi/images/shift.png
new file mode 100644
index 000000000..0d99d5a2c
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/shift.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/shift_fill.png b/gui/theme/portrait_mdpi/images/shift_fill.png
new file mode 100644
index 000000000..88ed853a2
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/shift_fill.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/slider.png b/gui/theme/portrait_mdpi/images/slider.png
new file mode 100644
index 000000000..0a407d958
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/slider.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/slider_touch.png b/gui/theme/portrait_mdpi/images/slider_touch.png
new file mode 100644
index 000000000..e22d41434
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/slider_touch.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/slider_used.png b/gui/theme/portrait_mdpi/images/slider_used.png
new file mode 100644
index 000000000..e4f529315
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/slider_used.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/sort_asc.png b/gui/theme/portrait_mdpi/images/sort_asc.png
new file mode 100644
index 000000000..2be68c835
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/sort_asc.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/sort_desc.png b/gui/theme/portrait_mdpi/images/sort_desc.png
new file mode 100644
index 000000000..26186c587
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/sort_desc.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/sort_empty.png b/gui/theme/portrait_mdpi/images/sort_empty.png
new file mode 100644
index 000000000..b9dc56c15
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/sort_empty.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/space.png b/gui/theme/portrait_mdpi/images/space.png
new file mode 100644
index 000000000..51599af5b
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/space.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/splashlogo.png b/gui/theme/portrait_mdpi/images/splashlogo.png
new file mode 100644
index 000000000..daac29442
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/splashlogo.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/splashteamwin.png b/gui/theme/portrait_mdpi/images/splashteamwin.png
new file mode 100644
index 000000000..d2fad9cc4
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/splashteamwin.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_3.png b/gui/theme/portrait_mdpi/images/tab_3.png
new file mode 100644
index 000000000..65d2ae690
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_3.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_4.png b/gui/theme/portrait_mdpi/images/tab_4.png
new file mode 100644
index 000000000..65d2ae690
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_4.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_display.png b/gui/theme/portrait_mdpi/images/tab_display.png
new file mode 100644
index 000000000..cbd3314c6
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_display.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_general.png b/gui/theme/portrait_mdpi/images/tab_general.png
new file mode 100644
index 000000000..c953926fa
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_general.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_language.png b/gui/theme/portrait_mdpi/images/tab_language.png
new file mode 100644
index 000000000..ba01efab7
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_language.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_timezone.png b/gui/theme/portrait_mdpi/images/tab_timezone.png
new file mode 100644
index 000000000..298993d9f
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_timezone.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/tab_vibration.png b/gui/theme/portrait_mdpi/images/tab_vibration.png
new file mode 100644
index 000000000..3117f3beb
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/tab_vibration.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/images/unlock_icon.png b/gui/theme/portrait_mdpi/images/unlock_icon.png
new file mode 100644
index 000000000..d19b8e4bb
--- /dev/null
+++ b/gui/theme/portrait_mdpi/images/unlock_icon.png
Binary files differ
diff --git a/gui/theme/portrait_mdpi/splash.xml b/gui/theme/portrait_mdpi/splash.xml
new file mode 100644
index 000000000..80338eb82
--- /dev/null
+++ b/gui/theme/portrait_mdpi/splash.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="480" height="800"/>
+ <author>TeamWin</author>
+ <title>TWRP</title>
+ <description>splash screen</description>
+ <themeversion>2</themeversion>
+ </details>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="24"/>
+ <image name="splashlogo" filename="splashlogo" retainaspect="1"/>
+ <image name="splashteamwin" filename="splashteamwin" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="screen_width" value="480"/>
+ <variable name="screen_height" value="800"/>
+ <variable name="background_color" value="#222222"/>
+ <variable name="header_color" value="#555555"/>
+ <variable name="accent_color" value="#0090CA"/>
+ </variables>
+
+ <pages>
+ <page name="splash">
+ <background color="%background_color%"/>
+
+ <fill color="%header_color%">
+ <placement x="0" y="0" w="%screen_width%" h="200"/>
+ </fill>
+
+ <image>
+ <image resource="splashlogo"/>
+ <placement x="240" y="200" placement="4"/>
+ </image>
+
+ <image>
+ <image resource="splashteamwin"/>
+ <placement x="240" y="660" placement="4"/>
+ </image>
+
+ <text color="%header_color%">
+ <font resource="font_l"/>
+ <placement x="240" y="680" placement="5"/>
+ <text>Recovery Project %tw_version%</text>
+ </text>
+ </page>
+ </pages>
+</recovery>
+
diff --git a/gui/theme/portrait_mdpi/ui.xml b/gui/theme/portrait_mdpi/ui.xml
new file mode 100644
index 000000000..94c142863
--- /dev/null
+++ b/gui/theme/portrait_mdpi/ui.xml
@@ -0,0 +1,639 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="480" height="800"/>
+ <author>TeamWin</author>
+ <title>Backup Naowz</title>
+ <description>Default basic theme</description>
+ <preview>preview.png</preview>
+ <themeversion>2</themeversion>
+ </details>
+
+ <include>
+ <xmlfile name="portrait.xml"/>
+ </include>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="24"/>
+ <font name="font_m" filename="RobotoCondensed-Regular.ttf" size="18"/>
+ <font name="font_s" filename="RobotoCondensed-Regular.ttf" size="14"/>
+ <font name="fixed" filename="DroidSansMono.ttf" size="12"/>
+
+ <font name="keylabel" filename="RobotoCondensed-Regular.ttf" size="30"/>
+ <font name="keylabel-small" filename="RobotoCondensed-Regular.ttf" size="20"/>
+ <font name="keylabel-longpress" filename="RobotoCondensed-Regular.ttf" size="14"/>
+
+ <image name="logo" filename="logo" retainaspect="1"/>
+ <image name="main_button" filename="main_button"/>
+ <image name="main_button_half_height" filename="main_button_half_height"/>
+ <image name="main_button_half_height_full_width" filename="main_button_half_height_full_width"/>
+ <image name="fab_selectfolder" filename="fab_selectfolder" retainaspect="1"/>
+ <image name="tab_3" filename="tab_3"/>
+ <image name="tab_4" filename="tab_4"/>
+ <image name="file" filename="file" retainaspect="1"/>
+ <image name="folder" filename="folder" retainaspect="1"/>
+ <image name="unlock_icon" filename="unlock_icon" retainaspect="1"/>
+ <image name="home" filename="home" retainaspect="1"/>
+ <image name="back" filename="back" retainaspect="1"/>
+ <image name="console" filename="console" retainaspect="1"/>
+ <image name="kb_hide" filename="kb_hide" retainaspect="1"/>
+ <image name="kb_show" filename="kb_show" retainaspect="1"/>
+ <image name="checkbox_false" filename="checkbox_false" retainaspect="1"/>
+ <image name="checkbox_true" filename="checkbox_true" retainaspect="1"/>
+ <image name="radio_false" filename="radio_false" retainaspect="1"/>
+ <image name="radio_true" filename="radio_true" retainaspect="1"/>
+ <image name="sort_asc" filename="sort_asc"/>
+ <image name="sort_desc" filename="sort_desc"/>
+ <image name="sort_empty" filename="sort_empty"/>
+ <animation name="progress" filename="indeterminate"/>
+ <image name="progress_empty" filename="progress_empty"/>
+ <image name="progress_full" filename="progress_fill"/>
+ <image name="slider" filename="slider"/>
+ <image name="slider_used" filename="slider_used"/>
+ <image name="slider_touch" filename="slider_touch"/>
+ <image name="handle" filename="handle"/>
+ <image name="cursor" filename="cursor" retainaspect="1"/>
+ <image name="tab_general" filename="tab_general" retainaspect="1"/>
+ <image name="tab_timezone" filename="tab_timezone" retainaspect="1"/>
+ <image name="tab_display" filename="tab_display" retainaspect="1"/>
+ <image name="tab_vibration" filename="tab_vibration" retainaspect="1"/>
+ <image name="tab_language" filename="tab_language" retainaspect="1"/>
+
+ <image name="backspace" filename="backspace" retainaspect="1"/>
+ <image name="enter" filename="enter" retainaspect="1"/>
+ <image name="shift" filename="shift" retainaspect="1"/>
+ <image name="shift_fill" filename="shift_fill" retainaspect="1"/>
+ <image name="space" filename="space" retainaspect="1"/>
+ <image name="kb_arrow_left" filename="kb_arrow_left" retainaspect="1"/>
+ <image name="kb_arrow_right" filename="kb_arrow_right" retainaspect="1"/>
+ <image name="kb_arrow_up" filename="kb_arrow_up" retainaspect="1"/>
+ <image name="kb_arrow_down" filename="kb_arrow_down" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="tw_samsung_navbar" value="0" persist="1"/>
+
+ <variable name="tw_hide_kb" value="0"/>
+ <variable name="screen_width" value="480"/>
+ <variable name="screen_height" value="800"/>
+ <variable name="status_height" value="30"/>
+ <variable name="header_height" value="110"/>
+ <variable name="navbar_height" value="52"/>
+ <variable name="content_width" value="450"/>
+ <variable name="content_overlay_width" value="420"/>
+ <variable name="dialog_height" value="286"/>
+ <variable name="back_button_x" value="105"/>
+ <variable name="console_button_x" value="375"/>
+ <variable name="indent" value="15"/>
+ <variable name="col1_x_left" value="30"/>
+ <variable name="col1_x_header" value="82"/>
+ <variable name="center_x" value="240"/>
+ <variable name="col1_x_right" value="255"/>
+ <variable name="indent_right" value="465"/>
+ <variable name="tab_height" value="40"/>
+ <variable name="tab_indicator_height" value="3"/>
+ <variable name="tab_y" value="130"/>
+ <variable name="tab3_width" value="160"/>
+ <variable name="tab4_width" value="120"/>
+ <variable name="tab5_width" value="96"/>
+ <variable name="tab3_col2_x" value="160"/>
+ <variable name="tab3_col3_x" value="320"/>
+ <variable name="tab4_col2_x" value="120"/>
+ <variable name="tab4_col4_x" value="360"/>
+ <variable name="tab5_col2_x" value="96"/>
+ <variable name="tab5_col3_x" value="192"/>
+ <variable name="tab5_col4_x" value="288"/>
+ <variable name="tab5_col5_x" value="384"/>
+ <variable name="tab5_centered_col1_x" value="48"/>
+ <variable name="tab5_centered_col2_x" value="144"/>
+ <variable name="tab5_centered_col4_x" value="336"/>
+ <variable name="tab5_centered_col5_x" value="432"/>
+ <variable name="btn3_col2_x" value="170"/>
+ <variable name="btn3_col3_x" value="325"/>
+ <variable name="btn4_col2_x" value="131"/>
+ <variable name="btn4_col3_x" value="247"/>
+ <variable name="btn4_col4_x" value="363"/>
+ <variable name="row1_header_y" value="2"/>
+ <variable name="row2_header_y" value="30"/>
+ <variable name="row3_header_y" value="40"/>
+ <variable name="row4_header_y" value="74"/>
+ <variable name="row1_y" value="110"/>
+ <variable name="row1a_y" value="123"/>
+ <variable name="row2_y" value="136"/>
+ <variable name="row2a_y" value="149"/>
+ <variable name="row_tab_y" value="147"/>
+ <variable name="row2_input_y" value="162"/>
+ <variable name="row3_y" value="162"/>
+ <variable name="row3_input_y" value="175"/>
+ <variable name="row3a_y" value="175"/>
+ <variable name="row4_y" value="188"/>
+ <variable name="row4_input_y" value="201"/>
+ <variable name="row4a_y" value="201"/>
+ <variable name="row5_y" value="214"/>
+ <variable name="row5a_y" value="227"/>
+ <variable name="row6_y" value="240"/>
+ <variable name="row6a_y" value="253"/>
+ <variable name="row7_y" value="266"/>
+ <variable name="row7a_y" value="279"/>
+ <variable name="row8_y" value="292"/>
+ <variable name="row8a_y" value="305"/>
+ <variable name="row9_y" value="318"/>
+ <variable name="row9a_y" value="331"/>
+ <variable name="row10_y" value="344"/>
+ <variable name="row10a_y" value="357"/>
+ <variable name="row11_y" value="370"/>
+ <variable name="row11a_y" value="383"/>
+ <variable name="row12_y" value="396"/>
+ <variable name="row12a_y" value="409"/>
+ <variable name="row13_y" value="422"/>
+ <variable name="row13a_y" value="435"/>
+ <variable name="row14_y" value="448"/>
+ <variable name="row14a_y" value="461"/>
+ <variable name="row15_y" value="474"/>
+ <variable name="row15a_y" value="487"/>
+ <variable name="row16_y" value="500"/>
+ <variable name="row16a_y" value="513"/>
+ <variable name="row17_y" value="526"/>
+ <variable name="row17a_y" value="539"/>
+ <variable name="row18_y" value="552"/>
+ <variable name="row18a_y" value="565"/>
+ <variable name="row19_y" value="578"/>
+ <variable name="row19a_y" value="591"/>
+ <variable name="row20_y" value="604"/>
+ <variable name="row20a_y" value="617"/>
+ <variable name="row21_y" value="630"/>
+ <variable name="row21a_y" value="643"/>
+ <variable name="row22_y" value="656"/>
+ <variable name="row22a_y" value="669"/>
+ <variable name="row23_y" value="682"/>
+ <variable name="row23a_y" value="695"/>
+ <variable name="row24_y" value="708"/>
+ <variable name="row24a_y" value="721"/>
+ <variable name="row25_y" value="734"/>
+ <variable name="navbar_y" value="748"/>
+ <variable name="navbar_btn_y" value="774"/>
+ <variable name="keyboard_y" value="464"/>
+ <variable name="keyboard_terminal_y" value="422"/>
+ <variable name="background_color" value="#1A1A1A"/>
+ <variable name="accent_color" value="#0090CA"/>
+ <variable name="accent_color_semitransparent" value="#0090CA30"/>
+ <variable name="text_color" value="#EEEEEE"/>
+ <variable name="text_button_color" value="#EEEEEE"/>
+ <variable name="text_success_color" value="#76FF03"/>
+ <variable name="text_fail_color" value="#FF0101"/>
+ <variable name="highlight_color" value="#1A1A1A80"/>
+ <variable name="caps_highlight_color" value="#22222280"/>
+ <variable name="transparent" value="#00000000"/>
+ <variable name="semi_transparent" value="#00000099"/>
+ <variable name="warning" value="#F8F8A0"/>
+ <variable name="error" value="#FF0101"/>
+ <variable name="highlight" value="#0090CA"/>
+ <variable name="fileselector_linecolor" value="#555555"/>
+ <variable name="fileselector_highlight_color" value="#555555"/>
+ <variable name="fileselector_separatorheight" value="1"/>
+ <variable name="fileselector_spacing" value="0"/>
+ <variable name="fileselector_install_height" value="468"/>
+ <variable name="fileselector_filemanager_height" value="559"/>
+ <variable name="partitionlist_spacing" value="0"/>
+ <variable name="partitionlist_storage_height" value="221"/>
+ <variable name="partitionlist_flashimage_height" value="221"/>
+ <variable name="partitionlist_wipe_height" value="442"/>
+ <variable name="partitionlist_mount_height" value="338"/>
+ <variable name="partitionlist_backup_height" value="312"/>
+ <variable name="listbox_timezone_height" value="306"/>
+ <variable name="listbox_settings_height" value="400"/>
+ <variable name="fastscroll_w" value="10"/>
+ <variable name="fastscroll_linew" value="2"/>
+ <variable name="fastscroll_rectw" value="10"/>
+ <variable name="fastscroll_recth" value="52"/>
+ <variable name="slidervalue_lineh" value="2"/>
+ <variable name="slidervalue_padding" value="0"/>
+ <variable name="slidervalue_sliderw" value="32"/>
+ <variable name="slidervalue_sliderh" value="48"/>
+ <variable name="slideout_height" value="700"/>
+ <variable name="slideout_bg_height" value="718"/>
+ <variable name="input_height" value="26"/>
+ <variable name="input_line_width" value="2"/>
+ <variable name="console_height" value="390"/>
+ <variable name="console_terminal_height" value="369"/>
+ <variable name="dialog_button_x" value="310"/>
+ <variable name="pattern_x" value="60"/>
+ <variable name="pattern_dot_dia" value="12"/>
+ <variable name="pattern_line_w" value="4"/>
+ <variable name="pattern_size" value="360"/>
+ </variables>
+
+ <mousecursor>
+ <placement w="15" h="15"/>
+ <background color="#FFFF00FF" resource="cursor"/>
+ <speed multiplier="2.5"/>
+ </mousecursor>
+
+ <templates>
+ <template name="page">
+ <background color="%background_color%"/>
+
+ <fill color="%accent_color%">
+ <placement x="0" y="0" w="%screen_width%" h="%header_height%"/>
+ </fill>
+
+ <image>
+ <condition var1="tw_busy" var2="1"/>
+ <image resource="logo"/>
+ <placement x="0" y="0"/>
+ </image>
+
+ <button>
+ <condition var1="tw_busy" var2="0"/>
+ <placement x="0" y="0"/>
+ <image resource="logo"/>
+ <action function="key">home</action>
+ </button>
+
+ <fill color="#00000030">
+ <condition var1="tw_simulate_actions" var2="0"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="1"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>%tw_version%</text>
+ </text>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%center_x%" y="%row1_header_y%" placement="5"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <text color="%text_color%">
+ <conditions>
+ <condition var1="tw_no_battery_percent" var2="0"/>
+ <condition var1="tw_battery" op="&gt;" var2="0"/>
+ <condition var1="tw_battery" op="&lt;" var2="101"/>
+ </conditions>
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
+ </text>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ </fill>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="!=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <button>
+ <condition var1="tw_samsung_navbar" op="=" var2="1"/>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </template>
+
+ <template name="progress_bar">
+ <progressbar>
+ <placement x="%indent%" y="%row17a_y%"/>
+ <resource empty="progress_empty" full="progress_full"/>
+ <data name="ui_progress"/>
+ </progressbar>
+
+ <animation>
+ <placement x="%indent%" y="%row17a_y%"/>
+ <resource name="progress"/>
+ <speed fps="24" render="2"/>
+ <loop frame="1"/>
+ </animation>
+ </template>
+
+ <template name="sort_options">
+ <image>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <image resource="tab_3"/>
+ </image>
+
+ <image>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <image resource="tab_3"/>
+ </image>
+
+ <image>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <image resource="tab_3"/>
+ </image>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="1"/>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_name_only=Name}</text>
+ <image resource="sort_asc"/>
+ <action function="set">tw_gui_sort_order=-1</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="-1"/>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_name_only=Name}</text>
+ <image resource="sort_desc"/>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="1"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-1"/>
+ </conditions>
+ <placement x="%indent%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_name_only=Name}</text>
+ <image resource="sort_empty"/>
+ <action function="set">tw_gui_sort_order=1</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="2"/>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_date_only=Date}</text>
+ <image resource="sort_asc"/>
+ <action function="set">tw_gui_sort_order=-2</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="-2"/>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_date_only=Date}</text>
+ <image resource="sort_desc"/>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="2"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-2"/>
+ </conditions>
+ <placement x="%btn3_col2_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_date_only=Date}</text>
+ <image resource="sort_empty"/>
+ <action function="set">tw_gui_sort_order=2</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="3"/>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_size_only=Size}</text>
+ <image resource="sort_asc"/>
+ <action function="set">tw_gui_sort_order=-3</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <condition var1="tw_gui_sort_order" op="=" var2="-3"/>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_size_only=Size}</text>
+ <image resource="sort_desc"/>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+
+ <button>
+ <highlight color="%highlight_color%"/>
+ <conditions>
+ <condition var1="tw_gui_sort_order" op="!=" var2="3"/>
+ <condition var1="tw_gui_sort_order" op="!=" var2="-3"/>
+ </conditions>
+ <placement x="%btn3_col3_x%" y="%row1a_y%"/>
+ <font resource="font_s" color="%text_button_color%"/>
+ <text>{@sort_by_size_only=Size}</text>
+ <image resource="sort_empty"/>
+ <action function="set">tw_gui_sort_order=3</action>
+ </button>
+ </template>
+
+ <template name="tabs_backup">
+ <fill color="%accent_color%">
+ <placement x="0" y="row1_y" w="%screen_width%" h="tab_height"/>
+ </fill>
+
+ <button style="tab">
+ <placement x="0" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@tab_backup=BACKUP}</text>
+ <action function="page">backup</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab3_col2_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
+ <text>{@tab_options=OPTIONS}</text>
+ <action function="page">backup_options</action>
+ </button>
+ </template>
+
+ <template name="tabs_settings">
+ <fill color="%accent_color%">
+ <placement x="0" y="row1_y" w="%screen_width%" h="tab_height"/>
+ </fill>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col1_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_general"/>
+ <action function="page">settings</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col2_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_timezone"/>
+ <action function="page">settings_timezone</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%center_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_display"/>
+ <action function="page">settings_screen</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col4_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_vibration"/>
+ <action function="page">settings_vibration</action>
+ </button>
+
+ <button style="tab">
+ <placement x="%tab5_centered_col5_x%" y="%tab_y%" placement="4"/>
+ <image resource="tab_language"/>
+ <action function="page">settings_language</action>
+ </button>
+ </template>
+
+ <template name="console">
+ <console>
+ <placement x="%indent%" y="%row2_y%" w="%content_width%" h="%console_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row2_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row17_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="console_terminal">
+ <console>
+ <placement x="%indent%" y="%row2_y%" w="content_width" h="%console_terminal_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row2_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row11_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="keyboardterminaltemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%keyboard_terminal_y%" w="%screen_width%" h="42"/>
+ <keymargin x="0" y="0"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="12" y="0"/>
+ <keylabel key="0:k:29" text="Ctrl"/>
+ <keylabel key="0:c:27" text="Esc"/>
+ <keylabel key="0:c:9" text="Tab"/>
+ <keylabel key="0:k:105" text="&lt;" resource="kb_arrow_left"/>
+ <keylabel key="0:k:108" text="v" resource="kb_arrow_down"/>
+ <keylabel key="0:k:103" text="^" resource="kb_arrow_up"/>
+ <keylabel key="0:k:106" text="&gt;" resource="kb_arrow_right"/>
+ <highlight color="%highlight_color%"/>
+ <ctrlhighlight color="#0090CA80"/>
+ <layout1>
+ <keysize height="42" width="69"/>
+ <row1 key01="68:k:29" key02="68:c:27" long02=":c:3" key03="68:c:9" key04="69:k:105" key05="69:k:108" key06="69:k:103" key07="69:k:106"/>
+ </layout1>
+ </keyboard>
+ </template>
+
+ <template name="keyboardtemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%keyboard_y%" w="480" h="284"/>
+ <keymargin x="4" y="4"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="6" y="0"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace"/>
+ <keylabel key="0:action" text="Enter" resource="enter"/>
+ <keylabel key=" " text="Space" resource="space"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <layout1>
+ <keysize height="71" width="48"/>
+ <row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0"/>
+ <row2 key01="24:" key02="a" long02="@" key03="s" long03="#" key04="d" long04="$" key05="f" long05="%" key06="g" long06="&amp;" key07="h" long07="*" key08="j" long08="-" key09="k" long09="+" key10="l" long10="_" key11="24:"/>
+ <row3 key01="72:layout2" key02="z" long02="!" key03="x" long03="&quot;" key04="c" long04="'" key05="v" long05=":" key06="b" long06=";" key07="n" long07="/" key08="m" long08="?" key09="72:c:8"/>
+ <row4 key01="72:layout3" key02="/" key03="240: " key04="." key05="72:action"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="71" width="48" capslock="0" revert_layout="1"/>
+ <row1 key01="Q" long01="1" key02="W" long02="2" key03="E" long03="3" key04="R" long04="4" key05="T" long05="5" key06="Y" long06="6" key07="U" long07="7" key08="I" long08="8" key09="O" long09="9" key10="P" long10="0"/>
+ <row2 key01="24:" key02="A" long02="@" key03="S" long03="#" key04="D" long04="$" key05="F" long05="%" key06="G" long06="&amp;" key07="H" long07="*" key08="J" long08="-" key09="K" long09="+" key10="L" long10="_" key11="24:"/>
+ <row3 key01="72:layout1" key02="Z" long02="!" key03="X" long03="&quot;" key04="C" long04="'" key05="V" long05=":" key06="B" long06=";" key07="N" long07="/" key08="M" long08="?" key09="72:c:8"/>
+ <row4 key01="72:layout3" key02="/" key03="240: " key04="." key05="72:action"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="71" width="48"/>
+ <row1 key01="1" key02="2" key03="3" key04="4" key05="5" key06="6" key07="7" key08="8" key09="9" key10="0"/>
+ <row2 key01="@" key02="#" key03="$" key04="%" key05="&amp;" key06="*" key07="-" key08="+" key09="(" key10=")"/>
+ <row3 key01="72:layout4" key02="!" key03="48:c:34" key04="'" key05=":" key06=";" key07="/" key08="?" key09="72:c:8"/>
+ <row4 key01="72:layout1" key02="," key03="240: " key04="." key05="72:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="71" width="48"/>
+ <row1 key01="~" key02="`" key03="|" key04="48:" key05="48:" key06="48:" key07="%" key08="48:" key09="{" key10="}"/>
+ <row2 key01="48:" key02="48:" key03="48:" key04="48:" key05="48:" key06="^" key07="_" key08="=" key09="[" key10="]"/>
+ <row3 key01="72:layout3" key02="48:" key03="48:" key04="48:" key05="48:" key06="\" key07="&lt;" key08="&gt;" key09="72:c:8"/>
+ <row4 key01="72:layout1" key02="48:c:34" key03="240: " key04="." key05="72:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+ </templates>
+</recovery>
diff --git a/gui/theme/watch_mdpi/images/back.png b/gui/theme/watch_mdpi/images/back.png
new file mode 100644
index 000000000..b4bcda71f
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/back.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/backspace.png b/gui/theme/watch_mdpi/images/backspace.png
new file mode 100644
index 000000000..cf22b65fa
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/backspace.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/checkbox_false.png b/gui/theme/watch_mdpi/images/checkbox_false.png
new file mode 100644
index 000000000..4439e458c
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/checkbox_false.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/checkbox_false_small.png b/gui/theme/watch_mdpi/images/checkbox_false_small.png
new file mode 100644
index 000000000..e6b0b44eb
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/checkbox_false_small.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/checkbox_true.png b/gui/theme/watch_mdpi/images/checkbox_true.png
new file mode 100644
index 000000000..b0b7709fa
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/checkbox_true.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/checkbox_true_small.png b/gui/theme/watch_mdpi/images/checkbox_true_small.png
new file mode 100644
index 000000000..ae8a080ba
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/checkbox_true_small.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/close.png b/gui/theme/watch_mdpi/images/close.png
new file mode 100644
index 000000000..95c0cf4eb
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/close.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/console.png b/gui/theme/watch_mdpi/images/console.png
new file mode 100644
index 000000000..cf94aa8a3
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/console.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/enter.png b/gui/theme/watch_mdpi/images/enter.png
new file mode 100644
index 000000000..e831bedee
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/enter.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/file.png b/gui/theme/watch_mdpi/images/file.png
new file mode 100644
index 000000000..ea2cedf87
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/file.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/folder.png b/gui/theme/watch_mdpi/images/folder.png
new file mode 100644
index 000000000..3d5be9aef
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/folder.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/grid_less.png b/gui/theme/watch_mdpi/images/grid_less.png
new file mode 100644
index 000000000..d71867fff
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/grid_less.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/grid_more.png b/gui/theme/watch_mdpi/images/grid_more.png
new file mode 100644
index 000000000..4f03d93b0
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/grid_more.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/handle.png b/gui/theme/watch_mdpi/images/handle.png
new file mode 100644
index 000000000..e474978fa
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/handle.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/home.png b/gui/theme/watch_mdpi/images/home.png
new file mode 100644
index 000000000..42955ba69
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/home.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate001.png b/gui/theme/watch_mdpi/images/indeterminate001.png
new file mode 100644
index 000000000..e1431edb1
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate001.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate002.png b/gui/theme/watch_mdpi/images/indeterminate002.png
new file mode 100644
index 000000000..be06bd61e
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate002.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate003.png b/gui/theme/watch_mdpi/images/indeterminate003.png
new file mode 100644
index 000000000..e47fae3bb
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate003.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate004.png b/gui/theme/watch_mdpi/images/indeterminate004.png
new file mode 100644
index 000000000..1931b60be
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate004.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate005.png b/gui/theme/watch_mdpi/images/indeterminate005.png
new file mode 100644
index 000000000..f372669a6
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate005.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate006.png b/gui/theme/watch_mdpi/images/indeterminate006.png
new file mode 100644
index 000000000..2a1f1da83
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate006.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate007.png b/gui/theme/watch_mdpi/images/indeterminate007.png
new file mode 100644
index 000000000..5244e53e0
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate007.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate008.png b/gui/theme/watch_mdpi/images/indeterminate008.png
new file mode 100644
index 000000000..cf20bb12b
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate008.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate009.png b/gui/theme/watch_mdpi/images/indeterminate009.png
new file mode 100644
index 000000000..f8a75477d
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate009.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate010.png b/gui/theme/watch_mdpi/images/indeterminate010.png
new file mode 100644
index 000000000..bfd0a6d62
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate010.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate011.png b/gui/theme/watch_mdpi/images/indeterminate011.png
new file mode 100644
index 000000000..004b77fa4
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate011.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/indeterminate012.png b/gui/theme/watch_mdpi/images/indeterminate012.png
new file mode 100644
index 000000000..a6770771f
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/indeterminate012.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/kb_arrow_down.png b/gui/theme/watch_mdpi/images/kb_arrow_down.png
new file mode 100644
index 000000000..1439b59e8
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/kb_arrow_down.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/kb_arrow_left.png b/gui/theme/watch_mdpi/images/kb_arrow_left.png
new file mode 100644
index 000000000..2afb82c85
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/kb_arrow_left.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/kb_arrow_right.png b/gui/theme/watch_mdpi/images/kb_arrow_right.png
new file mode 100644
index 000000000..fb565b9dd
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/kb_arrow_right.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/kb_arrow_up.png b/gui/theme/watch_mdpi/images/kb_arrow_up.png
new file mode 100644
index 000000000..af00e7585
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/kb_arrow_up.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/kb_hide.png b/gui/theme/watch_mdpi/images/kb_hide.png
new file mode 100644
index 000000000..170cf33ef
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/kb_hide.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/kb_show.png b/gui/theme/watch_mdpi/images/kb_show.png
new file mode 100644
index 000000000..4115c6336
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/kb_show.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/main_button.png b/gui/theme/watch_mdpi/images/main_button.png
new file mode 100644
index 000000000..769a1b394
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/main_button.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/main_button_full_width.png b/gui/theme/watch_mdpi/images/main_button_full_width.png
new file mode 100644
index 000000000..19012c461
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/main_button_full_width.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/main_button_half_height.png b/gui/theme/watch_mdpi/images/main_button_half_height.png
new file mode 100644
index 000000000..220604881
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/main_button_half_height.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/main_button_quarter_width.png b/gui/theme/watch_mdpi/images/main_button_quarter_width.png
new file mode 100644
index 000000000..f068f5fa9
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/main_button_quarter_width.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/progress_empty.png b/gui/theme/watch_mdpi/images/progress_empty.png
new file mode 100644
index 000000000..561d49c52
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/progress_empty.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/progress_fill.png b/gui/theme/watch_mdpi/images/progress_fill.png
new file mode 100644
index 000000000..54c0e1b4e
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/progress_fill.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_accept.png b/gui/theme/watch_mdpi/images/q_btn_accept.png
new file mode 100644
index 000000000..4c04f228d
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_accept.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_accept_transp.png b/gui/theme/watch_mdpi/images/q_btn_accept_transp.png
new file mode 100644
index 000000000..9d1c17793
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_accept_transp.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_addzip.png b/gui/theme/watch_mdpi/images/q_btn_addzip.png
new file mode 100644
index 000000000..6ca0135d2
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_addzip.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_arrow_left.png b/gui/theme/watch_mdpi/images/q_btn_arrow_left.png
new file mode 100644
index 000000000..b07d2d0aa
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_arrow_left.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_arrow_right.png b/gui/theme/watch_mdpi/images/q_btn_arrow_right.png
new file mode 100644
index 000000000..fb0c9eae9
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_arrow_right.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_delete.png b/gui/theme/watch_mdpi/images/q_btn_delete.png
new file mode 100644
index 000000000..89224985c
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_delete.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_encryption_dis.png b/gui/theme/watch_mdpi/images/q_btn_encryption_dis.png
new file mode 100644
index 000000000..84800752e
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_encryption_dis.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_encryption_en.png b/gui/theme/watch_mdpi/images/q_btn_encryption_en.png
new file mode 100644
index 000000000..6ac2a919a
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_encryption_en.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_folder.png b/gui/theme/watch_mdpi/images/q_btn_folder.png
new file mode 100644
index 000000000..eccba87f6
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_folder.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_refresh.png b/gui/theme/watch_mdpi/images/q_btn_refresh.png
new file mode 100644
index 000000000..a7762d8a7
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_refresh.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_reset.png b/gui/theme/watch_mdpi/images/q_btn_reset.png
new file mode 100644
index 000000000..f05f43c23
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_reset.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/q_btn_storage.png b/gui/theme/watch_mdpi/images/q_btn_storage.png
new file mode 100644
index 000000000..ddfddb40d
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/q_btn_storage.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/radio_false.png b/gui/theme/watch_mdpi/images/radio_false.png
new file mode 100644
index 000000000..c517286f3
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/radio_false.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/radio_true.png b/gui/theme/watch_mdpi/images/radio_true.png
new file mode 100644
index 000000000..523cecc3d
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/radio_true.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/shift.png b/gui/theme/watch_mdpi/images/shift.png
new file mode 100644
index 000000000..077097212
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/shift.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/shift_fill.png b/gui/theme/watch_mdpi/images/shift_fill.png
new file mode 100644
index 000000000..0941aa66e
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/shift_fill.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/slider.png b/gui/theme/watch_mdpi/images/slider.png
new file mode 100644
index 000000000..a2083c530
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/slider.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/slider_touch.png b/gui/theme/watch_mdpi/images/slider_touch.png
new file mode 100644
index 000000000..9fcb72996
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/slider_touch.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/slider_used.png b/gui/theme/watch_mdpi/images/slider_used.png
new file mode 100644
index 000000000..d1df84537
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/slider_used.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/space.png b/gui/theme/watch_mdpi/images/space.png
new file mode 100644
index 000000000..44d712188
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/space.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/splashlogo.png b/gui/theme/watch_mdpi/images/splashlogo.png
new file mode 100644
index 000000000..24fc4e71e
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/splashlogo.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/splashteamwin.png b/gui/theme/watch_mdpi/images/splashteamwin.png
new file mode 100644
index 000000000..47885cc5b
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/splashteamwin.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/images/unlock_icon.png b/gui/theme/watch_mdpi/images/unlock_icon.png
new file mode 100644
index 000000000..b2b5f8ba8
--- /dev/null
+++ b/gui/theme/watch_mdpi/images/unlock_icon.png
Binary files differ
diff --git a/gui/theme/watch_mdpi/splash.xml b/gui/theme/watch_mdpi/splash.xml
new file mode 100644
index 000000000..2d70e5948
--- /dev/null
+++ b/gui/theme/watch_mdpi/splash.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="320" height="320"/>
+ <author>TeamWin</author>
+ <title>TWRP</title>
+ <description>splash screen</description>
+ <themeversion>2</themeversion>
+ </details>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="24"/>
+ <image name="splashlogo" filename="splashlogo" retainaspect="1"/>
+ <image name="splashteamwin" filename="splashteamwin" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="screen_width" value="320"/>
+ <variable name="screen_height" value="320"/>
+ <variable name="background_color" value="#222222"/>
+ <variable name="header_color" value="#555555"/>
+ <variable name="accent_color" value="#0090CA"/>
+ </variables>
+
+ <pages>
+ <page name="splash">
+ <background color="%background_color%"/>
+
+ <fill color="%header_color%">
+ <placement x="0" y="0" w="%screen_width%" h="120"/>
+ </fill>
+
+ <image>
+ <image resource="splashlogo"/>
+ <placement x="160" y="120" placement="4"/>
+ </image>
+
+ <image>
+ <image resource="splashteamwin"/>
+ <placement x="160" y="270" placement="4"/>
+ </image>
+
+ <text color="%header_color%">
+ <font resource="font_l"/>
+ <placement x="160" y="290" placement="5"/>
+ <text>Recovery Project %tw_version%</text>
+ </text>
+ </page>
+ </pages>
+</recovery>
+
diff --git a/gui/theme/watch_mdpi/ui.xml b/gui/theme/watch_mdpi/ui.xml
new file mode 100644
index 000000000..3ef71aff0
--- /dev/null
+++ b/gui/theme/watch_mdpi/ui.xml
@@ -0,0 +1,391 @@
+<?xml version="1.0"?>
+<recovery>
+ <details>
+ <resolution width="320" height="320"/>
+ <roundscreen offset_x="40" offset_y="40"/>
+ <author>TeamWin</author>
+ <title>Backup Naowz</title>
+ <description>Default basic theme</description>
+ <preview>preview.png</preview>
+ <themeversion>2</themeversion>
+ </details>
+
+ <include>
+ <xmlfile name="watch.xml"/>
+ </include>
+
+ <resources>
+ <font name="font_l" filename="RobotoCondensed-Regular.ttf" size="24"/>
+ <font name="font_m" filename="RobotoCondensed-Regular.ttf" size="14"/>
+ <font name="font_s" filename="RobotoCondensed-Regular.ttf" size="12"/>
+ <font name="fixed" filename="DroidSansMono.ttf" size="14"/>
+
+ <font name="keylabel" filename="RobotoCondensed-Regular.ttf" size="18"/>
+ <font name="keylabel-small" filename="RobotoCondensed-Regular.ttf" size="14"/>
+ <font name="keylabel-longpress" filename="RobotoCondensed-Regular.ttf" size="12"/>
+
+ <image name="main_button" filename="main_button"/>
+ <image name="main_button_half_height" filename="main_button_half_height"/>
+ <image name="main_button_full_width" filename="main_button_full_width"/>
+ <image name="main_button_quarter_width" filename="main_button_quarter_width"/>
+ <image name="q_btn_arrow_right" filename="q_btn_arrow_right" retainaspect="1"/>
+ <image name="q_btn_arrow_left" filename="q_btn_arrow_left" retainaspect="1"/>
+ <image name="q_btn_storage" filename="q_btn_storage" retainaspect="1"/>
+ <image name="q_btn_refresh" filename="q_btn_refresh" retainaspect="1"/>
+ <image name="q_btn_accept" filename="q_btn_accept" retainaspect="1"/>
+ <image name="q_btn_accept_transp" filename="q_btn_accept_transp" retainaspect="1"/>
+ <image name="q_btn_addzip" filename="q_btn_addzip" retainaspect="1"/>
+ <image name="q_btn_encryption_dis" filename="q_btn_encryption_dis" retainaspect="1"/>
+ <image name="q_btn_encryption_en" filename="q_btn_encryption_en" retainaspect="1"/>
+ <image name="q_btn_delete" filename="q_btn_delete" retainaspect="1"/>
+ <image name="q_btn_reset" filename="q_btn_reset" retainaspect="1"/>
+ <image name="q_btn_folder" filename="q_btn_folder" retainaspect="1"/>
+ <image name="file" filename="file" retainaspect="1"/>
+ <image name="folder" filename="folder" retainaspect="1"/>
+ <image name="unlock_icon" filename="unlock_icon" retainaspect="1"/>
+ <image name="home" filename="home" retainaspect="1"/>
+ <image name="back" filename="back" retainaspect="1"/>
+ <image name="console" filename="console" retainaspect="1"/>
+ <image name="kb_hide" filename="kb_hide" retainaspect="1"/>
+ <image name="kb_show" filename="kb_show" retainaspect="1"/>
+ <image name="grid_less" filename="grid_less" retainaspect="1"/>
+ <image name="grid_more" filename="grid_more" retainaspect="1"/>
+ <image name="checkbox_false" filename="checkbox_false" retainaspect="1"/>
+ <image name="checkbox_false_small" filename="checkbox_false_small" retainaspect="1"/>
+ <image name="checkbox_true" filename="checkbox_true" retainaspect="1"/>
+ <image name="checkbox_true_small" filename="checkbox_true_small" retainaspect="1"/>
+ <image name="radio_false" filename="radio_false" retainaspect="1"/>
+ <image name="radio_true" filename="radio_true" retainaspect="1"/>
+ <animation name="progress" filename="indeterminate"/>
+ <image name="progress_empty" filename="progress_empty"/>
+ <image name="progress_full" filename="progress_fill"/>
+ <image name="slider" filename="slider"/>
+ <image name="slider_used" filename="slider_used"/>
+ <image name="slider_touch" filename="slider_touch"/>
+ <image name="handle" filename="handle"/>
+ <image name="backspace" filename="backspace" retainaspect="1"/>
+ <image name="enter" filename="enter" retainaspect="1"/>
+ <image name="shift" filename="shift" retainaspect="1"/>
+ <image name="shift_fill" filename="shift_fill" retainaspect="1"/>
+ <image name="space" filename="space" retainaspect="1"/>
+ <image name="close" filename="close" retainaspect="1"/>
+ <image name="kb_arrow_left" filename="kb_arrow_left" retainaspect="1"/>
+ <image name="kb_arrow_right" filename="kb_arrow_right" retainaspect="1"/>
+ <image name="kb_arrow_up" filename="kb_arrow_up" retainaspect="1"/>
+ <image name="kb_arrow_down" filename="kb_arrow_down" retainaspect="1"/>
+ </resources>
+
+ <variables>
+ <variable name="tw_hide_kb" value="0"/>
+ <variable name="screen_width" value="320"/>
+ <variable name="screen_half_width" value="160"/>
+ <variable name="screen_height" value="320"/>
+ <variable name="status_height" value="20"/>
+ <variable name="header_height" value="20"/>
+ <variable name="navbar_height" value="52"/>
+ <variable name="content_width" value="304"/>
+ <variable name="content_half_width" value="148"/>
+ <variable name="back_button_x" value="70"/>
+ <variable name="console_button_x" value="250"/>
+ <variable name="indent" value="8"/>
+ <variable name="col1_x_left" value="8"/>
+ <variable name="col1_x_left_negative" value="156"/>
+ <variable name="center_x" value="160"/>
+ <variable name="col1_x_right" value="164"/>
+ <variable name="indent_right" value="312"/>
+ <variable name="btn4_col2_x" value="86"/>
+ <variable name="btn4_col3_x" value="164"/>
+ <variable name="btn4_col4_x" value="242"/>
+ <variable name="row1_header_y" value="0"/>
+ <variable name="row2_header_y" value="20"/>
+ <variable name="row1_y" value="28"/>
+ <variable name="row1a_y" value="36"/>
+ <variable name="row2_y" value="44"/>
+ <variable name="row2a_y" value="52"/>
+ <variable name="row3_y" value="60"/>
+ <variable name="row3_input_y" value="64"/>
+ <variable name="row3a_y" value="68"/>
+ <variable name="row4_y" value="76"/>
+ <variable name="row4a_y" value="84"/>
+ <variable name="row5_y" value="92"/>
+ <variable name="row5a_y" value="100"/>
+ <variable name="row6_y" value="108"/>
+ <variable name="row6_input_y" value="112"/>
+ <variable name="row6a_y" value="116"/>
+ <variable name="row6a_input_y" value="120"/>
+ <variable name="row7_y" value="124"/>
+ <variable name="row7a_y" value="132"/>
+ <variable name="row8_y" value="140"/>
+ <variable name="row8a_y" value="148"/>
+ <variable name="row9_y" value="156"/>
+ <variable name="row9a_y" value="164"/>
+ <variable name="row10_y" value="172"/>
+ <variable name="row10a_y" value="180"/>
+ <variable name="row11_y" value="188"/>
+ <variable name="row11a_y" value="196"/>
+ <variable name="row12_y" value="204"/>
+ <variable name="row12a_y" value="212"/>
+ <variable name="row13_y" value="220"/>
+ <variable name="slider_y" value="224"/>
+ <variable name="row13a_y" value="228"/>
+ <variable name="row14_y" value="236"/>
+ <variable name="row14a_y" value="244"/>
+ <variable name="row15_y" value="252"/>
+ <variable name="row15a_y" value="260"/>
+ <variable name="navbar_y" value="268"/>
+ <variable name="navbar_btn_y" value="294"/>
+ <variable name="keyboard_y" value="124"/>
+ <variable name="keyboard_terminal_y" value="100"/>
+ <variable name="background_color" value="#1A1A1A"/>
+ <variable name="accent_color" value="#0090CA"/>
+ <variable name="text_color" value="#EEEEEE"/>
+ <variable name="text_button_color" value="#EEEEEE"/>
+ <variable name="text_success_color" value="#76FF03"/>
+ <variable name="text_fail_color" value="#FF0101"/>
+ <variable name="highlight_color" value="#1A1A1A80"/>
+ <variable name="caps_highlight_color" value="#22222280"/>
+ <variable name="transparent" value="#00000000"/>
+ <variable name="semi_transparent" value="#00000099"/>
+ <variable name="warning" value="#F8F8A0"/>
+ <variable name="error" value="#FF0101"/>
+ <variable name="highlight" value="#0090CA"/>
+ <variable name="fileselector_linecolor" value="#555555"/>
+ <variable name="fileselector_highlight_color" value="#555555"/>
+ <variable name="fileselector_separatorheight" value="1"/>
+ <variable name="fileselector_spacing" value="0"/>
+ <variable name="fileselector_install_height" value="248"/>
+ <variable name="fileselector_filemanager_height" value="248"/>
+ <variable name="partitionlist_spacing" value="0"/>
+ <variable name="partitionlist_storage_height" value="160"/>
+ <variable name="partitionlist_wipe_height" value="160"/>
+ <variable name="listbox_timezone_height" value="248"/>
+ <variable name="listbox_settings_height" value="248"/>
+ <variable name="fastscroll_w" value="10"/>
+ <variable name="fastscroll_linew" value="1"/>
+ <variable name="fastscroll_rectw" value="10"/>
+ <variable name="fastscroll_recth" value="18"/>
+ <variable name="slidervalue_lineh" value="4"/>
+ <variable name="slidervalue_padding" value="0"/>
+ <variable name="slidervalue_sliderw" value="70"/>
+ <variable name="slidervalue_sliderh" value="72"/>
+ <variable name="slideout_height" value="232"/>
+ <variable name="slideout_bg_height" value="248"/>
+ <variable name="input_height" value="16"/>
+ <variable name="input_line_width" value="1"/>
+ <variable name="input_line_console" value="272"/>
+ <variable name="console_height" value="152"/>
+ <variable name="console_terminal_s_height" value="100"/>
+ <variable name="console_terminal_l_height" value="268"/>
+ <variable name="close_btn_x" value="280"/>
+ <variable name="pattern_x" value="60"/>
+ <variable name="pattern_dot_dia" value="12"/>
+ <variable name="pattern_line_w" value="4"/>
+ <variable name="pattern_size" value="200"/>
+ </variables>
+
+ <templates>
+ <template name="statusbar">
+ <fill color="%accent_color%">
+ <placement x="0" y="0" w="%screen_width%" h="%header_height%"/>
+ </fill>
+
+ <fill color="%text_fail_color%">
+ <condition var1="tw_simulate_actions" var2="1"/>
+ <placement x="0" y="0" w="%screen_width%" h="%status_height%"/>
+ </fill>
+ </template>
+
+ <template name="page">
+ <background color="%background_color%"/>
+
+ <template name="statusbar"/>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="1"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>{@twrp_watch_header=TWRP %tw_version%}</text>
+ </text>
+
+ <text color="%text_color%">
+ <condition var1="tw_no_cpu_temp" var2="0"/>
+ <font resource="font_m"/>
+ <placement x="%indent%" y="%row1_header_y%"/>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
+ </text>
+
+ <text color="%text_color%">
+ <font resource="font_m"/>
+ <placement x="%center_x%" y="%row1_header_y%" placement="5"/>
+ <text>%tw_time%</text>
+ </text>
+
+ <text color="%text_color%">
+ <conditions>
+ <condition var1="tw_no_battery_percent" var2="0"/>
+ <condition var1="tw_battery" op="&gt;" var2="0"/>
+ <condition var1="tw_battery" op="&lt;" var2="101"/>
+ </conditions>
+ <font resource="font_m"/>
+ <placement x="%indent_right%" y="%row1_header_y%" placement="1"/>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
+ </text>
+
+ <fill color="#000000">
+ <placement x="0" y="%navbar_y%" w="%screen_width%" h="%navbar_height%"/>
+ </fill>
+
+ <button>
+ <placement x="%back_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="back"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">back</action>
+ </button>
+
+ <button>
+ <placement x="%center_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="home"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="key">home</action>
+ </button>
+
+ <button>
+ <placement x="%console_button_x%" y="%navbar_btn_y%" placement="4"/>
+ <image resource="console"/>
+ <condition var1="tw_busy" var2="0"/>
+ <action function="overlay">slideout</action>
+ </button>
+
+ <action>
+ <touch key="power"/>
+ <action function="togglebacklight"/>
+ </action>
+
+ <action>
+ <touch key="power+voldown"/>
+ <action function="screenshot"/>
+ </action>
+ </template>
+
+ <template name="progress_bar">
+ <progressbar>
+ <placement x="%indent%" y="%row11_y%"/>
+ <resource empty="progress_empty" full="progress_full"/>
+ <data name="ui_progress"/>
+ </progressbar>
+
+ <animation>
+ <placement x="%indent%" y="%row11_y%"/>
+ <resource name="progress"/>
+ <speed fps="24" render="2"/>
+ <loop frame="1"/>
+ </animation>
+ </template>
+
+ <template name="console">
+ <console>
+ <placement x="%indent%" y="%row1_y%" w="%content_width%" h="%console_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row1_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row10a_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="console_terminal">
+ <console>
+ <placement x="%indent%" y="%row1_y%" w="content_width" h="%console_terminal_height%"/>
+ </console>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row1_y" w="%content_width%" h="input_line_width" placement="1"/>
+ </fill>
+
+ <fill color="%fileselector_linecolor%">
+ <placement x="%indent%" y="row5_y" w="%content_width%" h="input_line_width"/>
+ </fill>
+ </template>
+
+ <template name="keyboardterminaltemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%keyboard_terminal_y%" w="%screen_width%" h="24"/>
+ <keymargin x="0" y="0"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="0" y="0"/>
+ <keylabel key="0:k:29" text="Ctrl"/>
+ <keylabel key="0:c:27" text="Esc"/>
+ <keylabel key="0:c:9" text="Tab"/>
+ <keylabel key="0:k:105" text="&lt;" resource="kb_arrow_left"/>
+ <keylabel key="0:k:108" text="v" resource="kb_arrow_down"/>
+ <keylabel key="0:k:103" text="^" resource="kb_arrow_up"/>
+ <keylabel key="0:k:106" text="&gt;" resource="kb_arrow_right"/>
+ <highlight color="%highlight_color%"/>
+ <ctrlhighlight color="#0090CA80"/>
+ <layout1>
+ <keysize height="24" width="44"/>
+ <row1 key01="48:k:29" key02="48:c:27" long02=":c:3" key03="48:c:9" key04="44:k:105" key05="44:k:108" key06="44:k:103" key07="44:k:106"/>
+ </layout1>
+ </keyboard>
+ </template>
+
+ <template name="keyboardtemplate">
+ <keyboard>
+ <condition var1="tw_hide_kb" var2="0"/>
+ <placement x="0" y="%keyboard_y%" w="320" h="144"/>
+ <keymargin x="2" y="2"/>
+ <background color="#111111"/>
+ <key-alphanumeric color="#111111" font="keylabel" textcolor="#EEEEEE"/>
+ <key-other color="#111111" font="keylabel-small" textcolor="#5b5b5bff"/>
+ <longpress font="keylabel-longpress" textcolor="#5b5b5bff" x="0" y="0"/>
+ <keylabel key="0:c:8" text="Bksp" resource="backspace"/>
+ <keylabel key="0:action" text="Enter" resource="enter"/>
+ <keylabel key=" " text="Space" resource="space"/>
+ <highlight color="%highlight_color%"/>
+ <capshighlight color="%highlight_color%"/>
+ <layout1>
+ <keysize height="36" width="32"/>
+ <row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0"/>
+ <row2 key01="16:" key02="a" long02="@" key03="s" long03="#" key04="d" long04="$" key05="f" long05="%" key06="g" long06="&amp;" key07="h" long07="*" key08="j" long08="-" key09="k" long09="+" key10="l" long10="_" key11="16:"/>
+ <row3 key01="48:layout2" key02="z" long02="!" key03="x" long03="&quot;" key04="c" long04="'" key05="v" long05=":" key06="b" long06=";" key07="n" long07="/" key08="m" long08="?" key09="48:c:8"/>
+ <row4 key01="48:layout3" key02="/" key03="160: " key04="." key05="48:action"/>
+ <keylabel key="0:layout2" text="Shift" resource="shift"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout1>
+ <layout2>
+ <keysize height="36" width="32" capslock="0" revert_layout="1"/>
+ <row1 key01="Q" long01="1" key02="W" long02="2" key03="E" long03="3" key04="R" long04="4" key05="T" long05="5" key06="Y" long06="6" key07="U" long07="7" key08="I" long08="8" key09="O" long09="9" key10="P" long10="0"/>
+ <row2 key01="16:" key02="A" long02="@" key03="S" long03="#" key04="D" long04="$" key05="F" long05="%" key06="G" long06="&amp;" key07="H" long07="*" key08="J" long08="-" key09="K" long09="+" key10="L" long10="_" key11="16:"/>
+ <row3 key01="48:layout1" key02="Z" long02="!" key03="X" long03="&quot;" key04="C" long04="'" key05="V" long05=":" key06="B" long06=";" key07="N" long07="/" key08="M" long08="?" key09="48:c:8"/>
+ <row4 key01="48:layout3" key02="/" key03="160: " key04="." key05="48:action"/>
+ <keylabel key="0:layout1" text="Shift" resource="shift_fill"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout2>
+ <layout3>
+ <keysize height="36" width="32"/>
+ <row1 key01="1" key02="2" key03="3" key04="4" key05="5" key06="6" key07="7" key08="8" key09="9" key10="0"/>
+ <row2 key01="@" key02="#" key03="$" key04="%" key05="&amp;" key06="*" key07="-" key08="+" key09="(" key10=")"/>
+ <row3 key01="48:layout4" key02="!" key03="32:c:34" key04="'" key05=":" key06=";" key07="/" key08="?" key09="48:c:8"/>
+ <row4 key01="48:layout1" key02="," key03="160: " key04="." key05="48:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout4" text="~\{"/>
+ </layout3>
+ <layout4>
+ <keysize height="36" width="32"/>
+ <row1 key01="~" key02="`" key03="|" key04="32:" key05="32:" key06="32:" key07="%" key08="32:" key09="{" key10="}"/>
+ <row2 key01="32:" key02="32:" key03="32:" key04="32:" key05="32:" key06="^" key07="_" key08="=" key09="[" key10="]"/>
+ <row3 key01="48:layout3" key02="32:" key03="32:" key04="32:" key05="32:" key06="\" key07="&lt;" key08="&gt;" key09="48:c:8"/>
+ <row4 key01="48:layout1" key02="32:c:34" key03="160: " key04="." key05="48:action"/>
+ <keylabel key="0:layout1" text="ABC"/>
+ <keylabel key="0:layout3" text="?123"/>
+ </layout4>
+ </keyboard>
+ </template>
+ </templates>
+</recovery>
diff --git a/gui/twmsg.cpp b/gui/twmsg.cpp
new file mode 100644
index 000000000..ebd6fc313
--- /dev/null
+++ b/gui/twmsg.cpp
@@ -0,0 +1,139 @@
+/*
+ Copyright 2015 _that/TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "../data.hpp"
+#include "pages.hpp"
+#include "resources.hpp"
+
+#include "twmsg.h"
+#include <cctype>
+
+std::string Message::GetFormatString(const std::string& name) const
+{
+ return resourceLookup(name);
+}
+
+// Look up in local replacement vars first, if not found then use outer lookup object
+class LocalLookup : public StringLookup
+{
+ const std::vector<std::string>& vars;
+ const StringLookup& next;
+public:
+ LocalLookup(const std::vector<std::string>& vars, const StringLookup& next) : vars(vars), next(next) {}
+ virtual std::string operator()(const std::string& name) const
+ {
+ if (!name.empty() && isdigit(name[0])) { // {1}..{9}
+ int i = atoi(name.c_str());
+ if (i > 0 && i <= (int)vars.size())
+ return vars[i - 1];
+ }
+ return next(name);
+ }
+};
+
+// conversion to final string
+Message::operator std::string() const
+{
+ // do resource lookup
+ std::string str = GetFormatString(name);
+
+ LocalLookup lookup(variables, varLookup);
+
+ // now insert stuff into curly braces
+
+ size_t pos = 0;
+ while ((pos = str.find('{', pos)) < std::string::npos) {
+ size_t end = str.find('}', pos);
+ if (end == std::string::npos)
+ break;
+
+ std::string varname = str.substr(pos + 1, end - pos - 1);
+ std::string vartext = lookup(varname);
+
+ str.replace(pos, end - pos + 1, vartext);
+ }
+ // TODO: complain about too many or too few numbered replacement variables
+ return str;
+}
+
+/*
+Resource manager lookup
+*/
+class ResourceLookup : public StringLookup
+{
+public:
+ virtual std::string operator()(const std::string& name) const
+ {
+ std::string resname;
+ std::string default_value;
+
+ size_t pos = name.find('=');
+ if (pos == std::string::npos) {
+ resname = name;
+ } else {
+ resname = name.substr(0, pos);
+ default_value = name.substr(pos + 1);
+ }
+#ifndef BUILD_TWRPTAR_MAIN
+ const ResourceManager* res = PageManager::GetResources();
+ if (res) {
+ if (default_value.empty())
+ return res->FindString(resname);
+ else
+ return res->FindString(resname, default_value);
+ }
+#endif
+ if (!default_value.empty()) {
+ return default_value;
+ }
+ return name;
+ }
+};
+ResourceLookup resourceLookup;
+
+
+/*
+DataManager lookup
+*/
+class DataLookup : public StringLookup
+{
+public:
+ virtual std::string operator()(const std::string& name) const
+ {
+#ifndef BUILD_TWRPTAR_MAIN
+ std::string value;
+ if (DataManager::GetValue(name, value) == 0)
+ return value;
+ else
+#endif
+ return "";
+ }
+};
+DataLookup dataLookup;
+
+
+// Utility functions to create messages. Short names to make usage convenient.
+Message Msg(const char* name)
+{
+ return Message(msg::kNormal, name, resourceLookup, dataLookup);
+}
+
+Message Msg(msg::Kind kind, const char* name)
+{
+ return Message(kind, name, resourceLookup, dataLookup);
+}
diff --git a/gui/twmsg.h b/gui/twmsg.h
new file mode 100644
index 000000000..cd035d1f5
--- /dev/null
+++ b/gui/twmsg.h
@@ -0,0 +1,97 @@
+/*
+ Copyright 2015 _that/TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef twmsg_h
+#define twmsg_h
+
+#include <cstdlib>
+#include <cstring>
+#include <string>
+#include <sstream>
+#include <vector>
+#include <errno.h>
+
+/*
+Abstract interface for something that can look up strings by name.
+*/
+class StringLookup
+{
+public:
+ virtual std::string operator()(const std::string& name) const = 0;
+ virtual ~StringLookup() {};
+};
+
+
+namespace msg
+{
+ // These get translated to colors in the GUI console
+ enum Kind
+ {
+ kNormal,
+ kHighlight,
+ kWarning,
+ kError
+ };
+
+
+ template<typename T> std::string to_string(const T& v)
+ {
+ std::ostringstream ss;
+ ss << v;
+ return ss.str();
+ }
+}
+
+
+/*
+Generic message formatting class.
+Designed to decouple message generation from actual resource string lookup and variable insertion,
+so that messages can be re-translated at any later time.
+*/
+class Message
+{
+ msg::Kind kind; // severity or similar message kind
+ std::string name; // the resource string name. may be of format "name=default value".
+ std::vector<std::string> variables; // collected insertion variables to replace {1}, {2}, ...
+ const StringLookup& resourceLookup; // object to resolve resource string name into a final format string
+ const StringLookup& varLookup; // object to resolve any non-numeric insertion strings
+
+ std::string GetFormatString(const std::string& name) const;
+
+public:
+ Message(msg::Kind kind, const char* name, const StringLookup& resourceLookup, const StringLookup& varLookup)
+ : kind(kind), name(name), resourceLookup(resourceLookup), varLookup(varLookup) {}
+
+ // Variable insertion.
+ template<typename T>
+ Message& operator()(const T& v) { variables.push_back(msg::to_string(v)); return *this; }
+
+ // conversion to final string
+ operator std::string() const;
+
+ // Get Message Kind
+ msg::Kind GetKind() {return kind;};
+};
+
+
+// Utility functions to create messages with standard resource and data manager lookups.
+// Short names to make usage convenient.
+Message Msg(const char* name);
+Message Msg(msg::Kind kind, const char* name);
+
+#endif
diff --git a/gui/twrp b/gui/twrp
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/gui/twrp