Initial commit
[mustard2:mustard2.git] / src / org / mustard2 / util / Utility.java
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.mustard2.util;
18
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.io.InputStreamReader;
22 import java.io.UnsupportedEncodingException;
23 import java.text.SimpleDateFormat;
24 import java.util.Date;
25
26 import android.text.Editable;
27 import android.widget.TextView;
28
29 public class Utility {
30     public final static String readInputStream(InputStream in, String encoding) throws IOException {
31         InputStreamReader reader = new InputStreamReader(in, encoding);
32         StringBuffer sb = new StringBuffer();
33         int count;
34         char[] buf = new char[512];
35         while ((count = reader.read(buf)) != -1) {
36             sb.append(buf, 0, count);
37         }
38         return sb.toString();
39     }
40
41     public final static boolean arrayContains(Object[] a, Object o) {
42         for (int i = 0, count = a.length; i < count; i++) {
43             if (a[i].equals(o)) {
44                 return true;
45             }
46         }
47         return false;
48     }
49
50     /**
51      * Combines the given array of Objects into a single string using the
52      * seperator character and each Object's toString() method. between each
53      * part.
54      *
55      * @param parts
56      * @param seperator
57      * @return
58      */
59     public static String combine(Object[] parts, char seperator) {
60         if (parts == null) {
61             return null;
62         }
63         StringBuffer sb = new StringBuffer();
64         for (int i = 0; i < parts.length; i++) {
65             sb.append(parts[i].toString());
66             if (i < parts.length - 1) {
67                 sb.append(seperator);
68             }
69         }
70         return sb.toString();
71     }
72
73     public static boolean requiredFieldValid(TextView view) {
74         return view.getText() != null && view.getText().length() > 0;
75     }
76
77     public static boolean requiredFieldValid(Editable s) {
78         return s != null && s.length() > 0;
79     }
80     
81     /**
82      * A fast version of  URLDecoder.decode() that works only with UTF-8 and does only two
83      * allocations. This version is around 3x as fast as the standard one and I'm using it
84      * hundreds of times in places that slow down the UI, so it helps.
85      */
86     public static String fastUrlDecode(String s) {
87         try {
88             byte[] bytes = s.getBytes("UTF-8");
89             byte ch;
90             int length = 0;
91             for (int i = 0, count = bytes.length; i < count; i++) {
92                 ch = bytes[i];
93                 if (ch == '%') {
94                     int h = (bytes[i + 1] - '0');
95                     int l = (bytes[i + 2] - '0');
96                     if (h > 9) {
97                         h -= 7;
98                     }
99                     if (l > 9) {
100                         l -= 7;
101                     }
102                     bytes[length] = (byte) ((h << 4) | l);
103                     i += 2;
104                 }
105                 else if (ch == '+') {
106                     bytes[length] = ' ';
107                 }
108                 else {
109                     bytes[length] = bytes[i];
110                 }
111                 length++;
112             }
113             return new String(bytes, 0, length, "UTF-8");
114         }
115         catch (UnsupportedEncodingException uee) {
116             return null;
117         }
118     }
119     
120     public static String getRelativeDate(Date date) {
121                 Date now = new Date();
122
123                 // Seconds.
124                 long diff = (now.getTime() - date.getTime()) / 1000;
125
126                 if(diff < 0) { // WTF ??? check your clock guy
127                         return new SimpleDateFormat("d MM yyyy HH:mm:ss z").format(date);
128                 } else if (diff < 60) {
129                 return "a few seconds ago";
130             } else if (diff < 92) {
131                 return "about a minute ago";
132             } else if (diff < 3300) {
133                 return "about " + Math.round(diff/60) +" minutes ago";
134             } else if (diff < 5400) {
135                 return "about an hour ago";
136             } else if (diff < 22 * 3600) {
137                 return "about "+ Math.round(diff/3600)+" hours ago";
138             } else if (diff < 37 * 3600) {
139                 return "about a day ago";
140             } else if (diff < 24 * 24 * 3600) {
141                 return "about "+Math.round(diff/(24*3600))+" days ago";
142             } else if (diff < 46 * 24 * 3600) {
143                 return "about a month ago";
144             } else if (diff < 330 * 24 * 3600) {
145                 return "about "+Math.round(diff/(30*24*3600))+" months ago";
146             } else if (diff < 480 * 24 * 3600) {
147                 return "about a year ago";
148             } else {
149                 return new SimpleDateFormat("d MM yyyy HH:mm:ss z").format(date);
150             }
151                                 
152         }
153
154 }