Skip to content

Commit f22e8cc

Browse files
committed
Normal File Manager + Multi-boot redesign(get rid of init_new)
1 parent 76fbd7c commit f22e8cc

File tree

4 files changed

+181
-46
lines changed

4 files changed

+181
-46
lines changed

default_recovery_ui.c

+3
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ int device_handle_key(int key_code, int visible) {
9292
case KEY_BACK:
9393
if (!get_allow_toggle_display())
9494
return GO_BACK;
95+
break;
96+
case KEY_MENU:
97+
return MENU_PRESSED;
9598
}
9699
}
97100

extendedcommands.c

+146-38
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,134 @@ char* choose_file_menu(const char* directory, const char* fileExtensionOrDirecto
313313
return return_value;
314314
}
315315

316+
char* choose_file_menu_(const char* directory, const char* fileExtensionOrDirectory, const char* headers[], int* isdir)
317+
{
318+
char path[PATH_MAX] = "";
319+
DIR *dir;
320+
struct dirent *de;
321+
int numFiles = 0;
322+
int numDirs = 0;
323+
int i;
324+
char* return_value = NULL;
325+
int dir_len = strlen(directory);
326+
char** files = !(*isdir) ? gather_files(directory, fileExtensionOrDirectory, &numFiles) : NULL;
327+
char** dirs = NULL;
328+
if (fileExtensionOrDirectory != NULL)
329+
dirs = gather_files(directory, NULL, &numDirs);
330+
int total = numDirs + numFiles;
331+
if (total == 0)
332+
{
333+
ui_print("No files found.\n");
334+
}
335+
else
336+
{
337+
char** list = (char**) malloc((total + 1) * sizeof(char*));
338+
list[total] = NULL;
339+
340+
341+
for (i = 0 ; i < numDirs; i++)
342+
{
343+
list[i] = strdup(dirs[i] + dir_len);
344+
}
345+
346+
for (i = 0 ; i < numFiles; i++)
347+
{
348+
list[numDirs + i] = strdup(files[i] + dir_len);
349+
}
350+
351+
for (;;)
352+
{
353+
// throw away keys pressed previously, so user doesn't
354+
// accidentally trigger menu items.
355+
ui_clear_key_queue();
356+
357+
int item_count = ui_start_menu(headers, list);
358+
int selected = 0;
359+
int chosen_item = -1;
360+
361+
int has_selection = 0;
362+
363+
while (chosen_item < 0 && chosen_item != GO_BACK && has_selection == 0) {
364+
//ui_menu_select(); //Why was this not here?!
365+
int key = ui_wait_key();
366+
int visible = ui_text_visible();
367+
368+
//ui_print("Key: %d\n",key);
369+
370+
int action = device_handle_key(key, visible);
371+
int old_selected = selected;
372+
373+
if (action < 0) {
374+
switch (action) {
375+
case SCROLL_LEFT:
376+
ui_menu_offset_dec();
377+
break;
378+
case SCROLL_RIGHT:
379+
ui_menu_offset_inc();
380+
break;
381+
case HIGHLIGHT_UP:
382+
--selected;
383+
selected = ui_menu_select(selected);
384+
break;
385+
case HIGHLIGHT_DOWN:
386+
++selected;
387+
selected = ui_menu_select(selected);
388+
break;
389+
case SELECT_ITEM:
390+
chosen_item = selected;
391+
if (ui_get_showing_back_button()) {
392+
if (chosen_item == item_count) {
393+
chosen_item = GO_BACK;
394+
}
395+
}
396+
break;
397+
case NO_ACTION:
398+
break;
399+
case GO_BACK:
400+
chosen_item = GO_BACK;
401+
break;
402+
case MENU_PRESSED:
403+
has_selection=1;
404+
chosen_item = selected;
405+
break;
406+
}
407+
}
408+
}
409+
if (chosen_item == GO_BACK)
410+
break;
411+
static char ret[PATH_MAX];
412+
if (chosen_item < numDirs)
413+
{
414+
if (has_selection) {
415+
has_selection=0;
416+
strcpy(ret, dirs[chosen_item]);
417+
return_value = ret;
418+
*isdir=1;
419+
LOGE("%s\n",ret);
420+
break;
421+
}
422+
char* subret = choose_file_menu_(dirs[chosen_item], fileExtensionOrDirectory, headers,isdir);
423+
if (subret != NULL)
424+
{
425+
strcpy(ret, subret);
426+
return_value = ret;
427+
break;
428+
}
429+
continue;
430+
}
431+
432+
strcpy(ret, files[chosen_item - numDirs]);
433+
return_value = ret;
434+
break;
435+
}
436+
free_string_array(list);
437+
}
438+
439+
if ( files != NULL ) free_string_array(files);
440+
free_string_array(dirs);
441+
return return_value;
442+
}
443+
316444

317445
void show_choose_zip_menu()
318446
{
@@ -2002,40 +2130,32 @@ void show_fs_menu()
20022130

20032131
void show_action_menu(char* cmd, int params, char* fileExtensionOrDirectory ) {
20042132
int i;
2133+
int isdir=0;
20052134
static char* headers[] =
2006-
{ " File manager","","Select source DIR/FILE:", NULL," File manager","","Select destination DIR/FILE:", NULL };
2007-
static char* head_[] = { " File manager",
2008-
"",
2009-
"Choose destination type:",
2010-
NULL
2011-
};
2012-
static char* list[] = { "FILE",
2013-
"DIR",
2014-
NULL
2015-
};
2135+
{ " File manager","","Select source DIR/FILE:","OK: Step into","Menu: Select", NULL," File manager","","Select destination DIR/FILE:","OK: Step into","Menu: Select", NULL };
20162136
char** files=malloc(sizeof(char*)*params);
20172137
for (i=0; i<params; ++i) {
2018-
char* temp=choose_file_menu("/", fileExtensionOrDirectory, headers+(i*4));
2138+
char* temp=choose_file_menu_("/", fileExtensionOrDirectory, headers+(i*6),&isdir);
20192139
if ( temp == NULL ) return;
20202140
files[i]=malloc((strlen(temp)+1)*sizeof(char));
20212141
strcpy(files[i],temp);
2022-
if ( i == 0 && fileExtensionOrDirectory != NULL && params > 1 ) {
2023-
int chosen_item=0;
2024-
for(;;) {
2025-
chosen_item = get_menu_selection(head_, list, 0);
2026-
if (chosen_item == GO_BACK ) return;
2027-
break;
2028-
}
2029-
if (chosen_item) fileExtensionOrDirectory = NULL;
2030-
}
20312142
}
20322143
char command[PATH_MAX];
2033-
if (params > 1)
2034-
sprintf(command,"%s %s %s",cmd,files[0],files[1]);
2144+
if (params > 1) {
2145+
if ( !strcmp(cmd,"mv -f") || !isdir )
2146+
sprintf(command,"%s %s %s",cmd,files[0],files[1]);
2147+
else if ( isdir )
2148+
sprintf(command,"%s %s %s %s",cmd,"-R",files[0],files[1]);
2149+
}
2150+
else if ( isdir )
2151+
sprintf(command,"%s %s %s",cmd,"-R",files[0]);
20352152
else
20362153
sprintf(command,"%s %s",cmd,files[0]);
2154+
ui_end_menu();
2155+
ui_print("Working...\nPlease wait...\n");
20372156
if (__system(command)) LOGE("%s\n",strerror(errno));
20382157
else ui_print("Success\n");
2158+
//LOGE("%s\n",command);
20392159

20402160
}
20412161

@@ -2048,12 +2168,9 @@ void show_file_manager() {
20482168
NULL
20492169
};
20502170

2051-
static char* list[] = { "COPY FILE",
2052-
"MOVE FILE",
2053-
"DELETE FILE",
2054-
"COPY DIR",
2055-
"MOVE DIR",
2056-
"DELETE DIR",
2171+
static char* list[] = { "COPY",
2172+
"MOVE",
2173+
"DELETE",
20572174
NULL
20582175
};
20592176
for(;;) {
@@ -2063,23 +2180,14 @@ void show_file_manager() {
20632180
switch (chosen_item)
20642181
{
20652182
case 0:
2066-
show_action_menu("cp -pf",2,"");
2183+
show_action_menu("cp -p -f",2,"");
20672184
break;
20682185
case 1:
20692186
show_action_menu("mv -f",2,"");
20702187
break;
20712188
case 2:
20722189
show_action_menu("rm -f",1,"");
20732190
break;
2074-
case 3:
2075-
show_action_menu("cp -Rpf",2,NULL);
2076-
break;
2077-
case 4:
2078-
show_action_menu("mv -f",2,NULL);
2079-
break;
2080-
case 5:
2081-
show_action_menu("rm -Rf",1,NULL);
2082-
break;
20832191
}
20842192
}
20852193
}

recovery.c

+31-8
Original file line numberDiff line numberDiff line change
@@ -366,11 +366,13 @@ get_menu_selection(char** headers, char** items, int menu_only) {
366366
// We can't rely on /cache or /sdcard since they may not be available.
367367
int wrap_count = 0;
368368

369-
while (chosen_item < 0 && chosen_item != GO_BACK) {
369+
while (chosen_item < 0 && chosen_item != GO_BACK && chosen_item != MENU_PRESSED) {
370370
//ui_menu_select(); //Why was this not here?!
371371
int key = ui_wait_key();
372372
int visible = ui_text_visible();
373373

374+
//ui_print("Key: %d\n",key);
375+
374376
int action = device_handle_key(key, visible);
375377
int old_selected = selected;
376378

@@ -563,12 +565,12 @@ void start_os() {
563565
FILE* f;
564566
int err;
565567

566-
file_name = malloc(60 * sizeof(char));
567-
strcpy(file_name,"/sdcard/");
568-
strcat(file_name,os);
569-
dir_name = malloc( (strlen(file_name)+1)*sizeof(char) );
570-
strcpy(dir_name,file_name);
571-
strcat(file_name,"/init.sh");
568+
file_name = malloc(60 * sizeof(char));
569+
strcpy(file_name,"/sdcard/");
570+
strcat(file_name,os);
571+
dir_name = malloc( (strlen(file_name)+1)*sizeof(char) );
572+
strcpy(dir_name,file_name);
573+
/*strcat(file_name,"/init.sh");
572574
573575
if ( ( f=fopen(file_name,"r") ) ) {
574576
fclose(f);
@@ -596,7 +598,28 @@ void start_os() {
596598
else {
597599
ui_print("\n%s not exists!\n",file_name);
598600
err=1;
599-
}
601+
}*/
602+
//New method
603+
if ( !ensure_root_path_mounted("DATA:") ) {
604+
if ( !ensure_root_path_mounted("SYSTEM:") ) {
605+
strcat(file_name,"/init.rc");
606+
if ( ( f=fopen(file_name,"r") ) ) {
607+
fclose(f);
608+
char cp_cmd[PATH_MAX];
609+
sprintf(cp_cmd,"cp %s %s %s",file_name,"/recovery.rc","/recovery_hardkey.rc"); //Our init looks for recovery.rc when calling init binary under recovery
610+
if ( !__system(cp_cmd) ) {
611+
ui_print("done\nBooting New OS..\nPlease wait...\n");
612+
ui_end_menu();
613+
finish_recovery(NULL);
614+
do_reboot=0;
615+
if ( __system("/init") ) {
616+
LOGE("Error booting system\n%s\n",strerror(errno));
617+
}
618+
} else LOGE("Can't copy init.rc\n%s\n",strerror(errno));
619+
} else LOGE("Can't open init.rc\n%s\n",strerror(errno));
620+
} else LOGE("Can't mount system image\n%s\n",strerror(errno));
621+
} else LOGE("Can't mount data image\n%s\n",strerror(errno));
622+
600623
free(dir_name);
601624
free(file_name);
602625
}

recovery_ui.h

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ int device_wipe_data();
6767
#define GO_BACK -5
6868
#define SCROLL_LEFT -6
6969
#define SCROLL_RIGHT -7
70+
#define MENU_PRESSED -8
7071

7172
#define ITEM_REBOOT 0
7273
#define ITEM_APPLY_SDCARD 1

0 commit comments

Comments
 (0)