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); 41 void ShowProgress(float portion, float seconds); 42 void SetProgress(float fraction); 43 44 void SetStage(int current, int max); 45 46 // text log 47 void ShowText(bool visible); 48 bool IsTextVisible(); 49 bool WasTextEverVisible(); 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 bool intro_done; 76 int current_frame; 77 78 // The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi. 79 float density_; 80 // True if we should use the large layout. 81 bool is_large_; 82 83 GRSurface* error_icon; 84 85 GRSurface* erasing_text; 86 GRSurface* error_text; 87 GRSurface* installing_text; 88 GRSurface* no_command_text; 89 90 GRSurface** introFrames; 91 GRSurface** loopFrames; 92 93 GRSurface* progressBarEmpty; 94 GRSurface* progressBarFill; 95 GRSurface* stageMarkerEmpty; 96 GRSurface* stageMarkerFill; 97 98 ProgressType progressBarType; 99 100 float progressScopeStart, progressScopeSize, progress; 101 double progressScopeTime, progressScopeDuration; 102 103 // true when both graphics pages are the same (except for the progress bar). 104 bool pagesIdentical; 105 106 size_t text_cols_, text_rows_; 107 108 // Log text overlay, displayed when a magic key is pressed. 109 char** text_; 110 size_t text_col_, text_row_, text_top_; 111 112 bool show_text; 113 bool show_text_ever; // has show_text ever been true? 114 115 char** menu_; 116 const char* const* menu_headers_; 117 bool show_menu; 118 int menu_items, menu_sel; 119 120 // An alternate text screen, swapped with 'text_' when we're viewing a log file. 121 char** file_viewer_text_; 122 123 pthread_t progress_thread_; 124 125 // Number of intro frames and loop frames in the animation. 126 int intro_frames; 127 int loop_frames; 128 129 // Number of frames per sec (default: 30) for both parts of the animation. 130 int animation_fps; 131 132 int stage, max_stage; 133 134 int char_width_; 135 int char_height_; 136 pthread_mutex_t updateMutex; 137 bool rtl_locale; 138 139 void draw_background_locked(); 140 void draw_foreground_locked(); 141 void draw_screen_locked(); 142 void update_screen_locked(); 143 void update_progress_locked(); 144 145 GRSurface* GetCurrentFrame(); 146 GRSurface* GetCurrentText(); 147 148 static void* ProgressThreadStartRoutine(void* data); 149 void ProgressThreadLoop(); 150 151 void ShowFile(FILE*); 152 void PrintV(const char*, bool, va_list); 153 void PutChar(char); 154 void ClearText(); 155 156 void LoadAnimation(); 157 void LoadBitmap(const char* filename, GRSurface** surface); 158 void LoadLocalizedBitmap(const char* filename, GRSurface** surface); 159 160 int PixelsFromDp(int dp); 161 int GetAnimationBaseline(); 162 int GetProgressBaseline(); 163 int GetTextBaseline(); 164 165 void DrawHorizontalRule(int* y); 166 void DrawTextLine(int x, int* y, const char* line, bool bold); 167 void DrawTextLines(int x, int* y, const char* const* lines); 168 }; 169 170 #endif // RECOVERY_UI_H 171