- Main fragment logic added
diff --git a/FairphoneUpdater/src/com/fairphone/updater/FairphoneUpdater2Activity.java b/FairphoneUpdater/src/com/fairphone/updater/FairphoneUpdater2Activity.java
index b221052..d8d3f7f 100644
--- a/FairphoneUpdater/src/com/fairphone/updater/FairphoneUpdater2Activity.java
+++ b/FairphoneUpdater/src/com/fairphone/updater/FairphoneUpdater2Activity.java
@@ -1,57 +1,330 @@
 package com.fairphone.updater;
 
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.content.res.Resources;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentTransaction;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
 
+import com.crashlytics.android.Crashlytics;
 import com.fairphone.updater.fragments.MainFragment;
 
 public class FairphoneUpdater2Activity extends FragmentActivity {
 
+	private static final String TAG = FairphoneUpdater2Activity.class
+			.getSimpleName();
+
+	public static final String FAIRPHONE_UPDATER_NEW_VERSION_RECEIVED = "FairphoneUpdater.NEW.VERSION.RECEIVED";
+
+	public static final String PREFERENCE_CURRENT_UPDATER_STATE = "CurrentUpdaterState";
+
+	private static final String PREFERENCE_DOWNLOAD_ID = "LatestUpdateDownloadId";
+
+	public static final String FAIRPHONE_UPDATER_PREFERENCES = "FairphoneUpdaterPreferences";
+
+	public static final String PREFERENCE_SELECTED_VERSION_NUMBER = "SelectedVersionNumber";
+
+	public static final String PREFERENCE_SELECTED_VERSION_TYPE = "SelectedVersionImageType";
+
+	protected static final String PREFERENCE_SELECTED_VERSION_BEGIN_DOWNLOAD = "SelectedVersionBeginDownload";
+
+	public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_FAILED = "FairphoneUpdater.Config.File.Download.FAILED";
+
+	public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_LINK = "FairphoneUpdater.ConfigFile.Download.LINK";
+
+	public static enum UpdaterState {
+		NORMAL, DOWNLOAD, PREINSTALL
+	};
+
+	private Version mDeviceVersion;
+
+	private Version mLatestVersion;
+
+	private Version mSelectedVersion;
+
+	private UpdaterState mCurrentState;
+
+	private SharedPreferences mSharedPreferences;
+
+	// private DownloadManager mDownloadManager;
+	//
+	// private DownloadBroadCastReceiver mDownloadBroadCastReceiver;
+
+	private long mLatestUpdateDownloadId;
+
+	private BroadcastReceiver newVersionbroadcastReceiver;
+
+	public static boolean DEV_MODE_ENABLED;
+	private int mIsDevModeCounter;
+
+	private TextView headerMainText;
+	private TextView headerFairphoneText;
+	private TextView headerAndroidText;
+
+	public static enum HeaderType {
+		MAIN, FAIRPHONE, ANDROID
+	};
+
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.activity_updater);
+
+		Crashlytics.start(this);
+
+		DEV_MODE_ENABLED = false;
+		mIsDevModeCounter = 10;
 		
+		isDeviceSupported();
+		mSharedPreferences = getSharedPreferences(
+				FAIRPHONE_UPDATER_PREFERENCES, MODE_PRIVATE);
+
+		boolean isConfigLoaded = UpdaterService.readUpdaterData(this);
+
+		// get system data
+		mDeviceVersion = VersionParserHelper.getDeviceVersion(this);
+
+		mLatestVersion = isConfigLoaded ? UpdaterData.getInstance()
+				.getLatestVersion(mDeviceVersion.getImageType())
+				: new Version();
+
+		getSelectedVersionFromSharedPreferences();
+
+		// check current state
+		mCurrentState = getCurrentUpdaterState();
+
+		initHeaderViews();
+
 		setupFragments(savedInstanceState);
 	}
+	
+	private void isDeviceSupported() {
+
+		Resources resources = getResources();
+		String[] suportedDevices = resources.getString(
+				R.string.supportedDevices).split(";");
+		String modelWithoutSpaces = Build.MODEL.replaceAll("\\s", "");
+		for (String device : suportedDevices) {
+			if (modelWithoutSpaces.equalsIgnoreCase(device)) {
+				return;
+			}
+		}
+		Toast.makeText(this, R.string.deviceNotSupported, Toast.LENGTH_LONG)
+				.show();
+		finish();
+	}
+
+	protected void getSelectedVersionFromSharedPreferences() {
+		String versionImageType = mSharedPreferences.getString(
+				PREFERENCE_SELECTED_VERSION_TYPE, "");
+		int versionNumber = mSharedPreferences.getInt(
+				PREFERENCE_SELECTED_VERSION_NUMBER, 0);
+		mSelectedVersion = UpdaterData.getInstance().getVersion(
+				versionImageType, versionNumber);
+	}
+
+	private UpdaterState getCurrentUpdaterState() {
+
+		String currentState = getStringPreference(PREFERENCE_CURRENT_UPDATER_STATE);
+
+		if (currentState == null || currentState.isEmpty()) {
+			currentState = UpdaterState.NORMAL.name();
+
+			Editor editor = mSharedPreferences.edit();
+
+			editor.putString(currentState, currentState);
+
+			editor.commit();
+		}
+
+		return UpdaterState.valueOf(currentState);
+	}
+
+	public String getStringPreference(String key) {
+		return mSharedPreferences.getString(key, null);
+	}
+
+	public long getLongPreference(String key) {
+		return mSharedPreferences.getLong(key, 0);
+	}
+
+	public boolean getBooleanPreference(String key) {
+		return mSharedPreferences.getBoolean(key, false);
+	}
+
+	public void savePreference(String key, String value) {
+		Editor editor = mSharedPreferences.edit();
+
+		editor.putString(key, value);
+
+		editor.commit();
+	}
+
+	public void savePreference(String key, boolean value) {
+		Editor editor = mSharedPreferences.edit();
+
+		editor.putBoolean(key, value);
+
+		editor.commit();
+	}
+
+	public void savePreference(String key, long value) {
+		Editor editor = mSharedPreferences.edit();
+
+		editor.putLong(key, value);
+
+		editor.commit();
+	}
+
+	private void initHeaderViews() {
+		headerMainText = (TextView) findViewById(R.id.header_main_text);
+		headerFairphoneText = (TextView) findViewById(R.id.header_fairphone_text);
+		headerAndroidText = (TextView) findViewById(R.id.header_android_text);
+	}
+
+	public void updateHeader(HeaderType type, String headerText) {
+
+		switch (type) {
+		case FAIRPHONE:
+			headerMainText.setVisibility(View.GONE);
+			headerFairphoneText.setVisibility(View.VISIBLE);
+			headerAndroidText.setVisibility(View.GONE);
+
+			headerFairphoneText.setText(headerText);
+			break;
+
+		case ANDROID:
+			headerMainText.setVisibility(View.GONE);
+			headerFairphoneText.setVisibility(View.GONE);
+			headerAndroidText.setVisibility(View.VISIBLE);
+
+			headerAndroidText.setText(headerText);
+			break;
+
+		case MAIN:
+		default:
+			headerMainText.setVisibility(View.VISIBLE);
+			headerFairphoneText.setVisibility(View.GONE);
+			headerAndroidText.setVisibility(View.GONE);
+			break;
+		}
+	}
 
 	private void setupFragments(Bundle savedInstanceState) {
 		// Check that the activity is using the layout version with
-        // the fragment_container FrameLayout
-        if (findViewById(R.id.fragment_holder) != null) {
+		// the fragment_container FrameLayout
+		if (findViewById(R.id.fragment_holder) != null) {
 
-            // However, if we're being restored from a previous state,
-            // then we don't need to do anything and should return or else
-            // we could end up with overlapping fragments.
-            if (savedInstanceState != null) {
-                return;
-            }
+			// However, if we're being restored from a previous state,
+			// then we don't need to do anything and should return or else
+			// we could end up with overlapping fragments.
+			if (savedInstanceState != null) {
+				return;
+			}
 
-            // Create a new Fragment to be placed in the activity layout
-            MainFragment firstFragment = new MainFragment();
-            
-            // In case this activity was started with special instructions from an
-            // Intent, pass the Intent's extras to the fragment as arguments
-            firstFragment.setArguments(getIntent().getExtras());
-            
-            // Add the fragment to the 'fragment_container' FrameLayout
-            getSupportFragmentManager().beginTransaction()
-                    .add(R.id.fragment_holder, firstFragment).commit();
-        }
+			// Create a new Fragment to be placed in the activity layout
+			Fragment firstFragment;
+
+			switch (mCurrentState) {
+			case DOWNLOAD:
+				// TODO Add download fragment
+				firstFragment = new Fragment();
+				break;
+			case PREINSTALL:
+				// TODO Add pre-install fragment
+				firstFragment = new Fragment();
+				break;
+			case NORMAL:
+			default:
+				firstFragment = new MainFragment();
+				break;
+			}
+
+			// In case this activity was started with special instructions from
+			// an
+			// Intent, pass the Intent's extras to the fragment as arguments
+			firstFragment.setArguments(getIntent().getExtras());
+
+			// Add the fragment to the 'fragment_container' FrameLayout
+			getSupportFragmentManager().beginTransaction()
+					.add(R.id.fragment_holder, firstFragment).commit();
+		}
 	}
-	
-	public void changeFragment(Fragment newFragment){
 
-		FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+	public void changeFragment(Fragment newFragment) {
 
-		// Replace whatever is in the fragment_container view with this fragment,
-		// and add the transaction to the back stack so the user can navigate back
+		FragmentTransaction transaction = getSupportFragmentManager()
+				.beginTransaction();
+
+		// Replace whatever is in the fragment_container view with this
+		// fragment,
+		// and add the transaction to the back stack so the user can navigate
+		// back
 		transaction.replace(R.id.fragment_holder, newFragment);
 		transaction.addToBackStack(null);
 
 		// Commit the transaction
-		transaction.commit();	
+		transaction.commit();
+	}
+
+	public void onEnableDevMode() {
+		if (!DEV_MODE_ENABLED) {
+			mIsDevModeCounter--;
+
+			Log.d(TAG, "Developer mode in " + mIsDevModeCounter + " Clicks...");
+
+			if (mIsDevModeCounter <= 0) {
+				DEV_MODE_ENABLED = true;
+
+				Toast.makeText(getApplicationContext(),
+						getResources().getString(R.string.dev_mode_toast),
+						Toast.LENGTH_LONG).show();
+
+				Log.d(TAG, "Developer mode enabled for this session");
+
+				FairphoneUpdater2Activity.downloadConfigFile(this);
+			}
+		}
+	}
+
+	private static void downloadConfigFile(Context context) {
+		Intent i = new Intent(
+				UpdaterService.ACTION_FAIRPHONE_UPDATER_CONFIG_FILE_DOWNLOAD);
+		context.sendBroadcast(i);
+	}
+
+	public boolean isUpdateAvailable() {
+		return mLatestVersion.isNewerVersionThan(mDeviceVersion);
+	}
+
+	private String getVersionName(Version version) {
+		String versionName = "";
+		if (version != null) {
+			versionName = version.getImageTypeDescription(getResources()) + " "
+					+ version.getName() + " " + version.getBuildNumber();
+		}
+		return versionName;
+	}
+
+	public String getDeviceVersionName() {
+		return getVersionName(mDeviceVersion);
+	}
+
+	public String getLatestVersionName() {
+		return getVersionName(mLatestVersion);
+	}
+
+	public String getSelectedVersionName() {
+		return getVersionName(mSelectedVersion);
 	}
 }
diff --git a/FairphoneUpdater/src/com/fairphone/updater/Version.java b/FairphoneUpdater/src/com/fairphone/updater/Version.java
index 1cf66b9..015e895 100644
--- a/FairphoneUpdater/src/com/fairphone/updater/Version.java
+++ b/FairphoneUpdater/src/com/fairphone/updater/Version.java
@@ -80,6 +80,17 @@
     public Version() {
         mDependencies = new ArrayList<Integer>();
         mReleaseNotesMap = new HashMap<String, String>();
+        
+        mNumber = 0;
+        mName = "";
+        mAndroidVersion = "";
+        mOTADownloadLink = "";
+        mOTAMd5Sum = "";
+        mBuildNumber = "";
+        mReleaseDate = "";
+        mThumbnailImageLink = "";
+        mImageType = IMAGE_TYPE_FAIRPHONE;
+        mErasePartitionsWarning = false;
     }
 
     public static Version getVersionFromSharedPreferences(Context context) {
diff --git a/FairphoneUpdater/src/com/fairphone/updater/fragments/MainFragment.java b/FairphoneUpdater/src/com/fairphone/updater/fragments/MainFragment.java
index 81f2a14..a9f70f7 100644
--- a/FairphoneUpdater/src/com/fairphone/updater/fragments/MainFragment.java
+++ b/FairphoneUpdater/src/com/fairphone/updater/fragments/MainFragment.java
@@ -5,24 +5,137 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
 
+import com.fairphone.updater.FairphoneUpdater2Activity.HeaderType;
 import com.fairphone.updater.R;
 
 public class MainFragment extends BaseFragment {
 
+	private TextView mCurrentVersionNameText;
+	private LinearLayout mVersionUpToDateGroup;
+	private Button mVersionUpToDateOlderOSVersionButton;
+	private LinearLayout mUpdateAvailableGroup;
+	private Button mUpdateAvailableOlderOSVersionButton;
+	private TextView mUpdateAvailableNameText;
+	private Button mUpdateAvailableInstallButton;
+	private Button mOtherOSOptionsButton;
+
 	@Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-        Bundle savedInstanceState) {
-        // Inflate the layout for this fragment
+	public View onCreateView(LayoutInflater inflater, ViewGroup container,
+			Bundle savedInstanceState) {
+		// Inflate the layout for this fragment
 		View view = inflater.inflate(R.layout.fragment_main, container, false);
-		view.setOnClickListener(new OnClickListener() {
-			
+
+		setupLayout(view);
+
+		mainActivity.updateHeader(HeaderType.MAIN, "");
+		updateCurrentVersionGroup();
+		toogleUpdateAvailableGroup();
+		updateOtherOSOptionsGroup();
+
+		return view;
+	}
+
+	private void setupLayout(View view) {
+		//Current version group
+		mCurrentVersionNameText = (TextView) view
+				.findViewById(R.id.current_version_name_text);
+
+		//Version up to date group
+		mVersionUpToDateGroup = (LinearLayout) view
+				.findViewById(R.id.version_up_to_date_group);
+		mVersionUpToDateOlderOSVersionButton = (Button) view
+				.findViewById(R.id.older_os_version_button);
+
+		//Update available group
+		mUpdateAvailableGroup = (LinearLayout) view
+				.findViewById(R.id.update_available_group);
+		mUpdateAvailableNameText = (TextView) view
+				.findViewById(R.id.update_available_name_text);
+		mUpdateAvailableInstallButton = (Button) view
+				.findViewById(R.id.install_update_button);
+		mUpdateAvailableOlderOSVersionButton = (Button) view
+				.findViewById(R.id.other_os_version_button);
+
+		//Other OS Options group
+		mOtherOSOptionsButton = (Button) view
+				.findViewById(R.id.other_os_options_button);
+	}
+
+	private void updateOtherOSOptionsGroup() {
+		mOtherOSOptionsButton.setOnClickListener(new OnClickListener() {
+
 			@Override
 			public void onClick(View v) {
-				mainActivity.changeFragment(new VersionDetailFragment());
+				Toast.makeText(mainActivity, "Procced to other OS options",
+						Toast.LENGTH_LONG).show();
 			}
 		});
-		
-        return view;
-    }
+	}
+
+	private void toogleUpdateAvailableGroup() {
+		if (mainActivity.isUpdateAvailable()) {
+			mVersionUpToDateGroup.setVisibility(View.GONE);
+			mUpdateAvailableGroup.setVisibility(View.VISIBLE);
+
+			updateUpdateAvailableGroup();
+
+		} else {
+			mUpdateAvailableGroup.setVisibility(View.GONE);
+			mVersionUpToDateGroup.setVisibility(View.VISIBLE);
+
+			updateOlderVersionsButton();
+
+		}
+	}
+
+	private void updateOlderVersionsButton() {
+		mVersionUpToDateOlderOSVersionButton
+				.setOnClickListener(new OnClickListener() {
+
+					@Override
+					public void onClick(View v) {
+						Toast.makeText(mainActivity,
+								"Procced to older OS Versions",
+								Toast.LENGTH_LONG).show();
+					}
+				});
+	}
+
+	private void updateUpdateAvailableGroup() {
+		mUpdateAvailableNameText.setText(mainActivity.getLatestVersionName());
+		mUpdateAvailableInstallButton.setOnClickListener(new OnClickListener() {
+
+			@Override
+			public void onClick(View v) {
+				Toast.makeText(mainActivity, "Procced to install",
+						Toast.LENGTH_LONG).show();
+			}
+		});
+
+		mUpdateAvailableOlderOSVersionButton
+				.setOnClickListener(new OnClickListener() {
+
+					@Override
+					public void onClick(View v) {
+						Toast.makeText(mainActivity,
+								"Procced to older OS Versions",
+								Toast.LENGTH_LONG).show();
+					}
+				});
+	}
+
+	private void updateCurrentVersionGroup() {
+		mCurrentVersionNameText.setText(mainActivity.getDeviceVersionName());
+		mCurrentVersionNameText.setOnClickListener(new OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				mainActivity.onEnableDevMode();
+			}
+		});
+	}
 }