blob: 9331f595707b41d8f3e1f051dfef61d5fa19a691 [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
Jose Pascoal75392162014-10-15 18:29:01 +01007import android.app.AlertDialog;
Jose Pascoalb690af12014-10-06 18:29:26 +01008import android.app.DownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +01009import android.app.ProgressDialog;
10import android.content.BroadcastReceiver;
11import android.content.Context;
Jose Pascoal75392162014-10-15 18:29:01 +010012import android.content.DialogInterface;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010013import android.content.Intent;
14import android.content.IntentFilter;
15import android.content.res.Resources;
16import android.content.res.Resources.NotFoundException;
Jose Pascoalb690af12014-10-06 18:29:26 +010017import android.database.Cursor;
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000018import android.net.ConnectivityManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010019import android.os.AsyncTask;
Jose Pascoalb690af12014-10-06 18:29:26 +010020import android.os.Bundle;
21import android.os.Environment;
22import android.util.Log;
23import android.view.LayoutInflater;
24import android.view.View;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010025import android.view.View.OnClickListener;
Jose Pascoalb690af12014-10-06 18:29:26 +010026import android.view.ViewGroup;
27import android.widget.Button;
28import android.widget.LinearLayout;
29import android.widget.ProgressBar;
30import android.widget.TextView;
31import android.widget.Toast;
32
Jose Pascoal7bf83a02014-10-13 18:30:18 +010033import com.fairphone.updater.FairphoneUpdater.HeaderType;
34import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010035import com.fairphone.updater.R;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010036import com.fairphone.updater.data.Version;
37import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010038import com.fairphone.updater.gappsinstaller.GappsInstallerHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010039import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010040import com.stericson.RootTools.RootTools;
41import com.stericson.RootTools.exceptions.RootDeniedException;
42import com.stericson.RootTools.execution.CommandCapture;
43import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010044
Jose Pascoal810950b2014-10-09 17:16:08 +010045public class DownloadAndRestartFragment extends BaseFragment
46{
Jose Pascoalb690af12014-10-06 18:29:26 +010047
Jose Pascoal810950b2014-10-09 17:16:08 +010048 protected static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoalb690af12014-10-06 18:29:26 +010049
Jose Pascoal810950b2014-10-09 17:16:08 +010050 private TextView mDownloadVersionName;
51 private LinearLayout mVersionDownloadingGroup;
52 private ProgressBar mVersionDownloadProgressBar;
53 private LinearLayout mVersionInstallGroup;
54 private Button mRestartButton;
55 private Button mCancelButton;
56 private Version mSelectedVersion;
Jose Pascoalb690af12014-10-06 18:29:26 +010057
Jose Pascoal810950b2014-10-09 17:16:08 +010058 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010059
Jose Pascoal810950b2014-10-09 17:16:08 +010060 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010061
Jose Pascoal810950b2014-10-09 17:16:08 +010062 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010063
Jose Pascoal810950b2014-10-09 17:16:08 +010064 @Override
65 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
66 {
67 // Inflate the layout for this fragment
68 mSelectedVersion = mainActivity.getSelectedVersion();
69 View view = inflateViewByImageType(inflater, container);
Jose Pascoalb690af12014-10-06 18:29:26 +010070
Jose Pascoal810950b2014-10-09 17:16:08 +010071 setupLayout(view);
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000072
73 // Setup monitoring for future connectivity status changes
74 BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {
75 @Override
76 public void onReceive(Context context, Intent intent) {
77 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) {
78 abortUpdateProccess();
79 }
80 }
81 };
82 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
83 mainActivity.registerReceiver(networkStateReceiver, filter);
Jose Pascoalb690af12014-10-06 18:29:26 +010084
Jose Pascoal810950b2014-10-09 17:16:08 +010085 return view;
86 }
Jose Pascoalb690af12014-10-06 18:29:26 +010087
Jose Pascoal810950b2014-10-09 17:16:08 +010088 private void toggleDownloadProgressAndRestart()
89 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +010090 UpdaterState state = mainActivity.getCurrentUpdaterState();
91 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +010092 {
93 case DOWNLOAD:
94 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +010095
Jose Pascoal810950b2014-10-09 17:16:08 +010096 mVersionInstallGroup.setVisibility(View.GONE);
97 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
98 break;
Jose Pascoalb690af12014-10-06 18:29:26 +010099
Jose Pascoal810950b2014-10-09 17:16:08 +0100100 case PREINSTALL:
101 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100102
Jose Pascoal810950b2014-10-09 17:16:08 +0100103 mVersionDownloadingGroup.setVisibility(View.GONE);
104 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100105
106 mRestartButton.setOnClickListener(new OnClickListener()
107 {
108
109 @Override
110 public void onClick(View v)
111 {
Jose Pascoal75392162014-10-15 18:29:01 +0100112 showEraseAllDataWarning();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100113 }
114 });
115
Jose Pascoal810950b2014-10-09 17:16:08 +0100116 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100117
Jose Pascoal810950b2014-10-09 17:16:08 +0100118 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100119 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100120 mainActivity.removeLastFragment(true);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100121 return;
122
Jose Pascoal810950b2014-10-09 17:16:08 +0100123 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100124
Jose Pascoal810950b2014-10-09 17:16:08 +0100125 mCancelButton.setOnClickListener(new OnClickListener()
126 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100127
Jose Pascoal810950b2014-10-09 17:16:08 +0100128 @Override
129 public void onClick(View v)
130 {
Jose Pascoalb397dc62014-10-13 19:26:58 +0100131 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100132 }
133 });
134 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100135
Jose Pascoal75392162014-10-15 18:29:01 +0100136 private void showEraseAllDataWarning()
137 {
138 if (mSelectedVersion.hasEraseAllPartitionWarning())
139 {
140 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
141 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
142 {
143
144 @Override
145 public void onClick(DialogInterface dialog, int which)
146 {
147 startPreInstall();
148 }
149 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
150 {
151 public void onClick(DialogInterface dialog, int which)
152 {
153 // do nothing
154 }
155 }).show();
156 }
157 else
158 {
159 startPreInstall();
160 }
161 }
162
Jose Pascoal810950b2014-10-09 17:16:08 +0100163 private void updateHeader()
164 {
165 if (mSelectedVersion != null)
166 {
167 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
168 {
169 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "");
170 }
171 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
172 {
173 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "");
174 }
175 }
176 else
177 {
178 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "");
179 }
180 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100181
Jose Pascoal810950b2014-10-09 17:16:08 +0100182 private void startDownloadProgressUpdateThread()
183 {
184 new Thread(new Runnable()
185 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100186
Jose Pascoal810950b2014-10-09 17:16:08 +0100187 @Override
188 public void run()
189 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100190
Jose Pascoal810950b2014-10-09 17:16:08 +0100191 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100192
Jose Pascoal810950b2014-10-09 17:16:08 +0100193 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
194 while (latestUpdateDownloadId != 0 && downloading)
195 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100196
Jose Pascoal810950b2014-10-09 17:16:08 +0100197 DownloadManager.Query q = new DownloadManager.Query();
198 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100199
Jose Pascoal810950b2014-10-09 17:16:08 +0100200 Cursor cursor = mDownloadManager.query(q);
201 if (cursor != null)
202 {
203 cursor.moveToFirst();
204 try
205 {
206 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
207 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100208
Jose Pascoal810950b2014-10-09 17:16:08 +0100209 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
210 {
211 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100212 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100213 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100214 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100215
Jose Pascoal810950b2014-10-09 17:16:08 +0100216 if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL)
217 {
218 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100219
Jose Pascoal810950b2014-10-09 17:16:08 +0100220 bytes_downloaded = 0;
221 bytes_total = 0;
222 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100223
Jose Pascoal810950b2014-10-09 17:16:08 +0100224 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
225 mVersionDownloadProgressBar.setMax(bytes_total);
226 } catch (Exception e)
227 {
228 downloading = false;
229 Log.e(TAG, "Error updating download progress: " + e.getMessage());
230 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100231
Jose Pascoal810950b2014-10-09 17:16:08 +0100232 cursor.close();
233 try
234 {
235 // TODO WHYYYYYY???????
236 Thread.sleep(3000);
237 } catch (InterruptedException e)
238 {
239 e.printStackTrace();
240 }
241 }
242 }
243 }
244 }).start();
245 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100246
Jose Pascoal810950b2014-10-09 17:16:08 +0100247 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
248 {
249 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
250 if (mSelectedVersion != null)
251 {
252 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
253 {
254 view = inflater.inflate(R.layout.fragment_download_android, container, false);
255 }
256 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
257 {
258 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
259 }
260 }
261 return view;
262 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100263
Jose Pascoal810950b2014-10-09 17:16:08 +0100264 private void setupLayout(View view)
265 {
266 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100267
Jose Pascoal810950b2014-10-09 17:16:08 +0100268 // download in progress group
269 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
270 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100271
Jose Pascoal810950b2014-10-09 17:16:08 +0100272 // restart group
273 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
274 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100275
Jose Pascoal810950b2014-10-09 17:16:08 +0100276 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
277 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100278
Jose Pascoal810950b2014-10-09 17:16:08 +0100279 @Override
280 public void onResume()
281 {
282 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100283
Jose Pascoal810950b2014-10-09 17:16:08 +0100284 setupInstallationReceivers();
285 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100286
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100287 updateHeader();
288 mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100289 toggleDownloadProgressAndRestart();
290 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100291
Jose Pascoal810950b2014-10-09 17:16:08 +0100292 @Override
293 public void onPause()
294 {
295 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100296
Jose Pascoal810950b2014-10-09 17:16:08 +0100297 unregisterBroadCastReceiver();
298 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100299
Jose Pascoal810950b2014-10-09 17:16:08 +0100300 private void setupInstallationReceivers()
301 {
302 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100303
Jose Pascoal810950b2014-10-09 17:16:08 +0100304 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
305 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100306
Jose Pascoal810950b2014-10-09 17:16:08 +0100307 private void registerDownloadBroadCastReceiver()
308 {
309 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
310 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100311
Jose Pascoal810950b2014-10-09 17:16:08 +0100312 private void unregisterBroadCastReceiver()
313 {
314 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
315 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100316
Jose Pascoal810950b2014-10-09 17:16:08 +0100317 private class DownloadBroadCastReceiver extends BroadcastReceiver
318 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100319
Jose Pascoal810950b2014-10-09 17:16:08 +0100320 @Override
321 public void onReceive(Context context, Intent intent)
322 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100323
Jose Pascoal810950b2014-10-09 17:16:08 +0100324 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100325
Jose Pascoal810950b2014-10-09 17:16:08 +0100326 updateDownloadFile();
327 }
328 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100329
Jose Pascoal810950b2014-10-09 17:16:08 +0100330 private void updateDownloadFile()
331 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100332
Jose Pascoal810950b2014-10-09 17:16:08 +0100333 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100334
Jose Pascoal810950b2014-10-09 17:16:08 +0100335 if (downloadId != 0)
336 {
337 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100338
Jose Pascoal810950b2014-10-09 17:16:08 +0100339 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100340
Jose Pascoal810950b2014-10-09 17:16:08 +0100341 Cursor cursor = mDownloadManager.query(query);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100342
Jose Pascoal810950b2014-10-09 17:16:08 +0100343 if (cursor.moveToFirst())
344 {
345 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
346 int status = cursor.getInt(columnIndex);
347
348 switch (status)
349 {
350 case DownloadManager.STATUS_SUCCESSFUL:
351 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
352 toggleDownloadProgressAndRestart();
353 break;
354 case DownloadManager.STATUS_RUNNING:
355 startDownloadProgressUpdateThread();
356 break;
357 case DownloadManager.STATUS_FAILED:
358 Resources resources = getResources();
359 if (mSelectedVersion != null)
360 {
361 String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
Pedro Arelo773bd822014-10-10 11:57:34 +0100362 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100363 }
364 else
365 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100366 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100367 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100368 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100369 break;
370 }
371 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100372 else
373 {
374 abortUpdateProccess();
375 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100376
377 cursor.close();
378 }
379 }
380
381 // ************************************************************************************
382 // PRE INSTALL
383 // ************************************************************************************
384
385 private void setupPreInstallState()
386 {
387
388 Resources resources = mainActivity.getResources();
389 // the latest version data must exist
390 if (mSelectedVersion != null)
391 {
392
393 // check the md5 of the file
394 File file = new File(getVersionDownloadPath(mSelectedVersion));
395
396 if (file.exists())
397 {
398 if (Utils.checkMD5(mSelectedVersion.getMd5Sum(), file))
399 {
400 copyUpdateToCache(file);
401 return;
402 }
403 else
404 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100405 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100406 removeLastUpdateDownload();
407 }
408 }
409 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100410
Jose Pascoal810950b2014-10-09 17:16:08 +0100411 // remove the updater directory
412 File fileDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
413 fileDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100414
Jose Pascoal810950b2014-10-09 17:16:08 +0100415 // else if the perfect case does not happen, reset the download
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100416 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100417 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100418
Jose Pascoal810950b2014-10-09 17:16:08 +0100419 // ************************************************************************************
420 // DOWNLOAD UPDATE
421 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100422
Jose Pascoal810950b2014-10-09 17:16:08 +0100423 public void setupDownloadState()
424 {
425 // setup the download state views
426 if (mSelectedVersion == null)
427 {
428 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100429
Jose Pascoal810950b2014-10-09 17:16:08 +0100430 // we don't have the lastest.xml so get back to initial state
431 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100432
Jose Pascoal810950b2014-10-09 17:16:08 +0100433 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100434
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100435 abortUpdateProccess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100436
Jose Pascoal810950b2014-10-09 17:16:08 +0100437 return;
438 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100439
Jose Pascoal810950b2014-10-09 17:16:08 +0100440 // if there is a download ID on the shared preferences
441 if (mLatestUpdateDownloadId == 0)
442 {
443 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100444
Jose Pascoal810950b2014-10-09 17:16:08 +0100445 // invalid download Id
446 if (mLatestUpdateDownloadId == 0)
447 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100448 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100449 return;
450 }
451 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100452
Jose Pascoal810950b2014-10-09 17:16:08 +0100453 updateDownloadFile();
454 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100455
Jose Pascoal810950b2014-10-09 17:16:08 +0100456 private void startPreInstall()
457 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100458
Jose Pascoal810950b2014-10-09 17:16:08 +0100459 if (RootTools.isAccessGiven())
460 {
461 // set the command for the recovery
462 Resources resources = getResources();
463 // Process p;
464 try
465 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100466
Jose Pascoal810950b2014-10-09 17:16:08 +0100467 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100468
Jose Pascoal810950b2014-10-09 17:16:08 +0100469 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100470
Jose Pascoal810950b2014-10-09 17:16:08 +0100471 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100472
Jose Pascoal810950b2014-10-09 17:16:08 +0100473 if (canCopyToCache())
474 {
475 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
476 + VersionParserHelper.getNameFromVersion(mSelectedVersion) + "' >> /cache/recovery/command"));
477 }
478 else
479 {
480 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
481 + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(mSelectedVersion)
482 + "' >> /cache/recovery/command"));
483 }
484 } catch (IOException e)
485 {
486 // TODO Auto-generated catch block
487 e.printStackTrace();
488 } catch (NotFoundException e)
489 {
490 // TODO Auto-generated catch block
491 e.printStackTrace();
492 } catch (TimeoutException e)
493 {
494 // TODO Auto-generated catch block
495 e.printStackTrace();
496 } catch (RootDeniedException e)
497 {
498 // TODO Auto-generated catch block
499 e.printStackTrace();
500 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100501
Jose Pascoal810950b2014-10-09 17:16:08 +0100502 // send broadcast intent
503 Intent broadcastIntent = new Intent();
504 broadcastIntent.setAction(GappsInstallerHelper.GAPPS_REINSTALATION);
505 mainActivity.sendBroadcast(broadcastIntent);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100506
Jose Pascoal810950b2014-10-09 17:16:08 +0100507 if (canCopyToCache())
508 {
509 removeLastUpdateDownload();
510 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100511
Jose Pascoal810950b2014-10-09 17:16:08 +0100512 // remove the update files from data
513 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100514
Jose Pascoal810950b2014-10-09 17:16:08 +0100515 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100516 try
517 {
518 mainActivity.updateStatePreference(UpdaterState.NORMAL);
519 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
520 } catch (IOException e)
521 {
522 // TODO Auto-generated catch block
523 e.printStackTrace();
524 } catch (TimeoutException e)
525 {
526 // TODO Auto-generated catch block
527 e.printStackTrace();
528 } catch (RootDeniedException e)
529 {
530 // TODO Auto-generated catch block
531 e.printStackTrace();
532 }
533 }
534 else
535 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100536 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100537 }
538 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100539
Jose Pascoal810950b2014-10-09 17:16:08 +0100540 private void copyUpdateToCache(File file)
541 {
542 if (canCopyToCache())
543 {
Jose Pascoal733b84e2014-10-17 14:49:02 +0100544 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
545 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getNameFromVersion(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100546 }
547 else
548 {
549 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
Pedro Arelo773bd822014-10-10 11:57:34 +0100550 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100551 }
552 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100553
Jose Pascoal810950b2014-10-09 17:16:08 +0100554 public boolean canCopyToCache()
555 {
556 Resources resources = getResources();
557 double cacheSize = Utils.getPartitionSizeInMBytes(Environment.getDownloadCacheDirectory());
558 return cacheSize > resources.getInteger(R.integer.FP1CachePartitionSizeMb) && cacheSize > resources.getInteger(R.integer.minimalCachePartitionSizeMb);
559 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100560
Jose Pascoal810950b2014-10-09 17:16:08 +0100561 private void clearCache()
562 {
563 File f = Environment.getDownloadCacheDirectory();
564 File files[] = f.listFiles();
565 if (files != null)
566 {
567 Log.d(TAG, "Size: " + files.length);
568 for (int i = 0; i < files.length; i++)
569 {
570 String filename = files[i].getName();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100571
Jose Pascoal810950b2014-10-09 17:16:08 +0100572 if (filename.endsWith(".zip"))
573 {
574 files[i].delete();
575 Log.d(TAG, "Deleted file " + filename);
576 }
577 }
578 }
579 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100580
Jose Pascoal810950b2014-10-09 17:16:08 +0100581 // ************************************************************************************
582 // Update Removal
583 // ************************************************************************************
584 private void removeUpdateFilesFromData()
585 {
586 try
587 {
588 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
589 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
590 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
591 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
592 R.string.removeText2SpeechCommand)));
593 } catch (IOException e)
594 {
595 e.printStackTrace();
596 } catch (TimeoutException e)
597 {
598 e.printStackTrace();
599 } catch (RootDeniedException e)
600 {
601 e.printStackTrace();
602 }
603 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100604
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000605 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100606 {
607 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
608 if (latestUpdateDownloadId != 0)
609 {
610 // residue download ID
611 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100612
Jose Pascoal810950b2014-10-09 17:16:08 +0100613 mainActivity.resetLastUpdateDownloadId();
614 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000615 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100616 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100617
Jose Pascoal810950b2014-10-09 17:16:08 +0100618 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
619 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100620
Jose Pascoal810950b2014-10-09 17:16:08 +0100621 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100622
Jose Pascoal810950b2014-10-09 17:16:08 +0100623 @Override
624 protected Integer doInBackground(String... params)
625 {
626 // check the correct number of
627 if (params.length != 2)
628 {
629 return -1;
630 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100631
Jose Pascoal810950b2014-10-09 17:16:08 +0100632 String originalFilePath = params[0];
633 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100634
Jose Pascoal810950b2014-10-09 17:16:08 +0100635 if (RootTools.isAccessGiven())
636 {
637 clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100638
Jose Pascoal810950b2014-10-09 17:16:08 +0100639 File otaFilePath = new File(originalFilePath);
640 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100641
Jose Pascoal810950b2014-10-09 17:16:08 +0100642 if (!otaFileCache.exists())
643 {
644 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
645 }
646 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100647 else
648 {
649 abortUpdateProccess();
650 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100651
Jose Pascoal810950b2014-10-09 17:16:08 +0100652 return 1;
653 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100654
Jose Pascoal810950b2014-10-09 17:16:08 +0100655 protected void onProgressUpdate(Integer... progress)
656 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100657
Jose Pascoal810950b2014-10-09 17:16:08 +0100658 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100659
Jose Pascoal810950b2014-10-09 17:16:08 +0100660 protected void onPreExecute()
661 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100662
Jose Pascoal810950b2014-10-09 17:16:08 +0100663 if (mProgress == null)
664 {
665 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100666 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100667 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
668 }
669 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100670
Jose Pascoal810950b2014-10-09 17:16:08 +0100671 protected void onPostExecute(Integer result)
672 {
673 // disable the spinner
674 if (mProgress != null)
675 {
676 mProgress.dismiss();
677 mProgress = null;
678 }
679 }
680 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100681
Jose Pascoal810950b2014-10-09 17:16:08 +0100682 private String getVersionDownloadPath(Version version)
683 {
684 Resources resources = mainActivity.getResources();
685 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(version);
686 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100687
688 public void abortUpdateProccess()
689 {
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000690 if (removeLastUpdateDownload())
691 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100692
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000693 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
694 {
695 mainActivity.removeLastFragment(false);
696 mainActivity.changeState(UpdaterState.NORMAL);
697 }
698 else
699 {
700 mainActivity.removeLastFragment(false);
701 mainActivity.updateStatePreference(UpdaterState.NORMAL);
702 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100703 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100704 }
705
Jose Pascoalb690af12014-10-06 18:29:26 +0100706}