1211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker/*
2211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * Copyright (C) 2011 The Android Open Source Project
3211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker *
4211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * Licensed under the Apache License, Version 2.0 (the "License");
5211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * you may not use this file except in compliance with the License.
6211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * You may obtain a copy of the License at
7211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker *
8211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker *      http://www.apache.org/licenses/LICENSE-2.0
9211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker *
10211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * Unless required by applicable law or agreed to in writing, software
11211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * distributed under the License is distributed on an "AS IS" BASIS,
12211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * See the License for the specific language governing permissions and
14211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker * limitations under the License.
15211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker */
16211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
17211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker#ifndef RECOVERY_SCREEN_UI_H
18211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker#define RECOVERY_SCREEN_UI_H
19211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
20211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker#include <pthread.h>
21211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
22211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker#include "ui.h"
23211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker#include "minui/minui.h"
24211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
25211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker// Implementation of RecoveryUI appropriate for devices with a screen
26211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker// (shows an icon + a progress bar, text logging, menu, etc.)
27211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongkerclass ScreenRecoveryUI : public RecoveryUI {
28211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker  public:
29211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    ScreenRecoveryUI();
30211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
31211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void Init();
325fa8c23911759a9e81af0e7fb5eb431277b8e9a6Doug Zongker    void SetLocale(const char* locale);
33211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
34211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // overall recovery state ("background image")
35211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void SetBackground(Icon icon);
36211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
37211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // progress indicator
38211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void SetProgressType(ProgressType type);
39211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void ShowProgress(float portion, float seconds);
40211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void SetProgress(float fraction);
41211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
42c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker    void SetStage(int current, int max);
43c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker
44211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // text log
45211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void ShowText(bool visible);
46211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    bool IsTextVisible();
47211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    bool WasTextEverVisible();
48211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
49211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // printing messages
50211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void Print(const char* fmt, ...); // __attribute__((format(printf, 1, 2)));
51211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
52211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // menu display
53211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void StartMenu(const char* const * headers, const char* const * items,
54211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker                           int initial_selection);
55211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    int SelectMenu(int sel);
56211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void EndMenu();
57211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
58c0441d171914e59941ec4f815ae0aabf56d6504fDoug Zongker    void Redraw();
59c0441d171914e59941ec4f815ae0aabf56d6504fDoug Zongker
60c0441d171914e59941ec4f815ae0aabf56d6504fDoug Zongker    enum UIElement { HEADER, MENU, MENU_SEL_BG, MENU_SEL_FG, LOG, TEXT_FILL };
61c0441d171914e59941ec4f815ae0aabf56d6504fDoug Zongker    virtual void SetColor(UIElement e);
62c0441d171914e59941ec4f815ae0aabf56d6504fDoug Zongker
63211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker  private:
64211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    Icon currentIcon;
65211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    int installingFrame;
66a418aa7dd5e94cbf1ab2a6fa1c63f60e5e087d42Doug Zongker    const char* locale;
675fa8c23911759a9e81af0e7fb5eb431277b8e9a6Doug Zongker    bool rtl_locale;
68211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
69211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    pthread_mutex_t updateMutex;
7002ec6b88ed4e6cf40cc257572b07c7277b7b6341Doug Zongker    gr_surface backgroundIcon[5];
7102ec6b88ed4e6cf40cc257572b07c7277b7b6341Doug Zongker    gr_surface backgroundText[5];
72eac881c952fc6be0beeb5f719e3a70e651f3610eDoug Zongker    gr_surface *installation;
73211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    gr_surface progressBarEmpty;
74211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    gr_surface progressBarFill;
75c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker    gr_surface stageMarkerEmpty;
76c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker    gr_surface stageMarkerFill;
77211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
78211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    ProgressType progressBarType;
79211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
80211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    float progressScopeStart, progressScopeSize, progress;
81211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    double progressScopeTime, progressScopeDuration;
82211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
83211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // true when both graphics pages are the same (except for the
84211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // progress bar)
85211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    bool pagesIdentical;
86211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
87211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    static const int kMaxCols = 96;
886fd59ac07d91eb373f4269a40e688aa82a6ccc6eDoug Zongker    static const int kMaxRows = 96;
89211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
90211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    // Log text overlay, displayed when a magic key is pressed
91211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    char text[kMaxRows][kMaxCols];
92211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    int text_cols, text_rows;
93211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    int text_col, text_row, text_top;
94211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    bool show_text;
95211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    bool show_text_ever;   // has show_text ever been true?
96211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
97211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    char menu[kMaxRows][kMaxCols];
98211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    bool show_menu;
99211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    int menu_top, menu_items, menu_sel;
100211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
101211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    pthread_t progress_t;
10232a0a47a596509792fde8cdbf8b4b0705708b2beDoug Zongker
10332a0a47a596509792fde8cdbf8b4b0705708b2beDoug Zongker    int animation_fps;
10432a0a47a596509792fde8cdbf8b4b0705708b2beDoug Zongker    int installing_frames;
105c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker  protected:
106c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker  private:
107eac881c952fc6be0beeb5f719e3a70e651f3610eDoug Zongker
108eac881c952fc6be0beeb5f719e3a70e651f3610eDoug Zongker    int iconX, iconY;
109211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
110c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker    int stage, max_stage;
111c87bab101893e8322b49d7c8600e3367b20ab50aDoug Zongker
112211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void draw_background_locked(Icon icon);
113211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void draw_progress_locked();
114211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void draw_screen_locked();
115211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void update_screen_locked();
116211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void update_progress_locked();
117211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    static void* progress_thread(void* cookie);
11832a0a47a596509792fde8cdbf8b4b0705708b2beDoug Zongker    void progress_loop();
119211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
120211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker    void LoadBitmap(const char* filename, gr_surface* surface);
121eac881c952fc6be0beeb5f719e3a70e651f3610eDoug Zongker    void LoadBitmapArray(const char* filename, int* frames, gr_surface** surface);
12202ec6b88ed4e6cf40cc257572b07c7277b7b6341Doug Zongker    void LoadLocalizedBitmap(const char* filename, gr_surface* surface);
123211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker};
124211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker
125211aebc4e09ce7ca37003be4f01c83111cf0bb49Doug Zongker#endif  // RECOVERY_UI_H
126