blob: 891271cd974200d16dd6190cc7203944c4a4ef0a [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);
Jose Pascoalaa579a82014-11-05 22:17:16 +000072
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000073 // Setup monitoring for future connectivity status changes
Jose Pascoalaa579a82014-11-05 22:17:16 +000074 BroadcastReceiver networkStateReceiver = new BroadcastReceiver()
75 {
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000076 @Override
Jose Pascoalaa579a82014-11-05 22:17:16 +000077 public void onReceive(Context context, Intent intent)
78 {
79 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
80 {
81 abortUpdateProccess();
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000082 }
83 }
84 };
Jose Pascoalaa579a82014-11-05 22:17:16 +000085 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000086 mainActivity.registerReceiver(networkStateReceiver, filter);
Jose Pascoalb690af12014-10-06 18:29:26 +010087
Jose Pascoal810950b2014-10-09 17:16:08 +010088 return view;
89 }
Jose Pascoalb690af12014-10-06 18:29:26 +010090
Jose Pascoal810950b2014-10-09 17:16:08 +010091 private void toggleDownloadProgressAndRestart()
92 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +010093 UpdaterState state = mainActivity.getCurrentUpdaterState();
94 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +010095 {
96 case DOWNLOAD:
97 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +010098
Jose Pascoal810950b2014-10-09 17:16:08 +010099 mVersionInstallGroup.setVisibility(View.GONE);
100 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
101 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100102
Jose Pascoal810950b2014-10-09 17:16:08 +0100103 case PREINSTALL:
104 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100105
Jose Pascoal810950b2014-10-09 17:16:08 +0100106 mVersionDownloadingGroup.setVisibility(View.GONE);
107 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100108
109 mRestartButton.setOnClickListener(new OnClickListener()
110 {
111
112 @Override
113 public void onClick(View v)
114 {
Jose Pascoal75392162014-10-15 18:29:01 +0100115 showEraseAllDataWarning();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100116 }
117 });
118
Jose Pascoal810950b2014-10-09 17:16:08 +0100119 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100120
Jose Pascoal810950b2014-10-09 17:16:08 +0100121 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100122 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100123 mainActivity.removeLastFragment(true);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100124 return;
125
Jose Pascoal810950b2014-10-09 17:16:08 +0100126 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100127
Jose Pascoal810950b2014-10-09 17:16:08 +0100128 mCancelButton.setOnClickListener(new OnClickListener()
129 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100130
Jose Pascoal810950b2014-10-09 17:16:08 +0100131 @Override
132 public void onClick(View v)
133 {
Jose Pascoalb397dc62014-10-13 19:26:58 +0100134 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100135 }
136 });
137 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100138
Jose Pascoal75392162014-10-15 18:29:01 +0100139 private void showEraseAllDataWarning()
140 {
141 if (mSelectedVersion.hasEraseAllPartitionWarning())
142 {
143 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
144 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
145 {
146
147 @Override
148 public void onClick(DialogInterface dialog, int which)
149 {
150 startPreInstall();
151 }
152 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
153 {
154 public void onClick(DialogInterface dialog, int which)
155 {
156 // do nothing
157 }
158 }).show();
159 }
160 else
161 {
162 startPreInstall();
163 }
164 }
165
Jose Pascoal810950b2014-10-09 17:16:08 +0100166 private void updateHeader()
167 {
168 if (mSelectedVersion != null)
169 {
170 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
171 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000172 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100173 }
174 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
175 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000176 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100177 }
178 }
179 else
180 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000181 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100182 }
183 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100184
Jose Pascoal810950b2014-10-09 17:16:08 +0100185 private void startDownloadProgressUpdateThread()
186 {
187 new Thread(new Runnable()
188 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100189
Jose Pascoal810950b2014-10-09 17:16:08 +0100190 @Override
191 public void run()
192 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100193
Jose Pascoal810950b2014-10-09 17:16:08 +0100194 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100195
Jose Pascoal810950b2014-10-09 17:16:08 +0100196 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000197 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100198 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100199
Jose Pascoal810950b2014-10-09 17:16:08 +0100200 DownloadManager.Query q = new DownloadManager.Query();
201 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100202
Jose Pascoalaa579a82014-11-05 22:17:16 +0000203 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoalda015b12014-11-06 12:47:11 +0000204 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100205 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100206 try
207 {
208 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
209 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100210
Jose Pascoal810950b2014-10-09 17:16:08 +0100211 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
212 {
213 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100214 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100215 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100216 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000217 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100218 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000219 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
220 {
221 case DownloadManager.STATUS_SUCCESSFUL:
222 case DownloadManager.STATUS_FAILED:
223 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100224
Jose Pascoalaa579a82014-11-05 22:17:16 +0000225 bytes_downloaded = 0;
226 bytes_total = 0;
227 break;
228 }
229
230 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
231 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100232 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100233 } catch (Exception e)
234 {
235 downloading = false;
236 Log.e(TAG, "Error updating download progress: " + e.getMessage());
237 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100238
Jose Pascoal810950b2014-10-09 17:16:08 +0100239 cursor.close();
240 try
241 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000242 Thread.sleep(1000);
Jose Pascoal810950b2014-10-09 17:16:08 +0100243 } catch (InterruptedException e)
244 {
245 e.printStackTrace();
246 }
247 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000248 else
249 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000250 if (cursor != null)
251 {
252 downloading = false;
253 cursor.close();
254 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000255 if (mDownloadManager == null)
256 {
257 downloading = false;
258 }
259 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100260 }
261 }
262 }).start();
263 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100264
Jose Pascoal810950b2014-10-09 17:16:08 +0100265 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
266 {
267 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
268 if (mSelectedVersion != null)
269 {
270 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
271 {
272 view = inflater.inflate(R.layout.fragment_download_android, container, false);
273 }
274 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
275 {
276 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
277 }
278 }
279 return view;
280 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100281
Jose Pascoal810950b2014-10-09 17:16:08 +0100282 private void setupLayout(View view)
283 {
284 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100285
Jose Pascoal810950b2014-10-09 17:16:08 +0100286 // download in progress group
287 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
288 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100289
Jose Pascoal810950b2014-10-09 17:16:08 +0100290 // restart group
291 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
292 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100293
Jose Pascoal810950b2014-10-09 17:16:08 +0100294 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
295 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100296
Jose Pascoal810950b2014-10-09 17:16:08 +0100297 @Override
298 public void onResume()
299 {
300 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100301
Jose Pascoal810950b2014-10-09 17:16:08 +0100302 setupInstallationReceivers();
303 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100304
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100305 updateHeader();
306 mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100307 toggleDownloadProgressAndRestart();
308 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100309
Jose Pascoal810950b2014-10-09 17:16:08 +0100310 @Override
311 public void onPause()
312 {
313 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100314
Jose Pascoal810950b2014-10-09 17:16:08 +0100315 unregisterBroadCastReceiver();
316 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100317
Jose Pascoal810950b2014-10-09 17:16:08 +0100318 private void setupInstallationReceivers()
319 {
320 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100321
Jose Pascoal810950b2014-10-09 17:16:08 +0100322 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
323 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100324
Jose Pascoal810950b2014-10-09 17:16:08 +0100325 private void registerDownloadBroadCastReceiver()
326 {
327 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
328 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100329
Jose Pascoal810950b2014-10-09 17:16:08 +0100330 private void unregisterBroadCastReceiver()
331 {
332 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
333 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100334
Jose Pascoal810950b2014-10-09 17:16:08 +0100335 private class DownloadBroadCastReceiver extends BroadcastReceiver
336 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100337
Jose Pascoal810950b2014-10-09 17:16:08 +0100338 @Override
339 public void onReceive(Context context, Intent intent)
340 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100341
Jose Pascoal810950b2014-10-09 17:16:08 +0100342 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100343
Jose Pascoal810950b2014-10-09 17:16:08 +0100344 updateDownloadFile();
345 }
346 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100347
Jose Pascoal810950b2014-10-09 17:16:08 +0100348 private void updateDownloadFile()
349 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100350
Jose Pascoal810950b2014-10-09 17:16:08 +0100351 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100352
Jose Pascoal810950b2014-10-09 17:16:08 +0100353 if (downloadId != 0)
354 {
355 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100356
Jose Pascoal810950b2014-10-09 17:16:08 +0100357 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100358
Jose Pascoalaa579a82014-11-05 22:17:16 +0000359 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100360
Jose Pascoalaa579a82014-11-05 22:17:16 +0000361 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100362 {
363 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
364 int status = cursor.getInt(columnIndex);
365
366 switch (status)
367 {
368 case DownloadManager.STATUS_SUCCESSFUL:
369 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
370 toggleDownloadProgressAndRestart();
371 break;
372 case DownloadManager.STATUS_RUNNING:
373 startDownloadProgressUpdateThread();
374 break;
375 case DownloadManager.STATUS_FAILED:
376 Resources resources = getResources();
377 if (mSelectedVersion != null)
378 {
379 String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
Pedro Arelo773bd822014-10-10 11:57:34 +0100380 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100381 }
382 else
383 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100384 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100385 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100386 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100387 break;
388 }
389 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100390 else
391 {
392 abortUpdateProccess();
393 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100394
Jose Pascoalaa579a82014-11-05 22:17:16 +0000395 if (cursor != null)
396 {
397 cursor.close();
398 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100399 }
400 }
401
402 // ************************************************************************************
403 // PRE INSTALL
404 // ************************************************************************************
405
406 private void setupPreInstallState()
407 {
408
409 Resources resources = mainActivity.getResources();
410 // the latest version data must exist
411 if (mSelectedVersion != null)
412 {
413
414 // check the md5 of the file
415 File file = new File(getVersionDownloadPath(mSelectedVersion));
416
417 if (file.exists())
418 {
419 if (Utils.checkMD5(mSelectedVersion.getMd5Sum(), file))
420 {
421 copyUpdateToCache(file);
422 return;
423 }
424 else
425 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100426 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100427 removeLastUpdateDownload();
428 }
429 }
430 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100431
Jose Pascoal810950b2014-10-09 17:16:08 +0100432 // remove the updater directory
433 File fileDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
434 fileDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100435
Jose Pascoal810950b2014-10-09 17:16:08 +0100436 // else if the perfect case does not happen, reset the download
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100437 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100438 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100439
Jose Pascoal810950b2014-10-09 17:16:08 +0100440 // ************************************************************************************
441 // DOWNLOAD UPDATE
442 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100443
Jose Pascoal810950b2014-10-09 17:16:08 +0100444 public void setupDownloadState()
445 {
446 // setup the download state views
447 if (mSelectedVersion == null)
448 {
449 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100450
Jose Pascoal810950b2014-10-09 17:16:08 +0100451 // we don't have the lastest.xml so get back to initial state
452 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100453
Jose Pascoal810950b2014-10-09 17:16:08 +0100454 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100455
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100456 abortUpdateProccess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100457
Jose Pascoal810950b2014-10-09 17:16:08 +0100458 return;
459 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100460
Jose Pascoal810950b2014-10-09 17:16:08 +0100461 // if there is a download ID on the shared preferences
462 if (mLatestUpdateDownloadId == 0)
463 {
464 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100465
Jose Pascoal810950b2014-10-09 17:16:08 +0100466 // invalid download Id
467 if (mLatestUpdateDownloadId == 0)
468 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100469 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100470 return;
471 }
472 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100473
Jose Pascoal810950b2014-10-09 17:16:08 +0100474 updateDownloadFile();
475 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100476
Jose Pascoal810950b2014-10-09 17:16:08 +0100477 private void startPreInstall()
478 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100479
Jose Pascoal810950b2014-10-09 17:16:08 +0100480 if (RootTools.isAccessGiven())
481 {
482 // set the command for the recovery
483 Resources resources = getResources();
484 // Process p;
485 try
486 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100487
Jose Pascoal810950b2014-10-09 17:16:08 +0100488 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100489
Jose Pascoal810950b2014-10-09 17:16:08 +0100490 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100491
Jose Pascoal810950b2014-10-09 17:16:08 +0100492 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100493
Jose Pascoal810950b2014-10-09 17:16:08 +0100494 if (canCopyToCache())
495 {
496 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
497 + VersionParserHelper.getNameFromVersion(mSelectedVersion) + "' >> /cache/recovery/command"));
498 }
499 else
500 {
501 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
502 + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(mSelectedVersion)
503 + "' >> /cache/recovery/command"));
504 }
505 } catch (IOException e)
506 {
507 // TODO Auto-generated catch block
508 e.printStackTrace();
509 } catch (NotFoundException e)
510 {
511 // TODO Auto-generated catch block
512 e.printStackTrace();
513 } catch (TimeoutException e)
514 {
515 // TODO Auto-generated catch block
516 e.printStackTrace();
517 } catch (RootDeniedException e)
518 {
519 // TODO Auto-generated catch block
520 e.printStackTrace();
521 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100522
Jose Pascoal810950b2014-10-09 17:16:08 +0100523 // send broadcast intent
524 Intent broadcastIntent = new Intent();
525 broadcastIntent.setAction(GappsInstallerHelper.GAPPS_REINSTALATION);
526 mainActivity.sendBroadcast(broadcastIntent);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100527
Jose Pascoal810950b2014-10-09 17:16:08 +0100528 if (canCopyToCache())
529 {
530 removeLastUpdateDownload();
531 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100532
Jose Pascoal810950b2014-10-09 17:16:08 +0100533 // remove the update files from data
534 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100535
Jose Pascoal810950b2014-10-09 17:16:08 +0100536 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100537 try
538 {
539 mainActivity.updateStatePreference(UpdaterState.NORMAL);
540 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
541 } catch (IOException e)
542 {
543 // TODO Auto-generated catch block
544 e.printStackTrace();
545 } catch (TimeoutException e)
546 {
547 // TODO Auto-generated catch block
548 e.printStackTrace();
549 } catch (RootDeniedException e)
550 {
551 // TODO Auto-generated catch block
552 e.printStackTrace();
553 }
554 }
555 else
556 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100557 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100558 }
559 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100560
Jose Pascoal810950b2014-10-09 17:16:08 +0100561 private void copyUpdateToCache(File file)
562 {
563 if (canCopyToCache())
564 {
Jose Pascoal733b84e2014-10-17 14:49:02 +0100565 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
566 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getNameFromVersion(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100567 }
568 else
569 {
570 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
Pedro Arelo773bd822014-10-10 11:57:34 +0100571 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100572 }
573 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100574
Jose Pascoal810950b2014-10-09 17:16:08 +0100575 public boolean canCopyToCache()
576 {
577 Resources resources = getResources();
578 double cacheSize = Utils.getPartitionSizeInMBytes(Environment.getDownloadCacheDirectory());
579 return cacheSize > resources.getInteger(R.integer.FP1CachePartitionSizeMb) && cacheSize > resources.getInteger(R.integer.minimalCachePartitionSizeMb);
580 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100581
Jose Pascoal810950b2014-10-09 17:16:08 +0100582 private void clearCache()
583 {
584 File f = Environment.getDownloadCacheDirectory();
585 File files[] = f.listFiles();
586 if (files != null)
587 {
588 Log.d(TAG, "Size: " + files.length);
589 for (int i = 0; i < files.length; i++)
590 {
591 String filename = files[i].getName();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100592
Jose Pascoal810950b2014-10-09 17:16:08 +0100593 if (filename.endsWith(".zip"))
594 {
595 files[i].delete();
596 Log.d(TAG, "Deleted file " + filename);
597 }
598 }
599 }
600 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100601
Jose Pascoal810950b2014-10-09 17:16:08 +0100602 // ************************************************************************************
603 // Update Removal
604 // ************************************************************************************
605 private void removeUpdateFilesFromData()
606 {
607 try
608 {
609 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
610 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
611 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
612 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
613 R.string.removeText2SpeechCommand)));
614 } catch (IOException e)
615 {
616 e.printStackTrace();
617 } catch (TimeoutException e)
618 {
619 e.printStackTrace();
620 } catch (RootDeniedException e)
621 {
622 e.printStackTrace();
623 }
624 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100625
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000626 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100627 {
628 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000629 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100630 {
631 // residue download ID
632 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100633
Jose Pascoal810950b2014-10-09 17:16:08 +0100634 mainActivity.resetLastUpdateDownloadId();
635 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000636 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100637 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100638
Jose Pascoal810950b2014-10-09 17:16:08 +0100639 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
640 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100641
Jose Pascoal810950b2014-10-09 17:16:08 +0100642 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100643
Jose Pascoal810950b2014-10-09 17:16:08 +0100644 @Override
645 protected Integer doInBackground(String... params)
646 {
647 // check the correct number of
648 if (params.length != 2)
649 {
650 return -1;
651 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100652
Jose Pascoal810950b2014-10-09 17:16:08 +0100653 String originalFilePath = params[0];
654 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100655
Jose Pascoal810950b2014-10-09 17:16:08 +0100656 if (RootTools.isAccessGiven())
657 {
658 clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100659
Jose Pascoal810950b2014-10-09 17:16:08 +0100660 File otaFilePath = new File(originalFilePath);
661 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100662
Jose Pascoal810950b2014-10-09 17:16:08 +0100663 if (!otaFileCache.exists())
664 {
665 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
666 }
667 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100668 else
669 {
670 abortUpdateProccess();
671 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100672
Jose Pascoal810950b2014-10-09 17:16:08 +0100673 return 1;
674 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100675
Jose Pascoal810950b2014-10-09 17:16:08 +0100676 protected void onProgressUpdate(Integer... progress)
677 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100678
Jose Pascoal810950b2014-10-09 17:16:08 +0100679 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100680
Jose Pascoal810950b2014-10-09 17:16:08 +0100681 protected void onPreExecute()
682 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100683
Jose Pascoal810950b2014-10-09 17:16:08 +0100684 if (mProgress == null)
685 {
686 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100687 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100688 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
689 }
690 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100691
Jose Pascoal810950b2014-10-09 17:16:08 +0100692 protected void onPostExecute(Integer result)
693 {
694 // disable the spinner
695 if (mProgress != null)
696 {
697 mProgress.dismiss();
698 mProgress = null;
699 }
700 }
701 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100702
Jose Pascoal810950b2014-10-09 17:16:08 +0100703 private String getVersionDownloadPath(Version version)
704 {
705 Resources resources = mainActivity.getResources();
706 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(version);
707 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100708
709 public void abortUpdateProccess()
710 {
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000711 if (removeLastUpdateDownload())
712 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000713
Filipe Gonçalves702d6942014-11-05 16:37:07 +0000714 mainActivity.removeLastFragment(false);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000715 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
716 {
717 mainActivity.changeState(UpdaterState.NORMAL);
718 }
719 else
720 {
721 mainActivity.updateStatePreference(UpdaterState.NORMAL);
722 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100723 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100724 }
725
Jose Pascoalb690af12014-10-06 18:29:26 +0100726}