blob: d932d79a6b237273dc196a3258a7b9aa704da523 [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;
Maarten Derks4dc5b032016-05-26 17:04:58 +020016import android.text.Html;
Jose Pascoalaa579a82014-11-05 22:17:16 +000017import android.text.TextUtils;
Jose Pascoal2666b892014-10-02 21:05:08 +010018import android.util.Log;
19import android.view.View;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010020import android.view.View.OnClickListener;
Jose Pascoalc172d892014-11-17 17:36:12 +000021import android.widget.ImageButton;
Jose Pascoal2666b892014-10-02 21:05:08 +010022import android.widget.TextView;
23import android.widget.Toast;
Jose Pascoal91aff132014-10-02 17:19:47 +010024
Jose Pascoal2666b892014-10-02 21:05:08 +010025import com.crashlytics.android.Crashlytics;
Jose Pascoal02d86242014-12-17 18:50:08 +000026import com.fairphone.updater.data.DownloadableItem;
Tiago Costa3add03e2014-12-16 12:05:23 +000027import com.fairphone.updater.data.Store;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010028import com.fairphone.updater.data.UpdaterData;
29import com.fairphone.updater.data.Version;
30import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010031import com.fairphone.updater.fragments.DownloadAndRestartFragment;
Tiago Costa3855faa2014-11-14 17:55:05 +000032import com.fairphone.updater.fragments.InfoPopupDialog;
Jose Pascoal91aff132014-10-02 17:19:47 +010033import com.fairphone.updater.fragments.MainFragment;
Tiago Costadaaa32c2015-01-08 12:12:24 +000034import com.fairphone.updater.fragments.VersionDetailFragment;
Tiago Costa3855faa2014-11-14 17:55:05 +000035import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
Jose Pascoalad4ea572014-12-16 20:31:48 +000036import com.fairphone.updater.gappsinstaller.GappsInstallerHelper;
Jose Pascoale4c48e32014-10-03 19:55:39 +010037import com.fairphone.updater.tools.Utils;
Jose Pascoal91aff132014-10-02 17:19:47 +010038
Jose Pascoal7bf83a02014-10-13 18:30:18 +010039public class FairphoneUpdater extends FragmentActivity
Pedro Arelo6d2bac92014-10-09 16:48:27 +010040{
Jose Pascoal91aff132014-10-02 17:19:47 +010041
Jose Pascoal7bf83a02014-10-13 18:30:18 +010042 private static final String TAG = FairphoneUpdater.class.getSimpleName();
Jose Pascoal2666b892014-10-02 21:05:08 +010043
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +000044 private static final String CRASHLYTICS_OPT_IN = "crashlytics_opt_in"; // IMPORTANT: keep synced with Settings.Global.CRASHLYTICS_OPT_IN
45
Pedro Arelo6d2bac92014-10-09 16:48:27 +010046 public static final String FAIRPHONE_UPDATER_NEW_VERSION_RECEIVED = "FairphoneUpdater.NEW.VERSION.RECEIVED";
Jose Pascoal2666b892014-10-02 21:05:08 +010047
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000048 private static final String PREFERENCE_FIRST_TIME_ANDROID = "FirstTimeAndroid";
Jose Pascoal02d86242014-12-17 18:50:08 +000049
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000050 private static final String PREFERENCE_FIRST_TIME_FAIRPHONE = "FirstTimeFairphone";
Jose Pascoal02d86242014-12-17 18:50:08 +000051
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000052 private static final String PREFERENCE_FIRST_TIME_APP_STORE = "FirstTimeAppStore";
Tiago Costadaaa32c2015-01-08 12:12:24 +000053
Jose Pascoal85b803b2015-03-19 12:23:11 +000054 public static final String PREFERENCE_CURRENT_UPDATER_STATE = "CurrentUpdaterState";
Jose Pascoal2666b892014-10-02 21:05:08 +010055
Pedro Arelo6d2bac92014-10-09 16:48:27 +010056 private static final String PREFERENCE_DOWNLOAD_ID = "LatestUpdateDownloadId";
Jose Pascoal2666b892014-10-02 21:05:08 +010057
Pedro Arelo6d2bac92014-10-09 16:48:27 +010058 public static final String FAIRPHONE_UPDATER_PREFERENCES = "FairphoneUpdaterPreferences";
Jose Pascoal2666b892014-10-02 21:05:08 +010059
Jose Pascoal85b803b2015-03-19 12:23:11 +000060 public static final String PREFERENCE_SELECTED_VERSION_NUMBER = "SelectedVersionNumber";
Jose Pascoal2666b892014-10-02 21:05:08 +010061
Jose Pascoal85b803b2015-03-19 12:23:11 +000062 public static final String PREFERENCE_SELECTED_VERSION_TYPE = "SelectedVersionImageType";
Jose Pascoal2666b892014-10-02 21:05:08 +010063
Pedro Arelo6d2bac92014-10-09 16:48:27 +010064 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_FAILED = "FairphoneUpdater.Config.File.Download.FAILED";
Jose Pascoal2666b892014-10-02 21:05:08 +010065
Pedro Arelo6d2bac92014-10-09 16:48:27 +010066 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_LINK = "FairphoneUpdater.ConfigFile.Download.LINK";
Jose Pascoal02d86242014-12-17 18:50:08 +000067
Jose Pascoalad4ea572014-12-16 20:31:48 +000068 public static final String PREFERENCE_SELECTED_STORE_NUMBER = "SelectedStoreNumber";
Filipe Gonçalvesafeac2c2015-01-27 17:49:53 +000069
70 public static final String PREFERENCE_OTA_DOWNLOAD_URL = "OtaDownloadUrl";
Maarten Derks4dc5b032016-05-26 17:04:58 +020071
72 public static final String PREFERENCE_BETA_MODE = "BetaMode";
Jose Pascoal87758742015-01-28 20:00:22 +000073
74 private static final String TAG_FIRST_FRAGMENT = "FIRST_FRAGMENT";
Jose Pascoal79357c52015-03-12 20:14:29 +000075 private String mZipPath;
Maarten Derks0d5083c2016-05-31 14:38:26 +020076 private AlertDialog internetOffDialog;
Filipe Gonçalvesafeac2c2015-01-27 17:49:53 +000077
Jose Pascoal2666b892014-10-02 21:05:08 +010078
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +000079 public static enum UpdaterState
Pedro Arelo6d2bac92014-10-09 16:48:27 +010080 {
Jose Pascoal79357c52015-03-12 20:14:29 +000081 NORMAL, DOWNLOAD, PREINSTALL, ZIP_INSTALL
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000082 }
Jose Pascoal2666b892014-10-02 21:05:08 +010083
Pedro Arelo6d2bac92014-10-09 16:48:27 +010084 private Version mDeviceVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010085 private Version mLatestVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010086 private Version mSelectedVersion;
Jose Pascoal2666b892014-10-02 21:05:08 +010087
Pedro Arelo6d2bac92014-10-09 16:48:27 +010088 private UpdaterState mCurrentState;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010089 private SharedPreferences mSharedPreferences;
Jose Pascoal2666b892014-10-02 21:05:08 +010090
Pedro Arelo6d2bac92014-10-09 16:48:27 +010091 private long mLatestUpdateDownloadId;
Jose Pascoal2666b892014-10-02 21:05:08 +010092
Pedro Arelo6d2bac92014-10-09 16:48:27 +010093 public static boolean DEV_MODE_ENABLED;
Filipe Gonçalves825414a2015-01-26 14:52:48 +000094 public static boolean BETA_MODE_ENABLED;
Filipe72b5a7f2015-09-01 08:59:54 +000095 public static String otaDevDownloadUrl = "";
Jose Pascoal2666b892014-10-02 21:05:08 +010096
Pedro Arelo6d2bac92014-10-09 16:48:27 +010097 private TextView headerMainFairphoneText;
98 private TextView headerMainAndroidText;
99 private TextView headerFairphoneText;
100 private TextView headerAndroidText;
Tiago Costa6d360e22014-12-15 14:32:51 +0000101 private TextView headerAppStoreText;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100102 private TextView headerOtherOSText;
Jose Pascoalc172d892014-11-17 17:36:12 +0000103 private ImageButton headerFairphoneInfoButton;
104 private ImageButton headerAndroidInfoButton;
Jose Pascoal02d86242014-12-17 18:50:08 +0000105
Tiago Costa9008b612014-11-14 18:19:50 +0000106 private boolean mIsFirstTimeAndroid;
107 private boolean mIsFirstTimeFairphone;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000108 private boolean mIsFirstTimeAppStore;
Jose Pascoal02d86242014-12-17 18:50:08 +0000109
Jose Pascoalad4ea572014-12-16 20:31:48 +0000110 private Store mSelectedStore;
Jose Pascoal02d86242014-12-17 18:50:08 +0000111
112 private TextView headerMainAppStoreText;
Filipe72b5a7f2015-09-01 08:59:54 +0000113 public enum HeaderType
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100114 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000115 MAIN_FAIRPHONE, MAIN_ANDROID, MAIN_APP_STORE, FAIRPHONE, ANDROID, OTHER_OS, APP_STORE
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000116 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100117
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100118 @Override
119 protected void onCreate(Bundle savedInstanceState)
120 {
121 super.onCreate(savedInstanceState);
Jose Pascoal79357c52015-03-12 20:14:29 +0000122 mSharedPreferences = getSharedPreferences(FAIRPHONE_UPDATER_PREFERENCES, MODE_PRIVATE);
123
Jose Pascoal87758742015-01-28 20:00:22 +0000124 onNewIntent(getIntent());
125
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100126 setContentView(R.layout.activity_updater);
Jose Pascoal2666b892014-10-02 21:05:08 +0100127
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000128 if (Settings.Global.getInt(getContentResolver(), CRASHLYTICS_OPT_IN, 0) == 1)
129 {
130 Log.d(TAG, "Crash reports active.");
Filipe72b5a7f2015-09-01 08:59:54 +0000131 try {
132 Crashlytics.start(this);
133 } catch(Exception e) {
134 Log.w(TAG, "Crashlytics failed to start");
135 }
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000136 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100137
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100138 DEV_MODE_ENABLED = false;
Jose Pascoal2666b892014-10-02 21:05:08 +0100139
Filipe72b5a7f2015-09-01 08:59:54 +0000140 otaDevDownloadUrl = "";
141
Tiago Costa9008b612014-11-14 18:19:50 +0000142 // update first times
143 mIsFirstTimeAndroid = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_ANDROID, true);
Jose Pascoal02d86242014-12-17 18:50:08 +0000144
Tiago Costa9008b612014-11-14 18:19:50 +0000145 mIsFirstTimeFairphone = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, true);
Jose Pascoal02d86242014-12-17 18:50:08 +0000146
Tiago Costae02ce352015-01-23 15:43:22 +0000147 mIsFirstTimeAppStore = false;//mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_APP_STORE, true);
Tiago Costa1216b102015-03-10 15:48:18 +0000148
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000149 String otaDownloadUrl = getResources().getString(R.string.downloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000150
151 // reset download URL
152 Editor editor = mSharedPreferences.edit();
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000153 editor.putString(PREFERENCE_OTA_DOWNLOAD_URL, otaDownloadUrl);
Filipe72b5a7f2015-09-01 08:59:54 +0000154 editor.apply();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000155
Filipe Gonçalvesad527aa2015-01-12 15:13:35 +0000156 // get system data
157 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
158
159 isDeviceSupported();
160
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000161 setupBetaStatus();
162
Jose Pascoalaa579a82014-11-05 22:17:16 +0000163 // check current state
164 mCurrentState = getCurrentUpdaterState();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000165
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100166 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
Filipe Gonçalves9c8d93a2015-01-28 14:35:49 +0000167 if (!isConfigLoaded) {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000168 mSharedPreferences.edit().remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS).apply();
Filipe Gonçalves9c8d93a2015-01-28 14:35:49 +0000169 }
Filipe Gonçalves42ffc322015-01-28 12:51:14 +0000170
Jose Pascoalaa579a82014-11-05 22:17:16 +0000171 if (mDeviceVersion != null)
172 {
173 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
174 }
175 else
176 {
177 mLatestVersion = null;
178 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100179
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100180 initHeaderViews();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100181
Maarten Derks4dc5b032016-05-26 17:04:58 +0200182 setupHeader();
183
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100184 setupFragments(savedInstanceState);
Filipe72b5a7f2015-09-01 08:59:54 +0000185
186 startService();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100187 }
Filipe Gonçalves72817782015-03-19 15:29:05 +0000188
189
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000190
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000191 void setupBetaStatus()
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000192 {
Maarten Derks4dc5b032016-05-26 17:04:58 +0200193 BETA_MODE_ENABLED = mSharedPreferences.getBoolean(PREFERENCE_BETA_MODE, getResources().getBoolean(R.bool.defaultBetaStatus));
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000194 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100195
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100196 private void isDeviceSupported()
197 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000198 if(Utils.isDeviceUnsupported(this))
Jose Pascoalda00b382015-01-20 18:39:28 +0000199 {
Filipe Gonçalvesad527aa2015-01-12 15:13:35 +0000200 Toast.makeText(this, R.string.device_not_supported_message, Toast.LENGTH_LONG).show();
201 finish();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100202 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100203 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100204
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000205 void getSelectedVersionFromSharedPreferences()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100206 {
207 String versionImageType = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_TYPE, "");
Maarten Derksf01fcbf2015-10-16 16:24:05 +0200208 String versionNumber = "0";
209 try {
210 versionNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_NUMBER, "0");
211 } catch (ClassCastException e) {
212 versionNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0));
213 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100214 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
215 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000216
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000217 void getSelectedStoreFromSharedPreferences()
Jose Pascoalad4ea572014-12-16 20:31:48 +0000218 {
Maarten Derksf01fcbf2015-10-16 16:24:05 +0200219 String storeNumber = "-1";
220 try {
221 storeNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_STORE_NUMBER, "-1");
222 } catch (ClassCastException e) {
223 storeNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1));
224 }
Jose Pascoalad4ea572014-12-16 20:31:48 +0000225 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
226 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100227
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100228 public UpdaterState getCurrentUpdaterState()
229 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100230
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000231 String currentState = mSharedPreferences.getString(PREFERENCE_CURRENT_UPDATER_STATE, null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100232
Jose Pascoalaa579a82014-11-05 22:17:16 +0000233 if (TextUtils.isEmpty(currentState))
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100234 {
235 currentState = UpdaterState.NORMAL.name();
Jose Pascoal2666b892014-10-02 21:05:08 +0100236
Jose Pascoalaa579a82014-11-05 22:17:16 +0000237 updateStatePreference(UpdaterState.NORMAL);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100238 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100239
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100240 return UpdaterState.valueOf(currentState);
241 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100242
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000243 long getLongPreference(String key)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100244 {
245 return mSharedPreferences.getLong(key, 0);
246 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100247
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000248 void savePreference(String key, long value)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100249 {
250 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100251
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100252 editor.putLong(key, value);
Jose Pascoal2666b892014-10-02 21:05:08 +0100253
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100254 editor.commit();
255 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100256
Tiago Costa1216b102015-03-10 15:48:18 +0000257 public void changeOTADownloadURL(String newUrl){
Filipe72b5a7f2015-09-01 08:59:54 +0000258 otaDevDownloadUrl = TextUtils.isEmpty(newUrl) ? getResources().getString(R.string.downloadUrl) : newUrl;
Jose Pascoaldca09ac2015-03-11 16:35:06 +0000259
Tiago Costa1216b102015-03-10 15:48:18 +0000260 Editor editor = mSharedPreferences.edit();
Filipe72b5a7f2015-09-01 08:59:54 +0000261 editor.putString(PREFERENCE_OTA_DOWNLOAD_URL, otaDevDownloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000262 editor.commit();
263 }
264
Filipe Gonçalves1e69a0e2015-03-16 17:22:55 +0000265 public void forceConfigDownload(){
Filipe72b5a7f2015-09-01 08:59:54 +0000266 Utils.startUpdaterService(getApplicationContext(), true);
Tiago Costa1216b102015-03-10 15:48:18 +0000267 }
268
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100269 private void initHeaderViews()
270 {
271 headerMainFairphoneText = (TextView) findViewById(R.id.header_main_fairphone_text);
272 headerMainAndroidText = (TextView) findViewById(R.id.header_main_android_text);
Jose Pascoal02d86242014-12-17 18:50:08 +0000273 headerMainAppStoreText = (TextView) findViewById(R.id.header_main_app_store_text);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100274 headerFairphoneText = (TextView) findViewById(R.id.header_fairphone_text);
275 headerAndroidText = (TextView) findViewById(R.id.header_android_text);
276 headerOtherOSText = (TextView) findViewById(R.id.header_other_os_text);
Tiago Costa6d360e22014-12-15 14:32:51 +0000277 headerAppStoreText = (TextView) findViewById(R.id.header_app_store_text);
Jose Pascoal2666b892014-10-02 21:05:08 +0100278
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100279 OnClickListener headerBackPressListener = new OnClickListener()
280 {
281 @Override
282 public void onClick(View v)
283 {
284 onBackPressed();
285 }
286 };
Jose Pascoal2666b892014-10-02 21:05:08 +0100287
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100288 headerFairphoneText.setOnClickListener(headerBackPressListener);
289 headerAndroidText.setOnClickListener(headerBackPressListener);
Tiago Costa6d360e22014-12-15 14:32:51 +0000290 headerAppStoreText.setOnClickListener(headerBackPressListener);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100291 headerOtherOSText.setOnClickListener(headerBackPressListener);
Jose Pascoal02d86242014-12-17 18:50:08 +0000292
293 headerFairphoneInfoButton = (ImageButton) findViewById(R.id.header_fairphone_info_button);
294 headerAndroidInfoButton = (ImageButton) findViewById(R.id.header_android_info_button);
295
Tiago Costa3855faa2014-11-14 17:55:05 +0000296 headerFairphoneInfoButton.setOnClickListener(new OnClickListener()
297 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000298
Tiago Costa3855faa2014-11-14 17:55:05 +0000299 @Override
300 public void onClick(View v)
301 {
302 showInfoPopupDialog(DetailLayoutType.FAIRPHONE);
303 }
304 });
Jose Pascoal02d86242014-12-17 18:50:08 +0000305
Tiago Costa3855faa2014-11-14 17:55:05 +0000306 headerAndroidInfoButton.setOnClickListener(new OnClickListener()
307 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000308
Tiago Costa3855faa2014-11-14 17:55:05 +0000309 @Override
310 public void onClick(View v)
311 {
312 showInfoPopupDialog(DetailLayoutType.ANDROID);
313 }
314 });
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100315 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100316
Maarten Derks4dc5b032016-05-26 17:04:58 +0200317 private void setupHeader() {
318 if(BETA_MODE_ENABLED) {
319 String input = "<br /><small><font color=" + getResources().getColor(R.color.design_pink) + ">" + getResources().getString(R.string.beta_mode) + "</font></small>";
320 headerMainFairphoneText.append(Html.fromHtml(input));
321 headerMainAndroidText.append(Html.fromHtml(input));
322 headerMainAppStoreText.append(Html.fromHtml(input));
323 }
324 }
325
Tiago Costa3855faa2014-11-14 17:55:05 +0000326 private void showInfoPopupDialog(DetailLayoutType layoutType)
327 {
328 FragmentManager fm = getSupportFragmentManager();
Jose Pascoal02d86242014-12-17 18:50:08 +0000329 InfoPopupDialog popupDialog = new InfoPopupDialog(layoutType);
Tiago Costa3855faa2014-11-14 17:55:05 +0000330 popupDialog.show(fm, layoutType.name());
331 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000332
Jose Pascoalb397dc62014-10-13 19:26:58 +0100333 @Override
334 public void onBackPressed()
335 {
336 Fragment fragment = getTopFragment();
Jose Pascoal40916302015-02-06 18:43:47 +0000337 if (fragment != null && fragment instanceof DownloadAndRestartFragment && getCurrentUpdaterState() != UpdaterState.NORMAL)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100338 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000339 ((DownloadAndRestartFragment) fragment).abortUpdateProcess("");
Jose Pascoalb397dc62014-10-13 19:26:58 +0100340 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000341
342 if (fragment != null && TAG_FIRST_FRAGMENT.equals(fragment.getTag()))
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100343 {
Jose Pascoalbeebb8b2014-12-17 19:28:04 +0000344 clearSelectedItems();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100345 finish();
346 }
Jose Pascoal87758742015-01-28 20:00:22 +0000347
348 super.onBackPressed();
Jose Pascoalb397dc62014-10-13 19:26:58 +0100349 }
350
Tiago Costa3855faa2014-11-14 17:55:05 +0000351 public void updateHeader(HeaderType type, String headerText, boolean showInfo)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100352 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100353
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100354 switch (type)
355 {
356 case FAIRPHONE:
357 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100358 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000359 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100360 headerFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100361 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000362 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100363 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal2666b892014-10-02 21:05:08 +0100364
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100365 headerFairphoneText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000366
367 if (showInfo && mIsFirstTimeFairphone)
368 {
Tiago Costa9008b612014-11-14 18:19:50 +0000369 showInfoPopupDialog(DetailLayoutType.UPDATE_FAIRPHONE);
370 Editor editor = mSharedPreferences.edit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000371
Tiago Costa9008b612014-11-14 18:19:50 +0000372 mIsFirstTimeFairphone = false;
Jose Pascoal02d86242014-12-17 18:50:08 +0000373
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000374 editor.putBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000375 editor.apply();
Tiago Costa9008b612014-11-14 18:19:50 +0000376 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000377
Tiago Costa3855faa2014-11-14 17:55:05 +0000378 headerFairphoneInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
379 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100380 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100381
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100382 case ANDROID:
383 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100384 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000385 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100386 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100387 headerAndroidText.setVisibility(View.VISIBLE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000388 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100389 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal91aff132014-10-02 17:19:47 +0100390
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100391 headerAndroidText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000392
393 if (showInfo && mIsFirstTimeAndroid)
394 {
Tiago Costa9008b612014-11-14 18:19:50 +0000395 showInfoPopupDialog(DetailLayoutType.UPDATE_ANDROID);
396 Editor editor = mSharedPreferences.edit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000397
Tiago Costa9008b612014-11-14 18:19:50 +0000398 mIsFirstTimeAndroid = false;
Jose Pascoal02d86242014-12-17 18:50:08 +0000399
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000400 editor.putBoolean(PREFERENCE_FIRST_TIME_ANDROID, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000401 editor.apply();
Tiago Costa9008b612014-11-14 18:19:50 +0000402 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000403
Tiago Costa3855faa2014-11-14 17:55:05 +0000404 headerFairphoneInfoButton.setVisibility(View.GONE);
405 headerAndroidInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100406 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100407
Tiago Costa6d360e22014-12-15 14:32:51 +0000408 case APP_STORE:
409 headerMainFairphoneText.setVisibility(View.GONE);
410 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000411 headerMainAppStoreText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000412 headerFairphoneText.setVisibility(View.GONE);
413 headerAndroidText.setVisibility(View.GONE);
414 headerAppStoreText.setVisibility(View.VISIBLE);
415 headerOtherOSText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000416 headerAppStoreText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000417
Tiago Costadaaa32c2015-01-08 12:12:24 +0000418 if (showInfo && mIsFirstTimeAppStore)
419 {
420 showInfoPopupDialog(DetailLayoutType.APP_STORE);
421 Editor editor = mSharedPreferences.edit();
422
423 mIsFirstTimeAppStore = false;
424
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000425 editor.putBoolean(PREFERENCE_FIRST_TIME_APP_STORE, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000426 editor.apply();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000427 }
428
Tiago Costa6d360e22014-12-15 14:32:51 +0000429 headerFairphoneInfoButton.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000430 headerAndroidInfoButton.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000431 break;
432
Pedro Arelocb88f672014-10-09 17:41:02 +0100433 case OTHER_OS:
434 headerMainFairphoneText.setVisibility(View.GONE);
435 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000436 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100437 headerFairphoneText.setVisibility(View.GONE);
438 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000439 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100440 headerOtherOSText.setVisibility(View.VISIBLE);
441
442 headerOtherOSText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000443
Tiago Costa3855faa2014-11-14 17:55:05 +0000444 headerFairphoneInfoButton.setVisibility(View.GONE);
445 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100446 break;
447
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100448 case MAIN_ANDROID:
449 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100450 headerMainAndroidText.setVisibility(View.VISIBLE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000451 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100452 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100453 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000454 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100455 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000456
457 headerFairphoneInfoButton.setVisibility(View.GONE);
458 headerAndroidInfoButton.setVisibility(View.GONE);
459 break;
Tiago Costa3855faa2014-11-14 17:55:05 +0000460
Jose Pascoal02d86242014-12-17 18:50:08 +0000461 case MAIN_APP_STORE:
462 headerMainFairphoneText.setVisibility(View.GONE);
463 headerMainAndroidText.setVisibility(View.GONE);
464 headerMainAppStoreText.setVisibility(View.VISIBLE);
465 headerFairphoneText.setVisibility(View.GONE);
466 headerAndroidText.setVisibility(View.GONE);
467 headerAppStoreText.setVisibility(View.GONE);
468 headerOtherOSText.setVisibility(View.GONE);
469
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;
Jose Pascoal91aff132014-10-02 17:19:47 +0100473
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100474 case MAIN_FAIRPHONE:
475 default:
476 headerMainFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100477 headerMainAndroidText.setVisibility(View.GONE);
Filipe72b5a7f2015-09-01 08:59:54 +0000478 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100479 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100480 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000481 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100482 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000483
Tiago Costa3855faa2014-11-14 17:55:05 +0000484 headerFairphoneInfoButton.setVisibility(View.GONE);
485 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100486 break;
487 }
488 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100489
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100490 private void setupFragments(Bundle savedInstanceState)
491 {
492 // Check that the activity is using the layout version with
493 // the fragment_container FrameLayout
494 if (findViewById(R.id.fragment_holder) != null)
495 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100496
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100497 // However, if we're being restored from a previous state,
498 // then we don't need to do anything and should return or else
499 // we could end up with overlapping fragments.
500 if (savedInstanceState != null)
501 {
502 return;
503 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100504
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100505 // Create a new Fragment to be placed in the activity layout
Jose Pascoal87758742015-01-28 20:00:22 +0000506 Fragment firstFragment = new MainFragment();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100507
508 // In case this activity was started with special instructions from
509 // an
510 // Intent, pass the Intent's extras to the fragment as arguments
Jose Pascoal02d86242014-12-17 18:50:08 +0000511 Intent intent = getIntent();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000512 if (intent != null)
Jose Pascoal02d86242014-12-17 18:50:08 +0000513 {
514 Bundle bundle = intent.getExtras();
515 if (bundle != null)
516 {
517 firstFragment.setArguments(bundle);
518 }
519 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100520
521 // Add the fragment to the 'fragment_container' FrameLayout
Jose Pascoal799e3942014-11-04 21:12:26 +0000522 FragmentManager fragManager = getSupportFragmentManager();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000523 if (fragManager != null)
Jose Pascoal799e3942014-11-04 21:12:26 +0000524 {
Jose Pascoal87758742015-01-28 20:00:22 +0000525 FragmentTransaction transation = fragManager.beginTransaction();
526 transation.add(R.id.fragment_holder, firstFragment, TAG_FIRST_FRAGMENT);
527 transation.addToBackStack(TAG_FIRST_FRAGMENT);
528 transation.commit();
Jose Pascoal799e3942014-11-04 21:12:26 +0000529 }
530 else
531 {
532 Log.e(TAG, "setupFragments - Couldn't get FragmentManager");
533 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100534 }
535 }
536
537 public Fragment getFragmentFromState()
538 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000539 Fragment firstFragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100540 switch (mCurrentState)
541 {
542 case PREINSTALL:
543 case DOWNLOAD:
Jose Pascoalad4ea572014-12-16 20:31:48 +0000544 if (mSelectedVersion != null)
545 {
Tiago Costa198bf3d2014-12-16 15:23:18 +0000546 firstFragment = new DownloadAndRestartFragment(true);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000547 }
548 else if (mSelectedStore != null)
549 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000550 firstFragment = new DownloadAndRestartFragment(false);
Jose Pascoal87758742015-01-28 20:00:22 +0000551 } else
552 {
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000553 firstFragment = new MainFragment();
554 updateStatePreference(UpdaterState.NORMAL);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000555 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100556 break;
557 case NORMAL:
Jose Pascoal87758742015-01-28 20:00:22 +0000558 if(mLaunchGapps)
559 {
560 firstFragment = startGappsInstall();
561 }
562 else
563 {
564 firstFragment = new MainFragment();
565 }
566 break;
Jose Pascoal79357c52015-03-12 20:14:29 +0000567 case ZIP_INSTALL:
568 firstFragment = new DownloadAndRestartFragment(true);
569 break;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100570 default:
571 firstFragment = new MainFragment();
572 break;
573 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000574
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100575 return firstFragment;
576 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100577
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100578 public void changeFragment(Fragment newFragment)
579 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100580 Fragment topFragment = getTopFragment();
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000581 if ( newFragment != null && ( topFragment == null || !newFragment.getClass().equals(topFragment.getClass())) )
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100582 {
Jose Pascoal87758742015-01-28 20:00:22 +0000583 if(topFragment != null && newFragment instanceof MainFragment)
584 {
585 if(TAG_FIRST_FRAGMENT.equals(topFragment.getTag()))
586 {
587 return;
588 }
589 }
590
Jose Pascoal799e3942014-11-04 21:12:26 +0000591 FragmentManager fragManager = getSupportFragmentManager();
592 if (fragManager != null)
593 {
594 FragmentTransaction transaction = fragManager.beginTransaction();
595 // Replace whatever is in the fragment_container view with this
596 // fragment,
597 // and add the transaction to the back stack so the user can
598 // navigate
599 // back
Pedro Arelo8f002432015-02-19 17:03:19 +0000600 transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
Jose Pascoal799e3942014-11-04 21:12:26 +0000601 transaction.replace(R.id.fragment_holder, newFragment);
602 transaction.addToBackStack(null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100603
Jose Pascoal799e3942014-11-04 21:12:26 +0000604 // Commit the transaction
605 transaction.commit();
606 }
607 else
608 {
609 Log.e(TAG, "changeFragment - Couldn't get FragmentManager");
610 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100611 }
612 }
Jose Pascoal436915f2014-10-08 15:37:26 +0100613
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000614 Fragment getTopFragment()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100615 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000616 Fragment topFragment = null;
617 FragmentManager fragManager = getSupportFragmentManager();
618 if (fragManager != null)
619 {
Jose Pascoal87758742015-01-28 20:00:22 +0000620 topFragment = fragManager.findFragmentById(R.id.fragment_holder);
Jose Pascoal799e3942014-11-04 21:12:26 +0000621 }
622 else
623 {
624 Log.e(TAG, "getTopFragment - Couldn't get FragmentManager");
625 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100626 return topFragment;
627 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100628
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100629 public boolean isUpdateAvailable()
630 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000631 boolean update = false;
Filipe Gonçalves3b08c8b2015-02-03 15:18:28 +0000632 if (mLatestVersion != null)
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000633 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000634 update = BETA_MODE_ENABLED || mLatestVersion.isNewerVersionThan(mDeviceVersion);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000635 }
636 return update;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100637 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100638
Jose Pascoal40916302015-02-06 18:43:47 +0000639 public String getItemName(DownloadableItem item, boolean isVersion)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100640 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000641 String itemName = "";
642 if (item != null)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100643 {
Jose Pascoal40916302015-02-06 18:43:47 +0000644 if(isVersion)
Jose Pascoal02d86242014-12-17 18:50:08 +0000645 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100646 itemName = ((Version) item).getHumanReadableName();
Jose Pascoal02d86242014-12-17 18:50:08 +0000647 }
Jose Pascoal40916302015-02-06 18:43:47 +0000648 else
Jose Pascoal02d86242014-12-17 18:50:08 +0000649 {
Jose Pascoal40916302015-02-06 18:43:47 +0000650 itemName = getStoreName((Store) item);
651 }
652 }
653 return itemName;
654 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000655
Maarten Derks4bb57892016-01-26 10:52:53 +0100656
Jose Pascoal40916302015-02-06 18:43:47 +0000657
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000658 public static String getStoreName(Store store)
Jose Pascoal40916302015-02-06 18:43:47 +0000659 {
660 String itemName = "";
661 if (store != null)
662 {
663 itemName = store.getName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100664 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000665 return itemName;
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 String getDeviceVersionName()
669 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100670 return mDeviceVersion.getHumanReadableName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100671 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100672
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100673 public String getLatestVersionName()
674 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100675 return mLatestVersion.getHumanReadableName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100676 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100677
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100678 public Version getDeviceVersion()
679 {
680 return mDeviceVersion;
681 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100682
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100683 public Version getLatestVersion()
684 {
685 return mLatestVersion;
686 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100687
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100688 public Version getSelectedVersion()
689 {
690 return mSelectedVersion;
691 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000692
Jose Pascoalad4ea572014-12-16 20:31:48 +0000693 public Store getSelectedStore()
694 {
695 return mSelectedStore;
696 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100697
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000698 public static HeaderType getHeaderTypeFromImageType(String imageType)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100699 {
700 HeaderType type = HeaderType.MAIN_FAIRPHONE;
701 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
702 {
703 type = HeaderType.ANDROID;
704 }
705 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(imageType))
706 {
707 type = HeaderType.FAIRPHONE;
708 }
709 return type;
710 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100711
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100712 public void setSelectedVersion(Version selectedVersion)
713 {
Maarten Derksf17e6db2016-02-09 15:10:53 +0100714 String versionNumber = selectedVersion != null ? selectedVersion.getId() : "0";
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100715 String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
Jose Pascoale4c48e32014-10-03 19:55:39 +0100716
Jose Pascoalad4ea572014-12-16 20:31:48 +0000717 clearSelectedVersion(versionNumber, versionImageType);
718
719 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
Maarten Derksbb287762015-10-12 17:22:45 +0200720 clearSelectedStore("-1");
Jose Pascoalad4ea572014-12-16 20:31:48 +0000721 }
722
Jose Pascoal02d86242014-12-17 18:50:08 +0000723 public void clearSelectedItems()
724 {
Maarten Derksbb287762015-10-12 17:22:45 +0200725 clearSelectedVersion("0", "");
726 clearSelectedStore("-1");
Jose Pascoal02d86242014-12-17 18:50:08 +0000727 }
728
Maarten Derksbb287762015-10-12 17:22:45 +0200729 private void clearSelectedVersion(String versionNumber, String versionImageType)
Jose Pascoalad4ea572014-12-16 20:31:48 +0000730 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100731 Editor editor = mSharedPreferences.edit();
Maarten Derksbb287762015-10-12 17:22:45 +0200732 editor.putString(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100733 editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
734 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000735
Jose Pascoalad4ea572014-12-16 20:31:48 +0000736 mSelectedVersion = null;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100737 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000738
Tiago Costa3add03e2014-12-16 12:05:23 +0000739 public void setSelectedStore(Store selectedStore)
740 {
Maarten Derksf17e6db2016-02-09 15:10:53 +0100741 String storeNumber = selectedStore != null ? selectedStore.getId() : "-1";
Jose Pascoalad4ea572014-12-16 20:31:48 +0000742
743 clearSelectedStore(storeNumber);
744
745 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
Maarten Derksbb287762015-10-12 17:22:45 +0200746 clearSelectedVersion("0", "");
Jose Pascoalad4ea572014-12-16 20:31:48 +0000747 }
748
Maarten Derksbb287762015-10-12 17:22:45 +0200749 private void clearSelectedStore(String storeNumber)
Jose Pascoalad4ea572014-12-16 20:31:48 +0000750 {
751 Editor editor = mSharedPreferences.edit();
Maarten Derksbb287762015-10-12 17:22:45 +0200752 editor.putString(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000753 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000754
Jose Pascoalad4ea572014-12-16 20:31:48 +0000755 mSelectedStore = null;
Tiago Costa3add03e2014-12-16 12:05:23 +0000756 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100757
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100758 public void resetLastUpdateDownloadId()
759 {
760 mLatestUpdateDownloadId = 0;
761 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
762 setSelectedVersion(null);
763 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100764
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100765 private Version getLatestVersionFromConfig()
766 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000767 Version latest = null;
768 if (mDeviceVersion != null)
769 {
770 latest = UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType());
771 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100772 return latest;
773 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100774
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100775 public void updateLatestVersionFromConfig()
776 {
777 mLatestVersion = getLatestVersionFromConfig();
778 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100779
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000780 private boolean mLaunchGapps = false;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000781
782 @Override
783 protected void onNewIntent(Intent intent)
784 {
Jose Pascoal87758742015-01-28 20:00:22 +0000785 super.onNewIntent(intent);
786 setIntent(intent);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000787 mLaunchGapps = false;
788
Jose Pascoal79357c52015-03-12 20:14:29 +0000789 if(intent != null) {
Jose Pascoal8b8c2d22015-03-30 12:11:44 +0100790 String action = TextUtils.isEmpty(intent.getAction()) ? "" : intent.getAction();
Jose Pascoal79357c52015-03-12 20:14:29 +0000791 switch (action)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000792 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000793 case GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL:
794 if (checkStartGappsInstall(intent)) {
795 mLaunchGapps = true;
796 } else {
797 Intent parentIntent = getParentActivityIntent();
798 if (checkStartGappsInstall(parentIntent)) {
799 mLaunchGapps = true;
800 }
801 }
802 break;
803 case Intent.ACTION_VIEW:
804 Uri data = intent.getData();
805 if(data != null)
806 {
Jose Pascoal2a8283b2015-03-13 14:43:42 +0000807
808 String zipPath = Utils.getPath(this, data);
Jose Pascoal79357c52015-03-12 20:14:29 +0000809 if(!TextUtils.isEmpty(zipPath)) {
810 mZipPath = zipPath;
811 updateStatePreference(UpdaterState.ZIP_INSTALL);
812 }
813 else
814 {
815 mZipPath = "";
816 }
817 }
818 break;
819 default:
820 //no action
821 break;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000822 }
823 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000824 }
825
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000826 private static boolean checkStartGappsInstall(Intent intent)
Jose Pascoal62235572015-01-29 16:42:23 +0000827 {
828 return intent != null && GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL.equals(intent.getAction());
829 }
830
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000831 @Override
832 protected void onPause() {
833 super.onPause();
Maarten Derks0d5083c2016-05-31 14:38:26 +0200834 if(internetOffDialog != null) {
835 internetOffDialog.cancel();
836 internetOffDialog = null;
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000837 }
838 }
839
840 @Override
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100841 protected void onResume()
842 {
843 super.onResume();
Jose Pascoal87758742015-01-28 20:00:22 +0000844
845 // check current state
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100846 mCurrentState = getCurrentUpdaterState();
Jose Pascoal79357c52015-03-12 20:14:29 +0000847 if(mCurrentState == UpdaterState.ZIP_INSTALL)
848 {
Jose Pascoal844a0ea2015-03-13 17:10:39 +0000849 updateStatePreference(TextUtils.isEmpty(mZipPath) ? UpdaterState.NORMAL : UpdaterState.ZIP_INSTALL);
Jose Pascoal79357c52015-03-12 20:14:29 +0000850 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100851
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100852 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
853 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000854
855 if (mDeviceVersion != null)
856 {
857 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
858 }
859 else
860 {
861 mLatestVersion = null;
862 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100863
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100864 getSelectedVersionFromSharedPreferences();
Jose Pascoalad4ea572014-12-16 20:31:48 +0000865 getSelectedStoreFromSharedPreferences();
Jose Pascoal87758742015-01-28 20:00:22 +0000866
867 changeFragment(getFragmentFromState());
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000868
Maarten Derks0d5083c2016-05-31 14:38:26 +0200869 // Show internet disable dialog if in a blank state and no internet is available
870 if( internetOffDialog == null &&
871 mCurrentState == UpdaterState.NORMAL &&
872 !Utils.isInternetEnabled(this) &&
873 UpdaterData.getInstance().isAppStoreListEmpty() &&
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000874 !UpdaterData.getInstance().isAOSPVersionListNotEmpty() &&
Maarten Derks0d5083c2016-05-31 14:38:26 +0200875 !UpdaterData.getInstance().isFairphoneVersionListNotEmpty())
876 {
877 Resources resources = getResources();
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000878
Maarten Derks0d5083c2016-05-31 14:38:26 +0200879 AlertDialog.Builder internetOffDialogBuilder = new AlertDialog.Builder(this);
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000880
Maarten Derks0d5083c2016-05-31 14:38:26 +0200881 internetOffDialogBuilder.setTitle(R.string.connect_to_internet);
882 internetOffDialogBuilder.setIcon(resources.getDrawable(R.drawable.ic_import_export_fpblue_24dp));
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000883
Maarten Derks0d5083c2016-05-31 14:38:26 +0200884 internetOffDialogBuilder.setPositiveButton(resources.getString(R.string.got_it), new DialogInterface.OnClickListener() {
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000885 public void onClick(DialogInterface dialog, int id) {
886 // do nothing, since the state is still the same
887 }
888 });
Maarten Derks0d5083c2016-05-31 14:38:26 +0200889 internetOffDialog = internetOffDialogBuilder.create();
890 internetOffDialog.show();
891 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000892 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100893
Jose Pascoal87758742015-01-28 20:00:22 +0000894 public Fragment startGappsInstall()
Tiago Costadaaa32c2015-01-08 12:12:24 +0000895 {
Jose Pascoal055562d2015-03-19 19:31:38 +0000896 mSelectedStore = Utils.getGappsStore();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000897
898 VersionDetailFragment fragment = new VersionDetailFragment(false);
899
Tiago Costa73575aa2015-01-19 15:48:26 +0000900 if (mSelectedStore != null)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000901 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000902 fragment.setupAppStoreFragment(mSelectedStore);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000903 }
Jose Pascoal87758742015-01-28 20:00:22 +0000904 else
905 {
906 fragment = null;
907 }
908
909 return fragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100910 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100911
Jose Pascoalaa579a82014-11-05 22:17:16 +0000912 private void startService()
913 {
914 if (mCurrentState == UpdaterState.NORMAL)
915 {
916 Utils.startUpdaterService(this, true);
917 }
918 else
919 {
920 Utils.startUpdaterService(this, false);
921 }
922 }
923
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100924 public void updateStatePreference(UpdaterState newState)
925 {
926 mCurrentState = newState;
Jose Pascoale4c48e32014-10-03 19:55:39 +0100927
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100928 Editor editor = mSharedPreferences.edit();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100929
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100930 editor.putString(PREFERENCE_CURRENT_UPDATER_STATE, mCurrentState.name());
Jose Pascoale4c48e32014-10-03 19:55:39 +0100931
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100932 editor.commit();
933 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100934
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100935 public long getLatestDownloadId()
936 {
937 return mLatestUpdateDownloadId;
938 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100939
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100940 public long getLatestUpdateDownloadIdFromSharedPreference()
941 {
942 if (mLatestUpdateDownloadId == 0)
943 {
944 mLatestUpdateDownloadId = getLongPreference(PREFERENCE_DOWNLOAD_ID);
945 }
946 return mLatestUpdateDownloadId;
947 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100948
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100949 public void saveLatestUpdateDownloadId(long latestUpdateDownloadId)
950 {
951 mLatestUpdateDownloadId = latestUpdateDownloadId;
952 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
Jose Pascoal02d86242014-12-17 18:50:08 +0000953 }
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000954
955 public long getConfigFileDownloadIdFromSharedPreference()
956 {
957 return getLongPreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID);
958 }
959
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000960 public void clearConfigFileDownloadId()
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000961 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000962 savePreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID, 0L);
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000963 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000964
965 public String getZipFilePath()
966 {
967 return mZipPath;
968 }
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000969
970 public String getPreferenceOtaDownloadUrl()
971 {
972 return mSharedPreferences.getString(FairphoneUpdater.PREFERENCE_OTA_DOWNLOAD_URL, getResources().getString(R.string.downloadUrl));
973 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100974}