blob: e6c776ba3e3345bbb27f1636df5e7d23e946a335 [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;
Tiago Costa87925fe2014-12-02 17:57:51 +000015import android.content.SharedPreferences;
16import android.content.SharedPreferences.Editor;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010017import android.content.res.Resources;
18import android.content.res.Resources.NotFoundException;
Jose Pascoalb690af12014-10-06 18:29:26 +010019import android.database.Cursor;
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000020import android.net.ConnectivityManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010021import android.os.AsyncTask;
Jose Pascoalb690af12014-10-06 18:29:26 +010022import android.os.Bundle;
23import android.os.Environment;
24import android.util.Log;
25import android.view.LayoutInflater;
26import android.view.View;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010027import android.view.View.OnClickListener;
Jose Pascoalb690af12014-10-06 18:29:26 +010028import android.view.ViewGroup;
29import android.widget.Button;
30import android.widget.LinearLayout;
31import android.widget.ProgressBar;
32import android.widget.TextView;
33import android.widget.Toast;
34
Tiago Costa87925fe2014-12-02 17:57:51 +000035import com.fairphone.updater.FairphoneUpdater;
36import com.fairphone.updater.UpdaterService;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010037import com.fairphone.updater.FairphoneUpdater.HeaderType;
38import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010039import com.fairphone.updater.R;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010040import com.fairphone.updater.data.Version;
41import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010042import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010043import com.stericson.RootTools.RootTools;
44import com.stericson.RootTools.exceptions.RootDeniedException;
45import com.stericson.RootTools.execution.CommandCapture;
46import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010047
Jose Pascoal810950b2014-10-09 17:16:08 +010048public class DownloadAndRestartFragment extends BaseFragment
49{
Jose Pascoalb690af12014-10-06 18:29:26 +010050
Jose Pascoal810950b2014-10-09 17:16:08 +010051 protected static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoalb690af12014-10-06 18:29:26 +010052
Jose Pascoal810950b2014-10-09 17:16:08 +010053 private TextView mDownloadVersionName;
54 private LinearLayout mVersionDownloadingGroup;
55 private ProgressBar mVersionDownloadProgressBar;
56 private LinearLayout mVersionInstallGroup;
57 private Button mRestartButton;
58 private Button mCancelButton;
59 private Version mSelectedVersion;
Jose Pascoalb690af12014-10-06 18:29:26 +010060
Jose Pascoal810950b2014-10-09 17:16:08 +010061 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010062
Jose Pascoal810950b2014-10-09 17:16:08 +010063 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010064
Tiago Costa73eda412014-11-18 14:37:42 +000065 private BroadcastReceiver mNetworkStateReceiver;
66
Jose Pascoal810950b2014-10-09 17:16:08 +010067 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010068
Jose Pascoal810950b2014-10-09 17:16:08 +010069 @Override
70 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
71 {
72 // Inflate the layout for this fragment
73 mSelectedVersion = mainActivity.getSelectedVersion();
74 View view = inflateViewByImageType(inflater, container);
Jose Pascoalb690af12014-10-06 18:29:26 +010075
Jose Pascoal810950b2014-10-09 17:16:08 +010076 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +000077
Jose Pascoal810950b2014-10-09 17:16:08 +010078 return view;
79 }
Jose Pascoalb690af12014-10-06 18:29:26 +010080
Jose Pascoal810950b2014-10-09 17:16:08 +010081 private void toggleDownloadProgressAndRestart()
82 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +010083 UpdaterState state = mainActivity.getCurrentUpdaterState();
84 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +010085 {
86 case DOWNLOAD:
87 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +010088
Jose Pascoal810950b2014-10-09 17:16:08 +010089 mVersionInstallGroup.setVisibility(View.GONE);
90 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
91 break;
Jose Pascoalb690af12014-10-06 18:29:26 +010092
Jose Pascoal810950b2014-10-09 17:16:08 +010093 case PREINSTALL:
94 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +010095
Jose Pascoal810950b2014-10-09 17:16:08 +010096 mVersionDownloadingGroup.setVisibility(View.GONE);
97 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +010098
99 mRestartButton.setOnClickListener(new OnClickListener()
100 {
101
102 @Override
103 public void onClick(View v)
104 {
Jose Pascoal75392162014-10-15 18:29:01 +0100105 showEraseAllDataWarning();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100106 }
107 });
108
Jose Pascoal810950b2014-10-09 17:16:08 +0100109 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100110
Jose Pascoal810950b2014-10-09 17:16:08 +0100111 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100112 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100113 mainActivity.removeLastFragment(true);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100114 return;
115
Jose Pascoal810950b2014-10-09 17:16:08 +0100116 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100117
Jose Pascoal810950b2014-10-09 17:16:08 +0100118 mCancelButton.setOnClickListener(new OnClickListener()
119 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100120
Jose Pascoal810950b2014-10-09 17:16:08 +0100121 @Override
122 public void onClick(View v)
123 {
Jose Pascoalb397dc62014-10-13 19:26:58 +0100124 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100125 }
126 });
127 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100128
Jose Pascoal75392162014-10-15 18:29:01 +0100129 private void showEraseAllDataWarning()
130 {
Tiago Costa73eda412014-11-18 14:37:42 +0000131 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100132 {
133 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
134 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
135 {
136
137 @Override
138 public void onClick(DialogInterface dialog, int which)
139 {
140 startPreInstall();
141 }
142 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
143 {
144 public void onClick(DialogInterface dialog, int which)
145 {
146 // do nothing
147 }
148 }).show();
149 }
150 else
151 {
152 startPreInstall();
153 }
154 }
155
Jose Pascoal810950b2014-10-09 17:16:08 +0100156 private void updateHeader()
157 {
158 if (mSelectedVersion != null)
159 {
160 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
161 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000162 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100163 }
164 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
165 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000166 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100167 }
168 }
169 else
170 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000171 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100172 }
173 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100174
Jose Pascoal810950b2014-10-09 17:16:08 +0100175 private void startDownloadProgressUpdateThread()
176 {
177 new Thread(new Runnable()
178 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100179
Jose Pascoal810950b2014-10-09 17:16:08 +0100180 @Override
181 public void run()
182 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100183
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000184 System.out.println(" +++++++++++++++++++++++++++++++ running startDownloadProgressUpdateThread +++++++++++++++++++++++++++++++ ");
Jose Pascoal810950b2014-10-09 17:16:08 +0100185 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100186
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000187 long latestUpdateDownloadId = 0;
188
189 int count = 3;
190
191 while (((latestUpdateDownloadId = mainActivity.getLatestDownloadId()) <= 0) && count > 0){
192 try
193 {
194 Thread.sleep(2000);
195 System.out.println(" +++++++++++++++++++++++++++++++ count: " + count + " +++++++++++++++++++++++++++++++ ");
196 count--;
197 } catch (InterruptedException e)
198 {
199 e.printStackTrace();
200 }
201 }
202 System.out.println(" +++++++++++++++++++++++++++++++ " + latestUpdateDownloadId + " +++++++++++++++++++++++++++++++ ");
203
Jose Pascoalaa579a82014-11-05 22:17:16 +0000204 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100205 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100206
Jose Pascoal810950b2014-10-09 17:16:08 +0100207 DownloadManager.Query q = new DownloadManager.Query();
208 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100209
Jose Pascoalaa579a82014-11-05 22:17:16 +0000210 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000211
212 if(cursor == null){
213 System.out.println(" +++++++++++++++++++++++++++++++ cursor is null +++++++++++++++++++++++++++++++ ");
214 }
Jose Pascoalda015b12014-11-06 12:47:11 +0000215 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100216 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100217 try
218 {
219 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
220 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100221
Jose Pascoal810950b2014-10-09 17:16:08 +0100222 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
223 {
224 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100225 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100226 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100227 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000228 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100229 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000230 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
231 {
232 case DownloadManager.STATUS_SUCCESSFUL:
233 case DownloadManager.STATUS_FAILED:
234 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100235
Jose Pascoalaa579a82014-11-05 22:17:16 +0000236 bytes_downloaded = 0;
237 bytes_total = 0;
238 break;
239 }
240
241 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
242 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100243 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100244 } catch (Exception e)
245 {
246 downloading = false;
247 Log.e(TAG, "Error updating download progress: " + e.getMessage());
248 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100249
Jose Pascoal810950b2014-10-09 17:16:08 +0100250 cursor.close();
251 try
252 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000253 Thread.sleep(1000);
Jose Pascoal810950b2014-10-09 17:16:08 +0100254 } catch (InterruptedException e)
255 {
256 e.printStackTrace();
257 }
258 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000259 else
260 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000261 if (cursor != null)
262 {
263 downloading = false;
264 cursor.close();
265 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000266 if (mDownloadManager == null)
267 {
268 downloading = false;
269 }
270 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100271 }
272 }
273 }).start();
274 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100275
Jose Pascoal810950b2014-10-09 17:16:08 +0100276 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
277 {
278 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
279 if (mSelectedVersion != null)
280 {
281 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
282 {
283 view = inflater.inflate(R.layout.fragment_download_android, container, false);
284 }
285 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
286 {
287 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
288 }
289 }
290 return view;
291 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100292
Jose Pascoal810950b2014-10-09 17:16:08 +0100293 private void setupLayout(View view)
294 {
295 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100296
Jose Pascoal810950b2014-10-09 17:16:08 +0100297 // download in progress group
298 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
299 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100300
Jose Pascoal810950b2014-10-09 17:16:08 +0100301 // restart group
302 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
303 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100304
Jose Pascoal810950b2014-10-09 17:16:08 +0100305 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
306 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100307
Jose Pascoal810950b2014-10-09 17:16:08 +0100308 @Override
309 public void onResume()
310 {
311 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100312
Jose Pascoal810950b2014-10-09 17:16:08 +0100313 setupInstallationReceivers();
314 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100315
Tiago Costa73eda412014-11-18 14:37:42 +0000316 registerNetworkStatusBoradcastReceiver();
317
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100318 updateHeader();
319 mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100320 toggleDownloadProgressAndRestart();
321 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100322
Tiago Costa73eda412014-11-18 14:37:42 +0000323 private void registerNetworkStatusBoradcastReceiver()
324 {
325 // Setup monitoring for future connectivity status changes
326 if (mNetworkStateReceiver != null)
327 {
328 mNetworkStateReceiver = new BroadcastReceiver()
329 {
330 @Override
331 public void onReceive(Context context, Intent intent)
332 {
333 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
334 {
335 abortUpdateProccess();
336 }
337 }
338 };
339 }
340
341 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
342 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
343 }
344
345 private void unregisterNetworkStatusBoradcastReceiver()
346 {
347 if (mNetworkStateReceiver != null)
348 {
349 mainActivity.unregisterReceiver(mNetworkStateReceiver);
350
351 mNetworkStateReceiver = null;
352 }
353 }
354
Jose Pascoal810950b2014-10-09 17:16:08 +0100355 @Override
356 public void onPause()
357 {
358 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100359
Jose Pascoal810950b2014-10-09 17:16:08 +0100360 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000361
362 unregisterNetworkStatusBoradcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100363 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100364
Jose Pascoal810950b2014-10-09 17:16:08 +0100365 private void setupInstallationReceivers()
366 {
367 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100368
Jose Pascoal810950b2014-10-09 17:16:08 +0100369 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
370 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100371
Jose Pascoal810950b2014-10-09 17:16:08 +0100372 private void registerDownloadBroadCastReceiver()
373 {
374 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
375 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100376
Jose Pascoal810950b2014-10-09 17:16:08 +0100377 private void unregisterBroadCastReceiver()
378 {
379 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
380 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100381
Jose Pascoal810950b2014-10-09 17:16:08 +0100382 private class DownloadBroadCastReceiver extends BroadcastReceiver
383 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100384
Jose Pascoal810950b2014-10-09 17:16:08 +0100385 @Override
386 public void onReceive(Context context, Intent intent)
387 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100388
Jose Pascoal810950b2014-10-09 17:16:08 +0100389 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100390
Jose Pascoal810950b2014-10-09 17:16:08 +0100391 updateDownloadFile();
392 }
393 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100394
Jose Pascoal810950b2014-10-09 17:16:08 +0100395 private void updateDownloadFile()
396 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100397
Jose Pascoal810950b2014-10-09 17:16:08 +0100398 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100399
Jose Pascoal810950b2014-10-09 17:16:08 +0100400 if (downloadId != 0)
401 {
402 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100403
Jose Pascoal810950b2014-10-09 17:16:08 +0100404 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100405
Jose Pascoalaa579a82014-11-05 22:17:16 +0000406 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100407
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000408 System.out.println(" ---------------------- cursor : " + cursor + " ----------------------------------");
409
Jose Pascoalaa579a82014-11-05 22:17:16 +0000410 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100411 {
412 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
413 int status = cursor.getInt(columnIndex);
414
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000415 System.out.println("status from cursor: " + status);
416
Jose Pascoal810950b2014-10-09 17:16:08 +0100417 switch (status)
418 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000419
Jose Pascoal810950b2014-10-09 17:16:08 +0100420 case DownloadManager.STATUS_SUCCESSFUL:
421 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
422 toggleDownloadProgressAndRestart();
423 break;
424 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000425 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100426 startDownloadProgressUpdateThread();
427 break;
428 case DownloadManager.STATUS_FAILED:
429 Resources resources = getResources();
430 if (mSelectedVersion != null)
431 {
432 String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
Pedro Arelo773bd822014-10-10 11:57:34 +0100433 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100434 }
435 else
436 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100437 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100438 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100439 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100440 break;
441 }
442 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100443 else
444 {
445 abortUpdateProccess();
446 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100447
Jose Pascoalaa579a82014-11-05 22:17:16 +0000448 if (cursor != null)
449 {
450 cursor.close();
451 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100452 }
453 }
454
455 // ************************************************************************************
456 // PRE INSTALL
457 // ************************************************************************************
458
459 private void setupPreInstallState()
460 {
461
462 Resources resources = mainActivity.getResources();
463 // the latest version data must exist
464 if (mSelectedVersion != null)
465 {
466
467 // check the md5 of the file
468 File file = new File(getVersionDownloadPath(mSelectedVersion));
469
470 if (file.exists())
471 {
472 if (Utils.checkMD5(mSelectedVersion.getMd5Sum(), file))
473 {
474 copyUpdateToCache(file);
475 return;
476 }
477 else
478 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100479 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100480 removeLastUpdateDownload();
481 }
482 }
483 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100484
Jose Pascoal810950b2014-10-09 17:16:08 +0100485 // remove the updater directory
486 File fileDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
487 fileDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100488
Jose Pascoal810950b2014-10-09 17:16:08 +0100489 // else if the perfect case does not happen, reset the download
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100490 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100491 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100492
Jose Pascoal810950b2014-10-09 17:16:08 +0100493 // ************************************************************************************
494 // DOWNLOAD UPDATE
495 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100496
Jose Pascoal810950b2014-10-09 17:16:08 +0100497 public void setupDownloadState()
498 {
499 // setup the download state views
500 if (mSelectedVersion == null)
501 {
502 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100503
Jose Pascoal810950b2014-10-09 17:16:08 +0100504 // we don't have the lastest.xml so get back to initial state
505 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100506
Jose Pascoal810950b2014-10-09 17:16:08 +0100507 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100508
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100509 abortUpdateProccess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100510
Jose Pascoal810950b2014-10-09 17:16:08 +0100511 return;
512 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100513
Jose Pascoal810950b2014-10-09 17:16:08 +0100514 // if there is a download ID on the shared preferences
515 if (mLatestUpdateDownloadId == 0)
516 {
517 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100518
Jose Pascoal810950b2014-10-09 17:16:08 +0100519 // invalid download Id
520 if (mLatestUpdateDownloadId == 0)
521 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100522 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100523 return;
524 }
525 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100526
Jose Pascoal810950b2014-10-09 17:16:08 +0100527 updateDownloadFile();
528 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100529
Jose Pascoal810950b2014-10-09 17:16:08 +0100530 private void startPreInstall()
531 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100532
Jose Pascoal810950b2014-10-09 17:16:08 +0100533 if (RootTools.isAccessGiven())
534 {
535 // set the command for the recovery
536 Resources resources = getResources();
537 // Process p;
538 try
539 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100540
Jose Pascoal810950b2014-10-09 17:16:08 +0100541 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100542
Jose Pascoal810950b2014-10-09 17:16:08 +0100543 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100544
Jose Pascoal810950b2014-10-09 17:16:08 +0100545 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100546
Jose Pascoal0a5be012014-11-17 16:55:40 +0000547 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100548 {
549 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
550 + VersionParserHelper.getNameFromVersion(mSelectedVersion) + "' >> /cache/recovery/command"));
551 }
552 else
553 {
554 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
555 + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(mSelectedVersion)
556 + "' >> /cache/recovery/command"));
557 }
558 } catch (IOException e)
559 {
560 // TODO Auto-generated catch block
561 e.printStackTrace();
562 } catch (NotFoundException e)
563 {
564 // TODO Auto-generated catch block
565 e.printStackTrace();
566 } catch (TimeoutException e)
567 {
568 // TODO Auto-generated catch block
569 e.printStackTrace();
570 } catch (RootDeniedException e)
571 {
572 // TODO Auto-generated catch block
573 e.printStackTrace();
574 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100575
Tiago Costa87925fe2014-12-02 17:57:51 +0000576 SharedPreferences sharedPreferences = getActivity().getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
577
578 Editor editor = sharedPreferences.edit();
579 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
580
581 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100582
Jose Pascoal0a5be012014-11-17 16:55:40 +0000583 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100584 {
585 removeLastUpdateDownload();
586 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100587
Jose Pascoal810950b2014-10-09 17:16:08 +0100588 // remove the update files from data
589 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100590
Jose Pascoal810950b2014-10-09 17:16:08 +0100591 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100592 try
593 {
594 mainActivity.updateStatePreference(UpdaterState.NORMAL);
595 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
596 } catch (IOException e)
597 {
598 // TODO Auto-generated catch block
599 e.printStackTrace();
600 } catch (TimeoutException e)
601 {
602 // TODO Auto-generated catch block
603 e.printStackTrace();
604 } catch (RootDeniedException e)
605 {
606 // TODO Auto-generated catch block
607 e.printStackTrace();
608 }
609 }
610 else
611 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100612 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100613 }
614 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100615
Jose Pascoal810950b2014-10-09 17:16:08 +0100616 private void copyUpdateToCache(File file)
617 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000618 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100619 {
Jose Pascoal733b84e2014-10-17 14:49:02 +0100620 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
621 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getNameFromVersion(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100622 }
623 else
624 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000625 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100626 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000627 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
628 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100629
Jose Pascoal0a5be012014-11-17 16:55:40 +0000630 abortUpdateProccess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100631 }
632 }
633 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100634
Jose Pascoal810950b2014-10-09 17:16:08 +0100635 // ************************************************************************************
636 // Update Removal
637 // ************************************************************************************
638 private void removeUpdateFilesFromData()
639 {
640 try
641 {
642 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
643 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
644 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
645 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
646 R.string.removeText2SpeechCommand)));
647 } catch (IOException e)
648 {
649 e.printStackTrace();
650 } catch (TimeoutException e)
651 {
652 e.printStackTrace();
653 } catch (RootDeniedException e)
654 {
655 e.printStackTrace();
656 }
657 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100658
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000659 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100660 {
661 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000662 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100663 {
664 // residue download ID
665 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100666
Jose Pascoal810950b2014-10-09 17:16:08 +0100667 mainActivity.resetLastUpdateDownloadId();
668 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000669 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100670 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100671
Jose Pascoal810950b2014-10-09 17:16:08 +0100672 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
673 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100674
Jose Pascoal810950b2014-10-09 17:16:08 +0100675 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100676
Jose Pascoal810950b2014-10-09 17:16:08 +0100677 @Override
678 protected Integer doInBackground(String... params)
679 {
680 // check the correct number of
681 if (params.length != 2)
682 {
683 return -1;
684 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100685
Jose Pascoal810950b2014-10-09 17:16:08 +0100686 String originalFilePath = params[0];
687 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100688
Jose Pascoal810950b2014-10-09 17:16:08 +0100689 if (RootTools.isAccessGiven())
690 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000691 Utils.clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100692
Jose Pascoal810950b2014-10-09 17:16:08 +0100693 File otaFilePath = new File(originalFilePath);
694 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100695
Jose Pascoal810950b2014-10-09 17:16:08 +0100696 if (!otaFileCache.exists())
697 {
698 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
699 }
700 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100701 else
702 {
703 abortUpdateProccess();
704 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100705
Jose Pascoal810950b2014-10-09 17:16:08 +0100706 return 1;
707 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100708
Jose Pascoal810950b2014-10-09 17:16:08 +0100709 protected void onProgressUpdate(Integer... progress)
710 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100711
Jose Pascoal810950b2014-10-09 17:16:08 +0100712 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100713
Jose Pascoal810950b2014-10-09 17:16:08 +0100714 protected void onPreExecute()
715 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100716
Jose Pascoal810950b2014-10-09 17:16:08 +0100717 if (mProgress == null)
718 {
719 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100720 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100721 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
722 }
723 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100724
Jose Pascoal810950b2014-10-09 17:16:08 +0100725 protected void onPostExecute(Integer result)
726 {
727 // disable the spinner
728 if (mProgress != null)
729 {
730 mProgress.dismiss();
731 mProgress = null;
732 }
733 }
734 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100735
Jose Pascoal810950b2014-10-09 17:16:08 +0100736 private String getVersionDownloadPath(Version version)
737 {
738 Resources resources = mainActivity.getResources();
739 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(version);
740 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100741
742 public void abortUpdateProccess()
743 {
Tiago Costa73eda412014-11-18 14:37:42 +0000744 removeLastUpdateDownload();
745
746 mainActivity.runOnUiThread(new Runnable()
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000747 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000748
Tiago Costa73eda412014-11-18 14:37:42 +0000749 @Override
750 public void run()
Jose Pascoalaa579a82014-11-05 22:17:16 +0000751 {
Tiago Costa73eda412014-11-18 14:37:42 +0000752 mainActivity.removeLastFragment(false);
753 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
754 {
755 mainActivity.changeState(UpdaterState.NORMAL);
756 }
757 else
758 {
759 mainActivity.updateStatePreference(UpdaterState.NORMAL);
760 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000761 }
Tiago Costa73eda412014-11-18 14:37:42 +0000762 });
763
Jose Pascoalb397dc62014-10-13 19:26:58 +0100764 }
765
Jose Pascoalb690af12014-10-06 18:29:26 +0100766}