Merge remote-tracking branch 'fp2-dev/fp2-dev-v2'

Conflicts:
	src/com/fairphone/updater/UpdaterService.java
	src/com/fairphone/updater/data/VersionParserHelper.java
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4ae6970..92867d9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -44,7 +44,6 @@
             <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <action android:name="android.intent.action.QUICKBOOT_POWERON" />
-                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
             </intent-filter>
         </receiver>
 
diff --git a/res/drawable-hdpi/updater_white.png b/res/drawable-hdpi/updater_white.png
new file mode 100755
index 0000000..3037ce2
--- /dev/null
+++ b/res/drawable-hdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-mdpi/updater_white.png b/res/drawable-mdpi/updater_white.png
new file mode 100755
index 0000000..9669692
--- /dev/null
+++ b/res/drawable-mdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-xhdpi/updater_white.png b/res/drawable-xhdpi/updater_white.png
new file mode 100755
index 0000000..544dc37
--- /dev/null
+++ b/res/drawable-xhdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-xxhdpi/updater_white.png b/res/drawable-xxhdpi/updater_white.png
new file mode 100755
index 0000000..54a5956
--- /dev/null
+++ b/res/drawable-xxhdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/updater_white.png b/res/drawable-xxxhdpi/updater_white.png
new file mode 100755
index 0000000..508cf5c
--- /dev/null
+++ b/res/drawable-xxxhdpi/updater_white.png
Binary files differ
diff --git a/res/values/config.xml b/res/values/config.xml
index 1b3970b..e29ac31 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -7,7 +7,7 @@
 	<string name="config_xml" translatable="false">.xml</string>
 	<string name="config_sig" translatable="false">.sig</string>
 	
-    <integer name="defaultVersionNumber">1</integer>
+    <string name="defaultVersionId">1</string>
     <string name="defaultVersionName" translatable="false">Almond</string>
     <string name="defaultBuildNumber" translatable="false">1.0</string>
     <string name="defaultBuildDate" translatable="false">0</string>
@@ -16,7 +16,7 @@
     <string name="defaultBetaStatus" translatable="false">0</string>
     
     <!-- Device Model without spaces separated by semicolon. Ex: FP1;FP1U;FP2 -->
-    <string name="knownFPDevices" translatable="false">FP1;FP1U</string>
+    <string name="knownFPDevices" translatable="false">FP1;FP1U;FP2</string>
     
     <string name="oneGBDataPartition" translatable="false">/originalPartition</string>
 	<string name="unifiedDataPartition" translatable="false">/unifiedPartition</string>
@@ -25,6 +25,8 @@
 	<string name="recoverySdCardPath" translatable="false">/sdcard</string>
 	<string name="updaterFolder" translatable="false">/updater/</string>
 	<integer name="FP1DataPartitionSizeMb">1100</integer>
+
+	<string name="FP2Model" translatable="false">FP2</string>
 	
 	<!-- Packager -->
 	<string name="removePlayStoreCommand" translatable="false">rm /data/app/com.android.vending-*.apk</string>
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index c86898d..285afbb 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -200,13 +200,23 @@
     void getSelectedVersionFromSharedPreferences()
     {
         String versionImageType = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_TYPE, "");
-        int versionNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0);
+        String versionNumber = "0";
+        try {
+            versionNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_NUMBER, "0");
+        } catch (ClassCastException e) {
+            versionNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0));
+        }
         mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
     }
 
     void getSelectedStoreFromSharedPreferences()
     {
-        int storeNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1);
+        String storeNumber = "-1";
+        try {
+            storeNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_STORE_NUMBER, "-1");
+        } catch (ClassCastException e) {
+            storeNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1));
+        }
         mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
     }
 
@@ -619,7 +629,7 @@
         {
             if(isVersion)
             {
-                itemName = getVersionName((Version) item);
+                itemName = ((Version) item).getHumanReadableName();
             }
             else
             {
@@ -629,18 +639,7 @@
         return itemName;
     }
 
-    public String getVersionName(Version version)
-    {
-        String itemName = "";
-        if (version != null)
-        {
-            if(mCurrentState != UpdaterState.ZIP_INSTALL) {
-                itemName = version.getImageTypeDescription(getResources()) + " ";
-            }
-            itemName += version.getName() + " " + version.getBuildNumber();
-        }
-        return itemName;
-    }
+
 
     public static String getStoreName(Store store)
     {
@@ -654,12 +653,12 @@
 
     public String getDeviceVersionName()
     {
-        return getVersionName(mDeviceVersion);
+        return mDeviceVersion.getHumanReadableName();
     }
 
     public String getLatestVersionName()
     {
-        return getVersionName(mLatestVersion);
+        return mLatestVersion.getHumanReadableName();
     }
 
     public Version getDeviceVersion()
@@ -698,25 +697,25 @@
 
     public void setSelectedVersion(Version selectedVersion)
     {
-        int versionNumber = selectedVersion != null ? selectedVersion.getNumber() : 0;
+        String versionNumber = selectedVersion != null ? selectedVersion.getId() : "0";
         String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
 
         clearSelectedVersion(versionNumber, versionImageType);
 
         mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
-        clearSelectedStore(-1);
+        clearSelectedStore("-1");
     }
 
     public void clearSelectedItems()
     {
-        clearSelectedVersion(0, "");
-        clearSelectedStore(-1);
+        clearSelectedVersion("0", "");
+        clearSelectedStore("-1");
     }
 
-    private void clearSelectedVersion(int versionNumber, String versionImageType)
+    private void clearSelectedVersion(String versionNumber, String versionImageType)
     {
         Editor editor = mSharedPreferences.edit();
-        editor.putInt(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
+        editor.putString(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
         editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
         editor.commit();
 
@@ -725,18 +724,18 @@
 
     public void setSelectedStore(Store selectedStore)
     {
-        int storeNumber = selectedStore != null ? selectedStore.getNumber() : -1;
+        String storeNumber = selectedStore != null ? selectedStore.getId() : "-1";
 
         clearSelectedStore(storeNumber);
 
         mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
-        clearSelectedVersion(0, "");
+        clearSelectedVersion("0", "");
     }
 
-    private void clearSelectedStore(int storeNumber)
+    private void clearSelectedStore(String storeNumber)
     {
         Editor editor = mSharedPreferences.edit();
-        editor.putInt(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
+        editor.putString(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
         editor.commit();
 
         mSelectedStore = null;
diff --git a/src/com/fairphone/updater/UpdaterService.java b/src/com/fairphone/updater/UpdaterService.java
index dbb0303..598bc4b 100644
--- a/src/com/fairphone/updater/UpdaterService.java
+++ b/src/com/fairphone/updater/UpdaterService.java
@@ -31,7 +31,6 @@
 import android.content.SharedPreferences.Editor;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.BitmapFactory;
 import android.net.ConnectivityManager;
 import android.net.Uri;
 import android.os.Build;
@@ -153,7 +152,7 @@
         
         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
 
-	    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_tray_icon)
+	NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_white)
 			    .setContentTitle(context.getResources().getString(R.string.app_full_name))
 			    .setContentText(context.getResources().getString(R.string.appStoreReinstall))
 			    .setAutoCancel(true)
@@ -329,7 +328,7 @@
                 final String defaultCharset = Charset.defaultCharset().displayName();
                 sb.append("&os=").append(URLEncoder.encode(currentVersion.getAndroidVersion(), defaultCharset));
                 sb.append("&b_n=").append(URLEncoder.encode(currentVersion.getBuildNumber(), defaultCharset));
-                sb.append("&ota_v_n=").append(URLEncoder.encode(String.valueOf(currentVersion.getNumber()), defaultCharset));
+                sb.append("&ota_v_n=").append(URLEncoder.encode(String.valueOf(currentVersion.getId()), defaultCharset));
                 sb.append("&d=").append(URLEncoder.encode(currentVersion.getReleaseDate(), defaultCharset));
                 sb.append("&beta=").append(URLEncoder.encode(currentVersion.getBetaStatus(), defaultCharset));
                 sb.append("&dev=").append(FairphoneUpdater.DEV_MODE_ENABLED ? "1" : "0");
@@ -352,8 +351,7 @@
         NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
 
         NotificationCompat.Builder builder =
-                new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_tray_icon_small)
-                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.updater_tray_icon))
+                new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_white)
                         .setContentTitle(context.getResources().getString(R.string.app_full_name))
                         .setContentText(context.getResources().getString(R.string.fairphone_update_message));
 
@@ -613,7 +611,6 @@
         {
 
             boolean removeReceiver = false;
-
             DownloadManager.Query query = new DownloadManager.Query();
 
             query.setFilterById(mLatestFileDownloadId);
@@ -668,4 +665,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/fairphone/updater/data/DownloadableItem.java b/src/com/fairphone/updater/data/DownloadableItem.java
index 1513fca..f631809 100644
--- a/src/com/fairphone/updater/data/DownloadableItem.java
+++ b/src/com/fairphone/updater/data/DownloadableItem.java
@@ -16,19 +16,19 @@
 
 package com.fairphone.updater.data;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import android.text.TextUtils;
 import android.util.Log;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public abstract class DownloadableItem
 {
     private static final String TAG = DownloadableItem.class.getSimpleName();
 
     public static final String DEFAULT_NOTES_LANG = "en";
 
-    private int mNumber;
+    private String mId;
 
     private String mName;
 
@@ -46,7 +46,7 @@
 
     DownloadableItem()
     {
-        mNumber = 0;
+        mId = "";
         mName = "";
         mOTADownloadLink = "";
         mOTAMd5Sum = "";
@@ -59,7 +59,7 @@
 
     DownloadableItem(DownloadableItem other)
     {
-        mNumber = other.mNumber;
+        mId = other.mId;
         mName = other.mName;
         mOTADownloadLink = other.mOTADownloadLink;
         mOTAMd5Sum = other.mOTAMd5Sum;
@@ -70,26 +70,14 @@
         mReleaseNotesMap = other.mReleaseNotesMap;
     }
 
-    public int getNumber()
+    public String getId()
     {
-        return mNumber;
+        return mId;
     }
 
-    public void setNumber(String number)
+    public void setId(String id)
     {
-        try
-        {
-            this.mNumber = Integer.valueOf(number);
-        } catch (NumberFormatException e)
-        {
-            Log.w(TAG, "Error decoding version number. Defaulting to 0: " + e.getLocalizedMessage());
-            this.mNumber = 0;
-        }
-    }
-
-    public void setNumber(int number)
-    {
-        this.mNumber = number;
+        this.mId = id;
     }
 
     public String getName()
@@ -129,7 +117,7 @@
 
         if (item != null)
         {
-            result = this.mNumber > item.mNumber;
+            result = !this.mId.equals(item.mId);
         }
         else
         {
diff --git a/src/com/fairphone/updater/data/Store.java b/src/com/fairphone/updater/data/Store.java
index 0b5813e..71e8ad4 100644
--- a/src/com/fairphone/updater/data/Store.java
+++ b/src/com/fairphone/updater/data/Store.java
@@ -33,11 +33,11 @@
         int retVal;
         if (another != null)
         {
-            if (this.getNumber() > another.getNumber())
+            if (!this.getId().equals(another.getId()))
             {
                 retVal = 1;
             }
-            else if (this.getNumber() == another.getNumber())
+            else if (this.getId() == another.getId())
             {
                 retVal = 0;
             }
diff --git a/src/com/fairphone/updater/data/UpdaterData.java b/src/com/fairphone/updater/data/UpdaterData.java
index 3daacb2..1e7ddb1 100644
--- a/src/com/fairphone/updater/data/UpdaterData.java
+++ b/src/com/fairphone/updater/data/UpdaterData.java
@@ -16,15 +16,15 @@
 
     private static UpdaterData mInstance;
 
-    private int mLatestAOSPVersionNumber;
+    private String mLatestAOSPVersionNumber;
 
-    private int mLatestFairphoneVersionNumber;
+    private String mLatestFairphoneVersionNumber;
 
-    private final Map<Integer, Version> mAOSPVersionMap;
+    private final Map<String, Version> mAOSPVersionMap;
 
-    private final Map<Integer, Version> mFairphoneVersionMap;
+    private final Map<String, Version> mFairphoneVersionMap;
     
-    private final Map<Integer, Store> mAppStoresMap;
+    private final Map<String, Store> mAppStoresMap;
 
     public static UpdaterData getInstance()
     {
@@ -37,8 +37,8 @@
 
     private UpdaterData()
     {
-        mLatestAOSPVersionNumber = 0;
-        mLatestFairphoneVersionNumber = 0;
+        mLatestAOSPVersionNumber = "0";
+        mLatestFairphoneVersionNumber = "0";
         mAOSPVersionMap = new HashMap<>();
         mFairphoneVersionMap = new HashMap<>();
         mAppStoresMap = new HashMap<>();
@@ -46,8 +46,8 @@
 
     public void resetUpdaterData()
     {
-        mLatestAOSPVersionNumber = 0;
-        mLatestFairphoneVersionNumber = 0;
+        mLatestAOSPVersionNumber = "0";
+        mLatestFairphoneVersionNumber = "0";
         mAOSPVersionMap.clear();
         mFairphoneVersionMap.clear();
         mAppStoresMap.clear();
@@ -58,16 +58,16 @@
         mLatestAOSPVersionNumber = getLatestVersionFromTag(latestVersion);
     }
 
-    private static int getLatestVersionFromTag(String latestVersion)
+    private static String getLatestVersionFromTag(String latestVersion)
     {
-        int latestVersionNumber;
+        String latestVersionNumber;
         try
         {
-            latestVersionNumber = Integer.valueOf(latestVersion);
+            latestVersionNumber = latestVersion;
         } catch (NumberFormatException e)
         {
             Log.w(TAG, "Error decoding latest version number. Defaulting to 0: " + e.getLocalizedMessage());
-            latestVersionNumber = 0;
+            latestVersionNumber = "0";
         }
         return latestVersionNumber;
     }
@@ -79,17 +79,17 @@
 
     public void addAOSPVersion(Version version)
     {
-        mAOSPVersionMap.put(version.getNumber(), version);
+        mAOSPVersionMap.put(version.getId(), version);
     }
 
     public void addFairphoneVersion(Version version)
     {
-        mFairphoneVersionMap.put(version.getNumber(), version);
+        mFairphoneVersionMap.put(version.getId(), version);
     }
     
     public void addAppStore(Store store)
     {
-        mAppStoresMap.put(store.getNumber(), store);
+        mAppStoresMap.put(store.getId(), store);
     }
 
     public Version getLatestVersion(String imageType)
@@ -145,7 +145,7 @@
 	    return mapToOrderedStoreList(mAppStoresMap.values());
     }
 
-    public Version getVersion(String imageType, int versionNumber)
+    public Version getVersion(String imageType, String versionNumber)
     {
         Version version = null;
         if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
@@ -160,7 +160,7 @@
         return version;
     }
     
-    public Store getStore(int storeNumber)
+    public Store getStore(String storeNumber)
     {
         return mAppStoresMap.get(storeNumber);
     }
diff --git a/src/com/fairphone/updater/data/Version.java b/src/com/fairphone/updater/data/Version.java
index 29ba80a..483fe27 100644
--- a/src/com/fairphone/updater/data/Version.java
+++ b/src/com/fairphone/updater/data/Version.java
@@ -24,6 +24,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class Version extends DownloadableItem implements Comparable<Version>
 {
@@ -45,8 +47,6 @@
 
     private final List<Integer> mDependencies;
 
-    public static final int ZIP_INSTALL_VERSION = 999;
-
     public Version()
     {
         super();
@@ -147,11 +147,11 @@
         int retVal;
         if (another != null)
         {
-            if (this.getNumber() < another.getNumber() && this.mImageType.equalsIgnoreCase(another.mImageType))
+            if (!this.getId().equals(another.getId()) && this.mImageType.equalsIgnoreCase(another.mImageType))
             {
                 retVal = 1;
             }
-            else if (this.getNumber() == another.getNumber() && this.mImageType.equalsIgnoreCase(another.mImageType))
+            else if (this.getId() == another.getId() && this.mImageType.equalsIgnoreCase(another.mImageType))
             {
                 retVal = 0;
             }
@@ -195,4 +195,41 @@
 //        return mDependencies;
 //    }
 // --Commented out by Inspection STOP (09/02/2015 19:47)
+
+    /**
+     * This method retrieves the int.int.int part of the fingerprint
+     * @return the version as string or empty string if no version was found
+     */
+    public String getBuildNumberFromId(){
+        String id = getId();
+        Pattern pattern = Pattern.compile(".*?\\d+.*?(\\d+)(\\.)(\\d+)(\\.)(\\d+)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);    // is this pattern sufficient?
+        Matcher matcher = pattern.matcher(id);                             // get version number from fingerprint
+        if (matcher.find()) {
+            return  matcher.group(1) + "." +matcher.group(3) + "." + matcher.group(5);
+        }
+        Log.d(TAG,String.format("Failed to determine version number from fingerprint: %s",id));
+        return ""; /* we don't know what version is here */
+    }
+
+    /**
+     * This method constructs the current version type from the device fingerprint
+     * @return A human (english) version type to be displayed on the screen
+     */
+    public String getCurrentImageType() {
+        String id = getId();
+        if(id.contains("gms")) {
+            return "Fairphone OS";
+        } else if (id.contains("sibon")) {
+            return "Fairphone Open Source OS";
+        } else if (id.contains("AOSP+")) {
+            return "Fairphone Internal";
+        } else {
+            // we do have a version but.. we don't know about it. return the full "number"
+            return id;
+        }
+    }
+
+    public String getHumanReadableName() {
+        return getName() + " " + getBuildNumber();
+    }
 }
diff --git a/src/com/fairphone/updater/data/VersionParserHelper.java b/src/com/fairphone/updater/data/VersionParserHelper.java
index c2b7fcf..2df0e43 100644
--- a/src/com/fairphone/updater/data/VersionParserHelper.java
+++ b/src/com/fairphone/updater/data/VersionParserHelper.java
@@ -49,36 +49,52 @@
     private static final String CURRENT_ANDROID_VERSION = "fairphone.ota.android_version";
     private static final String CURRENT_VERSION_IMAGE_TYPE = "fairphone.ota.image_type";
     private static final String CURRENT_VERSION_BUILD_DATE = "ro.build.date.utc";
+    private static final String CURRENT_VERSION_ID = "ro.build.version.incremental";                // for FP2
+
 
     private static Version version;
     public static Version getDeviceVersion(Context context)
     {
         if (version == null){
             Version versionBuilder = new Version();
-            String[] suportedDevices = context.getResources().getString(R.string.knownFPDevices).split(";");
+            String[] supportedDevices = context.getResources().getString(R.string.knownFPDevices).split(";");
             String modelWithoutSpaces = Build.MODEL.replaceAll("\\s", "");
             boolean knownFPDevice = false;
-            for(String device : suportedDevices){
+            for (String device : supportedDevices) {
                 knownFPDevice = knownFPDevice || device.equals(modelWithoutSpaces);
             }
 
-            try
-            {
-                versionBuilder.setNumber(Integer.valueOf(getSystemData(context, CURRENT_VERSION_NUMBER, knownFPDevice)));
-            } catch (NumberFormatException e)
-            {
-                int defaultVersionNumber = context.getResources().getInteger(R.integer.defaultVersionNumber);
-                Log.w(TAG, "Error parsing current version number. Defaulting to " + defaultVersionNumber + ": " + e.getLocalizedMessage());
-                versionBuilder.setNumber(defaultVersionNumber);
+            if(modelWithoutSpaces.equals(context.getResources().getString(R.string.FP2Model))) {
+                // FP2
+                try {
+                    versionBuilder.setId(getSystemData(context, CURRENT_VERSION_ID, knownFPDevice));
+                } catch (NumberFormatException e) {
+                    String defaultVersionId = context.getResources().getString(R.string.defaultVersionId);
+                    Log.w(TAG, "Error parsing current version id. Defaulting to " + defaultVersionId + ": " + e.getLocalizedMessage());
+                    versionBuilder.setId(defaultVersionId);
+                }
+                versionBuilder.setName(versionBuilder.getCurrentImageType());
+                versionBuilder.setBuildNumber(versionBuilder.getBuildNumberFromId());
+            } else {
+                // FP1(U)
+                try
+                {
+                    versionBuilder.setId(getSystemData(context, CURRENT_VERSION_NUMBER, knownFPDevice) );
+                } catch (NumberFormatException e) {
+                    String defaultVersionNumber = context.getResources().getString(R.string.defaultVersionId);
+                    Log.w(TAG, "Error parsing current version number. Defaulting to " + defaultVersionNumber + ": " + e.getLocalizedMessage());
+                    versionBuilder.setId(defaultVersionNumber);
+                }
+                versionBuilder.setName(getSystemData(context, CURRENT_VERSION_NAME, knownFPDevice));
+                versionBuilder.setBuildNumber(getSystemData(context, CURRENT_VERSION_BUILD_NUMBER, knownFPDevice));
             }
-            versionBuilder.setName(getSystemData(context, CURRENT_VERSION_NAME, knownFPDevice));
-            versionBuilder.setBuildNumber(getSystemData(context, CURRENT_VERSION_BUILD_NUMBER, knownFPDevice));
+
             versionBuilder.setAndroidVersion(getSystemData(context, CURRENT_ANDROID_VERSION, knownFPDevice));
             versionBuilder.setImageType(getSystemData(context, CURRENT_VERSION_IMAGE_TYPE, knownFPDevice));
             versionBuilder.setReleaseDate(getSystemData(context, CURRENT_VERSION_BUILD_DATE, knownFPDevice));
             versionBuilder.setBetaStatus(getSystemData(context, CURRENT_BETA_STATUS, knownFPDevice));
 
-            Version versionData = UpdaterData.getInstance().getVersion(versionBuilder.getImageType(), versionBuilder.getNumber());
+            Version versionData = UpdaterData.getInstance().getVersion(versionBuilder.getImageType(), versionBuilder.getId());
             versionBuilder.setThumbnailLink(versionData != null ? versionData.getThumbnailLink() : "");
             versionBuilder.setReleaseNotes(Locale.getDefault().getLanguage(), versionData != null ? versionData.getReleaseNotes(Locale.getDefault().getLanguage()) : "");
             version = versionBuilder;
@@ -92,7 +108,7 @@
 		String result;
 	    switch (property) {
 		    case CURRENT_VERSION_NUMBER:
-			    result = Utils.getprop(CURRENT_VERSION_NUMBER, useDefaults ? String.valueOf(context.getResources().getInteger(R.integer.defaultVersionNumber)) : "");
+			    result = Utils.getprop(CURRENT_VERSION_NUMBER, useDefaults ? String.valueOf(context.getResources().getString(R.string.defaultVersionId)) : "");
 			    break;
 		    case CURRENT_VERSION_NAME:
 			    result = Utils.getprop(CURRENT_VERSION_NAME, useDefaults ? context.getResources().getString(R.string.defaultVersionName) : "");
@@ -112,6 +128,9 @@
 		    case CURRENT_BETA_STATUS:
 			    result = Utils.getprop(CURRENT_BETA_STATUS, useDefaults ? context.getResources().getString(R.string.defaultBetaStatus) : "0");
 			    break;
+            case CURRENT_VERSION_ID:
+                result = Utils.getprop(CURRENT_VERSION_ID, useDefaults ? "" : ""); // TODO: define default value for fingerprint
+                break;
 		    default:
 			    result = "";
 			    break;
@@ -347,7 +366,7 @@
 
         if (tagName.equalsIgnoreCase(XML_TAGS.VERSION.name()))
         {
-            updateVersion.setNumber(xpp.getAttributeValue(0));
+            updateVersion.setId(xpp.getAttributeValue(0));
         }
         else if (tagName.equalsIgnoreCase(XML_TAGS.ANDROID_VERSION.name()))
         {
@@ -382,7 +401,7 @@
 
         if (tagName.equalsIgnoreCase(XML_TAGS.STORE.name()))
         {
-            updateStore.setNumber(xpp.getAttributeValue(0));
+            updateStore.setId(xpp.getAttributeValue(0));
         }
         else if (tagName.equalsIgnoreCase(XML_TAGS.SHOW_DISCLAIMER.name()))
         {
diff --git a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
index 85f11b5..397bc8c 100644
--- a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
+++ b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
@@ -1,9 +1,5 @@
 package com.fairphone.updater.fragments;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
 import android.annotation.SuppressLint;
 import android.app.AlertDialog;
 import android.app.DownloadManager;
@@ -39,7 +35,6 @@
 import com.fairphone.updater.UpdaterService;
 import com.fairphone.updater.data.DownloadableItem;
 import com.fairphone.updater.data.Store;
-import com.fairphone.updater.data.UpdaterData;
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.data.VersionParserHelper;
 import com.fairphone.updater.tools.PrivilegeChecker;
@@ -48,6 +43,10 @@
 import com.stericson.RootTools.execution.CommandCapture;
 import com.stericson.RootTools.execution.Shell;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
 @SuppressLint("ValidFragment")
 public class DownloadAndRestartFragment extends BaseFragment
 {
@@ -124,9 +123,8 @@
             version = new Version();
             version.setName(resources.getString(R.string.install) + " " + zipName);
             version.setDownloadLink(mainActivity.getZipFilePath());
-            version.setNumber(Version.ZIP_INSTALL_VERSION);
-        }
-        else
+            version.setId(null);
+        } else
         {
             version = mainActivity.getSelectedVersion();
         }
diff --git a/src/com/fairphone/updater/fragments/MainFragment.java b/src/com/fairphone/updater/fragments/MainFragment.java
index ed5688e..b738b6d 100644
--- a/src/com/fairphone/updater/fragments/MainFragment.java
+++ b/src/com/fairphone/updater/fragments/MainFragment.java
@@ -23,7 +23,6 @@
 import com.fairphone.updater.FairphoneUpdater.HeaderType;
 import com.fairphone.updater.FairphoneUpdater.UpdaterState;
 import com.fairphone.updater.R;
-import com.fairphone.updater.data.Store;
 import com.fairphone.updater.data.UpdaterData;
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
diff --git a/src/com/fairphone/updater/fragments/VersionDetailFragment.java b/src/com/fairphone/updater/fragments/VersionDetailFragment.java
index 0632ed6..17dc7f0 100644
--- a/src/com/fairphone/updater/fragments/VersionDetailFragment.java
+++ b/src/com/fairphone/updater/fragments/VersionDetailFragment.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
-import android.net.ConnectivityManager;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
@@ -209,7 +208,7 @@
                 break;
 
             case ANDROID:
-                mHeaderText = mainActivity.getVersionName(mSelectedVersion);
+                mHeaderText = mSelectedVersion.getHumanReadableName();
                 mVersionDetailsTitle = resources.getString(R.string.new_os);
                 mIsOSChange = deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_FAIRPHONE);
                 mIsOlderVersion =
@@ -223,7 +222,7 @@
                 break;
             case FAIRPHONE:
             default:
-                mHeaderText = mainActivity.getVersionName(mSelectedVersion);
+                mHeaderText = mSelectedVersion.getHumanReadableName();
                 mVersionDetailsTitle = resources.getString(R.string.older_version);
                 mIsOSChange = deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_AOSP);
                 mIsOlderVersion =
@@ -362,7 +361,7 @@
         {
             if (mIsOSChange || mIsOlderVersion)
             {
-                showPopupDialog(mainActivity.getVersionName(mSelectedVersion), mSelectedVersion.hasEraseAllPartitionWarning(),
+                showPopupDialog(mSelectedVersion.getHumanReadableName(), mSelectedVersion.hasEraseAllPartitionWarning(),
                         new ConfirmationPopupDialogListener()
                         {
 
diff --git a/src/com/fairphone/updater/fragments/VersionListFragment.java b/src/com/fairphone/updater/fragments/VersionListFragment.java
index 938d9c3..09fd9f9 100644
--- a/src/com/fairphone/updater/fragments/VersionListFragment.java
+++ b/src/com/fairphone/updater/fragments/VersionListFragment.java
@@ -1,7 +1,5 @@
 package com.fairphone.updater.fragments;
 
-import java.util.List;
-
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -17,6 +15,8 @@
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
 
+import java.util.List;
+
 public class VersionListFragment extends BaseFragment
 {
 
@@ -151,7 +151,7 @@
 
                 mVersionListContainer.addView(versionLayout);
 
-                versionLayout.setText(mainActivity.getVersionName(version));
+                versionLayout.setText(version.getHumanReadableName());
 
                 versionLayout.setOnClickListener(new OnClickListener()
                 {
@@ -186,7 +186,7 @@
     private void setupFairphoneLatestVersion()
     {
         final Version latestFairphoneVersion = UpdaterData.getInstance().getLatestVersion(Version.IMAGE_TYPE_FAIRPHONE);
-        mLatestVersionDetailsButton.setText(mainActivity.getVersionName(latestFairphoneVersion));
+        mLatestVersionDetailsButton.setText(latestFairphoneVersion.getHumanReadableName());
 
         if (mainActivity.getDeviceVersion().compareTo(latestFairphoneVersion) == 0)
         {
@@ -233,7 +233,7 @@
 
                 mVersionListContainer.addView(versionLayout);
 
-                versionLayout.setText(mainActivity.getVersionName(version));
+                versionLayout.setText(version.getHumanReadableName());
 
                 versionLayout.setOnClickListener(new OnClickListener()
                 {
@@ -269,7 +269,7 @@
     private void setupAndroidLatestVersion()
     {
         final Version latestAOSPVersion = UpdaterData.getInstance().getLatestVersion(Version.IMAGE_TYPE_AOSP);
-        mLatestVersionDetailsButton.setText(mainActivity.getVersionName(latestAOSPVersion));
+        mLatestVersionDetailsButton.setText(latestAOSPVersion.getHumanReadableName());
 
         if (mainActivity.getDeviceVersion().compareTo(latestAOSPVersion) == 0)
         {
diff --git a/src/com/fairphone/updater/tools/Utils.java b/src/com/fairphone/updater/tools/Utils.java
index 1fc64cc..bb4e038 100644
--- a/src/com/fairphone/updater/tools/Utils.java
+++ b/src/com/fairphone/updater/tools/Utils.java
@@ -80,7 +80,7 @@
     private static final double PERCENT_100 = 100d;
     private static final char CHAR_SPACE = ' ';
     private static final char CHAR_ZERO = '0';
-    public static final int GAPPS_STORE_NUMBER = 0;
+    public static final String GAPPS_STORE_NUMBER = "0";
 
     private static double getPartitionSizeInGBytes(File path)
     {
@@ -371,7 +371,6 @@
         if (item != null)
         {
             filename.append(type);
-            filename.append(item.getNumber());
         }
         filename.append(".zip");
         return filename;