release-request-c3d19af8-7ed9-4d42-9f37-c34f7f76db73-for-git_pi-release-4293790 snap-temp-L31600000095939746
Change-Id: I2654a06208f7dc73afe5171c9a015d5f34418db2
This commit is contained in:
+28
-1
@@ -79,7 +79,6 @@ LOCAL_SRC_FILES := \
|
||||
ui.cpp \
|
||||
vr_ui.cpp \
|
||||
wear_ui.cpp \
|
||||
wear_touch.cpp \
|
||||
|
||||
LOCAL_MODULE := recovery
|
||||
|
||||
@@ -120,6 +119,24 @@ else
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_TOUCH_HIGH_THRESHOLD=90
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_RECOVERY_UI_PROGRESS_BAR_BASELINE),)
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_PROGRESS_BAR_BASELINE=$(TARGET_RECOVERY_UI_PROGRESS_BAR_BASELINE)
|
||||
else
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_PROGRESS_BAR_BASELINE=259
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_RECOVERY_UI_ANIMATION_FPS),)
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_ANIMATION_FPS=$(TARGET_RECOVERY_UI_ANIMATION_FPS)
|
||||
else
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_ANIMATION_FPS=30
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_RECOVERY_UI_MENU_UNUSABLE_ROWS),)
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_MENU_UNUSABLE_ROWS=$(TARGET_RECOVERY_UI_MENU_UNUSABLE_ROWS)
|
||||
else
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_MENU_UNUSABLE_ROWS=9
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_RECOVERY_UI_VR_STEREO_OFFSET),)
|
||||
LOCAL_CFLAGS += -DRECOVERY_UI_VR_STEREO_OFFSET=$(TARGET_RECOVERY_UI_VR_STEREO_OFFSET)
|
||||
else
|
||||
@@ -216,6 +233,16 @@ LOCAL_STATIC_LIBRARIES := \
|
||||
LOCAL_CFLAGS := -Werror
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
# Wear default device
|
||||
# ===============================
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_SRC_FILES := wear_device.cpp
|
||||
|
||||
# Should match TARGET_RECOVERY_UI_LIB in BoardConfig.mk.
|
||||
LOCAL_MODULE := librecovery_ui_wear
|
||||
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
# vr headset default device
|
||||
# ===============================
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
+15
-5
@@ -148,13 +148,23 @@ static int check_newer_ab_build(ZipArchiveHandle zip) {
|
||||
return INSTALL_ERROR;
|
||||
}
|
||||
|
||||
// We allow the package to not have any serialno, but if it has a non-empty
|
||||
// value it should match.
|
||||
// We allow the package to not have any serialno; and we also allow it to carry multiple serial
|
||||
// numbers split by "|"; e.g. serialno=serialno1|serialno2|serialno3 ... We will fail the
|
||||
// verification if the device's serialno doesn't match any of these carried numbers.
|
||||
value = android::base::GetProperty("ro.serialno", "");
|
||||
const std::string& pkg_serial_no = metadata["serialno"];
|
||||
if (!pkg_serial_no.empty() && pkg_serial_no != value) {
|
||||
LOG(ERROR) << "Package is for serial " << pkg_serial_no;
|
||||
return INSTALL_ERROR;
|
||||
if (!pkg_serial_no.empty()) {
|
||||
bool match = false;
|
||||
for (const std::string& number : android::base::Split(pkg_serial_no, "|")) {
|
||||
if (value == android::base::Trim(number)) {
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!match) {
|
||||
LOG(ERROR) << "Package is for serial " << pkg_serial_no;
|
||||
return INSTALL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (metadata["ota-type"] != "AB") {
|
||||
|
||||
+2
-2
@@ -53,6 +53,7 @@ static double now() {
|
||||
ScreenRecoveryUI::ScreenRecoveryUI()
|
||||
: kMarginWidth(RECOVERY_UI_MARGIN_WIDTH),
|
||||
kMarginHeight(RECOVERY_UI_MARGIN_HEIGHT),
|
||||
kAnimationFps(RECOVERY_UI_ANIMATION_FPS),
|
||||
density_(static_cast<float>(android::base::GetIntProperty("ro.sf.lcd_density", 160)) / 160.f),
|
||||
currentIcon(NONE),
|
||||
progressBarType(EMPTY),
|
||||
@@ -77,7 +78,6 @@ ScreenRecoveryUI::ScreenRecoveryUI()
|
||||
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),
|
||||
updateMutex(PTHREAD_MUTEX_INITIALIZER) {}
|
||||
@@ -404,7 +404,7 @@ void* ScreenRecoveryUI::ProgressThreadStartRoutine(void* data) {
|
||||
}
|
||||
|
||||
void ScreenRecoveryUI::ProgressThreadLoop() {
|
||||
double interval = 1.0 / animation_fps;
|
||||
double interval = 1.0 / kAnimationFps;
|
||||
while (true) {
|
||||
double start = now();
|
||||
pthread_mutex_lock(&updateMutex);
|
||||
|
||||
+3
-3
@@ -84,6 +84,9 @@ class ScreenRecoveryUI : public RecoveryUI {
|
||||
const int kMarginWidth;
|
||||
const int kMarginHeight;
|
||||
|
||||
// Number of frames per sec (default: 30) for both parts of the animation.
|
||||
const int kAnimationFps;
|
||||
|
||||
// The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi.
|
||||
const float density_;
|
||||
|
||||
@@ -141,9 +144,6 @@ class ScreenRecoveryUI : public RecoveryUI {
|
||||
size_t current_frame;
|
||||
bool intro_done;
|
||||
|
||||
// Number of frames per sec (default: 30) for both parts of the animation.
|
||||
int animation_fps;
|
||||
|
||||
int stage, max_stage;
|
||||
|
||||
int char_width_;
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
@@ -198,8 +199,8 @@ TEST(InstallTest, verify_package_compatibility_with_libvintf_system_manifest_xml
|
||||
CloseArchive(zip);
|
||||
}
|
||||
|
||||
TEST(InstallTest, update_binary_command_smoke) {
|
||||
#ifdef AB_OTA_UPDATER
|
||||
static void VerifyAbUpdateBinaryCommand(const std::string& serialno, bool success = true) {
|
||||
TemporaryFile temp_file;
|
||||
FILE* zip_file = fdopen(temp_file.fd, "w");
|
||||
ZipWriter writer(zip_file);
|
||||
@@ -215,11 +216,13 @@ TEST(InstallTest, update_binary_command_smoke) {
|
||||
ASSERT_NE("", device);
|
||||
std::string timestamp = android::base::GetProperty("ro.build.date.utc", "");
|
||||
ASSERT_NE("", timestamp);
|
||||
std::string metadata = android::base::Join(
|
||||
std::vector<std::string>{
|
||||
"ota-type=AB", "pre-device=" + device, "post-timestamp=" + timestamp,
|
||||
},
|
||||
"\n");
|
||||
|
||||
std::vector<std::string> meta{ "ota-type=AB", "pre-device=" + device,
|
||||
"post-timestamp=" + timestamp };
|
||||
if (!serialno.empty()) {
|
||||
meta.push_back("serialno=" + serialno);
|
||||
}
|
||||
std::string metadata = android::base::Join(meta, "\n");
|
||||
ASSERT_EQ(0, writer.WriteBytes(metadata.data(), metadata.size()));
|
||||
ASSERT_EQ(0, writer.FinishEntry());
|
||||
ASSERT_EQ(0, writer.Finish());
|
||||
@@ -234,14 +237,25 @@ TEST(InstallTest, update_binary_command_smoke) {
|
||||
std::string package = "/path/to/update.zip";
|
||||
std::string binary_path = "/sbin/update_engine_sideload";
|
||||
std::vector<std::string> cmd;
|
||||
ASSERT_EQ(0, update_binary_command(package, zip, binary_path, 0, status_fd, &cmd));
|
||||
ASSERT_EQ(5U, cmd.size());
|
||||
ASSERT_EQ(binary_path, cmd[0]);
|
||||
ASSERT_EQ("--payload=file://" + package, cmd[1]);
|
||||
ASSERT_EQ("--offset=" + std::to_string(payload_entry.offset), cmd[2]);
|
||||
ASSERT_EQ("--headers=" + properties, cmd[3]);
|
||||
ASSERT_EQ("--status_fd=" + std::to_string(status_fd), cmd[4]);
|
||||
if (success) {
|
||||
ASSERT_EQ(0, update_binary_command(package, zip, binary_path, 0, status_fd, &cmd));
|
||||
ASSERT_EQ(5U, cmd.size());
|
||||
ASSERT_EQ(binary_path, cmd[0]);
|
||||
ASSERT_EQ("--payload=file://" + package, cmd[1]);
|
||||
ASSERT_EQ("--offset=" + std::to_string(payload_entry.offset), cmd[2]);
|
||||
ASSERT_EQ("--headers=" + properties, cmd[3]);
|
||||
ASSERT_EQ("--status_fd=" + std::to_string(status_fd), cmd[4]);
|
||||
} else {
|
||||
ASSERT_EQ(INSTALL_ERROR, update_binary_command(package, zip, binary_path, 0, status_fd, &cmd));
|
||||
}
|
||||
CloseArchive(zip);
|
||||
}
|
||||
#endif // AB_OTA_UPDATER
|
||||
|
||||
TEST(InstallTest, update_binary_command_smoke) {
|
||||
#ifdef AB_OTA_UPDATER
|
||||
// Empty serialno will pass the verification.
|
||||
VerifyAbUpdateBinaryCommand({});
|
||||
#else
|
||||
TemporaryFile temp_file;
|
||||
FILE* zip_file = fdopen(temp_file.fd, "w");
|
||||
@@ -340,3 +354,34 @@ TEST(InstallTest, update_binary_command_invalid) {
|
||||
CloseArchive(zip);
|
||||
#endif // AB_OTA_UPDATER
|
||||
}
|
||||
|
||||
#ifdef AB_OTA_UPDATER
|
||||
TEST(InstallTest, update_binary_command_multiple_serialno) {
|
||||
std::string serialno = android::base::GetProperty("ro.serialno", "");
|
||||
ASSERT_NE("", serialno);
|
||||
|
||||
// Single matching serialno will pass the verification.
|
||||
VerifyAbUpdateBinaryCommand(serialno);
|
||||
|
||||
static constexpr char alphabet[] =
|
||||
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
auto generator = []() { return alphabet[rand() % (sizeof(alphabet) - 1)]; };
|
||||
|
||||
// Generate 900 random serial numbers.
|
||||
std::string random_serial;
|
||||
for (size_t i = 0; i < 900; i++) {
|
||||
generate_n(back_inserter(random_serial), serialno.size(), generator);
|
||||
random_serial.append("|");
|
||||
}
|
||||
// Random serialnos should fail the verification.
|
||||
VerifyAbUpdateBinaryCommand(random_serial, false);
|
||||
|
||||
std::string long_serial = random_serial + serialno + "|";
|
||||
for (size_t i = 0; i < 99; i++) {
|
||||
generate_n(back_inserter(long_serial), serialno.size(), generator);
|
||||
long_serial.append("|");
|
||||
}
|
||||
// String with the matching serialno should pass the verification.
|
||||
VerifyAbUpdateBinaryCommand(long_serial);
|
||||
}
|
||||
#endif // AB_OTA_UPDATER
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
#include "wear_ui.h"
|
||||
|
||||
Device* make_device() {
|
||||
return new Device(new WearRecoveryUI);
|
||||
}
|
||||
|
||||
-177
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include "wear_touch.h"
|
||||
|
||||
#define DEVICE_PATH "/dev/input"
|
||||
|
||||
WearSwipeDetector::WearSwipeDetector(int low, int high, OnSwipeCallback callback, void* cookie):
|
||||
mLowThreshold(low),
|
||||
mHighThreshold(high),
|
||||
mCallback(callback),
|
||||
mCookie(cookie),
|
||||
mCurrentSlot(-1) {
|
||||
pthread_create(&mThread, NULL, touch_thread, this);
|
||||
}
|
||||
|
||||
WearSwipeDetector::~WearSwipeDetector() {
|
||||
}
|
||||
|
||||
void WearSwipeDetector::detect(int dx, int dy) {
|
||||
enum SwipeDirection direction;
|
||||
|
||||
if (abs(dy) < mLowThreshold && abs(dx) > mHighThreshold) {
|
||||
direction = dx < 0 ? LEFT : RIGHT;
|
||||
} else if (abs(dx) < mLowThreshold && abs(dy) > mHighThreshold) {
|
||||
direction = dy < 0 ? UP : DOWN;
|
||||
} else {
|
||||
LOG(DEBUG) << "Ignore " << dx << " " << dy;
|
||||
return;
|
||||
}
|
||||
|
||||
LOG(DEBUG) << "Swipe direction=" << direction;
|
||||
mCallback(mCookie, direction);
|
||||
}
|
||||
|
||||
void WearSwipeDetector::process(struct input_event *event) {
|
||||
if (mCurrentSlot < 0) {
|
||||
mCallback(mCookie, UP);
|
||||
mCurrentSlot = 0;
|
||||
}
|
||||
|
||||
if (event->type == EV_ABS) {
|
||||
if (event->code == ABS_MT_SLOT)
|
||||
mCurrentSlot = event->value;
|
||||
|
||||
// Ignore other fingers
|
||||
if (mCurrentSlot > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event->code) {
|
||||
case ABS_MT_POSITION_X:
|
||||
mX = event->value;
|
||||
mFingerDown = true;
|
||||
break;
|
||||
|
||||
case ABS_MT_POSITION_Y:
|
||||
mY = event->value;
|
||||
mFingerDown = true;
|
||||
break;
|
||||
|
||||
case ABS_MT_TRACKING_ID:
|
||||
if (event->value < 0)
|
||||
mFingerDown = false;
|
||||
break;
|
||||
}
|
||||
} else if (event->type == EV_SYN) {
|
||||
if (event->code == SYN_REPORT) {
|
||||
if (mFingerDown && !mSwiping) {
|
||||
mStartX = mX;
|
||||
mStartY = mY;
|
||||
mSwiping = true;
|
||||
} else if (!mFingerDown && mSwiping) {
|
||||
mSwiping = false;
|
||||
detect(mX - mStartX, mY - mStartY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WearSwipeDetector::run() {
|
||||
int fd = findDevice(DEVICE_PATH);
|
||||
if (fd < 0) {
|
||||
LOG(ERROR) << "no input devices found";
|
||||
return;
|
||||
}
|
||||
|
||||
struct input_event event;
|
||||
while (read(fd, &event, sizeof(event)) == sizeof(event)) {
|
||||
process(&event);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
void* WearSwipeDetector::touch_thread(void* cookie) {
|
||||
(static_cast<WearSwipeDetector*>(cookie))->run();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define test_bit(bit, array) ((array)[(bit)/8] & (1<<((bit)%8)))
|
||||
|
||||
int WearSwipeDetector::openDevice(const char *device) {
|
||||
int fd = open(device, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
PLOG(ERROR) << "could not open " << device;
|
||||
return false;
|
||||
}
|
||||
|
||||
char name[80];
|
||||
name[sizeof(name) - 1] = '\0';
|
||||
if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
|
||||
PLOG(ERROR) << "could not get device name for " << device;
|
||||
name[0] = '\0';
|
||||
}
|
||||
|
||||
uint8_t bits[512];
|
||||
memset(bits, 0, sizeof(bits));
|
||||
int ret = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bits)), bits);
|
||||
if (ret > 0) {
|
||||
if (test_bit(ABS_MT_POSITION_X, bits) && test_bit(ABS_MT_POSITION_Y, bits)) {
|
||||
LOG(DEBUG) << "Found " << device << " " << name;
|
||||
return fd;
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int WearSwipeDetector::findDevice(const char* path) {
|
||||
DIR* dir = opendir(path);
|
||||
if (dir == NULL) {
|
||||
PLOG(ERROR) << "Could not open directory " << path;
|
||||
return false;
|
||||
}
|
||||
|
||||
struct dirent* entry;
|
||||
int ret = -1;
|
||||
while (ret < 0 && (entry = readdir(dir)) != NULL) {
|
||||
if (entry->d_name[0] == '.') continue;
|
||||
|
||||
char device[PATH_MAX];
|
||||
device[PATH_MAX-1] = '\0';
|
||||
snprintf(device, PATH_MAX-1, "%s/%s", path, entry->d_name);
|
||||
|
||||
ret = openDevice(device);
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef __WEAR_TOUCH_H
|
||||
#define __WEAR_TOUCH_H
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
class WearSwipeDetector {
|
||||
|
||||
public:
|
||||
enum SwipeDirection { UP, DOWN, RIGHT, LEFT };
|
||||
typedef void (*OnSwipeCallback)(void* cookie, enum SwipeDirection direction);
|
||||
|
||||
WearSwipeDetector(int low, int high, OnSwipeCallback cb, void* cookie);
|
||||
~WearSwipeDetector();
|
||||
|
||||
private:
|
||||
void run();
|
||||
void process(struct input_event *event);
|
||||
void detect(int dx, int dy);
|
||||
|
||||
pthread_t mThread;
|
||||
static void* touch_thread(void* cookie);
|
||||
|
||||
int findDevice(const char* path);
|
||||
int openDevice(const char* device);
|
||||
|
||||
int mLowThreshold;
|
||||
int mHighThreshold;
|
||||
|
||||
OnSwipeCallback mCallback;
|
||||
void *mCookie;
|
||||
|
||||
int mX;
|
||||
int mY;
|
||||
int mStartX;
|
||||
int mStartY;
|
||||
|
||||
int mCurrentSlot;
|
||||
bool mFingerDown;
|
||||
bool mSwiping;
|
||||
};
|
||||
|
||||
#endif // __WEAR_TOUCH_H
|
||||
+15
-9
@@ -51,10 +51,16 @@ static double now() {
|
||||
}
|
||||
|
||||
WearRecoveryUI::WearRecoveryUI()
|
||||
: progress_bar_y(259), outer_height(0), outer_width(0), menu_unusable_rows(0) {
|
||||
: kProgressBarBaseline(RECOVERY_UI_PROGRESS_BAR_BASELINE),
|
||||
kMenuUnusableRows(RECOVERY_UI_MENU_UNUSABLE_ROWS) {
|
||||
// TODO: kMenuUnusableRows should be computed based on the lines in draw_screen_locked().
|
||||
|
||||
// TODO: The following three variables are likely not needed. The first two are detected
|
||||
// automatically in ScreenRecoveryUI::LoadAnimation(), based on the actual files seen on device.
|
||||
intro_frames = 22;
|
||||
loop_frames = 60;
|
||||
animation_fps = 30;
|
||||
|
||||
touch_screen_allowed_ = true;
|
||||
|
||||
for (size_t i = 0; i < 5; i++) backgroundIcon[i] = NULL;
|
||||
|
||||
@@ -62,7 +68,7 @@ WearRecoveryUI::WearRecoveryUI()
|
||||
}
|
||||
|
||||
int WearRecoveryUI::GetProgressBaseline() const {
|
||||
return progress_bar_y;
|
||||
return kProgressBarBaseline;
|
||||
}
|
||||
|
||||
// Draw background frame on the screen. Does not flip pages.
|
||||
@@ -113,8 +119,8 @@ void WearRecoveryUI::draw_screen_locked() {
|
||||
SetColor(TEXT_FILL);
|
||||
gr_fill(0, 0, gr_fb_width(), gr_fb_height());
|
||||
|
||||
int y = outer_height;
|
||||
int x = outer_width;
|
||||
int y = kMarginHeight;
|
||||
int x = kMarginWidth;
|
||||
if (show_menu) {
|
||||
std::string recovery_fingerprint =
|
||||
android::base::GetProperty("ro.bootimage.build.fingerprint", "");
|
||||
@@ -170,7 +176,7 @@ void WearRecoveryUI::draw_screen_locked() {
|
||||
int ty;
|
||||
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_;
|
||||
for (int ty = gr_fb_height() - char_height_ - kMarginHeight; ty > y + 2 && count < text_rows_;
|
||||
ty -= char_height_, ++count) {
|
||||
gr_text(gr_sys_font(), x + 4, ty, text_[row], 0);
|
||||
--row;
|
||||
@@ -190,12 +196,12 @@ bool WearRecoveryUI::InitTextParams() {
|
||||
return false;
|
||||
}
|
||||
|
||||
text_cols_ = (gr_fb_width() - (outer_width * 2)) / char_width_;
|
||||
text_cols_ = (gr_fb_width() - (kMarginWidth * 2)) / char_width_;
|
||||
|
||||
if (text_rows_ > kMaxRows) text_rows_ = kMaxRows;
|
||||
if (text_cols_ > kMaxCols) text_cols_ = kMaxCols;
|
||||
|
||||
visible_text_rows = (gr_fb_height() - (outer_height * 2)) / char_height_;
|
||||
visible_text_rows = (gr_fb_height() - (kMarginHeight * 2)) / char_height_;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -263,7 +269,7 @@ void WearRecoveryUI::StartMenu(const char* const* headers, const char* const* it
|
||||
show_menu = true;
|
||||
menu_sel = initial_selection;
|
||||
menu_start = 0;
|
||||
menu_end = visible_text_rows - 1 - menu_unusable_rows;
|
||||
menu_end = visible_text_rows - 1 - kMenuUnusableRows;
|
||||
if (menu_items <= menu_end) menu_end = menu_items;
|
||||
update_screen_locked();
|
||||
}
|
||||
|
||||
@@ -42,14 +42,11 @@ class WearRecoveryUI : public ScreenRecoveryUI {
|
||||
|
||||
protected:
|
||||
// progress bar vertical position, it's centered horizontally
|
||||
int progress_bar_y;
|
||||
|
||||
// outer of window
|
||||
int outer_height, outer_width;
|
||||
const int kProgressBarBaseline;
|
||||
|
||||
// Unusable rows when displaying the recovery menu, including the lines for headers (Android
|
||||
// Recovery, build id and etc) and the bottom lines that may otherwise go out of the screen.
|
||||
int menu_unusable_rows;
|
||||
const int kMenuUnusableRows;
|
||||
|
||||
int GetProgressBaseline() const override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user