Merge branch 'fp2-1985' into 'master'

FPII-1985: FP Updater: Fix beta mode

Fix beta mode through fairphone.com/go-beta.

See merge request !16
diff --git a/res/layout/activity_beta_enabler.xml b/res/layout/activity_beta_enabler.xml
index d646bb8..12c7fe8 100644
--- a/res/layout/activity_beta_enabler.xml
+++ b/res/layout/activity_beta_enabler.xml
@@ -2,16 +2,26 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+	android:background="@color/blue"
     tools:context="com.fairphone.updater.BetaEnabler" >
 
-	<Button
-	    android:id="@+id/beta_activator"
-	    android:layout_width="wrap_content"
-	    android:layout_height="wrap_content"
-	    android:layout_centerHorizontal="true"
-	    android:layout_centerVertical="true"
-	    style="@style/ButtonSmallBlueDark"
-	    android:text="@string/beta_is_enabled" 
-	    android:enabled="false"/>
+	<include layout="@layout/header"/>
+
+	<FrameLayout
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_centerHorizontal="true"
+		android:layout_centerVertical="true"
+		android:paddingTop="@dimen/header_big_height">
+
+		<Button
+			android:id="@+id/beta_activator"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			style="@style/ButtonWhiteBlue"
+			android:text="@string/beta_is_enabled"
+			android:enabled="false"/>
+
+	</FrameLayout>
 
 </RelativeLayout>
diff --git a/res/layout/header.xml b/res/layout/header.xml
index 20efa42..b6f030f 100644
--- a/res/layout/header.xml
+++ b/res/layout/header.xml
@@ -13,7 +13,7 @@
             android:ellipsize="end"
             android:fontFamily="sans-serif-thin"
             android:gravity="center_vertical|center_horizontal"
-            android:lines="1"
+            android:lines="2"
             android:text="@string/app_full_name"
             android:textColor="@color/blue"
             android:textSize="@dimen/header_big_text_size" />
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 7eac390..e343feb 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -27,6 +27,7 @@
     <color name="pink_light">#f286b6</color>
     <color name="pink_light_transparent">#f0dbe4</color>
     <color name="red">#c3474c</color>
+    <color name="design_pink">#d7617f</color>
 
     <!-- GOOGLE COLORS (DEPENDENCIES) -->
     <color name="google_blue">#33b5e5</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 3ae7fe3..3160eda 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -11,7 +11,7 @@
     <string name="defaultVersionName" translatable="false">Almond</string>
     <string name="defaultBuildNumber" translatable="false">1.0</string>
     <string name="defaultImageType" translatable="false">fairphone</string>
-    <string name="defaultBetaStatus" translatable="false">0</string>
+    <bool name="defaultBetaStatus" translatable="false">false</bool>
     
     <!-- Device Model without spaces separated by semicolon. Ex: FP1;FP1U;FP2 -->
     <string name="knownFPDevices" translatable="false">FP1;FP1U;FP2</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4d290e2..d5cfabd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -78,4 +78,5 @@
     <string name="connect_to_wifi">Please connect to a Wi-Fi network</string>
     <string name="charge_battery">Please charge your battery to at least 80%</string>
     <string name="got_it">Got it</string>
+    <string name="beta_mode">beta mode</string>
 </resources>
\ No newline at end of file
diff --git a/src/com/fairphone/updater/BetaEnabler.java b/src/com/fairphone/updater/BetaEnabler.java
index 5d64c24..806f60a 100644
--- a/src/com/fairphone/updater/BetaEnabler.java
+++ b/src/com/fairphone/updater/BetaEnabler.java
@@ -2,6 +2,9 @@
 package com.fairphone.updater;
 
 import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Handler;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
@@ -11,8 +14,7 @@
 
 public class BetaEnabler extends Activity {
 
-    public static final String FAIRPHONE_BETA_PROPERTY = "fairphone.ota.beta";
-    private static final String BETA_DISABLED = "0";
+    public static final String BETA_DISABLED = "0";
     public static final String BETA_ENABLED = "1";
     
     @Override
@@ -28,12 +30,20 @@
             b.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    Utils.setBetaPropToEnable();
+                    Utils.enableBeta(getApplicationContext());
                     if (isBetaEnabled()) {
                         Button b = (Button) findViewById(R.id.beta_activator);
                         b.setEnabled(false);
                         b.setText(R.string.beta_is_enabled);
                         b.setOnClickListener(null);
+                        final Handler handler = new Handler();
+                        handler.postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                Utils.restartUpdater(BetaEnabler.this);
+                            }
+                        }, 1000);
+
                     } else {
                         Toast.makeText(getApplicationContext(), R.string.beta_activation_failed, Toast.LENGTH_LONG).show();
                     }
@@ -41,9 +51,10 @@
             });
         }
     }
-    
-    private static boolean isBetaEnabled(){
-        return Utils.getprop(FAIRPHONE_BETA_PROPERTY, BETA_DISABLED).equals(BETA_ENABLED);
+
+    private boolean isBetaEnabled(){
+        SharedPreferences settings = getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
+        return settings.getBoolean(FairphoneUpdater.PREFERENCE_BETA_MODE, getResources().getBoolean(R.bool.defaultBetaStatus));
     }
     
 }
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index e297f33..d9605ea 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -13,6 +13,7 @@
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
+import android.text.Html;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
@@ -67,6 +68,8 @@
     public static final String PREFERENCE_SELECTED_STORE_NUMBER = "SelectedStoreNumber";
     
     public static final String PREFERENCE_OTA_DOWNLOAD_URL = "OtaDownloadUrl";
+
+    public static final String PREFERENCE_BETA_MODE = "BetaMode";
     
     private static final String TAG_FIRST_FRAGMENT = "FIRST_FRAGMENT";
     private String mZipPath;
@@ -176,6 +179,8 @@
 
         initHeaderViews();
 
+        setupHeader();
+
         setupFragments(savedInstanceState);
 
         startService();
@@ -185,7 +190,7 @@
     
     void setupBetaStatus()
     {
-        BETA_MODE_ENABLED = mDeviceVersion.getBetaStatus().equals("1");
+        BETA_MODE_ENABLED = mSharedPreferences.getBoolean(PREFERENCE_BETA_MODE, getResources().getBoolean(R.bool.defaultBetaStatus));
     }
 
     private void isDeviceSupported()
@@ -309,6 +314,15 @@
         });
     }
 
+    private void setupHeader() {
+        if(BETA_MODE_ENABLED) {
+            String input = "<br /><small><font color=" + getResources().getColor(R.color.design_pink) + ">" + getResources().getString(R.string.beta_mode) + "</font></small>";
+            headerMainFairphoneText.append(Html.fromHtml(input));
+            headerMainAndroidText.append(Html.fromHtml(input));
+            headerMainAppStoreText.append(Html.fromHtml(input));
+        }
+    }
+
     private void showInfoPopupDialog(DetailLayoutType layoutType)
     {
         FragmentManager fm = getSupportFragmentManager();
diff --git a/src/com/fairphone/updater/UpdaterService.java b/src/com/fairphone/updater/UpdaterService.java
index 629141d..f10a964 100644
--- a/src/com/fairphone/updater/UpdaterService.java
+++ b/src/com/fairphone/updater/UpdaterService.java
@@ -329,7 +329,7 @@
                     sb.append("&b_n=").append(URLEncoder.encode(currentVersion.getBuildNumber(), defaultCharset));
                 }
                 sb.append("&ota_v_n=").append(URLEncoder.encode(String.valueOf(currentVersion.getId()), defaultCharset));
-                sb.append("&beta=").append(URLEncoder.encode(currentVersion.getBetaStatus(), defaultCharset));
+                sb.append("&beta=").append(FairphoneUpdater.BETA_MODE_ENABLED ? BetaEnabler.BETA_ENABLED : BetaEnabler.BETA_DISABLED);
                 sb.append("&dev=").append(FairphoneUpdater.DEV_MODE_ENABLED ? "1" : "0");
             } catch (UnsupportedEncodingException e) {
                 Log.e(TAG, "Failed to add extra info on update request: "+e.getLocalizedMessage());
diff --git a/src/com/fairphone/updater/data/Version.java b/src/com/fairphone/updater/data/Version.java
index 8f053ae..2a206a0 100644
--- a/src/com/fairphone/updater/data/Version.java
+++ b/src/com/fairphone/updater/data/Version.java
@@ -41,8 +41,6 @@
 
     private String mAndroidVersion;
 
-    private String mBetaStatus;
-
     private boolean mErasePartitionsWarning;
 
     private final List<Integer> mDependencies;
@@ -54,7 +52,6 @@
         mAndroidVersion = "";
         mImageType = IMAGE_TYPE_FAIRPHONE;
         mErasePartitionsWarning = false;
-        mBetaStatus = "";
     }
 
     public Version(Version other)
@@ -64,7 +61,6 @@
         mAndroidVersion = other.mAndroidVersion;
         mImageType = other.mImageType;
         mErasePartitionsWarning = other.hasEraseAllPartitionWarning();
-        mBetaStatus = other.mBetaStatus;
     }
 
     public void setEraseAllPartitionWarning()
@@ -92,16 +88,6 @@
         return mImageType;
     }
 
-    public void setBetaStatus(String betaStatus)
-    {
-        mBetaStatus = betaStatus;
-    }
-
-    public String getBetaStatus()
-    {
-        return mBetaStatus;
-    }
-
     public String getImageTypeDescription(Resources resources)
     {
         return Version.getImageTypeDescription(mImageType, resources);
diff --git a/src/com/fairphone/updater/data/VersionParserHelper.java b/src/com/fairphone/updater/data/VersionParserHelper.java
index 3bf8d1c..4120743 100644
--- a/src/com/fairphone/updater/data/VersionParserHelper.java
+++ b/src/com/fairphone/updater/data/VersionParserHelper.java
@@ -45,7 +45,6 @@
     private static final String CURRENT_VERSION_NUMBER = "fairphone.ota.version.number";
     private static final String CURRENT_VERSION_NAME = "fairphone.ota.version.name";
     private static final String CURRENT_VERSION_BUILD_NUMBER = "fairphone.ota.build_number";
-    private static final String CURRENT_BETA_STATUS = "fairphone.ota.beta";
     private static final String CURRENT_VERSION_IMAGE_TYPE = "fairphone.ota.image_type";
     private static final String CURRENT_VERSION_ID = "ro.build.version.incremental";                // for FP2
 
@@ -88,7 +87,6 @@
             }
 
             versionBuilder.setImageType(getSystemData(context, CURRENT_VERSION_IMAGE_TYPE, knownFPDevice));
-            versionBuilder.setBetaStatus(getSystemData(context, CURRENT_BETA_STATUS, knownFPDevice));
 
             Version versionData = UpdaterData.getInstance().getVersion(versionBuilder.getImageType(), versionBuilder.getId());
             versionBuilder.setThumbnailLink(versionData != null ? versionData.getThumbnailLink() : "");
@@ -115,9 +113,6 @@
 		    case CURRENT_VERSION_IMAGE_TYPE:
 			    result = Utils.getprop(CURRENT_VERSION_IMAGE_TYPE, useDefaults ? context.getResources().getString(R.string.defaultImageType) : "");
 			    break;
-		    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;
diff --git a/src/com/fairphone/updater/tools/Utils.java b/src/com/fairphone/updater/tools/Utils.java
index b42f558..706f315 100644
--- a/src/com/fairphone/updater/tools/Utils.java
+++ b/src/com/fairphone/updater/tools/Utils.java
@@ -16,10 +16,14 @@
 
 package com.fairphone.updater.tools;
 
+import android.app.Activity;
+import android.app.AlarmManager;
 import android.app.DownloadManager;
+import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.net.ConnectivityManager;
@@ -32,7 +36,7 @@
 import android.util.Log;
 import android.widget.Toast;
 
-import com.fairphone.updater.BetaEnabler;
+import com.fairphone.updater.FairphoneUpdater;
 import com.fairphone.updater.R;
 import com.fairphone.updater.UpdaterService;
 import com.fairphone.updater.data.DownloadableItem;
@@ -425,22 +429,11 @@
         return result;
     }
 
-	public static void setBetaPropToEnable()
-    {
-        if(RootTools.isAccessGiven()) {
-            CommandCapture command = new CommandCapture(0, "/system/bin/setprop "+ BetaEnabler.FAIRPHONE_BETA_PROPERTY+" "+BetaEnabler.BETA_ENABLED);
-            try {
-                Shell.runRootCommand(command);
-            } catch (IOException | TimeoutException | RootDeniedException e) {
-	            Log.d(TAG, "Failed to setprop: " + e.getLocalizedMessage());
-            }
-        }
-        try {
-            Thread.sleep(200);
-        } catch (InterruptedException e) {
-
-        }
-        buildProps = null;
+    public static void enableBeta(Context context) {
+        SharedPreferences settings = context.getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = settings.edit();
+        editor.putBoolean(FairphoneUpdater.PREFERENCE_BETA_MODE, true);
+        editor.commit();
     }
 
     public static String getOtaPackagePath(Resources resources, DownloadableItem item, boolean isVersion, boolean isZipInstall){
@@ -682,4 +675,13 @@
     {
         return UpdaterData.getInstance().getStore(GAPPS_STORE_NUMBER);
     }
+
+    public static void restartUpdater(Activity activity) {
+        Intent startActivity = new Intent(activity.getApplicationContext(), FairphoneUpdater.class);
+        int pendingIntentId = 123456;
+        PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+        AlarmManager mgr = (AlarmManager)activity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
+        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
+        System.exit(0);
+    }
 }