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