33import android .app .Activity ;
44import android .content .Intent ;
55import android .view .Menu ;
6- import android .view .MenuItem ;
76import android .widget .Toast ;
87
98import com .wmods .wppenhacer .xposed .core .Feature ;
9+ import com .wmods .wppenhacer .xposed .core .components .AlertDialogWpp ;
1010import com .wmods .wppenhacer .xposed .core .devkit .Unobfuscator ;
11+ import com .wmods .wppenhacer .xposed .utils .ResId ;
1112import com .wmods .wppenhacer .xposed .utils .Utils ;
1213
14+ import org .luckypray .dexkit .query .enums .StringMatchType ;
15+
1316import de .robv .android .xposed .XC_MethodHook ;
1417import de .robv .android .xposed .XSharedPreferences ;
1518import de .robv .android .xposed .XposedBridge ;
16- import de .robv .android .xposed .XposedHelpers ;
1719
1820public class BackupRestore extends Feature {
1921
@@ -30,39 +32,39 @@ public String getPluginName() {
3032 public void doHook () throws Exception {
3133 if (!prefs .getBoolean ("force_restore_backup_feature" , false )) return ;
3234
33- Class <?> settingsDriveClass = Unobfuscator .loadSettingsGoogleDriveActivity (classLoader );
34-
35- XposedHelpers . findAndHookMethod ( settingsDriveClass , "onPrepareOptionsMenu" , Menu . class , new XC_MethodHook () {
35+ var restoreFromBackupClass = Unobfuscator .findFirstClassUsingName (classLoader , StringMatchType . EndsWith , "RestoreFromBackupActivity" );
36+
37+ XposedBridge . hookAllMethods ( Activity . class , "onPrepareOptionsMenu" , new XC_MethodHook () {
3638 @ Override
3739 protected void afterHookedMethod (MethodHookParam param ) throws Throwable {
40+ var name = param .thisObject .getClass ().getSimpleName ().toLowerCase ();
41+ if (!(name .contains ("drive" ) && name .contains ("google" ))) return ;
3842 Menu menu = (Menu ) param .args [0 ];
39- // Hardcoding string to ensure it appears without resource injection issues
40- String title = "Force Restore Backup (Experimental)" ;
41-
42- // Use a high ID to avoid conflicts
43- if (menu .findItem (10001 ) == null ) {
44- menu .add (0 , 10001 , 0 , title );
45- }
46- }
47- });
43+ if (menu .findItem (10001 ) != null ) return ;
44+ var menuItem = menu .add (0 , 10001 , 0 , ResId .string .force_restore_backup_experimental );
45+ Activity activity = (Activity ) param .thisObject ;
46+ menuItem .setOnMenuItemClickListener ((item ) -> {
47+ new AlertDialogWpp (activity )
48+ .setTitle (ResId .string .force_restore_backup )
49+ .setMessage (activity .getString (ResId .string .warning_restore ))
50+ .setPositiveButton (activity .getString (ResId .string .yes ), (dialog , which ) -> {
51+ try {
52+ Intent intent = new Intent (activity , restoreFromBackupClass );
53+ intent .setAction ("action_show_restore_one_time_setup" );
54+ activity .startActivityForResult (intent , 10001 );
55+ } catch (Exception e ) {
56+ XposedBridge .log (e );
57+ Utils .showToast ("Error launching restore activity: " + e .getMessage (), Toast .LENGTH_LONG );
58+ }
59+ })
60+ .setNegativeButton (activity .getString (ResId .string .no ), null )
61+ .show ();
62+
63+ return true ;
64+ });
4865
49- XposedHelpers .findAndHookMethod (settingsDriveClass , "onOptionsItemSelected" , MenuItem .class , new XC_MethodHook () {
50- @ Override
51- protected void beforeHookedMethod (MethodHookParam param ) throws Throwable {
52- MenuItem item = (MenuItem ) param .args [0 ];
53- if (item .getItemId () == 10001 ) {
54- Activity activity = (Activity ) param .thisObject ;
55- try {
56- Class <?> restoreClass = Unobfuscator .loadRestoreBackupActivity (classLoader );
57- Intent intent = new Intent (activity , restoreClass );
58- activity .startActivity (intent );
59- param .setResult (true );
60- } catch (Exception e ) {
61- Utils .showToast ("Error launching restore activity: " + e .getMessage (), Toast .LENGTH_LONG );
62- XposedBridge .log (e );
63- }
64- }
6566 }
6667 });
68+
6769 }
6870}
0 commit comments