From 35fff61b1c0d736d090a1cd1bb4e99141cc88ad8 Mon Sep 17 00:00:00 2001 From: Damien Bargiacchi Date: Thu, 11 Aug 2016 15:57:03 -0700 Subject: Support use of custom fonts in miniui Bug: 29547343 Change-Id: I398160c85daac90ffab2fa9bb2e96795b9e9885a --- minui/font_10x18.h | 8 ++--- minui/graphics.cpp | 102 +++++++++++++++++++++++++++++------------------------ minui/minui.h | 16 +++++++-- screen_ui.cpp | 10 +++--- wear_ui.cpp | 12 +++---- 5 files changed, 83 insertions(+), 65 deletions(-) diff --git a/minui/font_10x18.h b/minui/font_10x18.h index 29d705344..30dfb9c56 100644 --- a/minui/font_10x18.h +++ b/minui/font_10x18.h @@ -1,14 +1,14 @@ struct { unsigned width; unsigned height; - unsigned cwidth; - unsigned cheight; + unsigned char_width; + unsigned char_height; unsigned char rundata[2973]; } font = { .width = 960, .height = 18, - .cwidth = 10, - .cheight = 18, + .char_width = 10, + .char_height = 18, .rundata = { 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x55,0x82,0x06,0x82,0x02,0x82,0x10,0x82, 0x11,0x83,0x08,0x82,0x0a,0x82,0x04,0x82,0x46,0x82,0x08,0x82,0x07,0x84,0x06, diff --git a/minui/graphics.cpp b/minui/graphics.cpp index c0eea9e38..43ec83f08 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -35,12 +35,6 @@ #include "minui.h" #include "graphics.h" -struct GRFont { - GRSurface* texture; - int cwidth; - int cheight; -}; - static GRFont* gr_font = NULL; static minui_backend* gr_backend = NULL; @@ -60,15 +54,20 @@ static bool outside(int x, int y) return x < 0 || x >= gr_draw->width || y < 0 || y >= gr_draw->height; } -int gr_measure(const char *s) +const GRFont* gr_sys_font() { - return gr_font->cwidth * strlen(s); + return gr_font; } -void gr_font_size(int *x, int *y) +int gr_measure(const GRFont* font, const char *s) { - *x = gr_font->cwidth; - *y = gr_font->cheight; + return font->char_width * strlen(s); +} + +void gr_font_size(const GRFont* font, int *x, int *y) +{ + *x = font->char_width; + *y = font->char_height; } static void text_blend(unsigned char* src_p, int src_row_bytes, @@ -103,34 +102,32 @@ static void text_blend(unsigned char* src_p, int src_row_bytes, } } -void gr_text(int x, int y, const char *s, bool bold) +void gr_text(const GRFont* font, int x, int y, const char *s, bool bold) { - GRFont* font = gr_font; - if (!font->texture || gr_current_a == 0) return; - bold = bold && (font->texture->height != font->cheight); + bold = bold && (font->texture->height != font->char_height); x += overscan_offset_x; y += overscan_offset_y; unsigned char ch; while ((ch = *s++)) { - if (outside(x, y) || outside(x+font->cwidth-1, y+font->cheight-1)) break; + if (outside(x, y) || outside(x+font->char_width-1, y+font->char_height-1)) break; if (ch < ' ' || ch > '~') { ch = '?'; } - unsigned char* src_p = font->texture->data + ((ch - ' ') * font->cwidth) + - (bold ? font->cheight * font->texture->row_bytes : 0); + unsigned char* src_p = font->texture->data + ((ch - ' ') * font->char_width) + + (bold ? font->char_height * font->texture->row_bytes : 0); unsigned char* dst_p = gr_draw->data + y*gr_draw->row_bytes + x*gr_draw->pixel_bytes; text_blend(src_p, font->texture->row_bytes, dst_p, gr_draw->row_bytes, - font->cwidth, font->cheight); + font->char_width, font->char_height); - x += font->cwidth; + x += font->char_width; } } @@ -267,40 +264,51 @@ unsigned int gr_get_height(GRSurface* surface) { return surface->height; } +int gr_init_font(const char* name, GRFont* dest) { + int res = res_create_alpha_surface(name, &(dest->texture)); + if (res < 0) { + return res; + } + + // The font image should be a 96x2 array of character images. The + // columns are the printable ASCII characters 0x20 - 0x7f. The + // top row is regular text; the bottom row is bold. + dest->char_width = dest->texture->width / 96; + dest->char_height = dest->texture->height / 2; + + return 0; +} + static void gr_init_font(void) { gr_font = reinterpret_cast(calloc(sizeof(*gr_font), 1)); - int res = res_create_alpha_surface("font", &(gr_font->texture)); + int res = gr_init_font("font", gr_font); if (res == 0) { - // The font image should be a 96x2 array of character images. The - // columns are the printable ASCII characters 0x20 - 0x7f. The - // top row is regular text; the bottom row is bold. - gr_font->cwidth = gr_font->texture->width / 96; - gr_font->cheight = gr_font->texture->height / 2; - } else { - printf("failed to read font: res=%d\n", res); - - // fall back to the compiled-in font. - gr_font->texture = reinterpret_cast(malloc(sizeof(*gr_font->texture))); - gr_font->texture->width = font.width; - gr_font->texture->height = font.height; - gr_font->texture->row_bytes = font.width; - gr_font->texture->pixel_bytes = 1; - - unsigned char* bits = reinterpret_cast(malloc(font.width * font.height)); - gr_font->texture->data = reinterpret_cast(bits); - - unsigned char data; - unsigned char* in = font.rundata; - while((data = *in++)) { - memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); - bits += (data & 0x7f); - } + return; + } - gr_font->cwidth = font.cwidth; - gr_font->cheight = font.cheight; + printf("failed to read font: res=%d\n", res); + + // fall back to the compiled-in font. + gr_font->texture = reinterpret_cast(malloc(sizeof(*gr_font->texture))); + gr_font->texture->width = font.width; + gr_font->texture->height = font.height; + gr_font->texture->row_bytes = font.width; + gr_font->texture->pixel_bytes = 1; + + unsigned char* bits = reinterpret_cast(malloc(font.width * font.height)); + gr_font->texture->data = reinterpret_cast(bits); + + unsigned char data; + unsigned char* in = font.rundata; + while((data = *in++)) { + memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); + bits += (data & 0x7f); } + + gr_font->char_width = font.char_width; + gr_font->char_height = font.char_height; } #if 0 diff --git a/minui/minui.h b/minui/minui.h index fb0bbe10c..23156b6f1 100644 --- a/minui/minui.h +++ b/minui/minui.h @@ -33,6 +33,12 @@ struct GRSurface { unsigned char* data; }; +struct GRFont { + GRSurface* texture; + int char_width; + int char_height; +}; + int gr_init(); void gr_exit(); @@ -45,10 +51,14 @@ void gr_fb_blank(bool blank); void gr_clear(); // clear entire surface to current color void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); void gr_fill(int x1, int y1, int x2, int y2); -void gr_text(int x, int y, const char *s, bool bold); + void gr_texticon(int x, int y, GRSurface* icon); -int gr_measure(const char *s); -void gr_font_size(int *x, int *y); + +const GRFont* gr_sys_font(); +int gr_init_font(const char* name, GRFont* dest); +void gr_text(const GRFont* font, int x, int y, const char *s, bool bold); +int gr_measure(const GRFont* font, const char *s); +void gr_font_size(const GRFont* font, int *x, int *y); void gr_blit(GRSurface* source, int sx, int sy, int w, int h, int dx, int dy); unsigned int gr_get_width(GRSurface* surface); diff --git a/screen_ui.cpp b/screen_ui.cpp index 2a0769e49..c2b532657 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -259,7 +259,7 @@ void ScreenRecoveryUI::DrawHorizontalRule(int* y) { } void ScreenRecoveryUI::DrawTextLine(int x, int* y, const char* line, bool bold) { - gr_text(x, *y, line, bold); + gr_text(gr_sys_font(), x, *y, line, bold); *y += char_height_ + 4; } @@ -315,10 +315,10 @@ void ScreenRecoveryUI::draw_screen_locked() { gr_fill(0, y - 2, gr_fb_width(), y + char_height_ + 2); // Bold white text for the selected item. SetColor(MENU_SEL_FG); - gr_text(4, y, menu_[i], true); + gr_text(gr_sys_font(), 4, y, menu_[i], true); SetColor(MENU); } else { - gr_text(4, y, menu_[i], false); + gr_text(gr_sys_font(), 4, y, menu_[i], false); } y += char_height_ + 4; } @@ -334,7 +334,7 @@ void ScreenRecoveryUI::draw_screen_locked() { for (int ty = gr_fb_height() - char_height_; ty >= y && count < text_rows_; ty -= char_height_, ++count) { - gr_text(0, ty, text_[row], false); + gr_text(gr_sys_font(), 0, ty, text_[row], false); --row; if (row < 0) row = text_rows_ - 1; } @@ -457,7 +457,7 @@ void ScreenRecoveryUI::Init() { // Are we the large variant of our base layout? if (gr_fb_height() > PixelsFromDp(800)) ++layout_; - gr_font_size(&char_width_, &char_height_); + gr_font_size(gr_sys_font(), &char_width_, &char_height_); text_rows_ = gr_fb_height() / char_height_; text_cols_ = gr_fb_width() / char_width_; diff --git a/wear_ui.cpp b/wear_ui.cpp index b437fd0ae..f9727af01 100644 --- a/wear_ui.cpp +++ b/wear_ui.cpp @@ -177,7 +177,7 @@ void WearRecoveryUI::draw_screen_locked() // items don't fit on the screen. if (menu_items > menu_end - menu_start) { sprintf(cur_selection_str, "Current item: %d/%d", menu_sel + 1, menu_items); - gr_text(x+4, y, cur_selection_str, 1); + gr_text(gr_sys_font(), x+4, y, cur_selection_str, 1); y += char_height_+4; } @@ -192,10 +192,10 @@ void WearRecoveryUI::draw_screen_locked() gr_fill(x, y-2, gr_fb_width()-x, y+char_height_+2); // white text of selected item SetColor(MENU_SEL_FG); - if (menu[i][0]) gr_text(x+4, y, menu[i], 1); + if (menu[i][0]) gr_text(gr_sys_font(), x+4, y, menu[i], 1); SetColor(MENU); - } else { - if (menu[i][0]) gr_text(x+4, y, menu[i], 0); + } else if (menu[i][0]) { + gr_text(gr_sys_font(), x+4, y, menu[i], 0); } y += char_height_+4; } @@ -216,7 +216,7 @@ void WearRecoveryUI::draw_screen_locked() for (int ty = gr_fb_height() - char_height_ - outer_height; ty > y+2 && count < text_rows; ty -= char_height_, ++count) { - gr_text(x+4, ty, text[row], 0); + gr_text(gr_sys_font(), x+4, ty, text[row], 0); --row; if (row < 0) row = text_rows-1; } @@ -285,7 +285,7 @@ void WearRecoveryUI::Init() { gr_init(); - gr_font_size(&char_width_, &char_height_); + gr_font_size(gr_sys_font(), &char_width_, &char_height_); text_col = text_row = 0; text_rows = (gr_fb_height()) / char_height_; -- cgit v1.2.3 From 5e7cfb9af64d5f6bf616d9b6fa40bd0ae82e781a Mon Sep 17 00:00:00 2001 From: Damien Bargiacchi Date: Wed, 24 Aug 2016 18:28:43 -0700 Subject: Remove duplicate methods and variables from WearRecoveryUI Copy pasta is never as delicious as ones hopes. Also fix the Pike not rendering recovery bug. Change-Id: I903da7da436e3347a22ff51633e8a0f28fea2c46 --- screen_ui.cpp | 52 ++++++---- screen_ui.h | 45 +++++---- wear_ui.cpp | 313 +++++++++++++++------------------------------------------- wear_ui.h | 72 +++----------- 4 files changed, 148 insertions(+), 334 deletions(-) diff --git a/screen_ui.cpp b/screen_ui.cpp index c2b532657..f884797d3 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -53,8 +53,6 @@ static double now() { ScreenRecoveryUI::ScreenRecoveryUI() : currentIcon(NONE), locale(nullptr), - intro_done(false), - current_frame(0), progressBarType(EMPTY), progressScopeStart(0), progressScopeSize(0), @@ -75,6 +73,8 @@ ScreenRecoveryUI::ScreenRecoveryUI() : file_viewer_text_(nullptr), intro_frames(0), loop_frames(0), + current_frame(0), + intro_done(false), animation_fps(30), // TODO: there's currently no way to infer this. stage(-1), max_stage(-1), @@ -447,9 +447,18 @@ void ScreenRecoveryUI::SetSystemUpdateText(bool security_update) { Redraw(); } -void ScreenRecoveryUI::Init() { +void ScreenRecoveryUI::InitTextParams() { gr_init(); + gr_font_size(gr_sys_font(), &char_width_, &char_height_); + text_rows_ = gr_fb_height() / char_height_; + text_cols_ = gr_fb_width() / char_width_; +} + +void ScreenRecoveryUI::Init() { + RecoveryUI::Init(); + InitTextParams(); + density_ = static_cast(property_get_int32("ro.sf.lcd_density", 160)) / 160.f; // Are we portrait or landscape? @@ -457,10 +466,6 @@ void ScreenRecoveryUI::Init() { // Are we the large variant of our base layout? if (gr_fb_height() > PixelsFromDp(800)) ++layout_; - gr_font_size(gr_sys_font(), &char_width_, &char_height_); - text_rows_ = gr_fb_height() / char_height_; - text_cols_ = gr_fb_width() / char_width_; - text_ = Alloc2d(text_rows_, text_cols_ + 1); file_viewer_text_ = Alloc2d(text_rows_, text_cols_ + 1); menu_ = Alloc2d(text_rows_, text_cols_ + 1); @@ -487,37 +492,44 @@ void ScreenRecoveryUI::Init() { LoadAnimation(); pthread_create(&progress_thread_, nullptr, ProgressThreadStartRoutine, this); - - RecoveryUI::Init(); } void ScreenRecoveryUI::LoadAnimation() { - // How many frames of intro and loop do we have? std::unique_ptr dir(opendir("/res/images"), closedir); dirent* de; + std::vector intro_frame_names; + std::vector loop_frame_names; + while ((de = readdir(dir.get())) != nullptr) { - int value; - if (sscanf(de->d_name, "intro%d", &value) == 1 && intro_frames < (value + 1)) { - intro_frames = value + 1; - } else if (sscanf(de->d_name, "loop%d", &value) == 1 && loop_frames < (value + 1)) { - loop_frames = value + 1; + int value, num_chars; + if (sscanf(de->d_name, "intro%d%n.png", &value, &num_chars) == 1) { + intro_frame_names.emplace_back(de->d_name, num_chars); + } else if (sscanf(de->d_name, "loop%d%n.png", &value, &num_chars) == 1) { + loop_frame_names.emplace_back(de->d_name, num_chars); } } + intro_frames = intro_frame_names.size(); + loop_frames = loop_frame_names.size(); + + LOGD("Recovery animation intro_frames: %d, loop_frames: %d\n", intro_frames, loop_frames); + // It's okay to not have an intro. if (intro_frames == 0) intro_done = true; // But you must have an animation. if (loop_frames == 0) abort(); + std::sort(intro_frame_names.begin(), intro_frame_names.end()); + std::sort(loop_frame_names.begin(), loop_frame_names.end()); + introFrames = new GRSurface*[intro_frames]; - for (int i = 0; i < intro_frames; ++i) { - // TODO: remember the names above, so we don't have to hard-code the number of 0s. - LoadBitmap(android::base::StringPrintf("intro%05d", i).c_str(), &introFrames[i]); + for (size_t i = 0; i < intro_frames; i++) { + LoadBitmap(intro_frame_names.at(i).c_str(), &introFrames[i]); } loopFrames = new GRSurface*[loop_frames]; - for (int i = 0; i < loop_frames; ++i) { - LoadBitmap(android::base::StringPrintf("loop%05d", i).c_str(), &loopFrames[i]); + for (size_t i = 0; i < loop_frames; i++) { + LoadBitmap(loop_frame_names.at(i).c_str(), &loopFrames[i]); } } diff --git a/screen_ui.h b/screen_ui.h index 898775778..de7b6442e 100644 --- a/screen_ui.h +++ b/screen_ui.h @@ -37,16 +37,16 @@ class ScreenRecoveryUI : public RecoveryUI { void SetSystemUpdateText(bool security_update); // progress indicator - void SetProgressType(ProgressType type); - void ShowProgress(float portion, float seconds); - void SetProgress(float fraction); + void SetProgressType(ProgressType type) override; + void ShowProgress(float portion, float seconds) override; + void SetProgress(float fraction) override; - void SetStage(int current, int max); + void SetStage(int current, int max) override; // text log - void ShowText(bool visible); - bool IsTextVisible(); - bool WasTextEverVisible(); + void ShowText(bool visible) override; + bool IsTextVisible() override; + bool WasTextEverVisible() override; // printing messages void Print(const char* fmt, ...) __printflike(2, 3); @@ -72,8 +72,6 @@ class ScreenRecoveryUI : public RecoveryUI { Icon currentIcon; const char* locale; - bool intro_done; - int current_frame; // The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi. float density_; @@ -123,8 +121,11 @@ class ScreenRecoveryUI : public RecoveryUI { pthread_t progress_thread_; // Number of intro frames and loop frames in the animation. - int intro_frames; - int loop_frames; + size_t intro_frames; + size_t loop_frames; + + size_t current_frame; + bool intro_done; // Number of frames per sec (default: 30) for both parts of the animation. int animation_fps; @@ -136,11 +137,13 @@ class ScreenRecoveryUI : public RecoveryUI { pthread_mutex_t updateMutex; bool rtl_locale; - void draw_background_locked(); - void draw_foreground_locked(); - void draw_screen_locked(); - void update_screen_locked(); - void update_progress_locked(); + virtual void InitTextParams(); + + virtual void draw_background_locked(); + virtual void draw_foreground_locked(); + virtual void draw_screen_locked(); + virtual void update_screen_locked(); + virtual void update_progress_locked(); GRSurface* GetCurrentFrame(); GRSurface* GetCurrentText(); @@ -148,8 +151,8 @@ class ScreenRecoveryUI : public RecoveryUI { static void* ProgressThreadStartRoutine(void* data); void ProgressThreadLoop(); - void ShowFile(FILE*); - void PrintV(const char*, bool, va_list); + virtual void ShowFile(FILE*); + virtual void PrintV(const char*, bool, va_list); void PutChar(char); void ClearText(); @@ -158,9 +161,9 @@ class ScreenRecoveryUI : public RecoveryUI { void LoadLocalizedBitmap(const char* filename, GRSurface** surface); int PixelsFromDp(int dp); - int GetAnimationBaseline(); - int GetProgressBaseline(); - int GetTextBaseline(); + virtual int GetAnimationBaseline(); + virtual int GetProgressBaseline(); + virtual int GetTextBaseline(); void DrawHorizontalRule(int* y); void DrawTextLine(int x, int* y, const char* line, bool bold); diff --git a/wear_ui.cpp b/wear_ui.cpp index f9727af01..3550992ac 100644 --- a/wear_ui.cpp +++ b/wear_ui.cpp @@ -47,32 +47,13 @@ static double now() { } WearRecoveryUI::WearRecoveryUI() : - progress_bar_height(3), - progress_bar_width(200), progress_bar_y(259), outer_height(0), outer_width(0), - menu_unusable_rows(0), - intro_frames(22), - loop_frames(60), - animation_fps(30), - currentIcon(NONE), - intro_done(false), - current_frame(0), - progressBarType(EMPTY), - progressScopeStart(0), - progressScopeSize(0), - progress(0), - text_cols(0), - text_rows(0), - text_col(0), - text_row(0), - text_top(0), - show_text(false), - show_text_ever(false), - show_menu(false), - menu_items(0), - menu_sel(0) { + menu_unusable_rows(0) { + intro_frames = 22; + loop_frames = 60; + animation_fps = 30; for (size_t i = 0; i < 5; i++) backgroundIcon[i] = NULL; @@ -80,16 +61,22 @@ WearRecoveryUI::WearRecoveryUI() : self = this; } +int WearRecoveryUI::GetProgressBaseline() { + return progress_bar_y; +} + // Draw background frame on the screen. Does not flip pages. // Should only be called with updateMutex locked. -void WearRecoveryUI::draw_background_locked(Icon icon) +// TODO merge drawing routines with screen_ui +void WearRecoveryUI::draw_background_locked() { + pagesIdentical = false; gr_color(0, 0, 0, 255); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); - if (icon) { + if (currentIcon != NONE) { GRSurface* surface; - if (icon == INSTALLING_UPDATE || icon == ERASING) { + if (currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) { if (!intro_done) { surface = introFrames[current_frame]; } else { @@ -97,7 +84,7 @@ void WearRecoveryUI::draw_background_locked(Icon icon) } } else { - surface = backgroundIcon[icon]; + surface = backgroundIcon[currentIcon]; } int width = gr_get_width(surface); @@ -110,36 +97,6 @@ void WearRecoveryUI::draw_background_locked(Icon icon) } } -// Draw the progress bar (if any) on the screen. Does not flip pages. -// Should only be called with updateMutex locked. -void WearRecoveryUI::draw_progress_locked() -{ - if (currentIcon == ERROR) return; - if (progressBarType != DETERMINATE) return; - - int width = progress_bar_width; - int height = progress_bar_height; - int dx = (gr_fb_width() - width)/2; - int dy = progress_bar_y; - - float p = progressScopeStart + progress * progressScopeSize; - int pos = (int) (p * width); - - gr_color(0x43, 0x43, 0x43, 0xff); - gr_fill(dx, dy, dx + width, dy + height); - - if (pos > 0) { - gr_color(0x02, 0xa8, 0xf3, 255); - if (rtl_locale) { - // Fill the progress bar from right to left. - gr_fill(dx + width - pos, dy, dx + width, dy + height); - } else { - // Fill the progress bar from left to right. - gr_fill(dx, dy, dx + pos, dy + height); - } - } -} - static const char* HEADERS[] = { "Swipe up/down to move.", "Swipe left/right to select.", @@ -147,13 +104,15 @@ static const char* HEADERS[] = { NULL }; +// TODO merge drawing routines with screen_ui void WearRecoveryUI::draw_screen_locked() { - draw_background_locked(currentIcon); - draw_progress_locked(); char cur_selection_str[50]; - if (show_text) { + draw_background_locked(); + if (!show_text) { + draw_foreground_locked(); + } else { SetColor(TEXT_FILL); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); @@ -192,10 +151,12 @@ void WearRecoveryUI::draw_screen_locked() gr_fill(x, y-2, gr_fb_width()-x, y+char_height_+2); // white text of selected item SetColor(MENU_SEL_FG); - if (menu[i][0]) gr_text(gr_sys_font(), x+4, y, menu[i], 1); + if (menu_[i][0]) { + gr_text(gr_sys_font(), x + 4, y, menu_[i], 1); + } SetColor(MENU); - } else if (menu[i][0]) { - gr_text(gr_sys_font(), x+4, y, menu[i], 0); + } else if (menu_[i][0]) { + gr_text(gr_sys_font(), x + 4, y, menu_[i], 0); } y += char_height_+4; } @@ -211,24 +172,18 @@ void WearRecoveryUI::draw_screen_locked() // screen, the bottom of the menu, or we've displayed the // entire text buffer. int ty; - int row = (text_top+text_rows-1) % text_rows; + int row = (text_top_ + text_rows_ - 1) % text_rows_; size_t count = 0; for (int ty = gr_fb_height() - char_height_ - outer_height; - ty > y+2 && count < text_rows; + ty > y + 2 && count < text_rows_; ty -= char_height_, ++count) { - gr_text(gr_sys_font(), x+4, ty, text[row], 0); + gr_text(gr_sys_font(), x+4, ty, text_[row], 0); --row; - if (row < 0) row = text_rows-1; + if (row < 0) row = text_rows_ - 1; } } } -void WearRecoveryUI::update_screen_locked() -{ - draw_screen_locked(); - gr_flip(); -} - // Keeps the progress bar updated, even when the process is otherwise busy. void* WearRecoveryUI::progress_thread(void *cookie) { self->progress_loop(); @@ -240,7 +195,7 @@ void WearRecoveryUI::progress_loop() { for (;;) { double start = now(); pthread_mutex_lock(&updateMutex); - int redraw = 0; + bool redraw = false; if ((currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) && !show_text) { @@ -254,7 +209,7 @@ void WearRecoveryUI::progress_loop() { } else { current_frame = (current_frame + 1) % loop_frames; } - redraw = 1; + redraw = true; } // move the progress bar forward on timed intervals, if configured @@ -265,12 +220,11 @@ void WearRecoveryUI::progress_loop() { if (p > 1.0) p = 1.0; if (p > progress) { progress = p; - redraw = 1; + redraw = true; } } - if (redraw) - update_screen_locked(); + if (redraw) update_screen_locked(); pthread_mutex_unlock(&updateMutex); double end = now(); @@ -281,93 +235,27 @@ void WearRecoveryUI::progress_loop() { } } -void WearRecoveryUI::Init() -{ - gr_init(); +void WearRecoveryUI::InitTextParams() { + ScreenRecoveryUI::InitTextParams(); + + text_cols_ = (gr_fb_width() - (outer_width * 2)) / char_width_; - gr_font_size(gr_sys_font(), &char_width_, &char_height_); + if (text_rows_ > kMaxRows) text_rows_ = kMaxRows; + if (text_cols_ > kMaxCols) text_cols_ = kMaxCols; - text_col = text_row = 0; - text_rows = (gr_fb_height()) / char_height_; visible_text_rows = (gr_fb_height() - (outer_height * 2)) / char_height_; - if (text_rows > kMaxRows) text_rows = kMaxRows; - text_top = 1; +} - text_cols = (gr_fb_width() - (outer_width * 2)) / char_width_; - if (text_cols > kMaxCols - 1) text_cols = kMaxCols - 1; +void WearRecoveryUI::Init() { + ScreenRecoveryUI::Init(); LoadBitmap("icon_installing", &backgroundIcon[INSTALLING_UPDATE]); backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE]; LoadBitmap("icon_error", &backgroundIcon[ERROR]); backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR]; - introFrames = (GRSurface**)malloc(intro_frames * sizeof(GRSurface*)); - for (int i = 0; i < intro_frames; ++i) { - char filename[40]; - sprintf(filename, "intro%02d", i); - LoadBitmap(filename, introFrames + i); - } - - loopFrames = (GRSurface**)malloc(loop_frames * sizeof(GRSurface*)); - for (int i = 0; i < loop_frames; ++i) { - char filename[40]; - sprintf(filename, "loop%02d", i); - LoadBitmap(filename, loopFrames + i); - } - pthread_create(&progress_t, NULL, progress_thread, NULL); - RecoveryUI::Init(); -} -void WearRecoveryUI::SetBackground(Icon icon) -{ - pthread_mutex_lock(&updateMutex); - currentIcon = icon; - update_screen_locked(); - pthread_mutex_unlock(&updateMutex); -} - -void WearRecoveryUI::SetProgressType(ProgressType type) -{ - pthread_mutex_lock(&updateMutex); - if (progressBarType != type) { - progressBarType = type; - } - progressScopeStart = 0; - progressScopeSize = 0; - progress = 0; - update_screen_locked(); - pthread_mutex_unlock(&updateMutex); -} - -void WearRecoveryUI::ShowProgress(float portion, float seconds) -{ - pthread_mutex_lock(&updateMutex); - progressBarType = DETERMINATE; - progressScopeStart += progressScopeSize; - progressScopeSize = portion; - progressScopeTime = now(); - progressScopeDuration = seconds; - progress = 0; - update_screen_locked(); - pthread_mutex_unlock(&updateMutex); -} - -void WearRecoveryUI::SetProgress(float fraction) -{ - pthread_mutex_lock(&updateMutex); - if (fraction < 0.0) fraction = 0.0; - if (fraction > 1.0) fraction = 1.0; - if (progressBarType == DETERMINATE && fraction > progress) { - // Skip updates that aren't visibly different. - int width = progress_bar_width; - float scale = width * progressScopeSize; - if ((int) (progress * scale) != (int) (fraction * scale)) { - progress = fraction; - update_screen_locked(); - } - } - pthread_mutex_unlock(&updateMutex); } void WearRecoveryUI::SetStage(int current, int max) @@ -386,40 +274,40 @@ void WearRecoveryUI::Print(const char *fmt, ...) // This can get called before ui_init(), so be careful. pthread_mutex_lock(&updateMutex); - if (text_rows > 0 && text_cols > 0) { + if (text_rows_ > 0 && text_cols_ > 0) { char *ptr; for (ptr = buf; *ptr != '\0'; ++ptr) { - if (*ptr == '\n' || text_col >= text_cols) { - text[text_row][text_col] = '\0'; - text_col = 0; - text_row = (text_row + 1) % text_rows; - if (text_row == text_top) text_top = (text_top + 1) % text_rows; + if (*ptr == '\n' || text_col_ >= text_cols_) { + text_[text_row_][text_col_] = '\0'; + text_col_ = 0; + text_row_ = (text_row_ + 1) % text_rows_; + if (text_row_ == text_top_) text_top_ = (text_top_ + 1) % text_rows_; } - if (*ptr != '\n') text[text_row][text_col++] = *ptr; + if (*ptr != '\n') text_[text_row_][text_col_++] = *ptr; } - text[text_row][text_col] = '\0'; + text_[text_row_][text_col_] = '\0'; update_screen_locked(); } pthread_mutex_unlock(&updateMutex); } void WearRecoveryUI::StartMenu(const char* const * headers, const char* const * items, - int initial_selection) { + int initial_selection) { pthread_mutex_lock(&updateMutex); - if (text_rows > 0 && text_cols > 0) { + if (text_rows_ > 0 && text_cols_ > 0) { menu_headers_ = headers; size_t i = 0; - // "i < text_rows" is removed from the loop termination condition, + // "i < text_rows_" is removed from the loop termination condition, // which is different from the one in ScreenRecoveryUI::StartMenu(). // Because WearRecoveryUI supports scrollable menu, it's fine to have - // more entries than text_rows. The menu may be truncated otherwise. + // more entries than text_rows_. The menu may be truncated otherwise. // Bug: 23752519 for (; items[i] != nullptr; i++) { - strncpy(menu[i], items[i], text_cols - 1); - menu[i][text_cols - 1] = '\0'; + strncpy(menu_[i], items[i], text_cols_ - 1); + menu_[i][text_cols_ - 1] = '\0'; } menu_items = i; - show_menu = 1; + show_menu = true; menu_sel = initial_selection; menu_start = 0; menu_end = visible_text_rows - 1 - menu_unusable_rows; @@ -433,7 +321,7 @@ void WearRecoveryUI::StartMenu(const char* const * headers, const char* const * int WearRecoveryUI::SelectMenu(int sel) { int old_sel; pthread_mutex_lock(&updateMutex); - if (show_menu > 0) { + if (show_menu) { old_sel = menu_sel; menu_sel = sel; if (menu_sel < 0) menu_sel = 0; @@ -452,53 +340,6 @@ int WearRecoveryUI::SelectMenu(int sel) { return sel; } -void WearRecoveryUI::EndMenu() { - int i; - pthread_mutex_lock(&updateMutex); - if (show_menu > 0 && text_rows > 0 && text_cols > 0) { - show_menu = 0; - update_screen_locked(); - } - pthread_mutex_unlock(&updateMutex); -} - -bool WearRecoveryUI::IsTextVisible() -{ - pthread_mutex_lock(&updateMutex); - int visible = show_text; - pthread_mutex_unlock(&updateMutex); - return visible; -} - -bool WearRecoveryUI::WasTextEverVisible() -{ - pthread_mutex_lock(&updateMutex); - int ever_visible = show_text_ever; - pthread_mutex_unlock(&updateMutex); - return ever_visible; -} - -void WearRecoveryUI::ShowText(bool visible) -{ - pthread_mutex_lock(&updateMutex); - // Don't show text during ota install or factory reset - if (currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) { - pthread_mutex_unlock(&updateMutex); - return; - } - show_text = visible; - if (show_text) show_text_ever = 1; - update_screen_locked(); - pthread_mutex_unlock(&updateMutex); -} - -void WearRecoveryUI::Redraw() -{ - pthread_mutex_lock(&updateMutex); - update_screen_locked(); - pthread_mutex_unlock(&updateMutex); -} - void WearRecoveryUI::ShowFile(FILE* fp) { std::vector offsets; offsets.push_back(ftell(fp)); @@ -538,12 +379,12 @@ void WearRecoveryUI::ShowFile(FILE* fp) { int ch = getc(fp); if (ch == EOF) { - text_row = text_top = text_rows - 2; + text_row_ = text_top_ = text_rows_ - 2; show_prompt = true; } else { PutChar(ch); - if (text_col == 0 && text_row >= text_rows - 2) { - text_top = text_row; + if (text_col_ == 0 && text_row_ >= text_rows_ - 2) { + text_top_ = text_row_; show_prompt = true; } } @@ -552,10 +393,10 @@ void WearRecoveryUI::ShowFile(FILE* fp) { void WearRecoveryUI::PutChar(char ch) { pthread_mutex_lock(&updateMutex); - if (ch != '\n') text[text_row][text_col++] = ch; - if (ch == '\n' || text_col >= text_cols) { - text_col = 0; - ++text_row; + if (ch != '\n') text_[text_row_][text_col_++] = ch; + if (ch == '\n' || text_col_ >= text_cols_) { + text_col_ = 0; + ++text_row_; } pthread_mutex_unlock(&updateMutex); } @@ -572,11 +413,11 @@ void WearRecoveryUI::ShowFile(const char* filename) { void WearRecoveryUI::ClearText() { pthread_mutex_lock(&updateMutex); - text_col = 0; - text_row = 0; - text_top = 1; - for (size_t i = 0; i < text_rows; ++i) { - memset(text[i], 0, text_cols + 1); + text_col_ = 0; + text_row_ = 0; + text_top_ = 1; + for (size_t i = 0; i < text_rows_; ++i) { + memset(text_[i], 0, text_cols_ + 1); } pthread_mutex_unlock(&updateMutex); } @@ -597,17 +438,17 @@ void WearRecoveryUI::PrintV(const char* fmt, bool copy_to_stdout, va_list ap) { } pthread_mutex_lock(&updateMutex); - if (text_rows > 0 && text_cols > 0) { + if (text_rows_ > 0 && text_cols_ > 0) { for (const char* ptr = str.c_str(); *ptr != '\0'; ++ptr) { - if (*ptr == '\n' || text_col >= text_cols) { - text[text_row][text_col] = '\0'; - text_col = 0; - text_row = (text_row + 1) % text_rows; - if (text_row == text_top) text_top = (text_top + 1) % text_rows; + if (*ptr == '\n' || text_col_ >= text_cols_) { + text_[text_row_][text_col_] = '\0'; + text_col_ = 0; + text_row_ = (text_row_ + 1) % text_rows_; + if (text_row_ == text_top_) text_top_ = (text_top_ + 1) % text_rows_; } - if (*ptr != '\n') text[text_row][text_col++] = *ptr; + if (*ptr != '\n') text_[text_row_][text_col_++] = *ptr; } - text[text_row][text_col] = '\0'; + text_[text_row_][text_col_] = '\0'; update_screen_locked(); } pthread_mutex_unlock(&updateMutex); diff --git a/wear_ui.h b/wear_ui.h index e2d6fe072..dadf32449 100644 --- a/wear_ui.h +++ b/wear_ui.h @@ -23,39 +23,22 @@ class WearRecoveryUI : public ScreenRecoveryUI { public: WearRecoveryUI(); - void Init(); - // overall recovery state ("background image") - void SetBackground(Icon icon); + void Init() override; - // progress indicator - void SetProgressType(ProgressType type); - void ShowProgress(float portion, float seconds); - void SetProgress(float fraction); - - void SetStage(int current, int max); - - // text log - void ShowText(bool visible); - bool IsTextVisible(); - bool WasTextEverVisible(); + void SetStage(int current, int max) override; // printing messages - void Print(const char* fmt, ...); - void PrintOnScreenOnly(const char* fmt, ...) __printflike(2, 3); - void ShowFile(const char* filename); - void ShowFile(FILE* fp); + void Print(const char* fmt, ...) override; + void PrintOnScreenOnly(const char* fmt, ...) override __printflike(2, 3); + void ShowFile(const char* filename) override; + void ShowFile(FILE* fp) override; // menu display void StartMenu(const char* const * headers, const char* const * items, - int initial_selection); - int SelectMenu(int sel); - void EndMenu(); - - void Redraw(); + int initial_selection) override; + int SelectMenu(int sel) override; protected: - int progress_bar_height, progress_bar_width; - // progress bar vertical position, it's centered horizontally int progress_bar_y; @@ -67,59 +50,34 @@ class WearRecoveryUI : public ScreenRecoveryUI { // that may otherwise go out of the screen. int menu_unusable_rows; - // number of intro frames (default: 22) and loop frames (default: 60) - int intro_frames; - int loop_frames; - - // Number of frames per sec (default: 30) for both of intro and loop. - int animation_fps; - - private: - Icon currentIcon; + int GetProgressBaseline() override; - bool intro_done; + void InitTextParams() override; - int current_frame; + void PrintV(const char*, bool, va_list) override; + private: GRSurface* backgroundIcon[5]; - GRSurface* *introFrames; - GRSurface* *loopFrames; - - ProgressType progressBarType; - - float progressScopeStart, progressScopeSize, progress; - double progressScopeTime, progressScopeDuration; static const int kMaxCols = 96; static const int kMaxRows = 96; - // Log text overlay, displayed when a magic key is pressed - char text[kMaxRows][kMaxCols]; - size_t text_cols, text_rows; // Number of text rows seen on screen int visible_text_rows; - size_t text_col, text_row, text_top; - bool show_text; - bool show_text_ever; // has show_text ever been true? - char menu[kMaxRows][kMaxCols]; - bool show_menu; const char* const* menu_headers_; - int menu_items, menu_sel; int menu_start, menu_end; pthread_t progress_t; - private: - void draw_background_locked(Icon icon); + void draw_background_locked() override; + void draw_screen_locked() override; void draw_progress_locked(); - void draw_screen_locked(); - void update_screen_locked(); + static void* progress_thread(void* cookie); void progress_loop(); void PutChar(char); void ClearText(); - void PrintV(const char*, bool, va_list); }; #endif // RECOVERY_WEAR_UI_H -- cgit v1.2.3 From 43d186021a9fae0d2aa4e1a409fdb7132402db00 Mon Sep 17 00:00:00 2001 From: Damien Bargiacchi Date: Wed, 7 Sep 2016 17:11:07 -0700 Subject: Remove debug log statement; fix build Change-Id: Ief92ec99d902ed58a48be9c2486cb99fdb184d7b --- screen_ui.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/screen_ui.cpp b/screen_ui.cpp index f884797d3..95b97d15c 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -512,8 +512,6 @@ void ScreenRecoveryUI::LoadAnimation() { intro_frames = intro_frame_names.size(); loop_frames = loop_frame_names.size(); - LOGD("Recovery animation intro_frames: %d, loop_frames: %d\n", intro_frames, loop_frames); - // It's okay to not have an intro. if (intro_frames == 0) intro_done = true; // But you must have an animation. -- cgit v1.2.3 From ad8b5a6c1195b94d8d80671e1bf791c32008fbef Mon Sep 17 00:00:00 2001 From: Damien Bargiacchi Date: Fri, 9 Sep 2016 08:18:06 -0700 Subject: Remove duplicate thread loop Fixes animation running at 2x speed Change-Id: Ieec353097b6eee1cf40530e6f4f1e69927d2bc98 --- wear_ui.cpp | 56 ++++---------------------------------------------------- wear_ui.h | 4 ++-- 2 files changed, 6 insertions(+), 54 deletions(-) diff --git a/wear_ui.cpp b/wear_ui.cpp index 3550992ac..bfa7097ea 100644 --- a/wear_ui.cpp +++ b/wear_ui.cpp @@ -184,55 +184,10 @@ void WearRecoveryUI::draw_screen_locked() } } -// Keeps the progress bar updated, even when the process is otherwise busy. -void* WearRecoveryUI::progress_thread(void *cookie) { - self->progress_loop(); - return NULL; -} - -void WearRecoveryUI::progress_loop() { - double interval = 1.0 / animation_fps; - for (;;) { - double start = now(); - pthread_mutex_lock(&updateMutex); - bool redraw = false; - - if ((currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) - && !show_text) { - if (!intro_done) { - if (current_frame >= intro_frames - 1) { - intro_done = true; - current_frame = 0; - } else { - current_frame++; - } - } else { - current_frame = (current_frame + 1) % loop_frames; - } - redraw = true; - } - - // move the progress bar forward on timed intervals, if configured - int duration = progressScopeDuration; - if (progressBarType == DETERMINATE && duration > 0) { - double elapsed = now() - progressScopeTime; - float p = 1.0 * elapsed / duration; - if (p > 1.0) p = 1.0; - if (p > progress) { - progress = p; - redraw = true; - } - } - - if (redraw) update_screen_locked(); - - pthread_mutex_unlock(&updateMutex); - double end = now(); - // minimum of 20ms delay between frames - double delay = interval - (end-start); - if (delay < 0.02) delay = 0.02; - usleep((long)(delay * 1000000)); - } +// TODO merge drawing routines with screen_ui +void WearRecoveryUI::update_progress_locked() { + draw_screen_locked(); + gr_flip(); } void WearRecoveryUI::InitTextParams() { @@ -253,9 +208,6 @@ void WearRecoveryUI::Init() { backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE]; LoadBitmap("icon_error", &backgroundIcon[ERROR]); backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR]; - - pthread_create(&progress_t, NULL, progress_thread, NULL); - } void WearRecoveryUI::SetStage(int current, int max) diff --git a/wear_ui.h b/wear_ui.h index dadf32449..9351d4166 100644 --- a/wear_ui.h +++ b/wear_ui.h @@ -54,6 +54,8 @@ class WearRecoveryUI : public ScreenRecoveryUI { void InitTextParams() override; + void update_progress_locked() override; + void PrintV(const char*, bool, va_list) override; private: @@ -74,8 +76,6 @@ class WearRecoveryUI : public ScreenRecoveryUI { void draw_screen_locked() override; void draw_progress_locked(); - static void* progress_thread(void* cookie); - void progress_loop(); void PutChar(char); void ClearText(); }; -- cgit v1.2.3 From d00f5eb63a8e4690f9bef1e943d539d052444d9b Mon Sep 17 00:00:00 2001 From: Damien Bargiacchi Date: Fri, 9 Sep 2016 07:14:08 -0700 Subject: Have gr_init_font alloc memory for the font Change-Id: I8ccf369d52011bc5d07d8e041fe558ce734a78fc --- minui/graphics.cpp | 22 +++++++++++++++------- minui/minui.h | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/minui/graphics.cpp b/minui/graphics.cpp index 43ec83f08..ab56a6fd6 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -264,33 +264,41 @@ unsigned int gr_get_height(GRSurface* surface) { return surface->height; } -int gr_init_font(const char* name, GRFont* dest) { - int res = res_create_alpha_surface(name, &(dest->texture)); +int gr_init_font(const char* name, GRFont** dest) { + GRFont* font = reinterpret_cast(calloc(1, sizeof(*gr_font))); + if (font == nullptr) { + return -1; + } + + int res = res_create_alpha_surface(name, &(font->texture)); if (res < 0) { + free(font); return res; } // The font image should be a 96x2 array of character images. The // columns are the printable ASCII characters 0x20 - 0x7f. The // top row is regular text; the bottom row is bold. - dest->char_width = dest->texture->width / 96; - dest->char_height = dest->texture->height / 2; + font->char_width = font->texture->width / 96; + font->char_height = font->texture->height / 2; + + *dest = font; return 0; } static void gr_init_font(void) { - gr_font = reinterpret_cast(calloc(sizeof(*gr_font), 1)); - - int res = gr_init_font("font", gr_font); + int res = gr_init_font("font", &gr_font); if (res == 0) { return; } printf("failed to read font: res=%d\n", res); + // fall back to the compiled-in font. + gr_font = reinterpret_cast(calloc(1, sizeof(*gr_font))); gr_font->texture = reinterpret_cast(malloc(sizeof(*gr_font->texture))); gr_font->texture->width = font.width; gr_font->texture->height = font.height; diff --git a/minui/minui.h b/minui/minui.h index 23156b6f1..d30426dc8 100644 --- a/minui/minui.h +++ b/minui/minui.h @@ -55,7 +55,7 @@ void gr_fill(int x1, int y1, int x2, int y2); void gr_texticon(int x, int y, GRSurface* icon); const GRFont* gr_sys_font(); -int gr_init_font(const char* name, GRFont* dest); +int gr_init_font(const char* name, GRFont** dest); void gr_text(const GRFont* font, int x, int y, const char *s, bool bold); int gr_measure(const GRFont* font, const char *s); void gr_font_size(const GRFont* font, int *x, int *y); -- cgit v1.2.3 From e16e799dfdff5392d2bdc460f41353100d082e96 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Fri, 9 Sep 2016 10:55:44 -0700 Subject: save uncrypt status to last_install Save the uncrypt time cost to /cache/recovery/uncrypt_status. Recovery reads the file and saves its contents to last_install. Bug: 31383361 Test: Tested on angler and uncrypt_time reports correctly. (cherry picked from commit fe16b5ccaf80f6e04d5b722c37c1abd70457ad28) Change-Id: Id69681a35c7eb2f0eb21b48e3616dcda82ce41b8 --- install.cpp | 13 +++++++++++++ uncrypt/uncrypt.cpp | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/install.cpp b/install.cpp index 02c845cb8..9227d5895 100644 --- a/install.cpp +++ b/install.cpp @@ -30,6 +30,8 @@ #include #include +#include +#include #include #include #include @@ -54,6 +56,7 @@ static constexpr const char* AB_OTA_PAYLOAD_PROPERTIES = "payload_properties.txt static constexpr const char* AB_OTA_PAYLOAD = "payload.bin"; #define PUBLIC_KEYS_FILE "/res/keys" static constexpr const char* METADATA_PATH = "META-INF/com/android/metadata"; +static constexpr const char* UNCRYPT_STATUS = "/cache/recovery/uncrypt_status"; // Default allocation of progress bar segments to operations static const int VERIFICATION_PROGRESS_TIME = 60; @@ -539,6 +542,16 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, fprintf(install_log, "%s\n", s.c_str()); } + if (ensure_path_mounted(UNCRYPT_STATUS) != 0) { + LOG(WARNING) << "Can't mount " << UNCRYPT_STATUS; + } else { + std::string uncrypt_status; + if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) { + PLOG(WARNING) << "failed to read uncrypt status"; + } else { + fprintf(install_log, "%s\n", android::base::Trim(uncrypt_status).c_str()); + } + } fclose(install_log); } return result; diff --git a/uncrypt/uncrypt.cpp b/uncrypt/uncrypt.cpp index 5e804bcca..c73107cca 100644 --- a/uncrypt/uncrypt.cpp +++ b/uncrypt/uncrypt.cpp @@ -134,6 +134,7 @@ // devices, on which /cache partitions always exist. static const std::string CACHE_BLOCK_MAP = "/cache/recovery/block.map"; static const std::string UNCRYPT_PATH_FILE = "/cache/recovery/uncrypt_file"; +static const std::string UNCRYPT_STATUS = "/cache/recovery/uncrypt_status"; static const std::string UNCRYPT_SOCKET = "uncrypt"; static struct fstab* fstab = nullptr; @@ -466,12 +467,32 @@ static bool uncrypt_wrapper(const char* input_path, const char* map_file, const input_path = package.c_str(); } CHECK(map_file != nullptr); + +#define UNCRYPT_TIME_HOLDER 0x7FFFFFFF + // Intialize the uncrypt time cost to a huge number so that we can tell from + // the statistics if an uncrypt fails to finish. + if (!android::base::WriteStringToFile(android::base::StringPrintf( + "uncrypt_time: %d\n", UNCRYPT_TIME_HOLDER), UNCRYPT_STATUS)) { + PLOG(WARNING) << "failed to write to " << UNCRYPT_STATUS; + } + + auto start = std::chrono::system_clock::now(); int status = uncrypt(input_path, map_file, socket); if (status != 0) { write_status_to_socket(-1, socket); return false; } + + std::chrono::duration duration = std::chrono::system_clock::now() - start; + int count = static_cast(duration.count()); + // Overwrite the uncrypt_time if uncrypt finishes successfully. + if (!android::base::WriteStringToFile( + android::base::StringPrintf("uncrypt_time: %d\n", count), UNCRYPT_STATUS)) { + PLOG(WARNING) << "failed to write to " << UNCRYPT_STATUS; + } + write_status_to_socket(100, socket); + return true; } -- cgit v1.2.3 From 41a3fd4e202168fc58f9955f7bcac43121f55fc5 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Mon, 12 Sep 2016 16:43:37 -0700 Subject: Check corruption when reading uncrypt_status file Bug: 31383361 Change-Id: I0de920916da213528d73b742e4823b4a98c63ea1 (cherry picked from commit 1c1864f321b129c81883ed527b1da8c69661e51f) --- install.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install.cpp b/install.cpp index 9227d5895..209300e89 100644 --- a/install.cpp +++ b/install.cpp @@ -548,6 +548,8 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, std::string uncrypt_status; if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) { PLOG(WARNING) << "failed to read uncrypt status"; + } else if (!android::base::StartsWith(uncrypt_status, "uncrypt_time:")) { + PLOG(WARNING) << "corrupted uncrypt_status: " << uncrypt_status; } else { fprintf(install_log, "%s\n", android::base::Trim(uncrypt_status).c_str()); } -- cgit v1.2.3 From de1b53d0678b81d4480dc4ac3fc79075e01d4255 Mon Sep 17 00:00:00 2001 From: Matthew Bouyack Date: Fri, 16 Sep 2016 16:38:11 -0700 Subject: DO NOT MERGE Fail gracefully when we fail to fork the update binary See bug b/31395655 Change-Id: Ic5a046bc80ea88d7eb52755838bdbf4e1e47da50 --- install.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/install.cpp b/install.cpp index 209300e89..78dc6a0d5 100644 --- a/install.cpp +++ b/install.cpp @@ -374,6 +374,14 @@ try_update_binary(const char* path, ZipArchive* zip, bool* wipe_cache, } pid_t pid = fork(); + + if (pid == -1) { + close(pipefd[0]); + close(pipefd[1]); + LOGE("Failed to fork update binary: %s\n", strerror(errno)); + return INSTALL_ERROR; + } + if (pid == 0) { umask(022); close(pipefd[0]); -- cgit v1.2.3 From a8c0d0b43a2f46afeada2bf0960232b4b0890b07 Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Mon, 26 Sep 2016 11:39:14 -0700 Subject: DO NOT MERGE Duplicate the last_install content into last_log. Currently we save the OTA metrics in last_install, which keeps the data for the _last_ install only. This CL logs the same content into last_log so that we keep the metrics for every install. Bug: 31607469 Test: Apply an update (via OTA and sideload) and check last_log and last_install. Change-Id: Id8f174d79534fddc9f06d72a4e69b2b1d8ab186c (cherry picked from commit f4885adc189f246ac3c651aa5cb2e74a240f3f1e) --- install.cpp | 61 ++++++++++++++++++++++++++++++------------------------------ recovery.cpp | 19 +++++++++++-------- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/install.cpp b/install.cpp index 209300e89..d8372e276 100644 --- a/install.cpp +++ b/install.cpp @@ -31,7 +31,6 @@ #include #include -#include #include #include #include @@ -514,13 +513,6 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, modified_flash = true; auto start = std::chrono::system_clock::now(); - FILE* install_log = fopen_path(install_file, "w"); - if (install_log) { - fputs(path, install_log); - fputc('\n', install_log); - } else { - LOGE("failed to open last_install: %s\n", strerror(errno)); - } int result; std::vector log_buffer; if (setup_install_mounts() != 0) { @@ -529,33 +521,40 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, } else { result = really_install_package(path, wipe_cache, needs_mount, log_buffer, retry_count); } - if (install_log != nullptr) { - fputc(result == INSTALL_SUCCESS ? '1' : '0', install_log); - fputc('\n', install_log); - std::chrono::duration duration = std::chrono::system_clock::now() - start; - int count = static_cast(duration.count()); - // Report the time spent to apply OTA update in seconds. - fprintf(install_log, "time_total: %d\n", count); - fprintf(install_log, "retry: %d\n", retry_count); - - for (const auto& s : log_buffer) { - fprintf(install_log, "%s\n", s.c_str()); - } - if (ensure_path_mounted(UNCRYPT_STATUS) != 0) { - LOG(WARNING) << "Can't mount " << UNCRYPT_STATUS; + // Measure the time spent to apply OTA update in seconds. + std::chrono::duration duration = std::chrono::system_clock::now() - start; + int time_total = static_cast(duration.count()); + + if (ensure_path_mounted(UNCRYPT_STATUS) != 0) { + LOGW("Can't mount %s\n", UNCRYPT_STATUS); + } else { + std::string uncrypt_status; + if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) { + LOGW("failed to read uncrypt status: %s\n", strerror(errno)); + } else if (!android::base::StartsWith(uncrypt_status, "uncrypt_time:")) { + LOGW("corrupted uncrypt_status: %s: %s\n", uncrypt_status.c_str(), strerror(errno)); } else { - std::string uncrypt_status; - if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) { - PLOG(WARNING) << "failed to read uncrypt status"; - } else if (!android::base::StartsWith(uncrypt_status, "uncrypt_time:")) { - PLOG(WARNING) << "corrupted uncrypt_status: " << uncrypt_status; - } else { - fprintf(install_log, "%s\n", android::base::Trim(uncrypt_status).c_str()); - } + log_buffer.push_back(android::base::Trim(uncrypt_status)); } - fclose(install_log); } + + // The first two lines need to be the package name and install result. + std::vector log_header = { + path, + result == INSTALL_SUCCESS ? "1" : "0", + "time_total: " + std::to_string(time_total), + "retry: " + std::to_string(retry_count), + }; + std::string log_content = android::base::Join(log_header, "\n") + "\n" + + android::base::Join(log_buffer, "\n"); + if (!android::base::WriteStringToFile(log_content, install_file)) { + LOGE("failed to write %s: %s\n", install_file, strerror(errno)); + } + + // Write a copy into last_log. + LOGI("%s\n", log_content.c_str()); + return result; } diff --git a/recovery.cpp b/recovery.cpp index ccb2d223b..0f0b978e7 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -1429,15 +1429,18 @@ static bool bootreason_in_blacklist() { } static void log_failure_code(ErrorCode code, const char *update_package) { - FILE* install_log = fopen_path(TEMPORARY_INSTALL_FILE, "w"); - if (install_log != nullptr) { - fprintf(install_log, "%s\n", update_package); - fprintf(install_log, "0\n"); - fprintf(install_log, "error: %d\n", code); - fclose(install_log); - } else { - LOGE("failed to open last_install: %s\n", strerror(errno)); + std::vector log_buffer = { + update_package, + "0", // install result + "error: " + std::to_string(code), + }; + std::string log_content = android::base::Join(log_buffer, "\n"); + if (!android::base::WriteStringToFile(log_content, TEMPORARY_INSTALL_FILE)) { + LOGE("failed to write %s: %s\n", TEMPORARY_INSTALL_FILE, strerror(errno)); } + + // Also write the info into last_log. + LOGI("%s\n", log_content.c_str()); } static ssize_t logbasename( -- cgit v1.2.3 From 37d7d67ca216972cba9259aa5866220d6abfaf14 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Sat, 24 Sep 2016 15:31:34 -0700 Subject: DO NOT MERGE Report uncrypt errors in details Add the error codes for uncrypt and report the failure details in uncrypt_status. Test: uncrypt_error logs correctly in last_install Bug: 31603820 Change-Id: I8e0de845ce1707b6f8f5ae84564c5e93fd5f5ef5 (cherry picked from commit da44cf18f3ce4bbffa85ad0a50bb25e9cb54a86d) --- error_code.h | 22 +++++++++++++ install.cpp | 2 +- uncrypt/uncrypt.cpp | 91 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 75 insertions(+), 40 deletions(-) diff --git a/error_code.h b/error_code.h index fe38ba476..dfea0eb38 100644 --- a/error_code.h +++ b/error_code.h @@ -44,4 +44,26 @@ enum CauseCode { kVendorFailure = 200 }; +enum UncryptErrorCode { + kUncryptNoError = -1, + kUncryptErrorPlaceholder = 50, + kUncryptTimeoutError = 100, + kUncryptFileRemoveError, + kUncryptFileOpenError, + kUncryptSocketOpenError, + kUncryptSocketWriteError, + kUncryptSocketListenError, + kUncryptSocketAcceptError, + kUncryptFstabReadError, + kUncryptFileStatError, + kUncryptBlockOpenError, + kUncryptIoctlError, + kUncryptReadError, + kUncryptWriteError, + kUncryptFileSyncError, + kUncryptFileCloseError, + kUncryptFileRenameError, + kUncryptPackageMissingError, +}; + #endif diff --git a/install.cpp b/install.cpp index d8372e276..d30890a9e 100644 --- a/install.cpp +++ b/install.cpp @@ -532,7 +532,7 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, std::string uncrypt_status; if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) { LOGW("failed to read uncrypt status: %s\n", strerror(errno)); - } else if (!android::base::StartsWith(uncrypt_status, "uncrypt_time:")) { + } else if (!android::base::StartsWith(uncrypt_status, "uncrypt_")) { LOGW("corrupted uncrypt_status: %s: %s\n", uncrypt_status.c_str(), strerror(errno)); } else { log_buffer.push_back(android::base::Trim(uncrypt_status)); diff --git a/uncrypt/uncrypt.cpp b/uncrypt/uncrypt.cpp index c73107cca..280568d23 100644 --- a/uncrypt/uncrypt.cpp +++ b/uncrypt/uncrypt.cpp @@ -118,6 +118,7 @@ #define LOG_TAG "uncrypt" #include +#include "error_code.h" #include "unique_fd.h" #define WINDOW_SIZE 5 @@ -235,25 +236,25 @@ static int produce_block_map(const char* path, const char* map_file, const char* std::string err; if (!android::base::RemoveFileIfExists(map_file, &err)) { ALOGE("failed to remove the existing map file %s: %s", map_file, err.c_str()); - return -1; + return kUncryptFileRemoveError; } std::string tmp_map_file = std::string(map_file) + ".tmp"; unique_fd mapfd(open(tmp_map_file.c_str(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)); if (!mapfd) { ALOGE("failed to open %s: %s\n", tmp_map_file.c_str(), strerror(errno)); - return -1; + return kUncryptFileOpenError; } // Make sure we can write to the socket. if (!write_status_to_socket(0, socket)) { ALOGE("failed to write to socket %d\n", socket); - return -1; + return kUncryptSocketWriteError; } struct stat sb; if (stat(path, &sb) != 0) { ALOGE("failed to stat %s", path); - return -1; + return kUncryptFileStatError; } ALOGI(" block size: %ld bytes", static_cast(sb.st_blksize)); @@ -267,7 +268,7 @@ static int produce_block_map(const char* path, const char* map_file, const char* blk_dev, sb.st_size, static_cast(sb.st_blksize)); if (!android::base::WriteStringToFd(s, mapfd.get())) { ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno)); - return -1; + return kUncryptWriteError; } std::vector> buffers; @@ -280,7 +281,7 @@ static int produce_block_map(const char* path, const char* map_file, const char* unique_fd fd(open(path, O_RDONLY)); if (!fd) { ALOGE("failed to open %s for reading: %s", path, strerror(errno)); - return -1; + return kUncryptFileOpenError; } unique_fd wfd(-1); @@ -288,7 +289,7 @@ static int produce_block_map(const char* path, const char* map_file, const char* wfd = open(blk_dev, O_WRONLY); if (!wfd) { ALOGE("failed to open fd for writing: %s", strerror(errno)); - return -1; + return kUncryptBlockOpenError; } } @@ -307,13 +308,13 @@ static int produce_block_map(const char* path, const char* map_file, const char* int block = head_block; if (ioctl(fd.get(), FIBMAP, &block) != 0) { ALOGE("failed to find block %d", head_block); - return -1; + return kUncryptIoctlError; } add_block_to_ranges(ranges, block); if (encrypted) { if (write_at_offset(buffers[head].data(), sb.st_blksize, wfd.get(), static_cast(sb.st_blksize) * block) != 0) { - return -1; + return kUncryptWriteError; } } head = (head + 1) % WINDOW_SIZE; @@ -326,7 +327,7 @@ static int produce_block_map(const char* path, const char* map_file, const char* std::min(static_cast(sb.st_blksize), sb.st_size - pos)); if (!android::base::ReadFully(fd.get(), buffers[tail].data(), to_read)) { ALOGE("failed to read: %s", strerror(errno)); - return -1; + return kUncryptReadError; } pos += to_read; } else { @@ -343,13 +344,13 @@ static int produce_block_map(const char* path, const char* map_file, const char* int block = head_block; if (ioctl(fd.get(), FIBMAP, &block) != 0) { ALOGE("failed to find block %d", head_block); - return -1; + return kUncryptIoctlError; } add_block_to_ranges(ranges, block); if (encrypted) { if (write_at_offset(buffers[head].data(), sb.st_blksize, wfd.get(), static_cast(sb.st_blksize) * block) != 0) { - return -1; + return kUncryptWriteError; } } head = (head + 1) % WINDOW_SIZE; @@ -359,41 +360,41 @@ static int produce_block_map(const char* path, const char* map_file, const char* if (!android::base::WriteStringToFd( android::base::StringPrintf("%zu\n", ranges.size() / 2), mapfd.get())) { ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno)); - return -1; + return kUncryptWriteError; } for (size_t i = 0; i < ranges.size(); i += 2) { if (!android::base::WriteStringToFd( android::base::StringPrintf("%d %d\n", ranges[i], ranges[i+1]), mapfd.get())) { ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno)); - return -1; + return kUncryptWriteError; } } if (fsync(mapfd.get()) == -1) { ALOGE("failed to fsync \"%s\": %s", tmp_map_file.c_str(), strerror(errno)); - return -1; + return kUncryptFileSyncError; } if (close(mapfd.get()) == -1) { ALOGE("failed to close %s: %s", tmp_map_file.c_str(), strerror(errno)); - return -1; + return kUncryptFileCloseError; } mapfd = -1; if (encrypted) { if (fsync(wfd.get()) == -1) { ALOGE("failed to fsync \"%s\": %s", blk_dev, strerror(errno)); - return -1; + return kUncryptFileSyncError; } if (close(wfd.get()) == -1) { ALOGE("failed to close %s: %s", blk_dev, strerror(errno)); - return -1; + return kUncryptFileCloseError; } wfd = -1; } if (rename(tmp_map_file.c_str(), map_file) == -1) { ALOGE("failed to rename %s to %s: %s", tmp_map_file.c_str(), map_file, strerror(errno)); - return -1; + return kUncryptFileRenameError; } // Sync dir to make rename() result written to disk. std::string file_name = map_file; @@ -401,15 +402,15 @@ static int produce_block_map(const char* path, const char* map_file, const char* unique_fd dfd(open(dir_name.c_str(), O_RDONLY | O_DIRECTORY)); if (!dfd) { ALOGE("failed to open dir %s: %s", dir_name.c_str(), strerror(errno)); - return -1; + return kUncryptFileOpenError; } if (fsync(dfd.get()) == -1) { ALOGE("failed to fsync %s: %s", dir_name.c_str(), strerror(errno)); - return -1; + return kUncryptFileSyncError; } if (close(dfd.get()) == -1) { ALOGE("failed to close %s: %s", dir_name.c_str(), strerror(errno)); - return -1; + return kUncryptFileCloseError; } dfd = -1; return 0; @@ -449,46 +450,54 @@ static int uncrypt(const char* input_path, const char* map_file, const int socke // and /sdcard we leave the file alone. if (strncmp(path, "/data/", 6) == 0) { ALOGI("writing block map %s", map_file); - if (produce_block_map(path, map_file, blk_dev, encrypted, socket) != 0) { - return 1; - } + return produce_block_map(path, map_file, blk_dev, encrypted, socket); } return 0; } +static void log_uncrypt_error_code(UncryptErrorCode error_code) { + if (!android::base::WriteStringToFile(android::base::StringPrintf( + "uncrypt_error: %d\n", error_code), UNCRYPT_STATUS)) { + ALOGW("failed to write to %s: %s", UNCRYPT_STATUS.c_str(), strerror(errno)); + } +} + static bool uncrypt_wrapper(const char* input_path, const char* map_file, const int socket) { + // Initialize the uncrypt error to kUncryptErrorPlaceholder. + log_uncrypt_error_code(kUncryptErrorPlaceholder); + std::string package; if (input_path == nullptr) { if (!find_uncrypt_package(UNCRYPT_PATH_FILE, &package)) { write_status_to_socket(-1, socket); + // Overwrite the error message. + log_uncrypt_error_code(kUncryptPackageMissingError); return false; } input_path = package.c_str(); } CHECK(map_file != nullptr); -#define UNCRYPT_TIME_HOLDER 0x7FFFFFFF - // Intialize the uncrypt time cost to a huge number so that we can tell from - // the statistics if an uncrypt fails to finish. - if (!android::base::WriteStringToFile(android::base::StringPrintf( - "uncrypt_time: %d\n", UNCRYPT_TIME_HOLDER), UNCRYPT_STATUS)) { - PLOG(WARNING) << "failed to write to " << UNCRYPT_STATUS; - } - auto start = std::chrono::system_clock::now(); int status = uncrypt(input_path, map_file, socket); + std::chrono::duration duration = std::chrono::system_clock::now() - start; + int count = static_cast(duration.count()); + + std::string uncrypt_message = android::base::StringPrintf("uncrypt_time: %d\n", count); if (status != 0) { + // Log the time cost and error code if uncrypt fails. + uncrypt_message += android::base::StringPrintf("uncrypt_error: %d\n", status); + if (!android::base::WriteStringToFile(uncrypt_message, UNCRYPT_STATUS)) { + ALOGW("failed to write to %s: %s", UNCRYPT_STATUS.c_str(), strerror(errno)); + } + write_status_to_socket(-1, socket); return false; } - std::chrono::duration duration = std::chrono::system_clock::now() - start; - int count = static_cast(duration.count()); - // Overwrite the uncrypt_time if uncrypt finishes successfully. - if (!android::base::WriteStringToFile( - android::base::StringPrintf("uncrypt_time: %d\n", count), UNCRYPT_STATUS)) { - PLOG(WARNING) << "failed to write to " << UNCRYPT_STATUS; + if (!android::base::WriteStringToFile(uncrypt_message, UNCRYPT_STATUS)) { + ALOGW("failed to write to %s: %s", UNCRYPT_STATUS.c_str(), strerror(errno)); } write_status_to_socket(100, socket); @@ -582,6 +591,7 @@ int main(int argc, char** argv) { } if ((fstab = read_fstab()) == nullptr) { + log_uncrypt_error_code(kUncryptFstabReadError); return 1; } @@ -590,18 +600,21 @@ int main(int argc, char** argv) { unique_fd service_socket(android_get_control_socket(UNCRYPT_SOCKET.c_str())); if (!service_socket) { ALOGE("failed to open socket \"%s\": %s", UNCRYPT_SOCKET.c_str(), strerror(errno)); + log_uncrypt_error_code(kUncryptSocketOpenError); return 1; } fcntl(service_socket.get(), F_SETFD, FD_CLOEXEC); if (listen(service_socket.get(), 1) == -1) { ALOGE("failed to listen on socket %d: %s", service_socket.get(), strerror(errno)); + log_uncrypt_error_code(kUncryptSocketListenError); return 1; } unique_fd socket_fd(accept4(service_socket.get(), nullptr, nullptr, SOCK_CLOEXEC)); if (!socket_fd) { ALOGE("failed to accept on socket %d: %s", service_socket.get(), strerror(errno)); + log_uncrypt_error_code(kUncryptSocketAcceptError); return 1; } -- cgit v1.2.3 From 2f2c723d1b622234ee9ed592b35750fcf1fcb2c7 Mon Sep 17 00:00:00 2001 From: Damien Bargiacchi Date: Wed, 19 Oct 2016 19:19:15 -0700 Subject: Shrink all recovery loop images with zopflipng Reduces recovery image size 800k - 2.8MB depending on device type Change-Id: Ib703c8f17394759fb9bad068525737188a4e8965 --- res-hdpi/images/loop00000.png | Bin 9715 -> 9201 bytes res-hdpi/images/loop00001.png | Bin 9823 -> 9276 bytes res-hdpi/images/loop00002.png | Bin 9807 -> 9279 bytes res-hdpi/images/loop00003.png | Bin 9748 -> 9267 bytes res-hdpi/images/loop00004.png | Bin 9966 -> 9476 bytes res-hdpi/images/loop00005.png | Bin 10030 -> 9528 bytes res-hdpi/images/loop00006.png | Bin 10211 -> 9690 bytes res-hdpi/images/loop00007.png | Bin 10300 -> 9779 bytes res-hdpi/images/loop00008.png | Bin 10271 -> 9764 bytes res-hdpi/images/loop00009.png | Bin 10172 -> 9678 bytes res-hdpi/images/loop00010.png | Bin 10252 -> 9798 bytes res-hdpi/images/loop00011.png | Bin 10194 -> 9731 bytes res-hdpi/images/loop00012.png | Bin 10246 -> 9821 bytes res-hdpi/images/loop00013.png | Bin 10280 -> 9829 bytes res-hdpi/images/loop00014.png | Bin 10263 -> 9823 bytes res-hdpi/images/loop00015.png | Bin 10214 -> 9800 bytes res-hdpi/images/loop00016.png | Bin 10308 -> 9890 bytes res-hdpi/images/loop00017.png | Bin 10082 -> 9641 bytes res-hdpi/images/loop00018.png | Bin 10115 -> 9681 bytes res-hdpi/images/loop00019.png | Bin 10004 -> 9578 bytes res-hdpi/images/loop00020.png | Bin 9793 -> 9383 bytes res-hdpi/images/loop00021.png | Bin 9952 -> 9529 bytes res-hdpi/images/loop00022.png | Bin 9784 -> 9372 bytes res-hdpi/images/loop00023.png | Bin 9758 -> 9307 bytes res-hdpi/images/loop00024.png | Bin 9738 -> 9284 bytes res-hdpi/images/loop00025.png | Bin 9716 -> 9279 bytes res-hdpi/images/loop00026.png | Bin 9912 -> 9477 bytes res-hdpi/images/loop00027.png | Bin 9716 -> 9265 bytes res-hdpi/images/loop00028.png | Bin 10005 -> 9532 bytes res-hdpi/images/loop00029.png | Bin 10038 -> 9536 bytes res-hdpi/images/loop00030.png | Bin 9975 -> 9511 bytes res-hdpi/images/loop00031.png | Bin 9855 -> 9368 bytes res-hdpi/images/loop00032.png | Bin 9743 -> 9280 bytes res-hdpi/images/loop00033.png | Bin 9989 -> 9513 bytes res-hdpi/images/loop00034.png | Bin 10005 -> 9521 bytes res-hdpi/images/loop00035.png | Bin 10192 -> 9692 bytes res-hdpi/images/loop00036.png | Bin 10112 -> 9636 bytes res-hdpi/images/loop00037.png | Bin 10325 -> 9833 bytes res-hdpi/images/loop00038.png | Bin 10477 -> 10034 bytes res-hdpi/images/loop00039.png | Bin 10458 -> 10005 bytes res-hdpi/images/loop00040.png | Bin 10381 -> 9925 bytes res-hdpi/images/loop00041.png | Bin 10791 -> 10310 bytes res-hdpi/images/loop00042.png | Bin 10753 -> 10307 bytes res-hdpi/images/loop00043.png | Bin 10721 -> 10253 bytes res-hdpi/images/loop00044.png | Bin 10763 -> 10274 bytes res-hdpi/images/loop00045.png | Bin 10839 -> 10364 bytes res-hdpi/images/loop00046.png | Bin 10883 -> 10416 bytes res-hdpi/images/loop00047.png | Bin 11049 -> 10593 bytes res-hdpi/images/loop00048.png | Bin 10971 -> 10473 bytes res-hdpi/images/loop00049.png | Bin 11018 -> 10521 bytes res-hdpi/images/loop00050.png | Bin 10662 -> 10203 bytes res-hdpi/images/loop00051.png | Bin 10500 -> 10022 bytes res-hdpi/images/loop00052.png | Bin 10593 -> 10115 bytes res-hdpi/images/loop00053.png | Bin 10591 -> 10126 bytes res-hdpi/images/loop00054.png | Bin 10594 -> 10117 bytes res-hdpi/images/loop00055.png | Bin 10338 -> 9845 bytes res-hdpi/images/loop00056.png | Bin 10291 -> 9782 bytes res-hdpi/images/loop00057.png | Bin 10227 -> 9735 bytes res-hdpi/images/loop00058.png | Bin 10082 -> 9582 bytes res-hdpi/images/loop00059.png | Bin 9914 -> 9391 bytes res-hdpi/images/loop00060.png | Bin 10011 -> 9512 bytes res-hdpi/images/loop00061.png | Bin 9884 -> 9383 bytes res-hdpi/images/loop00062.png | Bin 9943 -> 9404 bytes res-hdpi/images/loop00063.png | Bin 9961 -> 9421 bytes res-hdpi/images/loop00064.png | Bin 9965 -> 9430 bytes res-hdpi/images/loop00065.png | Bin 9969 -> 9429 bytes res-hdpi/images/loop00066.png | Bin 9816 -> 9308 bytes res-hdpi/images/loop00067.png | Bin 10008 -> 9516 bytes res-hdpi/images/loop00068.png | Bin 9980 -> 9468 bytes res-hdpi/images/loop00069.png | Bin 9829 -> 9302 bytes res-hdpi/images/loop00070.png | Bin 10000 -> 9517 bytes res-hdpi/images/loop00071.png | Bin 9831 -> 9358 bytes res-hdpi/images/loop00072.png | Bin 9641 -> 9165 bytes res-hdpi/images/loop00073.png | Bin 9616 -> 9171 bytes res-hdpi/images/loop00074.png | Bin 9440 -> 8981 bytes res-hdpi/images/loop00075.png | Bin 9238 -> 8780 bytes res-hdpi/images/loop00076.png | Bin 9244 -> 8790 bytes res-hdpi/images/loop00077.png | Bin 9056 -> 8609 bytes res-hdpi/images/loop00078.png | Bin 9027 -> 8561 bytes res-hdpi/images/loop00079.png | Bin 9030 -> 8543 bytes res-hdpi/images/loop00080.png | Bin 9251 -> 8797 bytes res-hdpi/images/loop00081.png | Bin 9435 -> 9012 bytes res-hdpi/images/loop00082.png | Bin 9672 -> 9226 bytes res-hdpi/images/loop00083.png | Bin 9581 -> 9140 bytes res-hdpi/images/loop00084.png | Bin 9684 -> 9214 bytes res-hdpi/images/loop00085.png | Bin 9824 -> 9336 bytes res-hdpi/images/loop00086.png | Bin 9833 -> 9322 bytes res-hdpi/images/loop00087.png | Bin 9827 -> 9309 bytes res-hdpi/images/loop00088.png | Bin 9772 -> 9265 bytes res-hdpi/images/loop00089.png | Bin 9626 -> 9137 bytes res-hdpi/images/loop00090.png | Bin 9715 -> 9201 bytes res-mdpi/images/loop00000.png | Bin 6155 -> 5900 bytes res-mdpi/images/loop00001.png | Bin 6135 -> 5873 bytes res-mdpi/images/loop00002.png | Bin 6122 -> 5854 bytes res-mdpi/images/loop00003.png | Bin 6181 -> 5924 bytes res-mdpi/images/loop00004.png | Bin 6224 -> 5981 bytes res-mdpi/images/loop00005.png | Bin 6280 -> 6052 bytes res-mdpi/images/loop00006.png | Bin 6318 -> 6096 bytes res-mdpi/images/loop00007.png | Bin 6345 -> 6126 bytes res-mdpi/images/loop00008.png | Bin 6382 -> 6132 bytes res-mdpi/images/loop00009.png | Bin 6406 -> 6179 bytes res-mdpi/images/loop00010.png | Bin 6299 -> 6078 bytes res-mdpi/images/loop00011.png | Bin 6373 -> 6167 bytes res-mdpi/images/loop00012.png | Bin 6269 -> 6079 bytes res-mdpi/images/loop00013.png | Bin 6351 -> 6147 bytes res-mdpi/images/loop00014.png | Bin 6257 -> 6052 bytes res-mdpi/images/loop00015.png | Bin 6288 -> 6089 bytes res-mdpi/images/loop00016.png | Bin 6273 -> 6069 bytes res-mdpi/images/loop00017.png | Bin 6228 -> 6040 bytes res-mdpi/images/loop00018.png | Bin 6248 -> 6055 bytes res-mdpi/images/loop00019.png | Bin 6116 -> 5923 bytes res-mdpi/images/loop00020.png | Bin 6031 -> 5831 bytes res-mdpi/images/loop00021.png | Bin 6036 -> 5844 bytes res-mdpi/images/loop00022.png | Bin 6049 -> 5839 bytes res-mdpi/images/loop00023.png | Bin 6077 -> 5865 bytes res-mdpi/images/loop00024.png | Bin 5992 -> 5789 bytes res-mdpi/images/loop00025.png | Bin 6007 -> 5779 bytes res-mdpi/images/loop00026.png | Bin 6029 -> 5819 bytes res-mdpi/images/loop00027.png | Bin 5993 -> 5763 bytes res-mdpi/images/loop00028.png | Bin 6004 -> 5769 bytes res-mdpi/images/loop00029.png | Bin 6146 -> 5932 bytes res-mdpi/images/loop00030.png | Bin 6196 -> 5973 bytes res-mdpi/images/loop00031.png | Bin 6134 -> 5904 bytes res-mdpi/images/loop00032.png | Bin 6114 -> 5872 bytes res-mdpi/images/loop00033.png | Bin 6083 -> 5843 bytes res-mdpi/images/loop00034.png | Bin 6132 -> 5903 bytes res-mdpi/images/loop00035.png | Bin 6239 -> 6000 bytes res-mdpi/images/loop00036.png | Bin 6260 -> 6023 bytes res-mdpi/images/loop00037.png | Bin 6317 -> 6057 bytes res-mdpi/images/loop00038.png | Bin 6424 -> 6204 bytes res-mdpi/images/loop00039.png | Bin 6479 -> 6265 bytes res-mdpi/images/loop00040.png | Bin 6515 -> 6307 bytes res-mdpi/images/loop00041.png | Bin 6643 -> 6420 bytes res-mdpi/images/loop00042.png | Bin 6654 -> 6448 bytes res-mdpi/images/loop00043.png | Bin 6619 -> 6411 bytes res-mdpi/images/loop00044.png | Bin 6730 -> 6504 bytes res-mdpi/images/loop00045.png | Bin 6622 -> 6384 bytes res-mdpi/images/loop00046.png | Bin 6683 -> 6447 bytes res-mdpi/images/loop00047.png | Bin 6655 -> 6437 bytes res-mdpi/images/loop00048.png | Bin 6768 -> 6532 bytes res-mdpi/images/loop00049.png | Bin 6671 -> 6424 bytes res-mdpi/images/loop00050.png | Bin 6572 -> 6323 bytes res-mdpi/images/loop00051.png | Bin 6551 -> 6327 bytes res-mdpi/images/loop00052.png | Bin 6561 -> 6342 bytes res-mdpi/images/loop00053.png | Bin 6486 -> 6263 bytes res-mdpi/images/loop00054.png | Bin 6559 -> 6347 bytes res-mdpi/images/loop00055.png | Bin 6498 -> 6277 bytes res-mdpi/images/loop00056.png | Bin 6369 -> 6133 bytes res-mdpi/images/loop00057.png | Bin 6336 -> 6103 bytes res-mdpi/images/loop00058.png | Bin 6329 -> 6083 bytes res-mdpi/images/loop00059.png | Bin 6261 -> 6014 bytes res-mdpi/images/loop00060.png | Bin 6168 -> 5930 bytes res-mdpi/images/loop00061.png | Bin 6161 -> 5902 bytes res-mdpi/images/loop00062.png | Bin 6185 -> 5927 bytes res-mdpi/images/loop00063.png | Bin 6235 -> 5952 bytes res-mdpi/images/loop00064.png | Bin 6226 -> 5965 bytes res-mdpi/images/loop00065.png | Bin 6280 -> 6010 bytes res-mdpi/images/loop00066.png | Bin 6167 -> 5918 bytes res-mdpi/images/loop00067.png | Bin 6161 -> 5916 bytes res-mdpi/images/loop00068.png | Bin 6234 -> 5976 bytes res-mdpi/images/loop00069.png | Bin 6190 -> 5941 bytes res-mdpi/images/loop00070.png | Bin 6168 -> 5948 bytes res-mdpi/images/loop00071.png | Bin 6083 -> 5867 bytes res-mdpi/images/loop00072.png | Bin 5992 -> 5777 bytes res-mdpi/images/loop00073.png | Bin 5967 -> 5757 bytes res-mdpi/images/loop00074.png | Bin 5818 -> 5602 bytes res-mdpi/images/loop00075.png | Bin 5717 -> 5468 bytes res-mdpi/images/loop00076.png | Bin 5724 -> 5507 bytes res-mdpi/images/loop00077.png | Bin 5644 -> 5417 bytes res-mdpi/images/loop00078.png | Bin 5660 -> 5415 bytes res-mdpi/images/loop00079.png | Bin 5670 -> 5430 bytes res-mdpi/images/loop00080.png | Bin 5718 -> 5478 bytes res-mdpi/images/loop00081.png | Bin 5872 -> 5633 bytes res-mdpi/images/loop00082.png | Bin 5929 -> 5706 bytes res-mdpi/images/loop00083.png | Bin 6009 -> 5783 bytes res-mdpi/images/loop00084.png | Bin 5988 -> 5750 bytes res-mdpi/images/loop00085.png | Bin 6026 -> 5778 bytes res-mdpi/images/loop00086.png | Bin 6021 -> 5782 bytes res-mdpi/images/loop00087.png | Bin 6163 -> 5927 bytes res-mdpi/images/loop00088.png | Bin 6127 -> 5882 bytes res-mdpi/images/loop00089.png | Bin 6243 -> 5992 bytes res-mdpi/images/loop00090.png | Bin 6155 -> 5900 bytes res-xhdpi/images/loop00000.png | Bin 13121 -> 12215 bytes res-xhdpi/images/loop00001.png | Bin 12986 -> 12095 bytes res-xhdpi/images/loop00002.png | Bin 13588 -> 12714 bytes res-xhdpi/images/loop00003.png | Bin 13584 -> 12748 bytes res-xhdpi/images/loop00004.png | Bin 13685 -> 12846 bytes res-xhdpi/images/loop00005.png | Bin 13802 -> 12919 bytes res-xhdpi/images/loop00006.png | Bin 14188 -> 13349 bytes res-xhdpi/images/loop00007.png | Bin 14027 -> 13162 bytes res-xhdpi/images/loop00008.png | Bin 14273 -> 13426 bytes res-xhdpi/images/loop00009.png | Bin 14122 -> 13291 bytes res-xhdpi/images/loop00010.png | Bin 14226 -> 13407 bytes res-xhdpi/images/loop00011.png | Bin 14155 -> 13346 bytes res-xhdpi/images/loop00012.png | Bin 14375 -> 13566 bytes res-xhdpi/images/loop00013.png | Bin 14231 -> 13444 bytes res-xhdpi/images/loop00014.png | Bin 14037 -> 13322 bytes res-xhdpi/images/loop00015.png | Bin 14052 -> 13292 bytes res-xhdpi/images/loop00016.png | Bin 13930 -> 13175 bytes res-xhdpi/images/loop00017.png | Bin 14127 -> 13359 bytes res-xhdpi/images/loop00018.png | Bin 14157 -> 13405 bytes res-xhdpi/images/loop00019.png | Bin 13666 -> 12973 bytes res-xhdpi/images/loop00020.png | Bin 13677 -> 12998 bytes res-xhdpi/images/loop00021.png | Bin 13777 -> 13037 bytes res-xhdpi/images/loop00022.png | Bin 13546 -> 12811 bytes res-xhdpi/images/loop00023.png | Bin 13674 -> 12911 bytes res-xhdpi/images/loop00024.png | Bin 13465 -> 12696 bytes res-xhdpi/images/loop00025.png | Bin 13421 -> 12677 bytes res-xhdpi/images/loop00026.png | Bin 13507 -> 12789 bytes res-xhdpi/images/loop00027.png | Bin 13272 -> 12504 bytes res-xhdpi/images/loop00028.png | Bin 13692 -> 12906 bytes res-xhdpi/images/loop00029.png | Bin 13709 -> 12916 bytes res-xhdpi/images/loop00030.png | Bin 13650 -> 12847 bytes res-xhdpi/images/loop00031.png | Bin 13519 -> 12718 bytes res-xhdpi/images/loop00032.png | Bin 13523 -> 12708 bytes res-xhdpi/images/loop00033.png | Bin 13526 -> 12751 bytes res-xhdpi/images/loop00034.png | Bin 13751 -> 12940 bytes res-xhdpi/images/loop00035.png | Bin 14005 -> 13215 bytes res-xhdpi/images/loop00036.png | Bin 14137 -> 13399 bytes res-xhdpi/images/loop00037.png | Bin 14320 -> 13587 bytes res-xhdpi/images/loop00038.png | Bin 14322 -> 13600 bytes res-xhdpi/images/loop00039.png | Bin 14536 -> 13801 bytes res-xhdpi/images/loop00040.png | Bin 14550 -> 13828 bytes res-xhdpi/images/loop00041.png | Bin 14691 -> 13956 bytes res-xhdpi/images/loop00042.png | Bin 14935 -> 14150 bytes res-xhdpi/images/loop00043.png | Bin 14884 -> 14067 bytes res-xhdpi/images/loop00044.png | Bin 14958 -> 14166 bytes res-xhdpi/images/loop00045.png | Bin 14868 -> 14042 bytes res-xhdpi/images/loop00046.png | Bin 15135 -> 14322 bytes res-xhdpi/images/loop00047.png | Bin 14967 -> 14156 bytes res-xhdpi/images/loop00048.png | Bin 15144 -> 14298 bytes res-xhdpi/images/loop00049.png | Bin 15063 -> 14274 bytes res-xhdpi/images/loop00050.png | Bin 14846 -> 14025 bytes res-xhdpi/images/loop00051.png | Bin 14867 -> 14001 bytes res-xhdpi/images/loop00052.png | Bin 14738 -> 13965 bytes res-xhdpi/images/loop00053.png | Bin 14750 -> 13886 bytes res-xhdpi/images/loop00054.png | Bin 14430 -> 13573 bytes res-xhdpi/images/loop00055.png | Bin 14483 -> 13665 bytes res-xhdpi/images/loop00056.png | Bin 14106 -> 13313 bytes res-xhdpi/images/loop00057.png | Bin 14331 -> 13505 bytes res-xhdpi/images/loop00058.png | Bin 13771 -> 12874 bytes res-xhdpi/images/loop00059.png | Bin 13765 -> 12906 bytes res-xhdpi/images/loop00060.png | Bin 13502 -> 12708 bytes res-xhdpi/images/loop00061.png | Bin 13758 -> 12947 bytes res-xhdpi/images/loop00062.png | Bin 13659 -> 12817 bytes res-xhdpi/images/loop00063.png | Bin 13836 -> 13004 bytes res-xhdpi/images/loop00064.png | Bin 13734 -> 12871 bytes res-xhdpi/images/loop00065.png | Bin 13620 -> 12785 bytes res-xhdpi/images/loop00066.png | Bin 13530 -> 12684 bytes res-xhdpi/images/loop00067.png | Bin 13549 -> 12712 bytes res-xhdpi/images/loop00068.png | Bin 13608 -> 12809 bytes res-xhdpi/images/loop00069.png | Bin 13454 -> 12696 bytes res-xhdpi/images/loop00070.png | Bin 13830 -> 12995 bytes res-xhdpi/images/loop00071.png | Bin 13616 -> 12807 bytes res-xhdpi/images/loop00072.png | Bin 13308 -> 12497 bytes res-xhdpi/images/loop00073.png | Bin 13150 -> 12366 bytes res-xhdpi/images/loop00074.png | Bin 13091 -> 12355 bytes res-xhdpi/images/loop00075.png | Bin 12954 -> 12181 bytes res-xhdpi/images/loop00076.png | Bin 12621 -> 11868 bytes res-xhdpi/images/loop00077.png | Bin 12465 -> 11726 bytes res-xhdpi/images/loop00078.png | Bin 12583 -> 11873 bytes res-xhdpi/images/loop00079.png | Bin 12643 -> 11893 bytes res-xhdpi/images/loop00080.png | Bin 12859 -> 12119 bytes res-xhdpi/images/loop00081.png | Bin 13182 -> 12445 bytes res-xhdpi/images/loop00082.png | Bin 13031 -> 12273 bytes res-xhdpi/images/loop00083.png | Bin 12974 -> 12183 bytes res-xhdpi/images/loop00084.png | Bin 13116 -> 12329 bytes res-xhdpi/images/loop00085.png | Bin 13734 -> 12875 bytes res-xhdpi/images/loop00086.png | Bin 13390 -> 12559 bytes res-xhdpi/images/loop00087.png | Bin 13576 -> 12706 bytes res-xhdpi/images/loop00088.png | Bin 13439 -> 12610 bytes res-xhdpi/images/loop00089.png | Bin 13377 -> 12531 bytes res-xhdpi/images/loop00090.png | Bin 13121 -> 12215 bytes res-xxhdpi/images/loop00000.png | Bin 23844 -> 22250 bytes res-xxhdpi/images/loop00001.png | Bin 23888 -> 22260 bytes res-xxhdpi/images/loop00002.png | Bin 23921 -> 22323 bytes res-xxhdpi/images/loop00003.png | Bin 23643 -> 22069 bytes res-xxhdpi/images/loop00004.png | Bin 24601 -> 22969 bytes res-xxhdpi/images/loop00005.png | Bin 24930 -> 23280 bytes res-xxhdpi/images/loop00006.png | Bin 25409 -> 23713 bytes res-xxhdpi/images/loop00007.png | Bin 25252 -> 23577 bytes res-xxhdpi/images/loop00008.png | Bin 25374 -> 23713 bytes res-xxhdpi/images/loop00009.png | Bin 25053 -> 23372 bytes res-xxhdpi/images/loop00010.png | Bin 25072 -> 23521 bytes res-xxhdpi/images/loop00011.png | Bin 25067 -> 23468 bytes res-xxhdpi/images/loop00012.png | Bin 24800 -> 23188 bytes res-xxhdpi/images/loop00013.png | Bin 24816 -> 23279 bytes res-xxhdpi/images/loop00014.png | Bin 24964 -> 23440 bytes res-xxhdpi/images/loop00015.png | Bin 25074 -> 23498 bytes res-xxhdpi/images/loop00016.png | Bin 25015 -> 23475 bytes res-xxhdpi/images/loop00017.png | Bin 25105 -> 23496 bytes res-xxhdpi/images/loop00018.png | Bin 25231 -> 23561 bytes res-xxhdpi/images/loop00019.png | Bin 24874 -> 23270 bytes res-xxhdpi/images/loop00020.png | Bin 24930 -> 23358 bytes res-xxhdpi/images/loop00021.png | Bin 24971 -> 23377 bytes res-xxhdpi/images/loop00022.png | Bin 25078 -> 23475 bytes res-xxhdpi/images/loop00023.png | Bin 24149 -> 22471 bytes res-xxhdpi/images/loop00024.png | Bin 24109 -> 22493 bytes res-xxhdpi/images/loop00025.png | Bin 23882 -> 22297 bytes res-xxhdpi/images/loop00026.png | Bin 24783 -> 23125 bytes res-xxhdpi/images/loop00027.png | Bin 24047 -> 22420 bytes res-xxhdpi/images/loop00028.png | Bin 24328 -> 22678 bytes res-xxhdpi/images/loop00029.png | Bin 24725 -> 23034 bytes res-xxhdpi/images/loop00030.png | Bin 24785 -> 23109 bytes res-xxhdpi/images/loop00031.png | Bin 24155 -> 22555 bytes res-xxhdpi/images/loop00032.png | Bin 25102 -> 23459 bytes res-xxhdpi/images/loop00033.png | Bin 24598 -> 23005 bytes res-xxhdpi/images/loop00034.png | Bin 24534 -> 22961 bytes res-xxhdpi/images/loop00035.png | Bin 25207 -> 23649 bytes res-xxhdpi/images/loop00036.png | Bin 24850 -> 23331 bytes res-xxhdpi/images/loop00037.png | Bin 25157 -> 23640 bytes res-xxhdpi/images/loop00038.png | Bin 25568 -> 24031 bytes res-xxhdpi/images/loop00039.png | Bin 25564 -> 24099 bytes res-xxhdpi/images/loop00040.png | Bin 26059 -> 24521 bytes res-xxhdpi/images/loop00041.png | Bin 25794 -> 24242 bytes res-xxhdpi/images/loop00042.png | Bin 26273 -> 24703 bytes res-xxhdpi/images/loop00043.png | Bin 25908 -> 24344 bytes res-xxhdpi/images/loop00044.png | Bin 26792 -> 25285 bytes res-xxhdpi/images/loop00045.png | Bin 26875 -> 25408 bytes res-xxhdpi/images/loop00046.png | Bin 26449 -> 24991 bytes res-xxhdpi/images/loop00047.png | Bin 27025 -> 25458 bytes res-xxhdpi/images/loop00048.png | Bin 27182 -> 25598 bytes res-xxhdpi/images/loop00049.png | Bin 27526 -> 25977 bytes res-xxhdpi/images/loop00050.png | Bin 25743 -> 24186 bytes res-xxhdpi/images/loop00051.png | Bin 26020 -> 24442 bytes res-xxhdpi/images/loop00052.png | Bin 26003 -> 24436 bytes res-xxhdpi/images/loop00053.png | Bin 25282 -> 23786 bytes res-xxhdpi/images/loop00054.png | Bin 25708 -> 24167 bytes res-xxhdpi/images/loop00055.png | Bin 25423 -> 23910 bytes res-xxhdpi/images/loop00056.png | Bin 25506 -> 23882 bytes res-xxhdpi/images/loop00057.png | Bin 25419 -> 23858 bytes res-xxhdpi/images/loop00058.png | Bin 24999 -> 23387 bytes res-xxhdpi/images/loop00059.png | Bin 24117 -> 22514 bytes res-xxhdpi/images/loop00060.png | Bin 24146 -> 22566 bytes res-xxhdpi/images/loop00061.png | Bin 24194 -> 22578 bytes res-xxhdpi/images/loop00062.png | Bin 24219 -> 22564 bytes res-xxhdpi/images/loop00063.png | Bin 24330 -> 22657 bytes res-xxhdpi/images/loop00064.png | Bin 24550 -> 22874 bytes res-xxhdpi/images/loop00065.png | Bin 24535 -> 22746 bytes res-xxhdpi/images/loop00066.png | Bin 24626 -> 22808 bytes res-xxhdpi/images/loop00067.png | Bin 24133 -> 22384 bytes res-xxhdpi/images/loop00068.png | Bin 24107 -> 22328 bytes res-xxhdpi/images/loop00069.png | Bin 24891 -> 23196 bytes res-xxhdpi/images/loop00070.png | Bin 24404 -> 22758 bytes res-xxhdpi/images/loop00071.png | Bin 24130 -> 22433 bytes res-xxhdpi/images/loop00072.png | Bin 24004 -> 22350 bytes res-xxhdpi/images/loop00073.png | Bin 23694 -> 22077 bytes res-xxhdpi/images/loop00074.png | Bin 23131 -> 21585 bytes res-xxhdpi/images/loop00075.png | Bin 23422 -> 21795 bytes res-xxhdpi/images/loop00076.png | Bin 22994 -> 21463 bytes res-xxhdpi/images/loop00077.png | Bin 23012 -> 21422 bytes res-xxhdpi/images/loop00078.png | Bin 22839 -> 21289 bytes res-xxhdpi/images/loop00079.png | Bin 23360 -> 21748 bytes res-xxhdpi/images/loop00080.png | Bin 23761 -> 22136 bytes res-xxhdpi/images/loop00081.png | Bin 23512 -> 21906 bytes res-xxhdpi/images/loop00082.png | Bin 23673 -> 22050 bytes res-xxhdpi/images/loop00083.png | Bin 24356 -> 22755 bytes res-xxhdpi/images/loop00084.png | Bin 23987 -> 22357 bytes res-xxhdpi/images/loop00085.png | Bin 24223 -> 22632 bytes res-xxhdpi/images/loop00086.png | Bin 24309 -> 22726 bytes res-xxhdpi/images/loop00087.png | Bin 24488 -> 22801 bytes res-xxhdpi/images/loop00088.png | Bin 24539 -> 22898 bytes res-xxhdpi/images/loop00089.png | Bin 24543 -> 22853 bytes res-xxhdpi/images/loop00090.png | Bin 23844 -> 22250 bytes res-xxxhdpi/images/loop00000.png | Bin 32138 -> 29744 bytes res-xxxhdpi/images/loop00001.png | Bin 32195 -> 29762 bytes res-xxxhdpi/images/loop00002.png | Bin 32040 -> 29731 bytes res-xxxhdpi/images/loop00003.png | Bin 32554 -> 30210 bytes res-xxxhdpi/images/loop00004.png | Bin 32935 -> 30518 bytes res-xxxhdpi/images/loop00005.png | Bin 33131 -> 30698 bytes res-xxxhdpi/images/loop00006.png | Bin 33508 -> 31133 bytes res-xxxhdpi/images/loop00007.png | Bin 34862 -> 32354 bytes res-xxxhdpi/images/loop00008.png | Bin 34026 -> 31543 bytes res-xxxhdpi/images/loop00009.png | Bin 33660 -> 31303 bytes res-xxxhdpi/images/loop00010.png | Bin 34391 -> 32007 bytes res-xxxhdpi/images/loop00011.png | Bin 34154 -> 31710 bytes res-xxxhdpi/images/loop00012.png | Bin 34256 -> 31918 bytes res-xxxhdpi/images/loop00013.png | Bin 34040 -> 31732 bytes res-xxxhdpi/images/loop00014.png | Bin 35473 -> 33175 bytes res-xxxhdpi/images/loop00015.png | Bin 34333 -> 31977 bytes res-xxxhdpi/images/loop00016.png | Bin 33916 -> 31668 bytes res-xxxhdpi/images/loop00017.png | Bin 34493 -> 32141 bytes res-xxxhdpi/images/loop00018.png | Bin 33763 -> 31503 bytes res-xxxhdpi/images/loop00019.png | Bin 33855 -> 31538 bytes res-xxxhdpi/images/loop00020.png | Bin 33288 -> 31061 bytes res-xxxhdpi/images/loop00021.png | Bin 33174 -> 30781 bytes res-xxxhdpi/images/loop00022.png | Bin 33157 -> 30730 bytes res-xxxhdpi/images/loop00023.png | Bin 33287 -> 30866 bytes res-xxxhdpi/images/loop00024.png | Bin 32859 -> 30482 bytes res-xxxhdpi/images/loop00025.png | Bin 32260 -> 29882 bytes res-xxxhdpi/images/loop00026.png | Bin 32597 -> 30197 bytes res-xxxhdpi/images/loop00027.png | Bin 31878 -> 29631 bytes res-xxxhdpi/images/loop00028.png | Bin 32518 -> 30156 bytes res-xxxhdpi/images/loop00029.png | Bin 32930 -> 30608 bytes res-xxxhdpi/images/loop00030.png | Bin 33688 -> 31201 bytes res-xxxhdpi/images/loop00031.png | Bin 32547 -> 30294 bytes res-xxxhdpi/images/loop00032.png | Bin 33104 -> 30856 bytes res-xxxhdpi/images/loop00033.png | Bin 32907 -> 30695 bytes res-xxxhdpi/images/loop00034.png | Bin 33611 -> 31456 bytes res-xxxhdpi/images/loop00035.png | Bin 33202 -> 31051 bytes res-xxxhdpi/images/loop00036.png | Bin 32973 -> 31007 bytes res-xxxhdpi/images/loop00037.png | Bin 33595 -> 31503 bytes res-xxxhdpi/images/loop00038.png | Bin 34809 -> 32686 bytes res-xxxhdpi/images/loop00039.png | Bin 34692 -> 32568 bytes res-xxxhdpi/images/loop00040.png | Bin 35484 -> 33303 bytes res-xxxhdpi/images/loop00041.png | Bin 35146 -> 33036 bytes res-xxxhdpi/images/loop00042.png | Bin 34815 -> 32627 bytes res-xxxhdpi/images/loop00043.png | Bin 35465 -> 33272 bytes res-xxxhdpi/images/loop00044.png | Bin 35643 -> 33420 bytes res-xxxhdpi/images/loop00045.png | Bin 35835 -> 33601 bytes res-xxxhdpi/images/loop00046.png | Bin 36635 -> 34392 bytes res-xxxhdpi/images/loop00047.png | Bin 36481 -> 34190 bytes res-xxxhdpi/images/loop00048.png | Bin 36482 -> 34209 bytes res-xxxhdpi/images/loop00049.png | Bin 36341 -> 34099 bytes res-xxxhdpi/images/loop00050.png | Bin 34835 -> 32586 bytes res-xxxhdpi/images/loop00051.png | Bin 35569 -> 33282 bytes res-xxxhdpi/images/loop00052.png | Bin 34899 -> 32691 bytes res-xxxhdpi/images/loop00053.png | Bin 34589 -> 32340 bytes res-xxxhdpi/images/loop00054.png | Bin 34365 -> 32088 bytes res-xxxhdpi/images/loop00055.png | Bin 34332 -> 32066 bytes res-xxxhdpi/images/loop00056.png | Bin 34188 -> 31890 bytes res-xxxhdpi/images/loop00057.png | Bin 33961 -> 31671 bytes res-xxxhdpi/images/loop00058.png | Bin 33300 -> 31028 bytes res-xxxhdpi/images/loop00059.png | Bin 33405 -> 31030 bytes res-xxxhdpi/images/loop00060.png | Bin 33229 -> 30831 bytes res-xxxhdpi/images/loop00061.png | Bin 31814 -> 29450 bytes res-xxxhdpi/images/loop00062.png | Bin 32900 -> 30420 bytes res-xxxhdpi/images/loop00063.png | Bin 32809 -> 30289 bytes res-xxxhdpi/images/loop00064.png | Bin 32625 -> 30063 bytes res-xxxhdpi/images/loop00065.png | Bin 33560 -> 30967 bytes res-xxxhdpi/images/loop00066.png | Bin 32825 -> 30301 bytes res-xxxhdpi/images/loop00067.png | Bin 32885 -> 30273 bytes res-xxxhdpi/images/loop00068.png | Bin 31901 -> 29460 bytes res-xxxhdpi/images/loop00069.png | Bin 32514 -> 29991 bytes res-xxxhdpi/images/loop00070.png | Bin 33063 -> 30574 bytes res-xxxhdpi/images/loop00071.png | Bin 32486 -> 30057 bytes res-xxxhdpi/images/loop00072.png | Bin 32218 -> 29668 bytes res-xxxhdpi/images/loop00073.png | Bin 32100 -> 29647 bytes res-xxxhdpi/images/loop00074.png | Bin 31018 -> 28742 bytes res-xxxhdpi/images/loop00075.png | Bin 31186 -> 28865 bytes res-xxxhdpi/images/loop00076.png | Bin 30704 -> 28477 bytes res-xxxhdpi/images/loop00077.png | Bin 30379 -> 28217 bytes res-xxxhdpi/images/loop00078.png | Bin 31001 -> 28767 bytes res-xxxhdpi/images/loop00079.png | Bin 31273 -> 29012 bytes res-xxxhdpi/images/loop00080.png | Bin 30904 -> 28594 bytes res-xxxhdpi/images/loop00081.png | Bin 31821 -> 29414 bytes res-xxxhdpi/images/loop00082.png | Bin 31287 -> 28937 bytes res-xxxhdpi/images/loop00083.png | Bin 31149 -> 28804 bytes res-xxxhdpi/images/loop00084.png | Bin 31294 -> 28994 bytes res-xxxhdpi/images/loop00085.png | Bin 31875 -> 29510 bytes res-xxxhdpi/images/loop00086.png | Bin 32357 -> 30033 bytes res-xxxhdpi/images/loop00087.png | Bin 32312 -> 29930 bytes res-xxxhdpi/images/loop00088.png | Bin 31914 -> 29559 bytes res-xxxhdpi/images/loop00089.png | Bin 32685 -> 30335 bytes res-xxxhdpi/images/loop00090.png | Bin 32138 -> 29744 bytes 455 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res-hdpi/images/loop00000.png b/res-hdpi/images/loop00000.png index 030fa2b36..9e9d1e320 100644 Binary files a/res-hdpi/images/loop00000.png and b/res-hdpi/images/loop00000.png differ diff --git a/res-hdpi/images/loop00001.png b/res-hdpi/images/loop00001.png index 546a10247..cd53cc6cd 100644 Binary files a/res-hdpi/images/loop00001.png and b/res-hdpi/images/loop00001.png differ diff --git a/res-hdpi/images/loop00002.png b/res-hdpi/images/loop00002.png index 262be3f24..d5b5cead4 100644 Binary files a/res-hdpi/images/loop00002.png and b/res-hdpi/images/loop00002.png differ diff --git a/res-hdpi/images/loop00003.png b/res-hdpi/images/loop00003.png index 1282fb308..50e08ded4 100644 Binary files a/res-hdpi/images/loop00003.png and b/res-hdpi/images/loop00003.png differ diff --git a/res-hdpi/images/loop00004.png b/res-hdpi/images/loop00004.png index 2ff7678ff..d69f76263 100644 Binary files a/res-hdpi/images/loop00004.png and b/res-hdpi/images/loop00004.png differ diff --git a/res-hdpi/images/loop00005.png b/res-hdpi/images/loop00005.png index 20b4d815b..32d368e28 100644 Binary files a/res-hdpi/images/loop00005.png and b/res-hdpi/images/loop00005.png differ diff --git a/res-hdpi/images/loop00006.png b/res-hdpi/images/loop00006.png index 0f5b28d49..fcc750bdf 100644 Binary files a/res-hdpi/images/loop00006.png and b/res-hdpi/images/loop00006.png differ diff --git a/res-hdpi/images/loop00007.png b/res-hdpi/images/loop00007.png index 008acc85b..d37ba5ca8 100644 Binary files a/res-hdpi/images/loop00007.png and b/res-hdpi/images/loop00007.png differ diff --git a/res-hdpi/images/loop00008.png b/res-hdpi/images/loop00008.png index ca1309dc2..5a1605470 100644 Binary files a/res-hdpi/images/loop00008.png and b/res-hdpi/images/loop00008.png differ diff --git a/res-hdpi/images/loop00009.png b/res-hdpi/images/loop00009.png index b2730f198..49ede64ad 100644 Binary files a/res-hdpi/images/loop00009.png and b/res-hdpi/images/loop00009.png differ diff --git a/res-hdpi/images/loop00010.png b/res-hdpi/images/loop00010.png index 3867e9c96..f9e219ff7 100644 Binary files a/res-hdpi/images/loop00010.png and b/res-hdpi/images/loop00010.png differ diff --git a/res-hdpi/images/loop00011.png b/res-hdpi/images/loop00011.png index 2761d8fcb..3fbe0b5aa 100644 Binary files a/res-hdpi/images/loop00011.png and b/res-hdpi/images/loop00011.png differ diff --git a/res-hdpi/images/loop00012.png b/res-hdpi/images/loop00012.png index 2d976ef62..32294612c 100644 Binary files a/res-hdpi/images/loop00012.png and b/res-hdpi/images/loop00012.png differ diff --git a/res-hdpi/images/loop00013.png b/res-hdpi/images/loop00013.png index 5c96bb52c..69773ec6c 100644 Binary files a/res-hdpi/images/loop00013.png and b/res-hdpi/images/loop00013.png differ diff --git a/res-hdpi/images/loop00014.png b/res-hdpi/images/loop00014.png index d481ec57a..56c15ccde 100644 Binary files a/res-hdpi/images/loop00014.png and b/res-hdpi/images/loop00014.png differ diff --git a/res-hdpi/images/loop00015.png b/res-hdpi/images/loop00015.png index 47716ede3..26126814d 100644 Binary files a/res-hdpi/images/loop00015.png and b/res-hdpi/images/loop00015.png differ diff --git a/res-hdpi/images/loop00016.png b/res-hdpi/images/loop00016.png index c0cffe85c..69f632ec4 100644 Binary files a/res-hdpi/images/loop00016.png and b/res-hdpi/images/loop00016.png differ diff --git a/res-hdpi/images/loop00017.png b/res-hdpi/images/loop00017.png index a0dc2e51f..af356150e 100644 Binary files a/res-hdpi/images/loop00017.png and b/res-hdpi/images/loop00017.png differ diff --git a/res-hdpi/images/loop00018.png b/res-hdpi/images/loop00018.png index c8eefc5f8..0f72ff090 100644 Binary files a/res-hdpi/images/loop00018.png and b/res-hdpi/images/loop00018.png differ diff --git a/res-hdpi/images/loop00019.png b/res-hdpi/images/loop00019.png index 0d9d8e0fe..f167644c3 100644 Binary files a/res-hdpi/images/loop00019.png and b/res-hdpi/images/loop00019.png differ diff --git a/res-hdpi/images/loop00020.png b/res-hdpi/images/loop00020.png index b4909a80d..202a0fe3e 100644 Binary files a/res-hdpi/images/loop00020.png and b/res-hdpi/images/loop00020.png differ diff --git a/res-hdpi/images/loop00021.png b/res-hdpi/images/loop00021.png index b3c5274c8..8c102d983 100644 Binary files a/res-hdpi/images/loop00021.png and b/res-hdpi/images/loop00021.png differ diff --git a/res-hdpi/images/loop00022.png b/res-hdpi/images/loop00022.png index 827c93707..4bde99c61 100644 Binary files a/res-hdpi/images/loop00022.png and b/res-hdpi/images/loop00022.png differ diff --git a/res-hdpi/images/loop00023.png b/res-hdpi/images/loop00023.png index 84440fec6..350acfb07 100644 Binary files a/res-hdpi/images/loop00023.png and b/res-hdpi/images/loop00023.png differ diff --git a/res-hdpi/images/loop00024.png b/res-hdpi/images/loop00024.png index cfc4c5bab..dde1a8e70 100644 Binary files a/res-hdpi/images/loop00024.png and b/res-hdpi/images/loop00024.png differ diff --git a/res-hdpi/images/loop00025.png b/res-hdpi/images/loop00025.png index fd048fdcf..a133ebd4d 100644 Binary files a/res-hdpi/images/loop00025.png and b/res-hdpi/images/loop00025.png differ diff --git a/res-hdpi/images/loop00026.png b/res-hdpi/images/loop00026.png index 68251873a..6825ad93d 100644 Binary files a/res-hdpi/images/loop00026.png and b/res-hdpi/images/loop00026.png differ diff --git a/res-hdpi/images/loop00027.png b/res-hdpi/images/loop00027.png index 238dad60a..91bf1cf74 100644 Binary files a/res-hdpi/images/loop00027.png and b/res-hdpi/images/loop00027.png differ diff --git a/res-hdpi/images/loop00028.png b/res-hdpi/images/loop00028.png index 55e058d2e..8cba9bba3 100644 Binary files a/res-hdpi/images/loop00028.png and b/res-hdpi/images/loop00028.png differ diff --git a/res-hdpi/images/loop00029.png b/res-hdpi/images/loop00029.png index fc761370e..bd0599357 100644 Binary files a/res-hdpi/images/loop00029.png and b/res-hdpi/images/loop00029.png differ diff --git a/res-hdpi/images/loop00030.png b/res-hdpi/images/loop00030.png index 920634f89..e30821a93 100644 Binary files a/res-hdpi/images/loop00030.png and b/res-hdpi/images/loop00030.png differ diff --git a/res-hdpi/images/loop00031.png b/res-hdpi/images/loop00031.png index f54846461..40198609b 100644 Binary files a/res-hdpi/images/loop00031.png and b/res-hdpi/images/loop00031.png differ diff --git a/res-hdpi/images/loop00032.png b/res-hdpi/images/loop00032.png index 4cff5c44c..41832bb94 100644 Binary files a/res-hdpi/images/loop00032.png and b/res-hdpi/images/loop00032.png differ diff --git a/res-hdpi/images/loop00033.png b/res-hdpi/images/loop00033.png index 5d2d27222..583f19cba 100644 Binary files a/res-hdpi/images/loop00033.png and b/res-hdpi/images/loop00033.png differ diff --git a/res-hdpi/images/loop00034.png b/res-hdpi/images/loop00034.png index b4d73416e..bffa72bcd 100644 Binary files a/res-hdpi/images/loop00034.png and b/res-hdpi/images/loop00034.png differ diff --git a/res-hdpi/images/loop00035.png b/res-hdpi/images/loop00035.png index 49025b82d..d65d6b4e8 100644 Binary files a/res-hdpi/images/loop00035.png and b/res-hdpi/images/loop00035.png differ diff --git a/res-hdpi/images/loop00036.png b/res-hdpi/images/loop00036.png index b3aa58da5..a26cda154 100644 Binary files a/res-hdpi/images/loop00036.png and b/res-hdpi/images/loop00036.png differ diff --git a/res-hdpi/images/loop00037.png b/res-hdpi/images/loop00037.png index ff47e85d6..660530dca 100644 Binary files a/res-hdpi/images/loop00037.png and b/res-hdpi/images/loop00037.png differ diff --git a/res-hdpi/images/loop00038.png b/res-hdpi/images/loop00038.png index 8039b925f..a3c9f31b9 100644 Binary files a/res-hdpi/images/loop00038.png and b/res-hdpi/images/loop00038.png differ diff --git a/res-hdpi/images/loop00039.png b/res-hdpi/images/loop00039.png index e76d4bc96..609d8cac2 100644 Binary files a/res-hdpi/images/loop00039.png and b/res-hdpi/images/loop00039.png differ diff --git a/res-hdpi/images/loop00040.png b/res-hdpi/images/loop00040.png index 963cce7b6..41904445b 100644 Binary files a/res-hdpi/images/loop00040.png and b/res-hdpi/images/loop00040.png differ diff --git a/res-hdpi/images/loop00041.png b/res-hdpi/images/loop00041.png index dcd5f1117..9c3c37188 100644 Binary files a/res-hdpi/images/loop00041.png and b/res-hdpi/images/loop00041.png differ diff --git a/res-hdpi/images/loop00042.png b/res-hdpi/images/loop00042.png index 72fe63ab4..dd5baae16 100644 Binary files a/res-hdpi/images/loop00042.png and b/res-hdpi/images/loop00042.png differ diff --git a/res-hdpi/images/loop00043.png b/res-hdpi/images/loop00043.png index c109af88f..814724ef5 100644 Binary files a/res-hdpi/images/loop00043.png and b/res-hdpi/images/loop00043.png differ diff --git a/res-hdpi/images/loop00044.png b/res-hdpi/images/loop00044.png index 6648ec226..63c7392a1 100644 Binary files a/res-hdpi/images/loop00044.png and b/res-hdpi/images/loop00044.png differ diff --git a/res-hdpi/images/loop00045.png b/res-hdpi/images/loop00045.png index 90bf4313d..5c666effc 100644 Binary files a/res-hdpi/images/loop00045.png and b/res-hdpi/images/loop00045.png differ diff --git a/res-hdpi/images/loop00046.png b/res-hdpi/images/loop00046.png index 50473f0eb..6fa4667ab 100644 Binary files a/res-hdpi/images/loop00046.png and b/res-hdpi/images/loop00046.png differ diff --git a/res-hdpi/images/loop00047.png b/res-hdpi/images/loop00047.png index db4702369..52537ea6e 100644 Binary files a/res-hdpi/images/loop00047.png and b/res-hdpi/images/loop00047.png differ diff --git a/res-hdpi/images/loop00048.png b/res-hdpi/images/loop00048.png index 462a42131..412fd1c71 100644 Binary files a/res-hdpi/images/loop00048.png and b/res-hdpi/images/loop00048.png differ diff --git a/res-hdpi/images/loop00049.png b/res-hdpi/images/loop00049.png index f86af40f2..6cc8ef01b 100644 Binary files a/res-hdpi/images/loop00049.png and b/res-hdpi/images/loop00049.png differ diff --git a/res-hdpi/images/loop00050.png b/res-hdpi/images/loop00050.png index 8c0af52ff..caf36c504 100644 Binary files a/res-hdpi/images/loop00050.png and b/res-hdpi/images/loop00050.png differ diff --git a/res-hdpi/images/loop00051.png b/res-hdpi/images/loop00051.png index 2360fc0db..1cf8fb4a5 100644 Binary files a/res-hdpi/images/loop00051.png and b/res-hdpi/images/loop00051.png differ diff --git a/res-hdpi/images/loop00052.png b/res-hdpi/images/loop00052.png index dd5220018..7ee60e82a 100644 Binary files a/res-hdpi/images/loop00052.png and b/res-hdpi/images/loop00052.png differ diff --git a/res-hdpi/images/loop00053.png b/res-hdpi/images/loop00053.png index c7f0c1886..691bca0ea 100644 Binary files a/res-hdpi/images/loop00053.png and b/res-hdpi/images/loop00053.png differ diff --git a/res-hdpi/images/loop00054.png b/res-hdpi/images/loop00054.png index 7f16eff59..fa8d0002d 100644 Binary files a/res-hdpi/images/loop00054.png and b/res-hdpi/images/loop00054.png differ diff --git a/res-hdpi/images/loop00055.png b/res-hdpi/images/loop00055.png index b9af0ce54..3b7acb052 100644 Binary files a/res-hdpi/images/loop00055.png and b/res-hdpi/images/loop00055.png differ diff --git a/res-hdpi/images/loop00056.png b/res-hdpi/images/loop00056.png index 40b9e9b32..1c94d3094 100644 Binary files a/res-hdpi/images/loop00056.png and b/res-hdpi/images/loop00056.png differ diff --git a/res-hdpi/images/loop00057.png b/res-hdpi/images/loop00057.png index 51068cb20..703f48e95 100644 Binary files a/res-hdpi/images/loop00057.png and b/res-hdpi/images/loop00057.png differ diff --git a/res-hdpi/images/loop00058.png b/res-hdpi/images/loop00058.png index eba4486ac..8dae68a71 100644 Binary files a/res-hdpi/images/loop00058.png and b/res-hdpi/images/loop00058.png differ diff --git a/res-hdpi/images/loop00059.png b/res-hdpi/images/loop00059.png index 28761ac84..1105b4381 100644 Binary files a/res-hdpi/images/loop00059.png and b/res-hdpi/images/loop00059.png differ diff --git a/res-hdpi/images/loop00060.png b/res-hdpi/images/loop00060.png index 6532eb93a..8ae4a864c 100644 Binary files a/res-hdpi/images/loop00060.png and b/res-hdpi/images/loop00060.png differ diff --git a/res-hdpi/images/loop00061.png b/res-hdpi/images/loop00061.png index fbe2e2e9d..c4fca2f7e 100644 Binary files a/res-hdpi/images/loop00061.png and b/res-hdpi/images/loop00061.png differ diff --git a/res-hdpi/images/loop00062.png b/res-hdpi/images/loop00062.png index 54341e34a..d59b9d40d 100644 Binary files a/res-hdpi/images/loop00062.png and b/res-hdpi/images/loop00062.png differ diff --git a/res-hdpi/images/loop00063.png b/res-hdpi/images/loop00063.png index cfe9c802c..7ac8fdf08 100644 Binary files a/res-hdpi/images/loop00063.png and b/res-hdpi/images/loop00063.png differ diff --git a/res-hdpi/images/loop00064.png b/res-hdpi/images/loop00064.png index e1fe674ea..1fa8fe817 100644 Binary files a/res-hdpi/images/loop00064.png and b/res-hdpi/images/loop00064.png differ diff --git a/res-hdpi/images/loop00065.png b/res-hdpi/images/loop00065.png index efa35b64a..542ed34cf 100644 Binary files a/res-hdpi/images/loop00065.png and b/res-hdpi/images/loop00065.png differ diff --git a/res-hdpi/images/loop00066.png b/res-hdpi/images/loop00066.png index d8c20fef1..7b6af52f5 100644 Binary files a/res-hdpi/images/loop00066.png and b/res-hdpi/images/loop00066.png differ diff --git a/res-hdpi/images/loop00067.png b/res-hdpi/images/loop00067.png index ddf1ea4cc..58d4fb732 100644 Binary files a/res-hdpi/images/loop00067.png and b/res-hdpi/images/loop00067.png differ diff --git a/res-hdpi/images/loop00068.png b/res-hdpi/images/loop00068.png index 827cfc6af..1f1616e82 100644 Binary files a/res-hdpi/images/loop00068.png and b/res-hdpi/images/loop00068.png differ diff --git a/res-hdpi/images/loop00069.png b/res-hdpi/images/loop00069.png index 6ab833f4b..a2dbbfaec 100644 Binary files a/res-hdpi/images/loop00069.png and b/res-hdpi/images/loop00069.png differ diff --git a/res-hdpi/images/loop00070.png b/res-hdpi/images/loop00070.png index a4cc06f12..60a345fc9 100644 Binary files a/res-hdpi/images/loop00070.png and b/res-hdpi/images/loop00070.png differ diff --git a/res-hdpi/images/loop00071.png b/res-hdpi/images/loop00071.png index 96653c188..ac444273e 100644 Binary files a/res-hdpi/images/loop00071.png and b/res-hdpi/images/loop00071.png differ diff --git a/res-hdpi/images/loop00072.png b/res-hdpi/images/loop00072.png index 44a15f874..a9171eb7d 100644 Binary files a/res-hdpi/images/loop00072.png and b/res-hdpi/images/loop00072.png differ diff --git a/res-hdpi/images/loop00073.png b/res-hdpi/images/loop00073.png index 8352c7ce0..7911d324c 100644 Binary files a/res-hdpi/images/loop00073.png and b/res-hdpi/images/loop00073.png differ diff --git a/res-hdpi/images/loop00074.png b/res-hdpi/images/loop00074.png index 914f1b7fb..dcea580a2 100644 Binary files a/res-hdpi/images/loop00074.png and b/res-hdpi/images/loop00074.png differ diff --git a/res-hdpi/images/loop00075.png b/res-hdpi/images/loop00075.png index 372b87139..0a7a5a527 100644 Binary files a/res-hdpi/images/loop00075.png and b/res-hdpi/images/loop00075.png differ diff --git a/res-hdpi/images/loop00076.png b/res-hdpi/images/loop00076.png index ffbf28570..674c9d233 100644 Binary files a/res-hdpi/images/loop00076.png and b/res-hdpi/images/loop00076.png differ diff --git a/res-hdpi/images/loop00077.png b/res-hdpi/images/loop00077.png index 8dc6a4002..e344f47f3 100644 Binary files a/res-hdpi/images/loop00077.png and b/res-hdpi/images/loop00077.png differ diff --git a/res-hdpi/images/loop00078.png b/res-hdpi/images/loop00078.png index cf1ea6120..e0968ce3c 100644 Binary files a/res-hdpi/images/loop00078.png and b/res-hdpi/images/loop00078.png differ diff --git a/res-hdpi/images/loop00079.png b/res-hdpi/images/loop00079.png index 8674c822a..2ff1fb088 100644 Binary files a/res-hdpi/images/loop00079.png and b/res-hdpi/images/loop00079.png differ diff --git a/res-hdpi/images/loop00080.png b/res-hdpi/images/loop00080.png index 3d84259bb..26de5af76 100644 Binary files a/res-hdpi/images/loop00080.png and b/res-hdpi/images/loop00080.png differ diff --git a/res-hdpi/images/loop00081.png b/res-hdpi/images/loop00081.png index aed44c53b..1ef6cdd98 100644 Binary files a/res-hdpi/images/loop00081.png and b/res-hdpi/images/loop00081.png differ diff --git a/res-hdpi/images/loop00082.png b/res-hdpi/images/loop00082.png index a39769bdb..334874ff1 100644 Binary files a/res-hdpi/images/loop00082.png and b/res-hdpi/images/loop00082.png differ diff --git a/res-hdpi/images/loop00083.png b/res-hdpi/images/loop00083.png index 905355d9e..3b0deb1cb 100644 Binary files a/res-hdpi/images/loop00083.png and b/res-hdpi/images/loop00083.png differ diff --git a/res-hdpi/images/loop00084.png b/res-hdpi/images/loop00084.png index c86deea16..4b8494c4c 100644 Binary files a/res-hdpi/images/loop00084.png and b/res-hdpi/images/loop00084.png differ diff --git a/res-hdpi/images/loop00085.png b/res-hdpi/images/loop00085.png index 3744ab708..2e5702753 100644 Binary files a/res-hdpi/images/loop00085.png and b/res-hdpi/images/loop00085.png differ diff --git a/res-hdpi/images/loop00086.png b/res-hdpi/images/loop00086.png index 0bb9b0963..ab6f437bc 100644 Binary files a/res-hdpi/images/loop00086.png and b/res-hdpi/images/loop00086.png differ diff --git a/res-hdpi/images/loop00087.png b/res-hdpi/images/loop00087.png index 83f97bdd0..d6c3dcdde 100644 Binary files a/res-hdpi/images/loop00087.png and b/res-hdpi/images/loop00087.png differ diff --git a/res-hdpi/images/loop00088.png b/res-hdpi/images/loop00088.png index 6fd37909a..88b386842 100644 Binary files a/res-hdpi/images/loop00088.png and b/res-hdpi/images/loop00088.png differ diff --git a/res-hdpi/images/loop00089.png b/res-hdpi/images/loop00089.png index 09500f87f..5b4551be9 100644 Binary files a/res-hdpi/images/loop00089.png and b/res-hdpi/images/loop00089.png differ diff --git a/res-hdpi/images/loop00090.png b/res-hdpi/images/loop00090.png index 030fa2b36..9e9d1e320 100644 Binary files a/res-hdpi/images/loop00090.png and b/res-hdpi/images/loop00090.png differ diff --git a/res-mdpi/images/loop00000.png b/res-mdpi/images/loop00000.png index d7092b68f..0e11c0100 100644 Binary files a/res-mdpi/images/loop00000.png and b/res-mdpi/images/loop00000.png differ diff --git a/res-mdpi/images/loop00001.png b/res-mdpi/images/loop00001.png index e04a5255a..9d87ecc7d 100644 Binary files a/res-mdpi/images/loop00001.png and b/res-mdpi/images/loop00001.png differ diff --git a/res-mdpi/images/loop00002.png b/res-mdpi/images/loop00002.png index e2a783102..4a4798645 100644 Binary files a/res-mdpi/images/loop00002.png and b/res-mdpi/images/loop00002.png differ diff --git a/res-mdpi/images/loop00003.png b/res-mdpi/images/loop00003.png index 28f79bf4b..5e01eabd2 100644 Binary files a/res-mdpi/images/loop00003.png and b/res-mdpi/images/loop00003.png differ diff --git a/res-mdpi/images/loop00004.png b/res-mdpi/images/loop00004.png index e4bec8084..cebf84a4b 100644 Binary files a/res-mdpi/images/loop00004.png and b/res-mdpi/images/loop00004.png differ diff --git a/res-mdpi/images/loop00005.png b/res-mdpi/images/loop00005.png index de673e03a..4d0e8b039 100644 Binary files a/res-mdpi/images/loop00005.png and b/res-mdpi/images/loop00005.png differ diff --git a/res-mdpi/images/loop00006.png b/res-mdpi/images/loop00006.png index 71d420311..00f9543cd 100644 Binary files a/res-mdpi/images/loop00006.png and b/res-mdpi/images/loop00006.png differ diff --git a/res-mdpi/images/loop00007.png b/res-mdpi/images/loop00007.png index dee70b3b4..95642214c 100644 Binary files a/res-mdpi/images/loop00007.png and b/res-mdpi/images/loop00007.png differ diff --git a/res-mdpi/images/loop00008.png b/res-mdpi/images/loop00008.png index 9eccc7fe4..8d41cc514 100644 Binary files a/res-mdpi/images/loop00008.png and b/res-mdpi/images/loop00008.png differ diff --git a/res-mdpi/images/loop00009.png b/res-mdpi/images/loop00009.png index d6672ac0f..2761756b8 100644 Binary files a/res-mdpi/images/loop00009.png and b/res-mdpi/images/loop00009.png differ diff --git a/res-mdpi/images/loop00010.png b/res-mdpi/images/loop00010.png index 1bb8f5c38..d8b4865de 100644 Binary files a/res-mdpi/images/loop00010.png and b/res-mdpi/images/loop00010.png differ diff --git a/res-mdpi/images/loop00011.png b/res-mdpi/images/loop00011.png index 849ce3dd0..84423537e 100644 Binary files a/res-mdpi/images/loop00011.png and b/res-mdpi/images/loop00011.png differ diff --git a/res-mdpi/images/loop00012.png b/res-mdpi/images/loop00012.png index cee9dcf04..cb986c532 100644 Binary files a/res-mdpi/images/loop00012.png and b/res-mdpi/images/loop00012.png differ diff --git a/res-mdpi/images/loop00013.png b/res-mdpi/images/loop00013.png index 1ef61d734..63b89b29e 100644 Binary files a/res-mdpi/images/loop00013.png and b/res-mdpi/images/loop00013.png differ diff --git a/res-mdpi/images/loop00014.png b/res-mdpi/images/loop00014.png index bc84637bd..9713813a4 100644 Binary files a/res-mdpi/images/loop00014.png and b/res-mdpi/images/loop00014.png differ diff --git a/res-mdpi/images/loop00015.png b/res-mdpi/images/loop00015.png index f5607f237..3f666d7c6 100644 Binary files a/res-mdpi/images/loop00015.png and b/res-mdpi/images/loop00015.png differ diff --git a/res-mdpi/images/loop00016.png b/res-mdpi/images/loop00016.png index 235527c33..3d76b046e 100644 Binary files a/res-mdpi/images/loop00016.png and b/res-mdpi/images/loop00016.png differ diff --git a/res-mdpi/images/loop00017.png b/res-mdpi/images/loop00017.png index 88307a6b6..1438d77b8 100644 Binary files a/res-mdpi/images/loop00017.png and b/res-mdpi/images/loop00017.png differ diff --git a/res-mdpi/images/loop00018.png b/res-mdpi/images/loop00018.png index 02472d753..c285fc6e9 100644 Binary files a/res-mdpi/images/loop00018.png and b/res-mdpi/images/loop00018.png differ diff --git a/res-mdpi/images/loop00019.png b/res-mdpi/images/loop00019.png index f06bdaae5..d6969ec44 100644 Binary files a/res-mdpi/images/loop00019.png and b/res-mdpi/images/loop00019.png differ diff --git a/res-mdpi/images/loop00020.png b/res-mdpi/images/loop00020.png index dc522c071..89aa0124e 100644 Binary files a/res-mdpi/images/loop00020.png and b/res-mdpi/images/loop00020.png differ diff --git a/res-mdpi/images/loop00021.png b/res-mdpi/images/loop00021.png index 3a53ee53d..b0bd51402 100644 Binary files a/res-mdpi/images/loop00021.png and b/res-mdpi/images/loop00021.png differ diff --git a/res-mdpi/images/loop00022.png b/res-mdpi/images/loop00022.png index 09b8eea14..684d023de 100644 Binary files a/res-mdpi/images/loop00022.png and b/res-mdpi/images/loop00022.png differ diff --git a/res-mdpi/images/loop00023.png b/res-mdpi/images/loop00023.png index ebc677d41..d008e9873 100644 Binary files a/res-mdpi/images/loop00023.png and b/res-mdpi/images/loop00023.png differ diff --git a/res-mdpi/images/loop00024.png b/res-mdpi/images/loop00024.png index a4fd8e508..8fe2185eb 100644 Binary files a/res-mdpi/images/loop00024.png and b/res-mdpi/images/loop00024.png differ diff --git a/res-mdpi/images/loop00025.png b/res-mdpi/images/loop00025.png index 9435624ee..c534bbd92 100644 Binary files a/res-mdpi/images/loop00025.png and b/res-mdpi/images/loop00025.png differ diff --git a/res-mdpi/images/loop00026.png b/res-mdpi/images/loop00026.png index b7e808154..61b11b555 100644 Binary files a/res-mdpi/images/loop00026.png and b/res-mdpi/images/loop00026.png differ diff --git a/res-mdpi/images/loop00027.png b/res-mdpi/images/loop00027.png index 757d8ed90..5c01dfc7b 100644 Binary files a/res-mdpi/images/loop00027.png and b/res-mdpi/images/loop00027.png differ diff --git a/res-mdpi/images/loop00028.png b/res-mdpi/images/loop00028.png index 8eefa3a57..c3e61c08e 100644 Binary files a/res-mdpi/images/loop00028.png and b/res-mdpi/images/loop00028.png differ diff --git a/res-mdpi/images/loop00029.png b/res-mdpi/images/loop00029.png index 8d890dee6..e0b23ffaa 100644 Binary files a/res-mdpi/images/loop00029.png and b/res-mdpi/images/loop00029.png differ diff --git a/res-mdpi/images/loop00030.png b/res-mdpi/images/loop00030.png index 8e0eeb6f8..6618ef7dc 100644 Binary files a/res-mdpi/images/loop00030.png and b/res-mdpi/images/loop00030.png differ diff --git a/res-mdpi/images/loop00031.png b/res-mdpi/images/loop00031.png index 178b29d6e..dfde81e69 100644 Binary files a/res-mdpi/images/loop00031.png and b/res-mdpi/images/loop00031.png differ diff --git a/res-mdpi/images/loop00032.png b/res-mdpi/images/loop00032.png index 39192c75a..dc6a01ea2 100644 Binary files a/res-mdpi/images/loop00032.png and b/res-mdpi/images/loop00032.png differ diff --git a/res-mdpi/images/loop00033.png b/res-mdpi/images/loop00033.png index 0647e5001..86d104bc9 100644 Binary files a/res-mdpi/images/loop00033.png and b/res-mdpi/images/loop00033.png differ diff --git a/res-mdpi/images/loop00034.png b/res-mdpi/images/loop00034.png index d6bc079a6..07a6d7cdd 100644 Binary files a/res-mdpi/images/loop00034.png and b/res-mdpi/images/loop00034.png differ diff --git a/res-mdpi/images/loop00035.png b/res-mdpi/images/loop00035.png index 68352e85c..3e5cb4ea9 100644 Binary files a/res-mdpi/images/loop00035.png and b/res-mdpi/images/loop00035.png differ diff --git a/res-mdpi/images/loop00036.png b/res-mdpi/images/loop00036.png index 92d9da27b..6ac7e35e6 100644 Binary files a/res-mdpi/images/loop00036.png and b/res-mdpi/images/loop00036.png differ diff --git a/res-mdpi/images/loop00037.png b/res-mdpi/images/loop00037.png index a0e4d337f..527c48d20 100644 Binary files a/res-mdpi/images/loop00037.png and b/res-mdpi/images/loop00037.png differ diff --git a/res-mdpi/images/loop00038.png b/res-mdpi/images/loop00038.png index c52317363..41c6a0356 100644 Binary files a/res-mdpi/images/loop00038.png and b/res-mdpi/images/loop00038.png differ diff --git a/res-mdpi/images/loop00039.png b/res-mdpi/images/loop00039.png index aae776583..d24d6429c 100644 Binary files a/res-mdpi/images/loop00039.png and b/res-mdpi/images/loop00039.png differ diff --git a/res-mdpi/images/loop00040.png b/res-mdpi/images/loop00040.png index af9e0188b..f3f077f8b 100644 Binary files a/res-mdpi/images/loop00040.png and b/res-mdpi/images/loop00040.png differ diff --git a/res-mdpi/images/loop00041.png b/res-mdpi/images/loop00041.png index 8e089c200..33e0715f2 100644 Binary files a/res-mdpi/images/loop00041.png and b/res-mdpi/images/loop00041.png differ diff --git a/res-mdpi/images/loop00042.png b/res-mdpi/images/loop00042.png index e3e3b8a49..b1ef14691 100644 Binary files a/res-mdpi/images/loop00042.png and b/res-mdpi/images/loop00042.png differ diff --git a/res-mdpi/images/loop00043.png b/res-mdpi/images/loop00043.png index cc8acbaeb..d835f3399 100644 Binary files a/res-mdpi/images/loop00043.png and b/res-mdpi/images/loop00043.png differ diff --git a/res-mdpi/images/loop00044.png b/res-mdpi/images/loop00044.png index 9a3a9b998..47ee00f0a 100644 Binary files a/res-mdpi/images/loop00044.png and b/res-mdpi/images/loop00044.png differ diff --git a/res-mdpi/images/loop00045.png b/res-mdpi/images/loop00045.png index ec5e3c4d1..2c9dd7127 100644 Binary files a/res-mdpi/images/loop00045.png and b/res-mdpi/images/loop00045.png differ diff --git a/res-mdpi/images/loop00046.png b/res-mdpi/images/loop00046.png index 925e2b788..7b0a557bb 100644 Binary files a/res-mdpi/images/loop00046.png and b/res-mdpi/images/loop00046.png differ diff --git a/res-mdpi/images/loop00047.png b/res-mdpi/images/loop00047.png index 62fff8864..60368fef6 100644 Binary files a/res-mdpi/images/loop00047.png and b/res-mdpi/images/loop00047.png differ diff --git a/res-mdpi/images/loop00048.png b/res-mdpi/images/loop00048.png index 46efe7032..8da21b50b 100644 Binary files a/res-mdpi/images/loop00048.png and b/res-mdpi/images/loop00048.png differ diff --git a/res-mdpi/images/loop00049.png b/res-mdpi/images/loop00049.png index 678dce473..8604a1748 100644 Binary files a/res-mdpi/images/loop00049.png and b/res-mdpi/images/loop00049.png differ diff --git a/res-mdpi/images/loop00050.png b/res-mdpi/images/loop00050.png index cbc6fdbf0..230ebd99c 100644 Binary files a/res-mdpi/images/loop00050.png and b/res-mdpi/images/loop00050.png differ diff --git a/res-mdpi/images/loop00051.png b/res-mdpi/images/loop00051.png index afa906677..3165ae893 100644 Binary files a/res-mdpi/images/loop00051.png and b/res-mdpi/images/loop00051.png differ diff --git a/res-mdpi/images/loop00052.png b/res-mdpi/images/loop00052.png index 4d2d98c53..bf4311234 100644 Binary files a/res-mdpi/images/loop00052.png and b/res-mdpi/images/loop00052.png differ diff --git a/res-mdpi/images/loop00053.png b/res-mdpi/images/loop00053.png index 48136a5da..7d801fa0a 100644 Binary files a/res-mdpi/images/loop00053.png and b/res-mdpi/images/loop00053.png differ diff --git a/res-mdpi/images/loop00054.png b/res-mdpi/images/loop00054.png index 09f706af6..f3ee2468d 100644 Binary files a/res-mdpi/images/loop00054.png and b/res-mdpi/images/loop00054.png differ diff --git a/res-mdpi/images/loop00055.png b/res-mdpi/images/loop00055.png index 7565a1c21..fb9fcfff5 100644 Binary files a/res-mdpi/images/loop00055.png and b/res-mdpi/images/loop00055.png differ diff --git a/res-mdpi/images/loop00056.png b/res-mdpi/images/loop00056.png index 2765831a9..f6b1ee7f3 100644 Binary files a/res-mdpi/images/loop00056.png and b/res-mdpi/images/loop00056.png differ diff --git a/res-mdpi/images/loop00057.png b/res-mdpi/images/loop00057.png index de440e0dd..af009d1ec 100644 Binary files a/res-mdpi/images/loop00057.png and b/res-mdpi/images/loop00057.png differ diff --git a/res-mdpi/images/loop00058.png b/res-mdpi/images/loop00058.png index 67d49c78f..1cd550adc 100644 Binary files a/res-mdpi/images/loop00058.png and b/res-mdpi/images/loop00058.png differ diff --git a/res-mdpi/images/loop00059.png b/res-mdpi/images/loop00059.png index a622f4587..cf8d18c7b 100644 Binary files a/res-mdpi/images/loop00059.png and b/res-mdpi/images/loop00059.png differ diff --git a/res-mdpi/images/loop00060.png b/res-mdpi/images/loop00060.png index 06d6eec8b..cfa53848d 100644 Binary files a/res-mdpi/images/loop00060.png and b/res-mdpi/images/loop00060.png differ diff --git a/res-mdpi/images/loop00061.png b/res-mdpi/images/loop00061.png index 7f11945a0..5fcbf4717 100644 Binary files a/res-mdpi/images/loop00061.png and b/res-mdpi/images/loop00061.png differ diff --git a/res-mdpi/images/loop00062.png b/res-mdpi/images/loop00062.png index 8197c94cf..d360d2437 100644 Binary files a/res-mdpi/images/loop00062.png and b/res-mdpi/images/loop00062.png differ diff --git a/res-mdpi/images/loop00063.png b/res-mdpi/images/loop00063.png index 4093c9b06..7f59a6673 100644 Binary files a/res-mdpi/images/loop00063.png and b/res-mdpi/images/loop00063.png differ diff --git a/res-mdpi/images/loop00064.png b/res-mdpi/images/loop00064.png index d09bd1ebd..e02809f50 100644 Binary files a/res-mdpi/images/loop00064.png and b/res-mdpi/images/loop00064.png differ diff --git a/res-mdpi/images/loop00065.png b/res-mdpi/images/loop00065.png index cbb6c1b80..597e7965f 100644 Binary files a/res-mdpi/images/loop00065.png and b/res-mdpi/images/loop00065.png differ diff --git a/res-mdpi/images/loop00066.png b/res-mdpi/images/loop00066.png index aed0a700a..3f308f007 100644 Binary files a/res-mdpi/images/loop00066.png and b/res-mdpi/images/loop00066.png differ diff --git a/res-mdpi/images/loop00067.png b/res-mdpi/images/loop00067.png index dd0da799f..643598277 100644 Binary files a/res-mdpi/images/loop00067.png and b/res-mdpi/images/loop00067.png differ diff --git a/res-mdpi/images/loop00068.png b/res-mdpi/images/loop00068.png index 161802c8e..580790b16 100644 Binary files a/res-mdpi/images/loop00068.png and b/res-mdpi/images/loop00068.png differ diff --git a/res-mdpi/images/loop00069.png b/res-mdpi/images/loop00069.png index 4ee0372a5..ae2f4e816 100644 Binary files a/res-mdpi/images/loop00069.png and b/res-mdpi/images/loop00069.png differ diff --git a/res-mdpi/images/loop00070.png b/res-mdpi/images/loop00070.png index 41a64fff6..82403915a 100644 Binary files a/res-mdpi/images/loop00070.png and b/res-mdpi/images/loop00070.png differ diff --git a/res-mdpi/images/loop00071.png b/res-mdpi/images/loop00071.png index c4793d79c..03f157ce8 100644 Binary files a/res-mdpi/images/loop00071.png and b/res-mdpi/images/loop00071.png differ diff --git a/res-mdpi/images/loop00072.png b/res-mdpi/images/loop00072.png index 9399d193c..b62dfd0d8 100644 Binary files a/res-mdpi/images/loop00072.png and b/res-mdpi/images/loop00072.png differ diff --git a/res-mdpi/images/loop00073.png b/res-mdpi/images/loop00073.png index d4e55adc9..ba746f2cb 100644 Binary files a/res-mdpi/images/loop00073.png and b/res-mdpi/images/loop00073.png differ diff --git a/res-mdpi/images/loop00074.png b/res-mdpi/images/loop00074.png index f29a0af5f..bafd21374 100644 Binary files a/res-mdpi/images/loop00074.png and b/res-mdpi/images/loop00074.png differ diff --git a/res-mdpi/images/loop00075.png b/res-mdpi/images/loop00075.png index 020568e4a..fe1f3a4df 100644 Binary files a/res-mdpi/images/loop00075.png and b/res-mdpi/images/loop00075.png differ diff --git a/res-mdpi/images/loop00076.png b/res-mdpi/images/loop00076.png index 51a54cc98..49960e5ee 100644 Binary files a/res-mdpi/images/loop00076.png and b/res-mdpi/images/loop00076.png differ diff --git a/res-mdpi/images/loop00077.png b/res-mdpi/images/loop00077.png index f6e80a918..a112cb8d2 100644 Binary files a/res-mdpi/images/loop00077.png and b/res-mdpi/images/loop00077.png differ diff --git a/res-mdpi/images/loop00078.png b/res-mdpi/images/loop00078.png index 944452120..5d69ab843 100644 Binary files a/res-mdpi/images/loop00078.png and b/res-mdpi/images/loop00078.png differ diff --git a/res-mdpi/images/loop00079.png b/res-mdpi/images/loop00079.png index b1ef2c308..31f3b5589 100644 Binary files a/res-mdpi/images/loop00079.png and b/res-mdpi/images/loop00079.png differ diff --git a/res-mdpi/images/loop00080.png b/res-mdpi/images/loop00080.png index 8a911fba8..42730befa 100644 Binary files a/res-mdpi/images/loop00080.png and b/res-mdpi/images/loop00080.png differ diff --git a/res-mdpi/images/loop00081.png b/res-mdpi/images/loop00081.png index f848df4c8..5ea003ef7 100644 Binary files a/res-mdpi/images/loop00081.png and b/res-mdpi/images/loop00081.png differ diff --git a/res-mdpi/images/loop00082.png b/res-mdpi/images/loop00082.png index 35b1325aa..ead63597d 100644 Binary files a/res-mdpi/images/loop00082.png and b/res-mdpi/images/loop00082.png differ diff --git a/res-mdpi/images/loop00083.png b/res-mdpi/images/loop00083.png index 1571fb5a4..1d10991a1 100644 Binary files a/res-mdpi/images/loop00083.png and b/res-mdpi/images/loop00083.png differ diff --git a/res-mdpi/images/loop00084.png b/res-mdpi/images/loop00084.png index 92b529509..5aafdec1d 100644 Binary files a/res-mdpi/images/loop00084.png and b/res-mdpi/images/loop00084.png differ diff --git a/res-mdpi/images/loop00085.png b/res-mdpi/images/loop00085.png index cde8880c7..6813c3375 100644 Binary files a/res-mdpi/images/loop00085.png and b/res-mdpi/images/loop00085.png differ diff --git a/res-mdpi/images/loop00086.png b/res-mdpi/images/loop00086.png index 45889e551..5d63072c6 100644 Binary files a/res-mdpi/images/loop00086.png and b/res-mdpi/images/loop00086.png differ diff --git a/res-mdpi/images/loop00087.png b/res-mdpi/images/loop00087.png index 9cad9aa39..9c65826dd 100644 Binary files a/res-mdpi/images/loop00087.png and b/res-mdpi/images/loop00087.png differ diff --git a/res-mdpi/images/loop00088.png b/res-mdpi/images/loop00088.png index dcf98c8b6..6cb1bf0cf 100644 Binary files a/res-mdpi/images/loop00088.png and b/res-mdpi/images/loop00088.png differ diff --git a/res-mdpi/images/loop00089.png b/res-mdpi/images/loop00089.png index 584cb8994..b3d742dbf 100644 Binary files a/res-mdpi/images/loop00089.png and b/res-mdpi/images/loop00089.png differ diff --git a/res-mdpi/images/loop00090.png b/res-mdpi/images/loop00090.png index d7092b68f..0e11c0100 100644 Binary files a/res-mdpi/images/loop00090.png and b/res-mdpi/images/loop00090.png differ diff --git a/res-xhdpi/images/loop00000.png b/res-xhdpi/images/loop00000.png index f5bf7a73b..b438e9e67 100644 Binary files a/res-xhdpi/images/loop00000.png and b/res-xhdpi/images/loop00000.png differ diff --git a/res-xhdpi/images/loop00001.png b/res-xhdpi/images/loop00001.png index 95c14ebf3..343a18572 100644 Binary files a/res-xhdpi/images/loop00001.png and b/res-xhdpi/images/loop00001.png differ diff --git a/res-xhdpi/images/loop00002.png b/res-xhdpi/images/loop00002.png index 5910fd106..aa5bc616f 100644 Binary files a/res-xhdpi/images/loop00002.png and b/res-xhdpi/images/loop00002.png differ diff --git a/res-xhdpi/images/loop00003.png b/res-xhdpi/images/loop00003.png index e6861d2a2..5385340ca 100644 Binary files a/res-xhdpi/images/loop00003.png and b/res-xhdpi/images/loop00003.png differ diff --git a/res-xhdpi/images/loop00004.png b/res-xhdpi/images/loop00004.png index 453cdc615..cdead7d74 100644 Binary files a/res-xhdpi/images/loop00004.png and b/res-xhdpi/images/loop00004.png differ diff --git a/res-xhdpi/images/loop00005.png b/res-xhdpi/images/loop00005.png index 12157c961..8eb502fdf 100644 Binary files a/res-xhdpi/images/loop00005.png and b/res-xhdpi/images/loop00005.png differ diff --git a/res-xhdpi/images/loop00006.png b/res-xhdpi/images/loop00006.png index 5e7838535..60b0f4a61 100644 Binary files a/res-xhdpi/images/loop00006.png and b/res-xhdpi/images/loop00006.png differ diff --git a/res-xhdpi/images/loop00007.png b/res-xhdpi/images/loop00007.png index c69abf4f2..a76c588a1 100644 Binary files a/res-xhdpi/images/loop00007.png and b/res-xhdpi/images/loop00007.png differ diff --git a/res-xhdpi/images/loop00008.png b/res-xhdpi/images/loop00008.png index 78c3b993c..80e160322 100644 Binary files a/res-xhdpi/images/loop00008.png and b/res-xhdpi/images/loop00008.png differ diff --git a/res-xhdpi/images/loop00009.png b/res-xhdpi/images/loop00009.png index e510b6b80..b8f4954c1 100644 Binary files a/res-xhdpi/images/loop00009.png and b/res-xhdpi/images/loop00009.png differ diff --git a/res-xhdpi/images/loop00010.png b/res-xhdpi/images/loop00010.png index 9d775faa4..b58d6ac57 100644 Binary files a/res-xhdpi/images/loop00010.png and b/res-xhdpi/images/loop00010.png differ diff --git a/res-xhdpi/images/loop00011.png b/res-xhdpi/images/loop00011.png index 36c01957e..0b67f3736 100644 Binary files a/res-xhdpi/images/loop00011.png and b/res-xhdpi/images/loop00011.png differ diff --git a/res-xhdpi/images/loop00012.png b/res-xhdpi/images/loop00012.png index ac65096d9..234d77a84 100644 Binary files a/res-xhdpi/images/loop00012.png and b/res-xhdpi/images/loop00012.png differ diff --git a/res-xhdpi/images/loop00013.png b/res-xhdpi/images/loop00013.png index e3fdaafa7..13c65243e 100644 Binary files a/res-xhdpi/images/loop00013.png and b/res-xhdpi/images/loop00013.png differ diff --git a/res-xhdpi/images/loop00014.png b/res-xhdpi/images/loop00014.png index 6e85108df..92e30e3d8 100644 Binary files a/res-xhdpi/images/loop00014.png and b/res-xhdpi/images/loop00014.png differ diff --git a/res-xhdpi/images/loop00015.png b/res-xhdpi/images/loop00015.png index 9e6032951..9c6076dc9 100644 Binary files a/res-xhdpi/images/loop00015.png and b/res-xhdpi/images/loop00015.png differ diff --git a/res-xhdpi/images/loop00016.png b/res-xhdpi/images/loop00016.png index 68417aa54..6f626c07b 100644 Binary files a/res-xhdpi/images/loop00016.png and b/res-xhdpi/images/loop00016.png differ diff --git a/res-xhdpi/images/loop00017.png b/res-xhdpi/images/loop00017.png index 4ac5dded3..ff67d5bd6 100644 Binary files a/res-xhdpi/images/loop00017.png and b/res-xhdpi/images/loop00017.png differ diff --git a/res-xhdpi/images/loop00018.png b/res-xhdpi/images/loop00018.png index d6511287e..67b5d8fe4 100644 Binary files a/res-xhdpi/images/loop00018.png and b/res-xhdpi/images/loop00018.png differ diff --git a/res-xhdpi/images/loop00019.png b/res-xhdpi/images/loop00019.png index 374273574..06ca98012 100644 Binary files a/res-xhdpi/images/loop00019.png and b/res-xhdpi/images/loop00019.png differ diff --git a/res-xhdpi/images/loop00020.png b/res-xhdpi/images/loop00020.png index 04489a10f..c2288b424 100644 Binary files a/res-xhdpi/images/loop00020.png and b/res-xhdpi/images/loop00020.png differ diff --git a/res-xhdpi/images/loop00021.png b/res-xhdpi/images/loop00021.png index 59c70166c..ba5df4618 100644 Binary files a/res-xhdpi/images/loop00021.png and b/res-xhdpi/images/loop00021.png differ diff --git a/res-xhdpi/images/loop00022.png b/res-xhdpi/images/loop00022.png index 0b9a59f38..2b1e947ad 100644 Binary files a/res-xhdpi/images/loop00022.png and b/res-xhdpi/images/loop00022.png differ diff --git a/res-xhdpi/images/loop00023.png b/res-xhdpi/images/loop00023.png index 31abae79f..292e07472 100644 Binary files a/res-xhdpi/images/loop00023.png and b/res-xhdpi/images/loop00023.png differ diff --git a/res-xhdpi/images/loop00024.png b/res-xhdpi/images/loop00024.png index 98d8ee39c..11352f6f7 100644 Binary files a/res-xhdpi/images/loop00024.png and b/res-xhdpi/images/loop00024.png differ diff --git a/res-xhdpi/images/loop00025.png b/res-xhdpi/images/loop00025.png index 9f074d266..4212c76a7 100644 Binary files a/res-xhdpi/images/loop00025.png and b/res-xhdpi/images/loop00025.png differ diff --git a/res-xhdpi/images/loop00026.png b/res-xhdpi/images/loop00026.png index 063fca2de..774d00f76 100644 Binary files a/res-xhdpi/images/loop00026.png and b/res-xhdpi/images/loop00026.png differ diff --git a/res-xhdpi/images/loop00027.png b/res-xhdpi/images/loop00027.png index 67e503a70..1827471b2 100644 Binary files a/res-xhdpi/images/loop00027.png and b/res-xhdpi/images/loop00027.png differ diff --git a/res-xhdpi/images/loop00028.png b/res-xhdpi/images/loop00028.png index 7e76be845..f4e79f91d 100644 Binary files a/res-xhdpi/images/loop00028.png and b/res-xhdpi/images/loop00028.png differ diff --git a/res-xhdpi/images/loop00029.png b/res-xhdpi/images/loop00029.png index 4902f6b5e..863850011 100644 Binary files a/res-xhdpi/images/loop00029.png and b/res-xhdpi/images/loop00029.png differ diff --git a/res-xhdpi/images/loop00030.png b/res-xhdpi/images/loop00030.png index 387b893b0..94fd37619 100644 Binary files a/res-xhdpi/images/loop00030.png and b/res-xhdpi/images/loop00030.png differ diff --git a/res-xhdpi/images/loop00031.png b/res-xhdpi/images/loop00031.png index ad116280f..441a52d9e 100644 Binary files a/res-xhdpi/images/loop00031.png and b/res-xhdpi/images/loop00031.png differ diff --git a/res-xhdpi/images/loop00032.png b/res-xhdpi/images/loop00032.png index 7d809e6b2..a10598ff6 100644 Binary files a/res-xhdpi/images/loop00032.png and b/res-xhdpi/images/loop00032.png differ diff --git a/res-xhdpi/images/loop00033.png b/res-xhdpi/images/loop00033.png index 59fcdc108..96bf45389 100644 Binary files a/res-xhdpi/images/loop00033.png and b/res-xhdpi/images/loop00033.png differ diff --git a/res-xhdpi/images/loop00034.png b/res-xhdpi/images/loop00034.png index cb4301c31..59baf8c64 100644 Binary files a/res-xhdpi/images/loop00034.png and b/res-xhdpi/images/loop00034.png differ diff --git a/res-xhdpi/images/loop00035.png b/res-xhdpi/images/loop00035.png index 6b1687807..400a8959b 100644 Binary files a/res-xhdpi/images/loop00035.png and b/res-xhdpi/images/loop00035.png differ diff --git a/res-xhdpi/images/loop00036.png b/res-xhdpi/images/loop00036.png index 3aa78502f..fda7acc21 100644 Binary files a/res-xhdpi/images/loop00036.png and b/res-xhdpi/images/loop00036.png differ diff --git a/res-xhdpi/images/loop00037.png b/res-xhdpi/images/loop00037.png index a60e8512c..d474e6f76 100644 Binary files a/res-xhdpi/images/loop00037.png and b/res-xhdpi/images/loop00037.png differ diff --git a/res-xhdpi/images/loop00038.png b/res-xhdpi/images/loop00038.png index 50107f3aa..c5632e191 100644 Binary files a/res-xhdpi/images/loop00038.png and b/res-xhdpi/images/loop00038.png differ diff --git a/res-xhdpi/images/loop00039.png b/res-xhdpi/images/loop00039.png index c85201e25..3cf8b867b 100644 Binary files a/res-xhdpi/images/loop00039.png and b/res-xhdpi/images/loop00039.png differ diff --git a/res-xhdpi/images/loop00040.png b/res-xhdpi/images/loop00040.png index 6ae161218..ef55a9281 100644 Binary files a/res-xhdpi/images/loop00040.png and b/res-xhdpi/images/loop00040.png differ diff --git a/res-xhdpi/images/loop00041.png b/res-xhdpi/images/loop00041.png index 7602b04a7..60bf78084 100644 Binary files a/res-xhdpi/images/loop00041.png and b/res-xhdpi/images/loop00041.png differ diff --git a/res-xhdpi/images/loop00042.png b/res-xhdpi/images/loop00042.png index 054da6d75..cee69800b 100644 Binary files a/res-xhdpi/images/loop00042.png and b/res-xhdpi/images/loop00042.png differ diff --git a/res-xhdpi/images/loop00043.png b/res-xhdpi/images/loop00043.png index d28be8b8e..fe5abc15a 100644 Binary files a/res-xhdpi/images/loop00043.png and b/res-xhdpi/images/loop00043.png differ diff --git a/res-xhdpi/images/loop00044.png b/res-xhdpi/images/loop00044.png index 83271268f..f33fcee56 100644 Binary files a/res-xhdpi/images/loop00044.png and b/res-xhdpi/images/loop00044.png differ diff --git a/res-xhdpi/images/loop00045.png b/res-xhdpi/images/loop00045.png index d749e22d7..e61b2a04e 100644 Binary files a/res-xhdpi/images/loop00045.png and b/res-xhdpi/images/loop00045.png differ diff --git a/res-xhdpi/images/loop00046.png b/res-xhdpi/images/loop00046.png index 60025d1be..4d919c036 100644 Binary files a/res-xhdpi/images/loop00046.png and b/res-xhdpi/images/loop00046.png differ diff --git a/res-xhdpi/images/loop00047.png b/res-xhdpi/images/loop00047.png index b0be5c69c..deaf9a377 100644 Binary files a/res-xhdpi/images/loop00047.png and b/res-xhdpi/images/loop00047.png differ diff --git a/res-xhdpi/images/loop00048.png b/res-xhdpi/images/loop00048.png index be926d9f2..82d8b2b88 100644 Binary files a/res-xhdpi/images/loop00048.png and b/res-xhdpi/images/loop00048.png differ diff --git a/res-xhdpi/images/loop00049.png b/res-xhdpi/images/loop00049.png index 456085442..a310cc9e6 100644 Binary files a/res-xhdpi/images/loop00049.png and b/res-xhdpi/images/loop00049.png differ diff --git a/res-xhdpi/images/loop00050.png b/res-xhdpi/images/loop00050.png index 967dd87ff..ad802300e 100644 Binary files a/res-xhdpi/images/loop00050.png and b/res-xhdpi/images/loop00050.png differ diff --git a/res-xhdpi/images/loop00051.png b/res-xhdpi/images/loop00051.png index c1698597a..52f1ce673 100644 Binary files a/res-xhdpi/images/loop00051.png and b/res-xhdpi/images/loop00051.png differ diff --git a/res-xhdpi/images/loop00052.png b/res-xhdpi/images/loop00052.png index 27c23830a..c579e8757 100644 Binary files a/res-xhdpi/images/loop00052.png and b/res-xhdpi/images/loop00052.png differ diff --git a/res-xhdpi/images/loop00053.png b/res-xhdpi/images/loop00053.png index cd2ca21c8..2c1bc91b5 100644 Binary files a/res-xhdpi/images/loop00053.png and b/res-xhdpi/images/loop00053.png differ diff --git a/res-xhdpi/images/loop00054.png b/res-xhdpi/images/loop00054.png index 588586b3a..888547519 100644 Binary files a/res-xhdpi/images/loop00054.png and b/res-xhdpi/images/loop00054.png differ diff --git a/res-xhdpi/images/loop00055.png b/res-xhdpi/images/loop00055.png index 0984d01fe..00d67dacf 100644 Binary files a/res-xhdpi/images/loop00055.png and b/res-xhdpi/images/loop00055.png differ diff --git a/res-xhdpi/images/loop00056.png b/res-xhdpi/images/loop00056.png index bab299846..00ad26a5e 100644 Binary files a/res-xhdpi/images/loop00056.png and b/res-xhdpi/images/loop00056.png differ diff --git a/res-xhdpi/images/loop00057.png b/res-xhdpi/images/loop00057.png index 4acfce540..351179569 100644 Binary files a/res-xhdpi/images/loop00057.png and b/res-xhdpi/images/loop00057.png differ diff --git a/res-xhdpi/images/loop00058.png b/res-xhdpi/images/loop00058.png index d49fea46f..9d28f7d1c 100644 Binary files a/res-xhdpi/images/loop00058.png and b/res-xhdpi/images/loop00058.png differ diff --git a/res-xhdpi/images/loop00059.png b/res-xhdpi/images/loop00059.png index fdd75c6b9..776f40e42 100644 Binary files a/res-xhdpi/images/loop00059.png and b/res-xhdpi/images/loop00059.png differ diff --git a/res-xhdpi/images/loop00060.png b/res-xhdpi/images/loop00060.png index 06ac591ef..7f728fc03 100644 Binary files a/res-xhdpi/images/loop00060.png and b/res-xhdpi/images/loop00060.png differ diff --git a/res-xhdpi/images/loop00061.png b/res-xhdpi/images/loop00061.png index 63be53676..deba02149 100644 Binary files a/res-xhdpi/images/loop00061.png and b/res-xhdpi/images/loop00061.png differ diff --git a/res-xhdpi/images/loop00062.png b/res-xhdpi/images/loop00062.png index e25c906cb..e6b618497 100644 Binary files a/res-xhdpi/images/loop00062.png and b/res-xhdpi/images/loop00062.png differ diff --git a/res-xhdpi/images/loop00063.png b/res-xhdpi/images/loop00063.png index 1fcaefe25..0e590a573 100644 Binary files a/res-xhdpi/images/loop00063.png and b/res-xhdpi/images/loop00063.png differ diff --git a/res-xhdpi/images/loop00064.png b/res-xhdpi/images/loop00064.png index fe373d042..c7b8102ba 100644 Binary files a/res-xhdpi/images/loop00064.png and b/res-xhdpi/images/loop00064.png differ diff --git a/res-xhdpi/images/loop00065.png b/res-xhdpi/images/loop00065.png index c5feed6ed..2ccad2577 100644 Binary files a/res-xhdpi/images/loop00065.png and b/res-xhdpi/images/loop00065.png differ diff --git a/res-xhdpi/images/loop00066.png b/res-xhdpi/images/loop00066.png index bc336e755..c5573b992 100644 Binary files a/res-xhdpi/images/loop00066.png and b/res-xhdpi/images/loop00066.png differ diff --git a/res-xhdpi/images/loop00067.png b/res-xhdpi/images/loop00067.png index a4cdcaea4..005e9a6f6 100644 Binary files a/res-xhdpi/images/loop00067.png and b/res-xhdpi/images/loop00067.png differ diff --git a/res-xhdpi/images/loop00068.png b/res-xhdpi/images/loop00068.png index 65d41a280..b8d6a6a07 100644 Binary files a/res-xhdpi/images/loop00068.png and b/res-xhdpi/images/loop00068.png differ diff --git a/res-xhdpi/images/loop00069.png b/res-xhdpi/images/loop00069.png index 5707b62c7..7e3ba3063 100644 Binary files a/res-xhdpi/images/loop00069.png and b/res-xhdpi/images/loop00069.png differ diff --git a/res-xhdpi/images/loop00070.png b/res-xhdpi/images/loop00070.png index 50ea15925..b9810b301 100644 Binary files a/res-xhdpi/images/loop00070.png and b/res-xhdpi/images/loop00070.png differ diff --git a/res-xhdpi/images/loop00071.png b/res-xhdpi/images/loop00071.png index 244a91060..726030ca1 100644 Binary files a/res-xhdpi/images/loop00071.png and b/res-xhdpi/images/loop00071.png differ diff --git a/res-xhdpi/images/loop00072.png b/res-xhdpi/images/loop00072.png index e5ee2abe7..30c1e87e1 100644 Binary files a/res-xhdpi/images/loop00072.png and b/res-xhdpi/images/loop00072.png differ diff --git a/res-xhdpi/images/loop00073.png b/res-xhdpi/images/loop00073.png index fced739ae..207a5acfc 100644 Binary files a/res-xhdpi/images/loop00073.png and b/res-xhdpi/images/loop00073.png differ diff --git a/res-xhdpi/images/loop00074.png b/res-xhdpi/images/loop00074.png index 1b739d346..4482b0c5d 100644 Binary files a/res-xhdpi/images/loop00074.png and b/res-xhdpi/images/loop00074.png differ diff --git a/res-xhdpi/images/loop00075.png b/res-xhdpi/images/loop00075.png index 989144f69..72afd0876 100644 Binary files a/res-xhdpi/images/loop00075.png and b/res-xhdpi/images/loop00075.png differ diff --git a/res-xhdpi/images/loop00076.png b/res-xhdpi/images/loop00076.png index 458c2a9a2..4b66068f5 100644 Binary files a/res-xhdpi/images/loop00076.png and b/res-xhdpi/images/loop00076.png differ diff --git a/res-xhdpi/images/loop00077.png b/res-xhdpi/images/loop00077.png index 9cecb1d0d..a94989efc 100644 Binary files a/res-xhdpi/images/loop00077.png and b/res-xhdpi/images/loop00077.png differ diff --git a/res-xhdpi/images/loop00078.png b/res-xhdpi/images/loop00078.png index c2c8dee86..810e22308 100644 Binary files a/res-xhdpi/images/loop00078.png and b/res-xhdpi/images/loop00078.png differ diff --git a/res-xhdpi/images/loop00079.png b/res-xhdpi/images/loop00079.png index 4f4fdd142..8085b2595 100644 Binary files a/res-xhdpi/images/loop00079.png and b/res-xhdpi/images/loop00079.png differ diff --git a/res-xhdpi/images/loop00080.png b/res-xhdpi/images/loop00080.png index b224378de..4aefa4c94 100644 Binary files a/res-xhdpi/images/loop00080.png and b/res-xhdpi/images/loop00080.png differ diff --git a/res-xhdpi/images/loop00081.png b/res-xhdpi/images/loop00081.png index 57d958755..c4a79fbcd 100644 Binary files a/res-xhdpi/images/loop00081.png and b/res-xhdpi/images/loop00081.png differ diff --git a/res-xhdpi/images/loop00082.png b/res-xhdpi/images/loop00082.png index c00f82a04..0fc9caa21 100644 Binary files a/res-xhdpi/images/loop00082.png and b/res-xhdpi/images/loop00082.png differ diff --git a/res-xhdpi/images/loop00083.png b/res-xhdpi/images/loop00083.png index 078311f09..f5fb15db5 100644 Binary files a/res-xhdpi/images/loop00083.png and b/res-xhdpi/images/loop00083.png differ diff --git a/res-xhdpi/images/loop00084.png b/res-xhdpi/images/loop00084.png index cac170893..ada5a2533 100644 Binary files a/res-xhdpi/images/loop00084.png and b/res-xhdpi/images/loop00084.png differ diff --git a/res-xhdpi/images/loop00085.png b/res-xhdpi/images/loop00085.png index 2ea4b0afc..f05e8d620 100644 Binary files a/res-xhdpi/images/loop00085.png and b/res-xhdpi/images/loop00085.png differ diff --git a/res-xhdpi/images/loop00086.png b/res-xhdpi/images/loop00086.png index 9ba6ca615..28c5dfd88 100644 Binary files a/res-xhdpi/images/loop00086.png and b/res-xhdpi/images/loop00086.png differ diff --git a/res-xhdpi/images/loop00087.png b/res-xhdpi/images/loop00087.png index 75694a387..d969905ce 100644 Binary files a/res-xhdpi/images/loop00087.png and b/res-xhdpi/images/loop00087.png differ diff --git a/res-xhdpi/images/loop00088.png b/res-xhdpi/images/loop00088.png index 971e50848..653300297 100644 Binary files a/res-xhdpi/images/loop00088.png and b/res-xhdpi/images/loop00088.png differ diff --git a/res-xhdpi/images/loop00089.png b/res-xhdpi/images/loop00089.png index 41b6ce6b1..0d5cdea7a 100644 Binary files a/res-xhdpi/images/loop00089.png and b/res-xhdpi/images/loop00089.png differ diff --git a/res-xhdpi/images/loop00090.png b/res-xhdpi/images/loop00090.png index f5bf7a73b..b438e9e67 100644 Binary files a/res-xhdpi/images/loop00090.png and b/res-xhdpi/images/loop00090.png differ diff --git a/res-xxhdpi/images/loop00000.png b/res-xxhdpi/images/loop00000.png index c5172629d..003c2f875 100644 Binary files a/res-xxhdpi/images/loop00000.png and b/res-xxhdpi/images/loop00000.png differ diff --git a/res-xxhdpi/images/loop00001.png b/res-xxhdpi/images/loop00001.png index 1b1ce7397..05de3ddcf 100644 Binary files a/res-xxhdpi/images/loop00001.png and b/res-xxhdpi/images/loop00001.png differ diff --git a/res-xxhdpi/images/loop00002.png b/res-xxhdpi/images/loop00002.png index e984a24c9..3b025475a 100644 Binary files a/res-xxhdpi/images/loop00002.png and b/res-xxhdpi/images/loop00002.png differ diff --git a/res-xxhdpi/images/loop00003.png b/res-xxhdpi/images/loop00003.png index b11dddcb8..21f0dcc66 100644 Binary files a/res-xxhdpi/images/loop00003.png and b/res-xxhdpi/images/loop00003.png differ diff --git a/res-xxhdpi/images/loop00004.png b/res-xxhdpi/images/loop00004.png index 10272b271..6a8b75891 100644 Binary files a/res-xxhdpi/images/loop00004.png and b/res-xxhdpi/images/loop00004.png differ diff --git a/res-xxhdpi/images/loop00005.png b/res-xxhdpi/images/loop00005.png index 9558d7e68..a179aef45 100644 Binary files a/res-xxhdpi/images/loop00005.png and b/res-xxhdpi/images/loop00005.png differ diff --git a/res-xxhdpi/images/loop00006.png b/res-xxhdpi/images/loop00006.png index 0e6c92d69..ef9f5e849 100644 Binary files a/res-xxhdpi/images/loop00006.png and b/res-xxhdpi/images/loop00006.png differ diff --git a/res-xxhdpi/images/loop00007.png b/res-xxhdpi/images/loop00007.png index 0a353ad02..80a477d48 100644 Binary files a/res-xxhdpi/images/loop00007.png and b/res-xxhdpi/images/loop00007.png differ diff --git a/res-xxhdpi/images/loop00008.png b/res-xxhdpi/images/loop00008.png index 2f0c1620c..6c5cec08b 100644 Binary files a/res-xxhdpi/images/loop00008.png and b/res-xxhdpi/images/loop00008.png differ diff --git a/res-xxhdpi/images/loop00009.png b/res-xxhdpi/images/loop00009.png index 960d683fa..ac5dd30ee 100644 Binary files a/res-xxhdpi/images/loop00009.png and b/res-xxhdpi/images/loop00009.png differ diff --git a/res-xxhdpi/images/loop00010.png b/res-xxhdpi/images/loop00010.png index b65c3011a..18f10a17e 100644 Binary files a/res-xxhdpi/images/loop00010.png and b/res-xxhdpi/images/loop00010.png differ diff --git a/res-xxhdpi/images/loop00011.png b/res-xxhdpi/images/loop00011.png index 21444fa54..eac89e933 100644 Binary files a/res-xxhdpi/images/loop00011.png and b/res-xxhdpi/images/loop00011.png differ diff --git a/res-xxhdpi/images/loop00012.png b/res-xxhdpi/images/loop00012.png index 587db0990..390f3cfd4 100644 Binary files a/res-xxhdpi/images/loop00012.png and b/res-xxhdpi/images/loop00012.png differ diff --git a/res-xxhdpi/images/loop00013.png b/res-xxhdpi/images/loop00013.png index 57f2f66e2..18339e93f 100644 Binary files a/res-xxhdpi/images/loop00013.png and b/res-xxhdpi/images/loop00013.png differ diff --git a/res-xxhdpi/images/loop00014.png b/res-xxhdpi/images/loop00014.png index d308a6530..77b5be491 100644 Binary files a/res-xxhdpi/images/loop00014.png and b/res-xxhdpi/images/loop00014.png differ diff --git a/res-xxhdpi/images/loop00015.png b/res-xxhdpi/images/loop00015.png index 3585facad..7c16937af 100644 Binary files a/res-xxhdpi/images/loop00015.png and b/res-xxhdpi/images/loop00015.png differ diff --git a/res-xxhdpi/images/loop00016.png b/res-xxhdpi/images/loop00016.png index fd5089c44..50ea46e76 100644 Binary files a/res-xxhdpi/images/loop00016.png and b/res-xxhdpi/images/loop00016.png differ diff --git a/res-xxhdpi/images/loop00017.png b/res-xxhdpi/images/loop00017.png index 2c8c6a434..40bb9db17 100644 Binary files a/res-xxhdpi/images/loop00017.png and b/res-xxhdpi/images/loop00017.png differ diff --git a/res-xxhdpi/images/loop00018.png b/res-xxhdpi/images/loop00018.png index 23d7ca287..55b4d70f6 100644 Binary files a/res-xxhdpi/images/loop00018.png and b/res-xxhdpi/images/loop00018.png differ diff --git a/res-xxhdpi/images/loop00019.png b/res-xxhdpi/images/loop00019.png index cdefe2c55..a443090e9 100644 Binary files a/res-xxhdpi/images/loop00019.png and b/res-xxhdpi/images/loop00019.png differ diff --git a/res-xxhdpi/images/loop00020.png b/res-xxhdpi/images/loop00020.png index ae78e4cfe..96e77eec9 100644 Binary files a/res-xxhdpi/images/loop00020.png and b/res-xxhdpi/images/loop00020.png differ diff --git a/res-xxhdpi/images/loop00021.png b/res-xxhdpi/images/loop00021.png index ad83cfe04..35260af50 100644 Binary files a/res-xxhdpi/images/loop00021.png and b/res-xxhdpi/images/loop00021.png differ diff --git a/res-xxhdpi/images/loop00022.png b/res-xxhdpi/images/loop00022.png index 850076ac1..1861848d8 100644 Binary files a/res-xxhdpi/images/loop00022.png and b/res-xxhdpi/images/loop00022.png differ diff --git a/res-xxhdpi/images/loop00023.png b/res-xxhdpi/images/loop00023.png index cd30b3997..4b2e7da5f 100644 Binary files a/res-xxhdpi/images/loop00023.png and b/res-xxhdpi/images/loop00023.png differ diff --git a/res-xxhdpi/images/loop00024.png b/res-xxhdpi/images/loop00024.png index e7ae4b277..1ffc765f4 100644 Binary files a/res-xxhdpi/images/loop00024.png and b/res-xxhdpi/images/loop00024.png differ diff --git a/res-xxhdpi/images/loop00025.png b/res-xxhdpi/images/loop00025.png index 4e24bd118..9fb29d44b 100644 Binary files a/res-xxhdpi/images/loop00025.png and b/res-xxhdpi/images/loop00025.png differ diff --git a/res-xxhdpi/images/loop00026.png b/res-xxhdpi/images/loop00026.png index 27713cce9..143def39f 100644 Binary files a/res-xxhdpi/images/loop00026.png and b/res-xxhdpi/images/loop00026.png differ diff --git a/res-xxhdpi/images/loop00027.png b/res-xxhdpi/images/loop00027.png index 34e4ade2e..623d6bed2 100644 Binary files a/res-xxhdpi/images/loop00027.png and b/res-xxhdpi/images/loop00027.png differ diff --git a/res-xxhdpi/images/loop00028.png b/res-xxhdpi/images/loop00028.png index 0e6fdee75..b7b43d27f 100644 Binary files a/res-xxhdpi/images/loop00028.png and b/res-xxhdpi/images/loop00028.png differ diff --git a/res-xxhdpi/images/loop00029.png b/res-xxhdpi/images/loop00029.png index 21c1c635b..c9f183db1 100644 Binary files a/res-xxhdpi/images/loop00029.png and b/res-xxhdpi/images/loop00029.png differ diff --git a/res-xxhdpi/images/loop00030.png b/res-xxhdpi/images/loop00030.png index 984c24f9b..b85c7e35c 100644 Binary files a/res-xxhdpi/images/loop00030.png and b/res-xxhdpi/images/loop00030.png differ diff --git a/res-xxhdpi/images/loop00031.png b/res-xxhdpi/images/loop00031.png index 25fe1de26..4d938e25a 100644 Binary files a/res-xxhdpi/images/loop00031.png and b/res-xxhdpi/images/loop00031.png differ diff --git a/res-xxhdpi/images/loop00032.png b/res-xxhdpi/images/loop00032.png index c089cb8a4..0a1787602 100644 Binary files a/res-xxhdpi/images/loop00032.png and b/res-xxhdpi/images/loop00032.png differ diff --git a/res-xxhdpi/images/loop00033.png b/res-xxhdpi/images/loop00033.png index 82a2d9b54..c8919c312 100644 Binary files a/res-xxhdpi/images/loop00033.png and b/res-xxhdpi/images/loop00033.png differ diff --git a/res-xxhdpi/images/loop00034.png b/res-xxhdpi/images/loop00034.png index 1aa76b94c..1584d5dbb 100644 Binary files a/res-xxhdpi/images/loop00034.png and b/res-xxhdpi/images/loop00034.png differ diff --git a/res-xxhdpi/images/loop00035.png b/res-xxhdpi/images/loop00035.png index 4399143e4..2220cd3c8 100644 Binary files a/res-xxhdpi/images/loop00035.png and b/res-xxhdpi/images/loop00035.png differ diff --git a/res-xxhdpi/images/loop00036.png b/res-xxhdpi/images/loop00036.png index 975ae666e..97ae5485d 100644 Binary files a/res-xxhdpi/images/loop00036.png and b/res-xxhdpi/images/loop00036.png differ diff --git a/res-xxhdpi/images/loop00037.png b/res-xxhdpi/images/loop00037.png index dcf9a9050..84fca9758 100644 Binary files a/res-xxhdpi/images/loop00037.png and b/res-xxhdpi/images/loop00037.png differ diff --git a/res-xxhdpi/images/loop00038.png b/res-xxhdpi/images/loop00038.png index f10b8b723..bba2181d6 100644 Binary files a/res-xxhdpi/images/loop00038.png and b/res-xxhdpi/images/loop00038.png differ diff --git a/res-xxhdpi/images/loop00039.png b/res-xxhdpi/images/loop00039.png index 9c0d1e361..4659625fd 100644 Binary files a/res-xxhdpi/images/loop00039.png and b/res-xxhdpi/images/loop00039.png differ diff --git a/res-xxhdpi/images/loop00040.png b/res-xxhdpi/images/loop00040.png index b6b4908f6..6b3092ae5 100644 Binary files a/res-xxhdpi/images/loop00040.png and b/res-xxhdpi/images/loop00040.png differ diff --git a/res-xxhdpi/images/loop00041.png b/res-xxhdpi/images/loop00041.png index 12a1a1e9a..5b3cd1663 100644 Binary files a/res-xxhdpi/images/loop00041.png and b/res-xxhdpi/images/loop00041.png differ diff --git a/res-xxhdpi/images/loop00042.png b/res-xxhdpi/images/loop00042.png index f1fc35baf..dbb8a7f3a 100644 Binary files a/res-xxhdpi/images/loop00042.png and b/res-xxhdpi/images/loop00042.png differ diff --git a/res-xxhdpi/images/loop00043.png b/res-xxhdpi/images/loop00043.png index 50ac99e5e..582454237 100644 Binary files a/res-xxhdpi/images/loop00043.png and b/res-xxhdpi/images/loop00043.png differ diff --git a/res-xxhdpi/images/loop00044.png b/res-xxhdpi/images/loop00044.png index f115dcc9b..d814246ad 100644 Binary files a/res-xxhdpi/images/loop00044.png and b/res-xxhdpi/images/loop00044.png differ diff --git a/res-xxhdpi/images/loop00045.png b/res-xxhdpi/images/loop00045.png index adf7a671e..e6a8d3089 100644 Binary files a/res-xxhdpi/images/loop00045.png and b/res-xxhdpi/images/loop00045.png differ diff --git a/res-xxhdpi/images/loop00046.png b/res-xxhdpi/images/loop00046.png index 588eeb3fb..2f616bf01 100644 Binary files a/res-xxhdpi/images/loop00046.png and b/res-xxhdpi/images/loop00046.png differ diff --git a/res-xxhdpi/images/loop00047.png b/res-xxhdpi/images/loop00047.png index 9dea7701d..39b74d95f 100644 Binary files a/res-xxhdpi/images/loop00047.png and b/res-xxhdpi/images/loop00047.png differ diff --git a/res-xxhdpi/images/loop00048.png b/res-xxhdpi/images/loop00048.png index d5eaeb126..2a94b8c70 100644 Binary files a/res-xxhdpi/images/loop00048.png and b/res-xxhdpi/images/loop00048.png differ diff --git a/res-xxhdpi/images/loop00049.png b/res-xxhdpi/images/loop00049.png index fb837295b..6d86e2e14 100644 Binary files a/res-xxhdpi/images/loop00049.png and b/res-xxhdpi/images/loop00049.png differ diff --git a/res-xxhdpi/images/loop00050.png b/res-xxhdpi/images/loop00050.png index 72441db4f..c6cb34417 100644 Binary files a/res-xxhdpi/images/loop00050.png and b/res-xxhdpi/images/loop00050.png differ diff --git a/res-xxhdpi/images/loop00051.png b/res-xxhdpi/images/loop00051.png index bf7170a53..dc510fa03 100644 Binary files a/res-xxhdpi/images/loop00051.png and b/res-xxhdpi/images/loop00051.png differ diff --git a/res-xxhdpi/images/loop00052.png b/res-xxhdpi/images/loop00052.png index c512b56d4..9fdd3ad72 100644 Binary files a/res-xxhdpi/images/loop00052.png and b/res-xxhdpi/images/loop00052.png differ diff --git a/res-xxhdpi/images/loop00053.png b/res-xxhdpi/images/loop00053.png index 6ac3ca6f3..8fff9cc12 100644 Binary files a/res-xxhdpi/images/loop00053.png and b/res-xxhdpi/images/loop00053.png differ diff --git a/res-xxhdpi/images/loop00054.png b/res-xxhdpi/images/loop00054.png index ba194a6ad..1f9dfaf3e 100644 Binary files a/res-xxhdpi/images/loop00054.png and b/res-xxhdpi/images/loop00054.png differ diff --git a/res-xxhdpi/images/loop00055.png b/res-xxhdpi/images/loop00055.png index 9623f0d5c..b0f669070 100644 Binary files a/res-xxhdpi/images/loop00055.png and b/res-xxhdpi/images/loop00055.png differ diff --git a/res-xxhdpi/images/loop00056.png b/res-xxhdpi/images/loop00056.png index e785e690f..79144d962 100644 Binary files a/res-xxhdpi/images/loop00056.png and b/res-xxhdpi/images/loop00056.png differ diff --git a/res-xxhdpi/images/loop00057.png b/res-xxhdpi/images/loop00057.png index 9a5747ae3..a451181c9 100644 Binary files a/res-xxhdpi/images/loop00057.png and b/res-xxhdpi/images/loop00057.png differ diff --git a/res-xxhdpi/images/loop00058.png b/res-xxhdpi/images/loop00058.png index 9a097cf12..eb6af3af5 100644 Binary files a/res-xxhdpi/images/loop00058.png and b/res-xxhdpi/images/loop00058.png differ diff --git a/res-xxhdpi/images/loop00059.png b/res-xxhdpi/images/loop00059.png index fee2db1e1..d9a976dfd 100644 Binary files a/res-xxhdpi/images/loop00059.png and b/res-xxhdpi/images/loop00059.png differ diff --git a/res-xxhdpi/images/loop00060.png b/res-xxhdpi/images/loop00060.png index 0e00e709f..93ff5d9f0 100644 Binary files a/res-xxhdpi/images/loop00060.png and b/res-xxhdpi/images/loop00060.png differ diff --git a/res-xxhdpi/images/loop00061.png b/res-xxhdpi/images/loop00061.png index 0ecce17bd..13dcd2ab9 100644 Binary files a/res-xxhdpi/images/loop00061.png and b/res-xxhdpi/images/loop00061.png differ diff --git a/res-xxhdpi/images/loop00062.png b/res-xxhdpi/images/loop00062.png index 0a296d129..1ffc8f885 100644 Binary files a/res-xxhdpi/images/loop00062.png and b/res-xxhdpi/images/loop00062.png differ diff --git a/res-xxhdpi/images/loop00063.png b/res-xxhdpi/images/loop00063.png index 56c3b8b9b..6ec7dae5c 100644 Binary files a/res-xxhdpi/images/loop00063.png and b/res-xxhdpi/images/loop00063.png differ diff --git a/res-xxhdpi/images/loop00064.png b/res-xxhdpi/images/loop00064.png index e6d639a3d..3c5bcc36e 100644 Binary files a/res-xxhdpi/images/loop00064.png and b/res-xxhdpi/images/loop00064.png differ diff --git a/res-xxhdpi/images/loop00065.png b/res-xxhdpi/images/loop00065.png index 02e382b99..541fa8893 100644 Binary files a/res-xxhdpi/images/loop00065.png and b/res-xxhdpi/images/loop00065.png differ diff --git a/res-xxhdpi/images/loop00066.png b/res-xxhdpi/images/loop00066.png index fe89ed00a..e65ca8ff9 100644 Binary files a/res-xxhdpi/images/loop00066.png and b/res-xxhdpi/images/loop00066.png differ diff --git a/res-xxhdpi/images/loop00067.png b/res-xxhdpi/images/loop00067.png index a8f6ce50c..c93125b77 100644 Binary files a/res-xxhdpi/images/loop00067.png and b/res-xxhdpi/images/loop00067.png differ diff --git a/res-xxhdpi/images/loop00068.png b/res-xxhdpi/images/loop00068.png index f9b7fb1c9..f7ef8e93e 100644 Binary files a/res-xxhdpi/images/loop00068.png and b/res-xxhdpi/images/loop00068.png differ diff --git a/res-xxhdpi/images/loop00069.png b/res-xxhdpi/images/loop00069.png index d0dc50768..e3a16c507 100644 Binary files a/res-xxhdpi/images/loop00069.png and b/res-xxhdpi/images/loop00069.png differ diff --git a/res-xxhdpi/images/loop00070.png b/res-xxhdpi/images/loop00070.png index 63f9e4df1..24cfdb111 100644 Binary files a/res-xxhdpi/images/loop00070.png and b/res-xxhdpi/images/loop00070.png differ diff --git a/res-xxhdpi/images/loop00071.png b/res-xxhdpi/images/loop00071.png index 5ba39724f..efffad470 100644 Binary files a/res-xxhdpi/images/loop00071.png and b/res-xxhdpi/images/loop00071.png differ diff --git a/res-xxhdpi/images/loop00072.png b/res-xxhdpi/images/loop00072.png index de834e398..63d62f368 100644 Binary files a/res-xxhdpi/images/loop00072.png and b/res-xxhdpi/images/loop00072.png differ diff --git a/res-xxhdpi/images/loop00073.png b/res-xxhdpi/images/loop00073.png index 4be2aed88..de0f41041 100644 Binary files a/res-xxhdpi/images/loop00073.png and b/res-xxhdpi/images/loop00073.png differ diff --git a/res-xxhdpi/images/loop00074.png b/res-xxhdpi/images/loop00074.png index 235e9a228..45c9a74bc 100644 Binary files a/res-xxhdpi/images/loop00074.png and b/res-xxhdpi/images/loop00074.png differ diff --git a/res-xxhdpi/images/loop00075.png b/res-xxhdpi/images/loop00075.png index f6d806d5a..a26893783 100644 Binary files a/res-xxhdpi/images/loop00075.png and b/res-xxhdpi/images/loop00075.png differ diff --git a/res-xxhdpi/images/loop00076.png b/res-xxhdpi/images/loop00076.png index 1e916d723..9edd577e7 100644 Binary files a/res-xxhdpi/images/loop00076.png and b/res-xxhdpi/images/loop00076.png differ diff --git a/res-xxhdpi/images/loop00077.png b/res-xxhdpi/images/loop00077.png index 0dbac748e..23a7cc77c 100644 Binary files a/res-xxhdpi/images/loop00077.png and b/res-xxhdpi/images/loop00077.png differ diff --git a/res-xxhdpi/images/loop00078.png b/res-xxhdpi/images/loop00078.png index 504d34a44..67dbf2d06 100644 Binary files a/res-xxhdpi/images/loop00078.png and b/res-xxhdpi/images/loop00078.png differ diff --git a/res-xxhdpi/images/loop00079.png b/res-xxhdpi/images/loop00079.png index 51f4e8d7c..0ef021faf 100644 Binary files a/res-xxhdpi/images/loop00079.png and b/res-xxhdpi/images/loop00079.png differ diff --git a/res-xxhdpi/images/loop00080.png b/res-xxhdpi/images/loop00080.png index 6ef03b82e..0de307b7a 100644 Binary files a/res-xxhdpi/images/loop00080.png and b/res-xxhdpi/images/loop00080.png differ diff --git a/res-xxhdpi/images/loop00081.png b/res-xxhdpi/images/loop00081.png index e2ebc394d..cc31e9201 100644 Binary files a/res-xxhdpi/images/loop00081.png and b/res-xxhdpi/images/loop00081.png differ diff --git a/res-xxhdpi/images/loop00082.png b/res-xxhdpi/images/loop00082.png index 9de83a733..6809fa37b 100644 Binary files a/res-xxhdpi/images/loop00082.png and b/res-xxhdpi/images/loop00082.png differ diff --git a/res-xxhdpi/images/loop00083.png b/res-xxhdpi/images/loop00083.png index c5c0099de..c3e3a5827 100644 Binary files a/res-xxhdpi/images/loop00083.png and b/res-xxhdpi/images/loop00083.png differ diff --git a/res-xxhdpi/images/loop00084.png b/res-xxhdpi/images/loop00084.png index 84c794f31..fc0df350f 100644 Binary files a/res-xxhdpi/images/loop00084.png and b/res-xxhdpi/images/loop00084.png differ diff --git a/res-xxhdpi/images/loop00085.png b/res-xxhdpi/images/loop00085.png index 29a40c628..38baf7e71 100644 Binary files a/res-xxhdpi/images/loop00085.png and b/res-xxhdpi/images/loop00085.png differ diff --git a/res-xxhdpi/images/loop00086.png b/res-xxhdpi/images/loop00086.png index 89a471735..c6616ebe3 100644 Binary files a/res-xxhdpi/images/loop00086.png and b/res-xxhdpi/images/loop00086.png differ diff --git a/res-xxhdpi/images/loop00087.png b/res-xxhdpi/images/loop00087.png index ef8d4d5db..2e6b715cd 100644 Binary files a/res-xxhdpi/images/loop00087.png and b/res-xxhdpi/images/loop00087.png differ diff --git a/res-xxhdpi/images/loop00088.png b/res-xxhdpi/images/loop00088.png index 5fc6c6224..660d0df8f 100644 Binary files a/res-xxhdpi/images/loop00088.png and b/res-xxhdpi/images/loop00088.png differ diff --git a/res-xxhdpi/images/loop00089.png b/res-xxhdpi/images/loop00089.png index d6d99f42f..a6b82c588 100644 Binary files a/res-xxhdpi/images/loop00089.png and b/res-xxhdpi/images/loop00089.png differ diff --git a/res-xxhdpi/images/loop00090.png b/res-xxhdpi/images/loop00090.png index c5172629d..003c2f875 100644 Binary files a/res-xxhdpi/images/loop00090.png and b/res-xxhdpi/images/loop00090.png differ diff --git a/res-xxxhdpi/images/loop00000.png b/res-xxxhdpi/images/loop00000.png index 1bc9db5b1..d6640c540 100644 Binary files a/res-xxxhdpi/images/loop00000.png and b/res-xxxhdpi/images/loop00000.png differ diff --git a/res-xxxhdpi/images/loop00001.png b/res-xxxhdpi/images/loop00001.png index f835b8567..e1b82b938 100644 Binary files a/res-xxxhdpi/images/loop00001.png and b/res-xxxhdpi/images/loop00001.png differ diff --git a/res-xxxhdpi/images/loop00002.png b/res-xxxhdpi/images/loop00002.png index e3bff326c..9b8a381f4 100644 Binary files a/res-xxxhdpi/images/loop00002.png and b/res-xxxhdpi/images/loop00002.png differ diff --git a/res-xxxhdpi/images/loop00003.png b/res-xxxhdpi/images/loop00003.png index d864c15d7..b4d244c78 100644 Binary files a/res-xxxhdpi/images/loop00003.png and b/res-xxxhdpi/images/loop00003.png differ diff --git a/res-xxxhdpi/images/loop00004.png b/res-xxxhdpi/images/loop00004.png index 5d861c9b4..c9231596e 100644 Binary files a/res-xxxhdpi/images/loop00004.png and b/res-xxxhdpi/images/loop00004.png differ diff --git a/res-xxxhdpi/images/loop00005.png b/res-xxxhdpi/images/loop00005.png index e9e860c3c..ed739fae4 100644 Binary files a/res-xxxhdpi/images/loop00005.png and b/res-xxxhdpi/images/loop00005.png differ diff --git a/res-xxxhdpi/images/loop00006.png b/res-xxxhdpi/images/loop00006.png index d7c516e52..68116922b 100644 Binary files a/res-xxxhdpi/images/loop00006.png and b/res-xxxhdpi/images/loop00006.png differ diff --git a/res-xxxhdpi/images/loop00007.png b/res-xxxhdpi/images/loop00007.png index fa6d39716..bbeee0111 100644 Binary files a/res-xxxhdpi/images/loop00007.png and b/res-xxxhdpi/images/loop00007.png differ diff --git a/res-xxxhdpi/images/loop00008.png b/res-xxxhdpi/images/loop00008.png index 888d3a278..2c28032e7 100644 Binary files a/res-xxxhdpi/images/loop00008.png and b/res-xxxhdpi/images/loop00008.png differ diff --git a/res-xxxhdpi/images/loop00009.png b/res-xxxhdpi/images/loop00009.png index 9e6ead241..4ea659cfa 100644 Binary files a/res-xxxhdpi/images/loop00009.png and b/res-xxxhdpi/images/loop00009.png differ diff --git a/res-xxxhdpi/images/loop00010.png b/res-xxxhdpi/images/loop00010.png index 30e13e058..45928bc4c 100644 Binary files a/res-xxxhdpi/images/loop00010.png and b/res-xxxhdpi/images/loop00010.png differ diff --git a/res-xxxhdpi/images/loop00011.png b/res-xxxhdpi/images/loop00011.png index d8abc2bb5..8a8f2f7be 100644 Binary files a/res-xxxhdpi/images/loop00011.png and b/res-xxxhdpi/images/loop00011.png differ diff --git a/res-xxxhdpi/images/loop00012.png b/res-xxxhdpi/images/loop00012.png index 2d88cfb6a..1714d1be0 100644 Binary files a/res-xxxhdpi/images/loop00012.png and b/res-xxxhdpi/images/loop00012.png differ diff --git a/res-xxxhdpi/images/loop00013.png b/res-xxxhdpi/images/loop00013.png index 0250f7494..18ab24f2d 100644 Binary files a/res-xxxhdpi/images/loop00013.png and b/res-xxxhdpi/images/loop00013.png differ diff --git a/res-xxxhdpi/images/loop00014.png b/res-xxxhdpi/images/loop00014.png index c3d9239c9..5099bc502 100644 Binary files a/res-xxxhdpi/images/loop00014.png and b/res-xxxhdpi/images/loop00014.png differ diff --git a/res-xxxhdpi/images/loop00015.png b/res-xxxhdpi/images/loop00015.png index 644c9c6bd..b7e68683d 100644 Binary files a/res-xxxhdpi/images/loop00015.png and b/res-xxxhdpi/images/loop00015.png differ diff --git a/res-xxxhdpi/images/loop00016.png b/res-xxxhdpi/images/loop00016.png index eff6e5b4e..bc1337574 100644 Binary files a/res-xxxhdpi/images/loop00016.png and b/res-xxxhdpi/images/loop00016.png differ diff --git a/res-xxxhdpi/images/loop00017.png b/res-xxxhdpi/images/loop00017.png index b472a86be..8a9bd869d 100644 Binary files a/res-xxxhdpi/images/loop00017.png and b/res-xxxhdpi/images/loop00017.png differ diff --git a/res-xxxhdpi/images/loop00018.png b/res-xxxhdpi/images/loop00018.png index b17b6ce12..2150d630e 100644 Binary files a/res-xxxhdpi/images/loop00018.png and b/res-xxxhdpi/images/loop00018.png differ diff --git a/res-xxxhdpi/images/loop00019.png b/res-xxxhdpi/images/loop00019.png index d89b4da52..ec0cc589c 100644 Binary files a/res-xxxhdpi/images/loop00019.png and b/res-xxxhdpi/images/loop00019.png differ diff --git a/res-xxxhdpi/images/loop00020.png b/res-xxxhdpi/images/loop00020.png index 7e757b845..6596ea215 100644 Binary files a/res-xxxhdpi/images/loop00020.png and b/res-xxxhdpi/images/loop00020.png differ diff --git a/res-xxxhdpi/images/loop00021.png b/res-xxxhdpi/images/loop00021.png index 1a8ce3ec5..c874649cb 100644 Binary files a/res-xxxhdpi/images/loop00021.png and b/res-xxxhdpi/images/loop00021.png differ diff --git a/res-xxxhdpi/images/loop00022.png b/res-xxxhdpi/images/loop00022.png index e9ab39a5f..d5f834d45 100644 Binary files a/res-xxxhdpi/images/loop00022.png and b/res-xxxhdpi/images/loop00022.png differ diff --git a/res-xxxhdpi/images/loop00023.png b/res-xxxhdpi/images/loop00023.png index e1a7bf782..eb8af82fa 100644 Binary files a/res-xxxhdpi/images/loop00023.png and b/res-xxxhdpi/images/loop00023.png differ diff --git a/res-xxxhdpi/images/loop00024.png b/res-xxxhdpi/images/loop00024.png index f77f70cff..7da550688 100644 Binary files a/res-xxxhdpi/images/loop00024.png and b/res-xxxhdpi/images/loop00024.png differ diff --git a/res-xxxhdpi/images/loop00025.png b/res-xxxhdpi/images/loop00025.png index 8348cdfca..884414973 100644 Binary files a/res-xxxhdpi/images/loop00025.png and b/res-xxxhdpi/images/loop00025.png differ diff --git a/res-xxxhdpi/images/loop00026.png b/res-xxxhdpi/images/loop00026.png index 55fecc8bb..ee36358aa 100644 Binary files a/res-xxxhdpi/images/loop00026.png and b/res-xxxhdpi/images/loop00026.png differ diff --git a/res-xxxhdpi/images/loop00027.png b/res-xxxhdpi/images/loop00027.png index f4edf0641..0299dae07 100644 Binary files a/res-xxxhdpi/images/loop00027.png and b/res-xxxhdpi/images/loop00027.png differ diff --git a/res-xxxhdpi/images/loop00028.png b/res-xxxhdpi/images/loop00028.png index 6dbe90446..a8f5cef33 100644 Binary files a/res-xxxhdpi/images/loop00028.png and b/res-xxxhdpi/images/loop00028.png differ diff --git a/res-xxxhdpi/images/loop00029.png b/res-xxxhdpi/images/loop00029.png index 764f27a05..6b2ab3fcd 100644 Binary files a/res-xxxhdpi/images/loop00029.png and b/res-xxxhdpi/images/loop00029.png differ diff --git a/res-xxxhdpi/images/loop00030.png b/res-xxxhdpi/images/loop00030.png index 2d2156930..2d5b48de3 100644 Binary files a/res-xxxhdpi/images/loop00030.png and b/res-xxxhdpi/images/loop00030.png differ diff --git a/res-xxxhdpi/images/loop00031.png b/res-xxxhdpi/images/loop00031.png index e02db9c8b..40c4296cd 100644 Binary files a/res-xxxhdpi/images/loop00031.png and b/res-xxxhdpi/images/loop00031.png differ diff --git a/res-xxxhdpi/images/loop00032.png b/res-xxxhdpi/images/loop00032.png index 03f045684..f130b0ab9 100644 Binary files a/res-xxxhdpi/images/loop00032.png and b/res-xxxhdpi/images/loop00032.png differ diff --git a/res-xxxhdpi/images/loop00033.png b/res-xxxhdpi/images/loop00033.png index 5bdbbdbaf..24151ba62 100644 Binary files a/res-xxxhdpi/images/loop00033.png and b/res-xxxhdpi/images/loop00033.png differ diff --git a/res-xxxhdpi/images/loop00034.png b/res-xxxhdpi/images/loop00034.png index c8164e204..f74f89555 100644 Binary files a/res-xxxhdpi/images/loop00034.png and b/res-xxxhdpi/images/loop00034.png differ diff --git a/res-xxxhdpi/images/loop00035.png b/res-xxxhdpi/images/loop00035.png index ed5721d7c..4a0f8053f 100644 Binary files a/res-xxxhdpi/images/loop00035.png and b/res-xxxhdpi/images/loop00035.png differ diff --git a/res-xxxhdpi/images/loop00036.png b/res-xxxhdpi/images/loop00036.png index 08dffd26b..74658622d 100644 Binary files a/res-xxxhdpi/images/loop00036.png and b/res-xxxhdpi/images/loop00036.png differ diff --git a/res-xxxhdpi/images/loop00037.png b/res-xxxhdpi/images/loop00037.png index 583b665e4..5d10d10a5 100644 Binary files a/res-xxxhdpi/images/loop00037.png and b/res-xxxhdpi/images/loop00037.png differ diff --git a/res-xxxhdpi/images/loop00038.png b/res-xxxhdpi/images/loop00038.png index cc2933d6a..15d5db2f2 100644 Binary files a/res-xxxhdpi/images/loop00038.png and b/res-xxxhdpi/images/loop00038.png differ diff --git a/res-xxxhdpi/images/loop00039.png b/res-xxxhdpi/images/loop00039.png index 1f0496adb..b92d49d08 100644 Binary files a/res-xxxhdpi/images/loop00039.png and b/res-xxxhdpi/images/loop00039.png differ diff --git a/res-xxxhdpi/images/loop00040.png b/res-xxxhdpi/images/loop00040.png index 05bf33593..5c19c0254 100644 Binary files a/res-xxxhdpi/images/loop00040.png and b/res-xxxhdpi/images/loop00040.png differ diff --git a/res-xxxhdpi/images/loop00041.png b/res-xxxhdpi/images/loop00041.png index a868c7b2d..2c9d406b7 100644 Binary files a/res-xxxhdpi/images/loop00041.png and b/res-xxxhdpi/images/loop00041.png differ diff --git a/res-xxxhdpi/images/loop00042.png b/res-xxxhdpi/images/loop00042.png index 7c7220f29..bb24da5b4 100644 Binary files a/res-xxxhdpi/images/loop00042.png and b/res-xxxhdpi/images/loop00042.png differ diff --git a/res-xxxhdpi/images/loop00043.png b/res-xxxhdpi/images/loop00043.png index 30336a77b..0a9efd8a2 100644 Binary files a/res-xxxhdpi/images/loop00043.png and b/res-xxxhdpi/images/loop00043.png differ diff --git a/res-xxxhdpi/images/loop00044.png b/res-xxxhdpi/images/loop00044.png index 80d373584..70e1cbc84 100644 Binary files a/res-xxxhdpi/images/loop00044.png and b/res-xxxhdpi/images/loop00044.png differ diff --git a/res-xxxhdpi/images/loop00045.png b/res-xxxhdpi/images/loop00045.png index 71a52c20c..0ecb787b9 100644 Binary files a/res-xxxhdpi/images/loop00045.png and b/res-xxxhdpi/images/loop00045.png differ diff --git a/res-xxxhdpi/images/loop00046.png b/res-xxxhdpi/images/loop00046.png index b3b37029d..c2c425abd 100644 Binary files a/res-xxxhdpi/images/loop00046.png and b/res-xxxhdpi/images/loop00046.png differ diff --git a/res-xxxhdpi/images/loop00047.png b/res-xxxhdpi/images/loop00047.png index 6ce2b37ab..71812b3a7 100644 Binary files a/res-xxxhdpi/images/loop00047.png and b/res-xxxhdpi/images/loop00047.png differ diff --git a/res-xxxhdpi/images/loop00048.png b/res-xxxhdpi/images/loop00048.png index 0b428cd73..6ef44ce22 100644 Binary files a/res-xxxhdpi/images/loop00048.png and b/res-xxxhdpi/images/loop00048.png differ diff --git a/res-xxxhdpi/images/loop00049.png b/res-xxxhdpi/images/loop00049.png index 53c1a4774..5c7b1c50a 100644 Binary files a/res-xxxhdpi/images/loop00049.png and b/res-xxxhdpi/images/loop00049.png differ diff --git a/res-xxxhdpi/images/loop00050.png b/res-xxxhdpi/images/loop00050.png index 0e17bbdff..10dcf213c 100644 Binary files a/res-xxxhdpi/images/loop00050.png and b/res-xxxhdpi/images/loop00050.png differ diff --git a/res-xxxhdpi/images/loop00051.png b/res-xxxhdpi/images/loop00051.png index 78a99dcc7..e850b32aa 100644 Binary files a/res-xxxhdpi/images/loop00051.png and b/res-xxxhdpi/images/loop00051.png differ diff --git a/res-xxxhdpi/images/loop00052.png b/res-xxxhdpi/images/loop00052.png index efd0df559..7abf444a3 100644 Binary files a/res-xxxhdpi/images/loop00052.png and b/res-xxxhdpi/images/loop00052.png differ diff --git a/res-xxxhdpi/images/loop00053.png b/res-xxxhdpi/images/loop00053.png index 0c417eef9..f680849af 100644 Binary files a/res-xxxhdpi/images/loop00053.png and b/res-xxxhdpi/images/loop00053.png differ diff --git a/res-xxxhdpi/images/loop00054.png b/res-xxxhdpi/images/loop00054.png index 072077e6f..012c14dee 100644 Binary files a/res-xxxhdpi/images/loop00054.png and b/res-xxxhdpi/images/loop00054.png differ diff --git a/res-xxxhdpi/images/loop00055.png b/res-xxxhdpi/images/loop00055.png index 693083ac8..ae335dbb9 100644 Binary files a/res-xxxhdpi/images/loop00055.png and b/res-xxxhdpi/images/loop00055.png differ diff --git a/res-xxxhdpi/images/loop00056.png b/res-xxxhdpi/images/loop00056.png index 07cbd75d1..8e928ea85 100644 Binary files a/res-xxxhdpi/images/loop00056.png and b/res-xxxhdpi/images/loop00056.png differ diff --git a/res-xxxhdpi/images/loop00057.png b/res-xxxhdpi/images/loop00057.png index cc98ab21a..c23d4f0d7 100644 Binary files a/res-xxxhdpi/images/loop00057.png and b/res-xxxhdpi/images/loop00057.png differ diff --git a/res-xxxhdpi/images/loop00058.png b/res-xxxhdpi/images/loop00058.png index f55d21821..d5144aa69 100644 Binary files a/res-xxxhdpi/images/loop00058.png and b/res-xxxhdpi/images/loop00058.png differ diff --git a/res-xxxhdpi/images/loop00059.png b/res-xxxhdpi/images/loop00059.png index 4bfed350a..f8f3a7c16 100644 Binary files a/res-xxxhdpi/images/loop00059.png and b/res-xxxhdpi/images/loop00059.png differ diff --git a/res-xxxhdpi/images/loop00060.png b/res-xxxhdpi/images/loop00060.png index 59f158b10..8894a236f 100644 Binary files a/res-xxxhdpi/images/loop00060.png and b/res-xxxhdpi/images/loop00060.png differ diff --git a/res-xxxhdpi/images/loop00061.png b/res-xxxhdpi/images/loop00061.png index fd0dc558d..1c33e84fd 100644 Binary files a/res-xxxhdpi/images/loop00061.png and b/res-xxxhdpi/images/loop00061.png differ diff --git a/res-xxxhdpi/images/loop00062.png b/res-xxxhdpi/images/loop00062.png index 2c316ce69..c2242ff49 100644 Binary files a/res-xxxhdpi/images/loop00062.png and b/res-xxxhdpi/images/loop00062.png differ diff --git a/res-xxxhdpi/images/loop00063.png b/res-xxxhdpi/images/loop00063.png index 5b83c81cd..c357ffaae 100644 Binary files a/res-xxxhdpi/images/loop00063.png and b/res-xxxhdpi/images/loop00063.png differ diff --git a/res-xxxhdpi/images/loop00064.png b/res-xxxhdpi/images/loop00064.png index ced0a9ab5..f9466997e 100644 Binary files a/res-xxxhdpi/images/loop00064.png and b/res-xxxhdpi/images/loop00064.png differ diff --git a/res-xxxhdpi/images/loop00065.png b/res-xxxhdpi/images/loop00065.png index 6e699dda6..52d976b25 100644 Binary files a/res-xxxhdpi/images/loop00065.png and b/res-xxxhdpi/images/loop00065.png differ diff --git a/res-xxxhdpi/images/loop00066.png b/res-xxxhdpi/images/loop00066.png index 8853cfffe..cf37f2f97 100644 Binary files a/res-xxxhdpi/images/loop00066.png and b/res-xxxhdpi/images/loop00066.png differ diff --git a/res-xxxhdpi/images/loop00067.png b/res-xxxhdpi/images/loop00067.png index 24d11d14b..d8a1e7835 100644 Binary files a/res-xxxhdpi/images/loop00067.png and b/res-xxxhdpi/images/loop00067.png differ diff --git a/res-xxxhdpi/images/loop00068.png b/res-xxxhdpi/images/loop00068.png index d54fff0ba..8bbaf020d 100644 Binary files a/res-xxxhdpi/images/loop00068.png and b/res-xxxhdpi/images/loop00068.png differ diff --git a/res-xxxhdpi/images/loop00069.png b/res-xxxhdpi/images/loop00069.png index 67f8d7884..99d1072cd 100644 Binary files a/res-xxxhdpi/images/loop00069.png and b/res-xxxhdpi/images/loop00069.png differ diff --git a/res-xxxhdpi/images/loop00070.png b/res-xxxhdpi/images/loop00070.png index d56fb78a5..bd8979e73 100644 Binary files a/res-xxxhdpi/images/loop00070.png and b/res-xxxhdpi/images/loop00070.png differ diff --git a/res-xxxhdpi/images/loop00071.png b/res-xxxhdpi/images/loop00071.png index e787b8a5a..e823dccce 100644 Binary files a/res-xxxhdpi/images/loop00071.png and b/res-xxxhdpi/images/loop00071.png differ diff --git a/res-xxxhdpi/images/loop00072.png b/res-xxxhdpi/images/loop00072.png index 81f2e4c4b..475190fd0 100644 Binary files a/res-xxxhdpi/images/loop00072.png and b/res-xxxhdpi/images/loop00072.png differ diff --git a/res-xxxhdpi/images/loop00073.png b/res-xxxhdpi/images/loop00073.png index ad46ed162..84c4874c9 100644 Binary files a/res-xxxhdpi/images/loop00073.png and b/res-xxxhdpi/images/loop00073.png differ diff --git a/res-xxxhdpi/images/loop00074.png b/res-xxxhdpi/images/loop00074.png index d835a2bd3..e2d90a292 100644 Binary files a/res-xxxhdpi/images/loop00074.png and b/res-xxxhdpi/images/loop00074.png differ diff --git a/res-xxxhdpi/images/loop00075.png b/res-xxxhdpi/images/loop00075.png index aa35a84ba..ff13dfeb8 100644 Binary files a/res-xxxhdpi/images/loop00075.png and b/res-xxxhdpi/images/loop00075.png differ diff --git a/res-xxxhdpi/images/loop00076.png b/res-xxxhdpi/images/loop00076.png index 6ea547e29..01886ae45 100644 Binary files a/res-xxxhdpi/images/loop00076.png and b/res-xxxhdpi/images/loop00076.png differ diff --git a/res-xxxhdpi/images/loop00077.png b/res-xxxhdpi/images/loop00077.png index c80938309..4bac4ea9b 100644 Binary files a/res-xxxhdpi/images/loop00077.png and b/res-xxxhdpi/images/loop00077.png differ diff --git a/res-xxxhdpi/images/loop00078.png b/res-xxxhdpi/images/loop00078.png index 827a75c9f..6ced1a27f 100644 Binary files a/res-xxxhdpi/images/loop00078.png and b/res-xxxhdpi/images/loop00078.png differ diff --git a/res-xxxhdpi/images/loop00079.png b/res-xxxhdpi/images/loop00079.png index 18dc1cf90..f7baed340 100644 Binary files a/res-xxxhdpi/images/loop00079.png and b/res-xxxhdpi/images/loop00079.png differ diff --git a/res-xxxhdpi/images/loop00080.png b/res-xxxhdpi/images/loop00080.png index df06b5628..fbb0a138d 100644 Binary files a/res-xxxhdpi/images/loop00080.png and b/res-xxxhdpi/images/loop00080.png differ diff --git a/res-xxxhdpi/images/loop00081.png b/res-xxxhdpi/images/loop00081.png index a5ba60379..3fc7a4959 100644 Binary files a/res-xxxhdpi/images/loop00081.png and b/res-xxxhdpi/images/loop00081.png differ diff --git a/res-xxxhdpi/images/loop00082.png b/res-xxxhdpi/images/loop00082.png index e3298c5f3..3114002bc 100644 Binary files a/res-xxxhdpi/images/loop00082.png and b/res-xxxhdpi/images/loop00082.png differ diff --git a/res-xxxhdpi/images/loop00083.png b/res-xxxhdpi/images/loop00083.png index c395662c4..df1b8301a 100644 Binary files a/res-xxxhdpi/images/loop00083.png and b/res-xxxhdpi/images/loop00083.png differ diff --git a/res-xxxhdpi/images/loop00084.png b/res-xxxhdpi/images/loop00084.png index f80af8e78..11a72f2e3 100644 Binary files a/res-xxxhdpi/images/loop00084.png and b/res-xxxhdpi/images/loop00084.png differ diff --git a/res-xxxhdpi/images/loop00085.png b/res-xxxhdpi/images/loop00085.png index c89675830..ba0a43ecc 100644 Binary files a/res-xxxhdpi/images/loop00085.png and b/res-xxxhdpi/images/loop00085.png differ diff --git a/res-xxxhdpi/images/loop00086.png b/res-xxxhdpi/images/loop00086.png index 97716923f..c4111b2a3 100644 Binary files a/res-xxxhdpi/images/loop00086.png and b/res-xxxhdpi/images/loop00086.png differ diff --git a/res-xxxhdpi/images/loop00087.png b/res-xxxhdpi/images/loop00087.png index e805dfa01..13b83c7e5 100644 Binary files a/res-xxxhdpi/images/loop00087.png and b/res-xxxhdpi/images/loop00087.png differ diff --git a/res-xxxhdpi/images/loop00088.png b/res-xxxhdpi/images/loop00088.png index aa1a88e26..e7d9d6d7a 100644 Binary files a/res-xxxhdpi/images/loop00088.png and b/res-xxxhdpi/images/loop00088.png differ diff --git a/res-xxxhdpi/images/loop00089.png b/res-xxxhdpi/images/loop00089.png index 5bf7781d0..fd1951c6f 100644 Binary files a/res-xxxhdpi/images/loop00089.png and b/res-xxxhdpi/images/loop00089.png differ diff --git a/res-xxxhdpi/images/loop00090.png b/res-xxxhdpi/images/loop00090.png index 1bc9db5b1..d6640c540 100644 Binary files a/res-xxxhdpi/images/loop00090.png and b/res-xxxhdpi/images/loop00090.png differ -- cgit v1.2.3 From 195ff7f79e314ba0e7b4c492613a97ec188b8bcc Mon Sep 17 00:00:00 2001 From: Andriy Naborskyy Date: Mon, 10 Oct 2016 13:10:28 -0700 Subject: DO NOT MERGE ANYWHERE init: move healthd to late-init Starting healthd in early-init can cause SELinux denials if healthd or any device-specific libraries try to log. Now healthd is starting at boot as usual service. Bug: 30292927 Change-Id: I367d022f5885122da49181db3db536012e83f564 --- etc/init.rc | 1 - 1 file changed, 1 deletion(-) diff --git a/etc/init.rc b/etc/init.rc index 427727768..b7759259d 100644 --- a/etc/init.rc +++ b/etc/init.rc @@ -2,7 +2,6 @@ import /init.recovery.${ro.hardware}.rc on early-init start ueventd - start healthd on init export PATH /sbin:/system/bin -- cgit v1.2.3 From 1bf1772625392efe721e432681418548b9343bdd Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Thu, 3 Nov 2016 23:52:01 -0700 Subject: DO NOT MERGE updater: Add "write_value()" function. write_value(value, filename) writes 'value' to 'filename'. It can be used to tune device settings when applying an OTA package. For example, write_value("960000", "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"). Bug: 32463933 Test: recovery_component_test passes. Test: Apply an OTA package that contains a call to write_value(), and check the result. Change-Id: Ib009ecb8a45a94353f10c59e2383fe1f49796e35 (cherry picked from commit d0f3088aa95e255b39ed4b83da6b08866c2c3e0c) --- updater/install.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/updater/install.cpp b/updater/install.cpp index 005f9f97d..74feb56be 100644 --- a/updater/install.cpp +++ b/updater/install.cpp @@ -35,8 +35,10 @@ #include #include +#include #include +#include #include #include #include @@ -966,7 +968,6 @@ Value* GetPropFn(const char* name, State* state, int argc, Expr* argv[]) { return StringValue(strdup(value)); } - // file_getprop(file, key) // // interprets 'file' as a getprop-style file (key=value pairs, one @@ -1428,6 +1429,31 @@ Value* ReadFileFn(const char* name, State* state, int argc, Expr* argv[]) { return v; } +// write_value(value, filename) +// Writes 'value' to 'filename'. +// Example: write_value("960000", "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq") +Value* WriteValueFn(const char* name, State* state, int argc, Expr* argv[]) { + if (argc != 2) { + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); + } + + char* value; + char* filename; + if (ReadArgs(state, argv, 2, &value, &filename) < 0) { + return ErrorAbort(state, kArgsParsingFailure, "%s(): Failed to parse the argument(s)", + name); + } + + bool ret = android::base::WriteStringToFile(value, filename); + if (!ret) { + printf("%s: Failed to write to \"%s\": %s\n", name, filename, strerror(errno)); + } + + free(value); + free(filename); + return StringValue(strdup(ret ? "t" : "")); +} + // Immediately reboot the device. Recovery is not finished normally, // so if you reboot into recovery it will re-start applying the // current package (because nothing has cleared the copy of the @@ -1627,6 +1653,7 @@ void RegisterInstallFunctions() { RegisterFunction("read_file", ReadFileFn); RegisterFunction("sha1_check", Sha1CheckFn); RegisterFunction("rename", RenameFn); + RegisterFunction("write_value", WriteValueFn); RegisterFunction("wipe_cache", WipeCacheFn); -- cgit v1.2.3 From 48be23c8ed0bcceda1abd80e1df4d1abc20f042f Mon Sep 17 00:00:00 2001 From: Tim Kryger Date: Tue, 29 Nov 2016 13:33:29 -0800 Subject: Remove outdated reference to icon_installing.png The Wear recovery UI doesn't draw the installing icon but it was still trying to open it. Ever since these images were removed eight months ago, this has resulted in an error printing to the screen at runtime. Since the image wasn't really used, the lines to open it can simply be removed. Bug: 33203397 Change-Id: Id820f6d75e316c51d19b6095df407ecd61c0410e --- wear_ui.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wear_ui.cpp b/wear_ui.cpp index bfa7097ea..660a078fc 100644 --- a/wear_ui.cpp +++ b/wear_ui.cpp @@ -204,10 +204,11 @@ void WearRecoveryUI::InitTextParams() { void WearRecoveryUI::Init() { ScreenRecoveryUI::Init(); - LoadBitmap("icon_installing", &backgroundIcon[INSTALLING_UPDATE]); - backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE]; LoadBitmap("icon_error", &backgroundIcon[ERROR]); backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR]; + + // This leaves backgroundIcon[INSTALLING_UPDATE] and backgroundIcon[ERASING] + // as NULL which is fine since draw_background_locked() doesn't use them. } void WearRecoveryUI::SetStage(int current, int max) -- cgit v1.2.3 From 54ea136fded56810bf475885eb4bd7bf1b11f09c Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Fri, 16 Dec 2016 16:24:09 -0800 Subject: Add a checker for signature boundary in verifier The 'signature_start' variable marks the location of the signature from the end of a zip archive. And a boundary check is missing where 'signature_start' should be within the EOCD comment field. This causes problems when sideloading a malicious package. Also add a corresponding test. Bug: 31914369 Test: Verification fails correctly when sideloading recovery_test.zip on angler. Change-Id: I6ea96bf04dac5d8d4d6719e678d504f957b4d5c1 (cherry-picked from f69e6a9475983b2ad46729e44ab58d2b22cd74d0) --- verifier.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/verifier.cpp b/verifier.cpp index eeff95a59..3d4f603a2 100644 --- a/verifier.cpp +++ b/verifier.cpp @@ -143,6 +143,12 @@ int verify_file(unsigned char* addr, size_t length, LOGI("comment is %zu bytes; signature %zu bytes from end\n", comment_size, signature_start); + if (signature_start > comment_size) { + LOGE("signature start: %zu is larger than comment size: %zu\n", signature_start, + comment_size); + return VERIFY_FAILURE; + } + if (signature_start <= FOOTER_SIZE) { LOGE("Signature start is in the footer"); return VERIFY_FAILURE; -- cgit v1.2.3