gui: PatternPassword: allow any N*N grid

Rather than only supporting a 3x3 grid, allow for multiple grid sizes
(using the CyanogenMod method of generating passphrases for non-3x3
grids). Also fix the detection of touches, as the old code was far too
sensitive for larger grids (and also didn't make much sense).

Change-Id: I343ef654e6d29ce0cb790a28281be7c7c9b171d9
Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
diff --git a/gui/devices/1080x1920/res/ui.xml b/gui/devices/1080x1920/res/ui.xml
index 0ac3e43..d491577 100644
--- a/gui/devices/1080x1920/res/ui.xml
+++ b/gui/devices/1080x1920/res/ui.xml
@@ -200,14 +200,19 @@
 		<variable name="slidervalue_padding" value="30" />
 		<variable name="slidervalue_sliderw" value="15" />
 		<variable name="slidervalue_sliderh" value="90" />
-		<variable name="pattern_x" value="216" />
+		<variable name="pattern_button3_x" value="275" />
+		<variable name="pattern_button4_x" value="409" />
+		<variable name="pattern_button5_x" value="543" />
+		<variable name="pattern_button6_x" value="677" />
+		<variable name="pattern_x" value="92" />
 		<variable name="pattern_y" value="508" />
-		<variable name="pattern_width" value="648" />
+		<variable name="pattern_width" value="896" />
 		<variable name="pattern_dot_color" value="#33B5E5" />
 		<variable name="pattern_dot_color_active" value="#FFFFFF" />
 		<variable name="pattern_dot_radius" value="23" />
 		<variable name="pattern_line_color" value="#33B5E5" />
 		<variable name="pattern_line_width" value="18" />
+		<variable name="pattern_cancel_y" value="1440" />
 	</variables>
 
 	<mousecursor>
@@ -318,6 +323,40 @@
 			</object>
 		</template>
 
+		<template name="pattern_options">
+			<object type="button">
+				<placement x="%pattern_button3_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>3x3</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=3</action>
+			</object>
+
+			<object type="button">
+				<placement x="%pattern_button4_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>4x4</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=4</action>
+			</object>
+
+			<object type="button">
+				<placement x="%pattern_button5_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>5x5</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=5</action>
+			</object>
+
+			<object type="button">
+				<placement x="%pattern_button6_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>6x6</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=6</action>
+			</object>
+		</template>
+
 		<template name="sort_options">
 			<object type="text" color="%text_color%">
 				<font resource="font" />
diff --git a/gui/devices/1920x1200/res/ui.xml b/gui/devices/1920x1200/res/ui.xml
index 8171cf5..160ddf6 100644
--- a/gui/devices/1920x1200/res/ui.xml
+++ b/gui/devices/1920x1200/res/ui.xml
@@ -221,6 +221,7 @@
 		<variable name="pattern_dot_radius" value="23" />
 		<variable name="pattern_line_color" value="#33B5E5" />
 		<variable name="pattern_line_width" value="18" />
+		<variable name="pattern_button_y" value="190" />
 	</variables>
 
 	<mousecursor>
@@ -329,6 +330,40 @@
 			</object>
 		</template>
 
+		<template name="pattern_options">
+			<object type="button">
+				<placement x="%col1_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>3x3</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=3</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col2_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>4x4</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=4</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col3_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>5x5</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=5</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col4_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>6x6</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=6</action>
+			</object>
+		</template>
+
 		<template name="sort_options">
 			<object type="text" color="%text_color%">
 				<font resource="font" />
diff --git a/gui/devices/320x320/res/ui.xml b/gui/devices/320x320/res/ui.xml
index afe2509..345a81c 100644
--- a/gui/devices/320x320/res/ui.xml
+++ b/gui/devices/320x320/res/ui.xml
@@ -211,6 +211,7 @@
 		<variable name="pattern_dot_radius" value="7" />
 		<variable name="pattern_line_color" value="#33B5E5" />
 		<variable name="pattern_line_width" value="4" />
+		<variable name="pattern_button_y" value="33" />
 	</variables>
 
 	<templates>
@@ -323,6 +324,40 @@
 			</object>
 		</template>
 
+		<template name="pattern_options">
+			<object type="button">
+				<placement x="%col1_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>3x3</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=3</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col2_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>4x4</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=4</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col3_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>5x5</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=5</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col4_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>6x6</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=6</action>
+			</object>
+		</template>
+
 		<template name="sort_options">
 			<object type="text" color="%text_color%">
 				<font resource="mediumfont" />
diff --git a/gui/devices/480x800/res/ui.xml b/gui/devices/480x800/res/ui.xml
index c406e66..ec9df7e 100644
--- a/gui/devices/480x800/res/ui.xml
+++ b/gui/devices/480x800/res/ui.xml
@@ -195,14 +195,19 @@
 		<variable name="slidervalue_padding" value="13" />
 		<variable name="slidervalue_sliderw" value="7" />
 		<variable name="slidervalue_sliderh" value="40" />
-		<variable name="pattern_x" value="90" />
+		<variable name="pattern_button3_x" value="117" />
+		<variable name="pattern_button4_x" value="180" />
+		<variable name="pattern_button5_x" value="243" />
+		<variable name="pattern_button6_x" value="306" />
+		<variable name="pattern_x" value="41" />
 		<variable name="pattern_y" value="250" />
-		<variable name="pattern_width" value="300" />
+		<variable name="pattern_width" value="398" />
 		<variable name="pattern_dot_color" value="#33B5E5" />
 		<variable name="pattern_dot_color_active" value="#FFFFFF" />
 		<variable name="pattern_dot_radius" value="12" />
 		<variable name="pattern_line_color" value="#33B5E5" />
 		<variable name="pattern_line_width" value="9" />
+		<variable name="pattern_cancel_y" value="672" />
 	</variables>
 
 	<mousecursor>
@@ -319,6 +324,40 @@
 			</object>
 		</template>
 
+		<template name="pattern_options">
+			<object type="button">
+				<placement x="%pattern_button3_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>3x3</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=3</action>
+			</object>
+
+			<object type="button">
+				<placement x="%pattern_button4_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>4x4</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=4</action>
+			</object>
+
+			<object type="button">
+				<placement x="%pattern_button5_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>5x5</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=5</action>
+			</object>
+
+			<object type="button">
+				<placement x="%pattern_button6_x%" y="%row2_text_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>6x6</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=6</action>
+			</object>
+		</template>
+
 		<template name="sort_options">
 			<object type="text" color="%text_color%">
 				<font resource="font" />
diff --git a/gui/devices/800x480/res/ui.xml b/gui/devices/800x480/res/ui.xml
index a9bf904..a561a3c 100644
--- a/gui/devices/800x480/res/ui.xml
+++ b/gui/devices/800x480/res/ui.xml
@@ -222,6 +222,7 @@
 		<variable name="pattern_dot_radius" value="10" />
 		<variable name="pattern_line_color" value="#33B5E5" />
 		<variable name="pattern_line_width" value="7" />
+		<variable name="pattern_button_y" value="94" />
 	</variables>
 
 	<mousecursor>
@@ -332,6 +333,40 @@
 			</object>
 		</template>
 
+		<template name="pattern_options">
+			<object type="button">
+				<placement x="%col1_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>3x3</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=3</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col2_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>4x4</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=4</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col3_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>5x5</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=5</action>
+			</object>
+
+			<object type="button">
+				<placement x="%col4_medium_x%" y="%pattern_button_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>6x6</text>
+				<image resource="sort_button" />
+				<action function="set">tw_gui_pattern_grid_size=6</action>
+			</object>
+		</template>
+
 		<template name="sort_options">
 			<object type="text" color="%text_color%">
 				<font resource="font" />
diff --git a/gui/devices/landscape/res/landscape.xml b/gui/devices/landscape/res/landscape.xml
index ec6f88e..b0f6b16 100644
--- a/gui/devices/landscape/res/landscape.xml
+++ b/gui/devices/landscape/res/landscape.xml
@@ -63,6 +63,10 @@
 			<sort name="tw_gui_sort_order" />
 		</style>
 
+		<style name="patternpassword">
+			<size name="tw_gui_pattern_grid_size" default="3" />
+		</style>
+
 		<style name="partitionlist">
 			<style name="scrolllist" />
 			<icon selected="checkbox_true" unselected="checkbox_false" />
@@ -3359,6 +3363,8 @@
 				<text>Pattern Failed, Please Try Again</text>
 			</object>
 
+			<object type="template" name="pattern_options" />
+
 			<object type="patternpassword">
 				<placement x="%pattern_x%" y="%pattern_y%" w="%pattern_width%" h="%pattern_width%" />
 				<dot color="%pattern_dot_color%" activecolor="%pattern_dot_color_active%" radius="%pattern_dot_radius%" />
diff --git a/gui/devices/portrait/res/portrait.xml b/gui/devices/portrait/res/portrait.xml
index 9c23067..b7e79e9 100644
--- a/gui/devices/portrait/res/portrait.xml
+++ b/gui/devices/portrait/res/portrait.xml
@@ -58,6 +58,10 @@
 			<sort name="tw_gui_sort_order" />
 		</style>
 
+		<style name="patternpassword">
+			<size name="tw_gui_pattern_grid_size" default="3" />
+		</style>
+
 		<style name="partitionlist">
 			<style name="scrolllist" />
 			<icon selected="checkbox_true" unselected="checkbox_false" />
@@ -3382,10 +3386,12 @@
 			<object type="text">
 				<condition var1="tw_password_fail" var2="1" />
 				<font resource="font" color="%text_fail_color%"/>
-				<placement x="%center_x%" y="%row2_text_y%" placement="5" />
+				<placement x="%center_x%" y="%row1_text_y%" placement="5" />
 				<text>Pattern Failed, Please Try Again</text>
 			</object>
 
+			<object type="template" name="pattern_options" />
+
 			<object type="patternpassword">
 				<placement x="%pattern_x%" y="%pattern_y%" w="%pattern_width%" h="%pattern_width%" />
 				<dot color="%pattern_dot_color%" activecolor="%pattern_dot_color_active%" radius="%pattern_dot_radius%" />
@@ -3395,7 +3401,7 @@
 			</object>
 
 			<object type="button">
-				<placement x="%col_center_x%" y="%row4_y%" />
+				<placement x="%col_center_x%" y="%pattern_cancel_y%" />
 				<text>Cancel</text>
 				<actions>
 					<action function="set">tw_page_done=1</action>
diff --git a/gui/devices/watch/res/watch.xml b/gui/devices/watch/res/watch.xml
index 3adf164..2dc2912 100644
--- a/gui/devices/watch/res/watch.xml
+++ b/gui/devices/watch/res/watch.xml
@@ -58,6 +58,10 @@
 			<sort name="tw_gui_sort_order" />
 		</style>
 
+		<style name="patternpassword">
+			<size name="tw_gui_pattern_grid_size" default="3" />
+		</style>
+
 		<style name="partitionlist">
 			<style name="scrolllist" />
 			<icon selected="checkbox_true" unselected="checkbox_false" />
@@ -3379,6 +3383,8 @@
 				<text>Pattern Failed, Please Try Again</text>
 			</object>
 
+			<object type="template" name="pattern_options" />
+
 			<object type="patternpassword">
 				<placement x="%pattern_x%" y="%pattern_y%" w="%pattern_width%" h="%pattern_width%" />
 				<dot color="%pattern_dot_color%" activecolor="%pattern_dot_color_active%" radius="%pattern_dot_radius%" />