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