• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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) override;
41     void ShowProgress(float portion, float seconds) override;
42     void SetProgress(float fraction) override;
43 
44     void SetStage(int current, int max) override;
45 
46     // text log
47     void ShowText(bool visible) override;
48     bool IsTextVisible() override;
49     bool WasTextEverVisible() override;
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 
76     // The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi.
77     float density_;
78     // The layout to use.
79     int layout_;
80 
81     GRSurface* error_icon;
82 
83     GRSurface* erasing_text;
84     GRSurface* error_text;
85     GRSurface* installing_text;
86     GRSurface* no_command_text;
87 
88     GRSurface** introFrames;
89     GRSurface** loopFrames;
90 
91     GRSurface* progressBarEmpty;
92     GRSurface* progressBarFill;
93     GRSurface* stageMarkerEmpty;
94     GRSurface* stageMarkerFill;
95 
96     ProgressType progressBarType;
97 
98     float progressScopeStart, progressScopeSize, progress;
99     double progressScopeTime, progressScopeDuration;
100 
101     // true when both graphics pages are the same (except for the progress bar).
102     bool pagesIdentical;
103 
104     size_t text_cols_, text_rows_;
105 
106     // Log text overlay, displayed when a magic key is pressed.
107     char** text_;
108     size_t text_col_, text_row_, text_top_;
109 
110     bool show_text;
111     bool show_text_ever;   // has show_text ever been true?
112 
113     char** menu_;
114     const char* const* menu_headers_;
115     bool show_menu;
116     int menu_items, menu_sel;
117 
118     // An alternate text screen, swapped with 'text_' when we're viewing a log file.
119     char** file_viewer_text_;
120 
121     pthread_t progress_thread_;
122 
123     // Number of intro frames and loop frames in the animation.
124     size_t intro_frames;
125     size_t loop_frames;
126 
127     size_t current_frame;
128     bool intro_done;
129 
130     // Number of frames per sec (default: 30) for both parts of the animation.
131     int animation_fps;
132 
133     int stage, max_stage;
134 
135     int char_width_;
136     int char_height_;
137     pthread_mutex_t updateMutex;
138     bool rtl_locale;
139 
140     virtual void 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);
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);
170     void DrawTextLines(int x, int* y, const char* const* lines);
171 };
172 
173 #endif  // RECOVERY_UI_H
174