blob: 913924b94a0aca92e133e7a0d6e00048ba68a4c6 [file] [log] [blame]
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +00001
Jose Pascoalb690af12014-10-06 18:29:26 +01002package com.fairphone.updater.fragments;
3
Jose Pascoal54b3ae62014-10-07 20:29:58 +01004import java.io.File;
5import java.io.IOException;
6import java.util.concurrent.TimeoutException;
7
Jose Pascoal75392162014-10-15 18:29:01 +01008import android.app.AlertDialog;
Jose Pascoalb690af12014-10-06 18:29:26 +01009import android.app.DownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010010import android.app.ProgressDialog;
11import android.content.BroadcastReceiver;
12import android.content.Context;
Jose Pascoal75392162014-10-15 18:29:01 +010013import android.content.DialogInterface;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010014import android.content.Intent;
15import android.content.IntentFilter;
Tiago Costa87925fe2014-12-02 17:57:51 +000016import android.content.SharedPreferences;
17import android.content.SharedPreferences.Editor;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010018import android.content.res.Resources;
19import android.content.res.Resources.NotFoundException;
Jose Pascoalb690af12014-10-06 18:29:26 +010020import android.database.Cursor;
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +000021import android.net.ConnectivityManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010022import android.os.AsyncTask;
Jose Pascoalb690af12014-10-06 18:29:26 +010023import android.os.Bundle;
24import android.os.Environment;
25import android.util.Log;
26import android.view.LayoutInflater;
27import android.view.View;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010028import android.view.View.OnClickListener;
Jose Pascoalb690af12014-10-06 18:29:26 +010029import android.view.ViewGroup;
30import android.widget.Button;
31import android.widget.LinearLayout;
32import android.widget.ProgressBar;
33import android.widget.TextView;
34import android.widget.Toast;
35
Tiago Costa87925fe2014-12-02 17:57:51 +000036import com.fairphone.updater.FairphoneUpdater;
37import com.fairphone.updater.UpdaterService;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010038import com.fairphone.updater.FairphoneUpdater.HeaderType;
39import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010040import com.fairphone.updater.R;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010041import com.fairphone.updater.data.Version;
42import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010043import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010044import com.stericson.RootTools.RootTools;
45import com.stericson.RootTools.exceptions.RootDeniedException;
46import com.stericson.RootTools.execution.CommandCapture;
47import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010048
Jose Pascoal810950b2014-10-09 17:16:08 +010049public class DownloadAndRestartFragment extends BaseFragment
50{
Jose Pascoalb690af12014-10-06 18:29:26 +010051
Jose Pascoal810950b2014-10-09 17:16:08 +010052 protected static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoalb690af12014-10-06 18:29:26 +010053
Jose Pascoal810950b2014-10-09 17:16:08 +010054 private TextView mDownloadVersionName;
55 private LinearLayout mVersionDownloadingGroup;
56 private ProgressBar mVersionDownloadProgressBar;
57 private LinearLayout mVersionInstallGroup;
58 private Button mRestartButton;
59 private Button mCancelButton;
60 private Version mSelectedVersion;
Jose Pascoalb690af12014-10-06 18:29:26 +010061
Jose Pascoal810950b2014-10-09 17:16:08 +010062 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010063
Jose Pascoal810950b2014-10-09 17:16:08 +010064 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010065
Tiago Costa73eda412014-11-18 14:37:42 +000066 private BroadcastReceiver mNetworkStateReceiver;
67
Jose Pascoal810950b2014-10-09 17:16:08 +010068 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010069
Jose Pascoal810950b2014-10-09 17:16:08 +010070 @Override
71 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
72 {
73 // Inflate the layout for this fragment
74 mSelectedVersion = mainActivity.getSelectedVersion();
75 View view = inflateViewByImageType(inflater, container);
Jose Pascoalb690af12014-10-06 18:29:26 +010076
Jose Pascoal810950b2014-10-09 17:16:08 +010077 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +000078
Jose Pascoal810950b2014-10-09 17:16:08 +010079 return view;
80 }
Jose Pascoalb690af12014-10-06 18:29:26 +010081
Jose Pascoal810950b2014-10-09 17:16:08 +010082 private void toggleDownloadProgressAndRestart()
83 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +010084 UpdaterState state = mainActivity.getCurrentUpdaterState();
85 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +010086 {
87 case DOWNLOAD:
88 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +010089
Jose Pascoal810950b2014-10-09 17:16:08 +010090 mVersionInstallGroup.setVisibility(View.GONE);
91 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
92 break;
Jose Pascoalb690af12014-10-06 18:29:26 +010093
Jose Pascoal810950b2014-10-09 17:16:08 +010094 case PREINSTALL:
95 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +010096
Jose Pascoal810950b2014-10-09 17:16:08 +010097 mVersionDownloadingGroup.setVisibility(View.GONE);
98 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +010099
100 mRestartButton.setOnClickListener(new OnClickListener()
101 {
102
103 @Override
104 public void onClick(View v)
105 {
Jose Pascoal75392162014-10-15 18:29:01 +0100106 showEraseAllDataWarning();
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100107 }
108 });
109
Jose Pascoal810950b2014-10-09 17:16:08 +0100110 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100111
Jose Pascoal810950b2014-10-09 17:16:08 +0100112 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100113 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100114 mainActivity.removeLastFragment(true);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100115 return;
116
Jose Pascoal810950b2014-10-09 17:16:08 +0100117 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100118
Jose Pascoal810950b2014-10-09 17:16:08 +0100119 mCancelButton.setOnClickListener(new OnClickListener()
120 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100121
Jose Pascoal810950b2014-10-09 17:16:08 +0100122 @Override
123 public void onClick(View v)
124 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000125 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100126 }
127 });
128 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100129
Jose Pascoal75392162014-10-15 18:29:01 +0100130 private void showEraseAllDataWarning()
131 {
Tiago Costa73eda412014-11-18 14:37:42 +0000132 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100133 {
134 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
135 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
136 {
137
138 @Override
139 public void onClick(DialogInterface dialog, int which)
140 {
141 startPreInstall();
142 }
143 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
144 {
145 public void onClick(DialogInterface dialog, int which)
146 {
147 // do nothing
148 }
149 }).show();
150 }
151 else
152 {
153 startPreInstall();
154 }
155 }
156
Jose Pascoal810950b2014-10-09 17:16:08 +0100157 private void updateHeader()
158 {
159 if (mSelectedVersion != null)
160 {
161 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
162 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000163 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100164 }
165 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
166 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000167 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100168 }
169 }
170 else
171 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000172 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100173 }
174 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100175
Jose Pascoal810950b2014-10-09 17:16:08 +0100176 private void startDownloadProgressUpdateThread()
177 {
178 new Thread(new Runnable()
179 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100180
Jose Pascoal810950b2014-10-09 17:16:08 +0100181 @Override
182 public void run()
183 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100184
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000185 System.out.println(" +++++++++++++++++++++++++++++++ running startDownloadProgressUpdateThread +++++++++++++++++++++++++++++++ ");
Jose Pascoal810950b2014-10-09 17:16:08 +0100186 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100187
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000188 long latestUpdateDownloadId = 0;
189
190 int count = 3;
191
192 while (((latestUpdateDownloadId = mainActivity.getLatestDownloadId()) <= 0) && count > 0){
193 try
194 {
195 Thread.sleep(2000);
196 System.out.println(" +++++++++++++++++++++++++++++++ count: " + count + " +++++++++++++++++++++++++++++++ ");
197 count--;
198 } catch (InterruptedException e)
199 {
200 e.printStackTrace();
201 }
202 }
203 System.out.println(" +++++++++++++++++++++++++++++++ " + latestUpdateDownloadId + " +++++++++++++++++++++++++++++++ ");
204
Jose Pascoalaa579a82014-11-05 22:17:16 +0000205 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100206 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100207
Jose Pascoal810950b2014-10-09 17:16:08 +0100208 DownloadManager.Query q = new DownloadManager.Query();
209 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100210
Jose Pascoalaa579a82014-11-05 22:17:16 +0000211 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000212
213 if(cursor == null){
214 System.out.println(" +++++++++++++++++++++++++++++++ cursor is null +++++++++++++++++++++++++++++++ ");
215 }
Jose Pascoalda015b12014-11-06 12:47:11 +0000216 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100217 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100218 try
219 {
220 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
221 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100222
Jose Pascoal810950b2014-10-09 17:16:08 +0100223 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
224 {
225 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100226 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_sd_card_message), Toast.LENGTH_LONG).show();
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000227 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100228 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000229 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100230 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000231 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
232 {
233 case DownloadManager.STATUS_SUCCESSFUL:
234 case DownloadManager.STATUS_FAILED:
235 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100236
Jose Pascoalaa579a82014-11-05 22:17:16 +0000237 bytes_downloaded = 0;
238 bytes_total = 0;
239 break;
240 }
241
242 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
243 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100244 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100245 } catch (Exception e)
246 {
247 downloading = false;
248 Log.e(TAG, "Error updating download progress: " + e.getMessage());
249 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100250
Jose Pascoal810950b2014-10-09 17:16:08 +0100251 cursor.close();
252 try
253 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000254 Thread.sleep(1000);
Jose Pascoal810950b2014-10-09 17:16:08 +0100255 } catch (InterruptedException e)
256 {
257 e.printStackTrace();
258 }
259 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000260 else
261 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000262 if (cursor != null)
263 {
264 downloading = false;
265 cursor.close();
266 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000267 if (mDownloadManager == null)
268 {
269 downloading = false;
270 }
271 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100272 }
273 }
274 }).start();
275 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100276
Jose Pascoal810950b2014-10-09 17:16:08 +0100277 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
278 {
279 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
280 if (mSelectedVersion != null)
281 {
282 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
283 {
284 view = inflater.inflate(R.layout.fragment_download_android, container, false);
285 }
286 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
287 {
288 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
289 }
290 }
291 return view;
292 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100293
Jose Pascoal810950b2014-10-09 17:16:08 +0100294 private void setupLayout(View view)
295 {
296 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100297
Jose Pascoal810950b2014-10-09 17:16:08 +0100298 // download in progress group
299 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
300 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100301
Jose Pascoal810950b2014-10-09 17:16:08 +0100302 // restart group
303 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
304 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100305
Jose Pascoal810950b2014-10-09 17:16:08 +0100306 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
307 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100308
Jose Pascoal810950b2014-10-09 17:16:08 +0100309 @Override
310 public void onResume()
311 {
312 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100313
Jose Pascoal810950b2014-10-09 17:16:08 +0100314 setupInstallationReceivers();
315 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100316
Tiago Costa73eda412014-11-18 14:37:42 +0000317 registerNetworkStatusBoradcastReceiver();
318
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100319 updateHeader();
320 mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100321 toggleDownloadProgressAndRestart();
322 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100323
Tiago Costa73eda412014-11-18 14:37:42 +0000324 private void registerNetworkStatusBoradcastReceiver()
325 {
326 // Setup monitoring for future connectivity status changes
327 if (mNetworkStateReceiver != null)
328 {
329 mNetworkStateReceiver = new BroadcastReceiver()
330 {
331 @Override
332 public void onReceive(Context context, Intent intent)
333 {
334 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
335 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000336 abortUpdateProcess();
Tiago Costa73eda412014-11-18 14:37:42 +0000337 }
338 }
339 };
340 }
341
342 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
343 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
344 }
345
346 private void unregisterNetworkStatusBoradcastReceiver()
347 {
348 if (mNetworkStateReceiver != null)
349 {
350 mainActivity.unregisterReceiver(mNetworkStateReceiver);
351
352 mNetworkStateReceiver = null;
353 }
354 }
355
Jose Pascoal810950b2014-10-09 17:16:08 +0100356 @Override
357 public void onPause()
358 {
359 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100360
Jose Pascoal810950b2014-10-09 17:16:08 +0100361 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000362
363 unregisterNetworkStatusBoradcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100364 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100365
Jose Pascoal810950b2014-10-09 17:16:08 +0100366 private void setupInstallationReceivers()
367 {
368 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100369
Jose Pascoal810950b2014-10-09 17:16:08 +0100370 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
371 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100372
Jose Pascoal810950b2014-10-09 17:16:08 +0100373 private void registerDownloadBroadCastReceiver()
374 {
375 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
376 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100377
Jose Pascoal810950b2014-10-09 17:16:08 +0100378 private void unregisterBroadCastReceiver()
379 {
380 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
381 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100382
Jose Pascoal810950b2014-10-09 17:16:08 +0100383 private class DownloadBroadCastReceiver extends BroadcastReceiver
384 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100385
Jose Pascoal810950b2014-10-09 17:16:08 +0100386 @Override
387 public void onReceive(Context context, Intent intent)
388 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100389
Jose Pascoal810950b2014-10-09 17:16:08 +0100390 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100391
Jose Pascoal810950b2014-10-09 17:16:08 +0100392 updateDownloadFile();
393 }
394 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100395
Jose Pascoal810950b2014-10-09 17:16:08 +0100396 private void updateDownloadFile()
397 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100398
Jose Pascoal810950b2014-10-09 17:16:08 +0100399 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100400
Jose Pascoal810950b2014-10-09 17:16:08 +0100401 if (downloadId != 0)
402 {
403 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100404
Jose Pascoal810950b2014-10-09 17:16:08 +0100405 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100406
Jose Pascoalaa579a82014-11-05 22:17:16 +0000407 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100408
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000409 System.out.println(" ---------------------- cursor : " + cursor + " ----------------------------------");
410
Jose Pascoalaa579a82014-11-05 22:17:16 +0000411 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100412 {
413 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
414 int status = cursor.getInt(columnIndex);
415
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000416 System.out.println("status from cursor: " + status);
417
Jose Pascoal810950b2014-10-09 17:16:08 +0100418 switch (status)
419 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000420
Jose Pascoal810950b2014-10-09 17:16:08 +0100421 case DownloadManager.STATUS_SUCCESSFUL:
422 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
423 toggleDownloadProgressAndRestart();
424 break;
425 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000426 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100427 startDownloadProgressUpdateThread();
428 break;
429 case DownloadManager.STATUS_FAILED:
430 Resources resources = getResources();
431 if (mSelectedVersion != null)
432 {
433 String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
Pedro Arelo773bd822014-10-10 11:57:34 +0100434 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100435 }
436 else
437 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100438 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100439 }
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000440 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100441 break;
442 }
443 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100444 else
445 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000446 abortUpdateProcess();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100447 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100448
Jose Pascoalaa579a82014-11-05 22:17:16 +0000449 if (cursor != null)
450 {
451 cursor.close();
452 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100453 }
454 }
455
456 // ************************************************************************************
457 // PRE INSTALL
458 // ************************************************************************************
459
460 private void setupPreInstallState()
461 {
462
463 Resources resources = mainActivity.getResources();
464 // the latest version data must exist
465 if (mSelectedVersion != null)
466 {
467
468 // check the md5 of the file
469 File file = new File(getVersionDownloadPath(mSelectedVersion));
470
471 if (file.exists())
472 {
473 if (Utils.checkMD5(mSelectedVersion.getMd5Sum(), file))
474 {
475 copyUpdateToCache(file);
476 return;
477 }
478 else
479 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100480 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100481 removeLastUpdateDownload();
482 }
483 }
484 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100485
Jose Pascoal810950b2014-10-09 17:16:08 +0100486 // remove the updater directory
487 File fileDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
488 fileDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100489
Jose Pascoal810950b2014-10-09 17:16:08 +0100490 // else if the perfect case does not happen, reset the download
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000491 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100492 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100493
Jose Pascoal810950b2014-10-09 17:16:08 +0100494 // ************************************************************************************
495 // DOWNLOAD UPDATE
496 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100497
Jose Pascoal810950b2014-10-09 17:16:08 +0100498 public void setupDownloadState()
499 {
500 // setup the download state views
501 if (mSelectedVersion == null)
502 {
503 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100504
Jose Pascoal810950b2014-10-09 17:16:08 +0100505 // we don't have the lastest.xml so get back to initial state
506 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100507
Jose Pascoal810950b2014-10-09 17:16:08 +0100508 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100509
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000510 abortUpdateProcess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100511
Jose Pascoal810950b2014-10-09 17:16:08 +0100512 return;
513 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100514
Jose Pascoal810950b2014-10-09 17:16:08 +0100515 // if there is a download ID on the shared preferences
516 if (mLatestUpdateDownloadId == 0)
517 {
518 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100519
Jose Pascoal810950b2014-10-09 17:16:08 +0100520 // invalid download Id
521 if (mLatestUpdateDownloadId == 0)
522 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000523 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100524 return;
525 }
526 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100527
Jose Pascoal810950b2014-10-09 17:16:08 +0100528 updateDownloadFile();
529 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100530
Jose Pascoal810950b2014-10-09 17:16:08 +0100531 private void startPreInstall()
532 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100533
Jose Pascoal810950b2014-10-09 17:16:08 +0100534 if (RootTools.isAccessGiven())
535 {
536 // set the command for the recovery
537 Resources resources = getResources();
538 // Process p;
539 try
540 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100541
Jose Pascoal810950b2014-10-09 17:16:08 +0100542 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100543
Jose Pascoal810950b2014-10-09 17:16:08 +0100544 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100545
Jose Pascoal810950b2014-10-09 17:16:08 +0100546 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100547
Jose Pascoal0a5be012014-11-17 16:55:40 +0000548 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100549 {
550 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
551 + VersionParserHelper.getNameFromVersion(mSelectedVersion) + "' >> /cache/recovery/command"));
552 }
553 else
554 {
555 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
556 + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(mSelectedVersion)
557 + "' >> /cache/recovery/command"));
558 }
559 } catch (IOException e)
560 {
561 // TODO Auto-generated catch block
562 e.printStackTrace();
563 } catch (NotFoundException e)
564 {
565 // TODO Auto-generated catch block
566 e.printStackTrace();
567 } catch (TimeoutException e)
568 {
569 // TODO Auto-generated catch block
570 e.printStackTrace();
571 } catch (RootDeniedException e)
572 {
573 // TODO Auto-generated catch block
574 e.printStackTrace();
575 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100576
Tiago Costa87925fe2014-12-02 17:57:51 +0000577 SharedPreferences sharedPreferences = getActivity().getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
578
579 Editor editor = sharedPreferences.edit();
580 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
581
582 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100583
Jose Pascoal0a5be012014-11-17 16:55:40 +0000584 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100585 {
586 removeLastUpdateDownload();
587 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100588
Jose Pascoal810950b2014-10-09 17:16:08 +0100589 // remove the update files from data
590 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100591
Jose Pascoal810950b2014-10-09 17:16:08 +0100592 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100593 try
594 {
595 mainActivity.updateStatePreference(UpdaterState.NORMAL);
596 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
597 } catch (IOException e)
598 {
599 // TODO Auto-generated catch block
600 e.printStackTrace();
601 } catch (TimeoutException e)
602 {
603 // TODO Auto-generated catch block
604 e.printStackTrace();
605 } catch (RootDeniedException e)
606 {
607 // TODO Auto-generated catch block
608 e.printStackTrace();
609 }
610 }
611 else
612 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000613 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100614 }
615 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100616
Jose Pascoal810950b2014-10-09 17:16:08 +0100617 private void copyUpdateToCache(File file)
618 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000619 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100620 {
Jose Pascoal733b84e2014-10-17 14:49:02 +0100621 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
622 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getNameFromVersion(mSelectedVersion));
Jose Pascoal810950b2014-10-09 17:16:08 +0100623 }
624 else
625 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000626 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100627 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000628 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
629 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100630
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000631 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100632 }
633 }
634 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100635
Jose Pascoal810950b2014-10-09 17:16:08 +0100636 // ************************************************************************************
637 // Update Removal
638 // ************************************************************************************
639 private void removeUpdateFilesFromData()
640 {
641 try
642 {
643 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
644 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
645 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
646 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
647 R.string.removeText2SpeechCommand)));
648 } catch (IOException e)
649 {
650 e.printStackTrace();
651 } catch (TimeoutException e)
652 {
653 e.printStackTrace();
654 } catch (RootDeniedException e)
655 {
656 e.printStackTrace();
657 }
658 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100659
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000660 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100661 {
662 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000663 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100664 {
665 // residue download ID
666 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100667
Jose Pascoal810950b2014-10-09 17:16:08 +0100668 mainActivity.resetLastUpdateDownloadId();
669 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000670 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100671 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100672
Jose Pascoal810950b2014-10-09 17:16:08 +0100673 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
674 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100675
Jose Pascoal810950b2014-10-09 17:16:08 +0100676 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100677
Jose Pascoal810950b2014-10-09 17:16:08 +0100678 @Override
679 protected Integer doInBackground(String... params)
680 {
681 // check the correct number of
682 if (params.length != 2)
683 {
684 return -1;
685 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100686
Jose Pascoal810950b2014-10-09 17:16:08 +0100687 String originalFilePath = params[0];
688 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100689
Jose Pascoal810950b2014-10-09 17:16:08 +0100690 if (RootTools.isAccessGiven())
691 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000692 Utils.clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100693
Jose Pascoal810950b2014-10-09 17:16:08 +0100694 File otaFilePath = new File(originalFilePath);
695 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100696
Jose Pascoal810950b2014-10-09 17:16:08 +0100697 if (!otaFileCache.exists())
698 {
699 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
700 }
701 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100702 else
703 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000704 abortUpdateProcess();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100705 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100706
Jose Pascoal810950b2014-10-09 17:16:08 +0100707 return 1;
708 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100709
Jose Pascoal810950b2014-10-09 17:16:08 +0100710 protected void onProgressUpdate(Integer... progress)
711 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100712
Jose Pascoal810950b2014-10-09 17:16:08 +0100713 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100714
Jose Pascoal810950b2014-10-09 17:16:08 +0100715 protected void onPreExecute()
716 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100717
Jose Pascoal810950b2014-10-09 17:16:08 +0100718 if (mProgress == null)
719 {
720 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100721 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100722 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
723 }
724 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100725
Jose Pascoal810950b2014-10-09 17:16:08 +0100726 protected void onPostExecute(Integer result)
727 {
728 // disable the spinner
729 if (mProgress != null)
730 {
731 mProgress.dismiss();
732 mProgress = null;
733 }
734 }
735 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100736
Jose Pascoal810950b2014-10-09 17:16:08 +0100737 private String getVersionDownloadPath(Version version)
738 {
739 Resources resources = mainActivity.getResources();
740 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + VersionParserHelper.getNameFromVersion(version);
741 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100742
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000743 public void abortUpdateProcess()
Jose Pascoalb397dc62014-10-13 19:26:58 +0100744 {
Tiago Costa73eda412014-11-18 14:37:42 +0000745 removeLastUpdateDownload();
746
747 mainActivity.runOnUiThread(new Runnable()
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000748 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000749
Tiago Costa73eda412014-11-18 14:37:42 +0000750 @Override
751 public void run()
Jose Pascoalaa579a82014-11-05 22:17:16 +0000752 {
Tiago Costa73eda412014-11-18 14:37:42 +0000753 mainActivity.removeLastFragment(false);
754 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
755 {
756 mainActivity.changeState(UpdaterState.NORMAL);
757 }
758 else
759 {
760 mainActivity.updateStatePreference(UpdaterState.NORMAL);
761 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000762 }
Tiago Costa73eda412014-11-18 14:37:42 +0000763 });
764
Jose Pascoalb397dc62014-10-13 19:26:58 +0100765 }
766
Jose Pascoalb690af12014-10-06 18:29:26 +0100767}