FP2-1474: Human readable version name in Fairphone Updater

Fixes the human readable version name in Fairphone Updater.

Change-Id: I5f39c4ad6fb866e09774af3ef54bfd46b5c57dd2
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index 2afa176..858962d 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -629,7 +629,7 @@
         {
             if(isVersion)
             {
-                itemName = getVersionName((Version) item);
+                itemName = ((Version) item).getHumanReadableName();
             }
             else
             {
@@ -639,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)
     {
@@ -664,12 +653,12 @@
 
     public String getDeviceVersionName()
     {
-        return getVersionName(mDeviceVersion);
+        return mDeviceVersion.getHumanReadableName();
     }
 
     public String getLatestVersionName()
     {
-        return getVersionName(mLatestVersion);
+        return mLatestVersion.getHumanReadableName();
     }
 
     public Version getDeviceVersion()
diff --git a/src/com/fairphone/updater/data/Version.java b/src/com/fairphone/updater/data/Version.java
index 8468515..fdae2c6 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 String ZIP_INSTALL_VERSION = "999";
-
     public Version()
     {
         super();
@@ -195,4 +195,67 @@
 //        return mDependencies;
 //    }
 // --Commented out by Inspection STOP (09/02/2015 19:47)
+
+    /**
+     *
+     * @param fingerprint String containing sdfasdf=number.number.nunmber
+     * @return the version as string or null if no version was found
+     */
+    private String getVersionNumberFromFingerPrint(String fingerprint){
+        Pattern pattern = Pattern.compile(".*?\\d+.*?(\\d+)(\\.)(\\d+)(\\.)(\\d+)",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);    // is this pattern sufficient?
+        Matcher matcher = pattern.matcher(fingerprint);                             // 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",fingerprint));
+        return null; /* we don't know what version is here */
+
+    }
+
+    /**
+     * This method uses the different strategies to find a human readable name for this version
+     * It tries to find a pattern of "a.b.c" numbers in the string returned from "getNumber()"
+     * and appends some strings to it
+     * @return A human (english) version name to be displayed on the screen
+     */
+    public String getHumanReadableName() {
+        String fingerprint = getNumber();
+
+        if (fingerprint == null) { /* this for example currently happens on a zip install */
+
+            /* try to make something nice */
+            StringBuffer sb = new StringBuffer();
+
+            if (getName() != null) {
+                sb.append(getName());
+            }
+            if (getBuildNumber() != null) {
+                if (sb.length() != 0) {
+                    sb.append(" ");/* it not empty add a space */
+                }
+                sb.append(getBuildNumber());
+            }
+            return sb.toString();
+        }
+
+        String actualNumber = getVersionNumberFromFingerPrint(fingerprint);
+        if (actualNumber == null) {
+                        /* we can not extract the a.b.c version number from the fingerprint */
+                        /* just return the fingerprint/version thingy that was passed to us*/
+            return fingerprint;
+        }
+
+        //@TODO Version currently only has the concept of image type  "AOSP" or Fairphone. this concept
+        //need to be elaborated and different versions shoud be possible.
+        //
+        if (fingerprint.contains("sibon")) {
+            return "Fairphone Open Source OS " + actualNumber;
+        } else if (fingerprint.contains("gms")) {
+            return "Fairphone OS " + actualNumber;
+        } else {
+            /* we do have a version but.. we don't know about it. return the full "number"
+             */
+            return fingerprint;
+        }
+    }
 }
diff --git a/src/com/fairphone/updater/data/VersionParserHelper.java b/src/com/fairphone/updater/data/VersionParserHelper.java
index da466de..6cb353f 100644
--- a/src/com/fairphone/updater/data/VersionParserHelper.java
+++ b/src/com/fairphone/updater/data/VersionParserHelper.java
@@ -49,7 +49,7 @@
     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_FINGERPRINT = "ro.build.fingerprint";
+    private static final String CURRENT_VERSION_FINGERPRINT = "ro.build.version.incremental";
 
 
     private static Version version;
diff --git a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
index 85f11b5..99d658c 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.setNumber(null);
+        } else
         {
             version = mainActivity.getSelectedVersion();
         }
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)
         {