浏览代码

调整公共依赖库

316044749 7 年之前
父节点
当前提交
48578b8197
共有 81 个文件被更改,包括 2313 次插入104 次删除
  1. 0 1
      app/build.gradle
  2. 2 4
      app/src/main/java/com/ynstkz/shitu/android/base/BaseActivity.java
  3. 23 0
      app/src/main/java/com/ynstkz/shitu/android/base/BaseFragment.java
  4. 1 2
      app/src/main/java/com/ynstkz/shitu/android/data/SharedPreferencesUtils.java
  5. 22 0
      app/src/main/java/com/ynstkz/shitu/android/fragment/HomeFragment.java
  6. 23 0
      app/src/main/java/com/ynstkz/shitu/android/fragment/NearbyFragment.java
  7. 22 0
      app/src/main/java/com/ynstkz/shitu/android/fragment/UserCenterFragment.java
  8. 29 10
      app/src/main/res/layout/activity_home.xml
  9. 7 0
      app/src/main/res/layout/fm_home.xml
  10. 7 0
      app/src/main/res/layout/fm_nearby.xml
  11. 7 0
      app/src/main/res/layout/fm_usercenter.xml
  12. 108 0
      app/src/main/res/values/attrs.xml
  13. 7 2
      library/build.gradle
  14. 26 0
      library/src/androidTest/java/com/common/library/ExampleInstrumentedTest.java
  15. 1 1
      library/src/main/AndroidManifest.xml
  16. 20 0
      library/src/main/java/com/common/library/base/LibBaseActivity.java
  17. 77 0
      library/src/main/java/com/common/library/cache/Cache.java
  18. 10 10
      library/src/main/java/okhttp/OkHttpUtils.java
  19. 3 3
      library/src/main/java/okhttp/builder/GetBuilder.java
  20. 1 1
      library/src/main/java/okhttp/builder/HasParamsable.java
  21. 4 4
      library/src/main/java/okhttp/builder/HeadBuilder.java
  22. 2 2
      library/src/main/java/okhttp/builder/OkHttpRequestBuilder.java
  23. 3 3
      library/src/main/java/okhttp/builder/OtherRequestBuilder.java
  24. 3 3
      library/src/main/java/okhttp/builder/PostFileBuilder.java
  25. 3 3
      library/src/main/java/okhttp/builder/PostFormBuilder.java
  26. 3 3
      library/src/main/java/okhttp/builder/PostStringBuilder.java
  27. 1 1
      library/src/main/java/okhttp/callback/BitmapCallback.java
  28. 1 1
      library/src/main/java/okhttp/callback/Callback.java
  29. 2 2
      library/src/main/java/okhttp/callback/FileCallBack.java
  30. 1 1
      library/src/main/java/okhttp/callback/GenericsCallback.java
  31. 1 1
      library/src/main/java/okhttp/callback/IGenericsSerializator.java
  32. 1 1
      library/src/main/java/okhttp/callback/StringCallback.java
  33. 3 3
      library/src/main/java/okhttp/cookie/CookieJarImpl.java
  34. 1 1
      library/src/main/java/okhttp/cookie/store/CookieStore.java
  35. 1 1
      library/src/main/java/okhttp/cookie/store/HasCookieStore.java
  36. 1 1
      library/src/main/java/okhttp/cookie/store/MemoryCookieStore.java
  37. 1 1
      library/src/main/java/okhttp/cookie/store/PersistentCookieStore.java
  38. 1 1
      library/src/main/java/okhttp/cookie/store/SerializableHttpCookie.java
  39. 1 1
      library/src/main/java/okhttp/https/HttpsUtils.java
  40. 1 1
      library/src/main/java/okhttp/log/LoggerInterceptor.java
  41. 1 1
      library/src/main/java/okhttp/request/CountingRequestBody.java
  42. 1 1
      library/src/main/java/okhttp/request/GetRequest.java
  43. 3 3
      library/src/main/java/okhttp/request/OkHttpRequest.java
  44. 3 3
      library/src/main/java/okhttp/request/OtherRequest.java
  45. 4 4
      library/src/main/java/okhttp/request/PostFileRequest.java
  46. 4 4
      library/src/main/java/okhttp/request/PostFormRequest.java
  47. 2 2
      library/src/main/java/okhttp/request/PostStringRequest.java
  48. 4 3
      library/src/main/java/okhttp/request/RequestCall.java
  49. 1 1
      library/src/main/java/okhttp/utils/Exceptions.java
  50. 1 1
      library/src/main/java/okhttp/utils/ImageUtils.java
  51. 1 1
      library/src/main/java/okhttp/utils/L.java
  52. 1 1
      library/src/main/java/okhttp/utils/Platform.java
  53. 1 1
      library/src/main/java/utils/AppInfoUtil.java
  54. 1 1
      library/src/main/java/utils/ArithUtil.java
  55. 1 1
      library/src/main/java/utils/DateUtils.java
  56. 81 1
      library/src/main/java/utils/FileUtils.java
  57. 1 1
      library/src/main/java/utils/JsonAssetsReaderUtil.java
  58. 1 1
      library/src/main/java/utils/LogUtil.java
  59. 1 1
      library/src/main/java/utils/MD5Utils.java
  60. 1 1
      library/src/main/java/utils/NetWorkUtil.java
  61. 1 1
      library/src/main/java/utils/PixelUtil.java
  62. 1 1
      library/src/main/java/utils/RegularUtils.java
  63. 588 0
      library/src/main/java/com/common/library/view/MaterialDialog.java
  64. 470 0
      library/src/main/java/com/common/library/view/progressbar/CircularProgress.java
  65. 232 0
      library/src/main/java/com/common/library/view/progressbar/CircularProgressDrawable.java
  66. 二进制
      library/src/main/res/drawable-hdpi/shadow_bottom.png
  67. 二进制
      library/src/main/res/drawable-hdpi/shadow_left.png
  68. 二进制
      library/src/main/res/drawable-hdpi/shadow_right.png
  69. 二进制
      library/src/main/res/drawable-mdpi/refresh_default_ptr_rotate.png
  70. 二进制
      library/src/main/res/drawable-xhdpi/refresh_default_ptr_rotate.png
  71. 6 0
      library/src/main/res/drawable/dialog_bg_button_normal.xml
  72. 7 0
      library/src/main/res/drawable/dialog_bg_button_pressed.xml
  73. 12 0
      library/src/main/res/drawable/dialog_button.xml
  74. 19 0
      library/src/main/res/drawable/dialog_material_card.xml
  75. 7 0
      library/src/main/res/drawable/material_dialog_window.xml
  76. 94 0
      library/src/main/res/layout/layout_material_dialog.xml
  77. 108 0
      library/src/main/res/values/attrs.xml
  78. 20 0
      library/src/main/res/values/colors.xml
  79. 165 0
      library/src/main/res/values/dimens.xml
  80. 21 0
      library/src/main/res/values/styles.xml
  81. 17 0
      library/src/test/java/com/common/library/ExampleUnitTest.java

+ 0 - 1
app/build.gradle

@@ -21,7 +21,6 @@ android {
 dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     compile project(':library')
-    compile 'com.android.support:appcompat-v7:26.1.0'
     compile 'com.android.support:design:26.1.0'
     compile 'com.jakewharton:butterknife:7.0.1'
     compile 'com.github.bumptech.glide:glide:3.7.0'

+ 2 - 4
app/src/main/java/com/ynstkz/shitu/android/base/BaseActivity.java

@@ -2,16 +2,14 @@ package com.ynstkz.shitu.android.base;
 
 import android.os.Bundle;
 import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
 
-import com.ynstkz.shitu.android.R;
-import com.ynstkz.shitu.android.utils.StatusBarUtil;
+import com.common.library.base.LibBaseActivity;
 
 /**
  * 作者:fuchangle on 2018/1/27 21:50
  */
 
-public class BaseActivity extends AppCompatActivity{
+public class BaseActivity extends LibBaseActivity{
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {

+ 23 - 0
app/src/main/java/com/ynstkz/shitu/android/base/BaseFragment.java

@@ -0,0 +1,23 @@
+package com.ynstkz.shitu.android.base;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * 作者:fuchangle on 2018/1/29 11:38
+ */
+
+public class BaseFragment extends Fragment{
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+
+}

+ 1 - 2
app/src/main/java/com/ynstkz/shitu/android/data/SharedPreferencesUtils.java

@@ -4,11 +4,10 @@ import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 
+import com.common.library.utils.AppInfoUtil;
 import com.ynstkz.shitu.android.application.STApplication;
 import com.ynstkz.shitu.android.common.Constants;
 
-import utils.AppInfoUtil;
-
 /**
  * Created by fucl on 2016/4/6.
  */

+ 22 - 0
app/src/main/java/com/ynstkz/shitu/android/fragment/HomeFragment.java

@@ -0,0 +1,22 @@
+package com.ynstkz.shitu.android.fragment;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.ynstkz.shitu.android.base.BaseFragment;
+
+/**
+ * 作者:fuchangle on 2018/1/29 11:38
+ */
+
+public class HomeFragment extends BaseFragment{
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+
+}

+ 23 - 0
app/src/main/java/com/ynstkz/shitu/android/fragment/NearbyFragment.java

@@ -0,0 +1,23 @@
+package com.ynstkz.shitu.android.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.ynstkz.shitu.android.base.BaseFragment;
+
+/**
+ * 附近
+ * 作者:fuchangle on 2018/1/29 11:43
+ */
+
+public class NearbyFragment extends BaseFragment{
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+}

+ 22 - 0
app/src/main/java/com/ynstkz/shitu/android/fragment/UserCenterFragment.java

@@ -0,0 +1,22 @@
+package com.ynstkz.shitu.android.fragment;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.ynstkz.shitu.android.base.BaseFragment;
+
+/**
+ * 我
+ * 作者:fuchangle on 2018/1/29 11:44
+ */
+
+public class UserCenterFragment extends BaseFragment{
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+}

+ 29 - 10
app/src/main/res/layout/activity_home.xml

@@ -1,15 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:layout_height="match_parent">
 
-    <include layout="@layout/view_title"/>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:layout_alignParentTop="true"
+        android:layout_above="@+id/ll_bottom_lab">
 
-    <TextView
-        android:id="@+id/tv_barTitle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Hello World!"/>
+        <include layout="@layout/view_title"/>
 
-</LinearLayout>
+        <TextView
+            android:id="@+id/tv_barTitle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Hello World!"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/ll_bottom_lab"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:layout_alignParentBottom="true"
+        android:orientation="horizontal">
+
+
+
+    </LinearLayout>
+
+</RelativeLayout>

+ 7 - 0
app/src/main/res/layout/fm_home.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+</LinearLayout>

+ 7 - 0
app/src/main/res/layout/fm_nearby.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+</LinearLayout>

+ 7 - 0
app/src/main/res/layout/fm_usercenter.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+</LinearLayout>

+ 108 - 0
app/src/main/res/values/attrs.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <declare-styleable name="CircularProgress">
+        <attr name="circular_progress_color" format="color"/>
+        <attr name="circular_progress_size" format="enum">
+            <enum name="Small" value="0"/>
+            <enum name="Normal" value="1"/>
+            <enum name="Large" value="2"/>
+        </attr>
+        <attr name="circular_progress_border_width" format="dimension"/>
+        <attr name="circular_progress_indeterminate" format="boolean"/>
+        <attr name="circular_progress_max" format="integer"/>
+        <attr name="circular_progress_duration" format="integer"/>
+    </declare-styleable>
+
+    <declare-styleable name="SwipeBackLayout">
+        <attr name="edge_size" format="dimension"/>
+        <attr name="edge_flag">
+            <enum name="left" value="0" />
+            <enum name="right" value="1" />
+            <enum name="bottom" value="2" />
+            <enum name="all" value="3" />
+        </attr>
+        <attr name="shadow_left" format="reference"/>
+        <attr name="shadow_right" format="reference"/>
+        <attr name="shadow_bottom" format="reference"/>
+    </declare-styleable>
+
+    <attr name="SwipeBackLayoutStyle" format="reference"/>
+
+    <declare-styleable name="PullToRefresh">
+
+        <!-- A drawable to use as the background of the Refreshable View -->
+        <attr name="ptrRefreshableViewBackground" format="reference|color" />
+
+        <!-- A drawable to use as the background of the Header and Footer Loading Views -->
+        <attr name="ptrHeaderBackground" format="reference|color" />
+
+        <!-- Text Color of the Header and Footer Loading Views -->
+        <attr name="ptrHeaderTextColor" format="reference|color" />
+
+        <!-- Text Color of the Header and Footer Loading Views Sub Header -->
+        <attr name="ptrHeaderSubTextColor" format="reference|color" />
+
+        <!-- Mode of Pull-to-Refresh that should be used -->
+        <attr name="ptrMode">
+            <flag name="disabled" value="0x0" />
+            <flag name="pullFromStart" value="0x1" />
+            <flag name="pullFromEnd" value="0x2" />
+            <flag name="both" value="0x3" />
+            <flag name="manualOnly" value="0x4" />
+
+            <!-- These last two are depreacted -->
+            <flag name="pullDownFromTop" value="0x1" />
+            <flag name="pullUpFromBottom" value="0x2" />
+        </attr>
+
+        <!-- Whether the Indicator overlay(s) should be used -->
+        <attr name="ptrShowIndicator" format="reference|boolean" />
+
+        <!-- Drawable to use as Loading Indicator. Changes both Header and Footer. -->
+        <attr name="ptrDrawable" format="reference" />
+
+        <!-- Drawable to use as Loading Indicator in the Header View. Overrides value set in ptrDrawable. -->
+        <attr name="ptrDrawableStart" format="reference" />
+
+        <!-- Drawable to use as Loading Indicator in the Footer View. Overrides value set in ptrDrawable. -->
+        <attr name="ptrDrawableEnd" format="reference" />
+
+        <!-- Whether Android's built-in Over Scroll should be utilised for Pull-to-Refresh. -->
+        <attr name="ptrOverScroll" format="reference|boolean" />
+
+        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views -->
+        <attr name="ptrHeaderTextAppearance" format="reference" />
+
+        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views Sub Header -->
+        <attr name="ptrSubHeaderTextAppearance" format="reference" />
+
+        <!-- Style of Animation should be used displayed when pulling. -->
+        <attr name="ptrAnimationStyle">
+            <flag name="rotate" value="0x0" />
+            <flag name="flip" value="0x1" />
+        </attr>
+
+        <!-- Whether the user can scroll while the View is Refreshing -->
+        <attr name="ptrScrollingWhileRefreshingEnabled" format="reference|boolean" />
+
+        <!--
+        	Whether PullToRefreshListView has it's extras enabled. This allows the user to be
+        	able to scroll while refreshing, and behaves better. It acheives this by adding
+        	Header and/or Footer Views to the ListView.
+        -->
+        <attr name="ptrListViewExtrasEnabled" format="reference|boolean" />
+
+        <!--
+        	Whether the Drawable should be continually rotated as you pull. This only
+        	takes effect when using the 'Rotate' Animation Style.
+        -->
+        <attr name="ptrRotateDrawableWhilePulling" format="reference|boolean" />
+
+        <!-- BELOW HERE ARE DEPRECEATED. DO NOT USE. -->
+        <attr name="ptrAdapterViewBackground" format="reference|color" />
+        <attr name="ptrDrawableTop" format="reference" />
+        <attr name="ptrDrawableBottom" format="reference" />
+    </declare-styleable>
+
+</resources>

+ 7 - 2
library/build.gradle

@@ -2,6 +2,9 @@ apply plugin: 'com.android.library'
 
 android {
     compileSdkVersion 26
+
+
+
     defaultConfig {
         minSdkVersion 16
         targetSdkVersion 26
@@ -19,6 +22,8 @@ android {
 }
 
 dependencies {
-    compile fileTree(dir: 'libs', include: ['*.jar'])
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    compile 'com.android.support:appcompat-v7:26.1.0'
     compile 'com.squareup.okhttp3:okhttp:3.3.1'
-}
+}

+ 26 - 0
library/src/androidTest/java/com/common/library/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.common.library;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() throws Exception {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getTargetContext();
+
+        assertEquals("com.common.library.test", appContext.getPackageName());
+    }
+}

+ 1 - 1
library/src/main/AndroidManifest.xml

@@ -1,2 +1,2 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="test.kotlin.com.library" />
+    package="com.common.library" />

+ 20 - 0
library/src/main/java/com/common/library/base/LibBaseActivity.java

@@ -0,0 +1,20 @@
+package com.common.library.base;
+
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * 作者:fuchangle on 2018/1/29 10:30
+ */
+
+public class LibBaseActivity extends AppCompatActivity{
+
+    public static String CACHEPATH;
+
+    @Override
+    public void onCreate( Bundle savedInstanceState, PersistableBundle persistentState) {
+        super.onCreate(savedInstanceState, persistentState);
+        CACHEPATH = getApplication().getExternalFilesDir(null) + "/fileCache";
+    }
+}

+ 77 - 0
library/src/main/java/com/common/library/cache/Cache.java

@@ -0,0 +1,77 @@
+package com.common.library.cache;
+
+import com.common.library.base.LibBaseActivity;
+import com.common.library.utils.FileUtils;
+import com.common.library.utils.MD5Utils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Created by fucl on 2016/4/5.
+ */
+public class Cache<T> {
+
+    /**
+     * 文件对象缓存路径
+     */
+    public static Map<String, Object> CacheMap = new ConcurrentHashMap<>();
+    // 创建一个固定大小的线程池
+    private static ExecutorService service = Executors.newFixedThreadPool(1);
+
+    public static void put(String key, Object obj) {
+        service.execute(new MyRunnable(key, obj));
+    }
+
+    public static Object getObj(String key) {
+        Object obj = CacheMap.get(key);
+        if (obj == null) {
+            obj = FileUtils.readSerializable(LibBaseActivity.CACHEPATH + "" + MD5Utils.ecode(key));
+        }
+        return obj;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T get(String key) {
+        Object obj = CacheMap.get(key);
+        if (obj == null) {
+            obj = FileUtils.readSerializable(LibBaseActivity.CACHEPATH + "" + MD5Utils.ecode(key));
+            if (obj != null) {
+                CacheMap.put(key, obj);
+            }
+        }
+        return (T) obj;
+    }
+
+    /**
+     * 清除缓存数据
+     * @param key
+     */
+    public static void clean(String key){
+        try {
+            CacheMap.remove(key);
+            FileUtils.delectSerializable(LibBaseActivity.CACHEPATH + "" + MD5Utils.ecode(key));
+        } catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}
+
+class MyRunnable implements Runnable {
+
+    private String key;
+    private Object obj;
+
+    public MyRunnable(String key, Object obj) {
+        this.key = key;
+        this.obj = obj;
+    }
+
+    @Override
+    public void run() {
+        Cache.CacheMap.put(key, obj);
+        FileUtils.writeSerializable(obj, LibBaseActivity.CACHEPATH + "" + MD5Utils.ecode(key));
+    }
+}

+ 10 - 10
library/src/main/java/okhttp/OkHttpUtils.java

@@ -1,17 +1,17 @@
-package okhttp;
+package com.common.library.okhttp;
 
 import java.io.IOException;
 import java.util.concurrent.Executor;
 
-import okhttp.builder.GetBuilder;
-import okhttp.builder.HeadBuilder;
-import okhttp.builder.OtherRequestBuilder;
-import okhttp.builder.PostFileBuilder;
-import okhttp.builder.PostFormBuilder;
-import okhttp.builder.PostStringBuilder;
-import okhttp.callback.Callback;
-import okhttp.request.RequestCall;
-import okhttp.utils.Platform;
+import com.common.library.okhttp.builder.GetBuilder;
+import com.common.library.okhttp.builder.HeadBuilder;
+import com.common.library.okhttp.builder.OtherRequestBuilder;
+import com.common.library.okhttp.builder.PostFileBuilder;
+import com.common.library.okhttp.builder.PostFormBuilder;
+import com.common.library.okhttp.builder.PostStringBuilder;
+import com.common.library.okhttp.callback.Callback;
+import com.common.library.okhttp.request.RequestCall;
+import com.common.library.okhttp.utils.Platform;
 import okhttp3.Call;
 import okhttp3.OkHttpClient;
 import okhttp3.Response;

+ 3 - 3
library/src/main/java/okhttp/builder/GetBuilder.java

@@ -1,4 +1,4 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
 import android.net.Uri;
 
@@ -7,8 +7,8 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
-import okhttp.request.GetRequest;
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.request.GetRequest;
+import com.common.library.okhttp.request.RequestCall;
 
 /**
  * Created by zhy on 15/12/14.

+ 1 - 1
library/src/main/java/okhttp/builder/HasParamsable.java

@@ -1,4 +1,4 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
 import java.util.Map;
 

+ 4 - 4
library/src/main/java/okhttp/builder/HeadBuilder.java

@@ -1,8 +1,8 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
-import okhttp.OkHttpUtils;
-import okhttp.request.OtherRequest;
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.OkHttpUtils;
+import com.common.library.okhttp.request.OtherRequest;
+import com.common.library.okhttp.request.RequestCall;
 
 /**
  * Created by zhy on 16/3/2.

+ 2 - 2
library/src/main/java/okhttp/builder/OkHttpRequestBuilder.java

@@ -1,9 +1,9 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.request.RequestCall;
 
 /**
  * Created by zhy on 15/12/14.

+ 3 - 3
library/src/main/java/okhttp/builder/OtherRequestBuilder.java

@@ -1,7 +1,7 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
-import okhttp.request.OtherRequest;
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.request.OtherRequest;
+import com.common.library.okhttp.request.RequestCall;
 import okhttp3.RequestBody;
 
 /**

+ 3 - 3
library/src/main/java/okhttp/builder/PostFileBuilder.java

@@ -1,9 +1,9 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
 import java.io.File;
 
-import okhttp.request.PostFileRequest;
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.request.PostFileRequest;
+import com.common.library.okhttp.request.RequestCall;
 import okhttp3.MediaType;
 
 /**

+ 3 - 3
library/src/main/java/okhttp/builder/PostFormBuilder.java

@@ -1,4 +1,4 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -6,8 +6,8 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import okhttp.request.PostFormRequest;
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.request.PostFormRequest;
+import com.common.library.okhttp.request.RequestCall;
 
 /**
  * Created by zhy on 15/12/14.

+ 3 - 3
library/src/main/java/okhttp/builder/PostStringBuilder.java

@@ -1,7 +1,7 @@
-package okhttp.builder;
+package com.common.library.okhttp.builder;
 
-import okhttp.request.PostStringRequest;
-import okhttp.request.RequestCall;
+import com.common.library.okhttp.request.PostStringRequest;
+import com.common.library.okhttp.request.RequestCall;
 import okhttp3.MediaType;
 
 /**

+ 1 - 1
library/src/main/java/okhttp/callback/BitmapCallback.java

@@ -1,4 +1,4 @@
-package okhttp.callback;
+package com.common.library.okhttp.callback;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;

+ 1 - 1
library/src/main/java/okhttp/callback/Callback.java

@@ -1,4 +1,4 @@
-package okhttp.callback;
+package com.common.library.okhttp.callback;
 
 import okhttp3.Call;
 import okhttp3.Request;

+ 2 - 2
library/src/main/java/okhttp/callback/FileCallBack.java

@@ -1,11 +1,11 @@
-package okhttp.callback;
+package com.common.library.okhttp.callback;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
-import okhttp.OkHttpUtils;
+import com.common.library.okhttp.OkHttpUtils;
 import okhttp3.Response;
 
 /**

+ 1 - 1
library/src/main/java/okhttp/callback/GenericsCallback.java

@@ -1,4 +1,4 @@
-package okhttp.callback;
+package com.common.library.okhttp.callback;
 
 import java.io.IOException;
 import java.lang.reflect.ParameterizedType;

+ 1 - 1
library/src/main/java/okhttp/callback/IGenericsSerializator.java

@@ -1,4 +1,4 @@
-package okhttp.callback;
+package com.common.library.okhttp.callback;
 
 /**
  * Created by JimGong on 2016/6/23.

+ 1 - 1
library/src/main/java/okhttp/callback/StringCallback.java

@@ -1,4 +1,4 @@
-package okhttp.callback;
+package com.common.library.okhttp.callback;
 
 import java.io.IOException;
 

+ 3 - 3
library/src/main/java/okhttp/cookie/CookieJarImpl.java

@@ -1,9 +1,9 @@
-package okhttp.cookie;
+package com.common.library.okhttp.cookie;
 
 import java.util.List;
 
-import okhttp.cookie.store.CookieStore;
-import okhttp.utils.Exceptions;
+import com.common.library.okhttp.cookie.store.CookieStore;
+import com.common.library.okhttp.utils.Exceptions;
 import okhttp3.Cookie;
 import okhttp3.CookieJar;
 import okhttp3.HttpUrl;

+ 1 - 1
library/src/main/java/okhttp/cookie/store/CookieStore.java

@@ -1,4 +1,4 @@
-package okhttp.cookie.store;
+package com.common.library.okhttp.cookie.store;
 
 import java.util.List;
 

+ 1 - 1
library/src/main/java/okhttp/cookie/store/HasCookieStore.java

@@ -1,4 +1,4 @@
-package okhttp.cookie.store;
+package com.common.library.okhttp.cookie.store;
 
 /**
  * Created by zhy on 16/3/10.

+ 1 - 1
library/src/main/java/okhttp/cookie/store/MemoryCookieStore.java

@@ -1,4 +1,4 @@
-package okhttp.cookie.store;
+package com.common.library.okhttp.cookie.store;
 
 import java.util.ArrayList;
 import java.util.HashMap;

+ 1 - 1
library/src/main/java/okhttp/cookie/store/PersistentCookieStore.java

@@ -1,4 +1,4 @@
-package okhttp.cookie.store;
+package com.common.library.okhttp.cookie.store;
 
 import android.content.Context;
 import android.content.SharedPreferences;

+ 1 - 1
library/src/main/java/okhttp/cookie/store/SerializableHttpCookie.java

@@ -1,4 +1,4 @@
-package okhttp.cookie.store;
+package com.common.library.okhttp.cookie.store;
 
 import java.io.IOException;
 import java.io.ObjectInputStream;

+ 1 - 1
library/src/main/java/okhttp/https/HttpsUtils.java

@@ -1,4 +1,4 @@
-package okhttp.https;
+package com.common.library.okhttp.https;
 
 import java.io.IOException;
 import java.io.InputStream;

+ 1 - 1
library/src/main/java/okhttp/log/LoggerInterceptor.java

@@ -1,4 +1,4 @@
-package okhttp.log;
+package com.common.library.okhttp.log;
 
 import android.text.TextUtils;
 import android.util.Log;

+ 1 - 1
library/src/main/java/okhttp/request/CountingRequestBody.java

@@ -1,4 +1,4 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import okhttp3.MediaType;
 import okhttp3.RequestBody;

+ 1 - 1
library/src/main/java/okhttp/request/GetRequest.java

@@ -1,4 +1,4 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import java.util.Map;
 

+ 3 - 3
library/src/main/java/okhttp/request/OkHttpRequest.java

@@ -1,12 +1,12 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import java.util.Map;
 
-import okhttp.utils.Exceptions;
+import com.common.library.okhttp.utils.Exceptions;
 import okhttp3.Headers;
 import okhttp3.Request;
 import okhttp3.RequestBody;
-import okhttp.callback.Callback;
+import com.common.library.okhttp.callback.Callback;
 
 /**
  * Created by zhy on 15/11/6.

+ 3 - 3
library/src/main/java/okhttp/request/OtherRequest.java

@@ -1,11 +1,11 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import android.text.TextUtils;
 
 import java.util.Map;
 
-import okhttp.OkHttpUtils;
-import okhttp.utils.Exceptions;
+import com.common.library.okhttp.OkHttpUtils;
+import com.common.library.okhttp.utils.Exceptions;
 import okhttp3.MediaType;
 import okhttp3.Request;
 import okhttp3.RequestBody;

+ 4 - 4
library/src/main/java/okhttp/request/PostFileRequest.java

@@ -1,11 +1,11 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import java.io.File;
 import java.util.Map;
 
-import okhttp.OkHttpUtils;
-import okhttp.callback.Callback;
-import okhttp.utils.Exceptions;
+import com.common.library.okhttp.OkHttpUtils;
+import com.common.library.okhttp.callback.Callback;
+import com.common.library.okhttp.utils.Exceptions;
 import okhttp3.MediaType;
 import okhttp3.Request;
 import okhttp3.RequestBody;

+ 4 - 4
library/src/main/java/okhttp/request/PostFormRequest.java

@@ -1,4 +1,4 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import java.io.UnsupportedEncodingException;
 import java.net.FileNameMap;
@@ -7,9 +7,9 @@ import java.net.URLEncoder;
 import java.util.List;
 import java.util.Map;
 
-import okhttp.OkHttpUtils;
-import okhttp.builder.PostFormBuilder;
-import okhttp.callback.Callback;
+import com.common.library.okhttp.OkHttpUtils;
+import com.common.library.okhttp.builder.PostFormBuilder;
+import com.common.library.okhttp.callback.Callback;
 import okhttp3.FormBody;
 import okhttp3.Headers;
 import okhttp3.MediaType;

+ 2 - 2
library/src/main/java/okhttp/request/PostStringRequest.java

@@ -1,8 +1,8 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
 
 import java.util.Map;
 
-import okhttp.utils.Exceptions;
+import com.common.library.okhttp.utils.Exceptions;
 import okhttp3.MediaType;
 import okhttp3.Request;
 import okhttp3.RequestBody;

+ 4 - 3
library/src/main/java/okhttp/request/RequestCall.java

@@ -1,14 +1,15 @@
-package okhttp.request;
+package com.common.library.okhttp.request;
+
+import com.common.library.okhttp.OkHttpUtils;
+import com.common.library.okhttp.callback.Callback;
 
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
-import okhttp.OkHttpUtils;
 import okhttp3.Call;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
-import okhttp.callback.Callback;
 
 /**
  * Created by zhy on 15/12/15.

+ 1 - 1
library/src/main/java/okhttp/utils/Exceptions.java

@@ -1,4 +1,4 @@
-package okhttp.utils;
+package com.common.library.okhttp.utils;
 
 /**
  * Created by zhy on 15/12/14.

+ 1 - 1
library/src/main/java/okhttp/utils/ImageUtils.java

@@ -1,4 +1,4 @@
-package okhttp.utils;
+package com.common.library.okhttp.utils;
 
 import android.graphics.BitmapFactory;
 import android.util.DisplayMetrics;

+ 1 - 1
library/src/main/java/okhttp/utils/L.java

@@ -1,4 +1,4 @@
-package okhttp.utils;
+package com.common.library.okhttp.utils;
 
 import android.util.Log;
 

+ 1 - 1
library/src/main/java/okhttp/utils/Platform.java

@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package okhttp.utils;
+package com.common.library.okhttp.utils;
 
 import android.os.Build;
 import android.os.Handler;

+ 1 - 1
library/src/main/java/utils/AppInfoUtil.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import android.content.Context;
 import android.content.pm.PackageInfo;

+ 1 - 1
library/src/main/java/utils/ArithUtil.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import java.math.BigDecimal;
 

+ 1 - 1
library/src/main/java/utils/DateUtils.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;

+ 81 - 1
library/src/main/java/utils/FileUtils.java

@@ -1,12 +1,16 @@
-package utils;
+package com.common.library.utils;
 
 import android.graphics.Bitmap;
 import android.os.Environment;
+import android.util.Log;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 
 /**
  * 作者:fuchangle on 2018/1/26 16:35
@@ -96,4 +100,80 @@ public class FileUtils {
         }
         return true;
     }
+
+    /**
+     * 读取序列化数据
+     *
+     * @param path
+     * @return
+     */
+    public static Object readSerializable(String path) {
+        ObjectInputStream in = null;
+        try {
+            File f = new File(path);
+            if (f.exists()) {
+                in = new ObjectInputStream(new FileInputStream(f));
+                Object mul = in.readObject();
+                return mul;
+            }
+        } catch (Exception e) {
+            Log.e("序列化出错", "read序列化出错:" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 写入序列化数据
+     *
+     * @param obj
+     * @param path
+     */
+    public static void writeSerializable(Object obj, String path) {
+        ObjectOutputStream out = null;
+        try {
+            File f = new File(path);
+            f.getParentFile().mkdirs();
+            if (f.exists())
+                f.delete();
+            f.createNewFile();
+            out = new ObjectOutputStream(new FileOutputStream(f));
+            out.writeObject(obj);
+        } catch (Exception e) {
+            Log.e("序列化出错", "write序列化出错:" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除序列化文件
+     * @param path
+     */
+    public static void delectSerializable(String path){
+        try {
+            File file = new File(path);
+            if(file.exists()){
+                file.delete();
+            }
+        } catch (Exception e) {
+            Log.e("删除序列化文件出错", "delect序列化出错:" + e.getMessage());
+            e.printStackTrace();
+        }
+    }
 }

+ 1 - 1
library/src/main/java/utils/JsonAssetsReaderUtil.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import android.content.Context;
 

+ 1 - 1
library/src/main/java/utils/LogUtil.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import android.util.Log;
 

+ 1 - 1
library/src/main/java/utils/MD5Utils.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

+ 1 - 1
library/src/main/java/utils/NetWorkUtil.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import android.content.Context;
 import android.net.ConnectivityManager;

+ 1 - 1
library/src/main/java/utils/PixelUtil.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import android.app.Activity;
 import android.util.DisplayMetrics;

+ 1 - 1
library/src/main/java/utils/RegularUtils.java

@@ -1,4 +1,4 @@
-package utils;
+package com.common.library.utils;
 
 import android.text.TextUtils;
 

+ 588 - 0
library/src/main/java/com/common/library/view/MaterialDialog.java

@@ -0,0 +1,588 @@
+package com.common.library.view;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AutoCompleteTextView;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.common.library.R;
+
+/**
+ * Created by drakeet on 4/7/16.
+ */
+public class MaterialDialog {
+
+    private final static int BUTTON_BOTTOM = 9;
+    private final static int BUTTON_TOP = 9;
+
+    private boolean mCancel;
+    private Context mContext;
+    private AlertDialog mAlertDialog;
+    private Builder mBuilder;
+    private View mView;
+    private int mTitleResId;
+    private CharSequence mTitle;
+    private int mMessageResId;
+    private CharSequence mMessage;
+    private Button mPositiveButton;
+    private LinearLayout.LayoutParams mLayoutParams;
+    private Button mNegativeButton;
+    private boolean mHasShow = false;
+    private int mBackgroundResId = -1;
+    private Drawable mBackgroundDrawable;
+    private View mMessageContentView;
+    private int mMessageContentViewResId;
+    private DialogInterface.OnDismissListener mOnDismissListener;
+    private int pId = -1, nId = -1;
+    private String pText, nText;
+    View.OnClickListener pListener, nListener;
+
+
+    public MaterialDialog(Context context) {
+        this.mContext = context;
+    }
+
+
+    public void show() {
+        if (!mHasShow) {
+            mBuilder = new Builder();
+        } else {
+            mAlertDialog.show();
+        }
+        mHasShow = true;
+    }
+
+
+    public MaterialDialog setView(View view) {
+        mView = view;
+        if (mBuilder != null) {
+            mBuilder.setView(view);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setContentView(View view) {
+        mMessageContentView = view;
+        mMessageContentViewResId = 0;
+        if (mBuilder != null) {
+            mBuilder.setContentView(mMessageContentView);
+        }
+        return this;
+    }
+
+
+    /**
+     * Set a custom view resource to be the contents of the dialog.
+     *
+     * @param layoutResId resource ID to be inflated
+     */
+    public MaterialDialog setContentView(int layoutResId) {
+        mMessageContentViewResId = layoutResId;
+        mMessageContentView = null;
+        if (mBuilder != null) {
+            mBuilder.setContentView(layoutResId);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setBackground(Drawable drawable) {
+        mBackgroundDrawable = drawable;
+        if (mBuilder != null) {
+            mBuilder.setBackground(mBackgroundDrawable);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setBackgroundResource(int resId) {
+        mBackgroundResId = resId;
+        if (mBuilder != null) {
+            mBuilder.setBackgroundResource(mBackgroundResId);
+        }
+        return this;
+    }
+
+
+    public void dismiss() {
+        mAlertDialog.dismiss();
+    }
+
+
+    private int dip2px(float dpValue) {
+        final float scale = mContext.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+
+    private static boolean isLollipop() {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
+    }
+
+
+    public MaterialDialog setTitle(int resId) {
+        mTitleResId = resId;
+        if (mBuilder != null) {
+            mBuilder.setTitle(resId);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setTitle(CharSequence title) {
+        mTitle = title;
+        if (mBuilder != null) {
+            mBuilder.setTitle(title);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setMessage(int resId) {
+        mMessageResId = resId;
+        if (mBuilder != null) {
+            mBuilder.setMessage(resId);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setMessage(CharSequence message) {
+        mMessage = message;
+        if (mBuilder != null) {
+            mBuilder.setMessage(message);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setPositiveButton(int resId, final View.OnClickListener listener) {
+        this.pId = resId;
+        this.pListener = listener;
+        return this;
+    }
+
+
+    public Button getPositiveButton() {
+        return mPositiveButton;
+    }
+
+
+    public Button getNegativeButton() {
+        return mNegativeButton;
+    }
+
+
+    public MaterialDialog setPositiveButton(String text, final View.OnClickListener listener) {
+        this.pText = text;
+        this.pListener = listener;
+        return this;
+    }
+
+
+    public MaterialDialog setNegativeButton(int resId, final View.OnClickListener listener) {
+        this.nId = resId;
+        this.nListener = listener;
+        return this;
+    }
+
+
+    public MaterialDialog setNegativeButton(String text, final View.OnClickListener listener) {
+        this.nText = text;
+        this.nListener = listener;
+        return this;
+    }
+
+
+    /**
+     * Sets whether this dialog is canceled when touched outside the window's
+     * bounds OR pressed the back key. If setting to true, the dialog is
+     * set to be cancelable if not
+     * already set.
+     *
+     * @param cancel Whether the dialog should be canceled when touched outside
+     * the window OR pressed the back key.
+     */
+    public MaterialDialog setCanceledOnTouchOutside(boolean cancel) {
+        this.mCancel = cancel;
+        if (mBuilder != null) {
+            mBuilder.setCanceledOnTouchOutside(mCancel);
+        }
+        return this;
+    }
+
+
+    public MaterialDialog setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
+        this.mOnDismissListener = onDismissListener;
+        return this;
+    }
+
+
+    private class Builder {
+
+        private TextView mTitleView;
+        private ViewGroup mMessageContentRoot;
+        private TextView mMessageView;
+        private Window mAlertDialogWindow;
+        private LinearLayout mButtonLayout;
+
+
+        private Builder() {
+            mAlertDialog = new AlertDialog.Builder(mContext).create();
+            mAlertDialog.show();
+
+            mAlertDialog.getWindow()
+                        .clearFlags(
+                                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+                                        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+            mAlertDialog.getWindow()
+                        .setSoftInputMode(
+                                WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE);
+
+            mAlertDialogWindow = mAlertDialog.getWindow();
+            View contentView = LayoutInflater.from(mContext)
+                                             .inflate(
+                                                     R.layout.layout_material_dialog,
+                                                     null);
+            contentView.setFocusable(true);
+            contentView.setFocusableInTouchMode(true);
+
+            mAlertDialogWindow.setBackgroundDrawableResource(
+                    R.drawable.material_dialog_window);
+
+            mAlertDialogWindow.setContentView(contentView);
+
+            mTitleView = (TextView) mAlertDialogWindow.findViewById(R.id.title);
+            mMessageView = (TextView) mAlertDialogWindow.findViewById(
+                    R.id.message);
+            mButtonLayout = (LinearLayout) mAlertDialogWindow.findViewById(
+                    R.id.buttonLayout);
+            mPositiveButton = (Button) mButtonLayout.findViewById(R.id.btn_p);
+            mNegativeButton = (Button) mButtonLayout.findViewById(R.id.btn_n);
+            mMessageContentRoot = (ViewGroup) mAlertDialogWindow.findViewById(
+                    R.id.message_content_root);
+            if (mView != null) {
+                LinearLayout linearLayout
+                        = (LinearLayout) mAlertDialogWindow.findViewById(
+                        R.id.contentView);
+                linearLayout.removeAllViews();
+                linearLayout.addView(mView);
+            }
+            if (mTitleResId != 0) {
+                setTitle(mTitleResId);
+            }
+            if (mTitle != null) {
+                setTitle(mTitle);
+            }
+            if (mTitle == null && mTitleResId == 0) {
+                mTitleView.setVisibility(View.GONE);
+            }
+            if (mMessageResId != 0) {
+                setMessage(mMessageResId);
+            }
+            if (mMessage != null) {
+                setMessage(mMessage);
+            }
+            if (pId != -1) {
+                mPositiveButton.setVisibility(View.VISIBLE);
+                mPositiveButton.setText(pId);
+                mPositiveButton.setOnClickListener(pListener);
+                if (isLollipop()) {
+                    mPositiveButton.setElevation(0);
+                }
+            }
+            if (nId != -1) {
+                mNegativeButton.setVisibility(View.VISIBLE);
+                mNegativeButton.setText(nId);
+                mNegativeButton.setOnClickListener(nListener);
+                if (isLollipop()) {
+                    mNegativeButton.setElevation(0);
+                }
+            }
+            if (!isNullOrEmpty(pText)) {
+                mPositiveButton.setVisibility(View.VISIBLE);
+                mPositiveButton.setText(pText);
+                mPositiveButton.setOnClickListener(pListener);
+                if (isLollipop()) {
+                    mPositiveButton.setElevation(0);
+                }
+            }
+
+            if (!isNullOrEmpty(nText)) {
+                mNegativeButton.setVisibility(View.VISIBLE);
+                mNegativeButton.setText(nText);
+                mNegativeButton.setOnClickListener(nListener);
+                if (isLollipop()) {
+                    mNegativeButton.setElevation(0);
+                }
+            }
+            if (isNullOrEmpty(pText) && pId == -1) {
+                mPositiveButton.setVisibility(View.GONE);
+            }
+            if (isNullOrEmpty(nText) && nId == -1) {
+                mNegativeButton.setVisibility(View.GONE);
+            }
+            if (mBackgroundResId != -1) {
+                LinearLayout linearLayout
+                        = (LinearLayout) mAlertDialogWindow.findViewById(
+                        R.id.material_background);
+                linearLayout.setBackgroundResource(mBackgroundResId);
+            }
+            if (mBackgroundDrawable != null) {
+                LinearLayout linearLayout
+                        = (LinearLayout) mAlertDialogWindow.findViewById(
+                        R.id.material_background);
+                linearLayout.setBackground(mBackgroundDrawable);
+            }
+
+            if (mMessageContentView != null) {
+                this.setContentView(mMessageContentView);
+            } else if (mMessageContentViewResId != 0) {
+                this.setContentView(mMessageContentViewResId);
+            }
+            mAlertDialog.setCanceledOnTouchOutside(mCancel);
+            mAlertDialog.setCancelable(mCancel);
+            if (mOnDismissListener != null) {
+                mAlertDialog.setOnDismissListener(mOnDismissListener);
+            }
+        }
+
+
+        public void setTitle(int resId) {
+            mTitleView.setText(resId);
+        }
+
+
+        public void setTitle(CharSequence title) {
+            mTitleView.setText(title);
+        }
+
+
+        public void setMessage(int resId) {
+            if (mMessageView != null) {
+                mMessageView.setText(resId);
+            }
+        }
+
+
+        public void setMessage(CharSequence message) {
+            if (mMessageView != null) {
+                mMessageView.setText(message);
+            }
+        }
+
+
+        /**
+         * set positive button
+         *
+         * @param text the name of button
+         */
+        public void setPositiveButton(String text, final View.OnClickListener listener) {
+            Button button = new Button(mContext);
+            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+                    LinearLayout.LayoutParams.WRAP_CONTENT,
+                    LinearLayout.LayoutParams.WRAP_CONTENT);
+            button.setLayoutParams(params);
+            button.setBackgroundResource(R.drawable.dialog_material_card);
+            button.setTextColor(Color.argb(255, 35, 159, 242));
+            button.setText(text);
+            button.setGravity(Gravity.CENTER);
+            button.setTextSize(14);
+            button.setPadding(dip2px(12), 0, dip2px(32), dip2px(BUTTON_BOTTOM));
+            button.setOnClickListener(listener);
+            mButtonLayout.addView(button);
+        }
+
+
+        /**
+         * set negative button
+         *
+         * @param text the name of button
+         */
+        public void setNegativeButton(String text, final View.OnClickListener listener) {
+            Button button = new Button(mContext);
+            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+                    LinearLayout.LayoutParams.WRAP_CONTENT,
+                    LinearLayout.LayoutParams.WRAP_CONTENT);
+            button.setLayoutParams(params);
+            button.setBackgroundResource(R.drawable.dialog_material_card);
+            button.setText(text);
+            button.setTextColor(Color.argb(222, 0, 0, 0));
+            button.setTextSize(14);
+            button.setGravity(Gravity.CENTER);
+            button.setPadding(0, 0, 0, dip2px(8));
+            button.setOnClickListener(listener);
+            if (mButtonLayout.getChildCount() > 0) {
+                params.setMargins(20, 0, 10, dip2px(BUTTON_BOTTOM));
+                button.setLayoutParams(params);
+                mButtonLayout.addView(button, 1);
+            } else {
+                button.setLayoutParams(params);
+                mButtonLayout.addView(button);
+            }
+        }
+
+
+        public void setView(View view) {
+            LinearLayout l = (LinearLayout) mAlertDialogWindow.findViewById(
+                    R.id.contentView);
+            l.removeAllViews();
+            ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+            view.setLayoutParams(layoutParams);
+
+            view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+                @Override
+                public void onFocusChange(View v, boolean hasFocus) {
+                    mAlertDialogWindow.setSoftInputMode(
+                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+                    // show imm
+                    InputMethodManager imm
+                            = (InputMethodManager) mContext.getSystemService(
+                            Context.INPUT_METHOD_SERVICE);
+                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
+                            InputMethodManager.HIDE_IMPLICIT_ONLY);
+                }
+            });
+
+            l.addView(view);
+
+            if (view instanceof ViewGroup) {
+
+                ViewGroup viewGroup = (ViewGroup) view;
+
+                for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                    if (viewGroup.getChildAt(i) instanceof EditText) {
+                        EditText editText = (EditText) viewGroup.getChildAt(i);
+                        editText.setFocusable(true);
+                        editText.requestFocus();
+                        editText.setFocusableInTouchMode(true);
+                    }
+                }
+                for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                    if (viewGroup.getChildAt(
+                            i) instanceof AutoCompleteTextView) {
+                        AutoCompleteTextView autoCompleteTextView
+                                = (AutoCompleteTextView) viewGroup.getChildAt(
+                                i);
+                        autoCompleteTextView.setFocusable(true);
+                        autoCompleteTextView.requestFocus();
+                        autoCompleteTextView.setFocusableInTouchMode(true);
+                    }
+                }
+            }
+        }
+
+
+        public void setContentView(View contentView) {
+            ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT);
+            contentView.setLayoutParams(layoutParams);
+            if (contentView instanceof ListView) {
+                setListViewHeightBasedOnChildren((ListView) contentView);
+            }
+            LinearLayout linearLayout
+                    = (LinearLayout) mAlertDialogWindow.findViewById(
+                    R.id.message_content_view);
+            if (linearLayout != null) {
+                linearLayout.removeAllViews();
+                linearLayout.addView(contentView);
+            }
+            for (int i = 0;
+                 i < (linearLayout != null ? linearLayout.getChildCount() : 0);
+                 i++) {
+                if (linearLayout.getChildAt(
+                        i) instanceof AutoCompleteTextView) {
+                    AutoCompleteTextView autoCompleteTextView
+                            = (AutoCompleteTextView) linearLayout.getChildAt(i);
+                    autoCompleteTextView.setFocusable(true);
+                    autoCompleteTextView.requestFocus();
+                    autoCompleteTextView.setFocusableInTouchMode(true);
+                }
+            }
+        }
+
+
+        /**
+         * Set a custom view resource to be the contents of the dialog. The
+         * resource will be inflated into a ScrollView.
+         *
+         * @param layoutResId resource ID to be inflated
+         */
+        public void setContentView(int layoutResId) {
+            mMessageContentRoot.removeAllViews();
+            // Not setting this to the other content view because user has defined their own
+            // layout params, and we don't want to overwrite those.
+            LayoutInflater.from(mMessageContentRoot.getContext())
+                          .inflate(layoutResId, mMessageContentRoot);
+        }
+
+
+        public void setBackground(Drawable drawable) {
+            LinearLayout linearLayout
+                    = (LinearLayout) mAlertDialogWindow.findViewById(
+                    R.id.material_background);
+            linearLayout.setBackground(drawable);
+        }
+
+
+        public void setBackgroundResource(int resId) {
+            LinearLayout linearLayout
+                    = (LinearLayout) mAlertDialogWindow.findViewById(
+                    R.id.material_background);
+            linearLayout.setBackgroundResource(resId);
+        }
+
+
+        public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
+            mAlertDialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
+            mAlertDialog.setCancelable(canceledOnTouchOutside);
+        }
+    }
+
+
+    private boolean isNullOrEmpty(String nText) {
+        return nText == null || nText.isEmpty();
+    }
+
+
+    private void setListViewHeightBasedOnChildren(ListView listView) {
+        ListAdapter listAdapter = listView.getAdapter();
+        if (listAdapter == null) {
+            // pre-condition
+            return;
+        }
+
+        int totalHeight = 0;
+        for (int i = 0; i < listAdapter.getCount(); i++) {
+            View listItem = listAdapter.getView(i, null, listView);
+            listItem.measure(0, 0);
+            totalHeight += listItem.getMeasuredHeight();
+        }
+
+        ViewGroup.LayoutParams params = listView.getLayoutParams();
+        params.height = totalHeight +
+                (listView.getDividerHeight() * (listAdapter.getCount() - 1));
+        listView.setLayoutParams(params);
+    }
+}
+

+ 470 - 0
library/src/main/java/com/common/library/view/progressbar/CircularProgress.java

@@ -0,0 +1,470 @@
+package com.common.library.view.progressbar;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.util.Property;
+import android.view.View;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.widget.ProgressBar;
+
+import com.common.library.R;
+
+
+public class CircularProgress extends ProgressBar {
+    private static final int MAX_LEVEL = 10000;
+    private static final int ANIMATION_RESOLUTION = 200;
+    private static final int SMALL_SIZE = 0;
+    private static final int NORMAL_SIZE = 1;
+    private static final int LARGE_SIZE = 2;
+
+    private int mMinWidth;
+    private int mMaxWidth;
+    private int mMinHeight;
+    private int mMaxHeight;
+
+    private int mColor;
+    private int mSize;
+    private boolean mIndeterminate;
+    private int mBorderWidth;
+    private RectF arcRectF;
+    private int mMax;
+    private int mProgress;
+    private int mDuration;
+    private boolean mHasAnimation;
+    private boolean mAttached;
+    private long mLastDrawTime;
+
+    private IndeterminateProgressDrawable mIndeterminateProgressDrawable;
+    private DeterminateProgressDrawable mDeterminateProgressDrawable;
+
+    public CircularProgress(Context context) {
+        this(context, null);
+    }
+
+    public CircularProgress(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CircularProgress(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularProgress);
+        mColor = attributes.getColor(R.styleable.CircularProgress_circular_progress_color, getResources().getColor(R.color.circular_progress_color));
+        mSize = attributes.getInt(R.styleable.CircularProgress_circular_progress_size, NORMAL_SIZE);
+        mIndeterminate = attributes.getBoolean(R.styleable.CircularProgress_circular_progress_indeterminate,
+                getResources().getBoolean(R.bool.circular_progress_indeterminate));
+        mBorderWidth = attributes.getDimensionPixelSize(R.styleable.CircularProgress_circular_progress_border_width,
+                getResources().getDimensionPixelSize(R.dimen.circular_progress_border_width));
+        mDuration = attributes.getInteger(R.styleable.CircularProgress_circular_progress_duration, ANIMATION_RESOLUTION);
+        mMax = attributes.getInteger(R.styleable.CircularProgress_circular_progress_max,
+                getResources().getInteger(R.integer.circular_progress_max));
+        attributes.recycle();
+
+        if (mIndeterminate) {
+            mColor = getResources().getColor(R.color.circular_progress_color_day);
+            mIndeterminateProgressDrawable = new IndeterminateProgressDrawable(mColor, mBorderWidth);
+            mIndeterminateProgressDrawable.setCallback(this);
+        } else {
+            mDeterminateProgressDrawable = new DeterminateProgressDrawable(mColor, mBorderWidth, 0);
+            mDeterminateProgressDrawable.setCallback(this);
+        }
+    }
+
+    public void setColor(int color) {
+        mColor = color;
+        invalidate();
+    }
+
+    public void setIndeterminate(boolean indeterminate) {
+        mIndeterminate = indeterminate;
+        invalidate();
+    }
+
+    public void startAnimation() {
+        if (getVisibility() != VISIBLE) {
+            return;
+        }
+        mIndeterminateProgressDrawable.start();
+    }
+
+    public void stopAnimation() {
+        mIndeterminateProgressDrawable.stop();
+    }
+
+    public void setProgress(int progress) {
+        if (mIndeterminate || progress > mMax || progress < 0) {
+            return;
+        }
+        mProgress = progress;
+        invalidate();
+    }
+
+    public synchronized int getProgress() {
+        return mIndeterminate ? 0 : mProgress;
+    }
+
+    public synchronized int getMax() {
+        return mMax;
+    }
+
+    public synchronized void setMax(int max) {
+        if (max < 0) {
+            max = 0;
+        }
+        if (max != mMax) {
+            mMax = max;
+            postInvalidate();
+
+            if (mProgress > max) {
+                mProgress = max;
+            }
+        }
+    }
+
+    private RectF getArcRectF() {
+        if (arcRectF == null) {
+            int size = Math.min(getWidth() - mBorderWidth * 2, getHeight() - mBorderWidth * 2);
+            arcRectF = new RectF();
+            arcRectF.left = (getWidth() - size) / 2;
+            arcRectF.top = (getHeight() - size) / 2;
+            arcRectF.right = getWidth() - (getWidth() - size) / 2;
+            arcRectF.bottom = getHeight() - (getHeight() - size) / 2;
+        }
+        return arcRectF;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
+        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
+        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {
+            int size = 0;
+            switch (mSize) {
+                case SMALL_SIZE:
+                    size = getResources().getDimensionPixelSize(R.dimen.circular_progress_small_size);
+                    break;
+                case NORMAL_SIZE:
+                    size = getResources().getDimensionPixelSize(R.dimen.circular_progress_normal_size);
+                    break;
+                case LARGE_SIZE:
+                    size = getResources().getDimensionPixelSize(R.dimen.circular_progress_large_size);
+                    break;
+            }
+            widthMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
+            heightMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
+        }
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    @Override
+    public void draw(@NonNull Canvas canvas) {
+        super.draw(canvas);
+        if (mIndeterminate) {
+            mIndeterminateProgressDrawable.draw(canvas);
+        } else {
+            mDeterminateProgressDrawable.draw(canvas);
+        }
+    }
+
+    @Override
+    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
+        super.onVisibilityChanged(changedView, visibility);
+        if (mIndeterminate) {
+            if (visibility == VISIBLE) {
+                mIndeterminateProgressDrawable.start();
+            } else {
+                mIndeterminateProgressDrawable.stop();
+            }
+        }
+    }
+
+    @Override
+    protected boolean verifyDrawable(Drawable drawable) {
+        if (mIndeterminate) {
+            return drawable == mIndeterminateProgressDrawable || super.verifyDrawable(drawable);
+        } else {
+            return drawable == mDeterminateProgressDrawable || super.verifyDrawable(drawable);
+        }
+    }
+
+    @Override
+    protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+        super.onSizeChanged(width, height, oldWidth, oldHeight);
+        if (mIndeterminate) {
+            mIndeterminateProgressDrawable.setBounds(0, 0, width, height);
+        } else {
+            mDeterminateProgressDrawable.setBounds(0, 0, width, height);
+        }
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        if (mIndeterminate) {
+            startAnimation();
+        }
+        mAttached = true;
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        if (mIndeterminate) {
+            stopAnimation();
+        }
+        super.onDetachedFromWindow();
+        mAttached = false;
+    }
+
+    private class DeterminateProgressDrawable extends Drawable {
+
+        private Paint mPaint;
+        private float mBorderWidth;
+        private float mEndAngle;
+        private final RectF mDrawableBounds = new RectF();
+
+        public DeterminateProgressDrawable(int color, int borderWidth, int angle) {
+            mPaint = new Paint();
+            mPaint.setAntiAlias(true);
+            mPaint.setStyle(Paint.Style.STROKE);
+            mPaint.setStrokeWidth(borderWidth);
+            mPaint.setColor(color);
+            mBorderWidth = borderWidth;
+            mEndAngle = angle;
+        }
+
+        public void setAngle(float angle) {
+            mEndAngle = angle;
+        }
+
+        @Override
+        public void draw(Canvas canvas) {
+            canvas.drawArc(mDrawableBounds, -90.f, 20.f, false, mPaint);
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+            mPaint.setAlpha(alpha);
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter colorFilter) {
+            mPaint.setColorFilter(colorFilter);
+        }
+
+        @Override
+        public int getOpacity() {
+            return PixelFormat.TRANSPARENT;
+        }
+
+        @Override
+        protected void onBoundsChange(Rect bounds) {
+            super.onBoundsChange(bounds);
+            mDrawableBounds.left = bounds.left + mBorderWidth / 2f + .5f;
+            mDrawableBounds.right = bounds.right - mBorderWidth / 2f - .5f;
+            mDrawableBounds.top = bounds.top + mBorderWidth / 2f + .5f;
+            mDrawableBounds.bottom = bounds.bottom - mBorderWidth / 2f - .5f;
+        }
+    }
+
+    /**
+     * https://gist.github.com/castorflex/4e46a9dc2c3a4245a28e
+     */
+    private class IndeterminateProgressDrawable extends Drawable implements Animatable {
+
+        private final Interpolator ANGLE_INTERPOLATOR = new LinearInterpolator();
+        private final Interpolator SWEEP_INTERPOLATOR = new DecelerateInterpolator();
+        private static final int ANGLE_ANIMATOR_DURATION = 2000;
+        private static final int SWEEP_ANIMATOR_DURATION = 600;
+        private static final int MIN_SWEEP_ANGLE = 30;
+        private final RectF mDrawableBounds = new RectF();
+
+        private ObjectAnimator mObjectAnimatorSweep;
+        private ObjectAnimator mObjectAnimatorAngle;
+        private boolean mModeAppearing;
+        private Paint mPaint;
+        private float mCurrentGlobalAngleOffset;
+        private float mCurrentGlobalAngle;
+        private float mCurrentSweepAngle;
+        private float mBorderWidth;
+        private boolean mRunning;
+
+        public IndeterminateProgressDrawable(int color, float borderWidth) {
+            mBorderWidth = borderWidth;
+
+            mPaint = new Paint();
+            mPaint.setAntiAlias(true);
+            mPaint.setStyle(Paint.Style.STROKE);
+            mPaint.setStrokeWidth(borderWidth);
+            mPaint.setColor(color);
+
+            setupAnimations();
+        }
+
+        @Override
+        public void draw(Canvas canvas) {
+            float startAngle = mCurrentGlobalAngle - mCurrentGlobalAngleOffset;
+            float sweepAngle = mCurrentSweepAngle;
+            if (!mModeAppearing) {
+                startAngle = startAngle + sweepAngle;
+                sweepAngle = 360 - sweepAngle - MIN_SWEEP_ANGLE;
+            } else {
+                sweepAngle += MIN_SWEEP_ANGLE;
+            }
+            canvas.drawArc(mDrawableBounds, startAngle, sweepAngle, false, mPaint);
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+            mPaint.setAlpha(alpha);
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter cf) {
+            mPaint.setColorFilter(cf);
+        }
+
+        @Override
+        public int getOpacity() {
+            return PixelFormat.TRANSPARENT;
+        }
+
+        private void toggleAppearingMode() {
+            mModeAppearing = !mModeAppearing;
+            if (mModeAppearing) {
+                mCurrentGlobalAngleOffset = (mCurrentGlobalAngleOffset + MIN_SWEEP_ANGLE * 2) % 360;
+            }
+        }
+
+        @Override
+        protected void onBoundsChange(Rect bounds) {
+            super.onBoundsChange(bounds);
+            mDrawableBounds.left = bounds.left + mBorderWidth / 2f + .5f;
+            mDrawableBounds.right = bounds.right - mBorderWidth / 2f - .5f;
+            mDrawableBounds.top = bounds.top + mBorderWidth / 2f + .5f;
+            mDrawableBounds.bottom = bounds.bottom - mBorderWidth / 2f - .5f;
+        }
+
+        ///////////////////////////////////////// Animation /////////////////////////////////////////
+
+        private Property<IndeterminateProgressDrawable, Float> mAngleProperty
+                = new Property<IndeterminateProgressDrawable, Float>(Float.class, "angle") {
+            @Override
+            public Float get(IndeterminateProgressDrawable object) {
+                return object.getCurrentGlobalAngle();
+            }
+
+            @Override
+            public void set(IndeterminateProgressDrawable object, Float value) {
+                object.setCurrentGlobalAngle(value);
+            }
+        };
+
+        private Property<IndeterminateProgressDrawable, Float> mSweepProperty
+                = new Property<IndeterminateProgressDrawable, Float>(Float.class, "arc") {
+            @Override
+            public Float get(IndeterminateProgressDrawable object) {
+                return object.getCurrentSweepAngle();
+            }
+
+            @Override
+            public void set(IndeterminateProgressDrawable object, Float value) {
+                object.setCurrentSweepAngle(value);
+            }
+        };
+
+        private void setupAnimations() {
+            mObjectAnimatorAngle = ObjectAnimator.ofFloat(this, mAngleProperty, 360f);
+            mObjectAnimatorAngle.setInterpolator(ANGLE_INTERPOLATOR);
+            mObjectAnimatorAngle.setDuration(ANGLE_ANIMATOR_DURATION);
+            mObjectAnimatorAngle.setRepeatMode(ValueAnimator.RESTART);
+            mObjectAnimatorAngle.setRepeatCount(ValueAnimator.INFINITE);
+
+            mObjectAnimatorSweep = ObjectAnimator.ofFloat(this, mSweepProperty, 360f - MIN_SWEEP_ANGLE * 2);
+            mObjectAnimatorSweep.setInterpolator(SWEEP_INTERPOLATOR);
+            mObjectAnimatorSweep.setDuration(SWEEP_ANIMATOR_DURATION);
+            mObjectAnimatorSweep.setRepeatMode(ValueAnimator.RESTART);
+            mObjectAnimatorSweep.setRepeatCount(ValueAnimator.INFINITE);
+            mObjectAnimatorSweep.addListener(new Animator.AnimatorListener() {
+                @Override
+                public void onAnimationStart(Animator animation) {
+
+                }
+
+                @Override
+                public void onAnimationEnd(Animator animation) {
+
+                }
+
+                @Override
+                public void onAnimationCancel(Animator animation) {
+
+                }
+
+                @Override
+                public void onAnimationRepeat(Animator animation) {
+                    toggleAppearingMode();
+                }
+            });
+        }
+
+        @Override
+        public void start() {
+            if (isRunning()) {
+                return;
+            }
+            mRunning = true;
+            mObjectAnimatorAngle.start();
+            mObjectAnimatorSweep.start();
+            invalidateSelf();
+        }
+
+        @Override
+        public void stop() {
+            if (!isRunning()) {
+                return;
+            }
+            mRunning = false;
+            mObjectAnimatorAngle.cancel();
+            mObjectAnimatorSweep.cancel();
+            invalidateSelf();
+        }
+
+        @Override
+        public boolean isRunning() {
+            return mRunning;
+        }
+
+        public void setCurrentGlobalAngle(float currentGlobalAngle) {
+            mCurrentGlobalAngle = currentGlobalAngle;
+            invalidateSelf();
+        }
+
+        public float getCurrentGlobalAngle() {
+            return mCurrentGlobalAngle;
+        }
+
+        public void setCurrentSweepAngle(float currentSweepAngle) {
+            mCurrentSweepAngle = currentSweepAngle;
+            invalidateSelf();
+        }
+
+        public float getCurrentSweepAngle() {
+            return mCurrentSweepAngle;
+        }
+
+    }
+}

+ 232 - 0
library/src/main/java/com/common/library/view/progressbar/CircularProgressDrawable.java

@@ -0,0 +1,232 @@
+package com.common.library.view.progressbar;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.util.Property;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+
+public class CircularProgressDrawable extends Drawable implements Animatable {
+    
+    /**
+     * 绘制圆弧起始位置角度的动画,这样该圆弧是打圈转的动画
+     */
+    private static final Interpolator ANGLE_INTERPOLATOR = new LinearInterpolator();
+    /**
+     * 绘制圆弧臂长的动画,该动画受 mModeAppearing 控制,
+     * 当 mModeAppearing 为 false 的时候,圆弧的起始点在增加,圆弧的终止点不变,弧长在逐渐减少;
+     * 当 mModeAppearing 为 true 的时候, 圆弧的起始点不变,圆弧的终止点变大,弧长在逐渐增加
+     */
+    private static final Interpolator SWEEP_INTERPOLATOR = new DecelerateInterpolator();
+    /**
+     * 圆弧起始位置动画的间隔,也就是多少毫秒圆弧转一圈,可以把该值扩大10倍来查看动画的慢动作
+     */
+    private static final int ANGLE_ANIMATOR_DURATION = 2000;
+    /**
+     * 圆弧臂长的动画间隔,也就是臂长从最小到最大值的变化时间,也可以把该值扩大10倍来查看动画的慢动作
+     */
+    private static final int SWEEP_ANIMATOR_DURATION = 600;
+    /**
+     * 圆弧的最下臂长是多少度
+     */
+    private static final int MIN_SWEEP_ANGLE = 30;
+    private final RectF fBounds = new RectF();
+
+    /**
+     * 起始位置的动画对象
+     */
+    private ObjectAnimator mObjectAnimatorSweep;
+    /**
+     * 臂长的动画对象
+     */
+    private ObjectAnimator mObjectAnimatorAngle;
+    /**
+     * 控制臂长是逐渐增加还是逐渐减少
+     */
+    private boolean mModeAppearing;
+    private Paint mPaint;
+    /**
+     * 每次臂长增加 、减少 转换的时候, 圆弧起始位置的偏移量会增加 2 倍的最小臂长
+     */
+    private float mCurrentGlobalAngleOffset;
+    private float mCurrentGlobalAngle;
+    private float mCurrentSweepAngle;
+    private float mBorderWidth;
+    private boolean mRunning;
+
+    public CircularProgressDrawable(int color, float borderWidth) {
+        mBorderWidth = borderWidth;
+
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setStyle(Paint.Style.STROKE);
+        mPaint.setStrokeWidth(borderWidth);
+        mPaint.setColor(color);
+
+        setupAnimations();
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        float startAngle = mCurrentGlobalAngle - mCurrentGlobalAngleOffset;
+        float sweepAngle = mCurrentSweepAngle;
+        if (mModeAppearing) {
+            sweepAngle += MIN_SWEEP_ANGLE;
+        } else {
+            startAngle = startAngle + sweepAngle;
+            sweepAngle = 360 - sweepAngle - MIN_SWEEP_ANGLE;
+        }
+        canvas.drawArc(fBounds, startAngle, sweepAngle, false, mPaint);
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+        mPaint.setAlpha(alpha);
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter cf) {
+        mPaint.setColorFilter(cf);
+    }
+
+    @Override
+    public int getOpacity() {
+        return PixelFormat.TRANSPARENT;
+    }
+
+    private void toggleAppearingMode() {
+        mModeAppearing = !mModeAppearing;
+        if (mModeAppearing) {
+            mCurrentGlobalAngleOffset = (mCurrentGlobalAngleOffset + MIN_SWEEP_ANGLE * 2) % 360;
+        }
+    }
+
+    @Override
+    protected void onBoundsChange(Rect bounds) {
+        super.onBoundsChange(bounds);
+        fBounds.left = bounds.left + mBorderWidth / 2f + .5f;
+        fBounds.right = bounds.right - mBorderWidth / 2f - .5f;
+        fBounds.top = bounds.top + mBorderWidth / 2f + .5f;
+        fBounds.bottom = bounds.bottom - mBorderWidth / 2f - .5f;
+    }
+
+    // ////////////////////////////////////////////////////////////////////////////
+    // ////////////// Animation
+
+    private Property<CircularProgressDrawable, Float> mAngleProperty = new Property<CircularProgressDrawable, Float>(Float.class, "angle") {
+        @Override
+        public Float get(CircularProgressDrawable object) {
+            return object.getCurrentGlobalAngle();
+        }
+
+        @Override
+        public void set(CircularProgressDrawable object, Float value) {
+            object.setCurrentGlobalAngle(value);
+        }
+    };
+
+    private Property<CircularProgressDrawable, Float> mSweepProperty = new Property<CircularProgressDrawable, Float>(Float.class, "arc") {
+        @Override
+        public Float get(CircularProgressDrawable object) {
+            return object.getCurrentSweepAngle();
+        }
+
+        @Override
+        public void set(CircularProgressDrawable object, Float value) {
+            object.setCurrentSweepAngle(value);
+        }
+    };
+
+    private void setupAnimations() {
+        mObjectAnimatorAngle = ObjectAnimator.ofFloat(this, mAngleProperty, 360f);
+        mObjectAnimatorAngle.setInterpolator(ANGLE_INTERPOLATOR);
+        mObjectAnimatorAngle.setDuration(ANGLE_ANIMATOR_DURATION);
+        mObjectAnimatorAngle.setRepeatMode(ValueAnimator.RESTART);
+        mObjectAnimatorAngle.setRepeatCount(ValueAnimator.INFINITE);
+
+        mObjectAnimatorSweep = ObjectAnimator.ofFloat(this, mSweepProperty, 360f - MIN_SWEEP_ANGLE * 2);
+        mObjectAnimatorSweep.setInterpolator(SWEEP_INTERPOLATOR);
+        mObjectAnimatorSweep.setDuration(SWEEP_ANIMATOR_DURATION);
+        mObjectAnimatorSweep.setRepeatMode(ValueAnimator.RESTART);
+        mObjectAnimatorSweep.setRepeatCount(ValueAnimator.INFINITE);
+        mObjectAnimatorSweep.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+                toggleAppearingMode();
+            }
+        });
+    }
+
+    @Override
+    public void start() {
+        if (isRunning()) {
+            return;
+        }
+        mRunning = true;
+        // 为了方便测试,可以注释掉下面两个动画中的一个,来
+        //分别查看每个独立的动画是如何运动的
+        mObjectAnimatorAngle.start();
+        mObjectAnimatorSweep.start();
+        invalidateSelf();
+    }
+
+    @Override
+    public void stop() {
+        if (!isRunning()) {
+            return;
+        }
+        mRunning = false;
+        mObjectAnimatorAngle.cancel();
+        mObjectAnimatorSweep.cancel();
+        invalidateSelf();
+    }
+
+    @Override
+    public boolean isRunning() {
+        return mRunning;
+    }
+
+    public void setCurrentGlobalAngle(float currentGlobalAngle) {
+        mCurrentGlobalAngle = currentGlobalAngle;
+        invalidateSelf();
+    }
+
+    public float getCurrentGlobalAngle() {
+        return mCurrentGlobalAngle;
+    }
+
+    public void setCurrentSweepAngle(float currentSweepAngle) {
+        mCurrentSweepAngle = currentSweepAngle;
+        invalidateSelf();
+    }
+
+    public float getCurrentSweepAngle() {
+        return mCurrentSweepAngle;
+    }
+
+}

二进制
library/src/main/res/drawable-hdpi/shadow_bottom.png


二进制
library/src/main/res/drawable-hdpi/shadow_left.png


二进制
library/src/main/res/drawable-hdpi/shadow_right.png


二进制
library/src/main/res/drawable-mdpi/refresh_default_ptr_rotate.png


二进制
library/src/main/res/drawable-xhdpi/refresh_default_ptr_rotate.png


+ 6 - 0
library/src/main/res/drawable/dialog_bg_button_normal.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/dialog_card_background"/>
+</shape>

+ 7 - 0
library/src/main/res/drawable/dialog_bg_button_pressed.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#fff0f0f0"/>
+    <corners android:radius="2dp"/>
+</shape>

+ 12 - 0
library/src/main/res/drawable/dialog_button.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:exitFadeDuration="@android:integer/config_shortAnimTime">
+
+    <item android:state_pressed="true"
+        android:drawable="@drawable/dialog_bg_button_pressed"/>
+    <item android:state_focused="true"
+        android:drawable="@drawable/dialog_bg_button_pressed"/>
+
+    <item android:drawable="@drawable/dialog_bg_button_normal"/>
+
+</selector>

+ 19 - 0
library/src/main/res/drawable/dialog_material_card.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item>
+        <shape android:shape="rectangle">
+            <solid android:color="@color/dialog_card_shadow"/>
+            <corners android:radius="2dp"/>
+        </shape>
+    </item>
+
+    <item android:bottom="6dp">
+        <shape android:shape="rectangle">
+            <solid android:color="@color/dialog_card_background"/>
+            <corners android:radius="3dp"/>
+        </shape>
+    </item>
+
+</layer-list>

+ 7 - 0
library/src/main/res/drawable/material_dialog_window.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/dialog_window_background"/>
+    <corners android:radius="2dp"/>
+</shape>

+ 94 - 0
library/src/main/res/layout/layout_material_dialog.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:minWidth="280dp"
+    android:padding="32dp"
+    android:layout_gravity="center"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/material_background"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/dialog_material_card"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/contentView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/title"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="23dp"
+                android:layout_marginTop="23dp"
+                android:layout_marginRight="24dp"
+                android:textColor="@color/dialog_black_de"
+                android:textSize="23sp"
+                tools:text="Material title"/>
+
+            <ScrollView
+                android:layout_weight="1"
+                android:id="@+id/message_content_root"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                tools:layout_height="700dp">
+
+                <LinearLayout
+                    android:id="@+id/message_content_view"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingLeft="24dp"
+                    android:paddingRight="23dp">
+
+                    <TextView
+                        android:id="@+id/message"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:lineSpacingMultiplier="1.3"
+                        android:textColor="#8a000000"
+                        android:textSize="16sp"
+                        tools:text="message"/>
+                </LinearLayout>
+
+            </ScrollView>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/buttonLayout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="8dp"
+            android:paddingBottom="12dp"
+            android:layout_marginBottom="8dp"
+            android:layout_gravity="right"
+            android:gravity="center_vertical">
+
+            <Button
+                android:id="@+id/btn_n"
+                style="@style/Dialog_ActionButton"
+                android:textColor="@color/dialog_black_de"
+                android:stateListAnimator="@null"
+                tools:text="CANCEL"/>
+
+            <Button
+                android:id="@+id/btn_p"
+                style="@style/Dialog_ActionButton"
+                android:layout_marginLeft="2dp"
+                android:layout_marginRight="12dp"
+                android:stateListAnimator="@null"
+                android:textColor="#ff239ff2"
+                tools:text="OK"/>
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 108 - 0
library/src/main/res/values/attrs.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <declare-styleable name="CircularProgress">
+        <attr name="circular_progress_color" format="color"/>
+        <attr name="circular_progress_size" format="enum">
+            <enum name="Small" value="0"/>
+            <enum name="Normal" value="1"/>
+            <enum name="Large" value="2"/>
+        </attr>
+        <attr name="circular_progress_border_width" format="dimension"/>
+        <attr name="circular_progress_indeterminate" format="boolean"/>
+        <attr name="circular_progress_max" format="integer"/>
+        <attr name="circular_progress_duration" format="integer"/>
+    </declare-styleable>
+
+    <declare-styleable name="SwipeBackLayout">
+        <attr name="edge_size" format="dimension"/>
+        <attr name="edge_flag">
+            <enum name="left" value="0" />
+            <enum name="right" value="1" />
+            <enum name="bottom" value="2" />
+            <enum name="all" value="3" />
+        </attr>
+        <attr name="shadow_left" format="reference"/>
+        <attr name="shadow_right" format="reference"/>
+        <attr name="shadow_bottom" format="reference"/>
+    </declare-styleable>
+
+    <attr name="SwipeBackLayoutStyle" format="reference"/>
+
+    <declare-styleable name="PullToRefresh">
+
+        <!-- A drawable to use as the background of the Refreshable View -->
+        <attr name="ptrRefreshableViewBackground" format="reference|color" />
+
+        <!-- A drawable to use as the background of the Header and Footer Loading Views -->
+        <attr name="ptrHeaderBackground" format="reference|color" />
+
+        <!-- Text Color of the Header and Footer Loading Views -->
+        <attr name="ptrHeaderTextColor" format="reference|color" />
+
+        <!-- Text Color of the Header and Footer Loading Views Sub Header -->
+        <attr name="ptrHeaderSubTextColor" format="reference|color" />
+
+        <!-- Mode of Pull-to-Refresh that should be used -->
+        <attr name="ptrMode">
+            <flag name="disabled" value="0x0" />
+            <flag name="pullFromStart" value="0x1" />
+            <flag name="pullFromEnd" value="0x2" />
+            <flag name="both" value="0x3" />
+            <flag name="manualOnly" value="0x4" />
+
+            <!-- These last two are depreacted -->
+            <flag name="pullDownFromTop" value="0x1" />
+            <flag name="pullUpFromBottom" value="0x2" />
+        </attr>
+
+        <!-- Whether the Indicator overlay(s) should be used -->
+        <attr name="ptrShowIndicator" format="reference|boolean" />
+
+        <!-- Drawable to use as Loading Indicator. Changes both Header and Footer. -->
+        <attr name="ptrDrawable" format="reference" />
+
+        <!-- Drawable to use as Loading Indicator in the Header View. Overrides value set in ptrDrawable. -->
+        <attr name="ptrDrawableStart" format="reference" />
+
+        <!-- Drawable to use as Loading Indicator in the Footer View. Overrides value set in ptrDrawable. -->
+        <attr name="ptrDrawableEnd" format="reference" />
+
+        <!-- Whether Android's built-in Over Scroll should be utilised for Pull-to-Refresh. -->
+        <attr name="ptrOverScroll" format="reference|boolean" />
+
+        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views -->
+        <attr name="ptrHeaderTextAppearance" format="reference" />
+
+        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views Sub Header -->
+        <attr name="ptrSubHeaderTextAppearance" format="reference" />
+
+        <!-- Style of Animation should be used displayed when pulling. -->
+        <attr name="ptrAnimationStyle">
+            <flag name="rotate" value="0x0" />
+            <flag name="flip" value="0x1" />
+        </attr>
+
+        <!-- Whether the user can scroll while the View is Refreshing -->
+        <attr name="ptrScrollingWhileRefreshingEnabled" format="reference|boolean" />
+
+        <!--
+        	Whether PullToRefreshListView has it's extras enabled. This allows the user to be
+        	able to scroll while refreshing, and behaves better. It acheives this by adding
+        	Header and/or Footer Views to the ListView.
+        -->
+        <attr name="ptrListViewExtrasEnabled" format="reference|boolean" />
+
+        <!--
+        	Whether the Drawable should be continually rotated as you pull. This only
+        	takes effect when using the 'Rotate' Animation Style.
+        -->
+        <attr name="ptrRotateDrawableWhilePulling" format="reference|boolean" />
+
+        <!-- BELOW HERE ARE DEPRECEATED. DO NOT USE. -->
+        <attr name="ptrAdapterViewBackground" format="reference|color" />
+        <attr name="ptrDrawableTop" format="reference" />
+        <attr name="ptrDrawableBottom" format="reference" />
+    </declare-styleable>
+
+</resources>

+ 20 - 0
library/src/main/res/values/colors.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- CircularProgress Default -->
+    <color name="circular_progress_color">#F04848</color>
+    <bool name="circular_progress_indeterminate">true</bool>
+    <dimen name="circular_progress_border_width">4dp</dimen>
+    <dimen name="circular_progress_small_size">36dp</dimen>
+    <dimen name="circular_progress_normal_size">48dp</dimen>
+    <dimen name="circular_progress_large_size">60dp</dimen>
+    <integer name="circular_progress_max">100</integer>
+    <color name="circular_progress_color_day">#f04848</color>
+
+    <color name="dialog_card_background">#ffffff</color>
+    <color name="dialog_card_shadow">#10000000</color>
+    <color name="dialog_lite_blue">#ff359ff2</color>
+    <color name="dialog_window_background">#00000000</color>
+    <color name="dialog_black_de">#DE000000</color>
+
+</resources>

+ 165 - 0
library/src/main/res/values/dimens.xml

@@ -0,0 +1,165 @@
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+    <dimen name="actionbarheight">50dp</dimen>
+    <dimen name="mainrgheight">60dp</dimen>
+    <dimen name="mainrbheight">50dp</dimen>
+    <dimen name="default_btn_height">38dp</dimen>
+    <dimen name="newslist_icon_height">190dp</dimen>
+    <dimen name="hotspecial_icon_height">182dp</dimen>
+
+    <!-- dp单位   添加字段后马上更新提交,预防冲突-->
+    <dimen name="company_8sp">8sp</dimen>
+    <dimen name="company_1dp">1dp</dimen>
+    <dimen name="company_2dp">2dp</dimen>
+    <dimen name="company_3dp">3dp</dimen>
+    <dimen name="company_4dp">4dp</dimen>
+    <dimen name="company_5dp">5dp</dimen>
+    <dimen name="company_6dp">6dp</dimen>
+    <dimen name="company_7dp">7dp</dimen>
+    <dimen name="company_8dp">8dp</dimen>
+    <dimen name="company_9dp">9dp</dimen>
+    <dimen name="company_10dp">10dp</dimen>
+    <dimen name="company_11dp">11dp</dimen>
+    <dimen name="company_12dp">12dp</dimen>
+    <dimen name="company_13dp">13dp</dimen>
+    <dimen name="company_14dp">14dp</dimen>
+    <dimen name="company_15dp">15dp</dimen>
+    <dimen name="company_16dp">16dp</dimen>
+    <dimen name="company_17dp">17dp</dimen>
+    <dimen name="company_18dp">18dp</dimen>
+    <dimen name="company_19dp">19dp</dimen>
+    <dimen name="company_20dp">20dp</dimen>
+    <dimen name="company_21dp">21dp</dimen>
+    <dimen name="company_22dp">22dp</dimen>
+    <dimen name="company_23dp">23dp</dimen>
+    <dimen name="company_24dp">24dp</dimen>
+    <dimen name="company_25dp">25dp</dimen>
+    <dimen name="company_26dp">26dp</dimen>
+    <dimen name="company_27dp">27dp</dimen>
+    <dimen name="company_28dp">28dp</dimen>
+    <dimen name="company_29dp">29dp</dimen>
+    <dimen name="company_30dp">30dp</dimen>
+    <dimen name="company_31dp">31dp</dimen>
+    <dimen name="company_32dp">32dp</dimen>
+    <dimen name="company_33dp">33dp</dimen>
+    <dimen name="company_34dp">34dp</dimen>
+    <dimen name="company_35dp">35dp</dimen>
+    <dimen name="company_36dp">36dp</dimen>
+    <dimen name="company_37dp">37dp</dimen>
+    <dimen name="company_38dp">38dp</dimen>
+    <dimen name="company_39dp">39dp</dimen>
+    <dimen name="company_40dp">40dp</dimen>
+    <dimen name="company_41dp">41dp</dimen>
+    <dimen name="company_42dp">42dp</dimen>
+    <dimen name="company_43dp">43dp</dimen>
+    <dimen name="company_44dp">44dp</dimen>
+    <dimen name="company_45dp">45dp</dimen>
+    <dimen name="company_46dp">46dp</dimen>
+    <dimen name="company_47dp">47dp</dimen>
+    <dimen name="company_48dp">48dp</dimen>
+    <dimen name="company_49dp">49dp</dimen>
+    <dimen name="company_50dp">50dp</dimen>
+    <dimen name="company_51dp">51dp</dimen>
+    <dimen name="company_52dp">52dp</dimen>
+    <dimen name="company_53dp">53dp</dimen>
+    <dimen name="company_54dp">54dp</dimen>
+    <dimen name="company_55dp">55dp</dimen>
+    <dimen name="company_56dp">56dp</dimen>
+    <dimen name="company_57dp">57dp</dimen>
+    <dimen name="company_58dp">58dp</dimen>
+    <dimen name="company_59dp">59dp</dimen>
+    <dimen name="company_60dp">60dp</dimen>
+    <!--会员中心高度为50dp。不要改-->
+    <dimen name="company_65dp">50dp</dimen>
+    <dimen name="company_66dp">66dp</dimen>
+    <dimen name="company_70dp">70dp</dimen>
+    <dimen name="company_72dp">72dp</dimen>
+    <dimen name="company_75dp">75dp</dimen>
+    <dimen name="company_80dp">80dp</dimen>
+    <dimen name="company_81dp">81dp</dimen>
+    <dimen name="company_82dp">82dp</dimen>
+    <dimen name="company_83dp">83dp</dimen>
+    <dimen name="company_84dp">84dp</dimen>
+    <dimen name="company_85dp">85dp</dimen>
+    <dimen name="company_90dp">90dp</dimen>
+    <dimen name="company_91dp">91dp</dimen>
+    <dimen name="company_92dp">92dp</dimen>
+    <dimen name="company_93dp">93dp</dimen>
+    <dimen name="company_94dp">94dp</dimen>
+    <dimen name="company_95dp">95dp</dimen>
+    <dimen name="company_100dp">100dp</dimen>
+    <dimen name="company_105dp">105dp</dimen>
+    <dimen name="company_110dp">110dp</dimen>
+    <dimen name="company_115dp">115dp</dimen>
+    <dimen name="company_120dp">120dp</dimen>
+    <dimen name="company_125dp">125dp</dimen>
+    <dimen name="company_126dp">126dp</dimen>
+    <dimen name="company_127dp">127dp</dimen>
+    <dimen name="company_128dp">128dp</dimen>
+    <dimen name="company_129dp">129dp</dimen>
+    <dimen name="company_130dp">130dp</dimen>
+    <dimen name="company_131dp">131dp</dimen>
+    <dimen name="company_132dp">132dp</dimen>
+    <dimen name="company_133dp">133dp</dimen>
+    <dimen name="company_134dp">134dp</dimen>
+    <dimen name="company_135dp">135dp</dimen>
+    <dimen name="company_136dp">136dp</dimen>
+    <dimen name="company_137dp">137dp</dimen>
+    <dimen name="company_138dp">138dp</dimen>
+    <dimen name="company_139dp">139dp</dimen>
+    <dimen name="company_140dp">140dp</dimen>
+    <dimen name="company_150dp">150dp</dimen>
+    <dimen name="company_181dp">181dp</dimen>
+    <dimen name="company_200dp">200dp</dimen>
+    <dimen name="company_250dp">250dp</dimen>
+    <dimen name="company_350dp">350dp</dimen>
+    <!-- sp单位-->
+    <dimen name="company_12sp">12sp</dimen>
+    <dimen name="company_13sp">13sp</dimen>
+    <dimen name="company_14sp">14sp</dimen>
+    <dimen name="company_15sp">15sp</dimen>
+    <dimen name="company_16sp">16sp</dimen>
+    <dimen name="company_18sp">18sp</dimen>
+    <dimen name="company_20sp">20sp</dimen>
+    <dimen name="company_22sp">22sp</dimen>
+    <dimen name="company_24sp">24sp</dimen>
+    <dimen name="company_25sp">25sp</dimen>
+    <dimen name="fab_margin">16dp</dimen>
+    <dimen name="ui_10_dip">10dip</dimen>
+
+    <dimen name="large_half">160px</dimen>
+
+    <dimen name="step_count">30sp</dimen>
+    <dimen name="pace">30sp</dimen>
+    <dimen name="desired_pace">24sp</dimen>
+    <dimen name="desired_pace_width">100sp</dimen>
+
+    <dimen name="button">52sp</dimen>
+    <dimen name="button_sign">26sp</dimen>
+
+    <dimen name="margin">10px</dimen>
+    <dimen name="padding">5px</dimen>
+    <dimen name="row_spacing">10px</dimen>
+    <dimen name="distance">20px</dimen>
+    <dimen name="row_height">130px</dimen>
+    <dimen name="box_width">150px</dimen>
+    <dimen name="third_box_width">103px</dimen>
+    <dimen name="third_box_width_middle">104px</dimen>
+
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="dialog_action_button_height">32dp</dimen>
+    <dimen name="dialog_action_button_text_size">14sp</dimen>
+    <dimen name="dialog_action_button_min_width">56dp</dimen>
+    <dimen name="dialog_action_button_padding_horizontal">4dp</dimen>
+
+    <!--pull to refresh-->
+    <dimen name="indicator_right_padding">10dp</dimen>
+    <dimen name="indicator_corner_radius">12dp</dimen>
+    <dimen name="indicator_internal_padding">4dp</dimen>
+    <dimen name="header_footer_left_right_padding">24dp</dimen>
+    <dimen name="header_footer_top_bottom_padding">12dp</dimen>
+
+</resources>
+

+ 21 - 0
library/src/main/res/values/styles.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="SwipeBackLayout">
+        <item name="edge_size">50dip</item>
+        <item name="shadow_left">@drawable/shadow_left</item>
+        <item name="shadow_right">@drawable/shadow_right</item>
+        <item name="shadow_bottom">@drawable/shadow_bottom</item>
+    </style>
+
+    <style name="Dialog_ActionButton">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">@dimen/dialog_action_button_height</item>
+        <item name="android:minWidth">@dimen/dialog_action_button_min_width</item>
+        <item name="android:paddingLeft">@dimen/dialog_action_button_padding_horizontal</item>
+        <item name="android:paddingRight">@dimen/dialog_action_button_padding_horizontal</item>
+        <item name="android:background">@drawable/dialog_button</item>
+        <item name="android:textSize">@dimen/dialog_action_button_text_size</item>
+    </style>
+
+</resources>

+ 17 - 0
library/src/test/java/com/common/library/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.common.library;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() throws Exception {
+        assertEquals(4, 2 + 2);
+    }
+}