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