blob: d176505853c1f23e54fdc06a68d2471acae073a0 [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 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000183 if (mIsVersion)
184 {
185 showEraseAllDataWarning();
186 }
187 else if (mSelectedStore != null)
188 {
189 startPreInstall();
190 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100191 }
192 });
193
Jose Pascoal810950b2014-10-09 17:16:08 +0100194 break;
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000195 case NORMAL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100196 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100197 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Filipe72b5a7f2015-09-01 08:59:54 +0000198 mainActivity.runOnUiThread(new Runnable() {
199 @Override
200 public void run() {
201 mainActivity.onBackPressed();
202 }
203 });
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100204 return;
205
Jose Pascoal810950b2014-10-09 17:16:08 +0100206 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100207
Jose Pascoal810950b2014-10-09 17:16:08 +0100208 mCancelButton.setOnClickListener(new OnClickListener()
209 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100210
Jose Pascoal810950b2014-10-09 17:16:08 +0100211 @Override
212 public void onClick(View v)
213 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000214 abortUpdateProcess("");
Jose Pascoal79357c52015-03-12 20:14:29 +0000215 if(Utils.hasUnifiedPartition(mainActivity.getResources()))
216 {
217 Utils.clearCache();
218 }
Filipe72b5a7f2015-09-01 08:59:54 +0000219 mainActivity.runOnUiThread(new Runnable() {
220 @Override
221 public void run() {
222 mainActivity.onBackPressed();
223 }
224 });
Jose Pascoal810950b2014-10-09 17:16:08 +0100225 }
226 });
227 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100228
Jose Pascoal75392162014-10-15 18:29:01 +0100229 private void showEraseAllDataWarning()
230 {
Tiago Costa73eda412014-11-18 14:37:42 +0000231 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100232 {
233 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
234 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
235 {
236
237 @Override
238 public void onClick(DialogInterface dialog, int which)
239 {
240 startPreInstall();
241 }
242 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
243 {
244 public void onClick(DialogInterface dialog, int which)
245 {
246 // do nothing
247 }
248 }).show();
249 }
250 else
251 {
252 startPreInstall();
253 }
254 }
255
Jose Pascoal1c049e02014-12-17 13:03:09 +0000256 private void updateHeader()
257 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000258 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100259 {
260 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
261 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000262 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100263 }
264 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
265 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000266 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100267 }
268 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000269 else if (mSelectedStore != null)
270 {
271 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
272 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100273 else
274 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000275 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100276 }
277 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100278
Jose Pascoal810950b2014-10-09 17:16:08 +0100279 private void startDownloadProgressUpdateThread()
280 {
281 new Thread(new Runnable()
282 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100283
Jose Pascoal810950b2014-10-09 17:16:08 +0100284 @Override
285 public void run()
286 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100287 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100288
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000289 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000290
Jose Pascoal46fdb062015-02-05 18:59:32 +0000291 int count = GET_LATEST_DOWNLOAD_ID_RETRIES;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000292
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000293 // Wait a sensible amount of time to get a correct reference to the download
294 while ((latestUpdateDownloadId <= 0) && count > 0)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000295 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000296 try
297 {
Jose Pascoal46fdb062015-02-05 18:59:32 +0000298 Thread.sleep(Utils.DELAY_HALF_SECOND);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000299 count--;
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000300 latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000301 } catch (InterruptedException e)
302 {
303 e.printStackTrace();
304 }
305 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000306
Jose Pascoalaa579a82014-11-05 22:17:16 +0000307 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100308 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100309
Jose Pascoal810950b2014-10-09 17:16:08 +0100310 DownloadManager.Query q = new DownloadManager.Query();
311 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100312
Jose Pascoalaa579a82014-11-05 22:17:16 +0000313 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000314
Jose Pascoalda015b12014-11-06 12:47:11 +0000315 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100316 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100317 try
318 {
319 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
320 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100321
Jose Pascoal46fdb062015-02-05 18:59:32 +0000322 if ((bytes_total + Utils.BUFFER_SIZE_10_MBYTES) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100323 {
324 downloading = false;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000325 abortUpdateProcess(getResources().getString(R.string.no_space_available_sd_card_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100326 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000327 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100328 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000329 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
330 {
331 case DownloadManager.STATUS_SUCCESSFUL:
332 case DownloadManager.STATUS_FAILED:
333 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100334
Jose Pascoalaa579a82014-11-05 22:17:16 +0000335 bytes_downloaded = 0;
336 bytes_total = 0;
337 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000338 default:
339 break;
Jose Pascoalaa579a82014-11-05 22:17:16 +0000340 }
341
342 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
343 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100344 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100345 } catch (Exception e)
346 {
347 downloading = false;
348 Log.e(TAG, "Error updating download progress: " + e.getMessage());
349 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100350
Jose Pascoal810950b2014-10-09 17:16:08 +0100351 cursor.close();
352 try
353 {
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000354 Thread.sleep(PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS);
Jose Pascoal810950b2014-10-09 17:16:08 +0100355 } catch (InterruptedException e)
356 {
357 e.printStackTrace();
358 }
359 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000360 else
361 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000362 if (cursor != null)
363 {
364 downloading = false;
365 cursor.close();
366 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000367 if (mDownloadManager == null)
368 {
369 downloading = false;
370 }
371 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100372 }
373 }
374 }).start();
375 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100376
Jose Pascoal810950b2014-10-09 17:16:08 +0100377 private void setupLayout(View view)
378 {
379 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal79357c52015-03-12 20:14:29 +0000380 mDownloadCompleteLabel = (TextView) view.findViewById(R.id.download_complete_label);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100381
Jose Pascoal810950b2014-10-09 17:16:08 +0100382 // download in progress group
383 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
384 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100385
Jose Pascoal810950b2014-10-09 17:16:08 +0100386 // restart group
387 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
388 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100389
Jose Pascoal810950b2014-10-09 17:16:08 +0100390 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
391 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100392
Jose Pascoal810950b2014-10-09 17:16:08 +0100393 @Override
394 public void onResume()
395 {
396 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100397
Jose Pascoal810950b2014-10-09 17:16:08 +0100398 setupInstallationReceivers();
Filipe72b5a7f2015-09-01 08:59:54 +0000399
Jose Pascoal810950b2014-10-09 17:16:08 +0100400 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100401
Filipe97f2bec2015-02-11 14:52:49 +0000402 registerNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000403
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100404 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000405
Jose Pascoal02d86242014-12-17 18:50:08 +0000406 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
407 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000408 {
Jose Pascoal40916302015-02-06 18:43:47 +0000409 mDownloadVersionName.setText(mainActivity.getItemName(item, mIsVersion));
Jose Pascoal79357c52015-03-12 20:14:29 +0000410 if(mIsZipInstall)
411 {
412 mDownloadCompleteLabel.setVisibility(View.GONE);
413 }
414 else
415 {
416 mDownloadCompleteLabel.setVisibility(View.VISIBLE);
417 }
Tiago Costa198bf3d2014-12-16 15:23:18 +0000418 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100419 toggleDownloadProgressAndRestart();
420 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100421
Filipe97f2bec2015-02-11 14:52:49 +0000422 private void registerNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000423 {
Filipe97f2bec2015-02-11 14:52:49 +0000424 unregisterNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000425 // Setup monitoring for future connectivity status changes
Filipe97f2bec2015-02-11 14:52:49 +0000426 mNetworkStateReceiver = new BroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000427 {
Filipe97f2bec2015-02-11 14:52:49 +0000428 @Override
429 public void onReceive(Context context, Intent intent)
Tiago Costa73eda412014-11-18 14:37:42 +0000430 {
Filipe97f2bec2015-02-11 14:52:49 +0000431 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
Tiago Costa73eda412014-11-18 14:37:42 +0000432 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000433 Log.w(TAG, "Aborted due to connection failure.");
434 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000435 mainActivity.runOnUiThread(new Runnable() {
436 @Override
437 public void run() {
438 mainActivity.onBackPressed();
439 }
440 });
Tiago Costa73eda412014-11-18 14:37:42 +0000441 }
Filipe97f2bec2015-02-11 14:52:49 +0000442 }
443 };
Tiago Costa73eda412014-11-18 14:37:42 +0000444
445 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
446 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
447 }
448
Filipe97f2bec2015-02-11 14:52:49 +0000449 private void unregisterNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000450 {
451 if (mNetworkStateReceiver != null)
452 {
453 mainActivity.unregisterReceiver(mNetworkStateReceiver);
454
455 mNetworkStateReceiver = null;
456 }
457 }
458
Jose Pascoal810950b2014-10-09 17:16:08 +0100459 @Override
460 public void onPause()
461 {
462 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100463
Jose Pascoal810950b2014-10-09 17:16:08 +0100464 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000465
Filipe97f2bec2015-02-11 14:52:49 +0000466 unregisterNetworkStatusBroadcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100467 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100468
Jose Pascoal810950b2014-10-09 17:16:08 +0100469 private void setupInstallationReceivers()
470 {
471 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100472
Jose Pascoal810950b2014-10-09 17:16:08 +0100473 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
474 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100475
Jose Pascoal810950b2014-10-09 17:16:08 +0100476 private void registerDownloadBroadCastReceiver()
477 {
478 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
479 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100480
Jose Pascoal810950b2014-10-09 17:16:08 +0100481 private void unregisterBroadCastReceiver()
482 {
483 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
484 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100485
Jose Pascoal810950b2014-10-09 17:16:08 +0100486 private class DownloadBroadCastReceiver extends BroadcastReceiver
487 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100488
Jose Pascoal810950b2014-10-09 17:16:08 +0100489 @Override
490 public void onReceive(Context context, Intent intent)
491 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100492
Jose Pascoal810950b2014-10-09 17:16:08 +0100493 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100494
Jose Pascoal810950b2014-10-09 17:16:08 +0100495 updateDownloadFile();
496 }
497 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100498
Jose Pascoal810950b2014-10-09 17:16:08 +0100499 private void updateDownloadFile()
500 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100501
Jose Pascoal810950b2014-10-09 17:16:08 +0100502 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100503
Jose Pascoal810950b2014-10-09 17:16:08 +0100504 if (downloadId != 0)
505 {
506 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100507
Jose Pascoal810950b2014-10-09 17:16:08 +0100508 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100509
Jose Pascoalaa579a82014-11-05 22:17:16 +0000510 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100511
Jose Pascoalaa579a82014-11-05 22:17:16 +0000512 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100513 {
514 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
515 int status = cursor.getInt(columnIndex);
516
517 switch (status)
518 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000519
Jose Pascoal810950b2014-10-09 17:16:08 +0100520 case DownloadManager.STATUS_SUCCESSFUL:
521 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
522 toggleDownloadProgressAndRestart();
523 break;
524 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000525 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100526 startDownloadProgressUpdateThread();
527 break;
528 case DownloadManager.STATUS_FAILED:
529 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000530 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000531 String error;
Jose Pascoal02d86242014-12-17 18:50:08 +0000532 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100533 {
Jose Pascoal40916302015-02-06 18:43:47 +0000534 String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item, mIsVersion);
Jose Pascoal4adf3192015-02-23 18:10:16 +0000535 error = resources.getString(R.string.error_downloading) + " " + downloadTitle;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000536 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100537 else
538 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000539 error = resources.getString(R.string.error_downloading);
Jose Pascoal810950b2014-10-09 17:16:08 +0100540 }
Jose Pascoal4adf3192015-02-23 18:10:16 +0000541 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000542 mainActivity.runOnUiThread(new Runnable() {
543 @Override
544 public void run() {
545 mainActivity.onBackPressed();
546 }
547 });
548
Jose Pascoal810950b2014-10-09 17:16:08 +0100549 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000550 default:
551 break;
Jose Pascoal810950b2014-10-09 17:16:08 +0100552 }
553 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100554 else
555 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000556 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000557
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100558 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100559
Jose Pascoalaa579a82014-11-05 22:17:16 +0000560 if (cursor != null)
561 {
562 cursor.close();
563 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100564 }
565 }
566
567 // ************************************************************************************
568 // PRE INSTALL
569 // ************************************************************************************
570
Jose Pascoal1c049e02014-12-17 13:03:09 +0000571 private void setupPreInstallState()
Tiago Costa198bf3d2014-12-16 15:23:18 +0000572 {
573 Resources resources = mainActivity.getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000574 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
575 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100576 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000577 File file = new File(getDownloadPath(item));
Jose Pascoal810950b2014-10-09 17:16:08 +0100578
579 if (file.exists())
580 {
Filipe72b5a7f2015-09-01 08:59:54 +0000581 copyUpdateToCache(file);
Jose Pascoal810950b2014-10-09 17:16:08 +0100582 }
583 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100584 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100585
Jose Pascoal810950b2014-10-09 17:16:08 +0100586 // ************************************************************************************
587 // DOWNLOAD UPDATE
588 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100589
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000590 void setupDownloadState()
Jose Pascoal810950b2014-10-09 17:16:08 +0100591 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000592 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000593
Jose Pascoal810950b2014-10-09 17:16:08 +0100594 // setup the download state views
Jose Pascoal1c049e02014-12-17 13:03:09 +0000595 if (item == null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100596 {
597 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100598
Jose Pascoal810950b2014-10-09 17:16:08 +0100599 // we don't have the lastest.xml so get back to initial state
600 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100601
Jose Pascoal46fdb062015-02-05 18:59:32 +0000602 final boolean notDeleted = !updateDir.delete();
603 if(notDeleted) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000604 Log.d(TAG, "Unable to delete " + updateDir.getAbsolutePath());
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000605 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100606
Jose Pascoal4adf3192015-02-23 18:10:16 +0000607 abortUpdateProcess("");
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100608
Jose Pascoal810950b2014-10-09 17:16:08 +0100609 return;
610 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100611
Jose Pascoal810950b2014-10-09 17:16:08 +0100612 // if there is a download ID on the shared preferences
613 if (mLatestUpdateDownloadId == 0)
614 {
615 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100616
Jose Pascoal810950b2014-10-09 17:16:08 +0100617 // invalid download Id
618 if (mLatestUpdateDownloadId == 0)
619 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000620 abortUpdateProcess("");
Jose Pascoal810950b2014-10-09 17:16:08 +0100621 return;
622 }
623 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100624
Jose Pascoal810950b2014-10-09 17:16:08 +0100625 updateDownloadFile();
626 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100627
Jose Pascoal810950b2014-10-09 17:16:08 +0100628 private void startPreInstall()
629 {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000630 final Resources resources = getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000631 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
632
Jose Pascoal60c99372015-03-17 15:52:59 +0000633 String otaPackagePath = Utils.getOtaPackagePath(resources, item, mIsVersion, mIsZipInstall);
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000634
635 boolean fileNotExists = !Utils.fileExists(otaPackagePath);
636
637 if (fileNotExists)
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000638 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000639 abortUpdateProcess(resources.getString(R.string.file_not_found_message) + ": " + otaPackagePath);
Filipe72b5a7f2015-09-01 08:59:54 +0000640 mainActivity.runOnUiThread(new Runnable() {
641 @Override
642 public void run() {
643 mainActivity.onBackPressed();
644 }
645 });
Jose Pascoal1c049e02014-12-17 13:03:09 +0000646 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000647 else if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100648 {
649 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100650 try
651 {
Jose Pascoal49f058a2015-02-13 16:58:01 +0000652 Utils.writeCacheCommand(mainActivity, otaPackagePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100653
Jose Pascoal49f058a2015-02-13 16:58:01 +0000654 new Thread(new Runnable() {
655 @SuppressLint("CommitPrefEdits")
656 @Override
657 public void run() {
658 Editor editor = mSharedPreferences.edit();
659 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
660 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100661
Jose Pascoal49f058a2015-02-13 16:58:01 +0000662 if (Utils.hasUnifiedPartition(resources))
663 {
664 removeLastUpdateDownload();
665 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100666
Tiago Costad7e951f2015-03-02 17:37:33 +0000667 // remove the gapps stuff
668// String model = Utils.getModelAndOS(getActivity());
669// if( model.contains("FP1") ) {
670 try {
671
672 Utils.clearGappsData();
673 } catch (RootDeniedException | InterruptedException | IOException e) {
674 e.printStackTrace();
675 }
676// }
677
Jose Pascoal49f058a2015-02-13 16:58:01 +0000678 // remove the update files from data
679 removeUpdateFilesFromData();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100680
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000681 mainActivity.updateStatePreference(UpdaterState.NORMAL);
682 mainActivity.clearSelectedItems();
683 clearConfigFile();
684 editor = mSharedPreferences.edit();
685 editor.remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS);
686 editor.remove(MainFragment.SHARED_PREFERENCES_ENABLE_GAPPS);
687 editor.commit();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000688
689 // reboot the device into recovery
690 if(!Utils.rebootToRecovery(mainActivity)) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000691 String error = resources.getString(R.string.reboot_failed);
692 Log.w(TAG, error);
693 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000694 mainActivity.onBackPressed();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000695 }
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000696 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000697 }).start();
698 } catch (IOException | NotFoundException | TimeoutException | RootDeniedException e)
699 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000700 String error = resources.getString(R.string.command_write_to_cache_failed);
701 Log.e(TAG, error + ": " + e.getLocalizedMessage());
702 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000703 mainActivity.runOnUiThread(new Runnable() {
704 @Override
705 public void run() {
706 mainActivity.onBackPressed();
707 }
708 });
Jose Pascoal49f058a2015-02-13 16:58:01 +0000709 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100710 }
711 else
712 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000713 Log.e(TAG, "Null item");
714 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000715 mainActivity.runOnUiThread(new Runnable() {
716 @Override
717 public void run() {
718 mainActivity.onBackPressed();
719 }
720 });
721
Jose Pascoal810950b2014-10-09 17:16:08 +0100722 }
723 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100724
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000725 private void clearConfigFile()
726 {
727 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
728 if (cfgFile != 0 && mDownloadManager != null)
729 {
730 mDownloadManager.remove(cfgFile);
731 }
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000732 mainActivity.clearConfigFileDownloadId();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000733 VersionParserHelper.removeConfigFiles(mainActivity);
734 }
735
Jose Pascoal810950b2014-10-09 17:16:08 +0100736 private void copyUpdateToCache(File file)
737 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000738 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100739 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000740 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Filipe72b5a7f2015-09-01 08:59:54 +0000741
Jose Pascoal1c049e02014-12-17 13:03:09 +0000742 if (item != null)
743 {
Maarten Derks2f5e61e2016-04-12 14:17:55 +0200744 if (copyTask != null) {
745 return;
746 }
747 copyTask = new CopyFileToCacheTask();
Jose Pascoal40916302015-02-06 18:43:47 +0000748 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000749 }
750 else
751 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000752 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000753 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100754 }
755 else
756 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000757 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100758 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000759 Log.w(TAG, "No space on cache. Defaulting to Sdcard");
760 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100761 }
762 }
763 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100764
Jose Pascoal810950b2014-10-09 17:16:08 +0100765 // ************************************************************************************
766 // Update Removal
767 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000768 private void removeUpdateFilesFromData() {
769 if (PrivilegeChecker.isPrivilegedApp()) {
770 removeUpdateFilesFromDataPrivileged();
771 } else {
772 removeUpdateFilesFromDataUnprivileged();
773 }
774 }
775
776 private void removeUpdateFilesFromDataPrivileged() {
777 Resources resource = getResources();
778
779 try {
780 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
781 p.waitFor();
782 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
783 p.waitFor();
784 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
785 p.waitFor();
786 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
787 p.waitFor();
788 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
789 p.waitFor();
790 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
791 p.waitFor();
792 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
793 p.waitFor();
794 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
795 p.waitFor();
796 } catch (IOException | InterruptedException e) {
797 Log.d(TAG, "Failed to remove files from data:" +e);
798 }
799 }
800
801 private void removeUpdateFilesFromDataUnprivileged()
802 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100803 try
804 {
805 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
806 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
807 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
808 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
809 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000810 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100811 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000812 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100813 }
814 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100815
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000816 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100817 {
818 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000819 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100820 {
821 // residue download ID
822 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100823
Jose Pascoal810950b2014-10-09 17:16:08 +0100824 mainActivity.resetLastUpdateDownloadId();
825 }
826 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100827
Jose Pascoal810950b2014-10-09 17:16:08 +0100828 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
829 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100830
Jose Pascoal810950b2014-10-09 17:16:08 +0100831 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100832
Jose Pascoal810950b2014-10-09 17:16:08 +0100833 @Override
834 protected Integer doInBackground(String... params)
835 {
Filipe72b5a7f2015-09-01 08:59:54 +0000836
Jose Pascoal810950b2014-10-09 17:16:08 +0100837 // check the correct number of
838 if (params.length != 2)
839 {
840 return -1;
841 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100842
Jose Pascoal810950b2014-10-09 17:16:08 +0100843 String originalFilePath = params[0];
844 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100845
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000846 Utils.clearCache();
847
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000848 File otaOriginalFile = new File(originalFilePath);
849 File otaDestinyFile = new File(destinyFilePath);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000850
Filipe72b5a7f2015-09-01 08:59:54 +0000851 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
852
853 if (!(Utils.checkMD5(item.getMd5Sum(), otaOriginalFile) || mIsZipInstall))
854 {
855 mainActivity.runOnUiThread(new Runnable() {
856 @Override
857 public void run() {
858 abortUpdateProcess(getResources().getString(R.string.invalid_md5_download_message));
859 mainActivity.runOnUiThread(new Runnable() {
860 @Override
861 public void run() {
862 mainActivity.onBackPressed();
863 }
864 });
865 }
866 });
867 removeLastUpdateDownload();
868 }
869 else if (otaOriginalFile.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100870 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000871 try {
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000872 Utils.copy(otaOriginalFile, otaDestinyFile);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000873 } catch (IOException e) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000874 String error = mainActivity.getResources().getString(R.string.copy_to_cache_failed_message);
875 Log.e(TAG, error + ": " + originalFilePath + ". " + e.getLocalizedMessage());
Filipe72b5a7f2015-09-01 08:59:54 +0000876 abortUpdateProcess(error);
877 mainActivity.runOnUiThread(new Runnable() {
878 @Override
879 public void run() {
880 mainActivity.onBackPressed();
881 }
882 });
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000883 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100884 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100885 else
886 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000887 Resources resources = mainActivity.getResources();
888 String error = resources.getString(R.string.copy_to_cache_failed_message) + ". " + resources.getString(R.string.file_not_found_message) + ": " + originalFilePath;
889 Log.e(TAG, error);
890 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000891 mainActivity.runOnUiThread(new Runnable() {
892 @Override
893 public void run() {
894 mainActivity.onBackPressed();
895 }
896 });
Jose Pascoal733b84e2014-10-17 14:49:02 +0100897 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100898
Jose Pascoal810950b2014-10-09 17:16:08 +0100899 return 1;
900 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100901
Jose Pascoal810950b2014-10-09 17:16:08 +0100902 protected void onProgressUpdate(Integer... progress)
903 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100904
Jose Pascoal810950b2014-10-09 17:16:08 +0100905 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100906
Jose Pascoal810950b2014-10-09 17:16:08 +0100907 protected void onPreExecute()
908 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100909 if (mProgress == null)
910 {
911 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100912 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100913 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
914 }
915 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100916
Jose Pascoal810950b2014-10-09 17:16:08 +0100917 protected void onPostExecute(Integer result)
918 {
919 // disable the spinner
920 if (mProgress != null)
921 {
922 mProgress.dismiss();
923 mProgress = null;
924 }
925 }
926 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100927
Jose Pascoal1c049e02014-12-17 13:03:09 +0000928 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100929 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000930 String path;
931 if(mIsZipInstall)
932 {
933 path = mainActivity.getZipFilePath();
934 }
935 else
936 {
937 Resources resources = mainActivity.getResources();
938 path = Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
939 }
940 return path;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000941 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100942
Jose Pascoal4adf3192015-02-23 18:10:16 +0000943 public void abortUpdateProcess(final String reason)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100944 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000945 if(!TextUtils.isEmpty(reason)) {
946 mainActivity.runOnUiThread(new Runnable() {
947 @Override
948 public void run() {
949 Toast.makeText(mainActivity, reason, Toast.LENGTH_LONG).show();
950 }
951 });
952 }
953
Tiago Costa73eda412014-11-18 14:37:42 +0000954 removeLastUpdateDownload();
955
Jose Pascoal87758742015-01-28 20:00:22 +0000956 mainActivity.clearSelectedItems();
957 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100958 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100959}