Merge lp:~humpolec-team/humpolec/UbuntuInstaller-alfa-release-fixes into lp:humpolec

Proposed by Ondrej Kubik
Status: Merged
Merged at revision: 26
Proposed branch: lp:~humpolec-team/humpolec/UbuntuInstaller-alfa-release-fixes
Merge into: lp:humpolec
Diff against target: 846 lines (+180/-169)
8 files modified
AndroidManifest.xml (+3/-2)
assets/system-image-upgrader (+11/-9)
make_release.sh (+16/-0)
res/menu/installer_menu.xml (+2/-2)
res/menu/launcher_menu.xml (+2/-2)
res/values/strings.xml (+3/-2)
src/com/canonical/ubuntu/installer/InstallActivity.java (+68/-71)
src/com/canonical/ubuntu/installer/UbuntuInstallService.java (+75/-81)
To merge this branch: bzr merge lp:~humpolec-team/humpolec/UbuntuInstaller-alfa-release-fixes
Reviewer Review Type Date Requested Status
Rex Tsai Needs Information
Yuan-Chen Cheng (community) Approve
The Humpolec team Pending
Review via email: mp+199740@code.launchpad.net

Description of the change

Fixing UI issue when sometimes Install activity was out of sync from service and showing fetching channels
Fixing UI issue when app tasked away during download, then auto install progress was dimmed
Cleanup of service state changes, now broadcasted whenever it changes.
Fixing CyanogenMod issue. CM su behaves differently and requires correction in scripts
Renaming tar to u_tar so when we use tar, it's not accidentally using platform (busybox) one
Cleaning install and download fail and following cleanup.
Fixing downloaded version and update command out of sync, causing non functional "resume install" state
Adding new ROOT permission used by CyanogenMod
Adding signing script

To post a comment you must log in.
Revision history for this message
Yuan-Chen Cheng (ycheng-twn) wrote :

look good to me.

review: Approve
Revision history for this message
Rex Tsai (chihchun) wrote :

+1 for fixed fetching channels UI issues
+Adding new ROOT permission used by CyanogenMod
+Fixing CyanogenMod su issue.
+0 on Cleaning install and download fail and following cleanup
1. It should check if the original installation exist.
2. It should prompt a confirmation dialog to let user's know his/her installation will be deleted.

review: Needs Information
Revision history for this message
Yuan-Chen Cheng (ycheng-twn) wrote :

If we don't consider user install ubuntu phone by other method, as in InstallActivity, there always should not have any previous installtion. If yes, the disk space calculation will get confused.

We should use something like sudo to detect whether there exists previous installation in next version.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'AndroidManifest.xml'
--- AndroidManifest.xml 2013-12-18 13:27:15 +0000
+++ AndroidManifest.xml 2013-12-20 03:53:27 +0000
@@ -1,8 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.canonical.ubuntu.installer"3 package="com.canonical.ubuntu.installer"
4 android:versionCode="1"4 android:versionCode="19"
5 android:versionName="1.0" >5 android:versionName="0.2" >
66
7 <uses-sdk7 <uses-sdk
8 android:minSdkVersion="17"8 android:minSdkVersion="17"
@@ -22,6 +22,7 @@
22 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />22 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
23 <uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />23 <uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
24 <uses-permission android:name="android.permission.REBOOT"/>24 <uses-permission android:name="android.permission.REBOOT"/>
25 <uses-permission android:name="android.permission.ACCESS_SUPERUSER"/>
2526
26 <application27 <application
27 android:allowBackup="true"28 android:allowBackup="true"
2829
=== modified file 'assets/system-image-upgrader'
--- assets/system-image-upgrader 2013-12-18 01:01:21 +0000
+++ assets/system-image-upgrader 2013-12-20 03:53:27 +0000
@@ -3,6 +3,8 @@
3export PATH=$PATH:${PWD}3export PATH=$PATH:${PWD}
4UPDATE_FOLDER=${PWD}4UPDATE_FOLDER=${PWD}
5PRIVATE_DIR=$25PRIVATE_DIR=$2
6BUSYBOX=busybox
7TAR=u_tar
6set -e8set -e
79
8if [ ! -e "$1" ]; then10if [ ! -e "$1" ]; then
@@ -61,9 +63,9 @@
61 fi63 fi
6264
63 # Unpacking65 # Unpacking
64 TMPDIR=$(busybox mktemp -d ${TMP}/tempdir.XXXXXXXX)66 TMPDIR=$($BUSYBOX mktemp -d ${TMP}/tempdir.XXXXXXXX)
65 cd $TMPDIR67 cd $TMPDIR
66 cat $1 | busybox unxz | tar xf -68 cat $1 | $BUSYBOX unxz | $TAR xf -
67 if [ ! -e keyring.json ] || [ ! -e keyring.gpg ]; then69 if [ ! -e keyring.json ] || [ ! -e keyring.gpg ]; then
68 rm -Rf $TMPDIR70 rm -Rf $TMPDIR
69 echo "Invalid keyring: $1"71 echo "Invalid keyring: $1"
@@ -71,7 +73,7 @@
71 fi73 fi
7274
73 # Extract the expiry75 # Extract the expiry
74 keyring_expiry=$(grep "^ \"expiry\": " keyring.json | busybox cut -d: -f2 | busybox sed -e "s/[ \",]//g")76 keyring_expiry=$(grep "^ \"expiry\": " keyring.json | $BUSYBOX cut -d: -f2 | $BUSYBOX sed -e "s/[ \",]//g")
75 if [ -n "$keyring_expiry" ] && [ "$keyring_expiry" -lt "$(date +%s)" ]; then77 if [ -n "$keyring_expiry" ] && [ "$keyring_expiry" -lt "$(date +%s)" ]; then
76 rm -Rf $TMPDIR78 rm -Rf $TMPDIR
77 echo "Keyring expired: $1"79 echo "Keyring expired: $1"
@@ -79,7 +81,7 @@
79 fi81 fi
8082
81 # Extract the keyring type83 # Extract the keyring type
82 keyring_type=$(grep "^ \"type\": " keyring.json | busybox cut -d: -f2 | busybox sed -e "s/[, \"]//g")84 keyring_type=$(grep "^ \"type\": " keyring.json | $BUSYBOX cut -d: -f2 | $BUSYBOX sed -e "s/[, \"]//g")
83 if [ -z "$keyring_type" ]; then85 if [ -z "$keyring_type" ]; then
84 rm -Rf $TMPDIR86 rm -Rf $TMPDIR
85 echo "Missing keyring type: $1"87 echo "Missing keyring type: $1"
@@ -153,8 +155,8 @@
153 FULL_IMAGE=1155 FULL_IMAGE=1
154 rm -f /data/system.img156 rm -f /data/system.img
155 rm -f /data/.layout_version157 rm -f /data/.layout_version
156 busybox dd if=/dev/zero of=/data/system.img seek=500K bs=4096 count=1158 $BUSYBOX dd if=/dev/zero of=/data/system.img seek=500K bs=4096 count=1
157 busybox mkfs.ext2 -F /data/system.img159 $BUSYBOX mkfs.ext2 -F /data/system.img
158 ;;160 ;;
159161
160 data)162 data)
@@ -233,7 +235,7 @@
233235
234 # Start by removing any file listed in "removed"236 # Start by removing any file listed in "removed"
235 if [ "$FULL_IMAGE" != "1" ]; then237 if [ "$FULL_IMAGE" != "1" ]; then
236 cat $UPDATE_FOLDER/$2 | busybox unxz | tar xf - removed >/dev/null 2>&1 || true238 cat $UPDATE_FOLDER/$2 | $BUSYBOX unxz | $TAR xf - removed >/dev/null 2>&1 || true
237 if [ -e removed ]; then239 if [ -e removed ]; then
238 while read file; do240 while read file; do
239 rm -Rf $file241 rm -Rf $file
@@ -243,7 +245,7 @@
243 fi245 fi
244246
245 # Unpack everything else on top of the system partition247 # Unpack everything else on top of the system partition
246 cat $UPDATE_FOLDER/$2 | busybox unxz | tar --checkpoint=200 -xf -248 cat $UPDATE_FOLDER/$2 | $BUSYBOX unxz | $TAR --checkpoint=200 -xf -
247 rm -f removed249 rm -f removed
248250
249 if [ -e "partitions/boot.img" ]; then251 if [ -e "partitions/boot.img" ]; then
@@ -287,7 +289,7 @@
287 echo "Moving SWAP device to final destination" >&2289 echo "Moving SWAP device to final destination" >&2
288 mv $PRIVATE_DIR/SWAP.img /data/290 mv $PRIVATE_DIR/SWAP.img /data/
289 echo "Calling mkswap on /data/SWAP.img" >&2291 echo "Calling mkswap on /data/SWAP.img" >&2
290 busybox mkswap /data/SWAP.img292 $BUSYBOX mkswap /data/SWAP.img
291fi293fi
292294
293touch /data/.last_update || true295touch /data/.last_update || true
294296
=== renamed file 'assets/tar' => 'assets/u_tar'
=== added file 'make_release.sh'
--- make_release.sh 1970-01-01 00:00:00 +0000
+++ make_release.sh 2013-12-20 03:53:27 +0000
@@ -0,0 +1,16 @@
1 #!/sbin/sh
2 KEY=$1
3 if [[ -z "$KEY" ]]; then
4 echo "Pass path to the keystore"
5 exit -1
6 fi
7 echo "Release tool, using key"
8 echo "Getting ready for build"
9 android update project --path .
10 echo "Removing old release"
11 rm -rf bin/
12 ant release
13 echo "Signing build"
14 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $KEY bin/MainActivity-release-unsigned.apk humpolec
15 mv bin/MainActivity-release-unsigned.apk bin/UbuntuInstaller.apk
16 echo "Signed relase is at bin/UbuntuInstaller.apk"
0\ No newline at end of file17\ No newline at end of file
118
=== modified file 'res/menu/installer_menu.xml'
--- res/menu/installer_menu.xml 2013-12-13 01:06:14 +0000
+++ res/menu/installer_menu.xml 2013-12-20 03:53:27 +0000
@@ -5,10 +5,10 @@
5 android:orderInCategory="100"5 android:orderInCategory="100"
6 android:showAsAction="never"6 android:showAsAction="never"
7 android:title="@string/action_detele_download"/>7 android:title="@string/action_detele_download"/>
8 <item8<!-- <item
9 android:id="@+id/action_settings"9 android:id="@+id/action_settings"
10 android:orderInCategory="100"10 android:orderInCategory="100"
11 android:showAsAction="never"11 android:showAsAction="never"
12 android:title="@string/action_settings"/>12 android:title="@string/action_settings"/>
13 13 -->
14</menu>14</menu>
1515
=== modified file 'res/menu/launcher_menu.xml'
--- res/menu/launcher_menu.xml 2013-12-13 01:06:14 +0000
+++ res/menu/launcher_menu.xml 2013-12-20 03:53:27 +0000
@@ -11,10 +11,10 @@
11 android:showAsAction="never"11 android:showAsAction="never"
12 android:title="@string/action_delete_user_data"/>12 android:title="@string/action_delete_user_data"/>
13 13
14 <item14<!-- <item
15 android:id="@+id/action_settings"15 android:id="@+id/action_settings"
16 android:orderInCategory="100"16 android:orderInCategory="100"
17 android:showAsAction="never"17 android:showAsAction="never"
18 android:title="@string/action_settings"/>18 android:title="@string/action_settings"/>
19 19-->
20</menu>20</menu>
2121
=== modified file 'res/values/strings.xml'
--- res/values/strings.xml 2013-12-19 09:09:25 +0000
+++ res/values/strings.xml 2013-12-20 03:53:27 +0000
@@ -11,11 +11,12 @@
11 <string name="action_delete_udata_button">Delete</string>11 <string name="action_delete_udata_button">Delete</string>
12 <string name="cancel">Cancel</string>12 <string name="cancel">Cancel</string>
13 <string name="welcome_world">Your life is about to change, welcome in Ubuntu installer</string>13 <string name="welcome_world">Your life is about to change, welcome in Ubuntu installer</string>
14 <string name="install_button_label_install">Install Ubuntu</string>14 <string name="install_button_label_install">Choose channel to install</string>
15 <string name="install_button_label_fetching"><![CDATA[Install Ubuntu<br/><small>fetching channel list</small>]]></string>15 <string name="install_button_label_fetching"><![CDATA[Install Ubuntu<br/><small>fetching channel list</small>]]></string>
16 <string name="install_button_label_no_channel"><![CDATA[Install Ubuntu<br/><small>no available channels</small>]]></string>16 <string name="install_button_label_no_channel"><![CDATA[Install Ubuntu<br/><small>no available channels</small>]]></string>
17 <string name="install_button_label_resume">Resume install</string>17 <string name="install_button_label_resume">Resume install</string>
18 <string name="install_button_label_cancel">Cancel install</string>18 <string name="install_button_label_cancel_download">Cancel download</string>
19 <string name="install_button_label_cancel_install">Cancel install</string>
19 <string name="channel_picker_dialog_title">Select channel to install</string>20 <string name="channel_picker_dialog_title">Select channel to install</string>
20 <string name="version_picker_dialog_title">Select version to install</string>21 <string name="version_picker_dialog_title">Select version to install</string>
21 <string name="bootstrap_check">bootstrap</string>22 <string name="bootstrap_check">bootstrap</string>
2223
=== modified file 'src/com/canonical/ubuntu/installer/InstallActivity.java'
--- src/com/canonical/ubuntu/installer/InstallActivity.java 2013-12-19 12:57:21 +0000
+++ src/com/canonical/ubuntu/installer/InstallActivity.java 2013-12-20 03:53:27 +0000
@@ -32,7 +32,8 @@
32public class InstallActivity extends Activity {32public class InstallActivity extends Activity {
33 private static final String TAG = "UbuntuInstaller";33 private static final String TAG = "UbuntuInstaller";
3434
35 private UbuntuButton mInstallButton; 35 private UbuntuButton mInstallButton;
36 private boolean mObserversRegistered;
3637
37 private InstallerState mStatus = InstallerState.READY;38 private InstallerState mStatus = InstallerState.READY;
38 private VersionInfo mDownloadedVersion = null;39 private VersionInfo mDownloadedVersion = null;
@@ -79,28 +80,31 @@
79 filter.addAction(UbuntuInstallService.VERSION_UPDATE);80 filter.addAction(UbuntuInstallService.VERSION_UPDATE);
80 filter.addAction(UbuntuInstallService.SERVICE_STATE);81 filter.addAction(UbuntuInstallService.SERVICE_STATE);
81 registerReceiver(mServiceObserver, filter);82 registerReceiver(mServiceObserver, filter);
83 mObserversRegistered = true;
8284
83 // do we know last activity85 // do we know last activity
84 if (mStatus == InstallerState.READY) {86 if (mStatus == InstallerState.DOWNLOADING || mStatus == InstallerState.INSTALLING) {
85 requestServiceState();
86 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(this.getApplicationContext());
87 } else if (mStatus == InstallerState.DOWNLOADING || mStatus == InstallerState.INSTALLING) {
88 // request last progress / status. this will update UI accordingly87 // request last progress / status. this will update UI accordingly
89 startService(new Intent(UbuntuInstallService.GET_PROGRESS_STATUS));88 startService(new Intent(UbuntuInstallService.GET_PROGRESS_STATUS));
90 } else {89 } else {
91 // READY + mDownloadedVersion != null => READY_TO_INSTALL90 // READY + mDownloadedVersion != null => READY_TO_INSTALL
92 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(this.getApplicationContext());91 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(this.getApplicationContext());
93 mStatus = InstallerState.READY;92 if (mDownloadedVersion == null) {
94 updateUiElements();93 requestChannelList();
94 }
95 }95 }
96 requestServiceState();
96 }97 }
97 98
98 @Override99 @Override
99 public void onPause() {100 public void onPause() {
100 super.onPause();101 super.onPause();
101 mInstallButton.setOnClickListener(null);
102 // cancel observer if there is any102 // cancel observer if there is any
103 unregisterReceiver(mServiceObserver);103 if (mObserversRegistered) {
104 mInstallButton.setOnClickListener(null);
105 unregisterReceiver(mServiceObserver);
106 }
107 mObserversRegistered = false;
104 }108 }
105 109
106 @Override110 @Override
@@ -114,10 +118,13 @@
114 public boolean onOptionsItemSelected(MenuItem item) {118 public boolean onOptionsItemSelected(MenuItem item) {
115 switch (item.getItemId()) {119 switch (item.getItemId()) {
116 case R.id.action_delete_download:120 case R.id.action_delete_download:
121 // also attempt to uninstall ubuntu, since there should be none anyway, keep user data
122 Intent action = new Intent(UbuntuInstallService.UNINSTALL_UBUNTU);
123 action.putExtra(UbuntuInstallService.UNINSTALL_UBUNTU_EXTRA_REMOVE_USER_DATA, false);
124 startService(action);
117 deleteDownload();125 deleteDownload();
118 mDownloadedVersion = null;126 mDownloadedVersion = null;
119 mStatus = InstallerState.READY;127 requestServiceState();
120 updateUiElements();
121 break;128 break;
122 }129 }
123 return super.onOptionsItemSelected(item);130 return super.onOptionsItemSelected(item);
@@ -184,8 +191,7 @@
184 true /* default latest settings*/).show();191 true /* default latest settings*/).show();
185 } else {192 } else {
186 // there are no channels to pick from, this was mistake, disable button193 // there are no channels to pick from, this was mistake, disable button
187 mStatus = InstallerState.READY;194 requestServiceState();
188 updateUiElements();
189 }195 }
190 }196 }
191 };197 };
@@ -209,8 +215,6 @@
209 Utils.showToast(this, "Starting Ubuntu installation");215 Utils.showToast(this, "Starting Ubuntu installation");
210 // reset progress bar216 // reset progress bar
211 mProgressBar.setProgress(0);217 mProgressBar.setProgress(0);
212 mStatus = InstallerState.INSTALLING;
213 updateUiElements();
214 }218 }
215 219
216 TextPickerDialog.OnChannelPicktListener mInstallDialogListener 220 TextPickerDialog.OnChannelPicktListener mInstallDialogListener
@@ -238,8 +242,6 @@
238 startService(startDownload);242 startService(startDownload);
239 mTerminal.setText(R.string.downloading_starting);243 mTerminal.setText(R.string.downloading_starting);
240 mProgressBar.setProgress(0);244 mProgressBar.setProgress(0);
241 mStatus = InstallerState.DOWNLOADING;
242 updateUiElements();
243 }245 }
244 246
245 private void downloadVersion(final Context context, final String channel, final boolean bootstrap) {247 private void downloadVersion(final Context context, final String channel, final boolean bootstrap) {
@@ -284,50 +286,56 @@
284 }286 }
285287
286 private void updateUiElements() {288 private void updateUiElements() {
287 switch (mStatus) {289 this.runOnUiThread(new Runnable() {
288 case READY:290 @Override
289 {291 public void run() {
290 if (mDownloadedVersion != null) {292 Log.v(TAG,"updateUiElements(" + mStatus + ")");
291 mInstallButton.setText(R.string.install_button_label_resume);293 switch (mStatus) {
292 mInstallButton.setEnabled(true);294 case READY:
293 mProgressBar.setEnabled(false);295 {
294 mProgressBar.setProgress(0);296 if (mDownloadedVersion != null) {
295 mProgressText.setText("");297 mInstallButton.setText(R.string.install_button_label_resume);
296 } else if (mAvailableChannels.size() > 0) {298 mInstallButton.setEnabled(true);
297 mInstallButton.setText(R.string.install_button_label_install);299 mProgressBar.setEnabled(false);
298 mInstallButton.setEnabled(true);300 mProgressBar.setProgress(0);
299 mProgressBar.setEnabled(false);301 mProgressText.setText("");
300 mProgressBar.setProgress(0);302 } else if (mAvailableChannels.size() > 0) {
301 mProgressText.setText("");303 mInstallButton.setText(R.string.install_button_label_install);
302 } else {304 mInstallButton.setEnabled(true);
303 mInstallButton.setText(Html.fromHtml(getResources().getString(R.string.install_button_label_no_channel)));305 mProgressBar.setEnabled(false);
304 mInstallButton.setEnabled(false);306 mProgressBar.setProgress(0);
305 mProgressBar.setEnabled(false);307 mProgressText.setText("");
306 mProgressBar.setProgress(0);308 } else {
307 mProgressText.setText("");309 mInstallButton.setText(Html.fromHtml(getResources().getString(R.string.install_button_label_no_channel)));
310 mInstallButton.setEnabled(false);
311 mProgressBar.setEnabled(false);
312 mProgressBar.setProgress(0);
313 mProgressText.setText("");
314 }
315 }
316 break;
317 case FETCHING_CHANNELS:
318 mInstallButton.setText(Html.fromHtml(getResources().getString(R.string.install_button_label_fetching)));
319 mInstallButton.setEnabled(false);
320 mProgressBar.setEnabled(false);
321 mProgressBar.setProgress(0);
322 mProgressText.setText("");
323 break;
324 case DOWNLOADING:
325 mInstallButton.setText(R.string.install_button_label_cancel_download);
326 mInstallButton.setEnabled(true);
327 mProgressBar.setEnabled(true);
328 mProgressText.setText(R.string.downloading_release);
329 break;
330 case INSTALLING:
331 mInstallButton.setText(R.string.install_button_label_cancel_install);
332 mInstallButton.setEnabled(true);
333 mProgressBar.setEnabled(true);
334 mProgressText.setText(R.string.installing_release);
335 break;
308 }336 }
309 }337 }
310 break;338 });
311 case FETCHING_CHANNELS:
312 mInstallButton.setText(Html.fromHtml(getResources().getString(R.string.install_button_label_fetching)));
313 mInstallButton.setEnabled(false);
314 mProgressBar.setEnabled(false);
315 mProgressBar.setProgress(0);
316 mProgressText.setText("");
317 break;
318 case DOWNLOADING:
319 mInstallButton.setText(R.string.install_button_label_cancel);
320 mInstallButton.setEnabled(true);
321 mProgressBar.setEnabled(true);
322 mProgressText.setText(R.string.downloading_release);
323 break;
324 case INSTALLING:
325 mInstallButton.setText(R.string.install_button_label_cancel);
326 mInstallButton.setEnabled(true);
327 mProgressBar.setEnabled(true);
328 mProgressText.setText(R.string.installing_release);
329 break;
330 }
331 }339 }
332 340
333 BroadcastReceiver mServiceObserver = new BroadcastReceiver() {341 BroadcastReceiver mServiceObserver = new BroadcastReceiver() {
@@ -335,8 +343,8 @@
335 @SuppressWarnings("unchecked")343 @SuppressWarnings("unchecked")
336 @Override344 @Override
337 public void onReceive(Context context, Intent intent) {345 public void onReceive(Context context, Intent intent) {
338
339 String action = intent.getAction();346 String action = intent.getAction();
347 Log.v(TAG,"mServiceObserver.onReceive(" + action + ")");
340 // List of available channels fetched 348 // List of available channels fetched
341 if (action.equals(UbuntuInstallService.AVAILABLE_CHANNELS)) {349 if (action.equals(UbuntuInstallService.AVAILABLE_CHANNELS)) {
342 // ignore channel list if we have already downloaded release350 // ignore channel list if we have already downloaded release
@@ -379,12 +387,10 @@
379 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);387 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);
380 if (UbuntuInstallService.checkifReadyToInstall(context)) {388 if (UbuntuInstallService.checkifReadyToInstall(context)) {
381 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);389 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);
382 mStatus = InstallerState.READY;
383 } else {390 } else {
384 deleteDownload();391 deleteDownload();
385 mDownloadedVersion = null;392 mDownloadedVersion = null;
386 requestChannelList();393 requestChannelList();
387 mStatus = InstallerState.FETCHING_CHANNELS;
388 }394 }
389 updateUiElements();395 updateUiElements();
390 }396 }
@@ -405,8 +411,6 @@
405 updateInfoOnUiThread(reason);411 updateInfoOnUiThread(reason);
406 // delete failed download412 // delete failed download
407 deleteDownload();413 deleteDownload();
408 mStatus = InstallerState.READY;
409 updateUiElements();
410 requestChannelList();414 requestChannelList();
411 }415 }
412 } else if (action.equals(UbuntuInstallService.VERSION_UPDATE)) {416 } else if (action.equals(UbuntuInstallService.VERSION_UPDATE)) {
@@ -415,7 +419,6 @@
415 // check what button should be shown419 // check what button should be shown
416 if (UbuntuInstallService.checkifReadyToInstall(context)) {420 if (UbuntuInstallService.checkifReadyToInstall(context)) {
417 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);421 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);
418 mStatus = InstallerState.READY;
419 }422 }
420 updateUiElements();423 updateUiElements();
421 }424 }
@@ -423,12 +426,6 @@
423 checkIfUbuntuIsInstalled();426 checkIfUbuntuIsInstalled();
424 if (!isFinishing()) {427 if (!isFinishing()) {
425 mStatus = InstallerState.fromOrdian(intent.getIntExtra(UbuntuInstallService.SERVICE_STATE, 0));428 mStatus = InstallerState.fromOrdian(intent.getIntExtra(UbuntuInstallService.SERVICE_STATE, 0));
426 if (mStatus != InstallerState.FETCHING_CHANNELS &&
427 mStatus != InstallerState.DOWNLOADING &&
428 mStatus != InstallerState.INSTALLING) {
429 requestChannelList();
430 mStatus = InstallerState.FETCHING_CHANNELS;
431 }
432 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);429 mDownloadedVersion = UbuntuInstallService.getDownloadedVersion(context);
433 updateUiElements();430 updateUiElements();
434 }431 }
435432
=== modified file 'src/com/canonical/ubuntu/installer/UbuntuInstallService.java'
--- src/com/canonical/ubuntu/installer/UbuntuInstallService.java 2013-12-19 11:21:02 +0000
+++ src/com/canonical/ubuntu/installer/UbuntuInstallService.java 2013-12-20 03:53:27 +0000
@@ -148,7 +148,7 @@
148 // =================================================================================================148 // =================================================================================================
149 private static final String BUSYBOX = "busybox";149 private static final String BUSYBOX = "busybox";
150 private static final String GPG = "gpg";150 private static final String GPG = "gpg";
151 private static final String TAR = "tar";151 private static final String TAR = "u_tar";
152 private static final String ANDROID_LOOP_MOUNT = "aloopmount";152 private static final String ANDROID_LOOP_MOUNT = "aloopmount";
153 private static final String ANDROID_BOOTMGR = "bootmgr";153 private static final String ANDROID_BOOTMGR = "bootmgr";
154 private static final String UPDATE_SCRIPT = "system-image-upgrader";154 private static final String UPDATE_SCRIPT = "system-image-upgrader";
@@ -187,7 +187,7 @@
187 private long mProgress; // so far handled amount downloaded/processed 187 private long mProgress; // so far handled amount downloaded/processed
188 private int mLastSignalledProgress;188 private int mLastSignalledProgress;
189 private long mTotalSize; // calculated189 private long mTotalSize; // calculated
190 private InstallerState mServiceState;190 private InstallerState mInstallerState;
191 191
192 public class Channel {192 public class Channel {
193 String alias;193 String alias;
@@ -236,13 +236,13 @@
236 mRootOfWorkPath = getFilesDir().toString(); // "/data/data/com.canonical.ubuntuinstaller/files";236 mRootOfWorkPath = getFilesDir().toString(); // "/data/data/com.canonical.ubuntuinstaller/files";
237 workPathInCache = false;237 workPathInCache = false;
238 }238 }
239 mServiceState = InstallerState.READY;239 mInstallerState = InstallerState.READY;
240 }240 }
241241
242 @Override242 @Override
243 public int onStartCommand(Intent intent, int flags, int startId) {243 public int onStartCommand(Intent intent, int flags, int startId) {
244 // if service is not in ready state, handle specific requests here244 // if service is not in ready state, handle specific requests here
245 if (mServiceState != InstallerState.READY) {245 if (mInstallerState != InstallerState.READY) {
246 String action = intent.getAction(); 246 String action = intent.getAction();
247 if (action.equals(CANCEL_DOWNLOAD)) {247 if (action.equals(CANCEL_DOWNLOAD)) {
248 // set the cancel flag, but let it remove downloaded files on worker thread248 // set the cancel flag, but let it remove downloaded files on worker thread
@@ -250,7 +250,7 @@
250 } else if (action.equals(GET_PROGRESS_STATUS)) {250 } else if (action.equals(GET_PROGRESS_STATUS)) {
251 broadcastProgress(mLastSignalledProgress, ""); 251 broadcastProgress(mLastSignalledProgress, "");
252 } else if (action.equals(GET_SERVICE_STATE)) {252 } else if (action.equals(GET_SERVICE_STATE)) {
253 broadcastServiceState();253 broadcastInstallerState();
254 }254 }
255 }255 }
256 return super.onStartCommand(intent, flags, startId);256 return super.onStartCommand(intent, flags, startId);
@@ -263,10 +263,10 @@
263263
264 Log.d(TAG, this.toString() + " onHandleIntent: " + action);264 Log.d(TAG, this.toString() + " onHandleIntent: " + action);
265 if (action.equals(GET_CHANNEL_LIST)) {265 if (action.equals(GET_CHANNEL_LIST)) {
266 mServiceState = InstallerState.FETCHING_CHANNELS;266 updateInstallerState(InstallerState.FETCHING_CHANNELS);
267 result = doGetChannelList(intent);267 result = doGetChannelList(intent);
268 } else if (action.equals(DOWNLOAD_RELEASE)) {268 } else if (action.equals(DOWNLOAD_RELEASE)) {
269 mServiceState = InstallerState.DOWNLOADING;269 updateInstallerState(InstallerState.DOWNLOADING);
270 result = doDownloadRelease(intent);270 result = doDownloadRelease(intent);
271 } else if (action.equals(CANCEL_DOWNLOAD)) {271 } else if (action.equals(CANCEL_DOWNLOAD)) {
272 // download should be already cancelled, now delete all the files272 // download should be already cancelled, now delete all the files
@@ -274,22 +274,22 @@
274 } else if (action.equals(PAUSE_DOWNLOAD)) {274 } else if (action.equals(PAUSE_DOWNLOAD)) {
275 // TODO: handle download275 // TODO: handle download
276 } else if (action.equals(RESUME_DOWNLOAD)) {276 } else if (action.equals(RESUME_DOWNLOAD)) {
277 mServiceState = InstallerState.DOWNLOADING;277 updateInstallerState(InstallerState.DOWNLOADING);
278 // TODO: handle download278 // TODO: handle download
279 } else if (action.equals(CLEAN_DOWNLOAD)) {279 } else if (action.equals(CLEAN_DOWNLOAD)) {
280 result = doRemoreDownload(intent);280 result = doRemoreDownload(intent);
281 } else if (action.equals(INSTALL_UBUNTU)) {281 } else if (action.equals(INSTALL_UBUNTU)) {
282 mServiceState = InstallerState.INSTALLING;282 updateInstallerState(InstallerState.INSTALLING);
283 result = doInstallUbuntu(intent);283 result = doInstallUbuntu(intent);
284 } else if (action.equals(CANCEL_INSTALL)) {284 } else if (action.equals(CANCEL_INSTALL)) {
285 // install should be already cancelled, try to delete it now285 // install should be already cancelled, try to delete it now
286 mServiceState = InstallerState.UNINSTALLING;286 updateInstallerState(InstallerState.UNINSTALLING);
287 result = doUninstallUbuntu(intent);287 result = doUninstallUbuntu(intent);
288 } else if (action.equals(UNINSTALL_UBUNTU)) {288 } else if (action.equals(UNINSTALL_UBUNTU)) {
289 mServiceState = InstallerState.UNINSTALLING;289 updateInstallerState(InstallerState.UNINSTALLING);
290 result = doUninstallUbuntu(intent);290 result = doUninstallUbuntu(intent);
291 } else if (action.equals(DELETE_UBUNTU_USER_DATA)) { 291 } else if (action.equals(DELETE_UBUNTU_USER_DATA)) {
292 mServiceState = InstallerState.DELETING_USER_DATA;292 updateInstallerState(InstallerState.DELETING_USER_DATA);
293 result = doDeleteUbuntuUserData(intent);293 result = doDeleteUbuntuUserData(intent);
294 } else if(action.equals(REBOOT_UBUNTU)) {294 } else if(action.equals(REBOOT_UBUNTU)) {
295 Log.d(TAG, this.toString() + ": REBOOT_UBUNTU");295 Log.d(TAG, this.toString() + ": REBOOT_UBUNTU");
@@ -298,12 +298,12 @@
298 } else {298 } else {
299 // for any other request broadcast service state299 // for any other request broadcast service state
300 result = new Intent(SERVICE_STATE);300 result = new Intent(SERVICE_STATE);
301 result.putExtra(SERVICE_STATE_EXTRA_STATE, mServiceState.ordinal());301 result.putExtra(SERVICE_STATE_EXTRA_STATE, mInstallerState.ordinal());
302 }302 }
303 if (result != null) {303 if (result != null) {
304 sendBroadcast(result);304 sendBroadcast(result);
305 }305 }
306 mServiceState = InstallerState.READY;306 updateInstallerState(InstallerState.READY);
307 Log.d(TAG, this.toString() + " onHandleIntent: " + action + " END");307 Log.d(TAG, this.toString() + " onHandleIntent: " + action + " END");
308 }308 }
309309
@@ -335,7 +335,7 @@
335 if (alias == null || alias.equals("")) {335 if (alias == null || alias.equals("")) {
336 alias = key; // use key instead336 alias = key; // use key instead
337 }337 }
338 Log.v(TAG, "Channel:" + alias + " url:" + url); 338 // Log.v(TAG, "Channel:" + alias + " url:" + url);
339 if (!hidden || includeHidden) {339 if (!hidden || includeHidden) {
340 channels.put(alias, url);340 channels.put(alias, url);
341 }341 }
@@ -354,12 +354,14 @@
354 }354 }
355 355
356 private Intent doRemoreDownload(Intent intent) {356 private Intent doRemoreDownload(Intent intent) {
357 Intent result = new Intent();357 Intent result = new Intent(SERVICE_STATE);
358 String s = deleteRelease();358 String s = deleteRelease();
359 if (s!= null) {359 if (s!= null) {
360 broadcastProgress(-1, s);
360 // delete failed361 // delete failed
361 }362 }
362 return result; 363 result.putExtra(SERVICE_STATE, InstallerState.READY.ordinal());
364 return result;
363 }365 }
364366
365 private Intent doInstallUbuntu(Intent intent) {367 private Intent doInstallUbuntu(Intent intent) {
@@ -367,14 +369,11 @@
367 Intent result = new Intent(INSTALL_RESULT);369 Intent result = new Intent(INSTALL_RESULT);
368 // get update command file370 // get update command file
369 SharedPreferences pref = getSharedPreferences( SHARED_PREF, Context.MODE_PRIVATE);371 SharedPreferences pref = getSharedPreferences( SHARED_PREF, Context.MODE_PRIVATE);
370 String updateCommand = // "/cache/ubuntu_release/update_command";372 String updateCommand = pref.getString(PREF_KEY_UPDATE_COMMAND,"");
371 pref.getString(PREF_KEY_UPDATE_COMMAND,"");
372 mTotalSize = pref.getInt(PREF_KEY_ESTIMATED_CHECKPOINTS, 0);373 mTotalSize = pref.getInt(PREF_KEY_ESTIMATED_CHECKPOINTS, 0);
373 mLastSignalledProgress = 0;374 mLastSignalledProgress = 0;
374 if (updateCommand.equals("") || ! new File(updateCommand).exists()) {375 if (updateCommand.equals("") || ! new File(updateCommand).exists()) {
375 result.putExtra(INSTALL_RESULT_EXTRA_INT, -1);376 return handleInstallFail(result, -1, "Missing update command");
376 result.putExtra(INSTALL_RESULT_EXTRA_STR, "Missing update command");
377 return result;
378 }377 }
379 mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ubuntu-installing");378 mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ubuntu-installing");
380 try {379 try {
@@ -394,9 +393,7 @@
394 Utils.extractExecutableAsset(this, U_REBOOT_APP_ASC, supportingFiles.toString(), false);393 Utils.extractExecutableAsset(this, U_REBOOT_APP_ASC, supportingFiles.toString(), false);
395 } catch (IOException e) {394 } catch (IOException e) {
396 e.printStackTrace();395 e.printStackTrace();
397 result.putExtra(INSTALL_RESULT_EXTRA_INT, -1);396 return handleInstallFail(result, -1, "Failed to extract supporting assets");
398 result.putExtra(INSTALL_RESULT_EXTRA_STR, "Failed to extract supporting assets");
399 return result;
400 }397 }
401 // get superuser and run update script398 // get superuser and run update script
402 broadcastProgress(-1, "Starting update script");399 broadcastProgress(-1, "Starting update script");
@@ -405,30 +402,34 @@
405 DataOutputStream os = new DataOutputStream(process.getOutputStream());402 DataOutputStream os = new DataOutputStream(process.getOutputStream());
406 // debug purpose.403 // debug purpose.
407 // os.writeBytes("set -x\n");404 // os.writeBytes("set -x\n");
405 // make sure we are in work folder
406 os.writeBytes(String.format("cd %s\n", supportingFiles.getAbsolutePath()));
407 os.writeBytes("echo \"SU granted\"\n");
408 // run system-image-upgrader.408 // run system-image-upgrader.
409 os.writeBytes(String.format("sh %s %s %s\n",409 os.writeBytes(String.format("sh %s %s %s\n",
410 UPDATE_SCRIPT,410 UPDATE_SCRIPT,
411 updateCommand,411 updateCommand,
412 getFilesDir().toString()412 getFilesDir().getAbsolutePath()
413 ));413 ));
414 os.writeBytes(String.format("cd %s\n", supportingFiles.getAbsolutePath()));
414 // backup original recovery.415 // backup original recovery.
415 if(!new File(getFilesDir().toString(), ANDROID_REOCVERY_IMG).exists()) {416 if(!new File(getFilesDir().toString(), ANDROID_REOCVERY_IMG).exists()) {
416 os.writeBytes(String.format("%s/%s -b %s %s/%s\n",417 os.writeBytes(String.format("./%s -b %s %s/%s\n",
417 supportingFiles.toString(),
418 ANDROID_BOOTMGR,418 ANDROID_BOOTMGR,
419 Utils.getRecoveryPartitionPath(),419 Utils.getRecoveryPartitionPath(),
420 getFilesDir().toString(),420 getFilesDir().getAbsolutePath(),
421 ANDROID_REOCVERY_IMG421 ANDROID_REOCVERY_IMG
422 ));422 ));
423 }423 }
424 os.writeBytes(String.format("cd %s\n", supportingFiles.getAbsolutePath()));
424 // overwrite the recovery partition.425 // overwrite the recovery partition.
425 os.writeBytes(String.format("%s/%s -b %s/%s %s\n",426 os.writeBytes(String.format("./%s -b %s/%s %s\n",
426 supportingFiles.toString(),
427 ANDROID_BOOTMGR,427 ANDROID_BOOTMGR,
428 getFilesDir().toString(),428 getFilesDir().getAbsolutePath(),
429 UBUNTU_BOOT_IMG,429 UBUNTU_BOOT_IMG,
430 Utils.getRecoveryPartitionPath()430 Utils.getRecoveryPartitionPath()
431 ));431 ));
432
432 // close terminal433 // close terminal
433 os.writeBytes("exit\n");434 os.writeBytes("exit\n");
434 os.flush();435 os.flush();
@@ -474,13 +475,9 @@
474 Log.v(TAG, "Worker thread exited with: " + ret);475 Log.v(TAG, "Worker thread exited with: " + ret);
475 // if script was not executed, then user did not granted SU permissions476 // if script was not executed, then user did not granted SU permissions
476 if (ret == 255 || !scriptExecuted ) {477 if (ret == 255 || !scriptExecuted ) {
477 result.putExtra(INSTALL_RESULT_EXTRA_INT, -1);478 return handleInstallFail(result, -1, "Failed to get SU permissions");
478 result.putExtra(INSTALL_RESULT_EXTRA_STR, "Failed to get SU permissions");
479 return result;
480 } else if (ret != 0) {479 } else if (ret != 0) {
481 result.putExtra(INSTALL_RESULT_EXTRA_INT, -1);480 return handleInstallFail(result, -1, "Instalation failed");
482 result.putExtra(INSTALL_RESULT_EXTRA_STR, "Instalation failed");
483 return result;
484 }481 }
485 running =false;482 running =false;
486 } catch (IllegalThreadStateException e) {483 } catch (IllegalThreadStateException e) {
@@ -491,9 +488,7 @@
491 } catch (IOException e) {488 } catch (IOException e) {
492 e.printStackTrace();489 e.printStackTrace();
493 Log.w(TAG, "Update failed");490 Log.w(TAG, "Update failed");
494 result.putExtra(INSTALL_RESULT_EXTRA_INT, -1);491 return handleInstallFail(result, -1, "Install failed");
495 result.putExtra(INSTALL_RESULT_EXTRA_STR, "Install failed");
496 return result;
497 }492 }
498 } finally {493 } finally {
499 if (mWakeLock != null && mWakeLock.isHeld()) {494 if (mWakeLock != null && mWakeLock.isHeld()) {
@@ -508,6 +503,13 @@
508 result.putExtra(INSTALL_RESULT_EXTRA_INT, 0);503 result.putExtra(INSTALL_RESULT_EXTRA_INT, 0);
509 return result;504 return result;
510 }505 }
506
507 private Intent handleInstallFail(Intent i, int res, String failReason) {
508 i.putExtra(INSTALL_RESULT_EXTRA_INT, -1);
509 i.putExtra(INSTALL_RESULT_EXTRA_STR, "Missing update command");
510 doUninstallUbuntu(i);
511 return i;
512 }
511513
512 private Intent doUninstallUbuntu(Intent intent) {514 private Intent doUninstallUbuntu(Intent intent) {
513 File workingFolder = new File(mRootOfWorkPath, TEMP_FOLDER);515 File workingFolder = new File(mRootOfWorkPath, TEMP_FOLDER);
@@ -588,13 +590,13 @@
588 try {590 try {
589 Process process = Runtime.getRuntime().exec("su", null, getFilesDir());591 Process process = Runtime.getRuntime().exec("su", null, getFilesDir());
590 DataOutputStream os = new DataOutputStream(process.getOutputStream());592 DataOutputStream os = new DataOutputStream(process.getOutputStream());
591593
592 Utils.extractExecutableAsset(this, ANDROID_BOOTMGR, getFilesDir().toString(), true);594 Utils.extractExecutableAsset(this, ANDROID_BOOTMGR, getFilesDir().toString(), true);
593 // overwrite the recovery partition.595 // overwrite the recovery partition.
594 os.writeBytes(String.format("%s/%s -b %s/%s %s\n",596 os.writeBytes(String.format("%s/%s -b %s/%s %s\n",
595 getFilesDir().toString(),597 getFilesDir().getAbsolutePath(),
596 ANDROID_BOOTMGR,598 ANDROID_BOOTMGR,
597 getFilesDir().toString(),599 getFilesDir().getAbsolutePath(),
598 UBUNTU_BOOT_IMG,600 UBUNTU_BOOT_IMG,
599 Utils.getRecoveryPartitionPath()601 Utils.getRecoveryPartitionPath()
600 ));602 ));
@@ -643,9 +645,12 @@
643 try {645 try {
644 Process process = Runtime.getRuntime().exec("su", null, workingFolder);646 Process process = Runtime.getRuntime().exec("su", null, workingFolder);
645 DataOutputStream os = new DataOutputStream(process.getOutputStream());647 DataOutputStream os = new DataOutputStream(process.getOutputStream());
648 // make sure we are in work folder
646 os.writeBytes("echo \"SU granted\"\n");649 os.writeBytes("echo \"SU granted\"\n");
647 for (String c : commands) {650 for (String c : commands) {
648 Log.v(TAG, "Executing:" + c);651 Log.v(TAG, "Executing:" + c);
652 // make sure we are always at working folder before running next command
653 os.writeBytes(String.format("cd %s\n", workingFolder.getAbsolutePath()));
649 os.writeBytes(c);654 os.writeBytes(c);
650 }655 }
651 os.writeBytes(String.format("rm -rf %s\n", workingFolder.getAbsolutePath()));656 os.writeBytes(String.format("rm -rf %s\n", workingFolder.getAbsolutePath()));
@@ -728,9 +733,7 @@
728 if (releases.size() == 0 || releases.get(0).files.length == 0 ) {733 if (releases.size() == 0 || releases.get(0).files.length == 0 ) {
729 // something is wrong, empty release734 // something is wrong, empty release
730 Log.e(TAG, "Empty releas");735 Log.e(TAG, "Empty releas");
731 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);736 return handleDownloadError(result, -1, "Empty release");
732 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "Empty release");
733 return result;
734 }737 }
735 // get right version, otherwise first since that is most recent one738 // get right version, otherwise first since that is most recent one
736 Image choosenRelease = null;739 Image choosenRelease = null;
@@ -744,9 +747,7 @@
744 }747 }
745 if (choosenRelease == null) {748 if (choosenRelease == null) {
746 Log.e(TAG, "wrong release vwersion");749 Log.e(TAG, "wrong release vwersion");
747 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);750 return handleDownloadError(result, -1, "wrong release vwersion");
748 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "wrong release vwersion");
749 return result;
750 }751 }
751 } else {752 } else {
752 choosenRelease = releases.get(0);753 choosenRelease = releases.get(0);
@@ -771,9 +772,7 @@
771 String s = deleteRelease();772 String s = deleteRelease();
772 if (s != null) {773 if (s != null) {
773 // remove failed774 // remove failed
774 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);775 return handleDownloadError(result, -1, s);
775 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, s);
776 return result;
777 }776 }
778 // make sure release folder exists777 // make sure release folder exists
779 File release = new File(rootFolder,RELEASE_FOLDER);778 File release = new File(rootFolder,RELEASE_FOLDER);
@@ -794,10 +793,7 @@
794 msg += "/data need 2.5G for system plus " + String.valueOf(mTotalSize) + " bytes for download";793 msg += "/data need 2.5G for system plus " + String.valueOf(mTotalSize) + " bytes for download";
795 }794 }
796 Log.i(TAG, msg);795 Log.i(TAG, msg);
797796 return handleDownloadError(result, -1, msg);
798 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);
799 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, msg);
800 return result;
801 }797 }
802798
803 // mProgressSteps = mTotalDownloadSize / 100; // we want 1% steps799 // mProgressSteps = mTotalDownloadSize / 100; // we want 1% steps
@@ -832,29 +828,19 @@
832 }828 }
833 } catch (MalformedURLException e) {829 } catch (MalformedURLException e) {
834 Log.e(TAG, "Failed to download release:", e);830 Log.e(TAG, "Failed to download release:", e);
835 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);831 return handleDownloadError(result, -1, "Malformed release url");
836 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "Malformed release url");
837 return result;
838 } catch (FileNotFoundException e) {832 } catch (FileNotFoundException e) {
839 Log.e(TAG, "Failed to download release:", e);833 Log.e(TAG, "Failed to download release:", e);
840 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);834 return handleDownloadError(result, -1, "File not found");
841 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "File not found");
842 return result;
843 } catch (IOException e){835 } catch (IOException e){
844 Log.e(TAG, "Failed to download release:", e);836 Log.e(TAG, "Failed to download release:", e);
845 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);837 return handleDownloadError(result, -1, "IO Error");
846 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "IO Error");
847 return result;
848 } catch (ESumNotMatchException e) {838 } catch (ESumNotMatchException e) {
849 // Download file check sum error !!839 // Download file check sum error !!
850 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);840 return handleDownloadError(result, -1, "Download check sum error");
851 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "Download check sum error");
852 return result;
853 } catch (ECancelException e) {841 } catch (ECancelException e) {
854 // Download was cancelled by user842 // Download was cancelled by user
855 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -2);843 return handleDownloadError(result, -2, "Download cancelled by user");
856 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "Download cancelled by user");
857 return result;
858 }844 }
859845
860 Log.i(TAG, "Download done in " + (System.currentTimeMillis() - time )/1000 + " seconds");846 Log.i(TAG, "Download done in " + (System.currentTimeMillis() - time )/1000 + " seconds");
@@ -907,9 +893,7 @@
907 }893 }
908 } catch (IOException e) {894 } catch (IOException e) {
909 e.printStackTrace();895 e.printStackTrace();
910 result.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);896 return handleDownloadError(result, -1, "Failed to generate update command");
911 result.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "Failed to generate update command");
912 return result;
913 }897 }
914 broadcastProgress(-1, "Download done in " + (System.currentTimeMillis() - time )/1000 + " seconds");898 broadcastProgress(-1, "Download done in " + (System.currentTimeMillis() - time )/1000 + " seconds");
915 int estimatedCheckCount = 0;899 int estimatedCheckCount = 0;
@@ -939,9 +923,11 @@
939 return result;923 return result;
940 }924 }
941 925
942 class DownloadTask {926 private Intent handleDownloadError(Intent i, int res, String reason) {
943 URL url;927 i.putExtra(DOWNLOAD_RESULT_EXTRA_INT, -1);
944 File targetFolder;928 i.putExtra(DOWNLOAD_RESULT_EXTRA_STR, "Failed to generate update command");
929 deleteRelease();
930 return i;
945 }931 }
946932
947 private String doDownloadUrl(URL url, File targerLocation) throws MalformedURLException,933 private String doDownloadUrl(URL url, File targerLocation) throws MalformedURLException,
@@ -1018,12 +1004,19 @@
1018 return null;1004 return null;
1019 }1005 }
1020 1006
1021 private void broadcastServiceState() {1007 private void broadcastInstallerState() {
1022 Intent i = new Intent(SERVICE_STATE);1008 Intent i = new Intent(SERVICE_STATE);
1023 i.putExtra(SERVICE_STATE, mServiceState.ordinal());1009 i.putExtra(SERVICE_STATE, mInstallerState.ordinal());
1024 sendBroadcast(i);1010 sendBroadcast(i);
1025 }1011 }
1026 1012
1013 private void updateInstallerState(InstallerState newState) {
1014 mInstallerState = newState;
1015 Intent i = new Intent(SERVICE_STATE);
1016 i.putExtra(SERVICE_STATE, mInstallerState.ordinal());
1017 sendBroadcast(i);
1018 }
1019
1027 private void broadcastProgress(int val, String progress) {1020 private void broadcastProgress(int val, String progress) {
1028 Intent i = new Intent(PROGRESS);1021 Intent i = new Intent(PROGRESS);
1029 i.putExtra(PROGRESS_EXTRA_INT, val);1022 i.putExtra(PROGRESS_EXTRA_INT, val);
@@ -1092,16 +1085,17 @@
1092 public static boolean checkifReadyToInstall(Context context) {1085 public static boolean checkifReadyToInstall(Context context) {
1093 SharedPreferences pref = context.getSharedPreferences(SHARED_PREF, Context.MODE_PRIVATE);1086 SharedPreferences pref = context.getSharedPreferences(SHARED_PREF, Context.MODE_PRIVATE);
1094 String command = pref.getString(PREF_KEY_UPDATE_COMMAND, "");1087 String command = pref.getString(PREF_KEY_UPDATE_COMMAND, "");
1095 boolean ready = false;
1096 if (!command.equals("")){1088 if (!command.equals("")){
1097 File f = new File(command);1089 File f = new File(command);
1098 if (f.exists()) {1090 if (f.exists()) {
1099 return true;1091 return true;
1100 } else {1092 } else {
1101 pref.edit().putString(PREF_KEY_UPDATE_COMMAND, "").commit();1093 pref.edit().putString(PREF_KEY_UPDATE_COMMAND, "").commit();
1094 VersionInfo.storeEmptyVersion(pref.edit(), PREF_KEY_DOWNLOADED_VERSION);
1102 return false;1095 return false;
1103 }1096 }
1104 }1097 }
1098 VersionInfo.storeEmptyVersion(pref.edit(), PREF_KEY_DOWNLOADED_VERSION);
1105 return false;1099 return false;
1106 }1100 }
1107}1101}

Subscribers

People subscribed via source and target branches

to all changes: