diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index cea3a868..454b21a1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -7,7 +7,6 @@
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fa83f06d..2205c688 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -49,7 +49,6 @@
Finalizing package installation
Preparing for first boot
Preliminary update preparation
- Could not prepare update
Reboot
diff --git a/src/org/lineageos/updater/UpdatesListAdapter.java b/src/org/lineageos/updater/UpdatesListAdapter.java
index aee52c3f..5b0705ec 100644
--- a/src/org/lineageos/updater/UpdatesListAdapter.java
+++ b/src/org/lineageos/updater/UpdatesListAdapter.java
@@ -160,7 +160,8 @@ public class UpdatesListAdapter extends RecyclerView.Adapter 500) {
+ mUpdaterController.getActualUpdate(update.getDownloadId())
+ .setInstallProgress(progress);
+ mUpdaterController.notifyInstallProgress(update.getDownloadId());
+ mLastUpdate = now;
+ }
+ }
+ };
+
+ @Override
+ public void run() {
+ try {
+ FileUtils.copyFile(update.getFile(), uncryptFile, mProgressCallBack);
+
+ // Use INSTALLATION_CANCELLED to clear everything.
+ // This shouldn't really matter in case of success.
+ mUpdaterController.getActualUpdate(update.getDownloadId())
+ .setStatus(UpdateStatus.INSTALLATION_CANCELLED);
+ mUpdaterController.getActualUpdate(update.getDownloadId())
+ .setInstallProgress(0);
+ mUpdaterController.notifyUpdateChange(update.getDownloadId());
+
+ if (!sPrepareUpdateThread.isInterrupted()) {
+ installPackage(uncryptFile, update.getDownloadId());
+ } else {
+ uncryptFile.delete();
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Could not copy update", e);
+ uncryptFile.delete();
+ mUpdaterController.getActualUpdate(update.getDownloadId())
+ .setStatus(UpdateStatus.INSTALLATION_FAILED);
+ mUpdaterController.notifyUpdateChange(update.getDownloadId());
+ } finally {
+ sPrepareUpdateThread = null;
+ }
+ }
+ };
+
+ sPrepareUpdateThread = new Thread(copyUpdateRunnable);
+ sPrepareUpdateThread.setName(update.getDownloadId());
+ sPrepareUpdateThread.start();
+ sCancelled = false;
+
+ mUpdaterController.getActualUpdate(update.getDownloadId())
+ .setStatus(UpdateStatus.INSTALLING);
+ mUpdaterController.notifyUpdateChange(update.getDownloadId());
+ }
+
+ public void cancel() {
+ if (sCancelled || sPrepareUpdateThread == null) {
+ Log.d(TAG, "Nothing is being copied");
+ return;
+ }
+ sCancelled = true;
+ sPrepareUpdateThread.interrupt();
+ }
+}
diff --git a/src/org/lineageos/updater/controller/UpdaterController.java b/src/org/lineageos/updater/controller/UpdaterController.java
index 9efa8e5d..d6ed4016 100644
--- a/src/org/lineageos/updater/controller/UpdaterController.java
+++ b/src/org/lineageos/updater/controller/UpdaterController.java
@@ -534,11 +534,18 @@ public class UpdaterController implements Controller {
@Override
public boolean isInstallingUpdate() {
- return ABUpdateInstaller.isInstallingUpdate(mContext);
+ return UpdateInstaller.isInstalling() ||
+ ABUpdateInstaller.isInstallingUpdate(mContext);
}
@Override
public boolean isInstallingUpdate(String downloadId) {
- return ABUpdateInstaller.isInstallingUpdate(mContext, downloadId);
+ return UpdateInstaller.isInstalling(downloadId) ||
+ ABUpdateInstaller.isInstallingUpdate(mContext, downloadId);
+ }
+
+ @Override
+ public boolean isInstallingABUpdate() {
+ return ABUpdateInstaller.isInstallingUpdate(mContext);
}
}
diff --git a/src/org/lineageos/updater/controller/UpdaterService.java b/src/org/lineageos/updater/controller/UpdaterService.java
index 58df987e..03fcf8d3 100644
--- a/src/org/lineageos/updater/controller/UpdaterService.java
+++ b/src/org/lineageos/updater/controller/UpdaterService.java
@@ -27,7 +27,6 @@ import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.NotificationCompat;
-import android.support.v7.preference.PreferenceManager;
import android.text.format.Formatter;
import android.util.Log;
@@ -35,14 +34,11 @@ import org.lineageos.updater.R;
import org.lineageos.updater.UpdaterReceiver;
import org.lineageos.updater.UpdatesActivity;
import org.lineageos.updater.misc.BuildInfoUtils;
-import org.lineageos.updater.misc.Constants;
-import org.lineageos.updater.misc.FileUtils;
import org.lineageos.updater.misc.StringGenerator;
import org.lineageos.updater.misc.Utils;
import org.lineageos.updater.model.UpdateInfo;
import org.lineageos.updater.model.UpdateStatus;
-import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.NumberFormat;
@@ -186,36 +182,18 @@ public class UpdaterService extends Service {
return START_STICKY;
}
} else {
- boolean deleteUpdate = PreferenceManager.getDefaultSharedPreferences(this)
- .getBoolean(Constants.PREF_AUTO_DELETE_UPDATES, false);
- if (deleteUpdate) {
- // Renaming the file is enough to have it deleted automatically
- File uncrytpFile = new File(
- update.getFile().getAbsolutePath() + Constants.UNCRYPT_FILE_EXT);
- update.getFile().renameTo(uncrytpFile);
- installPackage(uncrytpFile);
- } else if (Utils.isEncrypted(this, update.getFile())) {
- // uncrypt rewrites the file so that it can be read without mounting
- // the filesystem, so create a copy of it.
- File uncrytpFile = new File(
- update.getFile().getAbsolutePath() + Constants.UNCRYPT_FILE_EXT);
- FileUtils.prepareForUncrypt(this, update.getFile(), uncrytpFile,
- new Runnable() {
- @Override
- public void run() {
- installPackage(uncrytpFile);
- }
- });
- } else {
- installPackage(update.getFile());
- }
+ UpdateInstaller installer = new UpdateInstaller(this, mUpdaterController);
+ installer.install(downloadId);
}
} catch (IOException e) {
Log.e(TAG, "Could not install update", e);
// TODO: user facing message
}
} else if (ACTION_INSTALL_STOP.equals(intent.getAction())) {
- if (ABUpdateInstaller.isInstallingUpdate(this)) {
+ if (UpdateInstaller.isInstalling()) {
+ UpdateInstaller installer = new UpdateInstaller(this, mUpdaterController);
+ installer.cancel();
+ } else if (ABUpdateInstaller.isInstallingUpdate(this)) {
ABUpdateInstaller installer = new ABUpdateInstaller(this, mUpdaterController);
installer.reconnect();
installer.cancel();
@@ -224,15 +202,6 @@ public class UpdaterService extends Service {
return START_NOT_STICKY;
}
- private void installPackage(File update) {
- try {
- android.os.RecoverySystem.installPackage(this, update);
- } catch (IOException e) {
- // TODO: show error message
- Log.e(TAG, "Could not install update", e);
- }
- }
-
public Controller getUpdaterController() {
return mUpdaterController;
}
@@ -352,7 +321,9 @@ public class UpdaterService extends Service {
mNotificationBuilder.mActions.clear();
mNotificationBuilder.setProgress(0, 0, false);
mNotificationStyle.setSummaryText(null);
- String text = getString(R.string.installing_update);
+ String text = UpdateInstaller.isInstalling() ?
+ getString(R.string.dialog_prepare_zip_message) :
+ getString(R.string.installing_update);
mNotificationStyle.bigText(text);
mNotificationBuilder.setTicker(text);
mNotificationBuilder.setOngoing(true);
@@ -419,7 +390,8 @@ public class UpdaterService extends Service {
mNotificationBuilder.setProgress(100, progress, false);
String percent = NumberFormat.getPercentInstance().format(progress / 100.f);
mNotificationStyle.setSummaryText(percent);
- mNotificationStyle.bigText(
+ boolean notAB = UpdateInstaller.isInstalling();
+ mNotificationStyle.bigText(notAB ? getString(R.string.dialog_prepare_zip_message) :
update.getFinalizing() ?
getString(R.string.finalizing_package) :
getString(R.string.preparing_ota_first_boot));
diff --git a/src/org/lineageos/updater/misc/FileUtils.java b/src/org/lineageos/updater/misc/FileUtils.java
index 02f6bd6e..fab50e6e 100644
--- a/src/org/lineageos/updater/misc/FileUtils.java
+++ b/src/org/lineageos/updater/misc/FileUtils.java
@@ -15,16 +15,7 @@
*/
package org.lineageos.updater.misc;
-import android.app.NotificationManager;
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-import android.support.v7.app.NotificationCompat;
import android.util.Log;
-import android.view.WindowManager;
-
-import org.lineageos.updater.R;
import java.io.File;
import java.io.FileInputStream;
@@ -104,79 +95,4 @@ public class FileUtils {
public static void copyFile(File sourceFile, File destFile) throws IOException {
copyFile(sourceFile, destFile, null);
}
-
- public static void prepareForUncrypt(Context context, File updateFile, File uncryptFile,
- Runnable callback) {
-
- final int NOTIFICATION_ID = 12;
-
- new AsyncTask() {
-
- private ProgressDialog mProgressDialog;
- private boolean mCancelled;
- private ProgressCallBack mProgressCallBack;
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- Log.d(TAG, "Preparing update");
- mProgressDialog = new ProgressDialog(context);
- mProgressDialog.setTitle(R.string.app_name);
- mProgressDialog.setMessage(context.getString(R.string.dialog_prepare_zip_message));
- mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- mProgressDialog.setCancelable(true);
- mProgressDialog.setProgressNumberFormat(null);
- mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- cancel(true);
- }
- });
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressCallBack = new ProgressCallBack() {
- @Override
- public void update(int progress) {
- mProgressDialog.setProgress(progress);
- }
- };
- mProgressDialog.show();
- }
-
- @Override
- protected Boolean doInBackground(Void... voids) {
- try {
- copyFile(updateFile, uncryptFile, mProgressCallBack);
- } catch (IOException e) {
- Log.e(TAG, "Error while copying the file", e);
- }
- return !mCancelled;
- }
-
- @Override
- protected void onCancelled() {
- mCancelled = true;
- uncryptFile.delete();
- }
-
- @Override
- protected void onPostExecute(Boolean success) {
- if (!success || mCancelled) {
- Log.e(TAG, "Could not prepare the update, cancelled=" + mCancelled);
- uncryptFile.delete();
- NotificationManager nm = (NotificationManager) context.getSystemService(
- Context.NOTIFICATION_SERVICE);
- NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
- builder.setSmallIcon(R.drawable.ic_system_update);
- builder.setContentTitle(
- context.getString(R.string.notification_prepare_zip_error_title));
- final String notificationTag = updateFile.getAbsolutePath();
- nm.notify(notificationTag, NOTIFICATION_ID, builder.build());
- } else {
- callback.run();
- }
- mProgressDialog.dismiss();
- }
- }.execute();
- }
}