Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dac24865 authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Factor out the "yes/no" menu and use it for "Wipe cache" too."

parents 43b80810 30694c9e
Loading
Loading
Loading
Loading
+35 −60
Original line number Diff line number Diff line
@@ -502,8 +502,7 @@ erase_volume(const char *volume) {
    return result;
}

static const char**
prepend_title(const char* const* headers) {
static const char** prepend_title(const char* const* headers) {
    // count the number of lines in our title, plus the
    // caller-provided headers.
    int count = 3;   // our title has 3 lines
@@ -578,24 +577,15 @@ static int compare_string(const void* a, const void* b) {
}

// Returns a malloc'd path, or NULL.
static char*
browse_directory(const char* path, Device* device) {
static char* browse_directory(const char* path, Device* device) {
    ensure_path_mounted(path);

    const char* MENU_HEADERS[] = { "Choose a package to install:",
                                   path,
                                   "",
                                   NULL };
    DIR* d;
    struct dirent* de;
    d = opendir(path);
    DIR* d = opendir(path);
    if (d == NULL) {
        LOGE("error opening %s: %s\n", path, strerror(errno));
        return NULL;
    }

    const char** headers = prepend_title(MENU_HEADERS);

    int d_size = 0;
    int d_alloc = 10;
    char** dirs = (char**)malloc(d_alloc * sizeof(char*));
@@ -604,6 +594,7 @@ browse_directory(const char* path, Device* device) {
    char** zips = (char**)malloc(z_alloc * sizeof(char*));
    zips[0] = strdup("../");

    struct dirent* de;
    while ((de = readdir(d)) != NULL) {
        int name_len = strlen(de->d_name);

@@ -647,6 +638,8 @@ browse_directory(const char* path, Device* device) {
    z_size += d_size;
    zips[z_size] = NULL;

    const char* headers[] = { "Choose a package to install:", path, "", NULL };

    char* result;
    int chosen_item = 0;
    while (true) {
@@ -677,44 +670,23 @@ browse_directory(const char* path, Device* device) {
        }
    }

    int i;
    for (i = 0; i < z_size; ++i) free(zips[i]);
    for (int i = 0; i < z_size; ++i) free(zips[i]);
    free(zips);
    free(headers);

    return result;
}

static void
wipe_data(int confirm, Device* device) {
    if (confirm) {
        static const char** title_headers = NULL;
static bool yes_no(Device* device, const char* question1, const char* question2) {
    const char* headers[] = { question1, question2, "", NULL };
    const char* items[] = { " No", " Yes", NULL };

        if (title_headers == NULL) {
            const char* headers[] = { "Confirm wipe of all user data?",
                                      "  THIS CAN NOT BE UNDONE.",
                                      "",
                                      NULL };
            title_headers = prepend_title((const char**)headers);
        }

        const char* items[] = { " No",
                                " No",
                                " No",
                                " No",
                                " No",
                                " No",
                                " No",
                                " Yes -- delete all user data",   // [7]
                                " No",
                                " No",
                                " No",
                                NULL };

        int chosen_item = get_menu_selection(title_headers, items, 1, 0, device);
        if (chosen_item != 7) {
            return;
    int chosen_item = get_menu_selection(headers, items, 1, 0, device);
    return (chosen_item == 1);
}

static void wipe_data(int confirm, Device* device) {
    if (confirm && !yes_no(device, "Wipe all user data?", "  THIS CAN NOT BE UNDONE!")) {
        return;
    }

    ui->Print("\n-- Wiping data...\n");
@@ -725,6 +697,16 @@ wipe_data(int confirm, Device* device) {
    ui->Print("Data wipe complete.\n");
}

static void wipe_cache(bool should_confirm, Device* device) {
    if (should_confirm && !yes_no(device, "Wipe cache?", "  THIS CAN NOT BE UNDONE!")) {
        return;
    }

    ui->Print("\n-- Wiping cache...\n");
    erase_volume("/cache");
    ui->Print("Cache wipe complete.\n");
}

static void file_to_ui(const char* fn) {
    FILE *fp = fopen_path(fn, "re");
    if (fp == NULL) {
@@ -782,9 +764,6 @@ static void choose_recovery_file(Device* device) {
    unsigned int n;
    static const char** title_headers = NULL;
    char *filename;
    const char* headers[] = { "Select file to view",
                              "",
                              NULL };
    // "Go back" + LAST_KMSG_FILE + KEEP_LOG_COUNT + terminating NULL entry
    char* entries[KEEP_LOG_COUNT + 3];
    memset(entries, 0, sizeof(entries));
@@ -812,10 +791,10 @@ static void choose_recovery_file(Device* device) {
        entries[n++] = filename;
    }

    title_headers = prepend_title((const char**)headers);
    const char* headers[] = { "Select file to view", "", NULL };

    while(1) {
        int chosen_item = get_menu_selection(title_headers, entries, 1, 0, device);
        int chosen_item = get_menu_selection(headers, entries, 1, 0, device);
        if (chosen_item == 0) break;
        file_to_ui(entries[chosen_item]);
    }
@@ -878,7 +857,7 @@ prompt_and_wait(Device* device, int status) {
        // statement below.
        Device::BuiltinAction chosen_action = device->InvokeMenuItem(chosen_item);

        bool wipe_cache = false;
        bool should_wipe_cache = false;
        switch (chosen_action) {
            case Device::NO_ACTION:
                break;
@@ -894,9 +873,7 @@ prompt_and_wait(Device* device, int status) {
                break;

            case Device::WIPE_CACHE:
                ui->Print("\n-- Wiping cache...\n");
                erase_volume("/cache");
                ui->Print("Cache wipe complete.\n");
                wipe_cache(ui->IsTextVisible(), device);
                if (!ui->IsTextVisible()) return Device::NO_ACTION;
                break;

@@ -905,15 +882,13 @@ prompt_and_wait(Device* device, int status) {
                {
                    bool adb = (chosen_action == Device::APPLY_ADB_SIDELOAD);
                    if (adb) {
                        status = apply_from_adb(ui, &wipe_cache, TEMPORARY_INSTALL_FILE);
                        status = apply_from_adb(ui, &should_wipe_cache, TEMPORARY_INSTALL_FILE);
                    } else {
                        status = apply_from_sdcard(device, &wipe_cache);
                        status = apply_from_sdcard(device, &should_wipe_cache);
                    }

                    if (status == INSTALL_SUCCESS && wipe_cache) {
                        ui->Print("\n-- Wiping cache (at package request)...\n");
                        bool okay = erase_volume("/cache");
                        ui->Print("Cache wipe %s.\n", okay ? "succeeded" : "failed");
                    if (status == INSTALL_SUCCESS && should_wipe_cache) {
                        wipe_cache(false, device);
                    }

                    if (status >= 0) {