Ver Fonte

Changed computing of account name color

tobiasKaminsky há 9 anos atrás
pai
commit
ed118c952a

+ 13 - 10
src/com/owncloud/android/ui/adapter/NavigationDrawerListAdapter.java

@@ -24,6 +24,8 @@ import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.utils.BitmapUtils;
 
+import org.apache.commons.codec.binary.Hex;
+
 public class NavigationDrawerListAdapter extends BaseAdapter {
 
     private final static String TAG  = "NavigationDrawerListAdapter";
@@ -105,22 +107,23 @@ public class NavigationDrawerListAdapter extends BaseAdapter {
                     rb.setText(account.name);
 
                     try {
-                        byte[] bytesOfMessage = account.name.substring(0,5).getBytes("UTF-8");
+                        // using adapted algorithm from /core/js/placeholder.js:50
+                        int lastAtPos = account.name.lastIndexOf("@");
+                        String username  = account.name.substring(0, lastAtPos);
+                        byte[] seed = username.getBytes("UTF-8");
                         MessageDigest md = MessageDigest.getInstance("MD5");
-                        byte[] digest = md.digest(bytesOfMessage);
-                        int result = Math.abs(ByteBuffer.wrap(digest).getInt());
-
-                        Log_OC.d(TAG, "Integer: " + result % 100000);
-                        Log_OC.d(TAG, "length: " + digest.length);
+                        byte[] seedMd5 = md.digest(seed);
+                        Integer seedMd5Int = Math.abs(new String(Hex.encodeHex(seedMd5)).hashCode());
 
-
-                        Double hue = (result % 100000) / 99999.0;
+                        double maxRange = java.lang.Integer.MAX_VALUE;
+                        float hue = (float) (seedMd5Int / maxRange * 360);
 
                         Log_OC.d(TAG, "hue: " + hue);
 
-                        int[] rgb = BitmapUtils.hslToRgb(hue, 0.9, 0.65);
+
+                        int[] rgb = BitmapUtils.HSLtoRGB(hue, 90.0f, 65.0f, 1.0f);
                         rb.setTextColor(Color.rgb(rgb[0], rgb[1], rgb[2]));
-                        Log_OC.d(TAG, "Color: " + rgb[0] + " " + rgb[1] + rgb[2]);
+                        Log_OC.d(TAG, "Color: " + rgb[0] + " " + rgb[1] + " " + rgb[2]);
 
                     } catch (Exception e){
                         Log_OC.d(TAG, e.toString());

+ 67 - 30
src/com/owncloud/android/utils/BitmapUtils.java

@@ -178,44 +178,81 @@ public class BitmapUtils {
     }
 
     /**
-     * Converts an HSL color value to RGB. Conversion formula
-     * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-     * Assumes h, s, and l are contained in the set [0, 1] and
-     * returns r, g, and b in the set [0, 255].
-     * from: http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
+     *  Convert HSL values to a RGB Color.
      *
-     * @param   integer  h       The hue
-     * @param   Integer  s       The saturation
-     * @param   Integer  l       The lightness
-     * @return  Array           The RGB representation
+     *  @param h Hue is specified as degrees in the range 0 - 360.
+     *  @param s Saturation is specified as a percentage in the range 1 - 100.
+     *  @param l Lumanance is specified as a percentage in the range 1 - 100.
+     *  @paran alpha  the alpha value between 0 - 1
+     *  adapted from https://svn.codehaus.org/griffon/builders/gfxbuilder/tags/GFXBUILDER_0.2/
+     *  gfxbuilder-core/src/main/com/camick/awt/HSLColor.java
      */
-    public static int[] hslToRgb(Double h, Double s, Double l){
-        Double r, g, b;
-
-        if(s == 0){
-            r = g = b = l; // achromatic
-        } else {
-            Double q = l < 0.5 ? l * (1 + s) : l + s - l * s;
-            Double p = 2 * l - q;
-            r = hue2rgb(p, q, h + 1/3) * 255;
-            g = hue2rgb(p, q, h) * 255;
-            b = hue2rgb(p, q, h - 1/3) * 255;
+    public static int[] HSLtoRGB(float h, float s, float l, float alpha)
+    {
+        if (s <0.0f || s > 100.0f)
+        {
+            String message = "Color parameter outside of expected range - Saturation";
+            throw new IllegalArgumentException( message );
+        }
+
+        if (l <0.0f || l > 100.0f)
+        {
+            String message = "Color parameter outside of expected range - Luminance";
+            throw new IllegalArgumentException( message );
+        }
+
+        if (alpha <0.0f || alpha > 1.0f)
+        {
+            String message = "Color parameter outside of expected range - Alpha";
+            throw new IllegalArgumentException( message );
         }
 
+        //  Formula needs all values between 0 - 1.
+
+        h = h % 360.0f;
+        h /= 360f;
+        s /= 100f;
+        l /= 100f;
+
+        float q = 0;
+
+        if (l < 0.5)
+            q = l * (1 + s);
+        else
+            q = (l + s) - (s * l);
 
-        int[] array = {r.intValue(), g.intValue(), b.intValue()};
+        float p = 2 * l - q;
+
+        int r = Math.round(Math.max(0, HueToRGB(p, q, h + (1.0f / 3.0f)) * 256));
+        int g = Math.round(Math.max(0, HueToRGB(p, q, h) * 256));
+        int b = Math.round(Math.max(0, HueToRGB(p, q, h - (1.0f / 3.0f)) * 256));
+
+        int[] array = {r, g, b};
         return array;
     }
 
-    private static Double hue2rgb(Double p, Double q, Double t){
-        if(t < 0) t += 1;
-        if(t > 1) t -= 1;
-        if(t < 1/6) return p + (q - p) * 6 * t;
-        if(t < 1/2) return q;
-        if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
-        return p;
-    }
-    
+    private static float HueToRGB(float p, float q, float h){
+		if (h < 0) h += 1;
+
+		if (h > 1 ) h -= 1;
+
+		if (6 * h < 1)
+		{
+			return p + ((q - p) * 6 * h);
+		}
+
+		if (2 * h < 1 )
+		{
+			return  q;
+		}
+
+		if (3 * h < 2)
+		{
+			return p + ( (q - p) * 6 * ((2.0f / 3.0f) - h) );
+		}
+
+   		return p;
+	}
 
     /**
      * Checks if file passed is an image