blob: e67037e37c7f7f48af61e965371a1a16ba46f77a [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;
4import android.content.Context;
5import android.content.DialogInterface;
Jose Pascoalad4ea572014-12-16 20:31:48 +00006import android.content.Intent;
Jose Pascoal2666b892014-10-02 21:05:08 +01007import android.content.SharedPreferences;
8import android.content.SharedPreferences.Editor;
Filipe Gonçalves72817782015-03-19 15:29:05 +00009import android.content.res.Resources;
10import android.net.ConnectivityManager;
Jose Pascoal79357c52015-03-12 20:14:29 +000011import android.net.Uri;
Jose Pascoal91aff132014-10-02 17:19:47 +010012import android.os.Bundle;
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +000013import android.provider.Settings;
Jose Pascoal91aff132014-10-02 17:19:47 +010014import android.support.v4.app.Fragment;
15import android.support.v4.app.FragmentActivity;
Jose Pascoal3bc3a842014-10-16 19:03:21 +010016import android.support.v4.app.FragmentManager;
Jose Pascoal91aff132014-10-02 17:19:47 +010017import android.support.v4.app.FragmentTransaction;
Jose Pascoalaa579a82014-11-05 22:17:16 +000018import android.text.TextUtils;
Jose Pascoal2666b892014-10-02 21:05:08 +010019import android.util.Log;
20import android.view.View;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010021import android.view.View.OnClickListener;
Jose Pascoalc172d892014-11-17 17:36:12 +000022import android.widget.ImageButton;
Jose Pascoal2666b892014-10-02 21:05:08 +010023import android.widget.TextView;
24import android.widget.Toast;
Jose Pascoal91aff132014-10-02 17:19:47 +010025
Jose Pascoal2666b892014-10-02 21:05:08 +010026import com.crashlytics.android.Crashlytics;
Jose Pascoal02d86242014-12-17 18:50:08 +000027import com.fairphone.updater.data.DownloadableItem;
Tiago Costa3add03e2014-12-16 12:05:23 +000028import com.fairphone.updater.data.Store;
Jose Pascoal7bf83a02014-10-13 18:30:18 +010029import com.fairphone.updater.data.UpdaterData;
30import com.fairphone.updater.data.Version;
31import com.fairphone.updater.data.VersionParserHelper;
Jose Pascoalb690af12014-10-06 18:29:26 +010032import com.fairphone.updater.fragments.DownloadAndRestartFragment;
Tiago Costa3855faa2014-11-14 17:55:05 +000033import com.fairphone.updater.fragments.InfoPopupDialog;
Jose Pascoal91aff132014-10-02 17:19:47 +010034import com.fairphone.updater.fragments.MainFragment;
Tiago Costadaaa32c2015-01-08 12:12:24 +000035import com.fairphone.updater.fragments.VersionDetailFragment;
Tiago Costa3855faa2014-11-14 17:55:05 +000036import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
Jose Pascoalad4ea572014-12-16 20:31:48 +000037import com.fairphone.updater.gappsinstaller.GappsInstallerHelper;
Jose Pascoale4c48e32014-10-03 19:55:39 +010038import com.fairphone.updater.tools.Utils;
Jose Pascoal91aff132014-10-02 17:19:47 +010039
Jose Pascoal7bf83a02014-10-13 18:30:18 +010040public class FairphoneUpdater extends FragmentActivity
Pedro Arelo6d2bac92014-10-09 16:48:27 +010041{
Jose Pascoal91aff132014-10-02 17:19:47 +010042
Jose Pascoal7bf83a02014-10-13 18:30:18 +010043 private static final String TAG = FairphoneUpdater.class.getSimpleName();
Jose Pascoal2666b892014-10-02 21:05:08 +010044
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +000045 private static final String CRASHLYTICS_OPT_IN = "crashlytics_opt_in"; // IMPORTANT: keep synced with Settings.Global.CRASHLYTICS_OPT_IN
46
Pedro Arelo6d2bac92014-10-09 16:48:27 +010047 public static final String FAIRPHONE_UPDATER_NEW_VERSION_RECEIVED = "FairphoneUpdater.NEW.VERSION.RECEIVED";
Jose Pascoal2666b892014-10-02 21:05:08 +010048
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000049 private static final String PREFERENCE_FIRST_TIME_ANDROID = "FirstTimeAndroid";
Jose Pascoal02d86242014-12-17 18:50:08 +000050
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000051 private static final String PREFERENCE_FIRST_TIME_FAIRPHONE = "FirstTimeFairphone";
Jose Pascoal02d86242014-12-17 18:50:08 +000052
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000053 private static final String PREFERENCE_FIRST_TIME_APP_STORE = "FirstTimeAppStore";
Tiago Costadaaa32c2015-01-08 12:12:24 +000054
Jose Pascoal85b803b2015-03-19 12:23:11 +000055 public static final String PREFERENCE_CURRENT_UPDATER_STATE = "CurrentUpdaterState";
Jose Pascoal2666b892014-10-02 21:05:08 +010056
Pedro Arelo6d2bac92014-10-09 16:48:27 +010057 private static final String PREFERENCE_DOWNLOAD_ID = "LatestUpdateDownloadId";
Jose Pascoal2666b892014-10-02 21:05:08 +010058
Pedro Arelo6d2bac92014-10-09 16:48:27 +010059 public static final String FAIRPHONE_UPDATER_PREFERENCES = "FairphoneUpdaterPreferences";
Jose Pascoal2666b892014-10-02 21:05:08 +010060
Jose Pascoal85b803b2015-03-19 12:23:11 +000061 public static final String PREFERENCE_SELECTED_VERSION_NUMBER = "SelectedVersionNumber";
Jose Pascoal2666b892014-10-02 21:05:08 +010062
Jose Pascoal85b803b2015-03-19 12:23:11 +000063 public static final String PREFERENCE_SELECTED_VERSION_TYPE = "SelectedVersionImageType";
Jose Pascoal2666b892014-10-02 21:05:08 +010064
Pedro Arelo6d2bac92014-10-09 16:48:27 +010065 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_FAILED = "FairphoneUpdater.Config.File.Download.FAILED";
Jose Pascoal2666b892014-10-02 21:05:08 +010066
Pedro Arelo6d2bac92014-10-09 16:48:27 +010067 public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_LINK = "FairphoneUpdater.ConfigFile.Download.LINK";
Jose Pascoal02d86242014-12-17 18:50:08 +000068
Jose Pascoalad4ea572014-12-16 20:31:48 +000069 public static final String PREFERENCE_SELECTED_STORE_NUMBER = "SelectedStoreNumber";
Filipe Gonçalvesafeac2c2015-01-27 17:49:53 +000070
71 public static final String PREFERENCE_OTA_DOWNLOAD_URL = "OtaDownloadUrl";
Jose Pascoal87758742015-01-28 20:00:22 +000072
73 private static final String TAG_FIRST_FRAGMENT = "FIRST_FRAGMENT";
Jose Pascoal79357c52015-03-12 20:14:29 +000074 private String mZipPath;
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +000075 private AlertDialog wifiOffDialog;
Filipe Gonçalvesafeac2c2015-01-27 17:49:53 +000076
Jose Pascoal2666b892014-10-02 21:05:08 +010077
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +000078 public static enum UpdaterState
Pedro Arelo6d2bac92014-10-09 16:48:27 +010079 {
Jose Pascoal79357c52015-03-12 20:14:29 +000080 NORMAL, DOWNLOAD, PREINSTALL, ZIP_INSTALL
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +000081 }
Jose Pascoal2666b892014-10-02 21:05:08 +010082
Pedro Arelo6d2bac92014-10-09 16:48:27 +010083 private Version mDeviceVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010084 private Version mLatestVersion;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010085 private Version mSelectedVersion;
Jose Pascoal2666b892014-10-02 21:05:08 +010086
Pedro Arelo6d2bac92014-10-09 16:48:27 +010087 private UpdaterState mCurrentState;
Pedro Arelo6d2bac92014-10-09 16:48:27 +010088 private SharedPreferences mSharedPreferences;
Jose Pascoal2666b892014-10-02 21:05:08 +010089
Pedro Arelo6d2bac92014-10-09 16:48:27 +010090 private long mLatestUpdateDownloadId;
Jose Pascoal2666b892014-10-02 21:05:08 +010091
Pedro Arelo6d2bac92014-10-09 16:48:27 +010092 public static boolean DEV_MODE_ENABLED;
Filipe Gonçalves825414a2015-01-26 14:52:48 +000093 public static boolean BETA_MODE_ENABLED;
Jose Pascoal2666b892014-10-02 21:05:08 +010094
Pedro Arelo6d2bac92014-10-09 16:48:27 +010095 private TextView headerMainFairphoneText;
96 private TextView headerMainAndroidText;
97 private TextView headerFairphoneText;
98 private TextView headerAndroidText;
Tiago Costa6d360e22014-12-15 14:32:51 +000099 private TextView headerAppStoreText;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100100 private TextView headerOtherOSText;
Jose Pascoalc172d892014-11-17 17:36:12 +0000101 private ImageButton headerFairphoneInfoButton;
102 private ImageButton headerAndroidInfoButton;
Jose Pascoal02d86242014-12-17 18:50:08 +0000103
Tiago Costa9008b612014-11-14 18:19:50 +0000104 private boolean mIsFirstTimeAndroid;
105 private boolean mIsFirstTimeFairphone;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000106 private boolean mIsFirstTimeAppStore;
Jose Pascoal02d86242014-12-17 18:50:08 +0000107
Jose Pascoalad4ea572014-12-16 20:31:48 +0000108 private Store mSelectedStore;
Jose Pascoal02d86242014-12-17 18:50:08 +0000109
110 private TextView headerMainAppStoreText;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100111 public static enum HeaderType
112 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000113 MAIN_FAIRPHONE, MAIN_ANDROID, MAIN_APP_STORE, FAIRPHONE, ANDROID, OTHER_OS, APP_STORE
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000114 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100115
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100116 @Override
117 protected void onCreate(Bundle savedInstanceState)
118 {
119 super.onCreate(savedInstanceState);
Jose Pascoal79357c52015-03-12 20:14:29 +0000120 mSharedPreferences = getSharedPreferences(FAIRPHONE_UPDATER_PREFERENCES, MODE_PRIVATE);
121
Jose Pascoal87758742015-01-28 20:00:22 +0000122 onNewIntent(getIntent());
123
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100124 setContentView(R.layout.activity_updater);
Jose Pascoal2666b892014-10-02 21:05:08 +0100125
Filipe Gonçalves49ce23c2015-02-13 16:33:52 +0000126 if (Settings.Global.getInt(getContentResolver(), CRASHLYTICS_OPT_IN, 0) == 1)
127 {
128 Log.d(TAG, "Crash reports active.");
129 Crashlytics.start(this);
130 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100131
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100132 DEV_MODE_ENABLED = false;
Jose Pascoal2666b892014-10-02 21:05:08 +0100133
Tiago Costa9008b612014-11-14 18:19:50 +0000134 // update first times
135 mIsFirstTimeAndroid = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_ANDROID, true);
Jose Pascoal02d86242014-12-17 18:50:08 +0000136
Tiago Costa9008b612014-11-14 18:19:50 +0000137 mIsFirstTimeFairphone = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, true);
Jose Pascoal02d86242014-12-17 18:50:08 +0000138
Tiago Costae02ce352015-01-23 15:43:22 +0000139 mIsFirstTimeAppStore = false;//mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_APP_STORE, true);
Tiago Costa1216b102015-03-10 15:48:18 +0000140
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000141 String otaDownloadUrl = getResources().getString(R.string.downloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000142
143 // reset download URL
144 Editor editor = mSharedPreferences.edit();
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000145 editor.putString(PREFERENCE_OTA_DOWNLOAD_URL, otaDownloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000146 editor.commit();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000147
Filipe Gonçalvesad527aa2015-01-12 15:13:35 +0000148 // get system data
149 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
150
151 isDeviceSupported();
152
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000153 setupBetaStatus();
154
Jose Pascoalaa579a82014-11-05 22:17:16 +0000155 // check current state
156 mCurrentState = getCurrentUpdaterState();
Jose Pascoalaa579a82014-11-05 22:17:16 +0000157
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100158 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
Filipe Gonçalves9c8d93a2015-01-28 14:35:49 +0000159 if (!isConfigLoaded) {
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000160 mSharedPreferences.edit().remove(UpdaterService.LAST_CONFIG_DOWNLOAD_IN_MS).apply();
Filipe Gonçalves9c8d93a2015-01-28 14:35:49 +0000161 }
Filipe Gonçalves42ffc322015-01-28 12:51:14 +0000162
163 startService();
Jose Pascoal2666b892014-10-02 21:05:08 +0100164
Jose Pascoalaa579a82014-11-05 22:17:16 +0000165 if (mDeviceVersion != null)
166 {
167 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
168 }
169 else
170 {
171 mLatestVersion = null;
172 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100173
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100174 getSelectedVersionFromSharedPreferences();
Jose Pascoalad4ea572014-12-16 20:31:48 +0000175 getSelectedStoreFromSharedPreferences();
Jose Pascoal2666b892014-10-02 21:05:08 +0100176
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100177 initHeaderViews();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100178
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100179 setupFragments(savedInstanceState);
180 }
Filipe Gonçalves72817782015-03-19 15:29:05 +0000181
182
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000183
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000184 void setupBetaStatus()
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000185 {
186 BETA_MODE_ENABLED = mDeviceVersion.getBetaStatus().equals("1");
187 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100188
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100189 private void isDeviceSupported()
190 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000191 if(Utils.isDeviceUnsupported(this))
Jose Pascoalda00b382015-01-20 18:39:28 +0000192 {
Filipe Gonçalvesad527aa2015-01-12 15:13:35 +0000193 Toast.makeText(this, R.string.device_not_supported_message, Toast.LENGTH_LONG).show();
194 finish();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100195 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100196 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100197
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000198 void getSelectedVersionFromSharedPreferences()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100199 {
200 String versionImageType = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_TYPE, "");
201 int versionNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0);
202 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
203 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000204
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000205 void getSelectedStoreFromSharedPreferences()
Jose Pascoalad4ea572014-12-16 20:31:48 +0000206 {
Jose Pascoal85b803b2015-03-19 12:23:11 +0000207 int storeNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000208 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
209 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100210
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100211 public UpdaterState getCurrentUpdaterState()
212 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100213
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000214 String currentState = mSharedPreferences.getString(PREFERENCE_CURRENT_UPDATER_STATE, null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100215
Jose Pascoalaa579a82014-11-05 22:17:16 +0000216 if (TextUtils.isEmpty(currentState))
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100217 {
218 currentState = UpdaterState.NORMAL.name();
Jose Pascoal2666b892014-10-02 21:05:08 +0100219
Jose Pascoalaa579a82014-11-05 22:17:16 +0000220 updateStatePreference(UpdaterState.NORMAL);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100221 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100222
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100223 return UpdaterState.valueOf(currentState);
224 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100225
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000226 long getLongPreference(String key)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100227 {
228 return mSharedPreferences.getLong(key, 0);
229 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100230
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000231 void savePreference(String key, long value)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100232 {
233 Editor editor = mSharedPreferences.edit();
Jose Pascoal2666b892014-10-02 21:05:08 +0100234
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100235 editor.putLong(key, value);
Jose Pascoal2666b892014-10-02 21:05:08 +0100236
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100237 editor.commit();
238 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100239
Tiago Costa1216b102015-03-10 15:48:18 +0000240 public void changeOTADownloadURL(String newUrl){
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000241 String otaDownloadUrl = TextUtils.isEmpty(newUrl) ? getResources().getString(R.string.downloadUrl) : newUrl;
Jose Pascoaldca09ac2015-03-11 16:35:06 +0000242
Tiago Costa1216b102015-03-10 15:48:18 +0000243 Editor editor = mSharedPreferences.edit();
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000244 editor.putString(PREFERENCE_OTA_DOWNLOAD_URL, otaDownloadUrl);
Tiago Costa1216b102015-03-10 15:48:18 +0000245 editor.commit();
246 }
247
Filipe Gonçalves1e69a0e2015-03-16 17:22:55 +0000248 public void forceConfigDownload(){
Tiago Costa1216b102015-03-10 15:48:18 +0000249 Utils.downloadConfigFile(this, true);
250 }
251
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100252 private void initHeaderViews()
253 {
254 headerMainFairphoneText = (TextView) findViewById(R.id.header_main_fairphone_text);
255 headerMainAndroidText = (TextView) findViewById(R.id.header_main_android_text);
Jose Pascoal02d86242014-12-17 18:50:08 +0000256 headerMainAppStoreText = (TextView) findViewById(R.id.header_main_app_store_text);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100257 headerFairphoneText = (TextView) findViewById(R.id.header_fairphone_text);
258 headerAndroidText = (TextView) findViewById(R.id.header_android_text);
259 headerOtherOSText = (TextView) findViewById(R.id.header_other_os_text);
Tiago Costa6d360e22014-12-15 14:32:51 +0000260 headerAppStoreText = (TextView) findViewById(R.id.header_app_store_text);
Jose Pascoal2666b892014-10-02 21:05:08 +0100261
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100262 OnClickListener headerBackPressListener = new OnClickListener()
263 {
264 @Override
265 public void onClick(View v)
266 {
267 onBackPressed();
268 }
269 };
Jose Pascoal2666b892014-10-02 21:05:08 +0100270
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100271 headerFairphoneText.setOnClickListener(headerBackPressListener);
272 headerAndroidText.setOnClickListener(headerBackPressListener);
Tiago Costa6d360e22014-12-15 14:32:51 +0000273 headerAppStoreText.setOnClickListener(headerBackPressListener);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100274 headerOtherOSText.setOnClickListener(headerBackPressListener);
Jose Pascoal02d86242014-12-17 18:50:08 +0000275
276 headerFairphoneInfoButton = (ImageButton) findViewById(R.id.header_fairphone_info_button);
277 headerAndroidInfoButton = (ImageButton) findViewById(R.id.header_android_info_button);
278
Tiago Costa3855faa2014-11-14 17:55:05 +0000279 headerFairphoneInfoButton.setOnClickListener(new OnClickListener()
280 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000281
Tiago Costa3855faa2014-11-14 17:55:05 +0000282 @Override
283 public void onClick(View v)
284 {
285 showInfoPopupDialog(DetailLayoutType.FAIRPHONE);
286 }
287 });
Jose Pascoal02d86242014-12-17 18:50:08 +0000288
Tiago Costa3855faa2014-11-14 17:55:05 +0000289 headerAndroidInfoButton.setOnClickListener(new OnClickListener()
290 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000291
Tiago Costa3855faa2014-11-14 17:55:05 +0000292 @Override
293 public void onClick(View v)
294 {
295 showInfoPopupDialog(DetailLayoutType.ANDROID);
296 }
297 });
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100298 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100299
Tiago Costa3855faa2014-11-14 17:55:05 +0000300 private void showInfoPopupDialog(DetailLayoutType layoutType)
301 {
302 FragmentManager fm = getSupportFragmentManager();
Jose Pascoal02d86242014-12-17 18:50:08 +0000303 InfoPopupDialog popupDialog = new InfoPopupDialog(layoutType);
Tiago Costa3855faa2014-11-14 17:55:05 +0000304 popupDialog.show(fm, layoutType.name());
305 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000306
Jose Pascoalb397dc62014-10-13 19:26:58 +0100307 @Override
308 public void onBackPressed()
309 {
310 Fragment fragment = getTopFragment();
Jose Pascoal40916302015-02-06 18:43:47 +0000311 if (fragment != null && fragment instanceof DownloadAndRestartFragment && getCurrentUpdaterState() != UpdaterState.NORMAL)
Jose Pascoalb397dc62014-10-13 19:26:58 +0100312 {
Jose Pascoal4adf3192015-02-23 18:10:16 +0000313 ((DownloadAndRestartFragment) fragment).abortUpdateProcess("");
Jose Pascoalb397dc62014-10-13 19:26:58 +0100314 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000315
316 if (fragment != null && TAG_FIRST_FRAGMENT.equals(fragment.getTag()))
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100317 {
Jose Pascoalbeebb8b2014-12-17 19:28:04 +0000318 clearSelectedItems();
Jose Pascoal3bc3a842014-10-16 19:03:21 +0100319 finish();
320 }
Jose Pascoal87758742015-01-28 20:00:22 +0000321
322 super.onBackPressed();
Jose Pascoalb397dc62014-10-13 19:26:58 +0100323 }
324
Tiago Costa3855faa2014-11-14 17:55:05 +0000325 public void updateHeader(HeaderType type, String headerText, boolean showInfo)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100326 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100327
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100328 switch (type)
329 {
330 case FAIRPHONE:
331 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100332 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000333 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100334 headerFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100335 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000336 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100337 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal2666b892014-10-02 21:05:08 +0100338
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100339 headerFairphoneText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000340
341 if (showInfo && mIsFirstTimeFairphone)
342 {
Tiago Costa9008b612014-11-14 18:19:50 +0000343 showInfoPopupDialog(DetailLayoutType.UPDATE_FAIRPHONE);
344 Editor editor = mSharedPreferences.edit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000345
Tiago Costa9008b612014-11-14 18:19:50 +0000346 mIsFirstTimeFairphone = false;
Jose Pascoal02d86242014-12-17 18:50:08 +0000347
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000348 editor.putBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000349 editor.apply();
Tiago Costa9008b612014-11-14 18:19:50 +0000350 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000351
Tiago Costa3855faa2014-11-14 17:55:05 +0000352 headerFairphoneInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
353 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100354 break;
Jose Pascoalb690af12014-10-06 18:29:26 +0100355
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100356 case ANDROID:
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.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100361 headerAndroidText.setVisibility(View.VISIBLE);
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 Pascoal91aff132014-10-02 17:19:47 +0100364
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100365 headerAndroidText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000366
367 if (showInfo && mIsFirstTimeAndroid)
368 {
Tiago Costa9008b612014-11-14 18:19:50 +0000369 showInfoPopupDialog(DetailLayoutType.UPDATE_ANDROID);
370 Editor editor = mSharedPreferences.edit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000371
Tiago Costa9008b612014-11-14 18:19:50 +0000372 mIsFirstTimeAndroid = false;
Jose Pascoal02d86242014-12-17 18:50:08 +0000373
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000374 editor.putBoolean(PREFERENCE_FIRST_TIME_ANDROID, 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(View.GONE);
379 headerAndroidInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100380 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100381
Tiago Costa6d360e22014-12-15 14:32:51 +0000382 case APP_STORE:
383 headerMainFairphoneText.setVisibility(View.GONE);
384 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000385 headerMainAppStoreText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000386 headerFairphoneText.setVisibility(View.GONE);
387 headerAndroidText.setVisibility(View.GONE);
388 headerAppStoreText.setVisibility(View.VISIBLE);
389 headerOtherOSText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000390 headerAppStoreText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000391
Tiago Costadaaa32c2015-01-08 12:12:24 +0000392 if (showInfo && mIsFirstTimeAppStore)
393 {
394 showInfoPopupDialog(DetailLayoutType.APP_STORE);
395 Editor editor = mSharedPreferences.edit();
396
397 mIsFirstTimeAppStore = false;
398
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000399 editor.putBoolean(PREFERENCE_FIRST_TIME_APP_STORE, false);
Jose Pascoal0b48f8d2015-02-06 16:06:41 +0000400 editor.apply();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000401 }
402
Tiago Costa6d360e22014-12-15 14:32:51 +0000403 headerFairphoneInfoButton.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000404 headerAndroidInfoButton.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000405 break;
406
Pedro Arelocb88f672014-10-09 17:41:02 +0100407 case OTHER_OS:
408 headerMainFairphoneText.setVisibility(View.GONE);
409 headerMainAndroidText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000410 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100411 headerFairphoneText.setVisibility(View.GONE);
412 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000413 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100414 headerOtherOSText.setVisibility(View.VISIBLE);
415
416 headerOtherOSText.setText(headerText);
Jose Pascoal02d86242014-12-17 18:50:08 +0000417
Tiago Costa3855faa2014-11-14 17:55:05 +0000418 headerFairphoneInfoButton.setVisibility(View.GONE);
419 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100420 break;
421
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100422 case MAIN_ANDROID:
423 headerMainFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100424 headerMainAndroidText.setVisibility(View.VISIBLE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000425 headerMainAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100426 headerFairphoneText.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100427 headerAndroidText.setVisibility(View.GONE);
Tiago Costa6d360e22014-12-15 14:32:51 +0000428 headerAppStoreText.setVisibility(View.GONE);
Pedro Arelocb88f672014-10-09 17:41:02 +0100429 headerOtherOSText.setVisibility(View.GONE);
Jose Pascoal02d86242014-12-17 18:50:08 +0000430
431 headerFairphoneInfoButton.setVisibility(View.GONE);
432 headerAndroidInfoButton.setVisibility(View.GONE);
433 break;
Tiago Costa3855faa2014-11-14 17:55:05 +0000434
Jose Pascoal02d86242014-12-17 18:50:08 +0000435 case MAIN_APP_STORE:
436 headerMainFairphoneText.setVisibility(View.GONE);
437 headerMainAndroidText.setVisibility(View.GONE);
438 headerMainAppStoreText.setVisibility(View.VISIBLE);
439 headerFairphoneText.setVisibility(View.GONE);
440 headerAndroidText.setVisibility(View.GONE);
441 headerAppStoreText.setVisibility(View.GONE);
442 headerOtherOSText.setVisibility(View.GONE);
443
Tiago Costa3855faa2014-11-14 17:55:05 +0000444 headerFairphoneInfoButton.setVisibility(View.GONE);
445 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100446 break;
Jose Pascoal91aff132014-10-02 17:19:47 +0100447
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100448 case MAIN_FAIRPHONE:
449 default:
450 headerMainFairphoneText.setVisibility(View.VISIBLE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100451 headerMainAndroidText.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
Tiago Costa3855faa2014-11-14 17:55:05 +0000457 headerFairphoneInfoButton.setVisibility(View.GONE);
458 headerAndroidInfoButton.setVisibility(View.GONE);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100459 break;
460 }
461 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100462
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100463 private void setupFragments(Bundle savedInstanceState)
464 {
465 // Check that the activity is using the layout version with
466 // the fragment_container FrameLayout
467 if (findViewById(R.id.fragment_holder) != null)
468 {
Jose Pascoal2666b892014-10-02 21:05:08 +0100469
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100470 // However, if we're being restored from a previous state,
471 // then we don't need to do anything and should return or else
472 // we could end up with overlapping fragments.
473 if (savedInstanceState != null)
474 {
475 return;
476 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100477
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100478 // Create a new Fragment to be placed in the activity layout
Jose Pascoal87758742015-01-28 20:00:22 +0000479 Fragment firstFragment = new MainFragment();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100480
481 // In case this activity was started with special instructions from
482 // an
483 // Intent, pass the Intent's extras to the fragment as arguments
Jose Pascoal02d86242014-12-17 18:50:08 +0000484 Intent intent = getIntent();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000485 if (intent != null)
Jose Pascoal02d86242014-12-17 18:50:08 +0000486 {
487 Bundle bundle = intent.getExtras();
488 if (bundle != null)
489 {
490 firstFragment.setArguments(bundle);
491 }
492 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100493
494 // Add the fragment to the 'fragment_container' FrameLayout
Jose Pascoal799e3942014-11-04 21:12:26 +0000495 FragmentManager fragManager = getSupportFragmentManager();
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000496 if (fragManager != null)
Jose Pascoal799e3942014-11-04 21:12:26 +0000497 {
Jose Pascoal87758742015-01-28 20:00:22 +0000498 FragmentTransaction transation = fragManager.beginTransaction();
499 transation.add(R.id.fragment_holder, firstFragment, TAG_FIRST_FRAGMENT);
500 transation.addToBackStack(TAG_FIRST_FRAGMENT);
501 transation.commit();
Jose Pascoal799e3942014-11-04 21:12:26 +0000502 }
503 else
504 {
505 Log.e(TAG, "setupFragments - Couldn't get FragmentManager");
506 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100507 }
508 }
509
510 public Fragment getFragmentFromState()
511 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000512 Fragment firstFragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100513 switch (mCurrentState)
514 {
515 case PREINSTALL:
516 case DOWNLOAD:
Jose Pascoalad4ea572014-12-16 20:31:48 +0000517 if (mSelectedVersion != null)
518 {
Tiago Costa198bf3d2014-12-16 15:23:18 +0000519 firstFragment = new DownloadAndRestartFragment(true);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000520 }
521 else if (mSelectedStore != null)
522 {
Jose Pascoal1c049e02014-12-17 13:03:09 +0000523 firstFragment = new DownloadAndRestartFragment(false);
Jose Pascoal87758742015-01-28 20:00:22 +0000524 } else
525 {
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000526 firstFragment = new MainFragment();
527 updateStatePreference(UpdaterState.NORMAL);
Tiago Costa198bf3d2014-12-16 15:23:18 +0000528 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100529 break;
530 case NORMAL:
Jose Pascoal87758742015-01-28 20:00:22 +0000531 if(mLaunchGapps)
532 {
533 firstFragment = startGappsInstall();
534 }
535 else
536 {
537 firstFragment = new MainFragment();
538 }
539 break;
Jose Pascoal79357c52015-03-12 20:14:29 +0000540 case ZIP_INSTALL:
541 firstFragment = new DownloadAndRestartFragment(true);
542 break;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100543 default:
544 firstFragment = new MainFragment();
545 break;
546 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000547
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100548 return firstFragment;
549 }
Jose Pascoalb690af12014-10-06 18:29:26 +0100550
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100551 public void changeFragment(Fragment newFragment)
552 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100553 Fragment topFragment = getTopFragment();
Filipe Gonçalvesc984d512015-01-14 17:22:58 +0000554 if ( newFragment != null && ( topFragment == null || !newFragment.getClass().equals(topFragment.getClass())) )
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100555 {
Jose Pascoal87758742015-01-28 20:00:22 +0000556 if(topFragment != null && newFragment instanceof MainFragment)
557 {
558 if(TAG_FIRST_FRAGMENT.equals(topFragment.getTag()))
559 {
560 return;
561 }
562 }
563
Jose Pascoal799e3942014-11-04 21:12:26 +0000564 FragmentManager fragManager = getSupportFragmentManager();
565 if (fragManager != null)
566 {
567 FragmentTransaction transaction = fragManager.beginTransaction();
568 // Replace whatever is in the fragment_container view with this
569 // fragment,
570 // and add the transaction to the back stack so the user can
571 // navigate
572 // back
Pedro Arelo8f002432015-02-19 17:03:19 +0000573 transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
Jose Pascoal799e3942014-11-04 21:12:26 +0000574 transaction.replace(R.id.fragment_holder, newFragment);
575 transaction.addToBackStack(null);
Jose Pascoal2666b892014-10-02 21:05:08 +0100576
Jose Pascoal799e3942014-11-04 21:12:26 +0000577 // Commit the transaction
578 transaction.commit();
579 }
580 else
581 {
582 Log.e(TAG, "changeFragment - Couldn't get FragmentManager");
583 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100584 }
585 }
Jose Pascoal436915f2014-10-08 15:37:26 +0100586
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000587 Fragment getTopFragment()
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100588 {
Jose Pascoal799e3942014-11-04 21:12:26 +0000589 Fragment topFragment = null;
590 FragmentManager fragManager = getSupportFragmentManager();
591 if (fragManager != null)
592 {
Jose Pascoal87758742015-01-28 20:00:22 +0000593 topFragment = fragManager.findFragmentById(R.id.fragment_holder);
Jose Pascoal799e3942014-11-04 21:12:26 +0000594 }
595 else
596 {
597 Log.e(TAG, "getTopFragment - Couldn't get FragmentManager");
598 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100599 return topFragment;
600 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100601
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100602 public boolean isUpdateAvailable()
603 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000604 boolean update = false;
Filipe Gonçalves3b08c8b2015-02-03 15:18:28 +0000605 if (mLatestVersion != null)
Filipe Gonçalves825414a2015-01-26 14:52:48 +0000606 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000607 update = BETA_MODE_ENABLED || mLatestVersion.isNewerVersionThan(mDeviceVersion);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000608 }
609 return update;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100610 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100611
Jose Pascoal40916302015-02-06 18:43:47 +0000612 public String getItemName(DownloadableItem item, boolean isVersion)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100613 {
Jose Pascoal02d86242014-12-17 18:50:08 +0000614 String itemName = "";
615 if (item != null)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100616 {
Jose Pascoal40916302015-02-06 18:43:47 +0000617 if(isVersion)
Jose Pascoal02d86242014-12-17 18:50:08 +0000618 {
Jose Pascoal40916302015-02-06 18:43:47 +0000619 itemName = getVersionName((Version) item);
Jose Pascoal02d86242014-12-17 18:50:08 +0000620 }
Jose Pascoal40916302015-02-06 18:43:47 +0000621 else
Jose Pascoal02d86242014-12-17 18:50:08 +0000622 {
Jose Pascoal40916302015-02-06 18:43:47 +0000623 itemName = getStoreName((Store) item);
624 }
625 }
626 return itemName;
627 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000628
Jose Pascoal40916302015-02-06 18:43:47 +0000629 public String getVersionName(Version version)
630 {
631 String itemName = "";
632 if (version != null)
633 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000634 if(mCurrentState != UpdaterState.ZIP_INSTALL) {
635 itemName = version.getImageTypeDescription(getResources()) + " ";
636 }
637 itemName += version.getName() + " " + version.getBuildNumber();
Jose Pascoal40916302015-02-06 18:43:47 +0000638 }
639 return itemName;
640 }
641
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000642 public static String getStoreName(Store store)
Jose Pascoal40916302015-02-06 18:43:47 +0000643 {
644 String itemName = "";
645 if (store != null)
646 {
647 itemName = store.getName();
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100648 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000649 return itemName;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100650 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100651
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100652 public String getDeviceVersionName()
653 {
Jose Pascoal40916302015-02-06 18:43:47 +0000654 return getVersionName(mDeviceVersion);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100655 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100656
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100657 public String getLatestVersionName()
658 {
Jose Pascoal40916302015-02-06 18:43:47 +0000659 return getVersionName(mLatestVersion);
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100660 }
Jose Pascoal2666b892014-10-02 21:05:08 +0100661
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100662 public Version getDeviceVersion()
663 {
664 return mDeviceVersion;
665 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100666
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100667 public Version getLatestVersion()
668 {
669 return mLatestVersion;
670 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100671
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100672 public Version getSelectedVersion()
673 {
674 return mSelectedVersion;
675 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000676
Jose Pascoalad4ea572014-12-16 20:31:48 +0000677 public Store getSelectedStore()
678 {
679 return mSelectedStore;
680 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100681
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000682 public static HeaderType getHeaderTypeFromImageType(String imageType)
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100683 {
684 HeaderType type = HeaderType.MAIN_FAIRPHONE;
685 if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
686 {
687 type = HeaderType.ANDROID;
688 }
689 else if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(imageType))
690 {
691 type = HeaderType.FAIRPHONE;
692 }
693 return type;
694 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100695
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100696 public void setSelectedVersion(Version selectedVersion)
697 {
698 int versionNumber = selectedVersion != null ? selectedVersion.getNumber() : 0;
699 String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
Jose Pascoale4c48e32014-10-03 19:55:39 +0100700
Jose Pascoalad4ea572014-12-16 20:31:48 +0000701 clearSelectedVersion(versionNumber, versionImageType);
702
703 mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
Jose Pascoal055562d2015-03-19 19:31:38 +0000704 clearSelectedStore(-1);
Jose Pascoalad4ea572014-12-16 20:31:48 +0000705 }
706
Jose Pascoal02d86242014-12-17 18:50:08 +0000707 public void clearSelectedItems()
708 {
709 clearSelectedVersion(0, "");
Jose Pascoal85b803b2015-03-19 12:23:11 +0000710 clearSelectedStore(-1);
Jose Pascoal02d86242014-12-17 18:50:08 +0000711 }
712
Jose Pascoalad4ea572014-12-16 20:31:48 +0000713 private void clearSelectedVersion(int versionNumber, String versionImageType)
714 {
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100715 Editor editor = mSharedPreferences.edit();
716 editor.putInt(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
717 editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
718 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000719
Jose Pascoalad4ea572014-12-16 20:31:48 +0000720 mSelectedVersion = null;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100721 }
Jose Pascoal02d86242014-12-17 18:50:08 +0000722
Tiago Costa3add03e2014-12-16 12:05:23 +0000723 public void setSelectedStore(Store selectedStore)
724 {
Jose Pascoal055562d2015-03-19 19:31:38 +0000725 int storeNumber = selectedStore != null ? selectedStore.getNumber() : -1;
Jose Pascoalad4ea572014-12-16 20:31:48 +0000726
727 clearSelectedStore(storeNumber);
728
729 mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
730 clearSelectedVersion(0, "");
731 }
732
733 private void clearSelectedStore(int storeNumber)
734 {
735 Editor editor = mSharedPreferences.edit();
736 editor.putInt(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
737 editor.commit();
Jose Pascoal02d86242014-12-17 18:50:08 +0000738
Jose Pascoalad4ea572014-12-16 20:31:48 +0000739 mSelectedStore = null;
Tiago Costa3add03e2014-12-16 12:05:23 +0000740 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100741
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100742 public void resetLastUpdateDownloadId()
743 {
744 mLatestUpdateDownloadId = 0;
745 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
746 setSelectedVersion(null);
747 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100748
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100749 private Version getLatestVersionFromConfig()
750 {
Jose Pascoalaa579a82014-11-05 22:17:16 +0000751 Version latest = null;
752 if (mDeviceVersion != null)
753 {
754 latest = UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType());
755 }
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100756 return latest;
757 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100758
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100759 public void updateLatestVersionFromConfig()
760 {
761 mLatestVersion = getLatestVersionFromConfig();
762 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100763
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000764 private boolean mLaunchGapps = false;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000765
766 @Override
767 protected void onNewIntent(Intent intent)
768 {
Jose Pascoal87758742015-01-28 20:00:22 +0000769 super.onNewIntent(intent);
770 setIntent(intent);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000771 mLaunchGapps = false;
772
Jose Pascoal79357c52015-03-12 20:14:29 +0000773 if(intent != null) {
774 String action = intent.getAction();
775 switch (action)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000776 {
Jose Pascoal79357c52015-03-12 20:14:29 +0000777 case GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL:
778 if (checkStartGappsInstall(intent)) {
779 mLaunchGapps = true;
780 } else {
781 Intent parentIntent = getParentActivityIntent();
782 if (checkStartGappsInstall(parentIntent)) {
783 mLaunchGapps = true;
784 }
785 }
786 break;
787 case Intent.ACTION_VIEW:
788 Uri data = intent.getData();
789 if(data != null)
790 {
Jose Pascoal2a8283b2015-03-13 14:43:42 +0000791
792 String zipPath = Utils.getPath(this, data);
Jose Pascoal79357c52015-03-12 20:14:29 +0000793 if(!TextUtils.isEmpty(zipPath)) {
794 mZipPath = zipPath;
795 updateStatePreference(UpdaterState.ZIP_INSTALL);
796 }
797 else
798 {
799 mZipPath = "";
800 }
801 }
802 break;
803 default:
804 //no action
805 break;
Tiago Costadaaa32c2015-01-08 12:12:24 +0000806 }
807 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000808 }
809
Jose Pascoalcfc2dd42015-02-09 18:00:05 +0000810 private static boolean checkStartGappsInstall(Intent intent)
Jose Pascoal62235572015-01-29 16:42:23 +0000811 {
812 return intent != null && GappsInstallerHelper.EXTRA_START_GAPPS_INSTALL.equals(intent.getAction());
813 }
814
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000815 @Override
816 protected void onPause() {
817 super.onPause();
818 if(wifiOffDialog != null) {
819 wifiOffDialog.cancel();
820 wifiOffDialog = null;
821 }
822 }
823
824 @Override
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100825 protected void onResume()
826 {
827 super.onResume();
Jose Pascoal87758742015-01-28 20:00:22 +0000828
829 // check current state
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100830 mCurrentState = getCurrentUpdaterState();
Jose Pascoal79357c52015-03-12 20:14:29 +0000831 if(mCurrentState == UpdaterState.ZIP_INSTALL)
832 {
Jose Pascoal844a0ea2015-03-13 17:10:39 +0000833 updateStatePreference(TextUtils.isEmpty(mZipPath) ? UpdaterState.NORMAL : UpdaterState.ZIP_INSTALL);
Jose Pascoal79357c52015-03-12 20:14:29 +0000834 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100835
Jose Pascoalaa579a82014-11-05 22:17:16 +0000836 startService();
Jose Pascoal87758742015-01-28 20:00:22 +0000837
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100838 boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
839 mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
Jose Pascoalaa579a82014-11-05 22:17:16 +0000840
841 if (mDeviceVersion != null)
842 {
843 mLatestVersion = isConfigLoaded ? UpdaterData.getInstance().getLatestVersion(mDeviceVersion.getImageType()) : null;
844 }
845 else
846 {
847 mLatestVersion = null;
848 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100849
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100850 getSelectedVersionFromSharedPreferences();
Jose Pascoalad4ea572014-12-16 20:31:48 +0000851 getSelectedStoreFromSharedPreferences();
Jose Pascoal87758742015-01-28 20:00:22 +0000852
853 changeFragment(getFragmentFromState());
Filipe Gonçalves7f6359a2015-03-19 16:01:03 +0000854
855 // Show wifi disable dialog if in a blank state and no wifi is available
856 if ( wifiOffDialog == null &&
857 mCurrentState == UpdaterState.NORMAL &&
858 !Utils.isWiFiEnabled(this) &&
859 UpdaterData.getInstance().isAppStoreListEmpty() &&
860 !UpdaterData.getInstance().isAOSPVersionListNotEmpty() &&
861 !UpdaterData.getInstance().isFairphoneVersionListNotEmpty() )
862 {
863 Resources resources = getResources();
864
865 AlertDialog.Builder wifiOffDialogBuilder = new AlertDialog.Builder(this);
866
867 wifiOffDialogBuilder.setTitle(resources.getString(R.string.wifi_disabled));
868
869 // Setting Dialog Message
870 wifiOffDialogBuilder.setMessage(resources.getString(R.string.wifi_discaimer_message_startup));
871 wifiOffDialogBuilder.setPositiveButton(resources.getString(android.R.string.ok), new DialogInterface.OnClickListener() {
872 public void onClick(DialogInterface dialog, int id) {
873 // do nothing, since the state is still the same
874 }
875 });
876 wifiOffDialog = wifiOffDialogBuilder.create();
877 wifiOffDialog.show();
878 }
Tiago Costadaaa32c2015-01-08 12:12:24 +0000879 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100880
Jose Pascoal87758742015-01-28 20:00:22 +0000881 public Fragment startGappsInstall()
Tiago Costadaaa32c2015-01-08 12:12:24 +0000882 {
Jose Pascoal055562d2015-03-19 19:31:38 +0000883 mSelectedStore = Utils.getGappsStore();
Tiago Costadaaa32c2015-01-08 12:12:24 +0000884
885 VersionDetailFragment fragment = new VersionDetailFragment(false);
886
Tiago Costa73575aa2015-01-19 15:48:26 +0000887 if (mSelectedStore != null)
Tiago Costadaaa32c2015-01-08 12:12:24 +0000888 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000889 fragment.setupAppStoreFragment(mSelectedStore);
Tiago Costadaaa32c2015-01-08 12:12:24 +0000890 }
Jose Pascoal87758742015-01-28 20:00:22 +0000891 else
892 {
893 fragment = null;
894 }
895
896 return fragment;
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100897 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100898
Jose Pascoalaa579a82014-11-05 22:17:16 +0000899 private void startService()
900 {
901 if (mCurrentState == UpdaterState.NORMAL)
902 {
903 Utils.startUpdaterService(this, true);
904 }
905 else
906 {
907 Utils.startUpdaterService(this, false);
908 }
909 }
910
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100911 public void updateStatePreference(UpdaterState newState)
912 {
913 mCurrentState = newState;
Jose Pascoale4c48e32014-10-03 19:55:39 +0100914
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100915 Editor editor = mSharedPreferences.edit();
Jose Pascoale4c48e32014-10-03 19:55:39 +0100916
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100917 editor.putString(PREFERENCE_CURRENT_UPDATER_STATE, mCurrentState.name());
Jose Pascoale4c48e32014-10-03 19:55:39 +0100918
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100919 editor.commit();
920 }
Jose Pascoale4c48e32014-10-03 19:55:39 +0100921
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100922 public long getLatestDownloadId()
923 {
924 return mLatestUpdateDownloadId;
925 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100926
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100927 public long getLatestUpdateDownloadIdFromSharedPreference()
928 {
929 if (mLatestUpdateDownloadId == 0)
930 {
931 mLatestUpdateDownloadId = getLongPreference(PREFERENCE_DOWNLOAD_ID);
932 }
933 return mLatestUpdateDownloadId;
934 }
Jose Pascoal54b3ae62014-10-07 20:29:58 +0100935
Pedro Arelo6d2bac92014-10-09 16:48:27 +0100936 public void saveLatestUpdateDownloadId(long latestUpdateDownloadId)
937 {
938 mLatestUpdateDownloadId = latestUpdateDownloadId;
939 savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
Jose Pascoal02d86242014-12-17 18:50:08 +0000940 }
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000941
942 public long getConfigFileDownloadIdFromSharedPreference()
943 {
944 return getLongPreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID);
945 }
946
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000947 public void clearConfigFileDownloadId()
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000948 {
Filipe Gonçalvesb31d5862015-02-04 17:28:58 +0000949 savePreference(UpdaterService.PREFERENCE_LAST_CONFIG_DOWNLOAD_ID, 0L);
Jose Pascoalc2545cc2014-12-18 16:51:52 +0000950 }
Jose Pascoal79357c52015-03-12 20:14:29 +0000951
952 public String getZipFilePath()
953 {
954 return mZipPath;
955 }
Jose Pascoal4fe7ba52015-03-13 16:54:31 +0000956
957 public String getPreferenceOtaDownloadUrl()
958 {
959 return mSharedPreferences.getString(FairphoneUpdater.PREFERENCE_OTA_DOWNLOAD_URL, getResources().getString(R.string.downloadUrl));
960 }
Jose Pascoal91aff132014-10-02 17:19:47 +0100961}