Home | History | Annotate | Download | only in recovery
      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 
     38     // progress indicator
     39     void SetProgressType(ProgressType type);
     40     void ShowProgress(float portion, float seconds);
     41     void SetProgress(float fraction);
     42 
     43     void SetStage(int current, int max);
     44 
     45     // text log
     46     void ShowText(bool visible);
     47     bool IsTextVisible();
     48     bool WasTextEverVisible();
     49 
     50     // printing messages
     51     void Print(const char* fmt, ...) __printflike(2, 3);
     52     void ShowFile(const char* filename);
     53 
     54     // menu display
     55     void StartMenu(const char* const * headers, const char* const * items,
     56                    int initial_selection);
     57     int SelectMenu(int sel);
     58     void EndMenu();
     59 
     60     void KeyLongPress(int);
     61 
     62     void Redraw();
     63 
     64     enum UIElement {
     65         HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
     66     };
     67     void SetColor(UIElement e);
     68 
     69   private:
     70     Icon currentIcon;
     71     int installingFrame;
     72     const char* locale;
     73     bool rtl_locale;
     74 
     75     pthread_mutex_t updateMutex;
     76     GRSurface* backgroundIcon[5];
     77     GRSurface* backgroundText[5];
     78     GRSurface** installation;
     79     GRSurface* progressBarEmpty;
     80     GRSurface* progressBarFill;
     81     GRSurface* stageMarkerEmpty;
     82     GRSurface* stageMarkerFill;
     83 
     84     ProgressType progressBarType;
     85 
     86     float progressScopeStart, progressScopeSize, progress;
     87     double progressScopeTime, progressScopeDuration;
     88 
     89     // true when both graphics pages are the same (except for the progress bar).
     90     bool pagesIdentical;
     91 
     92     size_t text_cols_, text_rows_;
     93 
     94     // Log text overlay, displayed when a magic key is pressed.
     95     char** text_;
     96     size_t text_col_, text_row_, text_top_;
     97 
     98     bool show_text;
     99     bool show_text_ever;   // has show_text ever been true?
    100 
    101     char** menu_;
    102     const char* const* menu_headers_;
    103     bool show_menu;
    104     int menu_items, menu_sel;
    105 
    106     // An alternate text screen, swapped with 'text_' when we're viewing a log file.
    107     char** file_viewer_text_;
    108 
    109     pthread_t progress_thread_;
    110 
    111     int animation_fps;
    112     int installing_frames;
    113 
    114     int iconX, iconY;
    115 
    116     int stage, max_stage;
    117 
    118     void draw_background_locked(Icon icon);
    119     void draw_progress_locked();
    120     void draw_screen_locked();
    121     void update_screen_locked();
    122     void update_progress_locked();
    123 
    124     static void* ProgressThreadStartRoutine(void* data);
    125     void ProgressThreadLoop();
    126 
    127     void ShowFile(FILE*);
    128     void PutChar(char);
    129     void ClearText();
    130 
    131     void DrawHorizontalRule(int* y);
    132     void DrawTextLine(int* y, const char* line, bool bold);
    133     void DrawTextLines(int* y, const char* const* lines);
    134 
    135     void LoadBitmap(const char* filename, GRSurface** surface);
    136     void LoadBitmapArray(const char* filename, int* frames, GRSurface*** surface);
    137     void LoadLocalizedBitmap(const char* filename, GRSurface** surface);
    138 };
    139 
    140 #endif  // RECOVERY_UI_H
    141