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