blob: 6357be97c2d14d34272d97d04fe2fc18323322e4 [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
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000181 System.out.println(" +++++++++++++++++++++++++++++++ running startDownloadProgressUpdateThread +++++++++++++++++++++++++++++++ ");
Jose Pascoal810950b2014-10-09 17:16:08 +0100182 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100183
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000184 long latestUpdateDownloadId = 0;
185
186 int count = 3;
187
188 while (((latestUpdateDownloadId = mainActivity.getLatestDownloadId()) <= 0) && count > 0){
189 try
190 {
191 Thread.sleep(2000);
192 System.out.println(" +++++++++++++++++++++++++++++++ count: " + count + " +++++++++++++++++++++++++++++++ ");
193 count--;
194 } catch (InterruptedException e)
195 {
196 e.printStackTrace();
197 }
198 }
199 System.out.println(" +++++++++++++++++++++++++++++++ " + latestUpdateDownloadId + " +++++++++++++++++++++++++++++++ ");
200
Jose Pascoalaa579a82014-11-05 22:17:16 +0000201 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100202 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100203
Jose Pascoal810950b2014-10-09 17:16:08 +0100204 DownloadManager.Query q = new DownloadManager.Query();
205 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100206
Jose Pascoalaa579a82014-11-05 22:17:16 +0000207 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000208
209 if(cursor == null){
210 System.out.println(" +++++++++++++++++++++++++++++++ cursor is null +++++++++++++++++++++++++++++++ ");
211 }
Jose Pascoalda015b12014-11-06 12:47:11 +0000212 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100213 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100214 try
215 {
216 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
217 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100218
Jose Pascoal810950b2014-10-09 17:16:08 +0100219 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
220 {
221 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100222 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100223 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100224 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000225 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100226 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000227 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
228 {
229 case DownloadManager.STATUS_SUCCESSFUL:
230 case DownloadManager.STATUS_FAILED:
231 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100232
Jose Pascoalaa579a82014-11-05 22:17:16 +0000233 bytes_downloaded = 0;
234 bytes_total = 0;
235 break;
236 }
237
238 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
239 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100240 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100241 } catch (Exception e)
242 {
243 downloading = false;
244 Log.e(TAG, "Error updating download progress: " + e.getMessage());
245 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100246
Jose Pascoal810950b2014-10-09 17:16:08 +0100247 cursor.close();
248 try
249 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000250 Thread.sleep(1000);
Jose Pascoal810950b2014-10-09 17:16:08 +0100251 } catch (InterruptedException e)
252 {
253 e.printStackTrace();
254 }
255 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000256 else
257 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000258 if (cursor != null)
259 {
260 downloading = false;
261 cursor.close();
262 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000263 if (mDownloadManager == null)
264 {
265 downloading = false;
266 }
267 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100268 }
269 }
270 }).start();
271 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100272
Jose Pascoal810950b2014-10-09 17:16:08 +0100273 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
274 {
275 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
276 if (mSelectedVersion != null)
277 {
278 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
279 {
280 view = inflater.inflate(R.layout.fragment_download_android, container, false);
281 }
282 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
283 {
284 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
285 }
286 }
287 return view;
288 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100289
Jose Pascoal810950b2014-10-09 17:16:08 +0100290 private void setupLayout(View view)
291 {
292 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100293
Jose Pascoal810950b2014-10-09 17:16:08 +0100294 // download in progress group
295 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
296 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100297
Jose Pascoal810950b2014-10-09 17:16:08 +0100298 // restart group
299 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
300 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100301
Jose Pascoal810950b2014-10-09 17:16:08 +0100302 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
303 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100304
Jose Pascoal810950b2014-10-09 17:16:08 +0100305 @Override
306 public void onResume()
307 {
308 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100309
Jose Pascoal810950b2014-10-09 17:16:08 +0100310 setupInstallationReceivers();
311 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100312
Tiago Costa73eda412014-11-18 14:37:42 +0000313 registerNetworkStatusBoradcastReceiver();
314
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100315 updateHeader();
316 mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100317 toggleDownloadProgressAndRestart();
318 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100319
Tiago Costa73eda412014-11-18 14:37:42 +0000320 private void registerNetworkStatusBoradcastReceiver()
321 {
322 // Setup monitoring for future connectivity status changes
323 if (mNetworkStateReceiver != null)
324 {
325 mNetworkStateReceiver = new BroadcastReceiver()
326 {
327 @Override
328 public void onReceive(Context context, Intent intent)
329 {
330 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
331 {
332 abortUpdateProccess();
333 }
334 }
335 };
336 }
337
338 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
339 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
340 }
341
342 private void unregisterNetworkStatusBoradcastReceiver()
343 {
344 if (mNetworkStateReceiver != null)
345 {
346 mainActivity.unregisterReceiver(mNetworkStateReceiver);
347
348 mNetworkStateReceiver = null;
349 }
350 }
351
Jose Pascoal810950b2014-10-09 17:16:08 +0100352 @Override
353 public void onPause()
354 {
355 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100356
Jose Pascoal810950b2014-10-09 17:16:08 +0100357 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000358
359 unregisterNetworkStatusBoradcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100360 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100361
Jose Pascoal810950b2014-10-09 17:16:08 +0100362 private void setupInstallationReceivers()
363 {
364 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100365
Jose Pascoal810950b2014-10-09 17:16:08 +0100366 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
367 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100368
Jose Pascoal810950b2014-10-09 17:16:08 +0100369 private void registerDownloadBroadCastReceiver()
370 {
371 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
372 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100373
Jose Pascoal810950b2014-10-09 17:16:08 +0100374 private void unregisterBroadCastReceiver()
375 {
376 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
377 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100378
Jose Pascoal810950b2014-10-09 17:16:08 +0100379 private class DownloadBroadCastReceiver extends BroadcastReceiver
380 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100381
Jose Pascoal810950b2014-10-09 17:16:08 +0100382 @Override
383 public void onReceive(Context context, Intent intent)
384 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100385
Jose Pascoal810950b2014-10-09 17:16:08 +0100386 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100387
Jose Pascoal810950b2014-10-09 17:16:08 +0100388 updateDownloadFile();
389 }
390 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100391
Jose Pascoal810950b2014-10-09 17:16:08 +0100392 private void updateDownloadFile()
393 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100394
Jose Pascoal810950b2014-10-09 17:16:08 +0100395 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100396
Jose Pascoal810950b2014-10-09 17:16:08 +0100397 if (downloadId != 0)
398 {
399 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100400
Jose Pascoal810950b2014-10-09 17:16:08 +0100401 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100402
Jose Pascoalaa579a82014-11-05 22:17:16 +0000403 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100404
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000405 System.out.println(" ---------------------- cursor : " + cursor + " ----------------------------------");
406
Jose Pascoalaa579a82014-11-05 22:17:16 +0000407 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100408 {
409 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
410 int status = cursor.getInt(columnIndex);
411
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000412 System.out.println("status from cursor: " + status);
413
Jose Pascoal810950b2014-10-09 17:16:08 +0100414 switch (status)
415 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000416
Jose Pascoal810950b2014-10-09 17:16:08 +0100417 case DownloadManager.STATUS_SUCCESSFUL:
418 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
419 toggleDownloadProgressAndRestart();
420 break;
421 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000422 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100423 startDownloadProgressUpdateThread();
424 break;
425 case DownloadManager.STATUS_FAILED:
426 Resources resources = getResources();
427 if (mSelectedVersion != null)
428 {
429 String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
Pedro Arelo773bd822014-10-10 11:57:34 +0100430 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100431 }
432 else
433 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100434 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100435 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100436 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100437 break;
438 }
439 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100440 else
441 {
442 abortUpdateProccess();
443 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100444
Jose Pascoalaa579a82014-11-05 22:17:16 +0000445 if (cursor != null)
446 {
447 cursor.close();
448 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100449 }
450 }
451
452 // ************************************************************************************
453 // PRE INSTALL
454 // ************************************************************************************
455
456 private void setupPreInstallState()
457 {
458
459 Resources resources = mainActivity.getResources();
460 // the latest version data must exist
461 if (mSelectedVersion != null)
462 {
463
464 // check the md5 of the file
465 File file = new File(getVersionDownloadPath(mSelectedVersion));
466
467 if (file.exists())
468 {
469 if (Utils.checkMD5(mSelectedVersion.getMd5Sum(), file))
470 {
471 copyUpdateToCache(file);
472 return;
473 }
474 else
475 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100476 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100477 removeLastUpdateDownload();
478 }
479 }
480 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100481
Jose Pascoal810950b2014-10-09 17:16:08 +0100482 // remove the updater directory
483 File fileDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
484 fileDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100485
Jose Pascoal810950b2014-10-09 17:16:08 +0100486 // else if the perfect case does not happen, reset the download
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100487 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100488 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100489
Jose Pascoal810950b2014-10-09 17:16:08 +0100490 // ************************************************************************************
491 // DOWNLOAD UPDATE
492 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100493
Jose Pascoal810950b2014-10-09 17:16:08 +0100494 public void setupDownloadState()
495 {
496 // setup the download state views
497 if (mSelectedVersion == null)
498 {
499 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100500
Jose Pascoal810950b2014-10-09 17:16:08 +0100501 // we don't have the lastest.xml so get back to initial state
502 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100503
Jose Pascoal810950b2014-10-09 17:16:08 +0100504 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100505
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100506 abortUpdateProccess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100507
Jose Pascoal810950b2014-10-09 17:16:08 +0100508 return;
509 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100510
Jose Pascoal810950b2014-10-09 17:16:08 +0100511 // if there is a download ID on the shared preferences
512 if (mLatestUpdateDownloadId == 0)
513 {
514 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100515
Jose Pascoal810950b2014-10-09 17:16:08 +0100516 // invalid download Id
517 if (mLatestUpdateDownloadId == 0)
518 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100519 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100520 return;
521 }
522 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100523
Jose Pascoal810950b2014-10-09 17:16:08 +0100524 updateDownloadFile();
525 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100526
Jose Pascoal810950b2014-10-09 17:16:08 +0100527 private void startPreInstall()
528 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100529
Jose Pascoal810950b2014-10-09 17:16:08 +0100530 if (RootTools.isAccessGiven())
531 {
532 // set the command for the recovery
533 Resources resources = getResources();
534 // Process p;
535 try
536 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100537
Jose Pascoal810950b2014-10-09 17:16:08 +0100538 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100539
Jose Pascoal810950b2014-10-09 17:16:08 +0100540 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100541
Jose Pascoal810950b2014-10-09 17:16:08 +0100542 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100543
Jose Pascoal0a5be012014-11-17 16:55:40 +0000544 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100545 {
546 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
547 + VersionParserHelper.getNameFromVersion(mSelectedVersion) + "' >> /cache/recovery/command"));
548 }
549 else
550 {
551 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
552 + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(mSelectedVersion)
553 + "' >> /cache/recovery/command"));
554 }
555 } catch (IOException e)
556 {
557 // TODO Auto-generated catch block
558 e.printStackTrace();
559 } catch (NotFoundException e)
560 {
561 // TODO Auto-generated catch block
562 e.printStackTrace();
563 } catch (TimeoutException e)
564 {
565 // TODO Auto-generated catch block
566 e.printStackTrace();
567 } catch (RootDeniedException e)
568 {
569 // TODO Auto-generated catch block
570 e.printStackTrace();
571 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100572
Jose Pascoal810950b2014-10-09 17:16:08 +0100573 // send broadcast intent
574 Intent broadcastIntent = new Intent();
575 broadcastIntent.setAction(GappsInstallerHelper.GAPPS_REINSTALATION);
576 mainActivity.sendBroadcast(broadcastIntent);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100577
Jose Pascoal0a5be012014-11-17 16:55:40 +0000578 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100579 {
580 removeLastUpdateDownload();
581 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100582
Jose Pascoal810950b2014-10-09 17:16:08 +0100583 // remove the update files from data
584 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100585
Jose Pascoal810950b2014-10-09 17:16:08 +0100586 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100587 try
588 {
589 mainActivity.updateStatePreference(UpdaterState.NORMAL);
590 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
591 } catch (IOException e)
592 {
593 // TODO Auto-generated catch block
594 e.printStackTrace();
595 } catch (TimeoutException e)
596 {
597 // TODO Auto-generated catch block
598 e.printStackTrace();
599 } catch (RootDeniedException e)
600 {
601 // TODO Auto-generated catch block
602 e.printStackTrace();
603 }
604 }
605 else
606 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100607 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100608 }
609 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100610
Jose Pascoal810950b2014-10-09 17:16:08 +0100611 private void copyUpdateToCache(File file)
612 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000613 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100614 {
Jose Pascoal733b84e2014-10-17 14:49:02 +0100615 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
616 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getNameFromVersion(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100617 }
618 else
619 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000620 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100621 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000622 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
623 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100624
Jose Pascoal0a5be012014-11-17 16:55:40 +0000625 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100626 }
627 }
628 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100629
Jose Pascoal810950b2014-10-09 17:16:08 +0100630 // ************************************************************************************
631 // Update Removal
632 // ************************************************************************************
633 private void removeUpdateFilesFromData()
634 {
635 try
636 {
637 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
638 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
639 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
640 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
641 R.string.removeText2SpeechCommand)));
642 } catch (IOException e)
643 {
644 e.printStackTrace();
645 } catch (TimeoutException e)
646 {
647 e.printStackTrace();
648 } catch (RootDeniedException e)
649 {
650 e.printStackTrace();
651 }
652 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100653
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000654 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100655 {
656 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000657 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100658 {
659 // residue download ID
660 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100661
Jose Pascoal810950b2014-10-09 17:16:08 +0100662 mainActivity.resetLastUpdateDownloadId();
663 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000664 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100665 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100666
Jose Pascoal810950b2014-10-09 17:16:08 +0100667 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
668 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100669
Jose Pascoal810950b2014-10-09 17:16:08 +0100670 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100671
Jose Pascoal810950b2014-10-09 17:16:08 +0100672 @Override
673 protected Integer doInBackground(String... params)
674 {
675 // check the correct number of
676 if (params.length != 2)
677 {
678 return -1;
679 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100680
Jose Pascoal810950b2014-10-09 17:16:08 +0100681 String originalFilePath = params[0];
682 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100683
Jose Pascoal810950b2014-10-09 17:16:08 +0100684 if (RootTools.isAccessGiven())
685 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000686 Utils.clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100687
Jose Pascoal810950b2014-10-09 17:16:08 +0100688 File otaFilePath = new File(originalFilePath);
689 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100690
Jose Pascoal810950b2014-10-09 17:16:08 +0100691 if (!otaFileCache.exists())
692 {
693 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
694 }
695 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100696 else
697 {
698 abortUpdateProccess();
699 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100700
Jose Pascoal810950b2014-10-09 17:16:08 +0100701 return 1;
702 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100703
Jose Pascoal810950b2014-10-09 17:16:08 +0100704 protected void onProgressUpdate(Integer... progress)
705 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100706
Jose Pascoal810950b2014-10-09 17:16:08 +0100707 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100708
Jose Pascoal810950b2014-10-09 17:16:08 +0100709 protected void onPreExecute()
710 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100711
Jose Pascoal810950b2014-10-09 17:16:08 +0100712 if (mProgress == null)
713 {
714 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100715 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100716 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
717 }
718 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100719
Jose Pascoal810950b2014-10-09 17:16:08 +0100720 protected void onPostExecute(Integer result)
721 {
722 // disable the spinner
723 if (mProgress != null)
724 {
725 mProgress.dismiss();
726 mProgress = null;
727 }
728 }
729 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100730
Jose Pascoal810950b2014-10-09 17:16:08 +0100731 private String getVersionDownloadPath(Version version)
732 {
733 Resources resources = mainActivity.getResources();
734 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(version);
735 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100736
737 public void abortUpdateProccess()
738 {
Tiago Costa73eda412014-11-18 14:37:42 +0000739 removeLastUpdateDownload();
740
741 mainActivity.runOnUiThread(new Runnable()
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000742 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000743
Tiago Costa73eda412014-11-18 14:37:42 +0000744 @Override
745 public void run()
Jose Pascoalaa579a82014-11-05 22:17:16 +0000746 {
Tiago Costa73eda412014-11-18 14:37:42 +0000747 mainActivity.removeLastFragment(false);
748 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
749 {
750 mainActivity.changeState(UpdaterState.NORMAL);
751 }
752 else
753 {
754 mainActivity.updateStatePreference(UpdaterState.NORMAL);
755 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000756 }
Tiago Costa73eda412014-11-18 14:37:42 +0000757 });
758
Jose Pascoalb397dc62014-10-13 19:26:58 +0100759 }
760
Jose Pascoalb690af12014-10-06 18:29:26 +0100761}