blob: 9a4f0849466318899dd83d6c911038407034f22b [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 Pascoal4adf3192015-02-23 18:10:16 +000024import android.text.TextUtils;
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.exceptions.RootDeniedException;
47import com.stericson.RootTools.execution.CommandCapture;
48import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010049
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000050@SuppressLint("ValidFragment")
Jose Pascoal810950b2014-10-09 17:16:08 +010051public class DownloadAndRestartFragment extends BaseFragment
52{
Jose Pascoalb690af12014-10-06 18:29:26 +010053
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +000054 private static final int PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS = 1000;
55
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000056 private static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoal46fdb062015-02-05 18:59:32 +000057 private static final int GET_LATEST_DOWNLOAD_ID_RETRIES = 12;
Jose Pascoalb690af12014-10-06 18:29:26 +010058
Jose Pascoal810950b2014-10-09 17:16:08 +010059 private TextView mDownloadVersionName;
60 private LinearLayout mVersionDownloadingGroup;
61 private ProgressBar mVersionDownloadProgressBar;
62 private LinearLayout mVersionInstallGroup;
63 private Button mRestartButton;
64 private Button mCancelButton;
65 private Version mSelectedVersion;
Tiago Costa198bf3d2014-12-16 15:23:18 +000066 private Store mSelectedStore;
Jose Pascoalb690af12014-10-06 18:29:26 +010067
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000068 private final boolean mIsVersion;
Jose Pascoal1c049e02014-12-17 13:03:09 +000069
Jose Pascoal810950b2014-10-09 17:16:08 +010070 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010071
Jose Pascoal810950b2014-10-09 17:16:08 +010072 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010073
Tiago Costa73eda412014-11-18 14:37:42 +000074 private BroadcastReceiver mNetworkStateReceiver;
75
Jose Pascoal810950b2014-10-09 17:16:08 +010076 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010077
Jose Pascoal1c049e02014-12-17 13:03:09 +000078 public DownloadAndRestartFragment(boolean isVersion)
79 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000080 super();
Jose Pascoal1c049e02014-12-17 13:03:09 +000081
Tiago Costa198bf3d2014-12-16 15:23:18 +000082 mIsVersion = isVersion;
83 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000084
Jose Pascoal810950b2014-10-09 17:16:08 +010085 @Override
86 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
87 {
88 // Inflate the layout for this fragment
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000089 View view;
Jose Pascoal1c049e02014-12-17 13:03:09 +000090 if (mIsVersion)
91 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000092 mSelectedVersion = mainActivity.getSelectedVersion();
93 view = inflateViewByImageType(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000094 mSelectedStore = null;
95 }
96 else
97 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000098 mSelectedStore = mainActivity.getSelectedStore();
99 view = inflateStoreView(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000100 mSelectedVersion = null;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000101 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000102
Jose Pascoal810950b2014-10-09 17:16:08 +0100103 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000104
Jose Pascoal810950b2014-10-09 17:16:08 +0100105 return view;
106 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000107
Tiago Costa198bf3d2014-12-16 15:23:18 +0000108 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
109 {
110 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
111 if (mSelectedVersion != null)
112 {
113 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
114 {
115 view = inflater.inflate(R.layout.fragment_download_android, container, false);
116 }
117 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
118 {
119 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
120 }
121 }
122 return view;
123 }
124
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000125 private static View inflateStoreView(LayoutInflater inflater, ViewGroup container)
Tiago Costa198bf3d2014-12-16 15:23:18 +0000126 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000127
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000128 return inflater.inflate(R.layout.fragment_download_app_store, container, false);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000129 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100130
Jose Pascoal810950b2014-10-09 17:16:08 +0100131 private void toggleDownloadProgressAndRestart()
132 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100133 UpdaterState state = mainActivity.getCurrentUpdaterState();
134 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +0100135 {
136 case DOWNLOAD:
137 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100138
Jose Pascoal810950b2014-10-09 17:16:08 +0100139 mVersionInstallGroup.setVisibility(View.GONE);
140 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
141 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100142
Jose Pascoal810950b2014-10-09 17:16:08 +0100143 case PREINSTALL:
144 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100145
Jose Pascoal810950b2014-10-09 17:16:08 +0100146 mVersionDownloadingGroup.setVisibility(View.GONE);
147 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100148
149 mRestartButton.setOnClickListener(new OnClickListener()
150 {
151
152 @Override
153 public void onClick(View v)
154 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000155 if (mIsVersion)
156 {
157 showEraseAllDataWarning();
158 }
159 else if (mSelectedStore != null)
160 {
161 startPreInstall();
162 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100163 }
164 });
165
Jose Pascoal810950b2014-10-09 17:16:08 +0100166 break;
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000167 case NORMAL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100168 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100169 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal87758742015-01-28 20:00:22 +0000170 mainActivity.onBackPressed();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100171 return;
172
Jose Pascoal810950b2014-10-09 17:16:08 +0100173 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100174
Jose Pascoal810950b2014-10-09 17:16:08 +0100175 mCancelButton.setOnClickListener(new OnClickListener()
176 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100177
Jose Pascoal810950b2014-10-09 17:16:08 +0100178 @Override
179 public void onClick(View v)
180 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000181 abortUpdateProcess("");
Jose Pascoal87758742015-01-28 20:00:22 +0000182 mainActivity.onBackPressed();
Jose Pascoal810950b2014-10-09 17:16:08 +0100183 }
184 });
185 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100186
Jose Pascoal75392162014-10-15 18:29:01 +0100187 private void showEraseAllDataWarning()
188 {
Tiago Costa73eda412014-11-18 14:37:42 +0000189 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100190 {
191 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
192 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
193 {
194
195 @Override
196 public void onClick(DialogInterface dialog, int which)
197 {
198 startPreInstall();
199 }
200 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
201 {
202 public void onClick(DialogInterface dialog, int which)
203 {
204 // do nothing
205 }
206 }).show();
207 }
208 else
209 {
210 startPreInstall();
211 }
212 }
213
Jose Pascoal1c049e02014-12-17 13:03:09 +0000214 private void updateHeader()
215 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000216 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100217 {
218 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
219 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000220 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100221 }
222 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
223 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000224 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100225 }
226 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000227 else if (mSelectedStore != null)
228 {
229 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
230 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100231 else
232 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000233 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100234 }
235 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100236
Jose Pascoal810950b2014-10-09 17:16:08 +0100237 private void startDownloadProgressUpdateThread()
238 {
239 new Thread(new Runnable()
240 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100241
Jose Pascoal810950b2014-10-09 17:16:08 +0100242 @Override
243 public void run()
244 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100245 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100246
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000247 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000248
Jose Pascoal46fdb062015-02-05 18:59:32 +0000249 int count = GET_LATEST_DOWNLOAD_ID_RETRIES;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000250
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000251 // Wait a sensible amount of time to get a correct reference to the download
252 while ((latestUpdateDownloadId <= 0) && count > 0)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000253 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000254 try
255 {
Jose Pascoal46fdb062015-02-05 18:59:32 +0000256 Thread.sleep(Utils.DELAY_HALF_SECOND);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000257 count--;
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000258 latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000259 } catch (InterruptedException e)
260 {
261 e.printStackTrace();
262 }
263 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000264
Jose Pascoalaa579a82014-11-05 22:17:16 +0000265 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100266 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100267
Jose Pascoal810950b2014-10-09 17:16:08 +0100268 DownloadManager.Query q = new DownloadManager.Query();
269 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100270
Jose Pascoalaa579a82014-11-05 22:17:16 +0000271 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000272
Jose Pascoalda015b12014-11-06 12:47:11 +0000273 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100274 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100275 try
276 {
277 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
278 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100279
Jose Pascoal46fdb062015-02-05 18:59:32 +0000280 if ((bytes_total + Utils.BUFFER_SIZE_10_MBYTES) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100281 {
282 downloading = false;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000283 abortUpdateProcess(getResources().getString(R.string.no_space_available_sd_card_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100284 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000285 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100286 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000287 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
288 {
289 case DownloadManager.STATUS_SUCCESSFUL:
290 case DownloadManager.STATUS_FAILED:
291 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100292
Jose Pascoalaa579a82014-11-05 22:17:16 +0000293 bytes_downloaded = 0;
294 bytes_total = 0;
295 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000296 default:
297 break;
Jose Pascoalaa579a82014-11-05 22:17:16 +0000298 }
299
300 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
301 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100302 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100303 } catch (Exception e)
304 {
305 downloading = false;
306 Log.e(TAG, "Error updating download progress: " + e.getMessage());
307 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100308
Jose Pascoal810950b2014-10-09 17:16:08 +0100309 cursor.close();
310 try
311 {
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000312 Thread.sleep(PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS);
Jose Pascoal810950b2014-10-09 17:16:08 +0100313 } catch (InterruptedException e)
314 {
315 e.printStackTrace();
316 }
317 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000318 else
319 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000320 if (cursor != null)
321 {
322 downloading = false;
323 cursor.close();
324 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000325 if (mDownloadManager == null)
326 {
327 downloading = false;
328 }
329 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100330 }
331 }
332 }).start();
333 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100334
Jose Pascoal810950b2014-10-09 17:16:08 +0100335 private void setupLayout(View view)
336 {
337 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100338
Jose Pascoal810950b2014-10-09 17:16:08 +0100339 // download in progress group
340 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
341 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100342
Jose Pascoal810950b2014-10-09 17:16:08 +0100343 // restart group
344 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
345 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100346
Jose Pascoal810950b2014-10-09 17:16:08 +0100347 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
348 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100349
Jose Pascoal810950b2014-10-09 17:16:08 +0100350 @Override
351 public void onResume()
352 {
353 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100354
Jose Pascoal810950b2014-10-09 17:16:08 +0100355 setupInstallationReceivers();
356 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100357
Filipe97f2bec2015-02-11 14:52:49 +0000358 registerNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000359
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100360 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000361
Jose Pascoal02d86242014-12-17 18:50:08 +0000362 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
363 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000364 {
Jose Pascoal40916302015-02-06 18:43:47 +0000365 mDownloadVersionName.setText(mainActivity.getItemName(item, mIsVersion));
Tiago Costa198bf3d2014-12-16 15:23:18 +0000366 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000367
Jose Pascoal810950b2014-10-09 17:16:08 +0100368 toggleDownloadProgressAndRestart();
369 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100370
Filipe97f2bec2015-02-11 14:52:49 +0000371 private void registerNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000372 {
Filipe97f2bec2015-02-11 14:52:49 +0000373 unregisterNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000374 // Setup monitoring for future connectivity status changes
Filipe97f2bec2015-02-11 14:52:49 +0000375 mNetworkStateReceiver = new BroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000376 {
Filipe97f2bec2015-02-11 14:52:49 +0000377 @Override
378 public void onReceive(Context context, Intent intent)
Tiago Costa73eda412014-11-18 14:37:42 +0000379 {
Filipe97f2bec2015-02-11 14:52:49 +0000380 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
Tiago Costa73eda412014-11-18 14:37:42 +0000381 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000382 Log.w(TAG, "Aborted due to connection failure.");
383 abortUpdateProcess("");
Filipe97f2bec2015-02-11 14:52:49 +0000384 mainActivity.onBackPressed();
Tiago Costa73eda412014-11-18 14:37:42 +0000385 }
Filipe97f2bec2015-02-11 14:52:49 +0000386 }
387 };
Tiago Costa73eda412014-11-18 14:37:42 +0000388
389 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
390 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
391 }
392
Filipe97f2bec2015-02-11 14:52:49 +0000393 private void unregisterNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000394 {
395 if (mNetworkStateReceiver != null)
396 {
397 mainActivity.unregisterReceiver(mNetworkStateReceiver);
398
399 mNetworkStateReceiver = null;
400 }
401 }
402
Jose Pascoal810950b2014-10-09 17:16:08 +0100403 @Override
404 public void onPause()
405 {
406 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100407
Jose Pascoal810950b2014-10-09 17:16:08 +0100408 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000409
Filipe97f2bec2015-02-11 14:52:49 +0000410 unregisterNetworkStatusBroadcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100411 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100412
Jose Pascoal810950b2014-10-09 17:16:08 +0100413 private void setupInstallationReceivers()
414 {
415 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100416
Jose Pascoal810950b2014-10-09 17:16:08 +0100417 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
418 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100419
Jose Pascoal810950b2014-10-09 17:16:08 +0100420 private void registerDownloadBroadCastReceiver()
421 {
422 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
423 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100424
Jose Pascoal810950b2014-10-09 17:16:08 +0100425 private void unregisterBroadCastReceiver()
426 {
427 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
428 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100429
Jose Pascoal810950b2014-10-09 17:16:08 +0100430 private class DownloadBroadCastReceiver extends BroadcastReceiver
431 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100432
Jose Pascoal810950b2014-10-09 17:16:08 +0100433 @Override
434 public void onReceive(Context context, Intent intent)
435 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100436
Jose Pascoal810950b2014-10-09 17:16:08 +0100437 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100438
Jose Pascoal810950b2014-10-09 17:16:08 +0100439 updateDownloadFile();
440 }
441 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100442
Jose Pascoal810950b2014-10-09 17:16:08 +0100443 private void updateDownloadFile()
444 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100445
Jose Pascoal810950b2014-10-09 17:16:08 +0100446 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100447
Jose Pascoal810950b2014-10-09 17:16:08 +0100448 if (downloadId != 0)
449 {
450 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100451
Jose Pascoal810950b2014-10-09 17:16:08 +0100452 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100453
Jose Pascoalaa579a82014-11-05 22:17:16 +0000454 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100455
Jose Pascoalaa579a82014-11-05 22:17:16 +0000456 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100457 {
458 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
459 int status = cursor.getInt(columnIndex);
460
461 switch (status)
462 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000463
Jose Pascoal810950b2014-10-09 17:16:08 +0100464 case DownloadManager.STATUS_SUCCESSFUL:
465 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
466 toggleDownloadProgressAndRestart();
467 break;
468 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000469 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100470 startDownloadProgressUpdateThread();
471 break;
472 case DownloadManager.STATUS_FAILED:
473 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000474 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000475 String error;
Jose Pascoal02d86242014-12-17 18:50:08 +0000476 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 Pascoal4adf3192015-02-23 18:10:16 +0000479 error = resources.getString(R.string.error_downloading) + " " + downloadTitle;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000480 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100481 else
482 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000483 error = resources.getString(R.string.error_downloading);
Jose Pascoal810950b2014-10-09 17:16:08 +0100484 }
Jose Pascoal4adf3192015-02-23 18:10:16 +0000485 abortUpdateProcess(error);
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 {
Jose Pascoal4adf3192015-02-23 18:10:16 +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) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000548 Log.d(TAG, "Unable to delete " + updateDir.getAbsolutePath());
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000549 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100550
Jose Pascoal4adf3192015-02-23 18:10:16 +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 {
Jose Pascoal4adf3192015-02-23 18:10:16 +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);
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000578
579 boolean fileNotExists = !Utils.fileExists(otaPackagePath);
580
581 if (fileNotExists)
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000582 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000583 abortUpdateProcess(resources.getString(R.string.file_not_found_message) + ": " + otaPackagePath);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000584 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000585 else if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100586 {
587 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100588 try
589 {
Jose Pascoal49f058a2015-02-13 16:58:01 +0000590 Utils.writeCacheCommand(mainActivity, otaPackagePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100591
Jose Pascoal49f058a2015-02-13 16:58:01 +0000592 new Thread(new Runnable() {
593 @SuppressLint("CommitPrefEdits")
594 @Override
595 public void run() {
596 Editor editor = mSharedPreferences.edit();
597 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
598 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100599
Jose Pascoal49f058a2015-02-13 16:58:01 +0000600 if (Utils.hasUnifiedPartition(resources))
601 {
602 removeLastUpdateDownload();
603 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100604
Tiago Costad7e951f2015-03-02 17:37:33 +0000605 // remove the gapps stuff
606// String model = Utils.getModelAndOS(getActivity());
607// if( model.contains("FP1") ) {
608 try {
609
610 Utils.clearGappsData();
611 } catch (RootDeniedException | InterruptedException | IOException e) {
612 e.printStackTrace();
613 }
614// }
615
Jose Pascoal49f058a2015-02-13 16:58:01 +0000616 // remove the update files from data
617 removeUpdateFilesFromData();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100618
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000619 mainActivity.updateStatePreference(UpdaterState.NORMAL);
620 mainActivity.clearSelectedItems();
621 clearConfigFile();
622 editor = mSharedPreferences.edit();
623 editor.remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS);
624 editor.remove(MainFragment.SHARED_PREFERENCES_ENABLE_GAPPS);
625 editor.commit();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000626
627 // reboot the device into recovery
628 if(!Utils.rebootToRecovery(mainActivity)) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000629 String error = resources.getString(R.string.reboot_failed);
630 Log.w(TAG, error);
631 abortUpdateProcess(error);
Jose Pascoal49f058a2015-02-13 16:58:01 +0000632 }
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000633 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000634 }).start();
635 } catch (IOException | NotFoundException | TimeoutException | RootDeniedException e)
636 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000637 String error = resources.getString(R.string.command_write_to_cache_failed);
638 Log.e(TAG, error + ": " + e.getLocalizedMessage());
639 abortUpdateProcess(error);
Jose Pascoal49f058a2015-02-13 16:58:01 +0000640 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100641 }
642 else
643 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000644 Log.e(TAG, "Null item");
645 abortUpdateProcess("");
Jose Pascoal810950b2014-10-09 17:16:08 +0100646 }
647 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100648
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000649 private void clearConfigFile()
650 {
651 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
652 if (cfgFile != 0 && mDownloadManager != null)
653 {
654 mDownloadManager.remove(cfgFile);
655 }
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000656 mainActivity.clearConfigFileDownloadId();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000657 VersionParserHelper.removeConfigFiles(mainActivity);
658 }
659
Jose Pascoal810950b2014-10-09 17:16:08 +0100660 private void copyUpdateToCache(File file)
661 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000662 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100663 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000664 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal733b84e2014-10-17 14:49:02 +0100665 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000666 if (item != null)
667 {
Jose Pascoal40916302015-02-06 18:43:47 +0000668 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000669 }
670 else
671 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000672 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000673 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100674 }
675 else
676 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000677 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100678 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000679 Log.w(TAG, "No space on cache. Defaulting to Sdcard");
680 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100681 }
682 }
683 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100684
Jose Pascoal810950b2014-10-09 17:16:08 +0100685 // ************************************************************************************
686 // Update Removal
687 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000688 private void removeUpdateFilesFromData() {
689 if (PrivilegeChecker.isPrivilegedApp()) {
690 removeUpdateFilesFromDataPrivileged();
691 } else {
692 removeUpdateFilesFromDataUnprivileged();
693 }
694 }
695
696 private void removeUpdateFilesFromDataPrivileged() {
697 Resources resource = getResources();
698
699 try {
700 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
701 p.waitFor();
702 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
703 p.waitFor();
704 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
705 p.waitFor();
706 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
707 p.waitFor();
708 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
709 p.waitFor();
710 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
711 p.waitFor();
712 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
713 p.waitFor();
714 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
715 p.waitFor();
716 } catch (IOException | InterruptedException e) {
717 Log.d(TAG, "Failed to remove files from data:" +e);
718 }
719 }
720
721 private void removeUpdateFilesFromDataUnprivileged()
722 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100723 try
724 {
725 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
726 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
727 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
728 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
729 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000730 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100731 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000732 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100733 }
734 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100735
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000736 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100737 {
738 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000739 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100740 {
741 // residue download ID
742 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100743
Jose Pascoal810950b2014-10-09 17:16:08 +0100744 mainActivity.resetLastUpdateDownloadId();
745 }
746 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100747
Jose Pascoal810950b2014-10-09 17:16:08 +0100748 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
749 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100750
Jose Pascoal810950b2014-10-09 17:16:08 +0100751 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100752
Jose Pascoal810950b2014-10-09 17:16:08 +0100753 @Override
754 protected Integer doInBackground(String... params)
755 {
756 // check the correct number of
757 if (params.length != 2)
758 {
759 return -1;
760 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100761
Jose Pascoal810950b2014-10-09 17:16:08 +0100762 String originalFilePath = params[0];
763 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100764
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000765 Utils.clearCache();
766
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000767 File otaOriginalFile = new File(originalFilePath);
768 File otaDestinyFile = new File(destinyFilePath);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000769
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000770 if (otaOriginalFile.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100771 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000772 try {
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000773 Utils.copy(otaOriginalFile, otaDestinyFile);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000774 } catch (IOException e) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000775 String error = mainActivity.getResources().getString(R.string.copy_to_cache_failed_message);
776 Log.e(TAG, error + ": " + originalFilePath + ". " + e.getLocalizedMessage());
777 abortUpdateProcess(error);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000778 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100779 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100780 else
781 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000782 Resources resources = mainActivity.getResources();
783 String error = resources.getString(R.string.copy_to_cache_failed_message) + ". " + resources.getString(R.string.file_not_found_message) + ": " + originalFilePath;
784 Log.e(TAG, error);
785 abortUpdateProcess(error);
Jose Pascoal733b84e2014-10-17 14:49:02 +0100786 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100787
Jose Pascoal810950b2014-10-09 17:16:08 +0100788 return 1;
789 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100790
Jose Pascoal810950b2014-10-09 17:16:08 +0100791 protected void onProgressUpdate(Integer... progress)
792 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100793
Jose Pascoal810950b2014-10-09 17:16:08 +0100794 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100795
Jose Pascoal810950b2014-10-09 17:16:08 +0100796 protected void onPreExecute()
797 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100798
Jose Pascoal810950b2014-10-09 17:16:08 +0100799 if (mProgress == null)
800 {
801 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100802 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100803 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
804 }
805 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100806
Jose Pascoal810950b2014-10-09 17:16:08 +0100807 protected void onPostExecute(Integer result)
808 {
809 // disable the spinner
810 if (mProgress != null)
811 {
812 mProgress.dismiss();
813 mProgress = null;
814 }
815 }
816 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100817
Jose Pascoal1c049e02014-12-17 13:03:09 +0000818 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100819 {
820 Resources resources = mainActivity.getResources();
Jose Pascoal40916302015-02-06 18:43:47 +0000821 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000822 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100823
Jose Pascoal4adf3192015-02-23 18:10:16 +0000824 public void abortUpdateProcess(final String reason)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100825 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000826 if(!TextUtils.isEmpty(reason)) {
827 mainActivity.runOnUiThread(new Runnable() {
828 @Override
829 public void run() {
830 Toast.makeText(mainActivity, reason, Toast.LENGTH_LONG).show();
831 }
832 });
833 }
834
Tiago Costa73eda412014-11-18 14:37:42 +0000835 removeLastUpdateDownload();
836
Jose Pascoal87758742015-01-28 20:00:22 +0000837 mainActivity.clearSelectedItems();
838 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100839 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100840}