RootInstaller: multiple apks
This commit is contained in:
		
							parent
							
								
									588e22462b
								
							
						
					
					
						commit
						b3ca915459
					
				| @ -20,6 +20,7 @@ | ||||
| package org.fdroid.fdroid.installer; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.fdroid.fdroid.Preferences; | ||||
| 
 | ||||
| @ -74,12 +75,11 @@ abstract public class Installer { | ||||
|      */ | ||||
|     public interface InstallerCallback { | ||||
| 
 | ||||
|         public static final int OPERATION_GENERIC_ERROR = 0; | ||||
|         public static final int OPERATION_INSTALL = 1; | ||||
|         public static final int OPERATION_DELETE = 2; | ||||
| 
 | ||||
|         public void onSuccess(int operation, boolean unattended); | ||||
|          | ||||
| 
 | ||||
|         public void onError(int operation, boolean unattended, String reason); | ||||
|     } | ||||
| 
 | ||||
| @ -186,6 +186,18 @@ abstract public class Installer { | ||||
|         // extended class now actually installs the package | ||||
|     } | ||||
| 
 | ||||
|     public void installPackage(List<File> apkFiles) throws AndroidNotCompatibleException { | ||||
|         // check if files exist... | ||||
|         for (File apkFile : apkFiles) { | ||||
|             if (!apkFile.exists()) { | ||||
|                 Log.d(TAG, "Couldn't find file " + apkFile + " to install."); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // extended class now actually installs the package | ||||
|     } | ||||
| 
 | ||||
|     public void deletePackage(String packageName) throws AndroidNotCompatibleException { | ||||
|         // check if package exists before proceeding... | ||||
|         try { | ||||
|  | ||||
| @ -20,6 +20,7 @@ | ||||
| package org.fdroid.fdroid.installer; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import eu.chainfire.libsuperuser.Shell; | ||||
| @ -39,17 +40,21 @@ public class RootInstaller extends Installer { | ||||
|         super(context, pm, callback); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void installPackage(final File apkFile) throws AndroidNotCompatibleException { | ||||
|         super.installPackage(apkFile); | ||||
| 
 | ||||
|     private Shell.Builder createShellBuilder() { | ||||
|         Shell.Builder shellBuilder = new Shell.Builder() | ||||
|                 .useSU() | ||||
|                 .setWantSTDERR(true) | ||||
|                 .setWatchdogTimeout(5) | ||||
|                 .setMinimalLogging(true); | ||||
| 
 | ||||
|         rootSession = shellBuilder.open(new Shell.OnCommandResultListener() { | ||||
|         return shellBuilder; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void installPackage(final File apkFile) throws AndroidNotCompatibleException { | ||||
|         super.installPackage(apkFile); | ||||
| 
 | ||||
|         rootSession = createShellBuilder().open(new Shell.OnCommandResultListener() { | ||||
| 
 | ||||
|             // Callback to report whether the shell was successfully | ||||
|             // started up | ||||
| @ -63,11 +68,37 @@ public class RootInstaller extends Installer { | ||||
|                     // Shell.OnCommandResultListener.SHELL_EXEC_FAILED | ||||
| 
 | ||||
|                     // TODO | ||||
|                     mCallback.onError(InstallerCallback.OPERATION_GENERIC_ERROR, true, | ||||
|                     mCallback.onError(InstallerCallback.OPERATION_INSTALL, true, | ||||
|                             "Error opening root shell with exitCode " + exitCode); | ||||
|                 } else { | ||||
|                     // Shell is up: send our first request | ||||
|                     sendInstallCommand(apkFile); | ||||
|                     addInstallCommand(apkFile); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void installPackage(final List<File> apkFiles) throws AndroidNotCompatibleException { | ||||
|         super.installPackage(apkFiles); | ||||
| 
 | ||||
|         rootSession = createShellBuilder().open(new Shell.OnCommandResultListener() { | ||||
| 
 | ||||
|             // Callback to report whether the shell was successfully | ||||
|             // started up | ||||
|             @Override | ||||
|             public void onCommandResult(int commandCode, int exitCode, List<String> output) { | ||||
|                 if (exitCode != Shell.OnCommandResultListener.SHELL_RUNNING) { | ||||
|                     // TODO | ||||
|                     // wrong uid | ||||
|                     // Shell.OnCommandResultListener.SHELL_WRONG_UID | ||||
|                     // exec failed | ||||
|                     // Shell.OnCommandResultListener.SHELL_EXEC_FAILED | ||||
| 
 | ||||
|                     // TODO | ||||
|                     mCallback.onError(InstallerCallback.OPERATION_INSTALL, true, | ||||
|                             "Error opening root shell with exitCode " + exitCode); | ||||
|                 } else { | ||||
|                     addInstallCommand(apkFiles); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
| @ -77,13 +108,7 @@ public class RootInstaller extends Installer { | ||||
|     public void deletePackage(final String packageName) throws AndroidNotCompatibleException { | ||||
|         super.deletePackage(packageName); | ||||
| 
 | ||||
|         Shell.Builder shellBuilder = new Shell.Builder() | ||||
|                 .useSU() | ||||
|                 .setWantSTDERR(true) | ||||
|                 .setWatchdogTimeout(5) | ||||
|                 .setMinimalLogging(true); | ||||
| 
 | ||||
|         rootSession = shellBuilder.open(new Shell.OnCommandResultListener() { | ||||
|         rootSession = createShellBuilder().open(new Shell.OnCommandResultListener() { | ||||
| 
 | ||||
|             // Callback to report whether the shell was successfully | ||||
|             // started up | ||||
| @ -97,11 +122,10 @@ public class RootInstaller extends Installer { | ||||
|                     // Shell.OnCommandResultListener.SHELL_EXEC_FAILED | ||||
| 
 | ||||
|                     // TODO | ||||
|                     mCallback.onError(InstallerCallback.OPERATION_GENERIC_ERROR, true, | ||||
|                     mCallback.onError(InstallerCallback.OPERATION_DELETE, true, | ||||
|                             "Error opening root shell with exitCode " + exitCode); | ||||
|                 } else { | ||||
|                     // Shell is up: send our first request | ||||
|                     sendDeleteCommand(packageName); | ||||
|                     addDeleteCommand(packageName); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
| @ -114,7 +138,48 @@ public class RootInstaller extends Installer { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     private void sendInstallCommand(File apkFile) { | ||||
|     private void addInstallCommand(List<File> apkFiles) { | ||||
|         ArrayList<String> commands = new ArrayList<String>(); | ||||
|         String pm = "pm install -r "; | ||||
|         for (File apkFile : apkFiles) { | ||||
|             commands.add(pm + apkFile.getAbsolutePath()); | ||||
|         } | ||||
| 
 | ||||
|         rootSession.addCommand(commands, 0, | ||||
|                 new Shell.OnCommandResultListener() { | ||||
|                     public void onCommandResult(int commandCode, int exitCode, | ||||
|                             List<String> output) { | ||||
|                         // close su shell | ||||
|                         rootSession.close(); | ||||
| 
 | ||||
|                         if (exitCode < 0) { | ||||
|                             // TODO | ||||
|                             mCallback.onError(InstallerCallback.OPERATION_INSTALL, true, | ||||
|                                     "Install failed with exit code " + exitCode); | ||||
|                         } else { | ||||
|                             // wait until Android's internal PackageManger | ||||
|                             // has received the new package state | ||||
|                             Thread wait = new Thread(new Runnable() { | ||||
|                                 @Override | ||||
|                                 public void run() { | ||||
|                                     try { | ||||
|                                         Thread.sleep(2000); | ||||
|                                     } catch (InterruptedException e) { | ||||
|                                     } | ||||
| 
 | ||||
|                                     mCallback.onSuccess( | ||||
|                                             InstallerCallback.OPERATION_INSTALL, | ||||
|                                             true); | ||||
|                                 } | ||||
|                             }); | ||||
|                             wait.start(); | ||||
|                         } | ||||
|                     } | ||||
|                 }); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private void addInstallCommand(File apkFile) { | ||||
|         rootSession.addCommand("pm install -r " + apkFile.getAbsolutePath(), 0, | ||||
|                 new Shell.OnCommandResultListener() { | ||||
|                     public void onCommandResult(int commandCode, int exitCode, List<String> output) { | ||||
| @ -145,7 +210,7 @@ public class RootInstaller extends Installer { | ||||
|                 }); | ||||
|     } | ||||
| 
 | ||||
|     private void sendDeleteCommand(String packageName) { | ||||
|     private void addDeleteCommand(String packageName) { | ||||
|         rootSession.addCommand("pm uninstall " + packageName, 0, | ||||
|                 new Shell.OnCommandResultListener() { | ||||
|                     public void onCommandResult(int commandCode, int exitCode, List<String> output) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dominik Schürmann
						Dominik Schürmann