parasMap
/**
* join url and paras
- *
+ *
*
* getUrlWithParas(null, {(a, b)}) = "?a=b";
* getUrlWithParas("baidu.com", {}) = "baidu.com";
* getUrlWithParas("baidu.com", {(a, b), (i, j)}) = "baidu.com?a=b&i=j";
* getUrlWithParas("baidu.com", {(a, b), (i, j), (c, d)}) = "baidu.com?a=b&i=j&c=d";
*
- *
- * @param url url
+ *
+ * @param url url
* @param parasMap paras map, key is para name, value is para value
* @return if url is null, process it as empty string
*/
@@ -296,7 +304,7 @@ public static String getUrlWithParas(String url, Map parasMap) {
/**
* join url and encoded paras
- *
+ *
* @param url
* @param parasMap
* @return
@@ -314,9 +322,10 @@ public static String getUrlWithValueEncodeParas(String url, Map
/**
* join paras
- *
+ *
* @param parasMap paras map, key is para name, value is para value
- * @return join key and value with {@link #EQUAL_SIGN}, join keys with {@link #PARAMETERS_SEPARATOR}
+ * @return join key and value with {@link #EQUAL_SIGN}, join keys with
+ * {@link #PARAMETERS_SEPARATOR}
*/
public static String joinParas(Map parasMap) {
if (parasMap == null || parasMap.size() == 0) {
@@ -326,7 +335,7 @@ public static String joinParas(Map parasMap) {
StringBuilder paras = new StringBuilder();
Iterator> ite = parasMap.entrySet().iterator();
while (ite.hasNext()) {
- Map.Entry entry = (Map.Entry)ite.next();
+ Map.Entry entry = (Map.Entry) ite.next();
paras.append(entry.getKey()).append(EQUAL_SIGN).append(entry.getValue());
if (ite.hasNext()) {
paras.append(PARAMETERS_SEPARATOR);
@@ -337,7 +346,7 @@ public static String joinParas(Map parasMap) {
/**
* join paras with encoded value
- *
+ *
* @param parasMap
* @return
* @see #joinParas(Map)
@@ -349,7 +358,7 @@ public static String joinParasWithEncodedValue(Map parasMap) {
Iterator> ite = parasMap.entrySet().iterator();
try {
while (ite.hasNext()) {
- Map.Entry entry = (Map.Entry)ite.next();
+ Map.Entry entry = (Map.Entry) ite.next();
paras.append(entry.getKey()).append(EQUAL_SIGN).append(StringUtils.utf8Encode(entry.getValue()));
if (ite.hasNext()) {
paras.append(PARAMETERS_SEPARATOR);
@@ -364,7 +373,7 @@ public static String joinParasWithEncodedValue(Map parasMap) {
/**
* append a key and value pair to url
- *
+ *
* @param url
* @param paraKey
* @param paraValue
@@ -385,11 +394,11 @@ public static String appendParaToUrl(String url, String paraKey, String paraValu
}
private static final SimpleDateFormat GMT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z",
- Locale.ENGLISH);
+ Locale.ENGLISH);
/**
* parse gmt time to long
- *
+ *
* @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT
* @return -1 represents exception otherwise time in milliseconds
*/
@@ -404,8 +413,8 @@ public static long parseGmtTime(String gmtTime) {
/**
* set HttpRequest to HttpURLConnection
- *
- * @param request source request
+ *
+ * @param request source request
* @param urlConnection destin url connection
*/
private static void setURLConnection(HttpRequest request, HttpURLConnection urlConnection) {
@@ -424,27 +433,37 @@ private static void setURLConnection(HttpRequest request, HttpURLConnection urlC
/**
* set HttpURLConnection property
- *
+ *
* @param requestProperties
* @param urlConnection
*/
public static void setURLConnection(Map requestProperties, HttpURLConnection urlConnection) {
- if (MapUtils.isEmpty(requestProperties) || urlConnection == null) {
+ if (urlConnection == null) {
return;
}
- for (Map.Entry entry : requestProperties.entrySet()) {
- if (!StringUtils.isEmpty(entry.getKey())) {
- urlConnection.setRequestProperty(entry.getKey(), entry.getValue());
+ boolean hasUserAgent = false;
+ if (!MapUtils.isEmpty(requestProperties)) {
+ for (Map.Entry entry : requestProperties.entrySet()) {
+ if (!StringUtils.isEmpty(entry.getKey())) {
+ urlConnection.setRequestProperty(entry.getKey(), entry.getValue());
+ if ("User-Agent".equalsIgnoreCase(entry.getKey())) {
+ hasUserAgent = true;
+ }
+ }
}
}
+ if (!hasUserAgent) {
+ urlConnection.setRequestProperty("User-Agent",
+ "Mozilla/5.0 (Linux; Android 10; Android Demo) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Mobile Safari/537.36");
+ }
}
/**
* set HttpURLConnection to HttpResponse
- *
+ *
* @param urlConnection source url connection
- * @param response destin response
+ * @param response destin response
*/
private static void setHttpResponse(HttpURLConnection urlConnection, HttpResponse response) {
if (response == null || urlConnection == null) {
@@ -461,7 +480,7 @@ private static void setHttpResponse(HttpURLConnection urlConnection, HttpRespons
/**
* AsyncTask to get data by String url
- *
+ *
* @author Trinea 2013-11-15
*/
private static class HttpStringAsyncTask extends AsyncTask {
@@ -494,7 +513,7 @@ protected void onPostExecute(HttpResponse httpResponse) {
/**
* AsyncTask to get data by HttpRequest
- *
+ *
* @author Trinea 2013-11-15
*/
private static class HttpRequestAsyncTask extends AsyncTask {
@@ -527,7 +546,7 @@ protected void onPostExecute(HttpResponse httpResponse) {
/**
* HttpListener, can do something before or after HttpGet
- *
+ *
* @author Trinea 2013-11-15
*/
public static abstract class HttpListener {
@@ -538,16 +557,18 @@ public static abstract class HttpListener {
* this can be null if you not want to do something
*
*/
- protected void onPreGet() {}
+ protected void onPreGet() {
+ }
/**
* Runs on the UI thread after httpGet. The httpResponse is returned by httpGet.
*
* - this can be null if you not want to do something
*
- *
+ *
* @param httpResponse get by the url
*/
- protected void onPostGet(HttpResponse httpResponse) {}
+ protected void onPostGet(HttpResponse httpResponse) {
+ }
}
}
diff --git a/src/cn/trinea/android/common/util/IOUtils.java b/src/main/java/cn/trinea/android/common/util/IOUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/IOUtils.java
rename to src/main/java/cn/trinea/android/common/util/IOUtils.java
diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/main/java/cn/trinea/android/common/util/ImageCacheManager.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ImageCacheManager.java
rename to src/main/java/cn/trinea/android/common/util/ImageCacheManager.java
diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/main/java/cn/trinea/android/common/util/ImageUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ImageUtils.java
rename to src/main/java/cn/trinea/android/common/util/ImageUtils.java
diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/main/java/cn/trinea/android/common/util/JSONUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/JSONUtils.java
rename to src/main/java/cn/trinea/android/common/util/JSONUtils.java
diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/main/java/cn/trinea/android/common/util/ListUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ListUtils.java
rename to src/main/java/cn/trinea/android/common/util/ListUtils.java
diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/main/java/cn/trinea/android/common/util/MapUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/MapUtils.java
rename to src/main/java/cn/trinea/android/common/util/MapUtils.java
diff --git a/src/cn/trinea/android/common/util/NetWorkUtils.java b/src/main/java/cn/trinea/android/common/util/NetWorkUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/NetWorkUtils.java
rename to src/main/java/cn/trinea/android/common/util/NetWorkUtils.java
diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/main/java/cn/trinea/android/common/util/ObjectUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ObjectUtils.java
rename to src/main/java/cn/trinea/android/common/util/ObjectUtils.java
diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/main/java/cn/trinea/android/common/util/PackageUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/PackageUtils.java
rename to src/main/java/cn/trinea/android/common/util/PackageUtils.java
diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/main/java/cn/trinea/android/common/util/ParcelUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ParcelUtils.java
rename to src/main/java/cn/trinea/android/common/util/ParcelUtils.java
diff --git a/src/cn/trinea/android/common/util/PatchUtils.java b/src/main/java/cn/trinea/android/common/util/PatchUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/PatchUtils.java
rename to src/main/java/cn/trinea/android/common/util/PatchUtils.java
diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/main/java/cn/trinea/android/common/util/PreferencesUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/PreferencesUtils.java
rename to src/main/java/cn/trinea/android/common/util/PreferencesUtils.java
diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/main/java/cn/trinea/android/common/util/RandomUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/RandomUtils.java
rename to src/main/java/cn/trinea/android/common/util/RandomUtils.java
diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/main/java/cn/trinea/android/common/util/ResourceUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ResourceUtils.java
rename to src/main/java/cn/trinea/android/common/util/ResourceUtils.java
diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/main/java/cn/trinea/android/common/util/ScreenUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ScreenUtils.java
rename to src/main/java/cn/trinea/android/common/util/ScreenUtils.java
diff --git a/src/cn/trinea/android/common/util/SerializeUtils.java b/src/main/java/cn/trinea/android/common/util/SerializeUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/SerializeUtils.java
rename to src/main/java/cn/trinea/android/common/util/SerializeUtils.java
diff --git a/src/main/java/cn/trinea/android/common/util/ShellUtils.java b/src/main/java/cn/trinea/android/common/util/ShellUtils.java
new file mode 100644
index 0000000..937ce90
--- /dev/null
+++ b/src/main/java/cn/trinea/android/common/util/ShellUtils.java
@@ -0,0 +1,285 @@
+package cn.trinea.android.common.util;
+
+import android.os.Build;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * ShellUtils
+ *
+ * Check root
+ * - {@link ShellUtils#checkRootPermission()}
+ *
+ *
+ * Execte command
+ * - {@link ShellUtils#execCommand(String)}
+ * - {@link ShellUtils#execCommand(String, long)}
+ * - {@link ShellUtils#execCommand(String, boolean)}
+ * - {@link ShellUtils#execCommand(String, boolean, long)}
+ * - {@link ShellUtils#execCommand(String, boolean, boolean)}
+ * - {@link ShellUtils#execCommand(String, boolean, long, boolean)}
+ * - {@link ShellUtils#execCommand(List, boolean)}
+ * - {@link ShellUtils#execCommand(List, boolean, long)}
+ * - {@link ShellUtils#execCommand(List, boolean, long, boolean)}
+ * - {@link ShellUtils#execCommand(String[], boolean)}
+ * - {@link ShellUtils#execCommand(String[], boolean, long)}
+ * - {@link ShellUtils#execCommand(String[], boolean, long, boolean)}
+ *
+ *
+ * @author Trinea 2013-5-16
+ */
+public class ShellUtils {
+
+ public static final String COMMAND_SU = "su";
+ public static final String COMMAND_SH = "sh";
+ public static final String COMMAND_EXIT = "exit\n";
+ public static final String COMMAND_LINE_END = "\n";
+
+ private ShellUtils() {
+ throw new AssertionError();
+ }
+
+ /**
+ * check whether has root permission
+ *
+ * @return
+ */
+ public static boolean checkRootPermission() {
+ return execCommand("echo root", true, 5000, false).result == 0;
+ }
+
+ public static CommandResult execCommand(String command) {
+ return execCommand(new String[]{command}, false, -1, true);
+ }
+
+ public static CommandResult execCommand(String command, long timeoutInMills) {
+ return execCommand(new String[]{command}, false, timeoutInMills, true);
+ }
+
+ public static CommandResult execCommand(String command, boolean isRoot) {
+ return execCommand(new String[]{command}, isRoot, -1, true);
+ }
+
+ /**
+ * execute shell command, default return result msg
+ *
+ * @param command command
+ * @param isRoot whether need to run with root
+ * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O
+ * @return
+ * @see ShellUtils#execCommand(String[], boolean, long, boolean)
+ */
+ public static CommandResult execCommand(String command, boolean isRoot, long timeoutInMills) {
+ return execCommand(new String[]{command}, isRoot, timeoutInMills, true);
+ }
+
+ public static CommandResult execCommand(List commands, boolean isRoot) {
+ return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, -1, true);
+ }
+
+ /**
+ * execute shell commands, default return result msg
+ *
+ * @param commands command list
+ * @param isRoot whether need to run with root
+ * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O
+ * @return
+ * @see ShellUtils#execCommand(String[], boolean, long, boolean)
+ */
+ public static CommandResult execCommand(List commands, boolean isRoot, long timeoutInMills) {
+ return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, timeoutInMills, true);
+ }
+
+ public static CommandResult execCommand(String[] commands, boolean isRoot) {
+ return execCommand(commands, isRoot, -1, true);
+ }
+
+ /**
+ * execute shell commands, default return result msg
+ *
+ * @param commands command array
+ * @param isRoot whether need to run with root
+ * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O
+ * @return
+ * @see ShellUtils#execCommand(String[], boolean, long, boolean)
+ */
+ public static CommandResult execCommand(String[] commands, boolean isRoot, long timeoutInMills) {
+ return execCommand(commands, isRoot, timeoutInMills, true);
+ }
+
+ public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {
+ return execCommand(new String[]{command}, isRoot, -1, isNeedResultMsg);
+ }
+
+ /**
+ * execute shell command
+ *
+ * @param command command
+ * @param isRoot whether need to run with root
+ * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O
+ * @param isNeedResultMsg whether need result msg
+ * @return
+ * @see ShellUtils#execCommand(String[], boolean, long, boolean)
+ */
+ public static CommandResult execCommand(String command, boolean isRoot, long timeoutInMills, boolean isNeedResultMsg) {
+ return execCommand(new String[]{command}, isRoot, timeoutInMills, isNeedResultMsg);
+ }
+
+ /**
+ * execute shell commands
+ *
+ * @param commands command list
+ * @param isRoot whether need to run with root
+ * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O
+ * @param isNeedResultMsg whether need result msg
+ * @return
+ * @see ShellUtils#execCommand(String[], boolean, long, boolean)
+ */
+ public static CommandResult execCommand(List commands, boolean isRoot, long timeoutInMills, boolean isNeedResultMsg) {
+ return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, timeoutInMills, isNeedResultMsg);
+ }
+
+ /**
+ * execute shell commands
+ *
+ * @param commands command array
+ * @param isRoot whether need to run with root
+ * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O
+ * @param isNeedResultMsg whether need result msg
+ * @return
+ * - if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and
+ * {@link CommandResult#errorMsg} is null.
+ * - if {@link CommandResult#result} is -1, there maybe some excepiton.
+ *
+ */
+ public static CommandResult execCommand(String[] commands, boolean isRoot, long timeoutInMills, boolean isNeedResultMsg) {
+ int result = -1;
+ if (commands == null || commands.length == 0) {
+ return new CommandResult(result, null, null);
+ }
+
+ Process process = null;
+ BufferedReader successResult = null;
+ BufferedReader errorResult = null;
+ StringBuilder successMsg = null;
+ StringBuilder errorMsg = null;
+
+ DataOutputStream os = null;
+ boolean isTimeout = false;
+ try {
+ process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
+ os = new DataOutputStream(process.getOutputStream());
+ for (String command : commands) {
+ if (command == null) {
+ continue;
+ }
+
+ // donnot use os.writeBytes(commmand), avoid chinese charset error
+ os.write(command.getBytes());
+ os.writeBytes(COMMAND_LINE_END);
+ os.flush();
+ }
+ os.writeBytes(COMMAND_EXIT);
+ os.flush();
+
+ if (timeoutInMills <= 0) {
+ result = process.waitFor();
+ } else {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ isTimeout = process.waitFor(timeoutInMills, TimeUnit.MILLISECONDS);
+ result = isTimeout ? 0 : -1;
+ }
+ }
+ // get command result
+ if (isNeedResultMsg) {
+ successMsg = new StringBuilder();
+ errorMsg = new StringBuilder();
+ successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+ String s;
+ while ((s = successResult.readLine()) != null) {
+ successMsg.append(s).append(COMMAND_LINE_END);
+ }
+ while ((s = errorResult.readLine()) != null) {
+ errorMsg.append(s).append(COMMAND_LINE_END);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (os != null) {
+ os.close();
+ }
+ if (successResult != null) {
+ successResult.close();
+ }
+ if (errorResult != null) {
+ errorResult.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ if (process != null) {
+ process.destroy();
+ }
+ }
+ if (isTimeout && errorMsg.length() == 0) {
+ errorMsg.append("Timeout, possibly due to lack of permissions.");
+ }
+ return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null
+ : errorMsg.toString());
+ }
+
+ /**
+ * result of command
+ *
+ * - {@link CommandResult#result} means result of command, 0 means normal, else means error, same to excute in
+ * linux shell
+ * - {@link CommandResult#successMsg} means success message of command result
+ * - {@link CommandResult#errorMsg} means error message of command result
+ *
+ *
+ * @author Trinea 2013-5-16
+ */
+ public static class CommandResult {
+
+ /**
+ * result of command
+ **/
+ public int result;
+ /**
+ * success message of command result
+ **/
+ public String successMsg;
+ /**
+ * error message of command result
+ **/
+ public String errorMsg;
+
+ public CommandResult(int result) {
+ this.result = result;
+ }
+
+ public CommandResult(int result, String successMsg, String errorMsg) {
+ this.result = result;
+ this.successMsg = successMsg;
+ this.errorMsg = errorMsg;
+ }
+
+ @Override
+ public String toString() {
+ return "result is: " + result +
+ "\nsuccessMsg is: '" + successMsg + "'" +
+ "\nerrorMsg is: '" + errorMsg + "'";
+ }
+ }
+}
diff --git a/src/cn/trinea/android/common/util/SingletonUtils.java b/src/main/java/cn/trinea/android/common/util/SingletonUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/SingletonUtils.java
rename to src/main/java/cn/trinea/android/common/util/SingletonUtils.java
diff --git a/src/cn/trinea/android/common/util/SizeUtils.java b/src/main/java/cn/trinea/android/common/util/SizeUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/SizeUtils.java
rename to src/main/java/cn/trinea/android/common/util/SizeUtils.java
diff --git a/src/cn/trinea/android/common/util/SqliteUtils.java b/src/main/java/cn/trinea/android/common/util/SqliteUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/SqliteUtils.java
rename to src/main/java/cn/trinea/android/common/util/SqliteUtils.java
diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/main/java/cn/trinea/android/common/util/StringUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/StringUtils.java
rename to src/main/java/cn/trinea/android/common/util/StringUtils.java
diff --git a/src/cn/trinea/android/common/util/SystemUtils.java b/src/main/java/cn/trinea/android/common/util/SystemUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/SystemUtils.java
rename to src/main/java/cn/trinea/android/common/util/SystemUtils.java
diff --git a/src/cn/trinea/android/common/util/TimeUtils.java b/src/main/java/cn/trinea/android/common/util/TimeUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/TimeUtils.java
rename to src/main/java/cn/trinea/android/common/util/TimeUtils.java
diff --git a/src/cn/trinea/android/common/util/ToastUtils.java b/src/main/java/cn/trinea/android/common/util/ToastUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ToastUtils.java
rename to src/main/java/cn/trinea/android/common/util/ToastUtils.java
diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/main/java/cn/trinea/android/common/util/ViewUtils.java
similarity index 100%
rename from src/cn/trinea/android/common/util/ViewUtils.java
rename to src/main/java/cn/trinea/android/common/util/ViewUtils.java
diff --git a/src/cn/trinea/android/common/view/BorderScrollView.java b/src/main/java/cn/trinea/android/common/view/BorderScrollView.java
similarity index 100%
rename from src/cn/trinea/android/common/view/BorderScrollView.java
rename to src/main/java/cn/trinea/android/common/view/BorderScrollView.java
diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/main/java/cn/trinea/android/common/view/DropDownListView.java
similarity index 100%
rename from src/cn/trinea/android/common/view/DropDownListView.java
rename to src/main/java/cn/trinea/android/common/view/DropDownListView.java
diff --git a/src/cn/trinea/android/common/view/HorizontalListView.java b/src/main/java/cn/trinea/android/common/view/HorizontalListView.java
similarity index 100%
rename from src/cn/trinea/android/common/view/HorizontalListView.java
rename to src/main/java/cn/trinea/android/common/view/HorizontalListView.java
diff --git a/src/cn/trinea/android/common/view/SlideOnePageGallery.java b/src/main/java/cn/trinea/android/common/view/SlideOnePageGallery.java
similarity index 100%
rename from src/cn/trinea/android/common/view/SlideOnePageGallery.java
rename to src/main/java/cn/trinea/android/common/view/SlideOnePageGallery.java
diff --git a/res/drawable-hdpi/drop_down_list_arrow.png b/src/main/res/drawable-hdpi/drop_down_list_arrow.png
similarity index 100%
rename from res/drawable-hdpi/drop_down_list_arrow.png
rename to src/main/res/drawable-hdpi/drop_down_list_arrow.png
diff --git a/res/drawable-ldpi/drop_down_list_arrow.png b/src/main/res/drawable-ldpi/drop_down_list_arrow.png
similarity index 100%
rename from res/drawable-ldpi/drop_down_list_arrow.png
rename to src/main/res/drawable-ldpi/drop_down_list_arrow.png
diff --git a/res/drawable-mdpi/drop_down_list_arrow.png b/src/main/res/drawable-mdpi/drop_down_list_arrow.png
similarity index 100%
rename from res/drawable-mdpi/drop_down_list_arrow.png
rename to src/main/res/drawable-mdpi/drop_down_list_arrow.png
diff --git a/res/layout/drop_down_list_footer.xml b/src/main/res/layout/drop_down_list_footer.xml
similarity index 100%
rename from res/layout/drop_down_list_footer.xml
rename to src/main/res/layout/drop_down_list_footer.xml
diff --git a/res/layout/drop_down_list_header.xml b/src/main/res/layout/drop_down_list_header.xml
similarity index 100%
rename from res/layout/drop_down_list_header.xml
rename to src/main/res/layout/drop_down_list_header.xml
diff --git a/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
similarity index 100%
rename from res/values-zh-rCN/strings.xml
rename to src/main/res/values-zh-rCN/strings.xml
diff --git a/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
similarity index 100%
rename from res/values-zh-rTW/strings.xml
rename to src/main/res/values-zh-rTW/strings.xml
diff --git a/res/values/attrs.xml b/src/main/res/values/attrs.xml
similarity index 100%
rename from res/values/attrs.xml
rename to src/main/res/values/attrs.xml
diff --git a/res/values/colors.xml b/src/main/res/values/colors.xml
similarity index 100%
rename from res/values/colors.xml
rename to src/main/res/values/colors.xml
diff --git a/res/values/dimens.xml b/src/main/res/values/dimens.xml
similarity index 100%
rename from res/values/dimens.xml
rename to src/main/res/values/dimens.xml
diff --git a/res/values/strings.xml b/src/main/res/values/strings.xml
similarity index 100%
rename from res/values/strings.xml
rename to src/main/res/values/strings.xml
diff --git a/res/values/styles.xml b/src/main/res/values/styles.xml
similarity index 100%
rename from res/values/styles.xml
rename to src/main/res/values/styles.xml