blob: 945c5dc16482cb79c110d911ef25e4136fa03f65 [file] [log] [blame]
Jose Pascoal91aff132014-10-02 17:19:47 +01001package com.fairphone.updater;
2
Filipe Gonçalves72817782015-03-19 15:29:05 +00003import android.app.AlertDialog;
Filipe Gonçalves72817782015-03-19 15:29:05 +00004import android.content.DialogInterface;
Jose Pascoalad4ea572014-12-16 20:31:48 +00005import android.content.Intent;
Jose Pascoal2666b892014-10-02 21:05:08 +01006import android.content.SharedPreferences;
7import android.content.SharedPreferences.Editor;
Filipe Gonçalves72817782015-03-19 15:29:05 +00008import android.content.res.Resources;
Jose Pascoal79357c52015-03-12 20:14:29 +00009import android.net.Uri;
Jose Pascoal91aff132014-10-02 17:19:47 +010010import android.os.Bundle;
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +000011import android.provider.Settings;
Jose Pascoal91aff132014-10-02 17:19:47 +010012import android.support.v4.app.Fragment;
13import android.support.v4.app.FragmentActivity;
Jose Pascoal3bc3a842014-10-16 19:03:21 +010014import android.support.v4.app.FragmentManager;
Jose Pascoal91aff132014-10-02 17:19:47 +010015import android.support.v4.app.FragmentTransaction;
Jose Pascoalaa579a82014-11-05 22:17:16 +000016import android.text.TextUtils;
Jose Pascoal2666b892014-10-02 21:05:08 +010017import android.util.Log;
18import android.view.View;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010019import android.view.View.OnClickListener;
Jose Pascoalc172d892014-11-17 17:36:12 +000020import android.widget.ImageButton;
Jose Pascoal2666b892014-10-02 21:05:08 +010021import android.widget.TextView;
22import android.widget.Toast;
Jose Pascoal91aff132014-10-02 17:19:47 +010023
Jose Pascoal2666b892014-10-02 21:05:08 +010024import com.crashlytics.android.Crashlytics;
Jose Pascoal02d86242014-12-17 18:50:08 +000025import com.fairphone.updater.data.DownloadableItem;
Tiago Costa3add03e2014-12-16 12:05:23 +000026import com.fairphone.updater.data.Store;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010027import com.fairphone.updater.data.UpdaterData;
28import com.fairphone.updater.data.Version;
29import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010030import com.fairphone.updater.fragments.DownloadAndRestartFragment;
Tiago Costa3855faa2014-11-14 17:55:05 +000031import com.fairphone.updater.fragments.InfoPopupDialog;
Jose Pascoal91aff132014-10-02 17:19:47 +010032import com.fairphone.updater.fragments.MainFragment;
Tiago Costadaaa32c2015-01-08 12:12:24 +000033import com.fairphone.updater.fragments.VersionDetailFragment;
Tiago Costa3855faa2014-11-14 17:55:05 +000034import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
Jose Pascoalad4ea572014-12-16 20:31:48 +000035import com.fairphone.updater.gappsinstaller.GappsInstallerHelper;
Jose Pascoale4c48e32014-10-03 19:55:39 +010036import com.fairphone.updater.tools.Utils;
Jose Pascoal91aff132014-10-02 17:19:47 +010037
Jose Pascoal7bf83a02014-10-13 18:30:18 +010038public class FairphoneUpdater extends FragmentActivity
Pedro Arelo6d2bac92014-10-09 16:48:27 +010039{
Jose Pascoal91aff132014-10-02 17:19:47 +010040
Jose Pascoal7bf83a02014-10-13 18:30:18 +010041 private static final String TAG = FairphoneUpdater.class.getSimpleName();
Jose Pascoal2666b892014-10-02 21:05:08 +010042
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +000043 private static final String CRASHLYTICS_OPT_IN = "crashlytics_opt_in"; // IMPORTANT: keep synced with Settings.Global.CRASHLYTICS_OPT_IN
44
Pedro Arelo6d2bac92014-10-09 16:48:27 +010045 public static final String FAIRPHONE_UPDATER_NEW_VERSION_RECEIVED = "FairphoneUpdater.NEW.VERSION.RECEIVED";
Jose Pascoal2666b892014-10-02 21:05:08 +010046
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000047 private static final String PREFERENCE_FIRST_TIME_ANDROID = "FirstTimeAndroid";
Jose Pascoal02d86242014-12-17 18:50:08 +000048
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000049 private static final String PREFERENCE_FIRST_TIME_FAIRPHONE = "FirstTimeFairphone";
Jose Pascoal02d86242014-12-17 18:50:08 +000050
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000051 private static final String PREFERENCE_FIRST_TIME_APP_STORE = "FirstTimeAppStore";
Tiago Costadaaa32c2015-01-08 12:12:24 +000052
Jose Pascoal85b803b2015-03-19 12:23:11 +000053 public static final String PREFERENCE_CURRENT_UPDATER_STATE = "CurrentUpdaterState";
Jose Pascoal2666b892014-10-02 21:05:08 +010054
Pedro Arelo6d2bac92014-10-09 16:48:27 +010055 private static final String PREFERENCE_DOWNLOAD_ID = "LatestUpdateDownloadId";
Jose Pascoal2666b892014-10-02 21:05:08 +010056
Pedro Arelo6d2bac92014-10-09 16:48:27 +010057 public static final String FAIRPHONE_UPDATER_PREFERENCES = "FairphoneUpdaterPreferences";
Jose Pascoal2666b892014-10-02 21:05:08 +010058
Jose Pascoal85b803b2015-03-19 12:23:11 +000059 public static final String PREFERENCE_SELECTED_VERSION_NUMBER = "SelectedVersionNumber";
Jose Pascoal2666b892014-10-02 21:05:08 +010060
Jose Pascoal85b803b2015-03-19 12:23:11 +000061 public static final String PREFERENCE_SELECTED_VERSION_TYPE = "SelectedVersionImageType";
Jose Pascoal2666b892014-10-02 21:05:08 +010062
Pedro Arelo6d2bac92014-10-09 16:48:27 +010063 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_FAILED = "FairphoneUpdater.Config.File.Download.FAILED";
Jose Pascoal2666b892014-10-02 21:05:08 +010064
Pedro Arelo6d2bac92014-10-09 16:48:27 +010065 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_LINK = "FairphoneUpdater.ConfigFile.Download.LINK";
Jose Pascoal02d86242014-12-17 18:50:08 +000066
Jose Pascoalad4ea572014-12-16 20:31:48 +000067 public static final String PREFERENCE_SELECTED_STORE_NUMBER = "SelectedStoreNumber";
Filipe Gonçalvesafeac2c2015-01-27 17:49:53 +000068
69 public static final String PREFERENCE_OTA_DOWNLOAD_URL = "OtaDownloadUrl";
Jose Pascoal87758742015-01-28 20:00:22 +000070
71 private static final String TAG_FIRST_FRAGMENT = "FIRST_FRAGMENT";
Jose Pascoal79357c52015-03-12 20:14:29 +000072 private String mZipPath;
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +000073 private AlertDialog wifiOffDialog;
Filipe Gonçalvesafeac2c2015-01-27 17:49:53 +000074
Jose Pascoal2666b892014-10-02 21:05:08 +010075
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +000076 public static enum UpdaterState
Pedro Arelo6d2bac92014-10-09 16:48:27 +010077 {
Jose Pascoal79357c52015-03-12 20:14:29 +000078 NORMAL, DOWNLOAD, PREINSTALL, ZIP_INSTALL
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000079 }
Jose Pascoal2666b892014-10-02 21:05:08 +010080
Pedro Arelo6d2bac92014-10-09 16:48:27 +010081 private Version mDeviceVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010082 private Version mLatestVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010083 private Version mSelectedVersion;
Jose Pascoal2666b892014-10-02 21:05:08 +010084
Pedro Arelo6d2bac92014-10-09 16:48:27 +010085 private UpdaterState mCurrentState;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010086 private SharedPreferences mSharedPreferences;
Jose Pascoal2666b892014-10-02 21:05:08 +010087
Pedro Arelo6d2bac92014-10-09 16:48:27 +010088 private long mLatestUpdateDownloadId;
Jose Pascoal2666b892014-10-02 21:05:08 +010089
Pedro Arelo6d2bac92014-10-09 16:48:27 +010090 public static boolean DEV_MODE_ENABLED;
Filipe Gonçalves825414a2015-01-26 14:52:48 +000091 public static boolean BETA_MODE_ENABLED;
Filipe72b5a7f2015-09-01 08:59:54 +000092 public static String otaDevDownloadUrl = "";
Jose Pascoal2666b892014-10-02 21:05:08 +010093
Pedro Arelo6d2bac92014-10-09 16:48:27 +010094 private TextView headerMainFairphoneText;
95 private TextView headerMainAndroidText;
96 private TextView headerFairphoneText;
97 private TextView headerAndroidText;
Tiago Costa6d360e22014-12-15 14:32:51 +000098 private TextView headerAppStoreText;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010099 private TextView headerOtherOSText;
Jose Pascoalc172d892014-11-17 17:36:12 +0000100 private ImageButton headerFairphoneInfoButton;
101 private ImageButton headerAndroidInfoButton;
Jose Pascoal02d86242014-12-17 18:50:08 +0000102
Tiago Costa9008b612014-11-14 18:19:50 +0000103 private boolean mIsFirstTimeAndroid;
104 private boolean mIsFirstTimeFairphone;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000105 private boolean mIsFirstTimeAppStore;
Jose Pascoal02d86242014-12-17 18:50:08 +0000106
Jose Pascoalad4ea572014-12-16 20:31:48 +0000107 private Store mSelectedStore;
Jose Pascoal02d86242014-12-17 18:50:08 +0000108
109 private TextView headerMainAppStoreText;
Filipe72b5a7f2015-09-01 08:59:54 +0000110 public enum HeaderType
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100111 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000112 MAIN_FAIRPHONE, MAIN_ANDROID, MAIN_APP_STORE, FAIRPHONE, ANDROID, OTHER_OS, APP_STORE
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000113 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100114
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100115 @Override
116 protected void onCreate(Bundle savedInstanceState)
117 {
118 super.onCreate(savedInstanceState);
Jose Pascoal79357c52015-03-12 20:14:29 +0000119 mSharedPreferences = getSharedPreferences(FAIRPHONE_UPDATER_PREFERENCES, MODE_PRIVATE);
120
Jose Pascoal87758742015-01-28 20:00:22 +0000121 onNewIntent(getIntent());
122
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100123 setContentView(R.layout.activity_updater);
Jose Pascoal2666b892014-10-02 21:05:08 +0100124
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000125 if (Settings.Global.getInt(getContentResolver(), CRASHLYTICS_OPT_IN, 0) == 1)
126 {
127 Log.d(TAG, "Crash reports active.");
Filipe72b5a7f2015-09-01 08:59:54 +0000128 try {
129 Crashlytics.start(this);
130 } catch(Exception e) {
131 Log.w(TAG, "Crashlytics failed to start");
132 }
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000133 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100134
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100135 DEV_MODE_ENABLED = false;
Jose Pascoal2666b892014-10-02 21:05:08 +0100136
Filipe72b5a7f2015-09-01 08:59:54 +0000137 otaDevDownloadUrl = "";
138
Tiago Costa9008b612014-11-14 18:19:50 +0000139 // update first times
140 mIsFirstTimeAndroid = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_ANDROID, true);
Jose Pascoal02d86242014-12-17 18:50:08 +0000141
Tiago Costa9008b612014-11-14 18:19:50 +0000142 mIsFirstTimeFairphone = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, true);
Jose Pascoal02d86242014-12-17 18:50:08 +0000143
Tiago Costae02ce352015-01-23 15:43:22 +0000144 mIsFirstTimeAppStore = false;//mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_APP_STORE, true);
Tiago Costa1216b102015-03-10 15:48:18 +0000145
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000146 String otaDownloadUrl = getResources().getString(R.string.downloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000147
148 // reset download URL
149 Editor editor = mSharedPreferences.edit();
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000150 editor.putString(PREFERENCE_OTA_DOWNLOAD_URL, otaDownloadUrl);
Filipe72b5a7f2015-09-01 08:59:54 +0000151 editor.apply();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000152
Filipe Gonçalvesad527aa2015-01-12 15:13:35 +0000153 // get system data
154 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
155
156 isDeviceSupported();
157
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000158 setupBetaStatus();
159
Jose Pascoalaa579a82014-11-05 22:17:16 +0000160 // check current state
161 mCurrentState = getCurrentUpdaterState();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000162
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100163 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
Filipe Gonçalves9c8d93a2015-01-28 14:35:49 +0000164 if (!isConfigLoaded) {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000165 mSharedPreferences.edit().remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS).apply();
Filipe Gonçalves9c8d93a2015-01-28 14:35:49 +0000166 }
Filipe Gonçalves42ffc322015-01-28 12:51:14 +0000167
Jose Pascoalaa579a82014-11-05 22:17:16 +0000168 if (mDeviceVersion != null)
169 {
170 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
171 }
172 else
173 {
174 mLatestVersion = null;
175 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100176
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100177 initHeaderViews();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100178
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100179 setupFragments(savedInstanceState);
Filipe72b5a7f2015-09-01 08:59:54 +0000180
181 startService();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100182 }
Filipe Gonçalves72817782015-03-19 15:29:05 +0000183
184
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000185
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000186 void setupBetaStatus()
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000187 {
188 BETA_MODE_ENABLED = mDeviceVersion.getBetaStatus().equals("1");
189 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100190
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100191 private void isDeviceSupported()
192 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000193 if(Utils.isDeviceUnsupported(this))
Jose Pascoalda00b382015-01-20 18:39:28 +0000194 {
Filipe Gonçalvesad527aa2015-01-12 15:13:35 +0000195 Toast.makeText(this, R.string.device_not_supported_message, Toast.LENGTH_LONG).show();
196 finish();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100197 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100198 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100199
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000200 void getSelectedVersionFromSharedPreferences()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100201 {
202 String versionImageType = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_TYPE, "");
Maarten Derksf01fcbf2015-10-16 16:24:05 +0200203 String versionNumber = "0";
204 try {
205 versionNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_NUMBER, "0");
206 } catch (ClassCastException e) {
207 versionNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0));
208 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100209 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
210 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000211
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000212 void getSelectedStoreFromSharedPreferences()
Jose Pascoalad4ea572014-12-16 20:31:48 +0000213 {
Maarten Derksf01fcbf2015-10-16 16:24:05 +0200214 String storeNumber = "-1";
215 try {
216 storeNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_STORE_NUMBER, "-1");
217 } catch (ClassCastException e) {
218 storeNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1));
219 }
Jose Pascoalad4ea572014-12-16 20:31:48 +0000220 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
221 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100222
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100223 public UpdaterState getCurrentUpdaterState()
224 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100225
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000226 String currentState = mSharedPreferences.getString(PREFERENCE_CURRENT_UPDATER_STATE, null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100227
Jose Pascoalaa579a82014-11-05 22:17:16 +0000228 if (TextUtils.isEmpty(currentState))
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100229 {
230 currentState = UpdaterState.NORMAL.name();
Jose Pascoal2666b892014-10-02 21:05:08 +0100231
Jose Pascoalaa579a82014-11-05 22:17:16 +0000232 updateStatePreference(UpdaterState.NORMAL);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100233 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100234
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100235 return UpdaterState.valueOf(currentState);
236 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100237
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000238 long getLongPreference(String key)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100239 {
240 return mSharedPreferences.getLong(key, 0);
241 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100242
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000243 void savePreference(String key, long value)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100244 {
245 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100246
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100247 editor.putLong(key, value);
Jose Pascoal2666b892014-10-02 21:05:08 +0100248
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100249 editor.commit();
250 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100251
Tiago Costa1216b102015-03-10 15:48:18 +0000252 public void changeOTADownloadURL(String newUrl){
Filipe72b5a7f2015-09-01 08:59:54 +0000253 otaDevDownloadUrl = TextUtils.isEmpty(newUrl) ? getResources().getString(R.string.downloadUrl) : newUrl;
Jose Pascoaldca09ac2015-03-11 16:35:06 +0000254
Tiago Costa1216b102015-03-10 15:48:18 +0000255 Editor editor = mSharedPreferences.edit();
Filipe72b5a7f2015-09-01 08:59:54 +0000256 editor.putString(PREFERENCE_OTA_DOWNLOAD_URL, otaDevDownloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000257 editor.commit();
258 }
259
Filipe Gonçalves1e69a0e2015-03-16 17:22:55 +0000260 public void forceConfigDownload(){
Filipe72b5a7f2015-09-01 08:59:54 +0000261 Utils.startUpdaterService(getApplicationContext(), true);
Tiago Costa1216b102015-03-10 15:48:18 +0000262 }
263
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100264 private void initHeaderViews()
265 {
266 headerMainFairphoneText = (TextView) findViewById(R.id.header_main_fairphone_text);
267 headerMainAndroidText = (TextView) findViewById(R.id.header_main_android_text);
Jose Pascoal02d86242014-12-17 18:50:08 +0000268 headerMainAppStoreText = (TextView) findViewById(R.id.header_main_app_store_text);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100269 headerFairphoneText = (TextView) findViewById(R.id.header_fairphone_text);
270 headerAndroidText = (TextView) findViewById(R.id.header_android_text);
271 headerOtherOSText = (TextView) findViewById(R.id.header_other_os_text);
Tiago Costa6d360e22014-12-15 14:32:51 +0000272 headerAppStoreText = (TextView) findViewById(R.id.header_app_store_text);
Jose Pascoal2666b892014-10-02 21:05:08 +0100273
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100274 OnClickListener headerBackPressListener = new OnClickListener()
275 {
276 @Override
277 public void onClick(View v)
278 {
279 onBackPressed();
280 }
281 };
Jose Pascoal2666b892014-10-02 21:05:08 +0100282
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100283 headerFairphoneText.setOnClickListener(headerBackPressListener);
284 headerAndroidText.setOnClickListener(headerBackPressListener);
Tiago Costa6d360e22014-12-15 14:32:51 +0000285 headerAppStoreText.setOnClickListener(headerBackPressListener);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100286 headerOtherOSText.setOnClickListener(headerBackPressListener);
Jose Pascoal02d86242014-12-17 18:50:08 +0000287
288 headerFairphoneInfoButton = (ImageButton) findViewById(R.id.header_fairphone_info_button);
289 headerAndroidInfoButton = (ImageButton) findViewById(R.id.header_android_info_button);
290
Tiago Costa3855faa2014-11-14 17:55:05 +0000291 headerFairphoneInfoButton.setOnClickListener(new OnClickListener()
292 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000293
Tiago Costa3855faa2014-11-14 17:55:05 +0000294 @Override
295 public void onClick(View v)
296 {
297 showInfoPopupDialog(DetailLayoutType.FAIRPHONE);
298 }
299 });
Jose Pascoal02d86242014-12-17 18:50:08 +0000300
Tiago Costa3855faa2014-11-14 17:55:05 +0000301 headerAndroidInfoButton.setOnClickListener(new OnClickListener()
302 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000303
Tiago Costa3855faa2014-11-14 17:55:05 +0000304 @Override
305 public void onClick(View v)
306 {
307 showInfoPopupDialog(DetailLayoutType.ANDROID);
308 }
309 });
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100310 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100311
Tiago Costa3855faa2014-11-14 17:55:05 +0000312 private void showInfoPopupDialog(DetailLayoutType layoutType)
313 {
314 FragmentManager fm = getSupportFragmentManager();
Jose Pascoal02d86242014-12-17 18:50:08 +0000315 InfoPopupDialog popupDialog = new InfoPopupDialog(layoutType);
Tiago Costa3855faa2014-11-14 17:55:05 +0000316 popupDialog.show(fm, layoutType.name());
317 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000318
Jose Pascoalb397dc62014-10-13 19:26:58 +0100319 @Override
320 public void onBackPressed()
321 {
322 Fragment fragment = getTopFragment();
Jose Pascoal40916302015-02-06 18:43:47 +0000323 if (fragment != null && fragment instanceof DownloadAndRestartFragment && getCurrentUpdaterState() != UpdaterState.NORMAL)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100324 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000325 ((DownloadAndRestartFragment) fragment).abortUpdateProcess("");
Jose Pascoalb397dc62014-10-13 19:26:58 +0100326 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000327
328 if (fragment != null && TAG_FIRST_FRAGMENT.equals(fragment.getTag()))
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100329 {
Jose Pascoalbeebb8b2014-12-17 19:28:04 +0000330 clearSelectedItems();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100331 finish();
332 }
Jose Pascoal87758742015-01-28 20:00:22 +0000333
334 super.onBackPressed();
Jose Pascoalb397dc62014-10-13 19:26:58 +0100335 }
336
Tiago Costa3855faa2014-11-14 17:55:05 +0000337 public void updateHeader(HeaderType type, String headerText, boolean showInfo)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100338 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100339
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100340 switch (type)
341 {
342 case FAIRPHONE:
343 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100344 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000345 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100346 headerFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100347 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000348 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100349 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal2666b892014-10-02 21:05:08 +0100350
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100351 headerFairphoneText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000352
353 if (showInfo && mIsFirstTimeFairphone)
354 {
Tiago Costa9008b612014-11-14 18:19:50 +0000355 showInfoPopupDialog(DetailLayoutType.UPDATE_FAIRPHONE);
356 Editor editor = mSharedPreferences.edit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000357
Tiago Costa9008b612014-11-14 18:19:50 +0000358 mIsFirstTimeFairphone = false;
Jose Pascoal02d86242014-12-17 18:50:08 +0000359
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000360 editor.putBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000361 editor.apply();
Tiago Costa9008b612014-11-14 18:19:50 +0000362 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000363
Tiago Costa3855faa2014-11-14 17:55:05 +0000364 headerFairphoneInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
365 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100366 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100367
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100368 case ANDROID:
369 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100370 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000371 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100372 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100373 headerAndroidText.setVisibility(View.VISIBLE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000374 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100375 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal91aff132014-10-02 17:19:47 +0100376
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100377 headerAndroidText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000378
379 if (showInfo && mIsFirstTimeAndroid)
380 {
Tiago Costa9008b612014-11-14 18:19:50 +0000381 showInfoPopupDialog(DetailLayoutType.UPDATE_ANDROID);
382 Editor editor = mSharedPreferences.edit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000383
Tiago Costa9008b612014-11-14 18:19:50 +0000384 mIsFirstTimeAndroid = false;
Jose Pascoal02d86242014-12-17 18:50:08 +0000385
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000386 editor.putBoolean(PREFERENCE_FIRST_TIME_ANDROID, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000387 editor.apply();
Tiago Costa9008b612014-11-14 18:19:50 +0000388 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000389
Tiago Costa3855faa2014-11-14 17:55:05 +0000390 headerFairphoneInfoButton.setVisibility(View.GONE);
391 headerAndroidInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100392 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100393
Tiago Costa6d360e22014-12-15 14:32:51 +0000394 case APP_STORE:
395 headerMainFairphoneText.setVisibility(View.GONE);
396 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000397 headerMainAppStoreText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000398 headerFairphoneText.setVisibility(View.GONE);
399 headerAndroidText.setVisibility(View.GONE);
400 headerAppStoreText.setVisibility(View.VISIBLE);
401 headerOtherOSText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000402 headerAppStoreText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000403
Tiago Costadaaa32c2015-01-08 12:12:24 +0000404 if (showInfo && mIsFirstTimeAppStore)
405 {
406 showInfoPopupDialog(DetailLayoutType.APP_STORE);
407 Editor editor = mSharedPreferences.edit();
408
409 mIsFirstTimeAppStore = false;
410
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000411 editor.putBoolean(PREFERENCE_FIRST_TIME_APP_STORE, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000412 editor.apply();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000413 }
414
Tiago Costa6d360e22014-12-15 14:32:51 +0000415 headerFairphoneInfoButton.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000416 headerAndroidInfoButton.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000417 break;
418
Pedro Arelocb88f672014-10-09 17:41:02 +0100419 case OTHER_OS:
420 headerMainFairphoneText.setVisibility(View.GONE);
421 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000422 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100423 headerFairphoneText.setVisibility(View.GONE);
424 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000425 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100426 headerOtherOSText.setVisibility(View.VISIBLE);
427
428 headerOtherOSText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000429
Tiago Costa3855faa2014-11-14 17:55:05 +0000430 headerFairphoneInfoButton.setVisibility(View.GONE);
431 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100432 break;
433
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100434 case MAIN_ANDROID:
435 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100436 headerMainAndroidText.setVisibility(View.VISIBLE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000437 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100438 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100439 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000440 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100441 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000442
443 headerFairphoneInfoButton.setVisibility(View.GONE);
444 headerAndroidInfoButton.setVisibility(View.GONE);
445 break;
Tiago Costa3855faa2014-11-14 17:55:05 +0000446
Jose Pascoal02d86242014-12-17 18:50:08 +0000447 case MAIN_APP_STORE:
448 headerMainFairphoneText.setVisibility(View.GONE);
449 headerMainAndroidText.setVisibility(View.GONE);
450 headerMainAppStoreText.setVisibility(View.VISIBLE);
451 headerFairphoneText.setVisibility(View.GONE);
452 headerAndroidText.setVisibility(View.GONE);
453 headerAppStoreText.setVisibility(View.GONE);
454 headerOtherOSText.setVisibility(View.GONE);
455
Tiago Costa3855faa2014-11-14 17:55:05 +0000456 headerFairphoneInfoButton.setVisibility(View.GONE);
457 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100458 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100459
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100460 case MAIN_FAIRPHONE:
461 default:
462 headerMainFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100463 headerMainAndroidText.setVisibility(View.GONE);
Filipe72b5a7f2015-09-01 08:59:54 +0000464 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100465 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100466 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000467 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100468 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000469
Tiago Costa3855faa2014-11-14 17:55:05 +0000470 headerFairphoneInfoButton.setVisibility(View.GONE);
471 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100472 break;
473 }
474 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100475
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100476 private void setupFragments(Bundle savedInstanceState)
477 {
478 // Check that the activity is using the layout version with
479 // the fragment_container FrameLayout
480 if (findViewById(R.id.fragment_holder) != null)
481 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100482
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100483 // However, if we're being restored from a previous state,
484 // then we don't need to do anything and should return or else
485 // we could end up with overlapping fragments.
486 if (savedInstanceState != null)
487 {
488 return;
489 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100490
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100491 // Create a new Fragment to be placed in the activity layout
Jose Pascoal87758742015-01-28 20:00:22 +0000492 Fragment firstFragment = new MainFragment();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100493
494 // In case this activity was started with special instructions from
495 // an
496 // Intent, pass the Intent's extras to the fragment as arguments
Jose Pascoal02d86242014-12-17 18:50:08 +0000497 Intent intent = getIntent();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000498 if (intent != null)
Jose Pascoal02d86242014-12-17 18:50:08 +0000499 {
500 Bundle bundle = intent.getExtras();
501 if (bundle != null)
502 {
503 firstFragment.setArguments(bundle);
504 }
505 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100506
507 // Add the fragment to the 'fragment_container' FrameLayout
Jose Pascoal799e3942014-11-04 21:12:26 +0000508 FragmentManager fragManager = getSupportFragmentManager();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000509 if (fragManager != null)
Jose Pascoal799e3942014-11-04 21:12:26 +0000510 {
Jose Pascoal87758742015-01-28 20:00:22 +0000511 FragmentTransaction transation = fragManager.beginTransaction();
512 transation.add(R.id.fragment_holder, firstFragment, TAG_FIRST_FRAGMENT);
513 transation.addToBackStack(TAG_FIRST_FRAGMENT);
514 transation.commit();
Jose Pascoal799e3942014-11-04 21:12:26 +0000515 }
516 else
517 {
518 Log.e(TAG, "setupFragments - Couldn't get FragmentManager");
519 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100520 }
521 }
522
523 public Fragment getFragmentFromState()
524 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000525 Fragment firstFragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100526 switch (mCurrentState)
527 {
528 case PREINSTALL:
529 case DOWNLOAD:
Jose Pascoalad4ea572014-12-16 20:31:48 +0000530 if (mSelectedVersion != null)
531 {
Tiago Costa198bf3d2014-12-16 15:23:18 +0000532 firstFragment = new DownloadAndRestartFragment(true);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000533 }
534 else if (mSelectedStore != null)
535 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000536 firstFragment = new DownloadAndRestartFragment(false);
Jose Pascoal87758742015-01-28 20:00:22 +0000537 } else
538 {
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000539 firstFragment = new MainFragment();
540 updateStatePreference(UpdaterState.NORMAL);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000541 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100542 break;
543 case NORMAL:
Jose Pascoal87758742015-01-28 20:00:22 +0000544 if(mLaunchGapps)
545 {
546 firstFragment = startGappsInstall();
547 }
Maarten Derks8537be82016-06-06 12:41:24 +0200548 else if (getTopFragment() != null)
549 {
550 firstFragment = getTopFragment();
551 }
Jose Pascoal87758742015-01-28 20:00:22 +0000552 else
553 {
554 firstFragment = new MainFragment();
555 }
556 break;
Jose Pascoal79357c52015-03-12 20:14:29 +0000557 case ZIP_INSTALL:
558 firstFragment = new DownloadAndRestartFragment(true);
559 break;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100560 default:
561 firstFragment = new MainFragment();
562 break;
563 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000564
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100565 return firstFragment;
566 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100567
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100568 public void changeFragment(Fragment newFragment)
569 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100570 Fragment topFragment = getTopFragment();
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000571 if ( newFragment != null && ( topFragment == null || !newFragment.getClass().equals(topFragment.getClass())) )
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100572 {
Jose Pascoal87758742015-01-28 20:00:22 +0000573 if(topFragment != null && newFragment instanceof MainFragment)
574 {
575 if(TAG_FIRST_FRAGMENT.equals(topFragment.getTag()))
576 {
577 return;
578 }
579 }
580
Jose Pascoal799e3942014-11-04 21:12:26 +0000581 FragmentManager fragManager = getSupportFragmentManager();
582 if (fragManager != null)
583 {
584 FragmentTransaction transaction = fragManager.beginTransaction();
585 // Replace whatever is in the fragment_container view with this
586 // fragment,
587 // and add the transaction to the back stack so the user can
588 // navigate
589 // back
Pedro Arelo8f002432015-02-19 17:03:19 +0000590 transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
Jose Pascoal799e3942014-11-04 21:12:26 +0000591 transaction.replace(R.id.fragment_holder, newFragment);
592 transaction.addToBackStack(null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100593
Jose Pascoal799e3942014-11-04 21:12:26 +0000594 // Commit the transaction
595 transaction.commit();
596 }
597 else
598 {
599 Log.e(TAG, "changeFragment - Couldn't get FragmentManager");
600 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100601 }
602 }
Jose Pascoal436915f2014-10-08 15:37:26 +0100603
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000604 Fragment getTopFragment()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100605 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000606 Fragment topFragment = null;
607 FragmentManager fragManager = getSupportFragmentManager();
608 if (fragManager != null)
609 {
Jose Pascoal87758742015-01-28 20:00:22 +0000610 topFragment = fragManager.findFragmentById(R.id.fragment_holder);
Jose Pascoal799e3942014-11-04 21:12:26 +0000611 }
612 else
613 {
614 Log.e(TAG, "getTopFragment - Couldn't get FragmentManager");
615 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100616 return topFragment;
617 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100618
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100619 public boolean isUpdateAvailable()
620 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000621 boolean update = false;
Filipe Gonçalves3b08c8b2015-02-03 15:18:28 +0000622 if (mLatestVersion != null)
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000623 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000624 update = BETA_MODE_ENABLED || mLatestVersion.isNewerVersionThan(mDeviceVersion);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000625 }
626 return update;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100627 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100628
Jose Pascoal40916302015-02-06 18:43:47 +0000629 public String getItemName(DownloadableItem item, boolean isVersion)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100630 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000631 String itemName = "";
632 if (item != null)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100633 {
Jose Pascoal40916302015-02-06 18:43:47 +0000634 if(isVersion)
Jose Pascoal02d86242014-12-17 18:50:08 +0000635 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100636 itemName = ((Version) item).getHumanReadableName();
Jose Pascoal02d86242014-12-17 18:50:08 +0000637 }
Jose Pascoal40916302015-02-06 18:43:47 +0000638 else
Jose Pascoal02d86242014-12-17 18:50:08 +0000639 {
Jose Pascoal40916302015-02-06 18:43:47 +0000640 itemName = getStoreName((Store) item);
641 }
642 }
643 return itemName;
644 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000645
Maarten Derks4bb57892016-01-26 10:52:53 +0100646
Jose Pascoal40916302015-02-06 18:43:47 +0000647
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000648 public static String getStoreName(Store store)
Jose Pascoal40916302015-02-06 18:43:47 +0000649 {
650 String itemName = "";
651 if (store != null)
652 {
653 itemName = store.getName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100654 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000655 return itemName;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100656 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100657
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100658 public String getDeviceVersionName()
659 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100660 return mDeviceVersion.getHumanReadableName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100661 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100662
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100663 public String getLatestVersionName()
664 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100665 return mLatestVersion.getHumanReadableName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100666 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100667
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100668 public Version getDeviceVersion()
669 {
670 return mDeviceVersion;
671 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100672
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100673 public Version getLatestVersion()
674 {
675 return mLatestVersion;
676 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100677
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100678 public Version getSelectedVersion()
679 {
680 return mSelectedVersion;
681 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000682
Jose Pascoalad4ea572014-12-16 20:31:48 +0000683 public Store getSelectedStore()
684 {
685 return mSelectedStore;
686 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100687
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000688 public static HeaderType getHeaderTypeFromImageType(String imageType)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100689 {
690 HeaderType type = HeaderType.MAIN_FAIRPHONE;
691 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
692 {
693 type = HeaderType.ANDROID;
694 }
695 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(imageType))
696 {
697 type = HeaderType.FAIRPHONE;
698 }
699 return type;
700 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100701
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100702 public void setSelectedVersion(Version selectedVersion)
703 {
Maarten Derksf17e6db2016-02-09 15:10:53 +0100704 String versionNumber = selectedVersion != null ? selectedVersion.getId() : "0";
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100705 String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
Jose Pascoale4c48e32014-10-03 19:55:39 +0100706
Jose Pascoalad4ea572014-12-16 20:31:48 +0000707 clearSelectedVersion(versionNumber, versionImageType);
708
709 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
Maarten Derksbb287762015-10-12 17:22:45 +0200710 clearSelectedStore("-1");
Jose Pascoalad4ea572014-12-16 20:31:48 +0000711 }
712
Jose Pascoal02d86242014-12-17 18:50:08 +0000713 public void clearSelectedItems()
714 {
Maarten Derksbb287762015-10-12 17:22:45 +0200715 clearSelectedVersion("0", "");
716 clearSelectedStore("-1");
Jose Pascoal02d86242014-12-17 18:50:08 +0000717 }
718
Maarten Derksbb287762015-10-12 17:22:45 +0200719 private void clearSelectedVersion(String versionNumber, String versionImageType)
Jose Pascoalad4ea572014-12-16 20:31:48 +0000720 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100721 Editor editor = mSharedPreferences.edit();
Maarten Derksbb287762015-10-12 17:22:45 +0200722 editor.putString(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100723 editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
724 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000725
Jose Pascoalad4ea572014-12-16 20:31:48 +0000726 mSelectedVersion = null;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100727 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000728
Tiago Costa3add03e2014-12-16 12:05:23 +0000729 public void setSelectedStore(Store selectedStore)
730 {
Maarten Derksf17e6db2016-02-09 15:10:53 +0100731 String storeNumber = selectedStore != null ? selectedStore.getId() : "-1";
Jose Pascoalad4ea572014-12-16 20:31:48 +0000732
733 clearSelectedStore(storeNumber);
734
735 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
Maarten Derksbb287762015-10-12 17:22:45 +0200736 clearSelectedVersion("0", "");
Jose Pascoalad4ea572014-12-16 20:31:48 +0000737 }
738
Maarten Derksbb287762015-10-12 17:22:45 +0200739 private void clearSelectedStore(String storeNumber)
Jose Pascoalad4ea572014-12-16 20:31:48 +0000740 {
741 Editor editor = mSharedPreferences.edit();
Maarten Derksbb287762015-10-12 17:22:45 +0200742 editor.putString(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000743 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000744
Jose Pascoalad4ea572014-12-16 20:31:48 +0000745 mSelectedStore = null;
Tiago Costa3add03e2014-12-16 12:05:23 +0000746 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100747
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100748 public void resetLastUpdateDownloadId()
749 {
750 mLatestUpdateDownloadId = 0;
751 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
752 setSelectedVersion(null);
753 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100754
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100755 private Version getLatestVersionFromConfig()
756 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000757 Version latest = null;
758 if (mDeviceVersion != null)
759 {
760 latest = UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType());
761 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100762 return latest;
763 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100764
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100765 public void updateLatestVersionFromConfig()
766 {
767 mLatestVersion = getLatestVersionFromConfig();
768 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100769
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000770 private boolean mLaunchGapps = false;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000771
772 @Override
773 protected void onNewIntent(Intent intent)
774 {
Jose Pascoal87758742015-01-28 20:00:22 +0000775 super.onNewIntent(intent);
776 setIntent(intent);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000777 mLaunchGapps = false;
778
Jose Pascoal79357c52015-03-12 20:14:29 +0000779 if(intent != null) {
Jose Pascoal8b8c2d22015-03-30 12:11:44 +0100780 String action = TextUtils.isEmpty(intent.getAction()) ? "" : intent.getAction();
Jose Pascoal79357c52015-03-12 20:14:29 +0000781 switch (action)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000782 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000783 case GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL:
784 if (checkStartGappsInstall(intent)) {
785 mLaunchGapps = true;
786 } else {
787 Intent parentIntent = getParentActivityIntent();
788 if (checkStartGappsInstall(parentIntent)) {
789 mLaunchGapps = true;
790 }
791 }
792 break;
793 case Intent.ACTION_VIEW:
794 Uri data = intent.getData();
795 if(data != null)
796 {
Jose Pascoal2a8283b2015-03-13 14:43:42 +0000797
798 String zipPath = Utils.getPath(this, data);
Jose Pascoal79357c52015-03-12 20:14:29 +0000799 if(!TextUtils.isEmpty(zipPath)) {
800 mZipPath = zipPath;
801 updateStatePreference(UpdaterState.ZIP_INSTALL);
802 }
803 else
804 {
805 mZipPath = "";
806 }
807 }
808 break;
809 default:
810 //no action
811 break;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000812 }
813 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000814 }
815
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000816 private static boolean checkStartGappsInstall(Intent intent)
Jose Pascoal62235572015-01-29 16:42:23 +0000817 {
818 return intent != null && GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL.equals(intent.getAction());
819 }
820
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000821 @Override
822 protected void onPause() {
823 super.onPause();
824 if(wifiOffDialog != null) {
825 wifiOffDialog.cancel();
826 wifiOffDialog = null;
827 }
828 }
829
830 @Override
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100831 protected void onResume()
832 {
833 super.onResume();
Jose Pascoal87758742015-01-28 20:00:22 +0000834
835 // check current state
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100836 mCurrentState = getCurrentUpdaterState();
Jose Pascoal79357c52015-03-12 20:14:29 +0000837 if(mCurrentState == UpdaterState.ZIP_INSTALL)
838 {
Jose Pascoal844a0ea2015-03-13 17:10:39 +0000839 updateStatePreference(TextUtils.isEmpty(mZipPath) ? UpdaterState.NORMAL : UpdaterState.ZIP_INSTALL);
Jose Pascoal79357c52015-03-12 20:14:29 +0000840 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100841
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100842 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
843 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000844
845 if (mDeviceVersion != null)
846 {
847 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
848 }
849 else
850 {
851 mLatestVersion = null;
852 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100853
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100854 getSelectedVersionFromSharedPreferences();
Jose Pascoalad4ea572014-12-16 20:31:48 +0000855 getSelectedStoreFromSharedPreferences();
Jose Pascoal87758742015-01-28 20:00:22 +0000856
857 changeFragment(getFragmentFromState());
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000858
859 // Show wifi disable dialog if in a blank state and no wifi is available
860 if ( wifiOffDialog == null &&
861 mCurrentState == UpdaterState.NORMAL &&
862 !Utils.isWiFiEnabled(this) &&
863 UpdaterData.getInstance().isAppStoreListEmpty() &&
864 !UpdaterData.getInstance().isAOSPVersionListNotEmpty() &&
865 !UpdaterData.getInstance().isFairphoneVersionListNotEmpty() )
866 {
867 Resources resources = getResources();
868
869 AlertDialog.Builder wifiOffDialogBuilder = new AlertDialog.Builder(this);
870
871 wifiOffDialogBuilder.setTitle(resources.getString(R.string.wifi_disabled));
872
873 // Setting Dialog Message
874 wifiOffDialogBuilder.setMessage(resources.getString(R.string.wifi_discaimer_message_startup));
875 wifiOffDialogBuilder.setPositiveButton(resources.getString(android.R.string.ok), new DialogInterface.OnClickListener() {
876 public void onClick(DialogInterface dialog, int id) {
877 // do nothing, since the state is still the same
878 }
879 });
880 wifiOffDialog = wifiOffDialogBuilder.create();
881 wifiOffDialog.show();
882 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000883 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100884
Jose Pascoal87758742015-01-28 20:00:22 +0000885 public Fragment startGappsInstall()
Tiago Costadaaa32c2015-01-08 12:12:24 +0000886 {
Jose Pascoal055562d2015-03-19 19:31:38 +0000887 mSelectedStore = Utils.getGappsStore();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000888
889 VersionDetailFragment fragment = new VersionDetailFragment(false);
890
Tiago Costa73575aa2015-01-19 15:48:26 +0000891 if (mSelectedStore != null)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000892 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000893 fragment.setupAppStoreFragment(mSelectedStore);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000894 }
Jose Pascoal87758742015-01-28 20:00:22 +0000895 else
896 {
897 fragment = null;
898 }
899
900 return fragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100901 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100902
Jose Pascoalaa579a82014-11-05 22:17:16 +0000903 private void startService()
904 {
905 if (mCurrentState == UpdaterState.NORMAL)
906 {
907 Utils.startUpdaterService(this, true);
908 }
909 else
910 {
911 Utils.startUpdaterService(this, false);
912 }
913 }
914
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100915 public void updateStatePreference(UpdaterState newState)
916 {
917 mCurrentState = newState;
Jose Pascoale4c48e32014-10-03 19:55:39 +0100918
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100919 Editor editor = mSharedPreferences.edit();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100920
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100921 editor.putString(PREFERENCE_CURRENT_UPDATER_STATE, mCurrentState.name());
Jose Pascoale4c48e32014-10-03 19:55:39 +0100922
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100923 editor.commit();
924 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100925
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100926 public long getLatestDownloadId()
927 {
928 return mLatestUpdateDownloadId;
929 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100930
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100931 public long getLatestUpdateDownloadIdFromSharedPreference()
932 {
933 if (mLatestUpdateDownloadId == 0)
934 {
935 mLatestUpdateDownloadId = getLongPreference(PREFERENCE_DOWNLOAD_ID);
936 }
937 return mLatestUpdateDownloadId;
938 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100939
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100940 public void saveLatestUpdateDownloadId(long latestUpdateDownloadId)
941 {
942 mLatestUpdateDownloadId = latestUpdateDownloadId;
943 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
Jose Pascoal02d86242014-12-17 18:50:08 +0000944 }
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000945
946 public long getConfigFileDownloadIdFromSharedPreference()
947 {
948 return getLongPreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID);
949 }
950
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000951 public void clearConfigFileDownloadId()
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000952 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000953 savePreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID, 0L);
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000954 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000955
956 public String getZipFilePath()
957 {
958 return mZipPath;
959 }
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000960
961 public String getPreferenceOtaDownloadUrl()
962 {
963 return mSharedPreferences.getString(FairphoneUpdater.PREFERENCE_OTA_DOWNLOAD_URL, getResources().getString(R.string.downloadUrl));
964 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100965}