blob: fc21d482511ebc4b377826db5f8c789a5222a7e1 [file] [log] [blame]
Jose Pascoalb690af12014-10-06 18:29:26 +01001package com.fairphone.updater.fragments;
2
Jose Pascoal54b3ae62014-10-07 20:29:58 +01003import java.io.File;
4import java.io.IOException;
5import java.util.concurrent.TimeoutException;
6
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +00007import android.annotation.SuppressLint;
Jose Pascoal75392162014-10-15 18:29:01 +01008import android.app.AlertDialog;
Jose Pascoalb690af12014-10-06 18:29:26 +01009import android.app.DownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010010import android.app.ProgressDialog;
11import android.content.BroadcastReceiver;
12import android.content.Context;
Jose Pascoal75392162014-10-15 18:29:01 +010013import android.content.DialogInterface;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010014import android.content.Intent;
15import android.content.IntentFilter;
Tiago Costa87925fe2014-12-02 17:57:51 +000016import android.content.SharedPreferences.Editor;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010017import android.content.res.Resources;
18import android.content.res.Resources.NotFoundException;
Jose Pascoalb690af12014-10-06 18:29:26 +010019import android.database.Cursor;
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000020import android.net.ConnectivityManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010021import android.os.AsyncTask;
Jose Pascoalb690af12014-10-06 18:29:26 +010022import android.os.Bundle;
23import android.os.Environment;
Jose Pascoal49f058a2015-02-13 16:58:01 +000024import android.os.PowerManager;
Jose Pascoalb690af12014-10-06 18:29:26 +010025import android.util.Log;
26import android.view.LayoutInflater;
27import android.view.View;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010028import android.view.View.OnClickListener;
Jose Pascoalb690af12014-10-06 18:29:26 +010029import android.view.ViewGroup;
30import android.widget.Button;
31import android.widget.LinearLayout;
32import android.widget.ProgressBar;
33import android.widget.TextView;
34import android.widget.Toast;
35
Jose Pascoal7bf83a02014-10-13 18:30:18 +010036import com.fairphone.updater.FairphoneUpdater.HeaderType;
37import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010038import com.fairphone.updater.R;
Jose Pascoal02d86242014-12-17 18:50:08 +000039import com.fairphone.updater.UpdaterService;
Jose Pascoal1c049e02014-12-17 13:03:09 +000040import com.fairphone.updater.data.DownloadableItem;
Tiago Costa198bf3d2014-12-16 15:23:18 +000041import com.fairphone.updater.data.Store;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010042import com.fairphone.updater.data.Version;
Jose Pascoalc2545cc2014-12-18 16:51:52 +000043import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoal49f058a2015-02-13 16:58:01 +000044import com.fairphone.updater.tools.PrivilegeChecker;
Jose Pascoalb690af12014-10-06 18:29:26 +010045import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010046import com.stericson.RootTools.RootTools;
47import com.stericson.RootTools.exceptions.RootDeniedException;
48import com.stericson.RootTools.execution.CommandCapture;
49import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010050
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000051@SuppressLint("ValidFragment")
Jose Pascoal810950b2014-10-09 17:16:08 +010052public class DownloadAndRestartFragment extends BaseFragment
53{
Jose Pascoalb690af12014-10-06 18:29:26 +010054
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +000055 private static final int PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS = 1000;
56
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000057 private static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoal46fdb062015-02-05 18:59:32 +000058 private static final int GET_LATEST_DOWNLOAD_ID_RETRIES = 12;
Jose Pascoalb690af12014-10-06 18:29:26 +010059
Jose Pascoal810950b2014-10-09 17:16:08 +010060 private TextView mDownloadVersionName;
61 private LinearLayout mVersionDownloadingGroup;
62 private ProgressBar mVersionDownloadProgressBar;
63 private LinearLayout mVersionInstallGroup;
64 private Button mRestartButton;
65 private Button mCancelButton;
66 private Version mSelectedVersion;
Tiago Costa198bf3d2014-12-16 15:23:18 +000067 private Store mSelectedStore;
Jose Pascoalb690af12014-10-06 18:29:26 +010068
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000069 private final boolean mIsVersion;
Jose Pascoal1c049e02014-12-17 13:03:09 +000070
Jose Pascoal810950b2014-10-09 17:16:08 +010071 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010072
Jose Pascoal810950b2014-10-09 17:16:08 +010073 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010074
Tiago Costa73eda412014-11-18 14:37:42 +000075 private BroadcastReceiver mNetworkStateReceiver;
76
Jose Pascoal810950b2014-10-09 17:16:08 +010077 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010078
Jose Pascoal1c049e02014-12-17 13:03:09 +000079 public DownloadAndRestartFragment(boolean isVersion)
80 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000081 super();
Jose Pascoal1c049e02014-12-17 13:03:09 +000082
Tiago Costa198bf3d2014-12-16 15:23:18 +000083 mIsVersion = isVersion;
84 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000085
Jose Pascoal810950b2014-10-09 17:16:08 +010086 @Override
87 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
88 {
89 // Inflate the layout for this fragment
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000090 View view;
Jose Pascoal1c049e02014-12-17 13:03:09 +000091 if (mIsVersion)
92 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000093 mSelectedVersion = mainActivity.getSelectedVersion();
94 view = inflateViewByImageType(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000095 mSelectedStore = null;
96 }
97 else
98 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000099 mSelectedStore = mainActivity.getSelectedStore();
100 view = inflateStoreView(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000101 mSelectedVersion = null;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000102 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000103
Jose Pascoal810950b2014-10-09 17:16:08 +0100104 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000105
Jose Pascoal810950b2014-10-09 17:16:08 +0100106 return view;
107 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000108
Tiago Costa198bf3d2014-12-16 15:23:18 +0000109 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
110 {
111 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
112 if (mSelectedVersion != null)
113 {
114 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
115 {
116 view = inflater.inflate(R.layout.fragment_download_android, container, false);
117 }
118 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
119 {
120 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
121 }
122 }
123 return view;
124 }
125
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000126 private static View inflateStoreView(LayoutInflater inflater, ViewGroup container)
Tiago Costa198bf3d2014-12-16 15:23:18 +0000127 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000128
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000129 return inflater.inflate(R.layout.fragment_download_app_store, container, false);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000130 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100131
Jose Pascoal810950b2014-10-09 17:16:08 +0100132 private void toggleDownloadProgressAndRestart()
133 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100134 UpdaterState state = mainActivity.getCurrentUpdaterState();
135 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +0100136 {
137 case DOWNLOAD:
138 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100139
Jose Pascoal810950b2014-10-09 17:16:08 +0100140 mVersionInstallGroup.setVisibility(View.GONE);
141 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
142 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100143
Jose Pascoal810950b2014-10-09 17:16:08 +0100144 case PREINSTALL:
145 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100146
Jose Pascoal810950b2014-10-09 17:16:08 +0100147 mVersionDownloadingGroup.setVisibility(View.GONE);
148 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100149
150 mRestartButton.setOnClickListener(new OnClickListener()
151 {
152
153 @Override
154 public void onClick(View v)
155 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000156 if (mIsVersion)
157 {
158 showEraseAllDataWarning();
159 }
160 else if (mSelectedStore != null)
161 {
162 startPreInstall();
163 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100164 }
165 });
166
Jose Pascoal810950b2014-10-09 17:16:08 +0100167 break;
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000168 case NORMAL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100169 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100170 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal87758742015-01-28 20:00:22 +0000171 mainActivity.onBackPressed();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100172 return;
173
Jose Pascoal810950b2014-10-09 17:16:08 +0100174 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100175
Jose Pascoal810950b2014-10-09 17:16:08 +0100176 mCancelButton.setOnClickListener(new OnClickListener()
177 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100178
Jose Pascoal810950b2014-10-09 17:16:08 +0100179 @Override
180 public void onClick(View v)
181 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000182 abortUpdateProcess();
Jose Pascoal87758742015-01-28 20:00:22 +0000183 mainActivity.onBackPressed();
Jose Pascoal810950b2014-10-09 17:16:08 +0100184 }
185 });
186 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100187
Jose Pascoal75392162014-10-15 18:29:01 +0100188 private void showEraseAllDataWarning()
189 {
Tiago Costa73eda412014-11-18 14:37:42 +0000190 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100191 {
192 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
193 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
194 {
195
196 @Override
197 public void onClick(DialogInterface dialog, int which)
198 {
199 startPreInstall();
200 }
201 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
202 {
203 public void onClick(DialogInterface dialog, int which)
204 {
205 // do nothing
206 }
207 }).show();
208 }
209 else
210 {
211 startPreInstall();
212 }
213 }
214
Jose Pascoal1c049e02014-12-17 13:03:09 +0000215 private void updateHeader()
216 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000217 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100218 {
219 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
220 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000221 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100222 }
223 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
224 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000225 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100226 }
227 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000228 else if (mSelectedStore != null)
229 {
230 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
231 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100232 else
233 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000234 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100235 }
236 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100237
Jose Pascoal810950b2014-10-09 17:16:08 +0100238 private void startDownloadProgressUpdateThread()
239 {
240 new Thread(new Runnable()
241 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100242
Jose Pascoal810950b2014-10-09 17:16:08 +0100243 @Override
244 public void run()
245 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100246 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100247
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000248 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000249
Jose Pascoal46fdb062015-02-05 18:59:32 +0000250 int count = GET_LATEST_DOWNLOAD_ID_RETRIES;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000251
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000252 // Wait a sensible amount of time to get a correct reference to the download
253 while ((latestUpdateDownloadId <= 0) && count > 0)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000254 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000255 try
256 {
Jose Pascoal46fdb062015-02-05 18:59:32 +0000257 Thread.sleep(Utils.DELAY_HALF_SECOND);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000258 count--;
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000259 latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000260 } catch (InterruptedException e)
261 {
262 e.printStackTrace();
263 }
264 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000265
Jose Pascoalaa579a82014-11-05 22:17:16 +0000266 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100267 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100268
Jose Pascoal810950b2014-10-09 17:16:08 +0100269 DownloadManager.Query q = new DownloadManager.Query();
270 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100271
Jose Pascoalaa579a82014-11-05 22:17:16 +0000272 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000273
Jose Pascoalda015b12014-11-06 12:47:11 +0000274 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100275 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100276 try
277 {
278 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
279 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100280
Jose Pascoal46fdb062015-02-05 18:59:32 +0000281 if ((bytes_total + Utils.BUFFER_SIZE_10_MBYTES) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100282 {
283 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100284 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000285 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100286 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000287 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100288 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000289 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
290 {
291 case DownloadManager.STATUS_SUCCESSFUL:
292 case DownloadManager.STATUS_FAILED:
293 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100294
Jose Pascoalaa579a82014-11-05 22:17:16 +0000295 bytes_downloaded = 0;
296 bytes_total = 0;
297 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000298 default:
299 break;
Jose Pascoalaa579a82014-11-05 22:17:16 +0000300 }
301
302 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
303 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100304 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100305 } catch (Exception e)
306 {
307 downloading = false;
308 Log.e(TAG, "Error updating download progress: " + e.getMessage());
309 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100310
Jose Pascoal810950b2014-10-09 17:16:08 +0100311 cursor.close();
312 try
313 {
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000314 Thread.sleep(PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS);
Jose Pascoal810950b2014-10-09 17:16:08 +0100315 } catch (InterruptedException e)
316 {
317 e.printStackTrace();
318 }
319 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000320 else
321 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000322 if (cursor != null)
323 {
324 downloading = false;
325 cursor.close();
326 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000327 if (mDownloadManager == null)
328 {
329 downloading = false;
330 }
331 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100332 }
333 }
334 }).start();
335 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100336
Jose Pascoal810950b2014-10-09 17:16:08 +0100337 private void setupLayout(View view)
338 {
339 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100340
Jose Pascoal810950b2014-10-09 17:16:08 +0100341 // download in progress group
342 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
343 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100344
Jose Pascoal810950b2014-10-09 17:16:08 +0100345 // restart group
346 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
347 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100348
Jose Pascoal810950b2014-10-09 17:16:08 +0100349 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
350 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100351
Jose Pascoal810950b2014-10-09 17:16:08 +0100352 @Override
353 public void onResume()
354 {
355 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100356
Jose Pascoal810950b2014-10-09 17:16:08 +0100357 setupInstallationReceivers();
358 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100359
Filipe97f2bec2015-02-11 14:52:49 +0000360 registerNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000361
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100362 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000363
Jose Pascoal02d86242014-12-17 18:50:08 +0000364 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
365 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000366 {
Jose Pascoal40916302015-02-06 18:43:47 +0000367 mDownloadVersionName.setText(mainActivity.getItemName(item, mIsVersion));
Tiago Costa198bf3d2014-12-16 15:23:18 +0000368 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000369
Jose Pascoal810950b2014-10-09 17:16:08 +0100370 toggleDownloadProgressAndRestart();
371 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100372
Filipe97f2bec2015-02-11 14:52:49 +0000373 private void registerNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000374 {
Filipe97f2bec2015-02-11 14:52:49 +0000375 unregisterNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000376 // Setup monitoring for future connectivity status changes
Filipe97f2bec2015-02-11 14:52:49 +0000377 mNetworkStateReceiver = new BroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000378 {
Filipe97f2bec2015-02-11 14:52:49 +0000379 @Override
380 public void onReceive(Context context, Intent intent)
Tiago Costa73eda412014-11-18 14:37:42 +0000381 {
Filipe97f2bec2015-02-11 14:52:49 +0000382 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
Tiago Costa73eda412014-11-18 14:37:42 +0000383 {
Filipe97f2bec2015-02-11 14:52:49 +0000384 abortUpdateProcess();
385 mainActivity.onBackPressed();
Tiago Costa73eda412014-11-18 14:37:42 +0000386 }
Filipe97f2bec2015-02-11 14:52:49 +0000387 }
388 };
Tiago Costa73eda412014-11-18 14:37:42 +0000389
390 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
391 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
392 }
393
Filipe97f2bec2015-02-11 14:52:49 +0000394 private void unregisterNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000395 {
396 if (mNetworkStateReceiver != null)
397 {
398 mainActivity.unregisterReceiver(mNetworkStateReceiver);
399
400 mNetworkStateReceiver = null;
401 }
402 }
403
Jose Pascoal810950b2014-10-09 17:16:08 +0100404 @Override
405 public void onPause()
406 {
407 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100408
Jose Pascoal810950b2014-10-09 17:16:08 +0100409 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000410
Filipe97f2bec2015-02-11 14:52:49 +0000411 unregisterNetworkStatusBroadcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100412 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100413
Jose Pascoal810950b2014-10-09 17:16:08 +0100414 private void setupInstallationReceivers()
415 {
416 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100417
Jose Pascoal810950b2014-10-09 17:16:08 +0100418 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
419 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100420
Jose Pascoal810950b2014-10-09 17:16:08 +0100421 private void registerDownloadBroadCastReceiver()
422 {
423 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
424 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100425
Jose Pascoal810950b2014-10-09 17:16:08 +0100426 private void unregisterBroadCastReceiver()
427 {
428 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
429 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100430
Jose Pascoal810950b2014-10-09 17:16:08 +0100431 private class DownloadBroadCastReceiver extends BroadcastReceiver
432 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100433
Jose Pascoal810950b2014-10-09 17:16:08 +0100434 @Override
435 public void onReceive(Context context, Intent intent)
436 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100437
Jose Pascoal810950b2014-10-09 17:16:08 +0100438 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100439
Jose Pascoal810950b2014-10-09 17:16:08 +0100440 updateDownloadFile();
441 }
442 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100443
Jose Pascoal810950b2014-10-09 17:16:08 +0100444 private void updateDownloadFile()
445 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100446
Jose Pascoal810950b2014-10-09 17:16:08 +0100447 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100448
Jose Pascoal810950b2014-10-09 17:16:08 +0100449 if (downloadId != 0)
450 {
451 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100452
Jose Pascoal810950b2014-10-09 17:16:08 +0100453 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100454
Jose Pascoalaa579a82014-11-05 22:17:16 +0000455 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100456
Jose Pascoalaa579a82014-11-05 22:17:16 +0000457 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100458 {
459 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
460 int status = cursor.getInt(columnIndex);
461
462 switch (status)
463 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000464
Jose Pascoal810950b2014-10-09 17:16:08 +0100465 case DownloadManager.STATUS_SUCCESSFUL:
466 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
467 toggleDownloadProgressAndRestart();
468 break;
469 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000470 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100471 startDownloadProgressUpdateThread();
472 break;
473 case DownloadManager.STATUS_FAILED:
474 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000475 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
476 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100477 {
Jose Pascoal40916302015-02-06 18:43:47 +0000478 String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item, mIsVersion);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000479 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
480 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100481 else
482 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100483 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100484 }
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000485 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100486 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000487 default:
488 break;
Jose Pascoal810950b2014-10-09 17:16:08 +0100489 }
490 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100491 else
492 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000493 abortUpdateProcess();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100494 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100495
Jose Pascoalaa579a82014-11-05 22:17:16 +0000496 if (cursor != null)
497 {
498 cursor.close();
499 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100500 }
501 }
502
503 // ************************************************************************************
504 // PRE INSTALL
505 // ************************************************************************************
506
Jose Pascoal1c049e02014-12-17 13:03:09 +0000507 private void setupPreInstallState()
Tiago Costa198bf3d2014-12-16 15:23:18 +0000508 {
509 Resources resources = mainActivity.getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000510 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
511 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100512 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000513 File file = new File(getDownloadPath(item));
Jose Pascoal810950b2014-10-09 17:16:08 +0100514
515 if (file.exists())
516 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000517 if (Utils.checkMD5(item.getMd5Sum(), file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100518 {
519 copyUpdateToCache(file);
Jose Pascoal810950b2014-10-09 17:16:08 +0100520 }
521 else
522 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100523 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100524 removeLastUpdateDownload();
525 }
526 }
527 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100528 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100529
Jose Pascoal810950b2014-10-09 17:16:08 +0100530 // ************************************************************************************
531 // DOWNLOAD UPDATE
532 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100533
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000534 void setupDownloadState()
Jose Pascoal810950b2014-10-09 17:16:08 +0100535 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000536 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000537
Jose Pascoal810950b2014-10-09 17:16:08 +0100538 // setup the download state views
Jose Pascoal1c049e02014-12-17 13:03:09 +0000539 if (item == null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100540 {
541 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100542
Jose Pascoal810950b2014-10-09 17:16:08 +0100543 // we don't have the lastest.xml so get back to initial state
544 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100545
Jose Pascoal46fdb062015-02-05 18:59:32 +0000546 final boolean notDeleted = !updateDir.delete();
547 if(notDeleted) {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000548 Log.d(TAG, "Unable to delete "+updateDir.getAbsolutePath());
549 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100550
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000551 abortUpdateProcess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100552
Jose Pascoal810950b2014-10-09 17:16:08 +0100553 return;
554 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100555
Jose Pascoal810950b2014-10-09 17:16:08 +0100556 // if there is a download ID on the shared preferences
557 if (mLatestUpdateDownloadId == 0)
558 {
559 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100560
Jose Pascoal810950b2014-10-09 17:16:08 +0100561 // invalid download Id
562 if (mLatestUpdateDownloadId == 0)
563 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000564 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100565 return;
566 }
567 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100568
Jose Pascoal810950b2014-10-09 17:16:08 +0100569 updateDownloadFile();
570 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100571
Jose Pascoal810950b2014-10-09 17:16:08 +0100572 private void startPreInstall()
573 {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000574 final Resources resources = getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000575 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
576
Jose Pascoal49f058a2015-02-13 16:58:01 +0000577 String otaPackagePath = Utils.getOtaPackagePath(resources, item, mIsVersion);
578 File f = new File(otaPackagePath);
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000579 if (!f.exists())
580 {
581 abortUpdateProcess();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000582 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000583 else if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100584 {
585 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100586 try
587 {
Jose Pascoal49f058a2015-02-13 16:58:01 +0000588 Utils.writeCacheCommand(mainActivity, otaPackagePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100589
Jose Pascoal49f058a2015-02-13 16:58:01 +0000590 new Thread(new Runnable() {
591 @SuppressLint("CommitPrefEdits")
592 @Override
593 public void run() {
594 Editor editor = mSharedPreferences.edit();
595 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
596 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100597
Jose Pascoal49f058a2015-02-13 16:58:01 +0000598 if (Utils.hasUnifiedPartition(resources))
599 {
600 removeLastUpdateDownload();
601 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100602
Jose Pascoal49f058a2015-02-13 16:58:01 +0000603 // remove the update files from data
604 removeUpdateFilesFromData();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100605
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000606 mainActivity.updateStatePreference(UpdaterState.NORMAL);
607 mainActivity.clearSelectedItems();
608 clearConfigFile();
609 editor = mSharedPreferences.edit();
610 editor.remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS);
611 editor.remove(MainFragment.SHARED_PREFERENCES_ENABLE_GAPPS);
612 editor.commit();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000613
614 // reboot the device into recovery
615 if(!Utils.rebootToRecovery(mainActivity)) {
616 Log.w(TAG, "Error rebooting to recovery");
617 abortUpdateProcess();
618 }
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000619 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000620 }).start();
621 } catch (IOException | NotFoundException | TimeoutException | RootDeniedException e)
622 {
623 Log.e(TAG, "Error writing commands to cache: " + e.getLocalizedMessage());
624 abortUpdateProcess();
625 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100626 }
627 else
628 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000629 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100630 }
631 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100632
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000633 private void clearConfigFile()
634 {
635 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
636 if (cfgFile != 0 && mDownloadManager != null)
637 {
638 mDownloadManager.remove(cfgFile);
639 }
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000640 mainActivity.clearConfigFileDownloadId();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000641 VersionParserHelper.removeConfigFiles(mainActivity);
642 }
643
Jose Pascoal810950b2014-10-09 17:16:08 +0100644 private void copyUpdateToCache(File file)
645 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000646 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100647 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000648 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal733b84e2014-10-17 14:49:02 +0100649 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000650 if (item != null)
651 {
Jose Pascoal40916302015-02-06 18:43:47 +0000652 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000653 }
654 else
655 {
656 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
657 abortUpdateProcess();
658 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100659 }
660 else
661 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000662 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100663 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000664 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
665 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100666
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000667 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100668 }
669 }
670 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100671
Jose Pascoal810950b2014-10-09 17:16:08 +0100672 // ************************************************************************************
673 // Update Removal
674 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000675 private void removeUpdateFilesFromData() {
676 if (PrivilegeChecker.isPrivilegedApp()) {
677 removeUpdateFilesFromDataPrivileged();
678 } else {
679 removeUpdateFilesFromDataUnprivileged();
680 }
681 }
682
683 private void removeUpdateFilesFromDataPrivileged() {
684 Resources resource = getResources();
685
686 try {
687 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
688 p.waitFor();
689 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
690 p.waitFor();
691 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
692 p.waitFor();
693 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
694 p.waitFor();
695 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
696 p.waitFor();
697 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
698 p.waitFor();
699 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
700 p.waitFor();
701 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
702 p.waitFor();
703 } catch (IOException | InterruptedException e) {
704 Log.d(TAG, "Failed to remove files from data:" +e);
705 }
706 }
707
708 private void removeUpdateFilesFromDataUnprivileged()
709 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100710 try
711 {
712 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
713 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
714 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
715 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
716 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000717 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100718 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000719 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100720 }
721 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100722
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000723 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100724 {
725 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000726 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100727 {
728 // residue download ID
729 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100730
Jose Pascoal810950b2014-10-09 17:16:08 +0100731 mainActivity.resetLastUpdateDownloadId();
732 }
733 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100734
Jose Pascoal810950b2014-10-09 17:16:08 +0100735 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
736 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100737
Jose Pascoal810950b2014-10-09 17:16:08 +0100738 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100739
Jose Pascoal810950b2014-10-09 17:16:08 +0100740 @Override
741 protected Integer doInBackground(String... params)
742 {
743 // check the correct number of
744 if (params.length != 2)
745 {
746 return -1;
747 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100748
Jose Pascoal810950b2014-10-09 17:16:08 +0100749 String originalFilePath = params[0];
750 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100751
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000752 Utils.clearCache();
753
754 File otaFilePath = new File(originalFilePath);
755 File otaFileCache = new File(destinyFilePath);
756
757 if (!otaFileCache.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100758 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000759 try {
760 Utils.copy(otaFilePath, otaFileCache);
761 } catch (IOException e) {
762 Log.e(TAG, "Failed to copy files to cache: "+e.getLocalizedMessage());
763 abortUpdateProcess();
764 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100765 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100766 else
767 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000768 abortUpdateProcess();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100769 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100770
Jose Pascoal810950b2014-10-09 17:16:08 +0100771 return 1;
772 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100773
Jose Pascoal810950b2014-10-09 17:16:08 +0100774 protected void onProgressUpdate(Integer... progress)
775 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100776
Jose Pascoal810950b2014-10-09 17:16:08 +0100777 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100778
Jose Pascoal810950b2014-10-09 17:16:08 +0100779 protected void onPreExecute()
780 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100781
Jose Pascoal810950b2014-10-09 17:16:08 +0100782 if (mProgress == null)
783 {
784 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100785 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100786 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
787 }
788 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100789
Jose Pascoal810950b2014-10-09 17:16:08 +0100790 protected void onPostExecute(Integer result)
791 {
792 // disable the spinner
793 if (mProgress != null)
794 {
795 mProgress.dismiss();
796 mProgress = null;
797 }
798 }
799 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100800
Jose Pascoal1c049e02014-12-17 13:03:09 +0000801 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100802 {
803 Resources resources = mainActivity.getResources();
Jose Pascoal40916302015-02-06 18:43:47 +0000804 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000805 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100806
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000807 public void abortUpdateProcess()
Jose Pascoalb397dc62014-10-13 19:26:58 +0100808 {
Tiago Costa73eda412014-11-18 14:37:42 +0000809 removeLastUpdateDownload();
810
Jose Pascoal87758742015-01-28 20:00:22 +0000811 mainActivity.clearSelectedItems();
812 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100813 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100814}