blob: 735393e64ba8ff5ba219d21bb9da75c93f5e629a [file] [log] [blame]
Jose Pascoalb690af12014-10-06 18:29:26 +01001package com.fairphone.updater.fragments;
2
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +00003import android.annotation.SuppressLint;
Jose Pascoal75392162014-10-15 18:29:01 +01004import android.app.AlertDialog;
Jose Pascoalb690af12014-10-06 18:29:26 +01005import android.app.DownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +01006import android.app.ProgressDialog;
7import android.content.BroadcastReceiver;
8import android.content.Context;
Jose Pascoal75392162014-10-15 18:29:01 +01009import android.content.DialogInterface;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010010import android.content.Intent;
11import android.content.IntentFilter;
Tiago Costa87925fe2014-12-02 17:57:51 +000012import android.content.SharedPreferences.Editor;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010013import android.content.res.Resources;
14import android.content.res.Resources.NotFoundException;
Jose Pascoalb690af12014-10-06 18:29:26 +010015import android.database.Cursor;
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000016import android.net.ConnectivityManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010017import android.os.AsyncTask;
Jose Pascoalb690af12014-10-06 18:29:26 +010018import android.os.Bundle;
19import android.os.Environment;
Jose Pascoal4adf3192015-02-23 18:10:16 +000020import android.text.TextUtils;
Jose Pascoalb690af12014-10-06 18:29:26 +010021import android.util.Log;
22import android.view.LayoutInflater;
23import android.view.View;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010024import android.view.View.OnClickListener;
Jose Pascoalb690af12014-10-06 18:29:26 +010025import android.view.ViewGroup;
26import android.widget.Button;
27import android.widget.LinearLayout;
28import android.widget.ProgressBar;
29import android.widget.TextView;
30import android.widget.Toast;
31
Jose Pascoal7bf83a02014-10-13 18:30:18 +010032import com.fairphone.updater.FairphoneUpdater.HeaderType;
33import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010034import com.fairphone.updater.R;
Jose Pascoal02d86242014-12-17 18:50:08 +000035import com.fairphone.updater.UpdaterService;
Jose Pascoal1c049e02014-12-17 13:03:09 +000036import com.fairphone.updater.data.DownloadableItem;
Tiago Costa198bf3d2014-12-16 15:23:18 +000037import com.fairphone.updater.data.Store;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010038import com.fairphone.updater.data.Version;
Jose Pascoalc2545cc2014-12-18 16:51:52 +000039import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoal49f058a2015-02-13 16:58:01 +000040import com.fairphone.updater.tools.PrivilegeChecker;
Jose Pascoalb690af12014-10-06 18:29:26 +010041import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010042import com.stericson.RootTools.exceptions.RootDeniedException;
43import com.stericson.RootTools.execution.CommandCapture;
44import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010045
Maarten Derks4bb57892016-01-26 10:52:53 +010046import java.io.File;
47import java.io.IOException;
48import java.util.concurrent.TimeoutException;
49
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 Pascoal79357c52015-03-12 20:14:29 +000058 private boolean mIsZipInstall;
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
Maarten Derks2f5e61e2016-04-12 14:17:55 +020073 private CopyFileToCacheTask copyTask;
74
Jose Pascoal810950b2014-10-09 17:16:08 +010075 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010076
Tiago Costa73eda412014-11-18 14:37:42 +000077 private BroadcastReceiver mNetworkStateReceiver;
78
Jose Pascoal810950b2014-10-09 17:16:08 +010079 private long mLatestUpdateDownloadId;
Jose Pascoal79357c52015-03-12 20:14:29 +000080 private TextView mDownloadCompleteLabel;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010081
Jose Pascoal1c049e02014-12-17 13:03:09 +000082 public DownloadAndRestartFragment(boolean isVersion)
83 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000084 super();
Jose Pascoal1c049e02014-12-17 13:03:09 +000085
Tiago Costa198bf3d2014-12-16 15:23:18 +000086 mIsVersion = isVersion;
87 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000088
Jose Pascoal810950b2014-10-09 17:16:08 +010089 @Override
90 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
91 {
92 // Inflate the layout for this fragment
Jose Pascoal79357c52015-03-12 20:14:29 +000093 mIsZipInstall = UpdaterState.ZIP_INSTALL == mainActivity.getCurrentUpdaterState();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000094 View view;
Jose Pascoal1c049e02014-12-17 13:03:09 +000095 if (mIsVersion)
96 {
Jose Pascoal79357c52015-03-12 20:14:29 +000097 mSelectedVersion = getSelectedVersion();
Tiago Costa198bf3d2014-12-16 15:23:18 +000098 view = inflateViewByImageType(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000099 mSelectedStore = null;
100 }
101 else
102 {
Tiago Costa198bf3d2014-12-16 15:23:18 +0000103 mSelectedStore = mainActivity.getSelectedStore();
104 view = inflateStoreView(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000105 mSelectedVersion = null;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000106 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000107
Jose Pascoal810950b2014-10-09 17:16:08 +0100108 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000109
Jose Pascoal810950b2014-10-09 17:16:08 +0100110 return view;
111 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000112
Jose Pascoal79357c52015-03-12 20:14:29 +0000113 private Version getSelectedVersion() {
114 Version version;
115 if(mIsZipInstall) {
116 Resources resources = mainActivity.getResources();
117
118 //Get the zip file name
119 String[] zipPath = getDownloadPath(null).split("/");
120 String zipName = "";
121 if (zipPath != null && zipPath.length > 0) {
122 zipName = zipPath[zipPath.length - 1];
123 }
124
125 version = new Version();
126 version.setName(resources.getString(R.string.install) + " " + zipName);
Jose Pascoal60c99372015-03-17 15:52:59 +0000127 version.setDownloadLink(mainActivity.getZipFilePath());
Maarten Derksf17e6db2016-02-09 15:10:53 +0100128 version.setId(null);
Maarten Derks4bb57892016-01-26 10:52:53 +0100129 } else
Jose Pascoal79357c52015-03-12 20:14:29 +0000130 {
131 version = mainActivity.getSelectedVersion();
132 }
133 return version;
134 }
135
Tiago Costa198bf3d2014-12-16 15:23:18 +0000136 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
137 {
138 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
139 if (mSelectedVersion != null)
140 {
141 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
142 {
143 view = inflater.inflate(R.layout.fragment_download_android, container, false);
144 }
145 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
146 {
147 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
148 }
149 }
150 return view;
151 }
152
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000153 private static View inflateStoreView(LayoutInflater inflater, ViewGroup container)
Tiago Costa198bf3d2014-12-16 15:23:18 +0000154 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000155
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000156 return inflater.inflate(R.layout.fragment_download_app_store, container, false);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000157 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100158
Jose Pascoal810950b2014-10-09 17:16:08 +0100159 private void toggleDownloadProgressAndRestart()
160 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100161 UpdaterState state = mainActivity.getCurrentUpdaterState();
162 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +0100163 {
164 case DOWNLOAD:
Filipe Gonçalvesa36d0bd2015-03-19 15:00:42 +0000165 mVersionInstallGroup.setVisibility(View.GONE);
166 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
Jose Pascoal810950b2014-10-09 17:16:08 +0100167 setupDownloadState();
Jose Pascoal810950b2014-10-09 17:16:08 +0100168 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100169
Jose Pascoal810950b2014-10-09 17:16:08 +0100170 case PREINSTALL:
Jose Pascoal79357c52015-03-12 20:14:29 +0000171 case ZIP_INSTALL:
Filipe Gonçalvesa36d0bd2015-03-19 15:00:42 +0000172 mVersionDownloadingGroup.setVisibility(View.GONE);
173 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoalb690af12014-10-06 18:29:26 +0100174
Filipe Gonçalvesa36d0bd2015-03-19 15:00:42 +0000175 setupPreInstallState();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100176
177 mRestartButton.setOnClickListener(new OnClickListener()
178 {
179
180 @Override
181 public void onClick(View v)
182 {
Maarten Derksc75843c2016-04-26 11:58:36 +0200183 if(Utils.isBatteryLevelOk(mainActivity)) {
184 if (mIsVersion) {
185 showEraseAllDataWarning();
186 } else if (mSelectedStore != null) {
187 startPreInstall();
188 }
189 } else {
190 AlertDialog.Builder batteryDialog = new AlertDialog.Builder(mainActivity);
191 batteryDialog.setIcon(R.drawable.ic_battery_std_fpblue_24dp);
192 batteryDialog.setTitle(R.string.charge_battery);
193 batteryDialog.setPositiveButton(R.string.got_it, new DialogInterface.OnClickListener() {
194 public void onClick(DialogInterface dialog, int id) {
195 // do nothing, since the state is still the same
196 }
197 });
198 batteryDialog.create();
199 batteryDialog.show();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000200 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100201 }
202 });
203
Jose Pascoal810950b2014-10-09 17:16:08 +0100204 break;
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000205 case NORMAL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100206 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100207 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Filipe72b5a7f2015-09-01 08:59:54 +0000208 mainActivity.runOnUiThread(new Runnable() {
209 @Override
210 public void run() {
211 mainActivity.onBackPressed();
212 }
213 });
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100214 return;
215
Jose Pascoal810950b2014-10-09 17:16:08 +0100216 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100217
Jose Pascoal810950b2014-10-09 17:16:08 +0100218 mCancelButton.setOnClickListener(new OnClickListener()
219 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100220
Jose Pascoal810950b2014-10-09 17:16:08 +0100221 @Override
222 public void onClick(View v)
223 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000224 abortUpdateProcess("");
Jose Pascoal79357c52015-03-12 20:14:29 +0000225 if(Utils.hasUnifiedPartition(mainActivity.getResources()))
226 {
227 Utils.clearCache();
228 }
Filipe72b5a7f2015-09-01 08:59:54 +0000229 mainActivity.runOnUiThread(new Runnable() {
230 @Override
231 public void run() {
232 mainActivity.onBackPressed();
233 }
234 });
Jose Pascoal810950b2014-10-09 17:16:08 +0100235 }
236 });
237 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100238
Jose Pascoal75392162014-10-15 18:29:01 +0100239 private void showEraseAllDataWarning()
240 {
Tiago Costa73eda412014-11-18 14:37:42 +0000241 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100242 {
243 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
244 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
245 {
246
247 @Override
248 public void onClick(DialogInterface dialog, int which)
249 {
250 startPreInstall();
251 }
252 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
253 {
254 public void onClick(DialogInterface dialog, int which)
255 {
256 // do nothing
257 }
258 }).show();
259 }
260 else
261 {
262 startPreInstall();
263 }
264 }
265
Jose Pascoal1c049e02014-12-17 13:03:09 +0000266 private void updateHeader()
267 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000268 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100269 {
270 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
271 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000272 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100273 }
274 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
275 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000276 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100277 }
278 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000279 else if (mSelectedStore != null)
280 {
281 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
282 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100283 else
284 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000285 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100286 }
287 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100288
Jose Pascoal810950b2014-10-09 17:16:08 +0100289 private void startDownloadProgressUpdateThread()
290 {
291 new Thread(new Runnable()
292 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100293
Jose Pascoal810950b2014-10-09 17:16:08 +0100294 @Override
295 public void run()
296 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100297 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100298
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000299 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000300
Jose Pascoal46fdb062015-02-05 18:59:32 +0000301 int count = GET_LATEST_DOWNLOAD_ID_RETRIES;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000302
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000303 // Wait a sensible amount of time to get a correct reference to the download
304 while ((latestUpdateDownloadId <= 0) && count > 0)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000305 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000306 try
307 {
Jose Pascoal46fdb062015-02-05 18:59:32 +0000308 Thread.sleep(Utils.DELAY_HALF_SECOND);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000309 count--;
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000310 latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000311 } catch (InterruptedException e)
312 {
313 e.printStackTrace();
314 }
315 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000316
Jose Pascoalaa579a82014-11-05 22:17:16 +0000317 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100318 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100319
Jose Pascoal810950b2014-10-09 17:16:08 +0100320 DownloadManager.Query q = new DownloadManager.Query();
321 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100322
Jose Pascoalaa579a82014-11-05 22:17:16 +0000323 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000324
Jose Pascoalda015b12014-11-06 12:47:11 +0000325 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100326 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100327 try
328 {
329 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
330 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100331
Jose Pascoal46fdb062015-02-05 18:59:32 +0000332 if ((bytes_total + Utils.BUFFER_SIZE_10_MBYTES) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100333 {
334 downloading = false;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000335 abortUpdateProcess(getResources().getString(R.string.no_space_available_sd_card_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100336 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000337 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100338 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000339 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
340 {
341 case DownloadManager.STATUS_SUCCESSFUL:
342 case DownloadManager.STATUS_FAILED:
343 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100344
Jose Pascoalaa579a82014-11-05 22:17:16 +0000345 bytes_downloaded = 0;
346 bytes_total = 0;
347 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000348 default:
349 break;
Jose Pascoalaa579a82014-11-05 22:17:16 +0000350 }
351
352 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
353 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100354 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100355 } catch (Exception e)
356 {
357 downloading = false;
358 Log.e(TAG, "Error updating download progress: " + e.getMessage());
359 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100360
Jose Pascoal810950b2014-10-09 17:16:08 +0100361 cursor.close();
362 try
363 {
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000364 Thread.sleep(PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS);
Jose Pascoal810950b2014-10-09 17:16:08 +0100365 } catch (InterruptedException e)
366 {
367 e.printStackTrace();
368 }
369 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000370 else
371 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000372 if (cursor != null)
373 {
374 downloading = false;
375 cursor.close();
376 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000377 if (mDownloadManager == null)
378 {
379 downloading = false;
380 }
381 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100382 }
383 }
384 }).start();
385 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100386
Jose Pascoal810950b2014-10-09 17:16:08 +0100387 private void setupLayout(View view)
388 {
389 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal79357c52015-03-12 20:14:29 +0000390 mDownloadCompleteLabel = (TextView) view.findViewById(R.id.download_complete_label);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100391
Jose Pascoal810950b2014-10-09 17:16:08 +0100392 // download in progress group
393 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
394 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100395
Jose Pascoal810950b2014-10-09 17:16:08 +0100396 // restart group
397 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
398 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100399
Jose Pascoal810950b2014-10-09 17:16:08 +0100400 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
401 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100402
Jose Pascoal810950b2014-10-09 17:16:08 +0100403 @Override
404 public void onResume()
405 {
406 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100407
Jose Pascoal810950b2014-10-09 17:16:08 +0100408 setupInstallationReceivers();
Filipe72b5a7f2015-09-01 08:59:54 +0000409
Jose Pascoal810950b2014-10-09 17:16:08 +0100410 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100411
Filipe97f2bec2015-02-11 14:52:49 +0000412 registerNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000413
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100414 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000415
Jose Pascoal02d86242014-12-17 18:50:08 +0000416 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
417 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000418 {
Jose Pascoal40916302015-02-06 18:43:47 +0000419 mDownloadVersionName.setText(mainActivity.getItemName(item, mIsVersion));
Jose Pascoal79357c52015-03-12 20:14:29 +0000420 if(mIsZipInstall)
421 {
422 mDownloadCompleteLabel.setVisibility(View.GONE);
423 }
424 else
425 {
426 mDownloadCompleteLabel.setVisibility(View.VISIBLE);
427 }
Tiago Costa198bf3d2014-12-16 15:23:18 +0000428 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100429 toggleDownloadProgressAndRestart();
430 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100431
Filipe97f2bec2015-02-11 14:52:49 +0000432 private void registerNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000433 {
Filipe97f2bec2015-02-11 14:52:49 +0000434 unregisterNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000435 // Setup monitoring for future connectivity status changes
Filipe97f2bec2015-02-11 14:52:49 +0000436 mNetworkStateReceiver = new BroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000437 {
Filipe97f2bec2015-02-11 14:52:49 +0000438 @Override
439 public void onReceive(Context context, Intent intent)
Tiago Costa73eda412014-11-18 14:37:42 +0000440 {
Filipe97f2bec2015-02-11 14:52:49 +0000441 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
Tiago Costa73eda412014-11-18 14:37:42 +0000442 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000443 Log.w(TAG, "Aborted due to connection failure.");
444 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000445 mainActivity.runOnUiThread(new Runnable() {
446 @Override
447 public void run() {
448 mainActivity.onBackPressed();
449 }
450 });
Tiago Costa73eda412014-11-18 14:37:42 +0000451 }
Filipe97f2bec2015-02-11 14:52:49 +0000452 }
453 };
Tiago Costa73eda412014-11-18 14:37:42 +0000454
455 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
456 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
457 }
458
Filipe97f2bec2015-02-11 14:52:49 +0000459 private void unregisterNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000460 {
461 if (mNetworkStateReceiver != null)
462 {
463 mainActivity.unregisterReceiver(mNetworkStateReceiver);
464
465 mNetworkStateReceiver = null;
466 }
467 }
468
Jose Pascoal810950b2014-10-09 17:16:08 +0100469 @Override
470 public void onPause()
471 {
472 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100473
Jose Pascoal810950b2014-10-09 17:16:08 +0100474 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000475
Filipe97f2bec2015-02-11 14:52:49 +0000476 unregisterNetworkStatusBroadcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100477 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100478
Jose Pascoal810950b2014-10-09 17:16:08 +0100479 private void setupInstallationReceivers()
480 {
481 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100482
Jose Pascoal810950b2014-10-09 17:16:08 +0100483 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
484 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100485
Jose Pascoal810950b2014-10-09 17:16:08 +0100486 private void registerDownloadBroadCastReceiver()
487 {
488 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
489 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100490
Jose Pascoal810950b2014-10-09 17:16:08 +0100491 private void unregisterBroadCastReceiver()
492 {
493 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
494 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100495
Jose Pascoal810950b2014-10-09 17:16:08 +0100496 private class DownloadBroadCastReceiver extends BroadcastReceiver
497 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100498
Jose Pascoal810950b2014-10-09 17:16:08 +0100499 @Override
500 public void onReceive(Context context, Intent intent)
501 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100502
Jose Pascoal810950b2014-10-09 17:16:08 +0100503 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100504
Jose Pascoal810950b2014-10-09 17:16:08 +0100505 updateDownloadFile();
506 }
507 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100508
Jose Pascoal810950b2014-10-09 17:16:08 +0100509 private void updateDownloadFile()
510 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100511
Jose Pascoal810950b2014-10-09 17:16:08 +0100512 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100513
Jose Pascoal810950b2014-10-09 17:16:08 +0100514 if (downloadId != 0)
515 {
516 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100517
Jose Pascoal810950b2014-10-09 17:16:08 +0100518 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100519
Jose Pascoalaa579a82014-11-05 22:17:16 +0000520 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100521
Jose Pascoalaa579a82014-11-05 22:17:16 +0000522 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100523 {
524 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
525 int status = cursor.getInt(columnIndex);
526
527 switch (status)
528 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000529
Jose Pascoal810950b2014-10-09 17:16:08 +0100530 case DownloadManager.STATUS_SUCCESSFUL:
531 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
532 toggleDownloadProgressAndRestart();
533 break;
534 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000535 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100536 startDownloadProgressUpdateThread();
537 break;
538 case DownloadManager.STATUS_FAILED:
539 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000540 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000541 String error;
Jose Pascoal02d86242014-12-17 18:50:08 +0000542 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100543 {
Jose Pascoal40916302015-02-06 18:43:47 +0000544 String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item, mIsVersion);
Jose Pascoal4adf3192015-02-23 18:10:16 +0000545 error = resources.getString(R.string.error_downloading) + " " + downloadTitle;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000546 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100547 else
548 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000549 error = resources.getString(R.string.error_downloading);
Jose Pascoal810950b2014-10-09 17:16:08 +0100550 }
Jose Pascoal4adf3192015-02-23 18:10:16 +0000551 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000552 mainActivity.runOnUiThread(new Runnable() {
553 @Override
554 public void run() {
555 mainActivity.onBackPressed();
556 }
557 });
558
Jose Pascoal810950b2014-10-09 17:16:08 +0100559 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000560 default:
561 break;
Jose Pascoal810950b2014-10-09 17:16:08 +0100562 }
563 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100564 else
565 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000566 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000567
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100568 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100569
Jose Pascoalaa579a82014-11-05 22:17:16 +0000570 if (cursor != null)
571 {
572 cursor.close();
573 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100574 }
575 }
576
577 // ************************************************************************************
578 // PRE INSTALL
579 // ************************************************************************************
580
Jose Pascoal1c049e02014-12-17 13:03:09 +0000581 private void setupPreInstallState()
Tiago Costa198bf3d2014-12-16 15:23:18 +0000582 {
583 Resources resources = mainActivity.getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000584 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
585 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100586 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000587 File file = new File(getDownloadPath(item));
Jose Pascoal810950b2014-10-09 17:16:08 +0100588
589 if (file.exists())
590 {
Filipe72b5a7f2015-09-01 08:59:54 +0000591 copyUpdateToCache(file);
Jose Pascoal810950b2014-10-09 17:16:08 +0100592 }
593 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100594 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100595
Jose Pascoal810950b2014-10-09 17:16:08 +0100596 // ************************************************************************************
597 // DOWNLOAD UPDATE
598 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100599
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000600 void setupDownloadState()
Jose Pascoal810950b2014-10-09 17:16:08 +0100601 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000602 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000603
Jose Pascoal810950b2014-10-09 17:16:08 +0100604 // setup the download state views
Jose Pascoal1c049e02014-12-17 13:03:09 +0000605 if (item == null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100606 {
607 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100608
Jose Pascoal810950b2014-10-09 17:16:08 +0100609 // we don't have the lastest.xml so get back to initial state
610 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100611
Jose Pascoal46fdb062015-02-05 18:59:32 +0000612 final boolean notDeleted = !updateDir.delete();
613 if(notDeleted) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000614 Log.d(TAG, "Unable to delete " + updateDir.getAbsolutePath());
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000615 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100616
Jose Pascoal4adf3192015-02-23 18:10:16 +0000617 abortUpdateProcess("");
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100618
Jose Pascoal810950b2014-10-09 17:16:08 +0100619 return;
620 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100621
Jose Pascoal810950b2014-10-09 17:16:08 +0100622 // if there is a download ID on the shared preferences
623 if (mLatestUpdateDownloadId == 0)
624 {
625 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100626
Jose Pascoal810950b2014-10-09 17:16:08 +0100627 // invalid download Id
628 if (mLatestUpdateDownloadId == 0)
629 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000630 abortUpdateProcess("");
Jose Pascoal810950b2014-10-09 17:16:08 +0100631 return;
632 }
633 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100634
Jose Pascoal810950b2014-10-09 17:16:08 +0100635 updateDownloadFile();
636 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100637
Jose Pascoal810950b2014-10-09 17:16:08 +0100638 private void startPreInstall()
639 {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000640 final Resources resources = getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000641 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
642
Jose Pascoal60c99372015-03-17 15:52:59 +0000643 String otaPackagePath = Utils.getOtaPackagePath(resources, item, mIsVersion, mIsZipInstall);
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000644
645 boolean fileNotExists = !Utils.fileExists(otaPackagePath);
646
647 if (fileNotExists)
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000648 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000649 abortUpdateProcess(resources.getString(R.string.file_not_found_message) + ": " + otaPackagePath);
Filipe72b5a7f2015-09-01 08:59:54 +0000650 mainActivity.runOnUiThread(new Runnable() {
651 @Override
652 public void run() {
653 mainActivity.onBackPressed();
654 }
655 });
Jose Pascoal1c049e02014-12-17 13:03:09 +0000656 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000657 else if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100658 {
659 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100660 try
661 {
Jose Pascoal49f058a2015-02-13 16:58:01 +0000662 Utils.writeCacheCommand(mainActivity, otaPackagePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100663
Jose Pascoal49f058a2015-02-13 16:58:01 +0000664 new Thread(new Runnable() {
665 @SuppressLint("CommitPrefEdits")
666 @Override
667 public void run() {
668 Editor editor = mSharedPreferences.edit();
669 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
670 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100671
Jose Pascoal49f058a2015-02-13 16:58:01 +0000672 if (Utils.hasUnifiedPartition(resources))
673 {
674 removeLastUpdateDownload();
675 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100676
Tiago Costad7e951f2015-03-02 17:37:33 +0000677 // remove the gapps stuff
678// String model = Utils.getModelAndOS(getActivity());
679// if( model.contains("FP1") ) {
680 try {
681
682 Utils.clearGappsData();
683 } catch (RootDeniedException | InterruptedException | IOException e) {
684 e.printStackTrace();
685 }
686// }
687
Jose Pascoal49f058a2015-02-13 16:58:01 +0000688 // remove the update files from data
689 removeUpdateFilesFromData();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100690
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000691 mainActivity.updateStatePreference(UpdaterState.NORMAL);
692 mainActivity.clearSelectedItems();
693 clearConfigFile();
694 editor = mSharedPreferences.edit();
695 editor.remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS);
696 editor.remove(MainFragment.SHARED_PREFERENCES_ENABLE_GAPPS);
697 editor.commit();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000698
699 // reboot the device into recovery
700 if(!Utils.rebootToRecovery(mainActivity)) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000701 String error = resources.getString(R.string.reboot_failed);
702 Log.w(TAG, error);
703 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000704 mainActivity.onBackPressed();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000705 }
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000706 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000707 }).start();
708 } catch (IOException | NotFoundException | TimeoutException | RootDeniedException e)
709 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000710 String error = resources.getString(R.string.command_write_to_cache_failed);
711 Log.e(TAG, error + ": " + e.getLocalizedMessage());
712 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000713 mainActivity.runOnUiThread(new Runnable() {
714 @Override
715 public void run() {
716 mainActivity.onBackPressed();
717 }
718 });
Jose Pascoal49f058a2015-02-13 16:58:01 +0000719 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100720 }
721 else
722 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000723 Log.e(TAG, "Null item");
724 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000725 mainActivity.runOnUiThread(new Runnable() {
726 @Override
727 public void run() {
728 mainActivity.onBackPressed();
729 }
730 });
731
Jose Pascoal810950b2014-10-09 17:16:08 +0100732 }
733 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100734
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000735 private void clearConfigFile()
736 {
737 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
738 if (cfgFile != 0 && mDownloadManager != null)
739 {
740 mDownloadManager.remove(cfgFile);
741 }
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000742 mainActivity.clearConfigFileDownloadId();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000743 VersionParserHelper.removeConfigFiles(mainActivity);
744 }
745
Jose Pascoal810950b2014-10-09 17:16:08 +0100746 private void copyUpdateToCache(File file)
747 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000748 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100749 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000750 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Filipe72b5a7f2015-09-01 08:59:54 +0000751
Jose Pascoal1c049e02014-12-17 13:03:09 +0000752 if (item != null)
753 {
Maarten Derks2f5e61e2016-04-12 14:17:55 +0200754 if (copyTask != null) {
755 return;
756 }
757 copyTask = new CopyFileToCacheTask();
Jose Pascoal40916302015-02-06 18:43:47 +0000758 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000759 }
760 else
761 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000762 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000763 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100764 }
765 else
766 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000767 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100768 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000769 Log.w(TAG, "No space on cache. Defaulting to Sdcard");
770 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100771 }
772 }
773 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100774
Jose Pascoal810950b2014-10-09 17:16:08 +0100775 // ************************************************************************************
776 // Update Removal
777 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000778 private void removeUpdateFilesFromData() {
779 if (PrivilegeChecker.isPrivilegedApp()) {
780 removeUpdateFilesFromDataPrivileged();
781 } else {
782 removeUpdateFilesFromDataUnprivileged();
783 }
784 }
785
786 private void removeUpdateFilesFromDataPrivileged() {
787 Resources resource = getResources();
788
789 try {
790 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
791 p.waitFor();
792 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
793 p.waitFor();
794 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
795 p.waitFor();
796 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
797 p.waitFor();
798 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
799 p.waitFor();
800 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
801 p.waitFor();
802 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
803 p.waitFor();
804 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
805 p.waitFor();
806 } catch (IOException | InterruptedException e) {
807 Log.d(TAG, "Failed to remove files from data:" +e);
808 }
809 }
810
811 private void removeUpdateFilesFromDataUnprivileged()
812 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100813 try
814 {
815 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
816 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
817 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
818 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
819 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000820 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100821 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000822 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100823 }
824 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100825
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000826 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100827 {
828 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000829 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100830 {
831 // residue download ID
832 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100833
Jose Pascoal810950b2014-10-09 17:16:08 +0100834 mainActivity.resetLastUpdateDownloadId();
835 }
836 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100837
Jose Pascoal810950b2014-10-09 17:16:08 +0100838 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
839 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100840
Jose Pascoal810950b2014-10-09 17:16:08 +0100841 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100842
Jose Pascoal810950b2014-10-09 17:16:08 +0100843 @Override
844 protected Integer doInBackground(String... params)
845 {
Filipe72b5a7f2015-09-01 08:59:54 +0000846
Jose Pascoal810950b2014-10-09 17:16:08 +0100847 // check the correct number of
848 if (params.length != 2)
849 {
850 return -1;
851 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100852
Jose Pascoal810950b2014-10-09 17:16:08 +0100853 String originalFilePath = params[0];
854 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100855
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000856 Utils.clearCache();
857
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000858 File otaOriginalFile = new File(originalFilePath);
859 File otaDestinyFile = new File(destinyFilePath);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000860
Filipe72b5a7f2015-09-01 08:59:54 +0000861 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
862
863 if (!(Utils.checkMD5(item.getMd5Sum(), otaOriginalFile) || mIsZipInstall))
864 {
865 mainActivity.runOnUiThread(new Runnable() {
866 @Override
867 public void run() {
868 abortUpdateProcess(getResources().getString(R.string.invalid_md5_download_message));
869 mainActivity.runOnUiThread(new Runnable() {
870 @Override
871 public void run() {
872 mainActivity.onBackPressed();
873 }
874 });
875 }
876 });
877 removeLastUpdateDownload();
878 }
879 else if (otaOriginalFile.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100880 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000881 try {
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000882 Utils.copy(otaOriginalFile, otaDestinyFile);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000883 } catch (IOException e) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000884 String error = mainActivity.getResources().getString(R.string.copy_to_cache_failed_message);
885 Log.e(TAG, error + ": " + originalFilePath + ". " + e.getLocalizedMessage());
Filipe72b5a7f2015-09-01 08:59:54 +0000886 abortUpdateProcess(error);
887 mainActivity.runOnUiThread(new Runnable() {
888 @Override
889 public void run() {
890 mainActivity.onBackPressed();
891 }
892 });
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000893 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100894 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100895 else
896 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000897 Resources resources = mainActivity.getResources();
898 String error = resources.getString(R.string.copy_to_cache_failed_message) + ". " + resources.getString(R.string.file_not_found_message) + ": " + originalFilePath;
899 Log.e(TAG, error);
900 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000901 mainActivity.runOnUiThread(new Runnable() {
902 @Override
903 public void run() {
904 mainActivity.onBackPressed();
905 }
906 });
Jose Pascoal733b84e2014-10-17 14:49:02 +0100907 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100908
Jose Pascoal810950b2014-10-09 17:16:08 +0100909 return 1;
910 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100911
Jose Pascoal810950b2014-10-09 17:16:08 +0100912 protected void onProgressUpdate(Integer... progress)
913 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100914
Jose Pascoal810950b2014-10-09 17:16:08 +0100915 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100916
Jose Pascoal810950b2014-10-09 17:16:08 +0100917 protected void onPreExecute()
918 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100919 if (mProgress == null)
920 {
921 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100922 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100923 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
924 }
925 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100926
Jose Pascoal810950b2014-10-09 17:16:08 +0100927 protected void onPostExecute(Integer result)
928 {
929 // disable the spinner
930 if (mProgress != null)
931 {
932 mProgress.dismiss();
933 mProgress = null;
934 }
935 }
936 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100937
Jose Pascoal1c049e02014-12-17 13:03:09 +0000938 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100939 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000940 String path;
941 if(mIsZipInstall)
942 {
943 path = mainActivity.getZipFilePath();
944 }
945 else
946 {
947 Resources resources = mainActivity.getResources();
948 path = Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
949 }
950 return path;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000951 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100952
Jose Pascoal4adf3192015-02-23 18:10:16 +0000953 public void abortUpdateProcess(final String reason)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100954 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000955 if(!TextUtils.isEmpty(reason)) {
956 mainActivity.runOnUiThread(new Runnable() {
957 @Override
958 public void run() {
959 Toast.makeText(mainActivity, reason, Toast.LENGTH_LONG).show();
960 }
961 });
962 }
963
Tiago Costa73eda412014-11-18 14:37:42 +0000964 removeLastUpdateDownload();
965
Jose Pascoal87758742015-01-28 20:00:22 +0000966 mainActivity.clearSelectedItems();
967 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100968 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100969}