blob: 397bc8c374ef15832367b9736ed2ba0e24d18229 [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
Jose Pascoal810950b2014-10-09 17:16:08 +010073 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010074
Tiago Costa73eda412014-11-18 14:37:42 +000075 private BroadcastReceiver mNetworkStateReceiver;
76
Jose Pascoal810950b2014-10-09 17:16:08 +010077 private long mLatestUpdateDownloadId;
Jose Pascoal79357c52015-03-12 20:14:29 +000078 private TextView mDownloadCompleteLabel;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010079
Jose Pascoal1c049e02014-12-17 13:03:09 +000080 public DownloadAndRestartFragment(boolean isVersion)
81 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000082 super();
Jose Pascoal1c049e02014-12-17 13:03:09 +000083
Tiago Costa198bf3d2014-12-16 15:23:18 +000084 mIsVersion = isVersion;
85 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000086
Jose Pascoal810950b2014-10-09 17:16:08 +010087 @Override
88 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
89 {
90 // Inflate the layout for this fragment
Jose Pascoal79357c52015-03-12 20:14:29 +000091 mIsZipInstall = UpdaterState.ZIP_INSTALL == mainActivity.getCurrentUpdaterState();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000092 View view;
Jose Pascoal1c049e02014-12-17 13:03:09 +000093 if (mIsVersion)
94 {
Jose Pascoal79357c52015-03-12 20:14:29 +000095 mSelectedVersion = getSelectedVersion();
Tiago Costa198bf3d2014-12-16 15:23:18 +000096 view = inflateViewByImageType(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000097 mSelectedStore = null;
98 }
99 else
100 {
Tiago Costa198bf3d2014-12-16 15:23:18 +0000101 mSelectedStore = mainActivity.getSelectedStore();
102 view = inflateStoreView(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000103 mSelectedVersion = null;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000104 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000105
Jose Pascoal810950b2014-10-09 17:16:08 +0100106 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000107
Jose Pascoal810950b2014-10-09 17:16:08 +0100108 return view;
109 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000110
Jose Pascoal79357c52015-03-12 20:14:29 +0000111 private Version getSelectedVersion() {
112 Version version;
113 if(mIsZipInstall) {
114 Resources resources = mainActivity.getResources();
115
116 //Get the zip file name
117 String[] zipPath = getDownloadPath(null).split("/");
118 String zipName = "";
119 if (zipPath != null && zipPath.length > 0) {
120 zipName = zipPath[zipPath.length - 1];
121 }
122
123 version = new Version();
124 version.setName(resources.getString(R.string.install) + " " + zipName);
Jose Pascoal60c99372015-03-17 15:52:59 +0000125 version.setDownloadLink(mainActivity.getZipFilePath());
Maarten Derksf17e6db2016-02-09 15:10:53 +0100126 version.setId(null);
Maarten Derks4bb57892016-01-26 10:52:53 +0100127 } else
Jose Pascoal79357c52015-03-12 20:14:29 +0000128 {
129 version = mainActivity.getSelectedVersion();
130 }
131 return version;
132 }
133
Tiago Costa198bf3d2014-12-16 15:23:18 +0000134 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
135 {
136 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
137 if (mSelectedVersion != null)
138 {
139 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
140 {
141 view = inflater.inflate(R.layout.fragment_download_android, container, false);
142 }
143 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
144 {
145 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
146 }
147 }
148 return view;
149 }
150
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000151 private static View inflateStoreView(LayoutInflater inflater, ViewGroup container)
Tiago Costa198bf3d2014-12-16 15:23:18 +0000152 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000153
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000154 return inflater.inflate(R.layout.fragment_download_app_store, container, false);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000155 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100156
Jose Pascoal810950b2014-10-09 17:16:08 +0100157 private void toggleDownloadProgressAndRestart()
158 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100159 UpdaterState state = mainActivity.getCurrentUpdaterState();
160 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +0100161 {
162 case DOWNLOAD:
Filipe Gonçalvesa36d0bd2015-03-19 15:00:42 +0000163 mVersionInstallGroup.setVisibility(View.GONE);
164 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
Jose Pascoal810950b2014-10-09 17:16:08 +0100165 setupDownloadState();
Jose Pascoal810950b2014-10-09 17:16:08 +0100166 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100167
Jose Pascoal810950b2014-10-09 17:16:08 +0100168 case PREINSTALL:
Jose Pascoal79357c52015-03-12 20:14:29 +0000169 case ZIP_INSTALL:
Filipe Gonçalvesa36d0bd2015-03-19 15:00:42 +0000170 mVersionDownloadingGroup.setVisibility(View.GONE);
171 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoalb690af12014-10-06 18:29:26 +0100172
Filipe Gonçalvesa36d0bd2015-03-19 15:00:42 +0000173 setupPreInstallState();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100174
175 mRestartButton.setOnClickListener(new OnClickListener()
176 {
177
178 @Override
179 public void onClick(View v)
180 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000181 if (mIsVersion)
182 {
183 showEraseAllDataWarning();
184 }
185 else if (mSelectedStore != null)
186 {
187 startPreInstall();
188 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100189 }
190 });
191
Jose Pascoal810950b2014-10-09 17:16:08 +0100192 break;
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000193 case NORMAL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100194 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100195 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Filipe72b5a7f2015-09-01 08:59:54 +0000196 mainActivity.runOnUiThread(new Runnable() {
197 @Override
198 public void run() {
199 mainActivity.onBackPressed();
200 }
201 });
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100202 return;
203
Jose Pascoal810950b2014-10-09 17:16:08 +0100204 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100205
Jose Pascoal810950b2014-10-09 17:16:08 +0100206 mCancelButton.setOnClickListener(new OnClickListener()
207 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100208
Jose Pascoal810950b2014-10-09 17:16:08 +0100209 @Override
210 public void onClick(View v)
211 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000212 abortUpdateProcess("");
Jose Pascoal79357c52015-03-12 20:14:29 +0000213 if(Utils.hasUnifiedPartition(mainActivity.getResources()))
214 {
215 Utils.clearCache();
216 }
Filipe72b5a7f2015-09-01 08:59:54 +0000217 mainActivity.runOnUiThread(new Runnable() {
218 @Override
219 public void run() {
220 mainActivity.onBackPressed();
221 }
222 });
Jose Pascoal810950b2014-10-09 17:16:08 +0100223 }
224 });
225 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100226
Jose Pascoal75392162014-10-15 18:29:01 +0100227 private void showEraseAllDataWarning()
228 {
Tiago Costa73eda412014-11-18 14:37:42 +0000229 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100230 {
231 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
232 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
233 {
234
235 @Override
236 public void onClick(DialogInterface dialog, int which)
237 {
238 startPreInstall();
239 }
240 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
241 {
242 public void onClick(DialogInterface dialog, int which)
243 {
244 // do nothing
245 }
246 }).show();
247 }
248 else
249 {
250 startPreInstall();
251 }
252 }
253
Jose Pascoal1c049e02014-12-17 13:03:09 +0000254 private void updateHeader()
255 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000256 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100257 {
258 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
259 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000260 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100261 }
262 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
263 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000264 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100265 }
266 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000267 else if (mSelectedStore != null)
268 {
269 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
270 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100271 else
272 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000273 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100274 }
275 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100276
Jose Pascoal810950b2014-10-09 17:16:08 +0100277 private void startDownloadProgressUpdateThread()
278 {
279 new Thread(new Runnable()
280 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100281
Jose Pascoal810950b2014-10-09 17:16:08 +0100282 @Override
283 public void run()
284 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100285 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100286
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000287 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000288
Jose Pascoal46fdb062015-02-05 18:59:32 +0000289 int count = GET_LATEST_DOWNLOAD_ID_RETRIES;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000290
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000291 // Wait a sensible amount of time to get a correct reference to the download
292 while ((latestUpdateDownloadId <= 0) && count > 0)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000293 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000294 try
295 {
Jose Pascoal46fdb062015-02-05 18:59:32 +0000296 Thread.sleep(Utils.DELAY_HALF_SECOND);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000297 count--;
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000298 latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000299 } catch (InterruptedException e)
300 {
301 e.printStackTrace();
302 }
303 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000304
Jose Pascoalaa579a82014-11-05 22:17:16 +0000305 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100306 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100307
Jose Pascoal810950b2014-10-09 17:16:08 +0100308 DownloadManager.Query q = new DownloadManager.Query();
309 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100310
Jose Pascoalaa579a82014-11-05 22:17:16 +0000311 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000312
Jose Pascoalda015b12014-11-06 12:47:11 +0000313 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100314 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100315 try
316 {
317 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
318 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100319
Jose Pascoal46fdb062015-02-05 18:59:32 +0000320 if ((bytes_total + Utils.BUFFER_SIZE_10_MBYTES) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100321 {
322 downloading = false;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000323 abortUpdateProcess(getResources().getString(R.string.no_space_available_sd_card_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100324 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000325 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100326 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000327 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
328 {
329 case DownloadManager.STATUS_SUCCESSFUL:
330 case DownloadManager.STATUS_FAILED:
331 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100332
Jose Pascoalaa579a82014-11-05 22:17:16 +0000333 bytes_downloaded = 0;
334 bytes_total = 0;
335 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000336 default:
337 break;
Jose Pascoalaa579a82014-11-05 22:17:16 +0000338 }
339
340 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
341 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100342 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100343 } catch (Exception e)
344 {
345 downloading = false;
346 Log.e(TAG, "Error updating download progress: " + e.getMessage());
347 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100348
Jose Pascoal810950b2014-10-09 17:16:08 +0100349 cursor.close();
350 try
351 {
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000352 Thread.sleep(PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS);
Jose Pascoal810950b2014-10-09 17:16:08 +0100353 } catch (InterruptedException e)
354 {
355 e.printStackTrace();
356 }
357 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000358 else
359 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000360 if (cursor != null)
361 {
362 downloading = false;
363 cursor.close();
364 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000365 if (mDownloadManager == null)
366 {
367 downloading = false;
368 }
369 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100370 }
371 }
372 }).start();
373 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100374
Jose Pascoal810950b2014-10-09 17:16:08 +0100375 private void setupLayout(View view)
376 {
377 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal79357c52015-03-12 20:14:29 +0000378 mDownloadCompleteLabel = (TextView) view.findViewById(R.id.download_complete_label);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100379
Jose Pascoal810950b2014-10-09 17:16:08 +0100380 // download in progress group
381 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
382 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100383
Jose Pascoal810950b2014-10-09 17:16:08 +0100384 // restart group
385 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
386 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100387
Jose Pascoal810950b2014-10-09 17:16:08 +0100388 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
389 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100390
Jose Pascoal810950b2014-10-09 17:16:08 +0100391 @Override
392 public void onResume()
393 {
394 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100395
Jose Pascoal810950b2014-10-09 17:16:08 +0100396 setupInstallationReceivers();
Filipe72b5a7f2015-09-01 08:59:54 +0000397
Jose Pascoal810950b2014-10-09 17:16:08 +0100398 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100399
Filipe97f2bec2015-02-11 14:52:49 +0000400 registerNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000401
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100402 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000403
Jose Pascoal02d86242014-12-17 18:50:08 +0000404 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
405 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000406 {
Jose Pascoal40916302015-02-06 18:43:47 +0000407 mDownloadVersionName.setText(mainActivity.getItemName(item, mIsVersion));
Jose Pascoal79357c52015-03-12 20:14:29 +0000408 if(mIsZipInstall)
409 {
410 mDownloadCompleteLabel.setVisibility(View.GONE);
411 }
412 else
413 {
414 mDownloadCompleteLabel.setVisibility(View.VISIBLE);
415 }
Tiago Costa198bf3d2014-12-16 15:23:18 +0000416 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100417 toggleDownloadProgressAndRestart();
418 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100419
Filipe97f2bec2015-02-11 14:52:49 +0000420 private void registerNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000421 {
Filipe97f2bec2015-02-11 14:52:49 +0000422 unregisterNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000423 // Setup monitoring for future connectivity status changes
Filipe97f2bec2015-02-11 14:52:49 +0000424 mNetworkStateReceiver = new BroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000425 {
Filipe97f2bec2015-02-11 14:52:49 +0000426 @Override
427 public void onReceive(Context context, Intent intent)
Tiago Costa73eda412014-11-18 14:37:42 +0000428 {
Filipe97f2bec2015-02-11 14:52:49 +0000429 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
Tiago Costa73eda412014-11-18 14:37:42 +0000430 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000431 Log.w(TAG, "Aborted due to connection failure.");
432 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000433 mainActivity.runOnUiThread(new Runnable() {
434 @Override
435 public void run() {
436 mainActivity.onBackPressed();
437 }
438 });
Tiago Costa73eda412014-11-18 14:37:42 +0000439 }
Filipe97f2bec2015-02-11 14:52:49 +0000440 }
441 };
Tiago Costa73eda412014-11-18 14:37:42 +0000442
443 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
444 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
445 }
446
Filipe97f2bec2015-02-11 14:52:49 +0000447 private void unregisterNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000448 {
449 if (mNetworkStateReceiver != null)
450 {
451 mainActivity.unregisterReceiver(mNetworkStateReceiver);
452
453 mNetworkStateReceiver = null;
454 }
455 }
456
Jose Pascoal810950b2014-10-09 17:16:08 +0100457 @Override
458 public void onPause()
459 {
460 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100461
Jose Pascoal810950b2014-10-09 17:16:08 +0100462 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000463
Filipe97f2bec2015-02-11 14:52:49 +0000464 unregisterNetworkStatusBroadcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100465 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100466
Jose Pascoal810950b2014-10-09 17:16:08 +0100467 private void setupInstallationReceivers()
468 {
469 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100470
Jose Pascoal810950b2014-10-09 17:16:08 +0100471 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
472 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100473
Jose Pascoal810950b2014-10-09 17:16:08 +0100474 private void registerDownloadBroadCastReceiver()
475 {
476 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
477 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100478
Jose Pascoal810950b2014-10-09 17:16:08 +0100479 private void unregisterBroadCastReceiver()
480 {
481 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
482 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100483
Jose Pascoal810950b2014-10-09 17:16:08 +0100484 private class DownloadBroadCastReceiver extends BroadcastReceiver
485 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100486
Jose Pascoal810950b2014-10-09 17:16:08 +0100487 @Override
488 public void onReceive(Context context, Intent intent)
489 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100490
Jose Pascoal810950b2014-10-09 17:16:08 +0100491 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100492
Jose Pascoal810950b2014-10-09 17:16:08 +0100493 updateDownloadFile();
494 }
495 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100496
Jose Pascoal810950b2014-10-09 17:16:08 +0100497 private void updateDownloadFile()
498 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100499
Jose Pascoal810950b2014-10-09 17:16:08 +0100500 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100501
Jose Pascoal810950b2014-10-09 17:16:08 +0100502 if (downloadId != 0)
503 {
504 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100505
Jose Pascoal810950b2014-10-09 17:16:08 +0100506 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100507
Jose Pascoalaa579a82014-11-05 22:17:16 +0000508 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100509
Jose Pascoalaa579a82014-11-05 22:17:16 +0000510 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100511 {
512 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
513 int status = cursor.getInt(columnIndex);
514
515 switch (status)
516 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000517
Jose Pascoal810950b2014-10-09 17:16:08 +0100518 case DownloadManager.STATUS_SUCCESSFUL:
519 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
520 toggleDownloadProgressAndRestart();
521 break;
522 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000523 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100524 startDownloadProgressUpdateThread();
525 break;
526 case DownloadManager.STATUS_FAILED:
527 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000528 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000529 String error;
Jose Pascoal02d86242014-12-17 18:50:08 +0000530 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100531 {
Jose Pascoal40916302015-02-06 18:43:47 +0000532 String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item, mIsVersion);
Jose Pascoal4adf3192015-02-23 18:10:16 +0000533 error = resources.getString(R.string.error_downloading) + " " + downloadTitle;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000534 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100535 else
536 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000537 error = resources.getString(R.string.error_downloading);
Jose Pascoal810950b2014-10-09 17:16:08 +0100538 }
Jose Pascoal4adf3192015-02-23 18:10:16 +0000539 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000540 mainActivity.runOnUiThread(new Runnable() {
541 @Override
542 public void run() {
543 mainActivity.onBackPressed();
544 }
545 });
546
Jose Pascoal810950b2014-10-09 17:16:08 +0100547 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000548 default:
549 break;
Jose Pascoal810950b2014-10-09 17:16:08 +0100550 }
551 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100552 else
553 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000554 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000555
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100556 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100557
Jose Pascoalaa579a82014-11-05 22:17:16 +0000558 if (cursor != null)
559 {
560 cursor.close();
561 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100562 }
563 }
564
565 // ************************************************************************************
566 // PRE INSTALL
567 // ************************************************************************************
568
Jose Pascoal1c049e02014-12-17 13:03:09 +0000569 private void setupPreInstallState()
Tiago Costa198bf3d2014-12-16 15:23:18 +0000570 {
571 Resources resources = mainActivity.getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000572 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
573 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100574 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000575 File file = new File(getDownloadPath(item));
Jose Pascoal810950b2014-10-09 17:16:08 +0100576
577 if (file.exists())
578 {
Filipe72b5a7f2015-09-01 08:59:54 +0000579 copyUpdateToCache(file);
Jose Pascoal810950b2014-10-09 17:16:08 +0100580 }
581 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100582 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100583
Jose Pascoal810950b2014-10-09 17:16:08 +0100584 // ************************************************************************************
585 // DOWNLOAD UPDATE
586 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100587
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000588 void setupDownloadState()
Jose Pascoal810950b2014-10-09 17:16:08 +0100589 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000590 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000591
Jose Pascoal810950b2014-10-09 17:16:08 +0100592 // setup the download state views
Jose Pascoal1c049e02014-12-17 13:03:09 +0000593 if (item == null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100594 {
595 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100596
Jose Pascoal810950b2014-10-09 17:16:08 +0100597 // we don't have the lastest.xml so get back to initial state
598 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100599
Jose Pascoal46fdb062015-02-05 18:59:32 +0000600 final boolean notDeleted = !updateDir.delete();
601 if(notDeleted) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000602 Log.d(TAG, "Unable to delete " + updateDir.getAbsolutePath());
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000603 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100604
Jose Pascoal4adf3192015-02-23 18:10:16 +0000605 abortUpdateProcess("");
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100606
Jose Pascoal810950b2014-10-09 17:16:08 +0100607 return;
608 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100609
Jose Pascoal810950b2014-10-09 17:16:08 +0100610 // if there is a download ID on the shared preferences
611 if (mLatestUpdateDownloadId == 0)
612 {
613 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100614
Jose Pascoal810950b2014-10-09 17:16:08 +0100615 // invalid download Id
616 if (mLatestUpdateDownloadId == 0)
617 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000618 abortUpdateProcess("");
Jose Pascoal810950b2014-10-09 17:16:08 +0100619 return;
620 }
621 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100622
Jose Pascoal810950b2014-10-09 17:16:08 +0100623 updateDownloadFile();
624 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100625
Jose Pascoal810950b2014-10-09 17:16:08 +0100626 private void startPreInstall()
627 {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000628 final Resources resources = getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000629 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
630
Jose Pascoal60c99372015-03-17 15:52:59 +0000631 String otaPackagePath = Utils.getOtaPackagePath(resources, item, mIsVersion, mIsZipInstall);
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000632
633 boolean fileNotExists = !Utils.fileExists(otaPackagePath);
634
635 if (fileNotExists)
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000636 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000637 abortUpdateProcess(resources.getString(R.string.file_not_found_message) + ": " + otaPackagePath);
Filipe72b5a7f2015-09-01 08:59:54 +0000638 mainActivity.runOnUiThread(new Runnable() {
639 @Override
640 public void run() {
641 mainActivity.onBackPressed();
642 }
643 });
Jose Pascoal1c049e02014-12-17 13:03:09 +0000644 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000645 else if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100646 {
647 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100648 try
649 {
Jose Pascoal49f058a2015-02-13 16:58:01 +0000650 Utils.writeCacheCommand(mainActivity, otaPackagePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100651
Jose Pascoal49f058a2015-02-13 16:58:01 +0000652 new Thread(new Runnable() {
653 @SuppressLint("CommitPrefEdits")
654 @Override
655 public void run() {
656 Editor editor = mSharedPreferences.edit();
657 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
658 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100659
Jose Pascoal49f058a2015-02-13 16:58:01 +0000660 if (Utils.hasUnifiedPartition(resources))
661 {
662 removeLastUpdateDownload();
663 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100664
Tiago Costad7e951f2015-03-02 17:37:33 +0000665 // remove the gapps stuff
666// String model = Utils.getModelAndOS(getActivity());
667// if( model.contains("FP1") ) {
668 try {
669
670 Utils.clearGappsData();
671 } catch (RootDeniedException | InterruptedException | IOException e) {
672 e.printStackTrace();
673 }
674// }
675
Jose Pascoal49f058a2015-02-13 16:58:01 +0000676 // remove the update files from data
677 removeUpdateFilesFromData();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100678
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000679 mainActivity.updateStatePreference(UpdaterState.NORMAL);
680 mainActivity.clearSelectedItems();
681 clearConfigFile();
682 editor = mSharedPreferences.edit();
683 editor.remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS);
684 editor.remove(MainFragment.SHARED_PREFERENCES_ENABLE_GAPPS);
685 editor.commit();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000686
687 // reboot the device into recovery
688 if(!Utils.rebootToRecovery(mainActivity)) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000689 String error = resources.getString(R.string.reboot_failed);
690 Log.w(TAG, error);
691 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000692 mainActivity.onBackPressed();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000693 }
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000694 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000695 }).start();
696 } catch (IOException | NotFoundException | TimeoutException | RootDeniedException e)
697 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000698 String error = resources.getString(R.string.command_write_to_cache_failed);
699 Log.e(TAG, error + ": " + e.getLocalizedMessage());
700 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000701 mainActivity.runOnUiThread(new Runnable() {
702 @Override
703 public void run() {
704 mainActivity.onBackPressed();
705 }
706 });
Jose Pascoal49f058a2015-02-13 16:58:01 +0000707 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100708 }
709 else
710 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000711 Log.e(TAG, "Null item");
712 abortUpdateProcess("");
Filipe72b5a7f2015-09-01 08:59:54 +0000713 mainActivity.runOnUiThread(new Runnable() {
714 @Override
715 public void run() {
716 mainActivity.onBackPressed();
717 }
718 });
719
Jose Pascoal810950b2014-10-09 17:16:08 +0100720 }
721 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100722
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000723 private void clearConfigFile()
724 {
725 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
726 if (cfgFile != 0 && mDownloadManager != null)
727 {
728 mDownloadManager.remove(cfgFile);
729 }
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000730 mainActivity.clearConfigFileDownloadId();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000731 VersionParserHelper.removeConfigFiles(mainActivity);
732 }
733
Jose Pascoal810950b2014-10-09 17:16:08 +0100734 private void copyUpdateToCache(File file)
735 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000736 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100737 {
Filipe72b5a7f2015-09-01 08:59:54 +0000738
Jose Pascoal1c049e02014-12-17 13:03:09 +0000739 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal733b84e2014-10-17 14:49:02 +0100740 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
Filipe72b5a7f2015-09-01 08:59:54 +0000741
Jose Pascoal1c049e02014-12-17 13:03:09 +0000742 if (item != null)
743 {
Jose Pascoal40916302015-02-06 18:43:47 +0000744 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000745 }
746 else
747 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000748 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000749 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100750 }
751 else
752 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000753 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100754 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000755 Log.w(TAG, "No space on cache. Defaulting to Sdcard");
756 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100757 }
758 }
759 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100760
Jose Pascoal810950b2014-10-09 17:16:08 +0100761 // ************************************************************************************
762 // Update Removal
763 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000764 private void removeUpdateFilesFromData() {
765 if (PrivilegeChecker.isPrivilegedApp()) {
766 removeUpdateFilesFromDataPrivileged();
767 } else {
768 removeUpdateFilesFromDataUnprivileged();
769 }
770 }
771
772 private void removeUpdateFilesFromDataPrivileged() {
773 Resources resource = getResources();
774
775 try {
776 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
777 p.waitFor();
778 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
779 p.waitFor();
780 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
781 p.waitFor();
782 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
783 p.waitFor();
784 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
785 p.waitFor();
786 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
787 p.waitFor();
788 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
789 p.waitFor();
790 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
791 p.waitFor();
792 } catch (IOException | InterruptedException e) {
793 Log.d(TAG, "Failed to remove files from data:" +e);
794 }
795 }
796
797 private void removeUpdateFilesFromDataUnprivileged()
798 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100799 try
800 {
801 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
802 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
803 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
804 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
805 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000806 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100807 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000808 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100809 }
810 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100811
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000812 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100813 {
814 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000815 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100816 {
817 // residue download ID
818 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100819
Jose Pascoal810950b2014-10-09 17:16:08 +0100820 mainActivity.resetLastUpdateDownloadId();
821 }
822 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100823
Jose Pascoal810950b2014-10-09 17:16:08 +0100824 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
825 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100826
Jose Pascoal810950b2014-10-09 17:16:08 +0100827 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100828
Jose Pascoal810950b2014-10-09 17:16:08 +0100829 @Override
830 protected Integer doInBackground(String... params)
831 {
Filipe72b5a7f2015-09-01 08:59:54 +0000832
Jose Pascoal810950b2014-10-09 17:16:08 +0100833 // check the correct number of
834 if (params.length != 2)
835 {
836 return -1;
837 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100838
Jose Pascoal810950b2014-10-09 17:16:08 +0100839 String originalFilePath = params[0];
840 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100841
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000842 Utils.clearCache();
843
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000844 File otaOriginalFile = new File(originalFilePath);
845 File otaDestinyFile = new File(destinyFilePath);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000846
Filipe72b5a7f2015-09-01 08:59:54 +0000847 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
848
849 if (!(Utils.checkMD5(item.getMd5Sum(), otaOriginalFile) || mIsZipInstall))
850 {
851 mainActivity.runOnUiThread(new Runnable() {
852 @Override
853 public void run() {
854 abortUpdateProcess(getResources().getString(R.string.invalid_md5_download_message));
855 mainActivity.runOnUiThread(new Runnable() {
856 @Override
857 public void run() {
858 mainActivity.onBackPressed();
859 }
860 });
861 }
862 });
863 removeLastUpdateDownload();
864 }
865 else if (otaOriginalFile.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100866 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000867 try {
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000868 Utils.copy(otaOriginalFile, otaDestinyFile);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000869 } catch (IOException e) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000870 String error = mainActivity.getResources().getString(R.string.copy_to_cache_failed_message);
871 Log.e(TAG, error + ": " + originalFilePath + ". " + e.getLocalizedMessage());
Filipe72b5a7f2015-09-01 08:59:54 +0000872 abortUpdateProcess(error);
873 mainActivity.runOnUiThread(new Runnable() {
874 @Override
875 public void run() {
876 mainActivity.onBackPressed();
877 }
878 });
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000879 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100880 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100881 else
882 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000883 Resources resources = mainActivity.getResources();
884 String error = resources.getString(R.string.copy_to_cache_failed_message) + ". " + resources.getString(R.string.file_not_found_message) + ": " + originalFilePath;
885 Log.e(TAG, error);
886 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000887 mainActivity.runOnUiThread(new Runnable() {
888 @Override
889 public void run() {
890 mainActivity.onBackPressed();
891 }
892 });
Jose Pascoal733b84e2014-10-17 14:49:02 +0100893 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100894
Jose Pascoal810950b2014-10-09 17:16:08 +0100895 return 1;
896 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100897
Jose Pascoal810950b2014-10-09 17:16:08 +0100898 protected void onProgressUpdate(Integer... progress)
899 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100900
Jose Pascoal810950b2014-10-09 17:16:08 +0100901 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100902
Jose Pascoal810950b2014-10-09 17:16:08 +0100903 protected void onPreExecute()
904 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100905 if (mProgress == null)
906 {
907 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100908 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100909 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
910 }
911 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100912
Jose Pascoal810950b2014-10-09 17:16:08 +0100913 protected void onPostExecute(Integer result)
914 {
915 // disable the spinner
916 if (mProgress != null)
917 {
918 mProgress.dismiss();
919 mProgress = null;
920 }
921 }
922 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100923
Jose Pascoal1c049e02014-12-17 13:03:09 +0000924 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100925 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000926 String path;
927 if(mIsZipInstall)
928 {
929 path = mainActivity.getZipFilePath();
930 }
931 else
932 {
933 Resources resources = mainActivity.getResources();
934 path = Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
935 }
936 return path;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000937 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100938
Jose Pascoal4adf3192015-02-23 18:10:16 +0000939 public void abortUpdateProcess(final String reason)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100940 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000941 if(!TextUtils.isEmpty(reason)) {
942 mainActivity.runOnUiThread(new Runnable() {
943 @Override
944 public void run() {
945 Toast.makeText(mainActivity, reason, Toast.LENGTH_LONG).show();
946 }
947 });
948 }
949
Tiago Costa73eda412014-11-18 14:37:42 +0000950 removeLastUpdateDownload();
951
Jose Pascoal87758742015-01-28 20:00:22 +0000952 mainActivity.clearSelectedItems();
953 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100954 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100955}