diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails.java b/app/src/main/java/org/fdroid/fdroid/AppDetails.java index 99d8c6e01..f06c80995 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails.java @@ -87,7 +87,7 @@ import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.installer.Installer; -import org.fdroid.fdroid.installer.Installer.AndroidNotCompatibleException; +import org.fdroid.fdroid.installer.Installer.InstallFailedException; import org.fdroid.fdroid.installer.Installer.InstallerCallback; import org.fdroid.fdroid.net.ApkDownloader; import org.fdroid.fdroid.net.Downloader; @@ -501,11 +501,18 @@ public class AppDetails extends AppCompatActivity { } }; + /** + * Starts the install process one the download is complete. + */ private final BroadcastReceiver completeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { File localFile = new File(intent.getStringExtra(Downloader.EXTRA_DOWNLOAD_PATH)); - installApk(localFile); + try { + installer.installPackage(localFile, app.packageName); + } catch (InstallFailedException e) { + Log.e(TAG, "Android not compatible with this Installer!", e); + } cleanUpFinishedDownload(); } }; @@ -852,18 +859,10 @@ public class AppDetails extends AppCompatActivity { headerFragment.startProgress(); } - private void installApk(File file) { - try { - installer.installPackage(file, app.packageName); - } catch (AndroidNotCompatibleException e) { - Log.e(TAG, "Android not compatible with this Installer!", e); - } - } - public void removeApk(String packageName) { try { installer.deletePackage(packageName); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { Log.e(TAG, "Android not compatible with this Installer!", e); } } diff --git a/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java b/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java index 34c214a88..a6fa2b9be 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java @@ -39,7 +39,7 @@ public class DefaultInstaller extends Installer { private final Activity mActivity; public DefaultInstaller(Activity activity, PackageManager pm, InstallerCallback callback) - throws AndroidNotCompatibleException { + throws InstallFailedException { super(activity, pm, callback); this.mActivity = activity; } @@ -48,7 +48,7 @@ public class DefaultInstaller extends Installer { private static final int REQUEST_CODE_DELETE = 1; @Override - protected void installPackageInternal(File apkFile) throws AndroidNotCompatibleException { + protected void installPackageInternal(File apkFile) throws InstallFailedException { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(apkFile), @@ -56,12 +56,12 @@ public class DefaultInstaller extends Installer { try { mActivity.startActivityForResult(intent, REQUEST_CODE_INSTALL); } catch (ActivityNotFoundException e) { - throw new AndroidNotCompatibleException(e); + throw new InstallFailedException(e); } } @Override - protected void deletePackageInternal(String packageName) throws AndroidNotCompatibleException { + protected void deletePackageInternal(String packageName) throws InstallFailedException { try { PackageInfo pkgInfo = mPm.getPackageInfo(packageName, 0); @@ -70,7 +70,7 @@ public class DefaultInstaller extends Installer { try { mActivity.startActivityForResult(intent, REQUEST_CODE_DELETE); } catch (ActivityNotFoundException e) { - throw new AndroidNotCompatibleException(e); + throw new InstallFailedException(e); } } catch (PackageManager.NameNotFoundException e) { // already checked in super class diff --git a/app/src/main/java/org/fdroid/fdroid/installer/DefaultSdk14Installer.java b/app/src/main/java/org/fdroid/fdroid/installer/DefaultSdk14Installer.java index 6f4d18f4d..c0b1d09d0 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/DefaultSdk14Installer.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/DefaultSdk14Installer.java @@ -42,7 +42,7 @@ public class DefaultSdk14Installer extends Installer { private final Activity mActivity; public DefaultSdk14Installer(Activity activity, PackageManager pm, InstallerCallback callback) - throws AndroidNotCompatibleException { + throws InstallFailedException { super(activity, pm, callback); this.mActivity = activity; } @@ -52,7 +52,7 @@ public class DefaultSdk14Installer extends Installer { @SuppressWarnings("deprecation") @Override - protected void installPackageInternal(File apkFile) throws AndroidNotCompatibleException { + protected void installPackageInternal(File apkFile) throws InstallFailedException { Intent intent = new Intent(); intent.setAction(Intent.ACTION_INSTALL_PACKAGE); intent.setData(Uri.fromFile(apkFile)); @@ -68,12 +68,12 @@ public class DefaultSdk14Installer extends Installer { try { mActivity.startActivityForResult(intent, REQUEST_CODE_INSTALL); } catch (ActivityNotFoundException e) { - throw new AndroidNotCompatibleException(e); + throw new InstallFailedException(e); } } @Override - protected void deletePackageInternal(String packageName) throws AndroidNotCompatibleException { + protected void deletePackageInternal(String packageName) throws InstallFailedException { try { PackageInfo pkgInfo = mPm.getPackageInfo(packageName, 0); @@ -83,7 +83,7 @@ public class DefaultSdk14Installer extends Installer { try { mActivity.startActivityForResult(intent, REQUEST_CODE_DELETE); } catch (ActivityNotFoundException e) { - throw new AndroidNotCompatibleException(e); + throw new InstallFailedException(e); } } catch (PackageManager.NameNotFoundException e) { // already checked in super class diff --git a/app/src/main/java/org/fdroid/fdroid/installer/Installer.java b/app/src/main/java/org/fdroid/fdroid/installer/Installer.java index 5eeb5d997..9517c6d78 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/Installer.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/Installer.java @@ -49,11 +49,15 @@ public abstract class Installer { * RootInstaller or due to an incompatible Android version in case of * SystemPermissionInstaller */ - public static class AndroidNotCompatibleException extends Exception { + public static class InstallFailedException extends Exception { private static final long serialVersionUID = -8343133906463328027L; - public AndroidNotCompatibleException(Throwable cause) { + public InstallFailedException(String message) { + super(message); + } + + public InstallFailedException(Throwable cause) { super(cause); } } @@ -78,7 +82,7 @@ public abstract class Installer { } Installer(Context context, PackageManager pm, InstallerCallback callback) - throws AndroidNotCompatibleException { + throws InstallFailedException { this.mContext = context; this.mPm = pm; this.mCallback = callback; @@ -104,7 +108,7 @@ public abstract class Installer { try { return new PrivilegedInstaller(activity, pm, callback); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { Log.e(TAG, "Android not compatible with SystemInstaller!", e); } } else { @@ -119,7 +123,7 @@ public abstract class Installer { Utils.debugLog(TAG, "try default installer for Android >= 4"); return new DefaultSdk14Installer(activity, pm, callback); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { Log.e(TAG, "Android not compatible with DefaultInstallerSdk14!", e); } } else { @@ -128,7 +132,7 @@ public abstract class Installer { Utils.debugLog(TAG, "try default installer for Android < 4"); return new DefaultInstaller(activity, pm, callback); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { Log.e(TAG, "Android not compatible with DefaultInstaller!", e); } } @@ -137,7 +141,7 @@ public abstract class Installer { return null; } - public void installPackage(File apkFile, String packageName) throws AndroidNotCompatibleException { + public void installPackage(File apkFile, String packageName) throws InstallFailedException { // check if file exists... if (!apkFile.exists()) { Log.e(TAG, "Couldn't find file " + apkFile + " to install."); @@ -172,7 +176,7 @@ public abstract class Installer { installPackageInternal(apkFile); } - public void deletePackage(String packageName) throws AndroidNotCompatibleException { + public void deletePackage(String packageName) throws InstallFailedException { // check if package exists before proceeding... try { mPm.getPackageInfo(packageName, 0); @@ -201,10 +205,10 @@ public abstract class Installer { } protected abstract void installPackageInternal(File apkFile) - throws AndroidNotCompatibleException; + throws InstallFailedException; protected abstract void deletePackageInternal(String packageName) - throws AndroidNotCompatibleException; + throws InstallFailedException; public abstract boolean handleOnActivityResult(int requestCode, int resultCode, Intent data); } diff --git a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java index 887115124..ed9419d4c 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java @@ -86,7 +86,7 @@ public class PrivilegedInstaller extends Installer { public static final int IS_EXTENSION_INSTALLED_PERMISSIONS_PROBLEM = 3; public PrivilegedInstaller(Activity activity, PackageManager pm, - InstallerCallback callback) throws AndroidNotCompatibleException { + InstallerCallback callback) throws InstallFailedException { super(activity, pm, callback); this.mActivity = activity; } @@ -156,7 +156,7 @@ public class PrivilegedInstaller extends Installer { } @Override - protected void installPackageInternal(File apkFile) throws AndroidNotCompatibleException { + protected void installPackageInternal(File apkFile) throws InstallFailedException { Uri packageUri = Uri.fromFile(apkFile); int count = newPermissionCount(packageUri); if (count < 0) { @@ -171,7 +171,7 @@ public class PrivilegedInstaller extends Installer { } else { try { doInstallPackageInternal(packageUri); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { mCallback.onError(InstallerCallback.OPERATION_INSTALL, InstallerCallback.ERROR_CODE_OTHER); } @@ -194,7 +194,7 @@ public class PrivilegedInstaller extends Installer { return 1; } - private void doInstallPackageInternal(final Uri packageURI) throws AndroidNotCompatibleException { + private void doInstallPackageInternal(final Uri packageURI) throws InstallFailedException { ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { IPrivilegedService privService = IPrivilegedService.Stub.asInterface(service); @@ -238,7 +238,7 @@ public class PrivilegedInstaller extends Installer { @Override protected void deletePackageInternal(final String packageName) - throws AndroidNotCompatibleException { + throws InstallFailedException { ApplicationInfo appInfo; try { appInfo = mPm.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); @@ -273,7 +273,7 @@ public class PrivilegedInstaller extends Installer { public void onClick(DialogInterface dialog, int which) { try { doDeletePackageInternal(packageName); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { mCallback.onError(InstallerCallback.OPERATION_DELETE, InstallerCallback.ERROR_CODE_OTHER); } @@ -293,7 +293,7 @@ public class PrivilegedInstaller extends Installer { } private void doDeletePackageInternal(final String packageName) - throws AndroidNotCompatibleException { + throws InstallFailedException { ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { IPrivilegedService privService = IPrivilegedService.Stub.asInterface(service); @@ -344,7 +344,7 @@ public class PrivilegedInstaller extends Installer { final Uri packageUri = data.getData(); try { doInstallPackageInternal(packageUri); - } catch (AndroidNotCompatibleException e) { + } catch (InstallFailedException e) { mCallback.onError(InstallerCallback.OPERATION_INSTALL, InstallerCallback.ERROR_CODE_OTHER); } diff --git a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java index 7af7262f4..2137ccf5e 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java @@ -814,7 +814,7 @@ public class SwapWorkflowActivity extends AppCompatActivity { } }).installPackage(apkFile, packageName); localBroadcastManager.unregisterReceiver(downloadCompleteReceiver); - } catch (Installer.AndroidNotCompatibleException e) { + } catch (Installer.InstallFailedException e) { // TODO: Handle exception properly } }