blob: cbbbf62f4fcff6535301c115fe335efa2ba76081 [file] [log] [blame]
Jose Pascoal91aff132014-10-02 17:19:47 +01001package com.fairphone.updater;
2
Jose Pascoale4c48e32014-10-03 19:55:39 +01003import java.util.List;
Jose Pascoale4c48e32014-10-03 19:55:39 +01004
Jose Pascoal2666b892014-10-02 21:05:08 +01005import android.content.SharedPreferences;
6import android.content.SharedPreferences.Editor;
7import android.content.res.Resources;
8import android.os.Build;
Jose Pascoal91aff132014-10-02 17:19:47 +01009import android.os.Bundle;
10import android.support.v4.app.Fragment;
11import android.support.v4.app.FragmentActivity;
Jose Pascoal3bc3a842014-10-16 19:03:21 +010012import android.support.v4.app.FragmentManager;
Jose Pascoal91aff132014-10-02 17:19:47 +010013import android.support.v4.app.FragmentTransaction;
Jose Pascoal2666b892014-10-02 21:05:08 +010014import android.util.Log;
15import android.view.View;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010016import android.view.View.OnClickListener;
Jose Pascoal2666b892014-10-02 21:05:08 +010017import android.widget.TextView;
18import android.widget.Toast;
Jose Pascoal91aff132014-10-02 17:19:47 +010019
Jose Pascoal2666b892014-10-02 21:05:08 +010020import com.crashlytics.android.Crashlytics;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010021import com.fairphone.updater.data.UpdaterData;
22import com.fairphone.updater.data.Version;
23import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010024import com.fairphone.updater.fragments.DownloadAndRestartFragment;
Jose Pascoal91aff132014-10-02 17:19:47 +010025import com.fairphone.updater.fragments.MainFragment;
Jose Pascoale4c48e32014-10-03 19:55:39 +010026import com.fairphone.updater.tools.Utils;
Jose Pascoal91aff132014-10-02 17:19:47 +010027
Jose Pascoal7bf83a02014-10-13 18:30:18 +010028public class FairphoneUpdater extends FragmentActivity
Pedro Arelo6d2bac92014-10-09 16:48:27 +010029{
Jose Pascoal91aff132014-10-02 17:19:47 +010030
Jose Pascoal7bf83a02014-10-13 18:30:18 +010031 private static final String TAG = FairphoneUpdater.class.getSimpleName();
Jose Pascoal2666b892014-10-02 21:05:08 +010032
Pedro Arelo6d2bac92014-10-09 16:48:27 +010033 public static final String FAIRPHONE_UPDATER_NEW_VERSION_RECEIVED = "FairphoneUpdater.NEW.VERSION.RECEIVED";
Jose Pascoal2666b892014-10-02 21:05:08 +010034
Pedro Arelo6d2bac92014-10-09 16:48:27 +010035 public static final String PREFERENCE_CURRENT_UPDATER_STATE = "CurrentUpdaterState";
Jose Pascoal2666b892014-10-02 21:05:08 +010036
Pedro Arelo6d2bac92014-10-09 16:48:27 +010037 private static final String PREFERENCE_DOWNLOAD_ID = "LatestUpdateDownloadId";
Jose Pascoal2666b892014-10-02 21:05:08 +010038
Pedro Arelo6d2bac92014-10-09 16:48:27 +010039 public static final String FAIRPHONE_UPDATER_PREFERENCES = "FairphoneUpdaterPreferences";
Jose Pascoal2666b892014-10-02 21:05:08 +010040
Pedro Arelo6d2bac92014-10-09 16:48:27 +010041 public static final String PREFERENCE_SELECTED_VERSION_NUMBER = "SelectedVersionNumber";
Jose Pascoal2666b892014-10-02 21:05:08 +010042
Pedro Arelo6d2bac92014-10-09 16:48:27 +010043 public static final String PREFERENCE_SELECTED_VERSION_TYPE = "SelectedVersionImageType";
Jose Pascoal2666b892014-10-02 21:05:08 +010044
Pedro Arelo6d2bac92014-10-09 16:48:27 +010045 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_FAILED = "FairphoneUpdater.Config.File.Download.FAILED";
Jose Pascoal2666b892014-10-02 21:05:08 +010046
Pedro Arelo6d2bac92014-10-09 16:48:27 +010047 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_LINK = "FairphoneUpdater.ConfigFile.Download.LINK";
Jose Pascoal2666b892014-10-02 21:05:08 +010048
Pedro Arelo6d2bac92014-10-09 16:48:27 +010049 public static enum UpdaterState
50 {
51 NORMAL, DOWNLOAD, PREINSTALL
52 };
Jose Pascoal2666b892014-10-02 21:05:08 +010053
Pedro Arelo6d2bac92014-10-09 16:48:27 +010054 private Version mDeviceVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010055 private Version mLatestVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010056 private Version mSelectedVersion;
Jose Pascoal2666b892014-10-02 21:05:08 +010057
Pedro Arelo6d2bac92014-10-09 16:48:27 +010058 private UpdaterState mCurrentState;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010059 private SharedPreferences mSharedPreferences;
Jose Pascoal2666b892014-10-02 21:05:08 +010060
Pedro Arelo6d2bac92014-10-09 16:48:27 +010061 private long mLatestUpdateDownloadId;
Jose Pascoal2666b892014-10-02 21:05:08 +010062
Pedro Arelo6d2bac92014-10-09 16:48:27 +010063 public static boolean DEV_MODE_ENABLED;
64 private int mIsDevModeCounter;
Jose Pascoal2666b892014-10-02 21:05:08 +010065
Pedro Arelo6d2bac92014-10-09 16:48:27 +010066 private TextView headerMainFairphoneText;
67 private TextView headerMainAndroidText;
68 private TextView headerFairphoneText;
69 private TextView headerAndroidText;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010070 private TextView headerOtherOSText;
Jose Pascoal2666b892014-10-02 21:05:08 +010071
Pedro Arelo6d2bac92014-10-09 16:48:27 +010072 public static enum HeaderType
73 {
Pedro Arelocb88f672014-10-09 17:41:02 +010074 MAIN_FAIRPHONE, MAIN_ANDROID, FAIRPHONE, ANDROID, OTHER_OS
Pedro Arelo6d2bac92014-10-09 16:48:27 +010075 };
Jose Pascoal2666b892014-10-02 21:05:08 +010076
Pedro Arelo6d2bac92014-10-09 16:48:27 +010077 @Override
78 protected void onCreate(Bundle savedInstanceState)
79 {
80 super.onCreate(savedInstanceState);
81 setContentView(R.layout.activity_updater);
Jose Pascoal2666b892014-10-02 21:05:08 +010082
Pedro Arelo6d2bac92014-10-09 16:48:27 +010083 Crashlytics.start(this);
Jose Pascoale4c48e32014-10-03 19:55:39 +010084
Pedro Arelo6d2bac92014-10-09 16:48:27 +010085 DEV_MODE_ENABLED = false;
86 mIsDevModeCounter = 10;
Jose Pascoal2666b892014-10-02 21:05:08 +010087
Pedro Arelo6d2bac92014-10-09 16:48:27 +010088 isDeviceSupported();
89 mSharedPreferences = getSharedPreferences(FAIRPHONE_UPDATER_PREFERENCES, MODE_PRIVATE);
Jose Pascoal2666b892014-10-02 21:05:08 +010090
Pedro Arelo6d2bac92014-10-09 16:48:27 +010091 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
Jose Pascoal2666b892014-10-02 21:05:08 +010092
Pedro Arelo6d2bac92014-10-09 16:48:27 +010093 // get system data
94 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
Jose Pascoal2666b892014-10-02 21:05:08 +010095
Pedro Arelo6d2bac92014-10-09 16:48:27 +010096 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : new Version();
Jose Pascoal2666b892014-10-02 21:05:08 +010097
Pedro Arelo6d2bac92014-10-09 16:48:27 +010098 getSelectedVersionFromSharedPreferences();
Jose Pascoal2666b892014-10-02 21:05:08 +010099
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100100 // check current state
101 mCurrentState = getCurrentUpdaterState();
Jose Pascoal2666b892014-10-02 21:05:08 +0100102
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100103 initHeaderViews();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100104
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100105 setupFragments(savedInstanceState);
106 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100107
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100108 private void isDeviceSupported()
109 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100110
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100111 Resources resources = getResources();
112 String[] suportedDevices = resources.getString(R.string.supportedDevices).split(";");
113 String modelWithoutSpaces = Build.MODEL.replaceAll("\\s", "");
114 for (String device : suportedDevices)
115 {
116 if (modelWithoutSpaces.equalsIgnoreCase(device))
117 {
118 return;
119 }
120 }
Pedro Arelo773bd822014-10-10 11:57:34 +0100121 Toast.makeText(this, R.string.device_not_supported_message, Toast.LENGTH_LONG).show();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100122 finish();
123 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100124
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100125 protected void getSelectedVersionFromSharedPreferences()
126 {
127 String versionImageType = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_TYPE, "");
128 int versionNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0);
129 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
130 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100131
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100132 public UpdaterState getCurrentUpdaterState()
133 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100134
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100135 String currentState = getStringPreference(PREFERENCE_CURRENT_UPDATER_STATE);
Jose Pascoal2666b892014-10-02 21:05:08 +0100136
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100137 if (currentState == null || currentState.isEmpty())
138 {
139 currentState = UpdaterState.NORMAL.name();
Jose Pascoal2666b892014-10-02 21:05:08 +0100140
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100141 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100142
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100143 editor.putString(currentState, currentState);
Jose Pascoal2666b892014-10-02 21:05:08 +0100144
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100145 editor.commit();
146 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100147
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100148 return UpdaterState.valueOf(currentState);
149 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100150
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100151 public String getStringPreference(String key)
152 {
153 return mSharedPreferences.getString(key, null);
154 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100155
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100156 public long getLongPreference(String key)
157 {
158 return mSharedPreferences.getLong(key, 0);
159 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100160
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100161 public boolean getBooleanPreference(String key)
162 {
163 return mSharedPreferences.getBoolean(key, false);
164 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100165
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100166 public void savePreference(String key, String value)
167 {
168 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100169
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100170 editor.putString(key, value);
Jose Pascoal2666b892014-10-02 21:05:08 +0100171
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100172 editor.commit();
173 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100174
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100175 public void savePreference(String key, boolean value)
176 {
177 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100178
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100179 editor.putBoolean(key, value);
Jose Pascoal2666b892014-10-02 21:05:08 +0100180
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100181 editor.commit();
182 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100183
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100184 public void savePreference(String key, long value)
185 {
186 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100187
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100188 editor.putLong(key, value);
Jose Pascoal2666b892014-10-02 21:05:08 +0100189
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100190 editor.commit();
191 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100192
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100193 private void initHeaderViews()
194 {
195 headerMainFairphoneText = (TextView) findViewById(R.id.header_main_fairphone_text);
196 headerMainAndroidText = (TextView) findViewById(R.id.header_main_android_text);
197 headerFairphoneText = (TextView) findViewById(R.id.header_fairphone_text);
198 headerAndroidText = (TextView) findViewById(R.id.header_android_text);
199 headerOtherOSText = (TextView) findViewById(R.id.header_other_os_text);
Jose Pascoal2666b892014-10-02 21:05:08 +0100200
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100201 OnClickListener headerBackPressListener = new OnClickListener()
202 {
203 @Override
204 public void onClick(View v)
205 {
206 onBackPressed();
207 }
208 };
Jose Pascoal2666b892014-10-02 21:05:08 +0100209
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100210 headerFairphoneText.setOnClickListener(headerBackPressListener);
211 headerAndroidText.setOnClickListener(headerBackPressListener);
212 headerOtherOSText.setOnClickListener(headerBackPressListener);
213 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100214
Jose Pascoalb397dc62014-10-13 19:26:58 +0100215 @Override
216 public void onBackPressed()
217 {
218 Fragment fragment = getTopFragment();
219 if (fragment != null && fragment instanceof DownloadAndRestartFragment && !getCurrentUpdaterState().equals(UpdaterState.NORMAL))
220 {
221 ((DownloadAndRestartFragment) fragment).abortUpdateProccess();
222 }
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100223 else if (fragment != null && fragment instanceof MainFragment)
224 {
225 clearBackStack();
226 finish();
227 }
Jose Pascoalb397dc62014-10-13 19:26:58 +0100228 else
229 {
230 super.onBackPressed();
231 }
232 }
233
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100234 public void updateHeader(HeaderType type, String headerText)
235 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100236
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100237 switch (type)
238 {
239 case FAIRPHONE:
240 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100241 headerMainAndroidText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100242 headerFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100243 headerAndroidText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100244 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal2666b892014-10-02 21:05:08 +0100245
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100246 headerFairphoneText.setText(headerText);
247 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100248
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100249 case ANDROID:
250 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100251 headerMainAndroidText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100252 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100253 headerAndroidText.setVisibility(View.VISIBLE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100254 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal91aff132014-10-02 17:19:47 +0100255
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100256 headerAndroidText.setText(headerText);
257 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100258
Pedro Arelocb88f672014-10-09 17:41:02 +0100259 case OTHER_OS:
260 headerMainFairphoneText.setVisibility(View.GONE);
261 headerMainAndroidText.setVisibility(View.GONE);
262 headerFairphoneText.setVisibility(View.GONE);
263 headerAndroidText.setVisibility(View.GONE);
264 headerOtherOSText.setVisibility(View.VISIBLE);
265
266 headerOtherOSText.setText(headerText);
267 break;
268
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100269 case MAIN_ANDROID:
270 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100271 headerMainAndroidText.setVisibility(View.VISIBLE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100272 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100273 headerAndroidText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100274 headerOtherOSText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100275 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100276
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100277 case MAIN_FAIRPHONE:
278 default:
279 headerMainFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100280 headerMainAndroidText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100281 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100282 headerAndroidText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100283 headerOtherOSText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100284 break;
285 }
286 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100287
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100288 private void setupFragments(Bundle savedInstanceState)
289 {
290 // Check that the activity is using the layout version with
291 // the fragment_container FrameLayout
292 if (findViewById(R.id.fragment_holder) != null)
293 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100294
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100295 // However, if we're being restored from a previous state,
296 // then we don't need to do anything and should return or else
297 // we could end up with overlapping fragments.
298 if (savedInstanceState != null)
299 {
300 return;
301 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100302
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100303 // Create a new Fragment to be placed in the activity layout
304 Fragment firstFragment = getFragmentFromState();
305
306 // In case this activity was started with special instructions from
307 // an
308 // Intent, pass the Intent's extras to the fragment as arguments
309 firstFragment.setArguments(getIntent().getExtras());
310
311 // Add the fragment to the 'fragment_container' FrameLayout
Jose Pascoal799e3942014-11-04 21:12:26 +0000312 FragmentManager fragManager = getSupportFragmentManager();
313 if (fragManager != null)
314 {
315 fragManager.beginTransaction().add(R.id.fragment_holder, firstFragment).commit();
316 }
317 else
318 {
319 Log.e(TAG, "setupFragments - Couldn't get FragmentManager");
320 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100321 }
322 }
323
324 public Fragment getFragmentFromState()
325 {
326 Fragment firstFragment;
327 switch (mCurrentState)
328 {
329 case PREINSTALL:
330 case DOWNLOAD:
331 firstFragment = new DownloadAndRestartFragment();
332 break;
333 case NORMAL:
334 default:
335 firstFragment = new MainFragment();
336 break;
337 }
338 return firstFragment;
339 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100340
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100341 public void changeFragment(Fragment newFragment)
342 {
Jose Pascoal91aff132014-10-02 17:19:47 +0100343
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100344 Fragment topFragment = getTopFragment();
345 if (topFragment == null || (topFragment != null && !newFragment.getClass().equals(topFragment.getClass())))
346 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000347 FragmentManager fragManager = getSupportFragmentManager();
348 if (fragManager != null)
349 {
350 FragmentTransaction transaction = fragManager.beginTransaction();
351 // Replace whatever is in the fragment_container view with this
352 // fragment,
353 // and add the transaction to the back stack so the user can
354 // navigate
355 // back
356 // transaction.setCustomAnimations(R.animator.fade_in_fragment,
357 // R.animator.fade_out_fragment, R.animator.fade_in_fragment,
358 // R.animator.fade_out_fragment);
359 transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
360 transaction.replace(R.id.fragment_holder, newFragment);
361 transaction.addToBackStack(null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100362
Jose Pascoal799e3942014-11-04 21:12:26 +0000363 // Commit the transaction
364 transaction.commit();
365 }
366 else
367 {
368 Log.e(TAG, "changeFragment - Couldn't get FragmentManager");
369 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100370 }
371 }
Jose Pascoal436915f2014-10-08 15:37:26 +0100372
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100373 public void removeLastFragment(boolean forceFinish)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100374 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000375 FragmentManager fragManager = getSupportFragmentManager();
376 if (fragManager != null)
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100377 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000378 boolean popSuccess = fragManager.popBackStackImmediate();
379 if (forceFinish && !popSuccess)
380 {
381 finish();
382 }
383 }
384 else
385 {
386 Log.e(TAG, "removeLastFragment - Couldn't get FragmentManager");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100387 }
388 }
389
390 public int getFragmentCount()
391 {
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100392 int listSize = 0;
Jose Pascoal799e3942014-11-04 21:12:26 +0000393 FragmentManager fragManager = getSupportFragmentManager();
394 if (fragManager != null)
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100395 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000396 List<Fragment> allFragments = fragManager.getFragments();
397 if (allFragments != null)
398 {
399 listSize = allFragments.size();
400 }
401 }
402 else
403 {
404 Log.e(TAG, "getFragmentCount - Couldn't get FragmentManager");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100405 }
406
407 Log.d(TAG, "Fragment list size: " + listSize);
408 return listSize;
409 }
410
411 public int getBackStackSize()
412 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000413 int backStackSize = 0;
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100414 FragmentManager fragManager = getSupportFragmentManager();
Jose Pascoal799e3942014-11-04 21:12:26 +0000415 if (fragManager != null)
416 {
417 backStackSize = fragManager.getBackStackEntryCount();
418 }
419 else
420 {
421 Log.e(TAG, "getBackStackSize - Couldn't get FragmentManager");
422 }
423
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100424 Log.d(TAG, "Back stack size: " + backStackSize);
425 return backStackSize;
426 }
427
428 public void clearBackStack()
429 {
430 FragmentManager fragManager = getSupportFragmentManager();
Jose Pascoal799e3942014-11-04 21:12:26 +0000431 if (fragManager != null)
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100432 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000433 int backStackSize = fragManager.getBackStackEntryCount();
434
435 for (int i = 0; i < backStackSize; i++)
436 {
437 removeLastFragment(false);
438 }
439 }
440 else
441 {
442 Log.e(TAG, "clearBackStack - Couldn't get FragmentManager");
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100443 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100444 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100445
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100446 public Fragment getTopFragment()
447 {
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100448
Jose Pascoal799e3942014-11-04 21:12:26 +0000449 Fragment topFragment = null;
450 FragmentManager fragManager = getSupportFragmentManager();
451 if (fragManager != null)
452 {
453 List<Fragment> allFragments = fragManager.getFragments();
454 if (allFragments != null)
455 {
456 topFragment = allFragments.get(allFragments.size() - 1);
457 }
458 }
459 else
460 {
461 Log.e(TAG, "getTopFragment - Couldn't get FragmentManager");
462 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100463 return topFragment;
464 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100465
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100466 public void onEnableDevMode()
467 {
468 if (!DEV_MODE_ENABLED)
469 {
470 mIsDevModeCounter--;
Jose Pascoal2666b892014-10-02 21:05:08 +0100471
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100472 Log.d(TAG, "Developer mode in " + mIsDevModeCounter + " Clicks...");
Jose Pascoal2666b892014-10-02 21:05:08 +0100473
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100474 if (mIsDevModeCounter <= 0)
475 {
476 DEV_MODE_ENABLED = true;
Jose Pascoal2666b892014-10-02 21:05:08 +0100477
Pedro Arelo773bd822014-10-10 11:57:34 +0100478 Toast.makeText(getApplicationContext(), getResources().getString(R.string.dev_mode_message), Toast.LENGTH_LONG).show();
Jose Pascoal2666b892014-10-02 21:05:08 +0100479
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100480 Log.d(TAG, "Developer mode enabled for this session");
Jose Pascoal2666b892014-10-02 21:05:08 +0100481
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100482 Utils.downloadConfigFile(this);
483 }
484 }
485 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100486
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100487 public boolean isUpdateAvailable()
488 {
489 return mLatestVersion.isNewerVersionThan(mDeviceVersion);
490 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100491
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100492 public String getVersionName(Version version)
493 {
494 String versionName = "";
495 if (version != null)
496 {
497 versionName = version.getImageTypeDescription(getResources()) + " " + version.getName() + " " + version.getBuildNumber();
498 }
499 return versionName;
500 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100501
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100502 public String getDeviceVersionName()
503 {
504 return getVersionName(mDeviceVersion);
505 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100506
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100507 public String getLatestVersionName()
508 {
509 return getVersionName(mLatestVersion);
510 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100511
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100512 public String getSelectedVersionName()
513 {
514 return getVersionName(mSelectedVersion);
515 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100516
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100517 public Version getDeviceVersion()
518 {
519 return mDeviceVersion;
520 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100521
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100522 public Version getLatestVersion()
523 {
524 return mLatestVersion;
525 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100526
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100527 public Version getSelectedVersion()
528 {
529 return mSelectedVersion;
530 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100531
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100532 public HeaderType getHeaderTypeFromImageType(String imageType)
533 {
534 HeaderType type = HeaderType.MAIN_FAIRPHONE;
535 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
536 {
537 type = HeaderType.ANDROID;
538 }
539 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(imageType))
540 {
541 type = HeaderType.FAIRPHONE;
542 }
543 return type;
544 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100545
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100546 public void setSelectedVersion(Version selectedVersion)
547 {
548 int versionNumber = selectedVersion != null ? selectedVersion.getNumber() : 0;
549 String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
Jose Pascoale4c48e32014-10-03 19:55:39 +0100550
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100551 Editor editor = mSharedPreferences.edit();
552 editor.putInt(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
553 editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
554 editor.commit();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100555
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100556 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
557 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100558
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100559 public void resetLastUpdateDownloadId()
560 {
561 mLatestUpdateDownloadId = 0;
562 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
563 setSelectedVersion(null);
564 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100565
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100566 private Version getLatestVersionFromConfig()
567 {
568 Version latest = UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType());
569 return latest;
570 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100571
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100572 public void updateLatestVersionFromConfig()
573 {
574 mLatestVersion = getLatestVersionFromConfig();
575 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100576
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100577 @Override
578 protected void onResume()
579 {
580 super.onResume();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100581
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100582 // check current state
583 mCurrentState = getCurrentUpdaterState();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100584
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100585 if (mCurrentState == UpdaterState.NORMAL)
586 {
587 Utils.startUpdaterService(this, true);
588 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100589
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100590 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
591 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
592 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : new Version();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100593
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100594 getSelectedVersionFromSharedPreferences();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100595
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100596 changeFragment(getFragmentFromState());
597 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100598
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100599 public void changeState(UpdaterState newState)
600 {
601 updateStatePreference(newState);
602 changeFragment(getFragmentFromState());
603 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100604
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100605 public void updateStatePreference(UpdaterState newState)
606 {
607 mCurrentState = newState;
Jose Pascoale4c48e32014-10-03 19:55:39 +0100608
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100609 Editor editor = mSharedPreferences.edit();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100610
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100611 editor.putString(PREFERENCE_CURRENT_UPDATER_STATE, mCurrentState.name());
Jose Pascoale4c48e32014-10-03 19:55:39 +0100612
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100613 editor.commit();
614 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100615
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100616 @Override
617 protected void onStop()
618 {
619 super.onStop();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100620
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100621 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100622
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100623 public long getLatestDownloadId()
624 {
625 return mLatestUpdateDownloadId;
626 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100627
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100628 public long getLatestUpdateDownloadIdFromSharedPreference()
629 {
630 if (mLatestUpdateDownloadId == 0)
631 {
632 mLatestUpdateDownloadId = getLongPreference(PREFERENCE_DOWNLOAD_ID);
633 }
634 return mLatestUpdateDownloadId;
635 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100636
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100637 public void saveLatestUpdateDownloadId(long latestUpdateDownloadId)
638 {
639 mLatestUpdateDownloadId = latestUpdateDownloadId;
640 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
641 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100642}