Merge "app: aboot: Using new function for unlock/lock menu"
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 11d64c4..31b5315 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -2548,23 +2548,21 @@
 	}
 
 	/* status is true, it means to unlock device */
-	if (status) {
-		if(!is_allow_unlock) {
-			fastboot_fail("oem unlock is not allowed");
-			return;
-		}
+	if (status && !is_allow_unlock) {
+		fastboot_fail("oem unlock is not allowed");
+		return;
+	}
 
 #if FBCON_DISPLAY_MSG
-		display_unlock_menu(type);
-		fastboot_okay("");
-		return;
+	display_unlock_menu(type, status);
+	fastboot_okay("");
+	return;
 #else
-		if (type == UNLOCK) {
-			fastboot_fail("Need wipe userdata. Do 'fastboot oem unlock-go'");
-			return;
-		}
-#endif
+	if (status && type == UNLOCK) {
+		fastboot_fail("Need wipe userdata. Do 'fastboot oem unlock-go'");
+		return;
 	}
+#endif
 
 	set_device_unlock_value(type, status);
 
diff --git a/platform/msm_shared/display_menu.c b/platform/msm_shared/display_menu.c
index c9a58a8..b554860 100644
--- a/platform/msm_shared/display_menu.c
+++ b/platform/msm_shared/display_menu.c
@@ -41,19 +41,30 @@
 #include <target.h>
 #include <sys/types.h>
 #include <../../../app/aboot/devinfo.h>
+#include <../../../app/aboot/recovery.h>
 
-static const char *unlock_menu_common_msg = "If you unlock the bootloader, "\
-				"you will be able to install "\
-				"custom operating system on this phone.\n\n"\
-				"A custom OS is not subject to the same testing "\
-				"as the original OS, "\
-				"and can cause your phone and installed "\
-				"applications to stop working properly.\n\n"\
+static const char *unlock_menu_common_msg = "By unlocking the bootloader, you will be able to install "\
+				"custom operating system on this phone. "\
+				"A custom OS is not subject to the same level of testing "\
+				"as the original OS, and can cause your phone "\
+				"and installed applications to stop working properly.\n\n"\
+				"Software integrity cannot be guaranteed with a custom OS, "\
+				"so any data stored on the phone while the bootloader "\
+				"is unlocked may be at risk.\n\n"\
 				"To prevent unauthorized access to your personal data, "\
 				"unlocking the bootloader will also delete all personal "\
-				"data from your phone(a \"factory data reset\").\n\n"\
-				"Press the Volume Up/Down buttons to select Yes "\
-				"or No. Then press the Power button to continue.\n";
+				"data on your phone.\n\n"\
+				"Press the Volume keys to select whether to unlock the bootloader, "\
+				"then the Power Button to continue.\n\n";
+
+static const char *lock_menu_common_msg = "If you lock the bootloader, "\
+				"you will not be able to install "\
+				"custom operating system on this phone.\n\n"\
+				"To prevent unauthorized access to your personal data, "\
+				"locking the bootloader will also delete all personal "\
+				"data on your phone.\n\n"\
+				"Press the Volume keys to select whether to "\
+				"lock the bootloader, then the power button to continue.\n\n";
 
 #define YELLOW_WARNING_MSG	"Your device has loaded a different operating system\n\n "\
 				"Visit this link on another device:\n"
@@ -107,6 +118,18 @@
 		[3] = "Power off\n",
 		[4] = "Boot to FFBM\n"};
 
+static struct unlock_info munlock_info[] = {
+		[DISPLAY_MENU_LOCK] = {UNLOCK, FALSE},
+		[DISPLAY_MENU_UNLOCK] = {UNLOCK, TRUE},
+		[DISPLAY_MENU_LOCK_CRITICAL] = {UNLOCK_CRITICAL, FALSE},
+		[DISPLAY_MENU_UNLOCK_CRITICAL] = {UNLOCK_CRITICAL, TRUE},
+};
+
+struct unlock_option_msg munlock_option_msg[] = {
+		[TRUE] = {"DO NOT UNLOCK THE BOOTLOADER \n", "UNLOCK THE BOOTLOADER \n"},
+		[FALSE] = {"DO NOT LOCK THE BOOTLOADER \n", "LOCK THE BOOTLOADER \n"},
+};
+
 static int big_factor = 2;
 static int common_factor = 1;
 
@@ -207,40 +230,71 @@
 	return str_target;
 }
 
+/**
+  Reset device unlock status
+  @param[in] Type    The type of the unlock.
+                     [DISPLAY_MENU_UNLOCK]: unlock the device
+                     [DISPLAY_MENU_UNLOCK_CRITICAL]: critical unlock the device
+                     [DISPLAY_MENU_LOCK]: lock the device
+                     [DISPLAY_MENU_LOCK_CRITICAL]: critical lock the device
+ **/
+void reset_device_unlock_status (int type)
+{
+	struct recovery_message msg;
+
+	if (type == DISPLAY_MENU_LOCK ||
+		type == DISPLAY_MENU_UNLOCK ||
+		type == DISPLAY_MENU_LOCK_CRITICAL ||
+		type == DISPLAY_MENU_UNLOCK_CRITICAL) {
+		set_device_unlock_value (munlock_info[type].unlock_type,
+				munlock_info[type].unlock_value);
+		memset(&msg, 0, sizeof(msg));
+		snprintf(msg.recovery, sizeof(msg.recovery), "recovery\n--wipe_data");
+		write_misc(0, &msg, sizeof(msg));
+	}
+}
+
 /* msg_lock need to be holded when call this function. */
-void display_unlock_menu_renew(struct select_msg_info *unlock_msg_info, int type)
+static void display_unlock_menu_renew(struct select_msg_info *unlock_msg_info,
+                                      int type, bool status)
 {
 	fbcon_clear();
 	memset(&unlock_msg_info->info, 0, sizeof(struct menu_info));
 
-	display_fbcon_menu_message("Unlock bootloader?\n",
+	display_fbcon_menu_message("<!>\n\n",
 		FBCON_UNLOCK_TITLE_MSG, big_factor);
-	fbcon_draw_line(FBCON_COMMON_MSG);
 
-	display_fbcon_menu_message((char*)unlock_menu_common_msg,
-		FBCON_COMMON_MSG, common_factor);
+	if (status) {
+		display_fbcon_menu_message((char*)unlock_menu_common_msg,
+			FBCON_COMMON_MSG, common_factor);
+	} else {
+		display_fbcon_menu_message((char*)lock_menu_common_msg,
+			FBCON_COMMON_MSG, common_factor);
+	}
+
 	fbcon_draw_line(FBCON_COMMON_MSG);
 	unlock_msg_info->info.option_start[0] = fbcon_get_current_line();
-	display_fbcon_menu_message("Yes\n",
-		FBCON_COMMON_MSG, big_factor);
+	display_fbcon_menu_message((char *)munlock_option_msg[status].ignore_msg,
+                               FBCON_COMMON_MSG, common_factor);
 	unlock_msg_info->info.option_bg[0] = fbcon_get_current_bg();
-	display_fbcon_menu_message("Unlock bootloader(may void warranty)\n",
-		FBCON_COMMON_MSG, common_factor);
 	unlock_msg_info->info.option_end[0] = fbcon_get_current_line();
 	fbcon_draw_line(FBCON_COMMON_MSG);
 	unlock_msg_info->info.option_start[1] = fbcon_get_current_line();
-	display_fbcon_menu_message("No\n",
-		FBCON_COMMON_MSG, big_factor);
+	display_fbcon_menu_message((char *)munlock_option_msg[status].comfirm_msg,
+                               FBCON_COMMON_MSG, common_factor);
 	unlock_msg_info->info.option_bg[1] = fbcon_get_current_bg();
-	display_fbcon_menu_message("Do not unlock bootloader and restart phone\n",
-		FBCON_COMMON_MSG, common_factor);
 	unlock_msg_info->info.option_end[1] = fbcon_get_current_line();
 	fbcon_draw_line(FBCON_COMMON_MSG);
 
-	if (type == UNLOCK)
+	if (type == UNLOCK) {
 		unlock_msg_info->info.msg_type = DISPLAY_MENU_UNLOCK;
-	else if (type == UNLOCK_CRITICAL)
+		if (!status)
+			unlock_msg_info->info.msg_type = DISPLAY_MENU_LOCK;
+	} else if (type == UNLOCK_CRITICAL) {
 		unlock_msg_info->info.msg_type = DISPLAY_MENU_UNLOCK_CRITICAL;
+		if (!status)
+			unlock_msg_info->info.msg_type = DISPLAY_MENU_LOCK_CRITICAL;
+	}
 
 	unlock_msg_info->info.option_num = 2;
 
@@ -472,7 +526,7 @@
 /* The fuction be called after device in fastboot mode,
  * so it's no need to initialize the msg_lock again
  */
-void display_unlock_menu(int type)
+void display_unlock_menu(int type, bool status)
 {
 	struct select_msg_info *unlock_menu_msg_info;
 	unlock_menu_msg_info = &msg_info;
@@ -489,10 +543,11 @@
 	unlock_menu_msg_info->last_msg_type =
 		unlock_menu_msg_info->info.msg_type;
 
-	display_unlock_menu_renew(unlock_menu_msg_info, type);
+	display_unlock_menu_renew(unlock_menu_msg_info, type, status);
 	mutex_release(&unlock_menu_msg_info->msg_lock);
 
-	dprintf(INFO, "creating unlock keys detect thread\n");
+	dprintf(INFO, "creating %s keys detect thread\n",
+		status ? "unlock":"lock");
 	display_menu_thread_start(unlock_menu_msg_info);
 }
 
diff --git a/platform/msm_shared/include/display_menu.h b/platform/msm_shared/include/display_menu.h
index 5320be6..f063f03 100644
--- a/platform/msm_shared/include/display_menu.h
+++ b/platform/msm_shared/include/display_menu.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2016, 2018, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -44,6 +44,8 @@
 	DISPLAY_MENU_UNLOCK_CRITICAL,
 	DISPLAY_MENU_LOGGING,
 	DISPLAY_MENU_EIO,
+	DISPLAY_MENU_LOCK,
+	DISPLAY_MENU_LOCK_CRITICAL,
 };
 
 struct menu_info {
@@ -64,14 +66,24 @@
 	mutex_t			msg_lock;
 };
 
+struct unlock_option_msg {
+	const char *ignore_msg;
+	const char *comfirm_msg;
+};
+
+struct unlock_info{
+	int unlock_type;
+	boolean unlock_value;
+ };
+
 void wait_for_users_action(void);
-void display_unlock_menu_renew(struct select_msg_info *msg_info, int type);
+void reset_device_unlock_status (int type);
 void display_bootverify_menu_renew(struct select_msg_info *msg_info, int type);
 void display_bootverify_option_menu_renew(struct select_msg_info *msg_info);
 void display_fastboot_menu_renew(struct select_msg_info *fastboot_msg_info);
 void display_bootverify_menu(int type);
 void display_fastboot_menu();
-void display_unlock_menu(int type);
+void display_unlock_menu(int type, bool status);
 void msg_lock_init();
 void exit_menu_keys_detection();
 #endif				/* __PLATFORM_MSM_SHARED_DISPLAY_MENU_H */
diff --git a/platform/msm_shared/menu_keys_detect.c b/platform/msm_shared/menu_keys_detect.c
index f118e00..6b552e8 100644
--- a/platform/msm_shared/menu_keys_detect.c
+++ b/platform/msm_shared/menu_keys_detect.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -94,8 +94,8 @@
 };
 
 static uint32_t unlock_index_action[] = {
-		[0] = RECOVER,
-		[1] = RESTART,
+		[0] = RESTART,
+		[1] = RECOVER,
 };
 
 static int is_key_pressed(int keys_type)
@@ -118,21 +118,7 @@
 	fbcon_clear();
 	switch (reason) {
 		case RECOVER:
-			if (msg_info->info.msg_type == DISPLAY_MENU_UNLOCK) {
-				set_device_unlock_value(UNLOCK, TRUE);
-			} else if (msg_info->info.msg_type == DISPLAY_MENU_UNLOCK_CRITICAL) {
-				set_device_unlock_value(UNLOCK_CRITICAL, TRUE);
-			}
-
-			if (msg_info->info.msg_type == DISPLAY_MENU_UNLOCK ||
-				msg_info->info.msg_type == DISPLAY_MENU_UNLOCK_CRITICAL) {
-				/* wipe data */
-				struct recovery_message msg;
-
-				memset(&msg, 0, sizeof(msg));
-				snprintf(msg.recovery, sizeof(msg.recovery), "recovery\n--wipe_data");
-				write_misc(0, &msg, sizeof(msg));
-			}
+			reset_device_unlock_status(msg_info->info.msg_type);
 			reboot_device(RECOVERY_MODE);
 			break;
 		case RESTART:
@@ -265,6 +251,8 @@
 			break;
 		case DISPLAY_MENU_UNLOCK:
 		case DISPLAY_MENU_UNLOCK_CRITICAL:
+		case DISPLAY_MENU_LOCK:
+		case DISPLAY_MENU_LOCK_CRITICAL:
 			if(msg_info->info.option_index < ARRAY_SIZE(unlock_index_action))
 				reason = unlock_index_action[msg_info->info.option_index];
 			break;
@@ -306,6 +294,16 @@
 		menu_volume_down_func,
 		power_key_func,
 	},
+	[DISPLAY_MENU_LOCK] = {
+		menu_volume_up_func,
+		menu_volume_down_func,
+		power_key_func,
+	},
+	[DISPLAY_MENU_LOCK_CRITICAL] = {
+		menu_volume_up_func,
+		menu_volume_down_func,
+		power_key_func,
+	},
 	[DISPLAY_MENU_YELLOW] = {
 		boot_warning_volume_keys_func,
 		boot_warning_volume_keys_func,