1 /*
2  * Copyright (C) 2017 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 HEALTHD_DRAW_H
18 #define HEALTHD_DRAW_H
19 
20 #include <linux/input.h>
21 #include <minui/minui.h>
22 
23 #include "animation.h"
24 
25 using namespace android;
26 
27 class HealthdDraw {
28  public:
29   virtual ~HealthdDraw();
30 
31   // Redraws screen.
32   void redraw_screen(const animation* batt_anim, GRSurface* surf_unknown);
33 
34   // According to the index of Direct Rendering Manager,
35   // Blanks screen if true, unblanks if false.
36   virtual void blank_screen(bool blank, int drm);
37 
38   // Rotate screen.
39   virtual void rotate_screen(int drm);
40 
41   // Detect dual display
42   virtual bool has_multiple_connectors();
43 
44   static std::unique_ptr<HealthdDraw> Create(animation *anim);
45 
46  protected:
47   virtual void clear_screen();
48 
49   // returns the last y-offset of where the surface ends.
50   virtual int draw_surface_centered(GRSurface* surface);
51   // Negative x or y coordinates center text.
52   virtual int draw_text(const GRFont* font, int x, int y, const char* str);
53 
54   // Negative x or y coordinates position the text away from the opposite edge
55   // that positive ones do.
56   virtual void determine_xy(const animation::text_field& field,
57                             const int length, int* x, int* y);
58 
59   // Draws battery animation, if it exists.
60   virtual void draw_battery(const animation* anim);
61   // Draws clock text, if animation contains text_field data.
62   virtual void draw_clock(const animation* anim);
63   // Draws battery percentage text if animation contains text_field data.
64   virtual void draw_percent(const animation* anim);
65   // Draws charger->surf_unknown or basic text.
66   virtual void draw_unknown(GRSurface* surf_unknown);
67 
68   // Pixel sizes of characters for default font.
69   int char_width_;
70   int char_height_;
71 
72   // Width and height of screen in pixels.
73   int screen_width_;
74   int screen_height_;
75 
76   // Device screen is split vertically.
77   const bool kSplitScreen;
78   // Pixels to offset graphics towards center split.
79   const int kSplitOffset;
80 
81   // system text font, may be nullptr
82   const GRFont* sys_font;
83 
84   // true if minui init'ed OK, false if minui init failed
85   bool graphics_available;
86 
87  private:
88   // Configures font using given animation.
89   HealthdDraw(animation* anim);
90 };
91 
92 #endif  // HEALTHD_DRAW_H
93