1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef RECOVERY_SCREEN_UI_H
18 #define RECOVERY_SCREEN_UI_H
19 
20 #include <pthread.h>
21 #include <stdio.h>
22 
23 #include "ui.h"
24 #include "minui/minui.h"
25 
26 // Implementation of RecoveryUI appropriate for devices with a screen
27 // (shows an icon + a progress bar, text logging, menu, etc.)
28 class ScreenRecoveryUI : public RecoveryUI {
29   public:
30     ScreenRecoveryUI();
31 
32     void Init();
33     void SetLocale(const char* locale);
34 
35     // overall recovery state ("background image")
36     void SetBackground(Icon icon);
37 
38     // progress indicator
39     void SetProgressType(ProgressType type);
40     void ShowProgress(float portion, float seconds);
41     void SetProgress(float fraction);
42 
43     void SetStage(int current, int max);
44 
45     // text log
46     void ShowText(bool visible);
47     bool IsTextVisible();
48     bool WasTextEverVisible();
49 
50     // printing messages
51     void Print(const char* fmt, ...) __printflike(2, 3);
52     void ShowFile(const char* filename);
53 
54     // menu display
55     void StartMenu(const char* const * headers, const char* const * items,
56                    int initial_selection);
57     int SelectMenu(int sel);
58     void EndMenu();
59 
60     void KeyLongPress(int);
61 
62     void Redraw();
63 
64     enum UIElement {
65         HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
66     };
67     void SetColor(UIElement e);
68 
69   private:
70     Icon currentIcon;
71     int installingFrame;
72     const char* locale;
73     bool rtl_locale;
74 
75     pthread_mutex_t updateMutex;
76     GRSurface* backgroundIcon[5];
77     GRSurface* backgroundText[5];
78     GRSurface** installation;
79     GRSurface* progressBarEmpty;
80     GRSurface* progressBarFill;
81     GRSurface* stageMarkerEmpty;
82     GRSurface* stageMarkerFill;
83 
84     ProgressType progressBarType;
85 
86     float progressScopeStart, progressScopeSize, progress;
87     double progressScopeTime, progressScopeDuration;
88 
89     // true when both graphics pages are the same (except for the progress bar).
90     bool pagesIdentical;
91 
92     size_t text_cols_, text_rows_;
93 
94     // Log text overlay, displayed when a magic key is pressed.
95     char** text_;
96     size_t text_col_, text_row_, text_top_;
97 
98     bool show_text;
99     bool show_text_ever;   // has show_text ever been true?
100 
101     char** menu_;
102     const char* const* menu_headers_;
103     bool show_menu;
104     int menu_items, menu_sel;
105 
106     // An alternate text screen, swapped with 'text_' when we're viewing a log file.
107     char** file_viewer_text_;
108 
109     pthread_t progress_thread_;
110 
111     int animation_fps;
112     int installing_frames;
113 
114     int iconX, iconY;
115 
116     int stage, max_stage;
117 
118     void draw_background_locked(Icon icon);
119     void draw_progress_locked();
120     void draw_screen_locked();
121     void update_screen_locked();
122     void update_progress_locked();
123 
124     static void* ProgressThreadStartRoutine(void* data);
125     void ProgressThreadLoop();
126 
127     void ShowFile(FILE*);
128     void PutChar(char);
129     void ClearText();
130 
131     void DrawHorizontalRule(int* y);
132     void DrawTextLine(int* y, const char* line, bool bold);
133     void DrawTextLines(int* y, const char* const* lines);
134 
135     void LoadBitmap(const char* filename, GRSurface** surface);
136     void LoadBitmapArray(const char* filename, int* frames, GRSurface*** surface);
137     void LoadLocalizedBitmap(const char* filename, GRSurface** surface);
138 };
139 
140 #endif  // RECOVERY_UI_H
141