blob: 85f11b5591915caab391d536115dd5f5209c9f7f [file] [log] [blame]
Jose Pascoalb690af12014-10-06 18:29:26 +01001package com.fairphone.updater.fragments;
2
Jose Pascoal54b3ae62014-10-07 20:29:58 +01003import java.io.File;
4import java.io.IOException;
5import java.util.concurrent.TimeoutException;
6
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +00007import android.annotation.SuppressLint;
Jose Pascoal75392162014-10-15 18:29:01 +01008import android.app.AlertDialog;
Jose Pascoalb690af12014-10-06 18:29:26 +01009import android.app.DownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010010import android.app.ProgressDialog;
11import android.content.BroadcastReceiver;
12import android.content.Context;
Jose Pascoal75392162014-10-15 18:29:01 +010013import android.content.DialogInterface;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010014import android.content.Intent;
15import android.content.IntentFilter;
Tiago Costa87925fe2014-12-02 17:57:51 +000016import android.content.SharedPreferences.Editor;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010017import android.content.res.Resources;
18import android.content.res.Resources.NotFoundException;
Jose Pascoalb690af12014-10-06 18:29:26 +010019import android.database.Cursor;
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000020import android.net.ConnectivityManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010021import android.os.AsyncTask;
Jose Pascoalb690af12014-10-06 18:29:26 +010022import android.os.Bundle;
23import android.os.Environment;
Jose Pascoal4adf3192015-02-23 18:10:16 +000024import android.text.TextUtils;
Jose Pascoalb690af12014-10-06 18:29:26 +010025import android.util.Log;
26import android.view.LayoutInflater;
27import android.view.View;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010028import android.view.View.OnClickListener;
Jose Pascoalb690af12014-10-06 18:29:26 +010029import android.view.ViewGroup;
30import android.widget.Button;
31import android.widget.LinearLayout;
32import android.widget.ProgressBar;
33import android.widget.TextView;
34import android.widget.Toast;
35
Jose Pascoal7bf83a02014-10-13 18:30:18 +010036import com.fairphone.updater.FairphoneUpdater.HeaderType;
37import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010038import com.fairphone.updater.R;
Jose Pascoal02d86242014-12-17 18:50:08 +000039import com.fairphone.updater.UpdaterService;
Jose Pascoal1c049e02014-12-17 13:03:09 +000040import com.fairphone.updater.data.DownloadableItem;
Tiago Costa198bf3d2014-12-16 15:23:18 +000041import com.fairphone.updater.data.Store;
Jose Pascoal79357c52015-03-12 20:14:29 +000042import com.fairphone.updater.data.UpdaterData;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010043import com.fairphone.updater.data.Version;
Jose Pascoalc2545cc2014-12-18 16:51:52 +000044import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoal49f058a2015-02-13 16:58:01 +000045import com.fairphone.updater.tools.PrivilegeChecker;
Jose Pascoalb690af12014-10-06 18:29:26 +010046import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010047import com.stericson.RootTools.exceptions.RootDeniedException;
48import com.stericson.RootTools.execution.CommandCapture;
49import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010050
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000051@SuppressLint("ValidFragment")
Jose Pascoal810950b2014-10-09 17:16:08 +010052public class DownloadAndRestartFragment extends BaseFragment
53{
Jose Pascoalb690af12014-10-06 18:29:26 +010054
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +000055 private static final int PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS = 1000;
56
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000057 private static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoal46fdb062015-02-05 18:59:32 +000058 private static final int GET_LATEST_DOWNLOAD_ID_RETRIES = 12;
Jose Pascoal79357c52015-03-12 20:14:29 +000059 private boolean mIsZipInstall;
Jose Pascoalb690af12014-10-06 18:29:26 +010060
Jose Pascoal810950b2014-10-09 17:16:08 +010061 private TextView mDownloadVersionName;
62 private LinearLayout mVersionDownloadingGroup;
63 private ProgressBar mVersionDownloadProgressBar;
64 private LinearLayout mVersionInstallGroup;
65 private Button mRestartButton;
66 private Button mCancelButton;
67 private Version mSelectedVersion;
Tiago Costa198bf3d2014-12-16 15:23:18 +000068 private Store mSelectedStore;
Jose Pascoalb690af12014-10-06 18:29:26 +010069
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000070 private final boolean mIsVersion;
Jose Pascoal1c049e02014-12-17 13:03:09 +000071
Jose Pascoal810950b2014-10-09 17:16:08 +010072 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010073
Jose Pascoal810950b2014-10-09 17:16:08 +010074 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010075
Tiago Costa73eda412014-11-18 14:37:42 +000076 private BroadcastReceiver mNetworkStateReceiver;
77
Jose Pascoal810950b2014-10-09 17:16:08 +010078 private long mLatestUpdateDownloadId;
Jose Pascoal79357c52015-03-12 20:14:29 +000079 private TextView mDownloadCompleteLabel;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010080
Jose Pascoal1c049e02014-12-17 13:03:09 +000081 public DownloadAndRestartFragment(boolean isVersion)
82 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000083 super();
Jose Pascoal1c049e02014-12-17 13:03:09 +000084
Tiago Costa198bf3d2014-12-16 15:23:18 +000085 mIsVersion = isVersion;
86 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000087
Jose Pascoal810950b2014-10-09 17:16:08 +010088 @Override
89 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
90 {
91 // Inflate the layout for this fragment
Jose Pascoal79357c52015-03-12 20:14:29 +000092 mIsZipInstall = UpdaterState.ZIP_INSTALL == mainActivity.getCurrentUpdaterState();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000093 View view;
Jose Pascoal1c049e02014-12-17 13:03:09 +000094 if (mIsVersion)
95 {
Jose Pascoal79357c52015-03-12 20:14:29 +000096 mSelectedVersion = getSelectedVersion();
Tiago Costa198bf3d2014-12-16 15:23:18 +000097 view = inflateViewByImageType(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000098 mSelectedStore = null;
99 }
100 else
101 {
Tiago Costa198bf3d2014-12-16 15:23:18 +0000102 mSelectedStore = mainActivity.getSelectedStore();
103 view = inflateStoreView(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000104 mSelectedVersion = null;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000105 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000106
Jose Pascoal810950b2014-10-09 17:16:08 +0100107 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000108
Jose Pascoal810950b2014-10-09 17:16:08 +0100109 return view;
110 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000111
Jose Pascoal79357c52015-03-12 20:14:29 +0000112 private Version getSelectedVersion() {
113 Version version;
114 if(mIsZipInstall) {
115 Resources resources = mainActivity.getResources();
116
117 //Get the zip file name
118 String[] zipPath = getDownloadPath(null).split("/");
119 String zipName = "";
120 if (zipPath != null && zipPath.length > 0) {
121 zipName = zipPath[zipPath.length - 1];
122 }
123
124 version = new Version();
125 version.setName(resources.getString(R.string.install) + " " + zipName);
Jose Pascoal60c99372015-03-17 15:52:59 +0000126 version.setDownloadLink(mainActivity.getZipFilePath());
Jose Pascoal79357c52015-03-12 20:14:29 +0000127 version.setNumber(Version.ZIP_INSTALL_VERSION);
128 }
129 else
130 {
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 {
Filipe72b5a7f2015-09-01 08:59:54 +0000740
Jose Pascoal1c049e02014-12-17 13:03:09 +0000741 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal733b84e2014-10-17 14:49:02 +0100742 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
Filipe72b5a7f2015-09-01 08:59:54 +0000743
Jose Pascoal1c049e02014-12-17 13:03:09 +0000744 if (item != null)
745 {
Jose Pascoal40916302015-02-06 18:43:47 +0000746 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000747 }
748 else
749 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000750 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000751 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100752 }
753 else
754 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000755 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100756 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000757 Log.w(TAG, "No space on cache. Defaulting to Sdcard");
758 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100759 }
760 }
761 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100762
Jose Pascoal810950b2014-10-09 17:16:08 +0100763 // ************************************************************************************
764 // Update Removal
765 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000766 private void removeUpdateFilesFromData() {
767 if (PrivilegeChecker.isPrivilegedApp()) {
768 removeUpdateFilesFromDataPrivileged();
769 } else {
770 removeUpdateFilesFromDataUnprivileged();
771 }
772 }
773
774 private void removeUpdateFilesFromDataPrivileged() {
775 Resources resource = getResources();
776
777 try {
778 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
779 p.waitFor();
780 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
781 p.waitFor();
782 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
783 p.waitFor();
784 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
785 p.waitFor();
786 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
787 p.waitFor();
788 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
789 p.waitFor();
790 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
791 p.waitFor();
792 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
793 p.waitFor();
794 } catch (IOException | InterruptedException e) {
795 Log.d(TAG, "Failed to remove files from data:" +e);
796 }
797 }
798
799 private void removeUpdateFilesFromDataUnprivileged()
800 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100801 try
802 {
803 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
804 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
805 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
806 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
807 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000808 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100809 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000810 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100811 }
812 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100813
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000814 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100815 {
816 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000817 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100818 {
819 // residue download ID
820 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100821
Jose Pascoal810950b2014-10-09 17:16:08 +0100822 mainActivity.resetLastUpdateDownloadId();
823 }
824 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100825
Jose Pascoal810950b2014-10-09 17:16:08 +0100826 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
827 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100828
Jose Pascoal810950b2014-10-09 17:16:08 +0100829 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100830
Jose Pascoal810950b2014-10-09 17:16:08 +0100831 @Override
832 protected Integer doInBackground(String... params)
833 {
Filipe72b5a7f2015-09-01 08:59:54 +0000834
Jose Pascoal810950b2014-10-09 17:16:08 +0100835 // check the correct number of
836 if (params.length != 2)
837 {
838 return -1;
839 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100840
Jose Pascoal810950b2014-10-09 17:16:08 +0100841 String originalFilePath = params[0];
842 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100843
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000844 Utils.clearCache();
845
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000846 File otaOriginalFile = new File(originalFilePath);
847 File otaDestinyFile = new File(destinyFilePath);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000848
Filipe72b5a7f2015-09-01 08:59:54 +0000849 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
850
851 if (!(Utils.checkMD5(item.getMd5Sum(), otaOriginalFile) || mIsZipInstall))
852 {
853 mainActivity.runOnUiThread(new Runnable() {
854 @Override
855 public void run() {
856 abortUpdateProcess(getResources().getString(R.string.invalid_md5_download_message));
857 mainActivity.runOnUiThread(new Runnable() {
858 @Override
859 public void run() {
860 mainActivity.onBackPressed();
861 }
862 });
863 }
864 });
865 removeLastUpdateDownload();
866 }
867 else if (otaOriginalFile.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100868 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000869 try {
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000870 Utils.copy(otaOriginalFile, otaDestinyFile);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000871 } catch (IOException e) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000872 String error = mainActivity.getResources().getString(R.string.copy_to_cache_failed_message);
873 Log.e(TAG, error + ": " + originalFilePath + ". " + e.getLocalizedMessage());
Filipe72b5a7f2015-09-01 08:59:54 +0000874 abortUpdateProcess(error);
875 mainActivity.runOnUiThread(new Runnable() {
876 @Override
877 public void run() {
878 mainActivity.onBackPressed();
879 }
880 });
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000881 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100882 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100883 else
884 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000885 Resources resources = mainActivity.getResources();
886 String error = resources.getString(R.string.copy_to_cache_failed_message) + ". " + resources.getString(R.string.file_not_found_message) + ": " + originalFilePath;
887 Log.e(TAG, error);
888 abortUpdateProcess(error);
Filipe72b5a7f2015-09-01 08:59:54 +0000889 mainActivity.runOnUiThread(new Runnable() {
890 @Override
891 public void run() {
892 mainActivity.onBackPressed();
893 }
894 });
Jose Pascoal733b84e2014-10-17 14:49:02 +0100895 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100896
Jose Pascoal810950b2014-10-09 17:16:08 +0100897 return 1;
898 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100899
Jose Pascoal810950b2014-10-09 17:16:08 +0100900 protected void onProgressUpdate(Integer... progress)
901 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100902
Jose Pascoal810950b2014-10-09 17:16:08 +0100903 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100904
Jose Pascoal810950b2014-10-09 17:16:08 +0100905 protected void onPreExecute()
906 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100907 if (mProgress == null)
908 {
909 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100910 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100911 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
912 }
913 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100914
Jose Pascoal810950b2014-10-09 17:16:08 +0100915 protected void onPostExecute(Integer result)
916 {
917 // disable the spinner
918 if (mProgress != null)
919 {
920 mProgress.dismiss();
921 mProgress = null;
922 }
923 }
924 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100925
Jose Pascoal1c049e02014-12-17 13:03:09 +0000926 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100927 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000928 String path;
929 if(mIsZipInstall)
930 {
931 path = mainActivity.getZipFilePath();
932 }
933 else
934 {
935 Resources resources = mainActivity.getResources();
936 path = Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
937 }
938 return path;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000939 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100940
Jose Pascoal4adf3192015-02-23 18:10:16 +0000941 public void abortUpdateProcess(final String reason)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100942 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000943 if(!TextUtils.isEmpty(reason)) {
944 mainActivity.runOnUiThread(new Runnable() {
945 @Override
946 public void run() {
947 Toast.makeText(mainActivity, reason, Toast.LENGTH_LONG).show();
948 }
949 });
950 }
951
Tiago Costa73eda412014-11-18 14:37:42 +0000952 removeLastUpdateDownload();
953
Jose Pascoal87758742015-01-28 20:00:22 +0000954 mainActivity.clearSelectedItems();
955 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100956 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100957}