blob: c4bb59788e84f4ea194701dd4d9a993b018c70b5 [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;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010036import com.fairphone.updater.FairphoneUpdater.HeaderType;
37import com.fairphone.updater.FairphoneUpdater.UpdaterState;
Jose Pascoalb690af12014-10-06 18:29:26 +010038import com.fairphone.updater.R;
Jose Pascoal02d86242014-12-17 18:50:08 +000039import com.fairphone.updater.UpdaterService;
Jose Pascoal1c049e02014-12-17 13:03:09 +000040import com.fairphone.updater.data.DownloadableItem;
Tiago Costa198bf3d2014-12-16 15:23:18 +000041import com.fairphone.updater.data.Store;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010042import com.fairphone.updater.data.Version;
Jose Pascoalc2545cc2014-12-18 16:51:52 +000043import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010044import com.fairphone.updater.tools.Utils;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010045import com.stericson.RootTools.RootTools;
46import com.stericson.RootTools.exceptions.RootDeniedException;
47import com.stericson.RootTools.execution.CommandCapture;
48import com.stericson.RootTools.execution.Shell;
Jose Pascoalb690af12014-10-06 18:29:26 +010049
Jose Pascoal810950b2014-10-09 17:16:08 +010050public class DownloadAndRestartFragment extends BaseFragment
51{
Jose Pascoalb690af12014-10-06 18:29:26 +010052
Jose Pascoal810950b2014-10-09 17:16:08 +010053 protected static final String TAG = DownloadAndRestartFragment.class.getSimpleName();
Jose Pascoalb690af12014-10-06 18:29:26 +010054
Jose Pascoal810950b2014-10-09 17:16:08 +010055 private TextView mDownloadVersionName;
56 private LinearLayout mVersionDownloadingGroup;
57 private ProgressBar mVersionDownloadProgressBar;
58 private LinearLayout mVersionInstallGroup;
59 private Button mRestartButton;
60 private Button mCancelButton;
61 private Version mSelectedVersion;
Tiago Costa198bf3d2014-12-16 15:23:18 +000062 private Store mSelectedStore;
Jose Pascoalb690af12014-10-06 18:29:26 +010063
Tiago Costa198bf3d2014-12-16 15:23:18 +000064 private boolean mIsVersion;
Jose Pascoal1c049e02014-12-17 13:03:09 +000065
Jose Pascoal810950b2014-10-09 17:16:08 +010066 private DownloadManager mDownloadManager;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010067
Jose Pascoal810950b2014-10-09 17:16:08 +010068 private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010069
Tiago Costa73eda412014-11-18 14:37:42 +000070 private BroadcastReceiver mNetworkStateReceiver;
71
Jose Pascoal810950b2014-10-09 17:16:08 +010072 private long mLatestUpdateDownloadId;
Jose Pascoal54b3ae62014-10-07 20:29:58 +010073
Jose Pascoal1c049e02014-12-17 13:03:09 +000074 public DownloadAndRestartFragment(boolean isVersion)
75 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000076 super();
Jose Pascoal1c049e02014-12-17 13:03:09 +000077
Tiago Costa198bf3d2014-12-16 15:23:18 +000078 mIsVersion = isVersion;
79 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000080
Jose Pascoal810950b2014-10-09 17:16:08 +010081 @Override
82 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
83 {
84 // Inflate the layout for this fragment
Tiago Costa198bf3d2014-12-16 15:23:18 +000085 View view = null;
Jose Pascoal1c049e02014-12-17 13:03:09 +000086 if (mIsVersion)
87 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000088 mSelectedVersion = mainActivity.getSelectedVersion();
89 view = inflateViewByImageType(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000090 mSelectedStore = null;
91 }
92 else
93 {
Tiago Costa198bf3d2014-12-16 15:23:18 +000094 mSelectedStore = mainActivity.getSelectedStore();
95 view = inflateStoreView(inflater, container);
Jose Pascoal1c049e02014-12-17 13:03:09 +000096 mSelectedVersion = null;
Tiago Costa198bf3d2014-12-16 15:23:18 +000097 }
Jose Pascoal1c049e02014-12-17 13:03:09 +000098
Jose Pascoal810950b2014-10-09 17:16:08 +010099 setupLayout(view);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000100
Jose Pascoal810950b2014-10-09 17:16:08 +0100101 return view;
102 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000103
Tiago Costa198bf3d2014-12-16 15:23:18 +0000104 private View inflateViewByImageType(LayoutInflater inflater, ViewGroup container)
105 {
106 View view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
107 if (mSelectedVersion != null)
108 {
109 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
110 {
111 view = inflater.inflate(R.layout.fragment_download_android, container, false);
112 }
113 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
114 {
115 view = inflater.inflate(R.layout.fragment_download_fairphone, container, false);
116 }
117 }
118 return view;
119 }
120
121 private View inflateStoreView(LayoutInflater inflater, ViewGroup container)
122 {
123 View view = inflater.inflate(R.layout.fragment_download_app_store, container, false);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000124
Tiago Costa198bf3d2014-12-16 15:23:18 +0000125 return view;
126 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100127
Jose Pascoal810950b2014-10-09 17:16:08 +0100128 private void toggleDownloadProgressAndRestart()
129 {
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100130 UpdaterState state = mainActivity.getCurrentUpdaterState();
131 switch (state)
Jose Pascoal810950b2014-10-09 17:16:08 +0100132 {
133 case DOWNLOAD:
134 setupDownloadState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100135
Jose Pascoal810950b2014-10-09 17:16:08 +0100136 mVersionInstallGroup.setVisibility(View.GONE);
137 mVersionDownloadingGroup.setVisibility(View.VISIBLE);
138 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100139
Jose Pascoal810950b2014-10-09 17:16:08 +0100140 case PREINSTALL:
141 setupPreInstallState();
Jose Pascoalb690af12014-10-06 18:29:26 +0100142
Jose Pascoal810950b2014-10-09 17:16:08 +0100143 mVersionDownloadingGroup.setVisibility(View.GONE);
144 mVersionInstallGroup.setVisibility(View.VISIBLE);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100145
146 mRestartButton.setOnClickListener(new OnClickListener()
147 {
148
149 @Override
150 public void onClick(View v)
151 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000152 if (mIsVersion)
153 {
154 showEraseAllDataWarning();
155 }
156 else if (mSelectedStore != null)
157 {
158 startPreInstall();
159 }
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100160 }
161 });
162
Jose Pascoal810950b2014-10-09 17:16:08 +0100163 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100164
Jose Pascoal810950b2014-10-09 17:16:08 +0100165 default:
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100166 Log.w(TAG, "Wrong State: " + state + "\nOnly DOWNLOAD and PREINSTALL are supported");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100167 mainActivity.removeLastFragment(true);
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100168 return;
169
Jose Pascoal810950b2014-10-09 17:16:08 +0100170 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100171
Jose Pascoal810950b2014-10-09 17:16:08 +0100172 mCancelButton.setOnClickListener(new OnClickListener()
173 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100174
Jose Pascoal810950b2014-10-09 17:16:08 +0100175 @Override
176 public void onClick(View v)
177 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000178 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100179 }
180 });
181 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100182
Jose Pascoal75392162014-10-15 18:29:01 +0100183 private void showEraseAllDataWarning()
184 {
Tiago Costa73eda412014-11-18 14:37:42 +0000185 if (mSelectedVersion != null && mSelectedVersion.hasEraseAllPartitionWarning())
Jose Pascoal75392162014-10-15 18:29:01 +0100186 {
187 new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.erase_all_partitions_warning_message)
188 .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
189 {
190
191 @Override
192 public void onClick(DialogInterface dialog, int which)
193 {
194 startPreInstall();
195 }
196 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
197 {
198 public void onClick(DialogInterface dialog, int which)
199 {
200 // do nothing
201 }
202 }).show();
203 }
204 else
205 {
206 startPreInstall();
207 }
208 }
209
Jose Pascoal1c049e02014-12-17 13:03:09 +0000210 private void updateHeader()
211 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000212 if (mIsVersion && mSelectedVersion != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100213 {
214 if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
215 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000216 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100217 }
218 else if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(mSelectedVersion.getImageType()))
219 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000220 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100221 }
222 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000223 else if (mSelectedStore != null)
224 {
225 mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
226 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100227 else
228 {
Tiago Costa3855faa2014-11-14 17:55:05 +0000229 mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
Jose Pascoal810950b2014-10-09 17:16:08 +0100230 }
231 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100232
Jose Pascoal810950b2014-10-09 17:16:08 +0100233 private void startDownloadProgressUpdateThread()
234 {
235 new Thread(new Runnable()
236 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100237
Jose Pascoal810950b2014-10-09 17:16:08 +0100238 @Override
239 public void run()
240 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100241 boolean downloading = true;
Jose Pascoalb690af12014-10-06 18:29:26 +0100242
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000243 long latestUpdateDownloadId = 0;
244
245 int count = 3;
246
Jose Pascoal1c049e02014-12-17 13:03:09 +0000247 while (((latestUpdateDownloadId = mainActivity.getLatestDownloadId()) <= 0) && count > 0)
248 {
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000249 try
250 {
251 Thread.sleep(2000);
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000252 count--;
253 } catch (InterruptedException e)
254 {
255 e.printStackTrace();
256 }
257 }
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000258
Jose Pascoalaa579a82014-11-05 22:17:16 +0000259 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
Jose Pascoal810950b2014-10-09 17:16:08 +0100260 {
Jose Pascoalb690af12014-10-06 18:29:26 +0100261
Jose Pascoal810950b2014-10-09 17:16:08 +0100262 DownloadManager.Query q = new DownloadManager.Query();
263 q.setFilterById(latestUpdateDownloadId);
Jose Pascoalb690af12014-10-06 18:29:26 +0100264
Jose Pascoalaa579a82014-11-05 22:17:16 +0000265 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
Jose Pascoal1c049e02014-12-17 13:03:09 +0000266
Jose Pascoalda015b12014-11-06 12:47:11 +0000267 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100268 {
Jose Pascoal810950b2014-10-09 17:16:08 +0100269 try
270 {
271 int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
272 int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
Jose Pascoalb690af12014-10-06 18:29:26 +0100273
Jose Pascoal810950b2014-10-09 17:16:08 +0100274 if ((bytes_total + 10000) > Utils.getAvailablePartitionSizeInBytes(Environment.getExternalStorageDirectory()))
275 {
276 downloading = false;
Pedro Arelo773bd822014-10-10 11:57:34 +0100277 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 +0000278 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100279 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000280 else
Jose Pascoal810950b2014-10-09 17:16:08 +0100281 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000282 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
283 {
284 case DownloadManager.STATUS_SUCCESSFUL:
285 case DownloadManager.STATUS_FAILED:
286 downloading = false;
Jose Pascoalb690af12014-10-06 18:29:26 +0100287
Jose Pascoalaa579a82014-11-05 22:17:16 +0000288 bytes_downloaded = 0;
289 bytes_total = 0;
290 break;
291 }
292
293 mVersionDownloadProgressBar.setProgress(bytes_downloaded);
294 mVersionDownloadProgressBar.setMax(bytes_total);
Jose Pascoal810950b2014-10-09 17:16:08 +0100295 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100296 } catch (Exception e)
297 {
298 downloading = false;
299 Log.e(TAG, "Error updating download progress: " + e.getMessage());
300 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100301
Jose Pascoal810950b2014-10-09 17:16:08 +0100302 cursor.close();
303 try
304 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000305 Thread.sleep(1000);
Jose Pascoal810950b2014-10-09 17:16:08 +0100306 } catch (InterruptedException e)
307 {
308 e.printStackTrace();
309 }
310 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000311 else
312 {
Jose Pascoalda015b12014-11-06 12:47:11 +0000313 if (cursor != null)
314 {
315 downloading = false;
316 cursor.close();
317 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000318 if (mDownloadManager == null)
319 {
320 downloading = false;
321 }
322 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100323 }
324 }
325 }).start();
326 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100327
Jose Pascoal810950b2014-10-09 17:16:08 +0100328 private void setupLayout(View view)
329 {
330 mDownloadVersionName = (TextView) view.findViewById(R.id.download_version_name_text);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100331
Jose Pascoal810950b2014-10-09 17:16:08 +0100332 // download in progress group
333 mVersionDownloadingGroup = (LinearLayout) view.findViewById(R.id.version_downloading_group);
334 mVersionDownloadProgressBar = (ProgressBar) view.findViewById(R.id.version_download_progress_bar);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100335
Jose Pascoal810950b2014-10-09 17:16:08 +0100336 // restart group
337 mVersionInstallGroup = (LinearLayout) view.findViewById(R.id.version_install_group);
338 mRestartButton = (Button) view.findViewById(R.id.restart_button);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100339
Jose Pascoal810950b2014-10-09 17:16:08 +0100340 mCancelButton = (Button) view.findViewById(R.id.cancel_button);
341 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100342
Jose Pascoal810950b2014-10-09 17:16:08 +0100343 @Override
344 public void onResume()
345 {
346 super.onResume();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100347
Jose Pascoal810950b2014-10-09 17:16:08 +0100348 setupInstallationReceivers();
349 registerDownloadBroadCastReceiver();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100350
Tiago Costa73eda412014-11-18 14:37:42 +0000351 registerNetworkStatusBoradcastReceiver();
352
Jose Pascoal8ed98d62014-10-09 20:41:11 +0100353 updateHeader();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000354
Jose Pascoal02d86242014-12-17 18:50:08 +0000355 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
356 if (item != null)
Jose Pascoal1c049e02014-12-17 13:03:09 +0000357 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000358 mDownloadVersionName.setText(mainActivity.getItemName(item));
Tiago Costa198bf3d2014-12-16 15:23:18 +0000359 }
Jose Pascoal1c049e02014-12-17 13:03:09 +0000360
Jose Pascoal810950b2014-10-09 17:16:08 +0100361 toggleDownloadProgressAndRestart();
362 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100363
Tiago Costa73eda412014-11-18 14:37:42 +0000364 private void registerNetworkStatusBoradcastReceiver()
365 {
366 // Setup monitoring for future connectivity status changes
367 if (mNetworkStateReceiver != null)
368 {
369 mNetworkStateReceiver = new BroadcastReceiver()
370 {
371 @Override
372 public void onReceive(Context context, Intent intent)
373 {
374 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false))
375 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000376 abortUpdateProcess();
Tiago Costa73eda412014-11-18 14:37:42 +0000377 }
378 }
379 };
380 }
381
382 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
383 mainActivity.registerReceiver(mNetworkStateReceiver, filter);
384 }
385
386 private void unregisterNetworkStatusBoradcastReceiver()
387 {
388 if (mNetworkStateReceiver != null)
389 {
390 mainActivity.unregisterReceiver(mNetworkStateReceiver);
391
392 mNetworkStateReceiver = null;
393 }
394 }
395
Jose Pascoal810950b2014-10-09 17:16:08 +0100396 @Override
397 public void onPause()
398 {
399 super.onPause();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100400
Jose Pascoal810950b2014-10-09 17:16:08 +0100401 unregisterBroadCastReceiver();
Tiago Costa73eda412014-11-18 14:37:42 +0000402
403 unregisterNetworkStatusBoradcastReceiver();
Jose Pascoal810950b2014-10-09 17:16:08 +0100404 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100405
Jose Pascoal810950b2014-10-09 17:16:08 +0100406 private void setupInstallationReceivers()
407 {
408 mDownloadManager = (DownloadManager) mainActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100409
Jose Pascoal810950b2014-10-09 17:16:08 +0100410 mDownloadBroadCastReceiver = new DownloadBroadCastReceiver();
411 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100412
Jose Pascoal810950b2014-10-09 17:16:08 +0100413 private void registerDownloadBroadCastReceiver()
414 {
415 mainActivity.registerReceiver(mDownloadBroadCastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
416 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100417
Jose Pascoal810950b2014-10-09 17:16:08 +0100418 private void unregisterBroadCastReceiver()
419 {
420 mainActivity.unregisterReceiver(mDownloadBroadCastReceiver);
421 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100422
Jose Pascoal810950b2014-10-09 17:16:08 +0100423 private class DownloadBroadCastReceiver extends BroadcastReceiver
424 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100425
Jose Pascoal810950b2014-10-09 17:16:08 +0100426 @Override
427 public void onReceive(Context context, Intent intent)
428 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100429
Jose Pascoal810950b2014-10-09 17:16:08 +0100430 mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100431
Jose Pascoal810950b2014-10-09 17:16:08 +0100432 updateDownloadFile();
433 }
434 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100435
Jose Pascoal810950b2014-10-09 17:16:08 +0100436 private void updateDownloadFile()
437 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100438
Jose Pascoal810950b2014-10-09 17:16:08 +0100439 long downloadId = mainActivity.getLatestDownloadId();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100440
Jose Pascoal810950b2014-10-09 17:16:08 +0100441 if (downloadId != 0)
442 {
443 DownloadManager.Query query = new DownloadManager.Query();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100444
Jose Pascoal810950b2014-10-09 17:16:08 +0100445 query.setFilterById(downloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100446
Jose Pascoalaa579a82014-11-05 22:17:16 +0000447 Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100448
Jose Pascoalaa579a82014-11-05 22:17:16 +0000449 if (cursor != null && cursor.moveToFirst())
Jose Pascoal810950b2014-10-09 17:16:08 +0100450 {
451 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
452 int status = cursor.getInt(columnIndex);
453
454 switch (status)
455 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000456
Jose Pascoal810950b2014-10-09 17:16:08 +0100457 case DownloadManager.STATUS_SUCCESSFUL:
458 mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
459 toggleDownloadProgressAndRestart();
460 break;
461 case DownloadManager.STATUS_RUNNING:
Tiago Costa7c47e2d2014-11-18 16:50:35 +0000462 case DownloadManager.STATUS_PENDING:
Jose Pascoal810950b2014-10-09 17:16:08 +0100463 startDownloadProgressUpdateThread();
464 break;
465 case DownloadManager.STATUS_FAILED:
466 Resources resources = getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000467 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
468 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100469 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000470 String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000471 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
472 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100473 else
474 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100475 Toast.makeText(mainActivity, resources.getString(R.string.error_downloading), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100476 }
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000477 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100478 break;
479 }
480 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100481 else
482 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000483 abortUpdateProcess();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100484 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100485
Jose Pascoalaa579a82014-11-05 22:17:16 +0000486 if (cursor != null)
487 {
488 cursor.close();
489 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100490 }
491 }
492
493 // ************************************************************************************
494 // PRE INSTALL
495 // ************************************************************************************
496
Jose Pascoal1c049e02014-12-17 13:03:09 +0000497 private void setupPreInstallState()
Tiago Costa198bf3d2014-12-16 15:23:18 +0000498 {
499 Resources resources = mainActivity.getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000500 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
501 if (item != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100502 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000503 File file = new File(getDownloadPath(item));
Jose Pascoal810950b2014-10-09 17:16:08 +0100504
505 if (file.exists())
506 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000507 if (Utils.checkMD5(item.getMd5Sum(), file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100508 {
509 copyUpdateToCache(file);
510 return;
511 }
512 else
513 {
Pedro Arelo773bd822014-10-10 11:57:34 +0100514 Toast.makeText(mainActivity, resources.getString(R.string.invalid_md5_download_message), Toast.LENGTH_LONG).show();
Jose Pascoal810950b2014-10-09 17:16:08 +0100515 removeLastUpdateDownload();
516 }
517 }
518 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100519 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100520
Jose Pascoal810950b2014-10-09 17:16:08 +0100521 // ************************************************************************************
522 // DOWNLOAD UPDATE
523 // ************************************************************************************
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100524
Jose Pascoal810950b2014-10-09 17:16:08 +0100525 public void setupDownloadState()
526 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000527 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Tiago Costa198bf3d2014-12-16 15:23:18 +0000528
Jose Pascoal810950b2014-10-09 17:16:08 +0100529 // setup the download state views
Jose Pascoal1c049e02014-12-17 13:03:09 +0000530 if (item == null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100531 {
532 Resources resources = getResources();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100533
Jose Pascoal810950b2014-10-09 17:16:08 +0100534 // we don't have the lastest.xml so get back to initial state
535 File updateDir = new File(Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100536
Jose Pascoal810950b2014-10-09 17:16:08 +0100537 updateDir.delete();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100538
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000539 abortUpdateProcess();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100540
Jose Pascoal810950b2014-10-09 17:16:08 +0100541 return;
542 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100543
Jose Pascoal810950b2014-10-09 17:16:08 +0100544 // if there is a download ID on the shared preferences
545 if (mLatestUpdateDownloadId == 0)
546 {
547 mLatestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100548
Jose Pascoal810950b2014-10-09 17:16:08 +0100549 // invalid download Id
550 if (mLatestUpdateDownloadId == 0)
551 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000552 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100553 return;
554 }
555 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100556
Jose Pascoal810950b2014-10-09 17:16:08 +0100557 updateDownloadFile();
558 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100559
Jose Pascoal810950b2014-10-09 17:16:08 +0100560 private void startPreInstall()
561 {
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000562 Resources resources = getResources();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000563 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
564
Jose Pascoal02d86242014-12-17 18:50:08 +0000565 File f = new File("/" + resources.getString(R.string.recoveryCachePath) + "/" + Utils.getFilenameFromDownloadableItem(item));
Filipe Gonçalves72dac942014-12-15 18:05:58 +0000566 if (!f.exists())
567 {
568 abortUpdateProcess();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000569 }
570 else if (item != null && RootTools.isAccessGiven())
Jose Pascoal810950b2014-10-09 17:16:08 +0100571 {
572 // set the command for the recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100573 try
574 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100575
Jose Pascoal810950b2014-10-09 17:16:08 +0100576 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100577
Jose Pascoal810950b2014-10-09 17:16:08 +0100578 Shell.runRootCommand(new CommandCapture(0, "rm -f /cache/recovery/extendedcommand"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100579
Jose Pascoal810950b2014-10-09 17:16:08 +0100580 Shell.runRootCommand(new CommandCapture(0, "echo '--wipe_cache' >> /cache/recovery/command"));
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100581
Jose Pascoal0a5be012014-11-17 16:55:40 +0000582 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100583 {
584 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
Jose Pascoal02d86242014-12-17 18:50:08 +0000585 + Utils.getFilenameFromDownloadableItem(item) + "' >> /cache/recovery/command"));
Jose Pascoal810950b2014-10-09 17:16:08 +0100586 }
587 else
588 {
589 Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
Jose Pascoal02d86242014-12-17 18:50:08 +0000590 + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item) + "' >> /cache/recovery/command"));
Jose Pascoal810950b2014-10-09 17:16:08 +0100591 }
592 } catch (IOException e)
593 {
594 // TODO Auto-generated catch block
595 e.printStackTrace();
596 } catch (NotFoundException 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 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100609
Tiago Costa87925fe2014-12-02 17:57:51 +0000610 SharedPreferences sharedPreferences = getActivity().getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
Jose Pascoal1c049e02014-12-17 13:03:09 +0000611
Tiago Costa87925fe2014-12-02 17:57:51 +0000612 Editor editor = sharedPreferences.edit();
613 editor.remove(UpdaterService.PREFERENCE_REINSTALL_GAPPS);
Tiago Costa87925fe2014-12-02 17:57:51 +0000614 editor.commit();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100615
Jose Pascoal0a5be012014-11-17 16:55:40 +0000616 if (Utils.hasUnifiedPartition(resources))
Jose Pascoal810950b2014-10-09 17:16:08 +0100617 {
618 removeLastUpdateDownload();
619 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100620
Jose Pascoal810950b2014-10-09 17:16:08 +0100621 // remove the update files from data
622 removeUpdateFilesFromData();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100623
Jose Pascoal810950b2014-10-09 17:16:08 +0100624 // reboot the device into recovery
Jose Pascoal810950b2014-10-09 17:16:08 +0100625 try
626 {
627 mainActivity.updateStatePreference(UpdaterState.NORMAL);
Jose Pascoal02d86242014-12-17 18:50:08 +0000628 mainActivity.clearSelectedItems();
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000629 clearConfigFile();
Jose Pascoal810950b2014-10-09 17:16:08 +0100630 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
631 } catch (IOException e)
632 {
633 // TODO Auto-generated catch block
634 e.printStackTrace();
635 } catch (TimeoutException e)
636 {
637 // TODO Auto-generated catch block
638 e.printStackTrace();
639 } catch (RootDeniedException e)
640 {
641 // TODO Auto-generated catch block
642 e.printStackTrace();
643 }
644 }
645 else
646 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000647 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100648 }
649 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100650
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000651 private void clearConfigFile()
652 {
653 long cfgFile = mainActivity.getConfigFileDownloadIdFromSharedPreference();
654 if (cfgFile != 0 && mDownloadManager != null)
655 {
656 mDownloadManager.remove(cfgFile);
657 }
658 mainActivity.saveConfigFileDownloadId(0);
659 VersionParserHelper.removeConfigFiles(mainActivity);
660 }
661
Jose Pascoal810950b2014-10-09 17:16:08 +0100662 private void copyUpdateToCache(File file)
663 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000664 if (Utils.canCopyToCache(file))
Jose Pascoal810950b2014-10-09 17:16:08 +0100665 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000666 DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
Jose Pascoal733b84e2014-10-17 14:49:02 +0100667 CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
Jose Pascoal1c049e02014-12-17 13:03:09 +0000668 if (item != null)
669 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000670 copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item));
Jose Pascoal1c049e02014-12-17 13:03:09 +0000671 }
672 else
673 {
674 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
675 abortUpdateProcess();
676 }
Jose Pascoal810950b2014-10-09 17:16:08 +0100677 }
678 else
679 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000680 if (Utils.hasUnifiedPartition(getResources()))
Jose Pascoal810950b2014-10-09 17:16:08 +0100681 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000682 Log.d(TAG, "No space on cache. Defaulting to Sdcard");
683 Toast.makeText(mainActivity, getResources().getString(R.string.no_space_available_cache_message), Toast.LENGTH_LONG).show();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100684
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000685 abortUpdateProcess();
Jose Pascoal810950b2014-10-09 17:16:08 +0100686 }
687 }
688 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100689
Jose Pascoal810950b2014-10-09 17:16:08 +0100690 // ************************************************************************************
691 // Update Removal
692 // ************************************************************************************
693 private void removeUpdateFilesFromData()
694 {
695 try
696 {
697 Shell.runRootCommand(new CommandCapture(0, getResources().getString(R.string.removePlayStoreCommand), getResources().getString(
698 R.string.removeGooglePlusCommand), getResources().getString(R.string.removeSoundSearchCommand), getResources().getString(
699 R.string.removeGmailCommand), getResources().getString(R.string.removePlayServicesCommand), getResources().getString(
700 R.string.removeQuicksearchCommand), getResources().getString(R.string.removeTalkbackCommand), getResources().getString(
701 R.string.removeText2SpeechCommand)));
702 } catch (IOException e)
703 {
704 e.printStackTrace();
705 } catch (TimeoutException e)
706 {
707 e.printStackTrace();
708 } catch (RootDeniedException e)
709 {
710 e.printStackTrace();
711 }
712 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100713
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000714 public boolean removeLastUpdateDownload()
Jose Pascoal810950b2014-10-09 17:16:08 +0100715 {
716 long latestUpdateDownloadId = mainActivity.getLatestUpdateDownloadIdFromSharedPreference();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000717 if (latestUpdateDownloadId != 0 && mDownloadManager != null)
Jose Pascoal810950b2014-10-09 17:16:08 +0100718 {
719 // residue download ID
720 mDownloadManager.remove(latestUpdateDownloadId);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100721
Jose Pascoal810950b2014-10-09 17:16:08 +0100722 mainActivity.resetLastUpdateDownloadId();
723 }
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000724 return latestUpdateDownloadId != 0; // report if something was canceled
Jose Pascoal810950b2014-10-09 17:16:08 +0100725 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100726
Jose Pascoal810950b2014-10-09 17:16:08 +0100727 private class CopyFileToCacheTask extends AsyncTask<String, Integer, Integer>
728 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100729
Jose Pascoal810950b2014-10-09 17:16:08 +0100730 ProgressDialog mProgress;
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100731
Jose Pascoal810950b2014-10-09 17:16:08 +0100732 @Override
733 protected Integer doInBackground(String... params)
734 {
735 // check the correct number of
736 if (params.length != 2)
737 {
738 return -1;
739 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100740
Jose Pascoal810950b2014-10-09 17:16:08 +0100741 String originalFilePath = params[0];
742 String destinyFilePath = params[1];
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100743
Jose Pascoal810950b2014-10-09 17:16:08 +0100744 if (RootTools.isAccessGiven())
745 {
Jose Pascoal0a5be012014-11-17 16:55:40 +0000746 Utils.clearCache();
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100747
Jose Pascoal810950b2014-10-09 17:16:08 +0100748 File otaFilePath = new File(originalFilePath);
749 File otaFileCache = new File(destinyFilePath);
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100750
Jose Pascoal810950b2014-10-09 17:16:08 +0100751 if (!otaFileCache.exists())
752 {
753 RootTools.copyFile(otaFilePath.getPath(), otaFileCache.getPath(), false, false);
754 }
755 }
Jose Pascoal733b84e2014-10-17 14:49:02 +0100756 else
757 {
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000758 abortUpdateProcess();
Jose Pascoal733b84e2014-10-17 14:49:02 +0100759 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100760
Jose Pascoal810950b2014-10-09 17:16:08 +0100761 return 1;
762 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100763
Jose Pascoal810950b2014-10-09 17:16:08 +0100764 protected void onProgressUpdate(Integer... progress)
765 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100766
Jose Pascoal810950b2014-10-09 17:16:08 +0100767 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100768
Jose Pascoal810950b2014-10-09 17:16:08 +0100769 protected void onPreExecute()
770 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100771
Jose Pascoal810950b2014-10-09 17:16:08 +0100772 if (mProgress == null)
773 {
774 String title = "";
Pedro Arelo773bd822014-10-10 11:57:34 +0100775 String message = mainActivity.getResources().getString(R.string.please_be_patient);
Jose Pascoal810950b2014-10-09 17:16:08 +0100776 mProgress = ProgressDialog.show(mainActivity, title, message, true, false);
777 }
778 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100779
Jose Pascoal810950b2014-10-09 17:16:08 +0100780 protected void onPostExecute(Integer result)
781 {
782 // disable the spinner
783 if (mProgress != null)
784 {
785 mProgress.dismiss();
786 mProgress = null;
787 }
788 }
789 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100790
Jose Pascoal1c049e02014-12-17 13:03:09 +0000791 private String getDownloadPath(DownloadableItem item)
Jose Pascoal810950b2014-10-09 17:16:08 +0100792 {
793 Resources resources = mainActivity.getResources();
Jose Pascoal02d86242014-12-17 18:50:08 +0000794 return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000795 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100796
Filipe Gonçalvescd0f33d2014-12-15 15:05:15 +0000797 public void abortUpdateProcess()
Jose Pascoalb397dc62014-10-13 19:26:58 +0100798 {
Tiago Costa73eda412014-11-18 14:37:42 +0000799 removeLastUpdateDownload();
800
801 mainActivity.runOnUiThread(new Runnable()
Filipe Gonçalvesd28bd622014-11-05 11:40:12 +0000802 {
Tiago Costa73eda412014-11-18 14:37:42 +0000803 @Override
804 public void run()
Jose Pascoalaa579a82014-11-05 22:17:16 +0000805 {
Tiago Costa73eda412014-11-18 14:37:42 +0000806 mainActivity.removeLastFragment(false);
807 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
808 {
809 mainActivity.changeState(UpdaterState.NORMAL);
Jose Pascoal02d86242014-12-17 18:50:08 +0000810 mainActivity.clearSelectedItems();
Tiago Costa73eda412014-11-18 14:37:42 +0000811 }
812 else
813 {
814 mainActivity.updateStatePreference(UpdaterState.NORMAL);
815 }
Jose Pascoalaa579a82014-11-05 22:17:16 +0000816 }
Tiago Costa73eda412014-11-18 14:37:42 +0000817 });
Jose Pascoalb397dc62014-10-13 19:26:58 +0100818 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100819}