blob: 3a181162eb09b8e802a33f9b12c766e8594df0cf [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 }
Maarten Derks4080eee2016-06-06 12:41:24 +0200562 else if (getTopFragment() != null)
563 {
564 firstFragment = getTopFragment();
565 }
Jose Pascoal87758742015-01-28 20:00:22 +0000566 else
567 {
568 firstFragment = new MainFragment();
569 }
570 break;
Jose Pascoal79357c52015-03-12 20:14:29 +0000571 case ZIP_INSTALL:
572 firstFragment = new DownloadAndRestartFragment(true);
573 break;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100574 default:
575 firstFragment = new MainFragment();
576 break;
577 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000578
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100579 return firstFragment;
580 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100581
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100582 public void changeFragment(Fragment newFragment)
583 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100584 Fragment topFragment = getTopFragment();
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000585 if ( newFragment != null && ( topFragment == null || !newFragment.getClass().equals(topFragment.getClass())) )
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100586 {
Jose Pascoal87758742015-01-28 20:00:22 +0000587 if(topFragment != null && newFragment instanceof MainFragment)
588 {
589 if(TAG_FIRST_FRAGMENT.equals(topFragment.getTag()))
590 {
591 return;
592 }
593 }
594
Jose Pascoal799e3942014-11-04 21:12:26 +0000595 FragmentManager fragManager = getSupportFragmentManager();
596 if (fragManager != null)
597 {
598 FragmentTransaction transaction = fragManager.beginTransaction();
599 // Replace whatever is in the fragment_container view with this
600 // fragment,
601 // and add the transaction to the back stack so the user can
602 // navigate
603 // back
Pedro Arelo8f002432015-02-19 17:03:19 +0000604 transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
Jose Pascoal799e3942014-11-04 21:12:26 +0000605 transaction.replace(R.id.fragment_holder, newFragment);
606 transaction.addToBackStack(null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100607
Jose Pascoal799e3942014-11-04 21:12:26 +0000608 // Commit the transaction
609 transaction.commit();
610 }
611 else
612 {
613 Log.e(TAG, "changeFragment - Couldn't get FragmentManager");
614 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100615 }
616 }
Jose Pascoal436915f2014-10-08 15:37:26 +0100617
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000618 Fragment getTopFragment()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100619 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000620 Fragment topFragment = null;
621 FragmentManager fragManager = getSupportFragmentManager();
622 if (fragManager != null)
623 {
Jose Pascoal87758742015-01-28 20:00:22 +0000624 topFragment = fragManager.findFragmentById(R.id.fragment_holder);
Jose Pascoal799e3942014-11-04 21:12:26 +0000625 }
626 else
627 {
628 Log.e(TAG, "getTopFragment - Couldn't get FragmentManager");
629 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100630 return topFragment;
631 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100632
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100633 public boolean isUpdateAvailable()
634 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000635 boolean update = false;
Filipe Gonçalves3b08c8b2015-02-03 15:18:28 +0000636 if (mLatestVersion != null)
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000637 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000638 update = BETA_MODE_ENABLED || mLatestVersion.isNewerVersionThan(mDeviceVersion);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000639 }
640 return update;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100641 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100642
Jose Pascoal40916302015-02-06 18:43:47 +0000643 public String getItemName(DownloadableItem item, boolean isVersion)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100644 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000645 String itemName = "";
646 if (item != null)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100647 {
Jose Pascoal40916302015-02-06 18:43:47 +0000648 if(isVersion)
Jose Pascoal02d86242014-12-17 18:50:08 +0000649 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100650 itemName = ((Version) item).getHumanReadableName();
Jose Pascoal02d86242014-12-17 18:50:08 +0000651 }
Jose Pascoal40916302015-02-06 18:43:47 +0000652 else
Jose Pascoal02d86242014-12-17 18:50:08 +0000653 {
Jose Pascoal40916302015-02-06 18:43:47 +0000654 itemName = getStoreName((Store) item);
655 }
656 }
657 return itemName;
658 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000659
Maarten Derks4bb57892016-01-26 10:52:53 +0100660
Jose Pascoal40916302015-02-06 18:43:47 +0000661
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000662 public static String getStoreName(Store store)
Jose Pascoal40916302015-02-06 18:43:47 +0000663 {
664 String itemName = "";
665 if (store != null)
666 {
667 itemName = store.getName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100668 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000669 return itemName;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100670 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100671
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100672 public String getDeviceVersionName()
673 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100674 return mDeviceVersion.getHumanReadableName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100675 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100676
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100677 public String getLatestVersionName()
678 {
Maarten Derks4bb57892016-01-26 10:52:53 +0100679 return mLatestVersion.getHumanReadableName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100680 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100681
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100682 public Version getDeviceVersion()
683 {
684 return mDeviceVersion;
685 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100686
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100687 public Version getLatestVersion()
688 {
689 return mLatestVersion;
690 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100691
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100692 public Version getSelectedVersion()
693 {
694 return mSelectedVersion;
695 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000696
Jose Pascoalad4ea572014-12-16 20:31:48 +0000697 public Store getSelectedStore()
698 {
699 return mSelectedStore;
700 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100701
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000702 public static HeaderType getHeaderTypeFromImageType(String imageType)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100703 {
704 HeaderType type = HeaderType.MAIN_FAIRPHONE;
705 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
706 {
707 type = HeaderType.ANDROID;
708 }
709 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(imageType))
710 {
711 type = HeaderType.FAIRPHONE;
712 }
713 return type;
714 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100715
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100716 public void setSelectedVersion(Version selectedVersion)
717 {
Maarten Derksf17e6db2016-02-09 15:10:53 +0100718 String versionNumber = selectedVersion != null ? selectedVersion.getId() : "0";
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100719 String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
Jose Pascoale4c48e32014-10-03 19:55:39 +0100720
Jose Pascoalad4ea572014-12-16 20:31:48 +0000721 clearSelectedVersion(versionNumber, versionImageType);
722
723 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
Maarten Derksbb287762015-10-12 17:22:45 +0200724 clearSelectedStore("-1");
Jose Pascoalad4ea572014-12-16 20:31:48 +0000725 }
726
Jose Pascoal02d86242014-12-17 18:50:08 +0000727 public void clearSelectedItems()
728 {
Maarten Derksbb287762015-10-12 17:22:45 +0200729 clearSelectedVersion("0", "");
730 clearSelectedStore("-1");
Jose Pascoal02d86242014-12-17 18:50:08 +0000731 }
732
Maarten Derksbb287762015-10-12 17:22:45 +0200733 private void clearSelectedVersion(String versionNumber, String versionImageType)
Jose Pascoalad4ea572014-12-16 20:31:48 +0000734 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100735 Editor editor = mSharedPreferences.edit();
Maarten Derksbb287762015-10-12 17:22:45 +0200736 editor.putString(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100737 editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
738 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000739
Jose Pascoalad4ea572014-12-16 20:31:48 +0000740 mSelectedVersion = null;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100741 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000742
Tiago Costa3add03e2014-12-16 12:05:23 +0000743 public void setSelectedStore(Store selectedStore)
744 {
Maarten Derksf17e6db2016-02-09 15:10:53 +0100745 String storeNumber = selectedStore != null ? selectedStore.getId() : "-1";
Jose Pascoalad4ea572014-12-16 20:31:48 +0000746
747 clearSelectedStore(storeNumber);
748
749 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
Maarten Derksbb287762015-10-12 17:22:45 +0200750 clearSelectedVersion("0", "");
Jose Pascoalad4ea572014-12-16 20:31:48 +0000751 }
752
Maarten Derksbb287762015-10-12 17:22:45 +0200753 private void clearSelectedStore(String storeNumber)
Jose Pascoalad4ea572014-12-16 20:31:48 +0000754 {
755 Editor editor = mSharedPreferences.edit();
Maarten Derksbb287762015-10-12 17:22:45 +0200756 editor.putString(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000757 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000758
Jose Pascoalad4ea572014-12-16 20:31:48 +0000759 mSelectedStore = null;
Tiago Costa3add03e2014-12-16 12:05:23 +0000760 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100761
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100762 public void resetLastUpdateDownloadId()
763 {
764 mLatestUpdateDownloadId = 0;
765 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
766 setSelectedVersion(null);
767 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100768
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100769 private Version getLatestVersionFromConfig()
770 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000771 Version latest = null;
772 if (mDeviceVersion != null)
773 {
774 latest = UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType());
775 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100776 return latest;
777 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100778
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100779 public void updateLatestVersionFromConfig()
780 {
781 mLatestVersion = getLatestVersionFromConfig();
782 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100783
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000784 private boolean mLaunchGapps = false;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000785
786 @Override
787 protected void onNewIntent(Intent intent)
788 {
Jose Pascoal87758742015-01-28 20:00:22 +0000789 super.onNewIntent(intent);
790 setIntent(intent);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000791 mLaunchGapps = false;
792
Jose Pascoal79357c52015-03-12 20:14:29 +0000793 if(intent != null) {
Jose Pascoal8b8c2d22015-03-30 12:11:44 +0100794 String action = TextUtils.isEmpty(intent.getAction()) ? "" : intent.getAction();
Jose Pascoal79357c52015-03-12 20:14:29 +0000795 switch (action)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000796 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000797 case GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL:
798 if (checkStartGappsInstall(intent)) {
799 mLaunchGapps = true;
800 } else {
801 Intent parentIntent = getParentActivityIntent();
802 if (checkStartGappsInstall(parentIntent)) {
803 mLaunchGapps = true;
804 }
805 }
806 break;
807 case Intent.ACTION_VIEW:
808 Uri data = intent.getData();
809 if(data != null)
810 {
Jose Pascoal2a8283b2015-03-13 14:43:42 +0000811
812 String zipPath = Utils.getPath(this, data);
Jose Pascoal79357c52015-03-12 20:14:29 +0000813 if(!TextUtils.isEmpty(zipPath)) {
814 mZipPath = zipPath;
815 updateStatePreference(UpdaterState.ZIP_INSTALL);
816 }
817 else
818 {
819 mZipPath = "";
820 }
821 }
822 break;
823 default:
824 //no action
825 break;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000826 }
827 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000828 }
829
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000830 private static boolean checkStartGappsInstall(Intent intent)
Jose Pascoal62235572015-01-29 16:42:23 +0000831 {
832 return intent != null && GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL.equals(intent.getAction());
833 }
834
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000835 @Override
836 protected void onPause() {
837 super.onPause();
Maarten Derks0d5083c2016-05-31 14:38:26 +0200838 if(internetOffDialog != null) {
839 internetOffDialog.cancel();
840 internetOffDialog = null;
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000841 }
842 }
843
844 @Override
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100845 protected void onResume()
846 {
847 super.onResume();
Jose Pascoal87758742015-01-28 20:00:22 +0000848
849 // check current state
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100850 mCurrentState = getCurrentUpdaterState();
Jose Pascoal79357c52015-03-12 20:14:29 +0000851 if(mCurrentState == UpdaterState.ZIP_INSTALL)
852 {
Jose Pascoal844a0ea2015-03-13 17:10:39 +0000853 updateStatePreference(TextUtils.isEmpty(mZipPath) ? UpdaterState.NORMAL : UpdaterState.ZIP_INSTALL);
Jose Pascoal79357c52015-03-12 20:14:29 +0000854 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100855
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100856 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
857 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000858
859 if (mDeviceVersion != null)
860 {
861 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
862 }
863 else
864 {
865 mLatestVersion = null;
866 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100867
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100868 getSelectedVersionFromSharedPreferences();
Jose Pascoalad4ea572014-12-16 20:31:48 +0000869 getSelectedStoreFromSharedPreferences();
Jose Pascoal87758742015-01-28 20:00:22 +0000870
871 changeFragment(getFragmentFromState());
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000872
Maarten Derks0d5083c2016-05-31 14:38:26 +0200873 // Show internet disable dialog if in a blank state and no internet is available
874 if( internetOffDialog == null &&
875 mCurrentState == UpdaterState.NORMAL &&
876 !Utils.isInternetEnabled(this) &&
877 UpdaterData.getInstance().isAppStoreListEmpty() &&
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000878 !UpdaterData.getInstance().isAOSPVersionListNotEmpty() &&
Maarten Derks0d5083c2016-05-31 14:38:26 +0200879 !UpdaterData.getInstance().isFairphoneVersionListNotEmpty())
880 {
881 Resources resources = getResources();
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000882
Maarten Derks0d5083c2016-05-31 14:38:26 +0200883 AlertDialog.Builder internetOffDialogBuilder = new AlertDialog.Builder(this);
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000884
Maarten Derks0d5083c2016-05-31 14:38:26 +0200885 internetOffDialogBuilder.setTitle(R.string.connect_to_internet);
886 internetOffDialogBuilder.setIcon(resources.getDrawable(R.drawable.ic_import_export_fpblue_24dp));
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000887
Maarten Derks0d5083c2016-05-31 14:38:26 +0200888 internetOffDialogBuilder.setPositiveButton(resources.getString(R.string.got_it), new DialogInterface.OnClickListener() {
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000889 public void onClick(DialogInterface dialog, int id) {
890 // do nothing, since the state is still the same
891 }
892 });
Maarten Derks0d5083c2016-05-31 14:38:26 +0200893 internetOffDialog = internetOffDialogBuilder.create();
894 internetOffDialog.show();
895 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000896 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100897
Jose Pascoal87758742015-01-28 20:00:22 +0000898 public Fragment startGappsInstall()
Tiago Costadaaa32c2015-01-08 12:12:24 +0000899 {
Jose Pascoal055562d2015-03-19 19:31:38 +0000900 mSelectedStore = Utils.getGappsStore();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000901
902 VersionDetailFragment fragment = new VersionDetailFragment(false);
903
Tiago Costa73575aa2015-01-19 15:48:26 +0000904 if (mSelectedStore != null)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000905 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000906 fragment.setupAppStoreFragment(mSelectedStore);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000907 }
Jose Pascoal87758742015-01-28 20:00:22 +0000908 else
909 {
910 fragment = null;
911 }
912
913 return fragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100914 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100915
Jose Pascoalaa579a82014-11-05 22:17:16 +0000916 private void startService()
917 {
918 if (mCurrentState == UpdaterState.NORMAL)
919 {
920 Utils.startUpdaterService(this, true);
921 }
922 else
923 {
924 Utils.startUpdaterService(this, false);
925 }
926 }
927
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100928 public void updateStatePreference(UpdaterState newState)
929 {
930 mCurrentState = newState;
Jose Pascoale4c48e32014-10-03 19:55:39 +0100931
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100932 Editor editor = mSharedPreferences.edit();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100933
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100934 editor.putString(PREFERENCE_CURRENT_UPDATER_STATE, mCurrentState.name());
Jose Pascoale4c48e32014-10-03 19:55:39 +0100935
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100936 editor.commit();
937 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100938
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100939 public long getLatestDownloadId()
940 {
941 return mLatestUpdateDownloadId;
942 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100943
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100944 public long getLatestUpdateDownloadIdFromSharedPreference()
945 {
946 if (mLatestUpdateDownloadId == 0)
947 {
948 mLatestUpdateDownloadId = getLongPreference(PREFERENCE_DOWNLOAD_ID);
949 }
950 return mLatestUpdateDownloadId;
951 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100952
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100953 public void saveLatestUpdateDownloadId(long latestUpdateDownloadId)
954 {
955 mLatestUpdateDownloadId = latestUpdateDownloadId;
956 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
Jose Pascoal02d86242014-12-17 18:50:08 +0000957 }
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000958
959 public long getConfigFileDownloadIdFromSharedPreference()
960 {
961 return getLongPreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID);
962 }
963
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000964 public void clearConfigFileDownloadId()
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000965 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000966 savePreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID, 0L);
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000967 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000968
969 public String getZipFilePath()
970 {
971 return mZipPath;
972 }
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000973
974 public String getPreferenceOtaDownloadUrl()
975 {
976 return mSharedPreferences.getString(FairphoneUpdater.PREFERENCE_OTA_DOWNLOAD_URL, getResources().getString(R.string.downloadUrl));
977 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100978}