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(); - } }