/* Copyright (c) 2015-2016, 2018, 2019, 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
* met:
*     * Redistributions of source code must retain the above copyright
*	notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above
*	copyright notice, this list of conditions and the following
*	disclaimer in the documentation and/or other materials provided
*	with the distribution.
*     * Neither the name of The Linux Foundation nor the names of its
*	contributors may be used to endorse or promote products derived
*	from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef __PLATFORM_MSM_SHARED_DISPLAY_MENU_H
#define __PLATFORM_MSM_SHARED_DISPLAY_MENU_H

#include <openssl/evp.h>
#include <kernel/mutex.h>

#define SELECT_OPTION_MAX	5

enum display_menu_type {
	DISPLAY_MENU_YELLOW = 0,
	DISPLAY_MENU_ORANGE,
	DISPLAY_MENU_RED,
	DISPLAY_MENU_MORE_OPTION,
	DISPLAY_MENU_UNLOCK,
	DISPLAY_MENU_FASTBOOT,
	DISPLAY_MENU_UNLOCK_CRITICAL,
	DISPLAY_MENU_LOGGING,
	DISPLAY_MENU_EIO,
	DISPLAY_MENU_LOCK,
	DISPLAY_MENU_LOCK_CRITICAL,
};

struct menu_info {
	uint32_t	option_start[SELECT_OPTION_MAX];
	uint32_t	option_end[SELECT_OPTION_MAX];
	uint32_t	option_bg[SELECT_OPTION_MAX];
	uint32_t	option_num;
	uint32_t	option_index;
	uint32_t	msg_type;
	uint32_t	timeout_time;
	bool		is_exit;
	bool		rel_exit;
};

struct select_msg_info {
	struct menu_info	info;
	uint32_t		last_msg_type;
	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 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_bootverify_menu_update (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, bool status);
void msg_lock_init();
void exit_menu_keys_detection();
#endif				/* __PLATFORM_MSM_SHARED_DISPLAY_MENU_H */
