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