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     void SetSystemUpdateText(bool security_update);
38 
39     // progress indicator
40     void SetProgressType(ProgressType type);
41     void ShowProgress(float portion, float seconds);
42     void SetProgress(float fraction);
43 
44     void SetStage(int current, int max);
45 
46     // text log
47     void ShowText(bool visible);
48     bool IsTextVisible();
49     bool WasTextEverVisible();
50 
51     // printing messages
52     void Print(const char* fmt, ...) __printflike(2, 3);
53     void PrintOnScreenOnly(const char* fmt, ...) __printflike(2, 3);
54     void ShowFile(const char* filename);
55 
56     // menu display
57     void StartMenu(const char* const * headers, const char* const * items,
58                    int initial_selection);
59     int SelectMenu(int sel);
60     void EndMenu();
61 
62     void KeyLongPress(int);
63 
64     void Redraw();
65 
66     enum UIElement {
67         HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
68     };
69     void SetColor(UIElement e);
70 
71   protected:
72     Icon currentIcon;
73 
74     const char* locale;
75     bool intro_done;
76     int current_frame;
77 
78     // The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi.
79     float density_;
80     // True if we should use the large layout.
81     bool is_large_;
82 
83     GRSurface* error_icon;
84 
85     GRSurface* erasing_text;
86     GRSurface* error_text;
87     GRSurface* installing_text;
88     GRSurface* no_command_text;
89 
90     GRSurface** introFrames;
91     GRSurface** loopFrames;
92 
93     GRSurface* progressBarEmpty;
94     GRSurface* progressBarFill;
95     GRSurface* stageMarkerEmpty;
96     GRSurface* stageMarkerFill;
97 
98     ProgressType progressBarType;
99 
100     float progressScopeStart, progressScopeSize, progress;
101     double progressScopeTime, progressScopeDuration;
102 
103     // true when both graphics pages are the same (except for the progress bar).
104     bool pagesIdentical;
105 
106     size_t text_cols_, text_rows_;
107 
108     // Log text overlay, displayed when a magic key is pressed.
109     char** text_;
110     size_t text_col_, text_row_, text_top_;
111 
112     bool show_text;
113     bool show_text_ever;   // has show_text ever been true?
114 
115     char** menu_;
116     const char* const* menu_headers_;
117     bool show_menu;
118     int menu_items, menu_sel;
119 
120     // An alternate text screen, swapped with 'text_' when we're viewing a log file.
121     char** file_viewer_text_;
122 
123     pthread_t progress_thread_;
124 
125     // Number of intro frames and loop frames in the animation.
126     int intro_frames;
127     int loop_frames;
128 
129     // Number of frames per sec (default: 30) for both parts of the animation.
130     int animation_fps;
131 
132     int stage, max_stage;
133 
134     int char_width_;
135     int char_height_;
136     pthread_mutex_t updateMutex;
137     bool rtl_locale;
138 
139     void draw_background_locked();
140     void draw_foreground_locked();
141     void draw_screen_locked();
142     void update_screen_locked();
143     void update_progress_locked();
144 
145     GRSurface* GetCurrentFrame();
146     GRSurface* GetCurrentText();
147 
148     static void* ProgressThreadStartRoutine(void* data);
149     void ProgressThreadLoop();
150 
151     void ShowFile(FILE*);
152     void PrintV(const char*, bool, va_list);
153     void PutChar(char);
154     void ClearText();
155 
156     void LoadAnimation();
157     void LoadBitmap(const char* filename, GRSurface** surface);
158     void LoadLocalizedBitmap(const char* filename, GRSurface** surface);
159 
160     int PixelsFromDp(int dp);
161     int GetAnimationBaseline();
162     int GetProgressBaseline();
163     int GetTextBaseline();
164 
165     void DrawHorizontalRule(int* y);
166     void DrawTextLine(int x, int* y, const char* line, bool bold);
167     void DrawTextLines(int x, int* y, const char* const* lines);
168 };
169 
170 #endif  // RECOVERY_UI_H
171