blob: 68dfc2685e2dd03af278e4cf653ef2acf9f3bb91 [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
Tiago Costa73eda412014-11-18 14:37:42 +000062 private BroadcastReceiver mNetworkStateReceiver;
63
Jose Pascoal810950b2014-10-09 17:16:08 +010064 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010065
Jose Pascoal810950b2014-10-09 17:16:08 +010066 @Override
67 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
68 {
69 // Inflate the layout for this fragment
70 mSelectedVersion = mainActivity.getSelectedVersion();
71 View view = inflateViewByImageType(inflater, container);
Jose Pascoalb690af12014-10-06 18:29:26 +010072
Jose Pascoal810950b2014-10-09 17:16:08 +010073 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +000074
Jose Pascoal810950b2014-10-09 17:16:08 +010075 return view;
76 }
Jose Pascoalb690af12014-10-06 18:29:26 +010077
Jose Pascoal810950b2014-10-09 17:16:08 +010078 private void toggleDownloadProgressAndRestart()
79 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +010080 UpdaterState state = mainActivity.getCurrentUpdaterState();
81 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +010082 {
83 case DOWNLOAD:
84 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +010085
Jose Pascoal810950b2014-10-09 17:16:08 +010086 mVersionInstallGroup.setVisibility(View.GONE);
87 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
88 break;
Jose Pascoalb690af12014-10-06 18:29:26 +010089
Jose Pascoal810950b2014-10-09 17:16:08 +010090 case PREINSTALL:
91 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +010092
Jose Pascoal810950b2014-10-09 17:16:08 +010093 mVersionDownloadingGroup.setVisibility(View.GONE);
94 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +010095
96 mRestartButton.setOnClickListener(new OnClickListener()
97 {
98
99 @Override
100 public void onClick(View v)
101 {
Jose Pascoal75392162014-10-15 18:29:01 +0100102 showEraseAllDataWarning();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100103 }
104 });
105
Jose Pascoal810950b2014-10-09 17:16:08 +0100106 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100107
Jose Pascoal810950b2014-10-09 17:16:08 +0100108 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100109 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100110 mainActivity.removeLastFragment(true);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100111 return;
112
Jose Pascoal810950b2014-10-09 17:16:08 +0100113 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100114
Jose Pascoal810950b2014-10-09 17:16:08 +0100115 mCancelButton.setOnClickListener(new OnClickListener()
116 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100117
Jose Pascoal810950b2014-10-09 17:16:08 +0100118 @Override
119 public void onClick(View v)
120 {
Jose Pascoalb397dc62014-10-13 19:26:58 +0100121 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100122 }
123 });
124 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100125
Jose Pascoal75392162014-10-15 18:29:01 +0100126 private void showEraseAllDataWarning()
127 {
Tiago Costa73eda412014-11-18 14:37:42 +0000128 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100129 {
130 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
131 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
132 {
133
134 @Override
135 public void onClick(DialogInterface dialog, int which)
136 {
137 startPreInstall();
138 }
139 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
140 {
141 public void onClick(DialogInterface dialog, int which)
142 {
143 // do nothing
144 }
145 }).show();
146 }
147 else
148 {
149 startPreInstall();
150 }
151 }
152
Jose Pascoal810950b2014-10-09 17:16:08 +0100153 private void updateHeader()
154 {
155 if (mSelectedVersion != null)
156 {
157 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
158 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000159 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100160 }
161 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
162 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000163 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100164 }
165 }
166 else
167 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000168 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100169 }
170 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100171
Jose Pascoal810950b2014-10-09 17:16:08 +0100172 private void startDownloadProgressUpdateThread()
173 {
174 new Thread(new Runnable()
175 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100176
Jose Pascoal810950b2014-10-09 17:16:08 +0100177 @Override
178 public void run()
179 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100180
Jose Pascoal810950b2014-10-09 17:16:08 +0100181 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100182
Jose Pascoal810950b2014-10-09 17:16:08 +0100183 long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000184 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100185 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100186
Jose Pascoal810950b2014-10-09 17:16:08 +0100187 DownloadManager.Query q = new DownloadManager.Query();
188 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100189
Jose Pascoalaa579a82014-11-05 22:17:16 +0000190 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoalda015b12014-11-06 12:47:11 +0000191 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100192 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100193 try
194 {
195 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
196 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100197
Jose Pascoal810950b2014-10-09 17:16:08 +0100198 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
199 {
200 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100201 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100202 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100203 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000204 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100205 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000206 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
207 {
208 case DownloadManager.STATUS_SUCCESSFUL:
209 case DownloadManager.STATUS_FAILED:
210 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100211
Jose Pascoalaa579a82014-11-05 22:17:16 +0000212 bytes_downloaded = 0;
213 bytes_total = 0;
214 break;
215 }
216
217 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
218 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100219 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100220 } catch (Exception e)
221 {
222 downloading = false;
223 Log.e(TAG, "Error updating download progress: " + e.getMessage());
224 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100225
Jose Pascoal810950b2014-10-09 17:16:08 +0100226 cursor.close();
227 try
228 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000229 Thread.sleep(1000);
Jose Pascoal810950b2014-10-09 17:16:08 +0100230 } catch (InterruptedException e)
231 {
232 e.printStackTrace();
233 }
234 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000235 else
236 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000237 if (cursor != null)
238 {
239 downloading = false;
240 cursor.close();
241 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000242 if (mDownloadManager == null)
243 {
244 downloading = false;
245 }
246 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100247 }
248 }
249 }).start();
250 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100251
Jose Pascoal810950b2014-10-09 17:16:08 +0100252 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
253 {
254 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
255 if (mSelectedVersion != null)
256 {
257 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
258 {
259 view = inflater.inflate(R.layout.fragment_download_android, container, false);
260 }
261 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
262 {
263 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
264 }
265 }
266 return view;
267 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100268
Jose Pascoal810950b2014-10-09 17:16:08 +0100269 private void setupLayout(View view)
270 {
271 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100272
Jose Pascoal810950b2014-10-09 17:16:08 +0100273 // download in progress group
274 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
275 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100276
Jose Pascoal810950b2014-10-09 17:16:08 +0100277 // restart group
278 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
279 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100280
Jose Pascoal810950b2014-10-09 17:16:08 +0100281 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
282 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100283
Jose Pascoal810950b2014-10-09 17:16:08 +0100284 @Override
285 public void onResume()
286 {
287 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100288
Jose Pascoal810950b2014-10-09 17:16:08 +0100289 setupInstallationReceivers();
290 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100291
Tiago Costa73eda412014-11-18 14:37:42 +0000292 registerNetworkStatusBoradcastReceiver();
293
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100294 updateHeader();
295 mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100296 toggleDownloadProgressAndRestart();
297 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100298
Tiago Costa73eda412014-11-18 14:37:42 +0000299 private void registerNetworkStatusBoradcastReceiver()
300 {
301 // Setup monitoring for future connectivity status changes
302 if (mNetworkStateReceiver != null)
303 {
304 mNetworkStateReceiver = new BroadcastReceiver()
305 {
306 @Override
307 public void onReceive(Context context, Intent intent)
308 {
309 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
310 {
311 abortUpdateProccess();
312 }
313 }
314 };
315 }
316
317 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
318 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
319 }
320
321 private void unregisterNetworkStatusBoradcastReceiver()
322 {
323 if (mNetworkStateReceiver != null)
324 {
325 mainActivity.unregisterReceiver(mNetworkStateReceiver);
326
327 mNetworkStateReceiver = null;
328 }
329 }
330
Jose Pascoal810950b2014-10-09 17:16:08 +0100331 @Override
332 public void onPause()
333 {
334 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100335
Jose Pascoal810950b2014-10-09 17:16:08 +0100336 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000337
338 unregisterNetworkStatusBoradcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100339 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100340
Jose Pascoal810950b2014-10-09 17:16:08 +0100341 private void setupInstallationReceivers()
342 {
343 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100344
Jose Pascoal810950b2014-10-09 17:16:08 +0100345 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
346 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100347
Jose Pascoal810950b2014-10-09 17:16:08 +0100348 private void registerDownloadBroadCastReceiver()
349 {
350 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
351 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100352
Jose Pascoal810950b2014-10-09 17:16:08 +0100353 private void unregisterBroadCastReceiver()
354 {
355 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
356 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100357
Jose Pascoal810950b2014-10-09 17:16:08 +0100358 private class DownloadBroadCastReceiver extends BroadcastReceiver
359 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100360
Jose Pascoal810950b2014-10-09 17:16:08 +0100361 @Override
362 public void onReceive(Context context, Intent intent)
363 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100364
Jose Pascoal810950b2014-10-09 17:16:08 +0100365 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100366
Jose Pascoal810950b2014-10-09 17:16:08 +0100367 updateDownloadFile();
368 }
369 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100370
Jose Pascoal810950b2014-10-09 17:16:08 +0100371 private void updateDownloadFile()
372 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100373
Jose Pascoal810950b2014-10-09 17:16:08 +0100374 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100375
Jose Pascoal810950b2014-10-09 17:16:08 +0100376 if (downloadId != 0)
377 {
378 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100379
Jose Pascoal810950b2014-10-09 17:16:08 +0100380 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100381
Jose Pascoalaa579a82014-11-05 22:17:16 +0000382 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100383
Jose Pascoalaa579a82014-11-05 22:17:16 +0000384 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100385 {
386 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
387 int status = cursor.getInt(columnIndex);
388
389 switch (status)
390 {
391 case DownloadManager.STATUS_SUCCESSFUL:
392 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
393 toggleDownloadProgressAndRestart();
394 break;
395 case DownloadManager.STATUS_RUNNING:
396 startDownloadProgressUpdateThread();
397 break;
398 case DownloadManager.STATUS_FAILED:
399 Resources resources = getResources();
400 if (mSelectedVersion != null)
401 {
402 String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
Pedro Arelo773bd822014-10-10 11:57:34 +0100403 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100404 }
405 else
406 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100407 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100408 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100409 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100410 break;
411 }
412 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100413 else
414 {
415 abortUpdateProccess();
416 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100417
Jose Pascoalaa579a82014-11-05 22:17:16 +0000418 if (cursor != null)
419 {
420 cursor.close();
421 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100422 }
423 }
424
425 // ************************************************************************************
426 // PRE INSTALL
427 // ************************************************************************************
428
429 private void setupPreInstallState()
430 {
431
432 Resources resources = mainActivity.getResources();
433 // the latest version data must exist
434 if (mSelectedVersion != null)
435 {
436
437 // check the md5 of the file
438 File file = new File(getVersionDownloadPath(mSelectedVersion));
439
440 if (file.exists())
441 {
442 if (Utils.checkMD5(mSelectedVersion.getMd5Sum(), file))
443 {
444 copyUpdateToCache(file);
445 return;
446 }
447 else
448 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100449 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100450 removeLastUpdateDownload();
451 }
452 }
453 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100454
Jose Pascoal810950b2014-10-09 17:16:08 +0100455 // remove the updater directory
456 File fileDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
457 fileDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100458
Jose Pascoal810950b2014-10-09 17:16:08 +0100459 // else if the perfect case does not happen, reset the download
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100460 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100461 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100462
Jose Pascoal810950b2014-10-09 17:16:08 +0100463 // ************************************************************************************
464 // DOWNLOAD UPDATE
465 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100466
Jose Pascoal810950b2014-10-09 17:16:08 +0100467 public void setupDownloadState()
468 {
469 // setup the download state views
470 if (mSelectedVersion == null)
471 {
472 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100473
Jose Pascoal810950b2014-10-09 17:16:08 +0100474 // we don't have the lastest.xml so get back to initial state
475 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100476
Jose Pascoal810950b2014-10-09 17:16:08 +0100477 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100478
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100479 abortUpdateProccess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100480
Jose Pascoal810950b2014-10-09 17:16:08 +0100481 return;
482 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100483
Jose Pascoal810950b2014-10-09 17:16:08 +0100484 // if there is a download ID on the shared preferences
485 if (mLatestUpdateDownloadId == 0)
486 {
487 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100488
Jose Pascoal810950b2014-10-09 17:16:08 +0100489 // invalid download Id
490 if (mLatestUpdateDownloadId == 0)
491 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100492 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100493 return;
494 }
495 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100496
Jose Pascoal810950b2014-10-09 17:16:08 +0100497 updateDownloadFile();
498 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100499
Jose Pascoal810950b2014-10-09 17:16:08 +0100500 private void startPreInstall()
501 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100502
Jose Pascoal810950b2014-10-09 17:16:08 +0100503 if (RootTools.isAccessGiven())
504 {
505 // set the command for the recovery
506 Resources resources = getResources();
507 // Process p;
508 try
509 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100510
Jose Pascoal810950b2014-10-09 17:16:08 +0100511 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100512
Jose Pascoal810950b2014-10-09 17:16:08 +0100513 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100514
Jose Pascoal810950b2014-10-09 17:16:08 +0100515 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100516
Jose Pascoal0a5be012014-11-17 16:55:40 +0000517 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100518 {
519 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
520 + VersionParserHelper.getNameFromVersion(mSelectedVersion) + "' >> /cache/recovery/command"));
521 }
522 else
523 {
524 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
525 + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(mSelectedVersion)
526 + "' >> /cache/recovery/command"));
527 }
528 } catch (IOException e)
529 {
530 // TODO Auto-generated catch block
531 e.printStackTrace();
532 } catch (NotFoundException e)
533 {
534 // TODO Auto-generated catch block
535 e.printStackTrace();
536 } catch (TimeoutException e)
537 {
538 // TODO Auto-generated catch block
539 e.printStackTrace();
540 } catch (RootDeniedException e)
541 {
542 // TODO Auto-generated catch block
543 e.printStackTrace();
544 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100545
Jose Pascoal810950b2014-10-09 17:16:08 +0100546 // send broadcast intent
547 Intent broadcastIntent = new Intent();
548 broadcastIntent.setAction(GappsInstallerHelper.GAPPS_REINSTALATION);
549 mainActivity.sendBroadcast(broadcastIntent);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100550
Jose Pascoal0a5be012014-11-17 16:55:40 +0000551 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100552 {
553 removeLastUpdateDownload();
554 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100555
Jose Pascoal810950b2014-10-09 17:16:08 +0100556 // remove the update files from data
557 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100558
Jose Pascoal810950b2014-10-09 17:16:08 +0100559 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100560 try
561 {
562 mainActivity.updateStatePreference(UpdaterState.NORMAL);
563 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
564 } catch (IOException e)
565 {
566 // TODO Auto-generated catch block
567 e.printStackTrace();
568 } catch (TimeoutException e)
569 {
570 // TODO Auto-generated catch block
571 e.printStackTrace();
572 } catch (RootDeniedException e)
573 {
574 // TODO Auto-generated catch block
575 e.printStackTrace();
576 }
577 }
578 else
579 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100580 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100581 }
582 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100583
Jose Pascoal810950b2014-10-09 17:16:08 +0100584 private void copyUpdateToCache(File file)
585 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000586 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100587 {
Jose Pascoal733b84e2014-10-17 14:49:02 +0100588 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
589 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getNameFromVersion(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100590 }
591 else
592 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000593 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100594 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000595 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
596 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100597
Jose Pascoal0a5be012014-11-17 16:55:40 +0000598 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100599 }
600 }
601 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100602
Jose Pascoal810950b2014-10-09 17:16:08 +0100603 // ************************************************************************************
604 // Update Removal
605 // ************************************************************************************
606 private void removeUpdateFilesFromData()
607 {
608 try
609 {
610 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
611 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
612 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
613 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
614 R.string.removeText2SpeechCommand)));
615 } catch (IOException e)
616 {
617 e.printStackTrace();
618 } catch (TimeoutException e)
619 {
620 e.printStackTrace();
621 } catch (RootDeniedException e)
622 {
623 e.printStackTrace();
624 }
625 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100626
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000627 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100628 {
629 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000630 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100631 {
632 // residue download ID
633 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100634
Jose Pascoal810950b2014-10-09 17:16:08 +0100635 mainActivity.resetLastUpdateDownloadId();
636 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000637 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100638 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100639
Jose Pascoal810950b2014-10-09 17:16:08 +0100640 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
641 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100642
Jose Pascoal810950b2014-10-09 17:16:08 +0100643 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100644
Jose Pascoal810950b2014-10-09 17:16:08 +0100645 @Override
646 protected Integer doInBackground(String... params)
647 {
648 // check the correct number of
649 if (params.length != 2)
650 {
651 return -1;
652 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100653
Jose Pascoal810950b2014-10-09 17:16:08 +0100654 String originalFilePath = params[0];
655 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100656
Jose Pascoal810950b2014-10-09 17:16:08 +0100657 if (RootTools.isAccessGiven())
658 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000659 Utils.clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100660
Jose Pascoal810950b2014-10-09 17:16:08 +0100661 File otaFilePath = new File(originalFilePath);
662 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100663
Jose Pascoal810950b2014-10-09 17:16:08 +0100664 if (!otaFileCache.exists())
665 {
666 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
667 }
668 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100669 else
670 {
671 abortUpdateProccess();
672 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100673
Jose Pascoal810950b2014-10-09 17:16:08 +0100674 return 1;
675 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100676
Jose Pascoal810950b2014-10-09 17:16:08 +0100677 protected void onProgressUpdate(Integer... progress)
678 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100679
Jose Pascoal810950b2014-10-09 17:16:08 +0100680 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100681
Jose Pascoal810950b2014-10-09 17:16:08 +0100682 protected void onPreExecute()
683 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100684
Jose Pascoal810950b2014-10-09 17:16:08 +0100685 if (mProgress == null)
686 {
687 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100688 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100689 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
690 }
691 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100692
Jose Pascoal810950b2014-10-09 17:16:08 +0100693 protected void onPostExecute(Integer result)
694 {
695 // disable the spinner
696 if (mProgress != null)
697 {
698 mProgress.dismiss();
699 mProgress = null;
700 }
701 }
702 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100703
Jose Pascoal810950b2014-10-09 17:16:08 +0100704 private String getVersionDownloadPath(Version version)
705 {
706 Resources resources = mainActivity.getResources();
707 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(version);
708 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100709
710 public void abortUpdateProccess()
711 {
Tiago Costa73eda412014-11-18 14:37:42 +0000712 removeLastUpdateDownload();
713
714 mainActivity.runOnUiThread(new Runnable()
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000715 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000716
Tiago Costa73eda412014-11-18 14:37:42 +0000717 @Override
718 public void run()
Jose Pascoalaa579a82014-11-05 22:17:16 +0000719 {
Tiago Costa73eda412014-11-18 14:37:42 +0000720 mainActivity.removeLastFragment(false);
721 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
722 {
723 mainActivity.changeState(UpdaterState.NORMAL);
724 }
725 else
726 {
727 mainActivity.updateStatePreference(UpdaterState.NORMAL);
728 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000729 }
Tiago Costa73eda412014-11-18 14:37:42 +0000730 });
731
Jose Pascoalb397dc62014-10-13 19:26:58 +0100732 }
733
Jose Pascoalb690af12014-10-06 18:29:26 +0100734}