blob: 35c496a585763a98c32f162e35d90b5c896e4fa6 [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:
165 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100166
Jose Pascoal810950b2014-10-09 17:16:08 +0100167 mVersionInstallGroup.setVisibility(View.GONE);
168 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
169 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100170
Jose Pascoal810950b2014-10-09 17:16:08 +0100171 case PREINSTALL:
Jose Pascoal79357c52015-03-12 20:14:29 +0000172 case ZIP_INSTALL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100173 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100174
Jose Pascoal810950b2014-10-09 17:16:08 +0100175 mVersionDownloadingGroup.setVisibility(View.GONE);
176 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100177
178 mRestartButton.setOnClickListener(new OnClickListener()
179 {
180
181 @Override
182 public void onClick(View v)
183 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000184 if (mIsVersion)
185 {
186 showEraseAllDataWarning();
187 }
188 else if (mSelectedStore != null)
189 {
190 startPreInstall();
191 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100192 }
193 });
194
Jose Pascoal810950b2014-10-09 17:16:08 +0100195 break;
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000196 case NORMAL:
Jose Pascoal810950b2014-10-09 17:16:08 +0100197 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100198 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal87758742015-01-28 20:00:22 +0000199 mainActivity.onBackPressed();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100200 return;
201
Jose Pascoal810950b2014-10-09 17:16:08 +0100202 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100203
Jose Pascoal810950b2014-10-09 17:16:08 +0100204 mCancelButton.setOnClickListener(new OnClickListener()
205 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100206
Jose Pascoal810950b2014-10-09 17:16:08 +0100207 @Override
208 public void onClick(View v)
209 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000210 abortUpdateProcess("");
Jose Pascoal79357c52015-03-12 20:14:29 +0000211 if(Utils.hasUnifiedPartition(mainActivity.getResources()))
212 {
213 Utils.clearCache();
214 }
Jose Pascoal87758742015-01-28 20:00:22 +0000215 mainActivity.onBackPressed();
Jose Pascoal810950b2014-10-09 17:16:08 +0100216 }
217 });
218 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100219
Jose Pascoal75392162014-10-15 18:29:01 +0100220 private void showEraseAllDataWarning()
221 {
Tiago Costa73eda412014-11-18 14:37:42 +0000222 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100223 {
224 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
225 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
226 {
227
228 @Override
229 public void onClick(DialogInterface dialog, int which)
230 {
231 startPreInstall();
232 }
233 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
234 {
235 public void onClick(DialogInterface dialog, int which)
236 {
237 // do nothing
238 }
239 }).show();
240 }
241 else
242 {
243 startPreInstall();
244 }
245 }
246
Jose Pascoal1c049e02014-12-17 13:03:09 +0000247 private void updateHeader()
248 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000249 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100250 {
251 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
252 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000253 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100254 }
255 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
256 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000257 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100258 }
259 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000260 else if (mSelectedStore != null)
261 {
262 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
263 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100264 else
265 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000266 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100267 }
268 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100269
Jose Pascoal810950b2014-10-09 17:16:08 +0100270 private void startDownloadProgressUpdateThread()
271 {
272 new Thread(new Runnable()
273 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100274
Jose Pascoal810950b2014-10-09 17:16:08 +0100275 @Override
276 public void run()
277 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100278 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100279
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000280 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000281
Jose Pascoal46fdb062015-02-05 18:59:32 +0000282 int count = GET_LATEST_DOWNLOAD_ID_RETRIES;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000283
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000284 // Wait a sensible amount of time to get a correct reference to the download
285 while ((latestUpdateDownloadId <= 0) && count > 0)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000286 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000287 try
288 {
Jose Pascoal46fdb062015-02-05 18:59:32 +0000289 Thread.sleep(Utils.DELAY_HALF_SECOND);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000290 count--;
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000291 latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000292 } catch (InterruptedException e)
293 {
294 e.printStackTrace();
295 }
296 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000297
Jose Pascoalaa579a82014-11-05 22:17:16 +0000298 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100299 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100300
Jose Pascoal810950b2014-10-09 17:16:08 +0100301 DownloadManager.Query q = new DownloadManager.Query();
302 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100303
Jose Pascoalaa579a82014-11-05 22:17:16 +0000304 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000305
Jose Pascoalda015b12014-11-06 12:47:11 +0000306 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100307 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100308 try
309 {
310 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
311 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100312
Jose Pascoal46fdb062015-02-05 18:59:32 +0000313 if ((bytes_total + Utils.BUFFER_SIZE_10_MBYTES) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100314 {
315 downloading = false;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000316 abortUpdateProcess(getResources().getString(R.string.no_space_available_sd_card_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100317 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000318 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100319 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000320 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
321 {
322 case DownloadManager.STATUS_SUCCESSFUL:
323 case DownloadManager.STATUS_FAILED:
324 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100325
Jose Pascoalaa579a82014-11-05 22:17:16 +0000326 bytes_downloaded = 0;
327 bytes_total = 0;
328 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000329 default:
330 break;
Jose Pascoalaa579a82014-11-05 22:17:16 +0000331 }
332
333 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
334 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100335 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100336 } catch (Exception e)
337 {
338 downloading = false;
339 Log.e(TAG, "Error updating download progress: " + e.getMessage());
340 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100341
Jose Pascoal810950b2014-10-09 17:16:08 +0100342 cursor.close();
343 try
344 {
Filipe Gonçalves8ad8bfb2015-01-15 14:14:50 +0000345 Thread.sleep(PROGRESS_BAR_UPDATE_FREQUENCY_IN_MILLIS);
Jose Pascoal810950b2014-10-09 17:16:08 +0100346 } catch (InterruptedException e)
347 {
348 e.printStackTrace();
349 }
350 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000351 else
352 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000353 if (cursor != null)
354 {
355 downloading = false;
356 cursor.close();
357 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000358 if (mDownloadManager == null)
359 {
360 downloading = false;
361 }
362 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100363 }
364 }
365 }).start();
366 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100367
Jose Pascoal810950b2014-10-09 17:16:08 +0100368 private void setupLayout(View view)
369 {
370 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal79357c52015-03-12 20:14:29 +0000371 mDownloadCompleteLabel = (TextView) view.findViewById(R.id.download_complete_label);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100372
Jose Pascoal810950b2014-10-09 17:16:08 +0100373 // download in progress group
374 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
375 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100376
Jose Pascoal810950b2014-10-09 17:16:08 +0100377 // restart group
378 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
379 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100380
Jose Pascoal810950b2014-10-09 17:16:08 +0100381 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
382 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100383
Jose Pascoal810950b2014-10-09 17:16:08 +0100384 @Override
385 public void onResume()
386 {
387 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100388
Jose Pascoal810950b2014-10-09 17:16:08 +0100389 setupInstallationReceivers();
390 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100391
Filipe97f2bec2015-02-11 14:52:49 +0000392 registerNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000393
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100394 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000395
Jose Pascoal02d86242014-12-17 18:50:08 +0000396 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
397 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000398 {
Jose Pascoal40916302015-02-06 18:43:47 +0000399 mDownloadVersionName.setText(mainActivity.getItemName(item, mIsVersion));
Jose Pascoal79357c52015-03-12 20:14:29 +0000400 if(mIsZipInstall)
401 {
402 mDownloadCompleteLabel.setVisibility(View.GONE);
403 }
404 else
405 {
406 mDownloadCompleteLabel.setVisibility(View.VISIBLE);
407 }
Tiago Costa198bf3d2014-12-16 15:23:18 +0000408 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000409
Jose Pascoal810950b2014-10-09 17:16:08 +0100410 toggleDownloadProgressAndRestart();
411 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100412
Filipe97f2bec2015-02-11 14:52:49 +0000413 private void registerNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000414 {
Filipe97f2bec2015-02-11 14:52:49 +0000415 unregisterNetworkStatusBroadcastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000416 // Setup monitoring for future connectivity status changes
Filipe97f2bec2015-02-11 14:52:49 +0000417 mNetworkStateReceiver = new BroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000418 {
Filipe97f2bec2015-02-11 14:52:49 +0000419 @Override
420 public void onReceive(Context context, Intent intent)
Tiago Costa73eda412014-11-18 14:37:42 +0000421 {
Filipe97f2bec2015-02-11 14:52:49 +0000422 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
Tiago Costa73eda412014-11-18 14:37:42 +0000423 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000424 Log.w(TAG, "Aborted due to connection failure.");
425 abortUpdateProcess("");
Filipe97f2bec2015-02-11 14:52:49 +0000426 mainActivity.onBackPressed();
Tiago Costa73eda412014-11-18 14:37:42 +0000427 }
Filipe97f2bec2015-02-11 14:52:49 +0000428 }
429 };
Tiago Costa73eda412014-11-18 14:37:42 +0000430
431 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
432 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
433 }
434
Filipe97f2bec2015-02-11 14:52:49 +0000435 private void unregisterNetworkStatusBroadcastReceiver()
Tiago Costa73eda412014-11-18 14:37:42 +0000436 {
437 if (mNetworkStateReceiver != null)
438 {
439 mainActivity.unregisterReceiver(mNetworkStateReceiver);
440
441 mNetworkStateReceiver = null;
442 }
443 }
444
Jose Pascoal810950b2014-10-09 17:16:08 +0100445 @Override
446 public void onPause()
447 {
448 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100449
Jose Pascoal810950b2014-10-09 17:16:08 +0100450 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000451
Filipe97f2bec2015-02-11 14:52:49 +0000452 unregisterNetworkStatusBroadcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100453 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100454
Jose Pascoal810950b2014-10-09 17:16:08 +0100455 private void setupInstallationReceivers()
456 {
457 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100458
Jose Pascoal810950b2014-10-09 17:16:08 +0100459 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
460 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100461
Jose Pascoal810950b2014-10-09 17:16:08 +0100462 private void registerDownloadBroadCastReceiver()
463 {
464 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
465 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100466
Jose Pascoal810950b2014-10-09 17:16:08 +0100467 private void unregisterBroadCastReceiver()
468 {
469 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
470 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100471
Jose Pascoal810950b2014-10-09 17:16:08 +0100472 private class DownloadBroadCastReceiver extends BroadcastReceiver
473 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100474
Jose Pascoal810950b2014-10-09 17:16:08 +0100475 @Override
476 public void onReceive(Context context, Intent intent)
477 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100478
Jose Pascoal810950b2014-10-09 17:16:08 +0100479 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100480
Jose Pascoal810950b2014-10-09 17:16:08 +0100481 updateDownloadFile();
482 }
483 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100484
Jose Pascoal810950b2014-10-09 17:16:08 +0100485 private void updateDownloadFile()
486 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100487
Jose Pascoal810950b2014-10-09 17:16:08 +0100488 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100489
Jose Pascoal810950b2014-10-09 17:16:08 +0100490 if (downloadId != 0)
491 {
492 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100493
Jose Pascoal810950b2014-10-09 17:16:08 +0100494 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100495
Jose Pascoalaa579a82014-11-05 22:17:16 +0000496 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100497
Jose Pascoalaa579a82014-11-05 22:17:16 +0000498 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100499 {
500 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
501 int status = cursor.getInt(columnIndex);
502
503 switch (status)
504 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000505
Jose Pascoal810950b2014-10-09 17:16:08 +0100506 case DownloadManager.STATUS_SUCCESSFUL:
507 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
508 toggleDownloadProgressAndRestart();
509 break;
510 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000511 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100512 startDownloadProgressUpdateThread();
513 break;
514 case DownloadManager.STATUS_FAILED:
515 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000516 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal4adf3192015-02-23 18:10:16 +0000517 String error;
Jose Pascoal02d86242014-12-17 18:50:08 +0000518 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100519 {
Jose Pascoal40916302015-02-06 18:43:47 +0000520 String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item, mIsVersion);
Jose Pascoal4adf3192015-02-23 18:10:16 +0000521 error = resources.getString(R.string.error_downloading) + " " + downloadTitle;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000522 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100523 else
524 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000525 error = resources.getString(R.string.error_downloading);
Jose Pascoal810950b2014-10-09 17:16:08 +0100526 }
Jose Pascoal4adf3192015-02-23 18:10:16 +0000527 abortUpdateProcess(error);
Jose Pascoal810950b2014-10-09 17:16:08 +0100528 break;
Jose Pascoal40916302015-02-06 18:43:47 +0000529 default:
530 break;
Jose Pascoal810950b2014-10-09 17:16:08 +0100531 }
532 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100533 else
534 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000535 abortUpdateProcess("");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100536 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100537
Jose Pascoalaa579a82014-11-05 22:17:16 +0000538 if (cursor != null)
539 {
540 cursor.close();
541 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100542 }
543 }
544
545 // ************************************************************************************
546 // PRE INSTALL
547 // ************************************************************************************
548
Jose Pascoal1c049e02014-12-17 13:03:09 +0000549 private void setupPreInstallState()
Tiago Costa198bf3d2014-12-16 15:23:18 +0000550 {
551 Resources resources = mainActivity.getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000552 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
553 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100554 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000555 File file = new File(getDownloadPath(item));
Jose Pascoal810950b2014-10-09 17:16:08 +0100556
557 if (file.exists())
558 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000559 if (Utils.checkMD5(item.getMd5Sum(), file) || mIsZipInstall)
Jose Pascoal810950b2014-10-09 17:16:08 +0100560 {
561 copyUpdateToCache(file);
Jose Pascoal810950b2014-10-09 17:16:08 +0100562 }
563 else
564 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100565 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100566 removeLastUpdateDownload();
567 }
568 }
569 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100570 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100571
Jose Pascoal810950b2014-10-09 17:16:08 +0100572 // ************************************************************************************
573 // DOWNLOAD UPDATE
574 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100575
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000576 void setupDownloadState()
Jose Pascoal810950b2014-10-09 17:16:08 +0100577 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000578 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000579
Jose Pascoal810950b2014-10-09 17:16:08 +0100580 // setup the download state views
Jose Pascoal1c049e02014-12-17 13:03:09 +0000581 if (item == null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100582 {
583 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100584
Jose Pascoal810950b2014-10-09 17:16:08 +0100585 // we don't have the lastest.xml so get back to initial state
586 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100587
Jose Pascoal46fdb062015-02-05 18:59:32 +0000588 final boolean notDeleted = !updateDir.delete();
589 if(notDeleted) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000590 Log.d(TAG, "Unable to delete " + updateDir.getAbsolutePath());
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000591 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100592
Jose Pascoal4adf3192015-02-23 18:10:16 +0000593 abortUpdateProcess("");
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100594
Jose Pascoal810950b2014-10-09 17:16:08 +0100595 return;
596 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100597
Jose Pascoal810950b2014-10-09 17:16:08 +0100598 // if there is a download ID on the shared preferences
599 if (mLatestUpdateDownloadId == 0)
600 {
601 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100602
Jose Pascoal810950b2014-10-09 17:16:08 +0100603 // invalid download Id
604 if (mLatestUpdateDownloadId == 0)
605 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000606 abortUpdateProcess("");
Jose Pascoal810950b2014-10-09 17:16:08 +0100607 return;
608 }
609 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100610
Jose Pascoal810950b2014-10-09 17:16:08 +0100611 updateDownloadFile();
612 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100613
Jose Pascoal810950b2014-10-09 17:16:08 +0100614 private void startPreInstall()
615 {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000616 final Resources resources = getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000617 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
618
Jose Pascoal60c99372015-03-17 15:52:59 +0000619 String otaPackagePath = Utils.getOtaPackagePath(resources, item, mIsVersion, mIsZipInstall);
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000620
621 boolean fileNotExists = !Utils.fileExists(otaPackagePath);
622
623 if (fileNotExists)
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000624 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000625 abortUpdateProcess(resources.getString(R.string.file_not_found_message) + ": " + otaPackagePath);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000626 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000627 else if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100628 {
629 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100630 try
631 {
Jose Pascoal49f058a2015-02-13 16:58:01 +0000632 Utils.writeCacheCommand(mainActivity, otaPackagePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100633
Jose Pascoal49f058a2015-02-13 16:58:01 +0000634 new Thread(new Runnable() {
635 @SuppressLint("CommitPrefEdits")
636 @Override
637 public void run() {
638 Editor editor = mSharedPreferences.edit();
639 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
640 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100641
Jose Pascoal49f058a2015-02-13 16:58:01 +0000642 if (Utils.hasUnifiedPartition(resources))
643 {
644 removeLastUpdateDownload();
645 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100646
Tiago Costad7e951f2015-03-02 17:37:33 +0000647 // remove the gapps stuff
648// String model = Utils.getModelAndOS(getActivity());
649// if( model.contains("FP1") ) {
650 try {
651
652 Utils.clearGappsData();
653 } catch (RootDeniedException | InterruptedException | IOException e) {
654 e.printStackTrace();
655 }
656// }
657
Jose Pascoal49f058a2015-02-13 16:58:01 +0000658 // remove the update files from data
659 removeUpdateFilesFromData();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100660
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000661 mainActivity.updateStatePreference(UpdaterState.NORMAL);
662 mainActivity.clearSelectedItems();
663 clearConfigFile();
664 editor = mSharedPreferences.edit();
665 editor.remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS);
666 editor.remove(MainFragment.SHARED_PREFERENCES_ENABLE_GAPPS);
667 editor.commit();
Jose Pascoal49f058a2015-02-13 16:58:01 +0000668
669 // reboot the device into recovery
670 if(!Utils.rebootToRecovery(mainActivity)) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000671 String error = resources.getString(R.string.reboot_failed);
672 Log.w(TAG, error);
673 abortUpdateProcess(error);
Jose Pascoal49f058a2015-02-13 16:58:01 +0000674 }
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000675 }
Jose Pascoal49f058a2015-02-13 16:58:01 +0000676 }).start();
677 } catch (IOException | NotFoundException | TimeoutException | RootDeniedException e)
678 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000679 String error = resources.getString(R.string.command_write_to_cache_failed);
680 Log.e(TAG, error + ": " + e.getLocalizedMessage());
681 abortUpdateProcess(error);
Jose Pascoal49f058a2015-02-13 16:58:01 +0000682 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100683 }
684 else
685 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000686 Log.e(TAG, "Null item");
687 abortUpdateProcess("");
Jose Pascoal810950b2014-10-09 17:16:08 +0100688 }
689 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100690
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000691 private void clearConfigFile()
692 {
693 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
694 if (cfgFile != 0 && mDownloadManager != null)
695 {
696 mDownloadManager.remove(cfgFile);
697 }
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000698 mainActivity.clearConfigFileDownloadId();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000699 VersionParserHelper.removeConfigFiles(mainActivity);
700 }
701
Jose Pascoal810950b2014-10-09 17:16:08 +0100702 private void copyUpdateToCache(File file)
703 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000704 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100705 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000706 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal733b84e2014-10-17 14:49:02 +0100707 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000708 if (item != null)
709 {
Jose Pascoal40916302015-02-06 18:43:47 +0000710 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item, mIsVersion));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000711 }
712 else
713 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000714 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000715 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100716 }
717 else
718 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000719 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100720 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000721 Log.w(TAG, "No space on cache. Defaulting to Sdcard");
722 abortUpdateProcess(getResources().getString(R.string.no_space_available_cache_message));
Jose Pascoal810950b2014-10-09 17:16:08 +0100723 }
724 }
725 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100726
Jose Pascoal810950b2014-10-09 17:16:08 +0100727 // ************************************************************************************
728 // Update Removal
729 // ************************************************************************************
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000730 private void removeUpdateFilesFromData() {
731 if (PrivilegeChecker.isPrivilegedApp()) {
732 removeUpdateFilesFromDataPrivileged();
733 } else {
734 removeUpdateFilesFromDataUnprivileged();
735 }
736 }
737
738 private void removeUpdateFilesFromDataPrivileged() {
739 Resources resource = getResources();
740
741 try {
742 Process p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayStoreCommand));
743 p.waitFor();
744 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGooglePlusCommand));
745 p.waitFor();
746 p = Runtime.getRuntime().exec(resource.getString(R.string.removeSoundSearchCommand));
747 p.waitFor();
748 p = Runtime.getRuntime().exec(resource.getString(R.string.removeGmailCommand));
749 p.waitFor();
750 p = Runtime.getRuntime().exec(resource.getString(R.string.removePlayServicesCommand));
751 p.waitFor();
752 p = Runtime.getRuntime().exec(resource.getString(R.string.removeQuicksearchCommand));
753 p.waitFor();
754 p = Runtime.getRuntime().exec(resource.getString(R.string.removeTalkbackCommand));
755 p.waitFor();
756 p = Runtime.getRuntime().exec(resource.getString(R.string.removeText2SpeechCommand));
757 p.waitFor();
758 } catch (IOException | InterruptedException e) {
759 Log.d(TAG, "Failed to remove files from data:" +e);
760 }
761 }
762
763 private void removeUpdateFilesFromDataUnprivileged()
764 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100765 try
766 {
767 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
768 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
769 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
770 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
771 R.string.removeText2SpeechCommand)));
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000772 } catch (IOException | TimeoutException | RootDeniedException e)
Jose Pascoal810950b2014-10-09 17:16:08 +0100773 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000774 Log.d(TAG, "Failed to remove files from data:" +e.getLocalizedMessage());
Jose Pascoal810950b2014-10-09 17:16:08 +0100775 }
776 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100777
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000778 void removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100779 {
780 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000781 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100782 {
783 // residue download ID
784 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100785
Jose Pascoal810950b2014-10-09 17:16:08 +0100786 mainActivity.resetLastUpdateDownloadId();
787 }
788 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100789
Jose Pascoal810950b2014-10-09 17:16:08 +0100790 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
791 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100792
Jose Pascoal810950b2014-10-09 17:16:08 +0100793 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100794
Jose Pascoal810950b2014-10-09 17:16:08 +0100795 @Override
796 protected Integer doInBackground(String... params)
797 {
798 // check the correct number of
799 if (params.length != 2)
800 {
801 return -1;
802 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100803
Jose Pascoal810950b2014-10-09 17:16:08 +0100804 String originalFilePath = params[0];
805 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100806
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000807 Utils.clearCache();
808
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000809 File otaOriginalFile = new File(originalFilePath);
810 File otaDestinyFile = new File(destinyFilePath);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000811
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000812 if (otaOriginalFile.exists())
Jose Pascoal810950b2014-10-09 17:16:08 +0100813 {
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000814 try {
Jose Pascoal288dd2f2015-02-20 19:19:04 +0000815 Utils.copy(otaOriginalFile, otaDestinyFile);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000816 } catch (IOException e) {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000817 String error = mainActivity.getResources().getString(R.string.copy_to_cache_failed_message);
818 Log.e(TAG, error + ": " + originalFilePath + ". " + e.getLocalizedMessage());
819 abortUpdateProcess(error);
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000820 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100821 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100822 else
823 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000824 Resources resources = mainActivity.getResources();
825 String error = resources.getString(R.string.copy_to_cache_failed_message) + ". " + resources.getString(R.string.file_not_found_message) + ": " + originalFilePath;
826 Log.e(TAG, error);
827 abortUpdateProcess(error);
Jose Pascoal733b84e2014-10-17 14:49:02 +0100828 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100829
Jose Pascoal810950b2014-10-09 17:16:08 +0100830 return 1;
831 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100832
Jose Pascoal810950b2014-10-09 17:16:08 +0100833 protected void onProgressUpdate(Integer... progress)
834 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100835
Jose Pascoal810950b2014-10-09 17:16:08 +0100836 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100837
Jose Pascoal810950b2014-10-09 17:16:08 +0100838 protected void onPreExecute()
839 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100840
Jose Pascoal810950b2014-10-09 17:16:08 +0100841 if (mProgress == null)
842 {
843 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100844 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100845 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
846 }
847 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100848
Jose Pascoal810950b2014-10-09 17:16:08 +0100849 protected void onPostExecute(Integer result)
850 {
851 // disable the spinner
852 if (mProgress != null)
853 {
854 mProgress.dismiss();
855 mProgress = null;
856 }
857 }
858 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100859
Jose Pascoal1c049e02014-12-17 13:03:09 +0000860 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100861 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000862 String path;
863 if(mIsZipInstall)
864 {
865 path = mainActivity.getZipFilePath();
866 }
867 else
868 {
869 Resources resources = mainActivity.getResources();
870 path = Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item, mIsVersion);
871 }
872 return path;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000873 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100874
Jose Pascoal4adf3192015-02-23 18:10:16 +0000875 public void abortUpdateProcess(final String reason)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100876 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000877 if(!TextUtils.isEmpty(reason)) {
878 mainActivity.runOnUiThread(new Runnable() {
879 @Override
880 public void run() {
881 Toast.makeText(mainActivity, reason, Toast.LENGTH_LONG).show();
882 }
883 });
884 }
885
Tiago Costa73eda412014-11-18 14:37:42 +0000886 removeLastUpdateDownload();
887
Jose Pascoal87758742015-01-28 20:00:22 +0000888 mainActivity.clearSelectedItems();
889 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoalb397dc62014-10-13 19:26:58 +0100890 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100891}