Эх сурвалжийг харах

提交分类: 测试版本;
提交内容: 1、时间助手
2、设备管理问题反馈
当前版本: 正式版本6.3.9
是否冲突: 否

RaoMeng 7 жил өмнө
parent
commit
f30fd52620
93 өөрчлөгдсөн 2907 нэмэгдсэн , 69 устгасан
  1. 4 4
      WeiChat/build.gradle
  2. 33 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/WorkPlatFragment.java
  3. 11 0
      WeiChat/src/main/res/layout/fragment_work.xml
  4. 20 3
      app_core/common/build.gradle
  5. 315 0
      app_core/common/src/main/java/com/core/widget/arcmenu/ArcLayout.java
  6. 212 0
      app_core/common/src/main/java/com/core/widget/arcmenu/ArcMenu.java
  7. 246 0
      app_core/common/src/main/java/com/core/widget/arcmenu/RayLayout.java
  8. 162 0
      app_core/common/src/main/java/com/core/widget/arcmenu/RayMenu.java
  9. 138 0
      app_core/common/src/main/java/com/core/widget/arcmenu/RotateAndTranslateAnimation.java
  10. 8 0
      app_core/common/src/main/res/anim/anim_activity_back_bottom_in.xml
  11. 8 0
      app_core/common/src/main/res/anim/anim_activity_back_top_out.xml
  12. 8 0
      app_core/common/src/main/res/anim/anim_activity_bottom_out.xml
  13. 8 0
      app_core/common/src/main/res/anim/anim_activity_top_in.xml
  14. BIN
      app_core/common/src/main/res/drawable-hdpi/composer_button_normal.png
  15. BIN
      app_core/common/src/main/res/drawable-hdpi/composer_button_pressed.png
  16. BIN
      app_core/common/src/main/res/drawable-hdpi/composer_icn_plus_normal.png
  17. BIN
      app_core/common/src/main/res/drawable-hdpi/composer_icn_plus_pressed.png
  18. BIN
      app_core/common/src/main/res/drawable-xhdpi/composer_button_normal.png
  19. BIN
      app_core/common/src/main/res/drawable-xhdpi/composer_button_pressed.png
  20. BIN
      app_core/common/src/main/res/drawable-xhdpi/composer_icn_plus_normal.png
  21. BIN
      app_core/common/src/main/res/drawable-xhdpi/composer_icn_plus_pressed.png
  22. BIN
      app_core/common/src/main/res/drawable-xxhdpi/composer_button_normal.png
  23. BIN
      app_core/common/src/main/res/drawable-xxhdpi/composer_button_pressed.png
  24. BIN
      app_core/common/src/main/res/drawable-xxhdpi/composer_icn_plus_normal.png
  25. BIN
      app_core/common/src/main/res/drawable-xxhdpi/composer_icn_plus_pressed.png
  26. 7 0
      app_core/common/src/main/res/drawable/composer_button.xml
  27. 7 0
      app_core/common/src/main/res/drawable/composer_icn_plus.xml
  28. 48 0
      app_core/common/src/main/res/drawable/progress_vertical_gradient_simple_shape.xml
  29. 9 0
      app_core/common/src/main/res/drawable/shape_time_helper_indicate.xml
  30. 8 0
      app_core/common/src/main/res/drawable/shape_time_helper_meeting_left.xml
  31. 6 0
      app_core/common/src/main/res/drawable/shape_time_helper_meeting_left_title.xml
  32. 8 0
      app_core/common/src/main/res/drawable/shape_time_helper_meeting_right.xml
  33. 6 0
      app_core/common/src/main/res/drawable/shape_time_helper_meeting_right_title.xml
  34. 8 0
      app_core/common/src/main/res/drawable/shape_time_helper_order_left.xml
  35. 6 0
      app_core/common/src/main/res/drawable/shape_time_helper_order_left_title.xml
  36. 8 0
      app_core/common/src/main/res/drawable/shape_time_helper_order_right.xml
  37. 6 0
      app_core/common/src/main/res/drawable/shape_time_helper_order_right_title.xml
  38. 8 0
      app_core/common/src/main/res/drawable/shape_time_helper_schedule_left.xml
  39. 6 0
      app_core/common/src/main/res/drawable/shape_time_helper_schedule_left_title.xml
  40. 8 0
      app_core/common/src/main/res/drawable/shape_time_helper_schedule_right.xml
  41. 6 0
      app_core/common/src/main/res/drawable/shape_time_helper_schedule_right_title.xml
  42. 1 1
      app_core/common/src/main/res/layout/act_staff_query_list.xml
  43. 30 0
      app_core/common/src/main/res/layout/arc_menu.xml
  44. 202 0
      app_core/common/src/main/res/layout/item_list_time_helper.xml
  45. 27 0
      app_core/common/src/main/res/layout/item_time_helper_setting.xml
  46. 30 0
      app_core/common/src/main/res/layout/ray_menu.xml
  47. 22 0
      app_core/common/src/main/res/values-zh-rCN/strings.xml
  48. 145 1
      app_core/common/src/main/res/values/attrs.xml
  49. 21 0
      app_core/common/src/main/res/values/strings.xml
  50. 18 0
      app_core/common/src/main/res/values/styles.xml
  51. 23 22
      app_modular/appme/src/main/java/com/uas/appme/settings/activity/SettingActivity.java
  52. 9 0
      app_modular/appworks/src/main/AndroidManifest.xml
  53. 1 4
      app_modular/appworks/src/main/java/com/uas/appworks/activity/CityIndustryServiceMainActivity.java
  54. 6 6
      app_modular/appworks/src/main/java/com/uas/appworks/activity/CompanyBusinessListActivity.java
  55. 49 7
      app_modular/appworks/src/main/java/com/uas/appworks/activity/DeviceQueryActivity.java
  56. 8 8
      app_modular/appworks/src/main/java/com/uas/appworks/activity/InviteRegisterListActivity.java
  57. 279 0
      app_modular/appworks/src/main/java/com/uas/appworks/activity/TimeHelperActivity.java
  58. 205 0
      app_modular/appworks/src/main/java/com/uas/appworks/activity/TimeHelperSettingActivity.java
  59. 115 0
      app_modular/appworks/src/main/java/com/uas/appworks/adapter/TimeHelperAdapter.java
  60. 52 0
      app_modular/appworks/src/main/java/com/uas/appworks/adapter/TimeHelperSettingAdapter.java
  61. 6 6
      app_modular/appworks/src/main/java/com/uas/appworks/fragment/B2BBusinessListFragment.java
  62. 166 0
      app_modular/appworks/src/main/java/com/uas/appworks/model/bean/TimeHelperBean.java
  63. 36 0
      app_modular/appworks/src/main/java/com/uas/appworks/model/bean/TimeHelperSettingBean.java
  64. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_bottom1.png
  65. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_bottom2.png
  66. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_bottom3.png
  67. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_setting.png
  68. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_timehelper_metting.png
  69. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_timehelper_order.png
  70. BIN
      app_modular/appworks/src/main/res/drawable-hdpi/ic_timehelper_schedule.png
  71. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_bottom1.png
  72. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_bottom2.png
  73. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_bottom3.png
  74. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_setting.png
  75. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_timehelper_metting.png
  76. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_timehelper_order.png
  77. BIN
      app_modular/appworks/src/main/res/drawable-xhdpi/ic_timehelper_schedule.png
  78. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_bottom1.png
  79. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_bottom2.png
  80. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_bottom3.png
  81. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_setting.png
  82. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_timehelper_metting.png
  83. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_timehelper_order.png
  84. BIN
      app_modular/appworks/src/main/res/drawable-xxhdpi/ic_timehelper_schedule.png
  85. 14 0
      app_modular/appworks/src/main/res/drawable/animlist_time_helper_icon.xml
  86. 1 1
      app_modular/appworks/src/main/res/layout/activity_b2b_business_main.xml
  87. 1 1
      app_modular/appworks/src/main/res/layout/activity_main_city_industry_service.xml
  88. 68 0
      app_modular/appworks/src/main/res/layout/activity_time_helper.xml
  89. 14 0
      app_modular/appworks/src/main/res/layout/activity_time_helper_setting.xml
  90. 12 0
      app_modular/appworks/src/main/res/menu/menu_time_helper.xml
  91. 9 0
      app_modular/appworks/src/main/res/menu/menu_time_helper_setting.xml
  92. 8 3
      settings.gradle
  93. 1 1
      version.gradle

+ 4 - 4
WeiChat/build.gradle

@@ -171,15 +171,15 @@ dependencies {
     compile deps.systembartint
     compile deps.photoView
     compile deps.tagGroup
-    compile deps.analytics
+//    compile deps.analytics
     compile deps.activityOnCrash
     compile deps.stickyListHeaders
     compile deps.stickyGridHeaders
     compile deps.materialDialogs
     compile deps.okhttp
-    androidTestCompile deps.leakcanaryNp
-    debugCompile deps.leakcanary
-    releaseCompile deps.leakcanaryNp
+//    androidTestCompile deps.leakcanaryNp
+//    debugCompile deps.leakcanary
+//    releaseCompile deps.leakcanaryNp
     compile project(':common')
     compile project(':appmessages')
     compile project(':network')

+ 33 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/WorkPlatFragment.java

@@ -33,6 +33,7 @@ import com.scwang.smartrefresh.layout.api.RefreshHeader;
 import com.scwang.smartrefresh.layout.api.RefreshLayout;
 import com.scwang.smartrefresh.layout.constant.RefreshState;
 import com.scwang.smartrefresh.layout.listener.OnMultiPurposeListener;
+import com.uas.appworks.activity.TimeHelperActivity;
 import com.uas.appworks.model.bean.WorkMenuBean;
 import com.uas.appworks.presenter.WorkPlatPresenter;
 import com.uas.appworks.view.WorkPlatView;
@@ -66,6 +67,7 @@ public class WorkPlatFragment extends BaseMVPFragment<WorkPlatPresenter> impleme
     private Resources mResources;
     private RefreshLayout mRefreshLayout;
     private ImageView mHeaderImageView, mFuncImageView, mHeaderWordImageView;
+    private TextView mHeaderTimeTextView;
     private Toolbar mToolbar;
     private RelativeLayout mHeaderRelativeLayout;
     private int mHeaderHeight;
@@ -89,6 +91,7 @@ public class WorkPlatFragment extends BaseMVPFragment<WorkPlatPresenter> impleme
             mHeaderImageView = $(R.id.work_plat_main_header_iv);
             mHeaderRelativeLayout = $(R.id.work_plat_main_header_rl);
             mHeaderWordImageView = $(R.id.work_plat_main_header_word_iv);
+            mHeaderTimeTextView = $(R.id.work_plat_main_header_time_tv);
             mMasterTextView = $(R.id.work_plat_master_name_tv);
             mFuncImageView = $(R.id.work_plat_func_set_iv);
             mToolbar = $(R.id.work_plat_main_toolbar);
@@ -153,12 +156,26 @@ public class WorkPlatFragment extends BaseMVPFragment<WorkPlatPresenter> impleme
                 }
 
                 @Override
-                public void onLoadmore(RefreshLayout refreshlayout) {
+                public void onLoadMore(RefreshLayout refreshlayout) {
 
                 }
 
                 @Override
                 public void onHeaderPulling(RefreshHeader header, float percent, int offset, int headerHeight, int extendHeight) {
+                    if (percent >= 1f) {
+                        mHeaderTimeTextView.setVisibility(View.VISIBLE);
+                    } else {
+                        mHeaderTimeTextView.setVisibility(View.GONE);
+                    }
+                    if (percent >= 1.3f) {
+                        mRefreshLayout.finishRefresh(0);
+                        if (!CommonUtil.isRepeatClick()) {
+                            Intent intent = new Intent();
+                            intent.setClass(mContext, TimeHelperActivity.class);
+                            startActivity(intent);
+                            getActivity().overridePendingTransition(R.anim.anim_activity_top_in, R.anim.anim_activity_bottom_out);
+                        }
+                    }
                     ViewGroup.LayoutParams layoutParams = mHeaderRelativeLayout.getLayoutParams();
                     layoutParams.height = (int) (mHeaderHeight * (1 + percent));
                     mHeaderRelativeLayout.setLayoutParams(layoutParams);
@@ -168,6 +185,11 @@ public class WorkPlatFragment extends BaseMVPFragment<WorkPlatPresenter> impleme
 
                 @Override
                 public void onHeaderReleasing(RefreshHeader header, float percent, int offset, int headerHeight, int extendHeight) {
+                    if (percent >= 1f) {
+                        mHeaderTimeTextView.setVisibility(View.VISIBLE);
+                    } else {
+                        mHeaderTimeTextView.setVisibility(View.GONE);
+                    }
                     ViewGroup.LayoutParams layoutParams = mHeaderRelativeLayout.getLayoutParams();
                     layoutParams.height = (int) (mHeaderHeight * (1 + percent));
                     mHeaderRelativeLayout.setLayoutParams(layoutParams);
@@ -186,6 +208,16 @@ public class WorkPlatFragment extends BaseMVPFragment<WorkPlatPresenter> impleme
                     mHeaderWordImageView.requestLayout();
                 }
 
+                @Override
+                public void onHeaderReleased(RefreshHeader refreshHeader, int i, int i1) {
+
+                }
+
+                @Override
+                public void onFooterReleased(RefreshFooter refreshFooter, int i, int i1) {
+
+                }
+
                 @Override
                 public void onFooterPulling(RefreshFooter footer, float percent, int offset, int footerHeight, int extendHeight) {
 

+ 11 - 0
WeiChat/src/main/res/layout/fragment_work.xml

@@ -27,6 +27,17 @@
             android:layout_centerInParent="true"
             android:alpha="0"
             android:src="@drawable/ic_workplat_header_word" />
+
+        <TextView
+            android:id="@+id/work_plat_main_header_time_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="46dp"
+            android:text="继续下拉进入时间助手"
+            android:textColor="@color/white"
+            android:textSize="14sp"
+            android:visibility="gone" />
     </RelativeLayout>
 
     <LinearLayout

+ 20 - 3
app_core/common/build.gradle

@@ -35,7 +35,8 @@ dependencies {
     compile deps.gif
     compile deps.circleimageview
     compile deps.activityOnCrash
-    compile 'com.umeng.analytics:analytics:6.1.2'
+//    compile 'com.umeng.analytics:analytics:6.1.2'
+    compile deps.analytics
     compile deps.photoView
     compile deps.stickyListHeaders
     compile deps.stickyGridHeaders
@@ -43,8 +44,22 @@ dependencies {
     compile deps.BaseRecyclerViewAdapterHelper
     compile deps.design
     compile deps.banner
-    compile deps.smartRefreshLayout
-    compile deps.smartRefreshHeader
+    compile(deps.smartRefreshLayout) {
+        exclude group: 'com.squareup.leakcanary'
+        exclude group: 'com.umeng.analytics'
+        exclude group: 'com.android.support'
+        exclude group: 'org.apache.maven.plugins'
+        exclude group: 'com.sun.xml.stream.buffer'
+        exclude group: 'javax.annotation.processing'
+    }
+    compile(deps.smartRefreshHeader) {
+        exclude group: 'com.squareup.leakcanary'
+        exclude group: 'com.umeng.analytics'
+        exclude group: 'com.android.support'
+        exclude group: 'org.apache.maven.plugins'
+        exclude group: 'com.sun.xml.stream.buffer'
+        exclude group: 'javax.annotation.processing'
+    }
 
     compile project(':network')
     compile project(':applocation')
@@ -61,4 +76,6 @@ dependencies {
     compile files('libs/hellocharts-library-1.5.8.jar')
     compile deps.wechatSdk
     compile 'com.github.hss01248:NotifyUtil:1.0.1'
+//    compile project(':smart-refresh-layout')
+//    compile project(':smart-refresh-header')
 }

+ 315 - 0
app_core/common/src/main/java/com/core/widget/arcmenu/ArcLayout.java

@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2012 Capricorn
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.core.widget.arcmenu;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Rect;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationSet;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.OvershootInterpolator;
+import android.view.animation.RotateAnimation;
+
+import com.core.app.R;
+
+
+/**
+ * A Layout that arranges its children around its center. The arc can be set by
+ * calling {@link #setArc(float, float) setArc()}. You can override the method
+ * {@link #onMeasure(int, int) onMeasure()}, otherwise it is always
+ * WRAP_CONTENT.
+ *
+ * @author Capricorn
+ */
+public class ArcLayout extends ViewGroup {
+    /**
+     * children will be set the same size.
+     */
+    private int mChildSize;
+
+    private int mChildPadding = 5;
+
+    private int mLayoutPadding = 10;
+
+    public static final float DEFAULT_FROM_DEGREES = 270.0f;
+
+    public static final float DEFAULT_TO_DEGREES = 360.0f;
+
+    private float mFromDegrees = DEFAULT_FROM_DEGREES;
+
+    private float mToDegrees = DEFAULT_TO_DEGREES;
+
+    private static final int MIN_RADIUS = 100;
+
+    /* the distance between the layout's center and any child's center */
+    private int mRadius;
+
+    private boolean mExpanded = false;
+
+    public ArcLayout(Context context) {
+        super(context);
+    }
+
+    public ArcLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        if (attrs != null) {
+            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ArcLayout, 0, 0);
+            mFromDegrees = a.getFloat(R.styleable.ArcLayout_fromDegrees, DEFAULT_FROM_DEGREES);
+            mToDegrees = a.getFloat(R.styleable.ArcLayout_toDegrees, DEFAULT_TO_DEGREES);
+            mChildSize = Math.max(a.getDimensionPixelSize(R.styleable.ArcLayout_childSize, 0), 0);
+
+            a.recycle();
+        }
+    }
+
+    private static int computeRadius(final float arcDegrees, final int childCount, final int childSize,
+                                     final int childPadding, final int minRadius) {
+        if (childCount < 2) {
+            return minRadius;
+        }
+
+        final float perDegrees = arcDegrees / (childCount - 1);
+        final float perHalfDegrees = perDegrees / 2;
+        final int perSize = childSize + childPadding;
+
+        final int radius = (int) ((perSize / 2) / Math.sin(Math.toRadians(perHalfDegrees)));
+
+        return Math.max(radius, minRadius);
+    }
+
+    private static Rect computeChildFrame(final int centerX, final int centerY, final int radius, final float degrees,
+                                          final int size) {
+
+        final double childCenterX = centerX + radius * Math.cos(Math.toRadians(degrees));
+        final double childCenterY = centerY + radius * Math.sin(Math.toRadians(degrees));
+
+        return new Rect((int) (childCenterX - size / 2), (int) (childCenterY - size / 2),
+                (int) (childCenterX + size / 2), (int) (childCenterY + size / 2));
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        final int radius = mRadius = computeRadius(Math.abs(mToDegrees - mFromDegrees), getChildCount(), mChildSize,
+                mChildPadding, MIN_RADIUS);
+        final int size = radius * 2 + mChildSize + mChildPadding + mLayoutPadding * 2;
+
+        setMeasuredDimension(size, size);
+
+        final int count = getChildCount();
+        for (int i = 0; i < count; i++) {
+            getChildAt(i).measure(MeasureSpec.makeMeasureSpec(mChildSize, MeasureSpec.EXACTLY),
+                    MeasureSpec.makeMeasureSpec(mChildSize, MeasureSpec.EXACTLY));
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        final int centerX = getWidth() / 2;
+        final int centerY = getHeight() / 2;
+        final int radius = mExpanded ? mRadius : 0;
+
+        final int childCount = getChildCount();
+        final float perDegrees = (mToDegrees - mFromDegrees) / (childCount - 1);
+
+        float degrees = mFromDegrees;
+        for (int i = 0; i < childCount; i++) {
+            Rect frame = computeChildFrame(centerX, centerY, radius, degrees, mChildSize);
+            degrees += perDegrees;
+            getChildAt(i).layout(frame.left, frame.top, frame.right, frame.bottom);
+        }
+    }
+
+
+    private static long computeStartOffset(final int childCount, final boolean expanded, final int index,
+                                           final float delayPercent, final long duration, Interpolator interpolator) {
+        final float delay = delayPercent * duration;
+        final long viewDelay = (long) (getTransformedIndex(expanded, childCount, index) * delay);
+        final float totalDelay = delay * childCount;
+
+        float normalizedDelay = viewDelay / totalDelay;
+        normalizedDelay = interpolator.getInterpolation(normalizedDelay);
+
+        return (long) (normalizedDelay * totalDelay);
+    }
+
+    private static int getTransformedIndex(final boolean expanded, final int count, final int index) {
+        if (expanded) {
+            return count - 1 - index;
+        }
+
+        return index;
+    }
+
+    private static Animation createExpandAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta,
+                                                   long startOffset, long duration, Interpolator interpolator) {
+        Animation animation = new RotateAndTranslateAnimation(0, toXDelta, 0, toYDelta, 0, 720);
+        animation.setStartOffset(startOffset);
+        animation.setDuration(duration);
+        animation.setInterpolator(interpolator);
+        animation.setFillAfter(true);
+
+        return animation;
+    }
+
+    private static Animation createShrinkAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta,
+                                                   long startOffset, long duration, Interpolator interpolator) {
+        AnimationSet animationSet = new AnimationSet(false);
+        animationSet.setFillAfter(true);
+
+        final long preDuration = duration / 2;
+        Animation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f,
+                Animation.RELATIVE_TO_SELF, 0.5f);
+        rotateAnimation.setStartOffset(startOffset);
+        rotateAnimation.setDuration(preDuration);
+        rotateAnimation.setInterpolator(new LinearInterpolator());
+        rotateAnimation.setFillAfter(true);
+
+        animationSet.addAnimation(rotateAnimation);
+
+        Animation translateAnimation = new RotateAndTranslateAnimation(0, toXDelta, 0, toYDelta, 360, 720);
+        translateAnimation.setStartOffset(startOffset + preDuration);
+        translateAnimation.setDuration(duration - preDuration);
+        translateAnimation.setInterpolator(interpolator);
+        translateAnimation.setFillAfter(true);
+
+        animationSet.addAnimation(translateAnimation);
+
+        return animationSet;
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+    private void bindChildAnimation(final View child, final int index, final long duration) {
+        final boolean expanded = mExpanded;
+        final int centerX = getWidth() / 2;
+        final int centerY = getHeight() / 2;
+        final int radius = expanded ? 0 : mRadius;
+
+        final int childCount = getChildCount();
+        final float perDegrees = (mToDegrees - mFromDegrees) / (childCount - 1);
+        Rect frame = computeChildFrame(centerX, centerY, radius, mFromDegrees + index * perDegrees, mChildSize);
+
+        final int toXDelta = frame.left - child.getLeft();
+        final int toYDelta = frame.top - child.getTop();
+
+        Interpolator interpolator = mExpanded ? new AccelerateInterpolator() : new OvershootInterpolator(1.5f);
+        final long startOffset = computeStartOffset(childCount, mExpanded, index, 0.1f, duration, interpolator);
+
+        Animation animation = mExpanded ? createShrinkAnimation(0, toXDelta, 0, toYDelta, startOffset, duration,
+                interpolator) : createExpandAnimation(0, toXDelta, 0, toYDelta, startOffset, duration, interpolator);
+
+        final boolean isLast = getTransformedIndex(expanded, childCount, index) == childCount - 1;
+        animation.setAnimationListener(new AnimationListener() {
+
+            @Override
+            public void onAnimationStart(Animation animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animation animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animation animation) {
+                if (isLast) {
+                    postDelayed(new Runnable() {
+
+                        @Override
+                        public void run() {
+                            onAllAnimationsEnd();
+                        }
+                    }, 0);
+                }
+            }
+        });
+
+        child.setAnimation(animation);
+    }
+
+    public boolean isExpanded() {
+        return mExpanded;
+    }
+
+    public void setArc(float fromDegrees, float toDegrees) {
+        if (mFromDegrees == fromDegrees && mToDegrees == toDegrees) {
+            return;
+        }
+
+        mFromDegrees = fromDegrees;
+        mToDegrees = toDegrees;
+
+        requestLayout();
+    }
+
+    public void setChildSize(int size) {
+        if (mChildSize == size || size < 0) {
+            return;
+        }
+
+        mChildSize = size;
+
+        requestLayout();
+    }
+
+    public int getChildSize() {
+        return mChildSize;
+    }
+
+    /**
+     * switch between expansion and shrinkage
+     *
+     * @param showAnimation
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+    public void switchState(final boolean showAnimation) {
+        if (showAnimation) {
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                bindChildAnimation(getChildAt(i), i, 300);
+            }
+        }
+
+        mExpanded = !mExpanded;
+
+        if (!showAnimation) {
+            requestLayout();
+        }
+
+        invalidate();
+    }
+
+    private void onAllAnimationsEnd() {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            getChildAt(i).clearAnimation();
+        }
+
+        requestLayout();
+    }
+
+}

+ 212 - 0
app_core/common/src/main/java/com/core/widget/arcmenu/ArcMenu.java

@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2012 Capricorn
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.core.widget.arcmenu;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.RotateAnimation;
+import android.view.animation.ScaleAnimation;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+
+import com.core.app.R;
+
+/**
+ * A custom view that looks like the menu in <a href="https://path.com">Path
+ * 2.0</a> (for iOS).
+ *
+ * @author Capricorn
+ */
+public class ArcMenu extends RelativeLayout {
+    private ArcLayout mArcLayout;
+
+    private ImageView mHintView;
+
+    private OnMenuClickListener mOnMenuClickListener;
+
+    public ArcMenu(Context context) {
+        super(context);
+        init(context);
+    }
+
+    public ArcMenu(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+        applyAttrs(attrs);
+    }
+
+    private void init(Context context) {
+        LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        li.inflate(R.layout.arc_menu, this);
+
+        mArcLayout = (ArcLayout) findViewById(R.id.item_layout);
+
+        final ViewGroup controlLayout = (ViewGroup) findViewById(R.id.control_layout);
+        controlLayout.setClickable(true);
+        controlLayout.setOnTouchListener(new OnTouchListener() {
+
+            @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                    mHintView.startAnimation(createHintSwitchAnimation(mArcLayout.isExpanded()));
+                    mArcLayout.switchState(true);
+
+                    if (mOnMenuClickListener != null) {
+                        mOnMenuClickListener.onMenuClick(mArcLayout.isExpanded());
+                    }
+                }
+
+                return false;
+            }
+        });
+
+        mHintView = (ImageView) findViewById(R.id.control_hint);
+    }
+
+    private void applyAttrs(AttributeSet attrs) {
+        if (attrs != null) {
+            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ArcLayout, 0, 0);
+
+            float fromDegrees = a.getFloat(R.styleable.ArcLayout_fromDegrees, ArcLayout.DEFAULT_FROM_DEGREES);
+            float toDegrees = a.getFloat(R.styleable.ArcLayout_toDegrees, ArcLayout.DEFAULT_TO_DEGREES);
+            mArcLayout.setArc(fromDegrees, toDegrees);
+
+            int defaultChildSize = mArcLayout.getChildSize();
+            int newChildSize = a.getDimensionPixelSize(R.styleable.ArcLayout_childSize, defaultChildSize);
+            mArcLayout.setChildSize(newChildSize);
+
+            a.recycle();
+        }
+    }
+
+    public void addItem(View item, OnClickListener listener) {
+        mArcLayout.addView(item);
+        item.setOnClickListener(getItemClickListener(listener));
+    }
+
+    private OnClickListener getItemClickListener(final OnClickListener listener) {
+        return new OnClickListener() {
+
+            @Override
+            public void onClick(final View viewClicked) {
+                Animation animation = bindItemAnimation(viewClicked, true, 400);
+                animation.setAnimationListener(new AnimationListener() {
+
+                    @Override
+                    public void onAnimationStart(Animation animation) {
+
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animation animation) {
+
+                    }
+
+                    @Override
+                    public void onAnimationEnd(Animation animation) {
+                        postDelayed(new Runnable() {
+
+                            @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+                            @Override
+                            public void run() {
+                                itemDidDisappear();
+                            }
+                        }, 0);
+                    }
+                });
+
+                final int itemCount = mArcLayout.getChildCount();
+                for (int i = 0; i < itemCount; i++) {
+                    View item = mArcLayout.getChildAt(i);
+                    if (viewClicked != item) {
+                        bindItemAnimation(item, false, 300);
+                    }
+                }
+
+                mArcLayout.invalidate();
+                mHintView.startAnimation(createHintSwitchAnimation(true));
+
+                if (listener != null) {
+                    listener.onClick(viewClicked);
+                }
+            }
+        };
+    }
+
+    private Animation bindItemAnimation(final View child, final boolean isClicked, final long duration) {
+        Animation animation = createItemDisapperAnimation(duration, isClicked);
+        child.setAnimation(animation);
+
+        return animation;
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+    private void itemDidDisappear() {
+        final int itemCount = mArcLayout.getChildCount();
+        for (int i = 0; i < itemCount; i++) {
+            View item = mArcLayout.getChildAt(i);
+            item.clearAnimation();
+        }
+
+        mArcLayout.switchState(false);
+    }
+
+    private static Animation createItemDisapperAnimation(final long duration, final boolean isClicked) {
+        AnimationSet animationSet = new AnimationSet(true);
+        animationSet.addAnimation(new ScaleAnimation(1.0f, isClicked ? 2.0f : 0.0f, 1.0f, isClicked ? 2.0f : 0.0f,
+                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f));
+        animationSet.addAnimation(new AlphaAnimation(1.0f, 0.0f));
+
+        animationSet.setDuration(duration);
+        animationSet.setInterpolator(new DecelerateInterpolator());
+        animationSet.setFillAfter(true);
+
+        return animationSet;
+    }
+
+    private static Animation createHintSwitchAnimation(final boolean expanded) {
+        Animation animation = new RotateAnimation(expanded ? 45 : 0, expanded ? 0 : 45, Animation.RELATIVE_TO_SELF,
+                0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+        animation.setStartOffset(0);
+        animation.setDuration(100);
+        animation.setInterpolator(new DecelerateInterpolator());
+        animation.setFillAfter(true);
+
+        return animation;
+    }
+
+    public void setOnMenuClickListener(OnMenuClickListener onMenuClickListener) {
+        mOnMenuClickListener = onMenuClickListener;
+    }
+
+    public interface OnMenuClickListener {
+        void onMenuClick(boolean isExpanded);
+    }
+}

+ 246 - 0
app_core/common/src/main/java/com/core/widget/arcmenu/RayLayout.java

@@ -0,0 +1,246 @@
+package com.core.widget.arcmenu;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Rect;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationSet;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.OvershootInterpolator;
+import android.view.animation.RotateAnimation;
+import com.core.app.R;
+
+public class RayLayout extends ViewGroup {
+
+	/**
+	 * children will be set the same size.
+	 */
+	private int mChildSize;
+
+	/* the distance between child Views */
+	private int mChildGap;
+
+	/* left space to place the switch button */
+	private int mLeftHolderWidth;
+
+	private boolean mExpanded = false;
+
+	public RayLayout(Context context) {
+		super(context);
+	}
+
+	public RayLayout(Context context, AttributeSet attrs) {
+		super(context, attrs);
+
+		if (attrs != null) {
+			TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ArcLayout, 0, 0);
+			mChildSize = Math.max(a.getDimensionPixelSize(R.styleable.ArcLayout_childSize, 0), 0);
+			a.recycle();
+
+			a = getContext().obtainStyledAttributes(attrs, R.styleable.RayLayout, 0, 0);
+			mLeftHolderWidth = Math.max(a.getDimensionPixelSize(R.styleable.RayLayout_leftHolderWidth, 0), 0);
+			a.recycle();
+
+		}
+	}
+
+	private static int computeChildGap(final float width, final int childCount, final int childSize, final int minGap) {
+		return Math.max((int) (width / childCount - childSize), minGap);
+	}
+
+	private static Rect computeChildFrame(final boolean expanded, final int paddingLeft, final int childIndex,
+                                          final int gap, final int size) {
+		final int left = expanded ? (paddingLeft + childIndex * (gap + size) + gap) : ((paddingLeft - size) / 2);
+
+		return new Rect(left, 0, left + size, size);
+	}
+
+	@Override
+	protected int getSuggestedMinimumHeight() {
+		return mChildSize;
+	}
+
+	@Override
+	protected int getSuggestedMinimumWidth() {
+		return mLeftHolderWidth + mChildSize * getChildCount();
+	}
+
+	@Override
+	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+		super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(getSuggestedMinimumHeight(), MeasureSpec.EXACTLY));
+
+		final int count = getChildCount();
+		mChildGap = computeChildGap(getMeasuredWidth() - mLeftHolderWidth, count, mChildSize, 0);
+
+		for (int i = 0; i < count; i++) {
+			getChildAt(i).measure(MeasureSpec.makeMeasureSpec(mChildSize, MeasureSpec.EXACTLY),
+					MeasureSpec.makeMeasureSpec(mChildSize, MeasureSpec.EXACTLY));
+		}
+	}
+
+	@Override
+	protected void onLayout(boolean changed, int l, int t, int r, int b) {
+		final int paddingLeft = mLeftHolderWidth;
+		final int childCount = getChildCount();
+
+		for (int i = 0; i < childCount; i++) {
+			Rect frame = computeChildFrame(mExpanded, paddingLeft, i, mChildGap, mChildSize);
+			getChildAt(i).layout(frame.left, frame.top, frame.right, frame.bottom);
+		}
+
+	}
+
+
+	private static long computeStartOffset(final int childCount, final boolean expanded, final int index,
+			final float delayPercent, final long duration, Interpolator interpolator) {
+		final float delay = delayPercent * duration;
+		final long viewDelay = (long) (getTransformedIndex(expanded, childCount, index) * delay);
+		final float totalDelay = delay * childCount;
+
+		float normalizedDelay = viewDelay / totalDelay;
+		normalizedDelay = interpolator.getInterpolation(normalizedDelay);
+
+		return (long) (normalizedDelay * totalDelay);
+	}
+
+	private static int getTransformedIndex(final boolean expanded, final int count, final int index) {
+		return count - 1 - index;
+	}
+
+	private static Animation createExpandAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta,
+                                                   long startOffset, long duration, Interpolator interpolator) {
+		Animation animation = new RotateAndTranslateAnimation(0, toXDelta, 0, toYDelta, 0, 720);
+		animation.setStartOffset(startOffset);
+		animation.setDuration(duration);
+		animation.setInterpolator(interpolator);
+		animation.setFillAfter(true);
+
+		return animation;
+	}
+
+	private static Animation createShrinkAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta,
+                                                   long startOffset, long duration, Interpolator interpolator) {
+		AnimationSet animationSet = new AnimationSet(false);
+		animationSet.setFillAfter(true);
+
+		final long preDuration = duration / 2;
+		Animation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f,
+				Animation.RELATIVE_TO_SELF, 0.5f);
+		rotateAnimation.setStartOffset(startOffset);
+		rotateAnimation.setDuration(preDuration);
+		rotateAnimation.setInterpolator(new LinearInterpolator());
+		rotateAnimation.setFillAfter(true);
+
+		animationSet.addAnimation(rotateAnimation);
+
+		Animation translateAnimation = new RotateAndTranslateAnimation(0, toXDelta, 0, toYDelta, 360, 720);
+		translateAnimation.setStartOffset(startOffset + preDuration);
+		translateAnimation.setDuration(duration - preDuration);
+		translateAnimation.setInterpolator(interpolator);
+		translateAnimation.setFillAfter(true);
+
+		animationSet.addAnimation(translateAnimation);
+
+		return animationSet;
+	}
+
+	@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+	private void bindChildAnimation(final View child, final int index, final long duration) {
+		final boolean expanded = mExpanded;
+		final int childCount = getChildCount();
+		Rect frame = computeChildFrame(!expanded, mLeftHolderWidth, index, mChildGap, mChildSize);
+
+		final int toXDelta = frame.left - child.getLeft();
+		final int toYDelta = frame.top - child.getTop();
+
+		Interpolator interpolator = mExpanded ? new AccelerateInterpolator() : new OvershootInterpolator(1.5f);
+		final long startOffset = computeStartOffset(childCount, mExpanded, index, 0.1f, duration, interpolator);
+
+		Animation animation = mExpanded ? createShrinkAnimation(0, toXDelta, 0, toYDelta, startOffset, duration,
+				interpolator) : createExpandAnimation(0, toXDelta, 0, toYDelta, startOffset, duration, interpolator);
+
+		final boolean isLast = getTransformedIndex(expanded, childCount, index) == childCount - 1;
+		animation.setAnimationListener(new AnimationListener() {
+
+			@Override
+			public void onAnimationStart(Animation animation) {
+
+			}
+
+			@Override
+			public void onAnimationRepeat(Animation animation) {
+
+			}
+
+			@Override
+			public void onAnimationEnd(Animation animation) {
+				if (isLast) {
+					postDelayed(new Runnable() {
+
+						@Override
+						public void run() {
+							onAllAnimationsEnd();
+						}
+					}, 0);
+				}
+			}
+		});
+
+		child.setAnimation(animation);
+	}
+
+	public boolean isExpanded() {
+		return mExpanded;
+	}
+
+	public void setChildSize(int size) {
+		if (mChildSize == size || size < 0) {
+			return;
+		}
+
+		mChildSize = size;
+
+		requestLayout();
+	}
+
+	/**
+	 * switch between expansion and shrinkage
+	 * 
+	 * @param showAnimation
+	 */
+	@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+	public void switchState(final boolean showAnimation) {
+		if (showAnimation) {
+			final int childCount = getChildCount();
+			for (int i = 0; i < childCount; i++) {
+				bindChildAnimation(getChildAt(i), i, 300);
+			}
+		}
+
+		mExpanded = !mExpanded;
+
+		if (!showAnimation) {
+			requestLayout();
+		}
+
+		invalidate();
+	}
+
+	private void onAllAnimationsEnd() {
+		final int childCount = getChildCount();
+		for (int i = 0; i < childCount; i++) {
+			getChildAt(i).clearAnimation();
+		}
+
+		requestLayout();
+	}
+
+}

+ 162 - 0
app_core/common/src/main/java/com/core/widget/arcmenu/RayMenu.java

@@ -0,0 +1,162 @@
+package com.core.widget.arcmenu;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.RotateAnimation;
+import android.view.animation.ScaleAnimation;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+
+import com.core.app.R;
+
+public class RayMenu extends RelativeLayout {
+	private RayLayout mRayLayout;
+
+	private ImageView mHintView;
+
+	public RayMenu(Context context) {
+		super(context);
+		init(context);
+	}
+
+	public RayMenu(Context context, AttributeSet attrs) {
+		super(context, attrs);
+		init(context);
+	}
+
+	private void init(Context context) {
+		setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
+		setClipChildren(false);
+
+		LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+		li.inflate(R.layout.ray_menu, this);
+
+		mRayLayout = (RayLayout) findViewById(R.id.item_layout);
+
+		final ViewGroup controlLayout = (ViewGroup) findViewById(R.id.control_layout);
+		controlLayout.setClickable(true);
+		controlLayout.setOnTouchListener(new OnTouchListener() {
+
+			@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+			@Override
+			public boolean onTouch(View v, MotionEvent event) {
+				if (event.getAction() == MotionEvent.ACTION_DOWN) {
+					mHintView.startAnimation(createHintSwitchAnimation(mRayLayout.isExpanded()));
+					mRayLayout.switchState(true);
+				}
+
+				return false;
+			}
+		});
+
+		mHintView = (ImageView) findViewById(R.id.control_hint);
+	}
+
+	public void addItem(View item, OnClickListener listener) {
+		mRayLayout.addView(item);
+		item.setOnClickListener(getItemClickListener(listener));
+	}
+
+	private OnClickListener getItemClickListener(final OnClickListener listener) {
+		return new OnClickListener() {
+
+			@Override
+			public void onClick(final View viewClicked) {
+				Animation animation = bindItemAnimation(viewClicked, true, 400);
+				animation.setAnimationListener(new AnimationListener() {
+
+					@Override
+					public void onAnimationStart(Animation animation) {
+
+					}
+
+					@Override
+					public void onAnimationRepeat(Animation animation) {
+
+					}
+
+					@Override
+					public void onAnimationEnd(Animation animation) {
+						postDelayed(new Runnable() {
+
+							@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+							@Override
+							public void run() {
+								itemDidDisappear();
+							}
+						}, 0);
+					}
+				});
+
+				final int itemCount = mRayLayout.getChildCount();
+				for (int i = 0; i < itemCount; i++) {
+					View item = mRayLayout.getChildAt(i);
+					if (viewClicked != item) {
+						bindItemAnimation(item, false, 300);
+					}
+				}
+
+				mRayLayout.invalidate();
+				mHintView.startAnimation(createHintSwitchAnimation(true));
+
+				if (listener != null) {
+					listener.onClick(viewClicked);
+				}
+			}
+		};
+	}
+
+	private Animation bindItemAnimation(final View child, final boolean isClicked, final long duration) {
+		Animation animation = createItemDisapperAnimation(duration, isClicked);
+		child.setAnimation(animation);
+
+		return animation;
+	}
+
+	@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+	private void itemDidDisappear() {
+		final int itemCount = mRayLayout.getChildCount();
+		for (int i = 0; i < itemCount; i++) {
+			View item = mRayLayout.getChildAt(i);
+			item.clearAnimation();
+		}
+
+		mRayLayout.switchState(false);
+	}
+
+	private static Animation createItemDisapperAnimation(final long duration, final boolean isClicked) {
+		AnimationSet animationSet = new AnimationSet(true);
+		animationSet.addAnimation(new ScaleAnimation(1.0f, isClicked ? 2.0f : 0.0f, 1.0f, isClicked ? 2.0f : 0.0f,
+				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f));
+		animationSet.addAnimation(new AlphaAnimation(1.0f, 0.0f));
+
+		animationSet.setDuration(duration);
+		animationSet.setInterpolator(new DecelerateInterpolator());
+		animationSet.setFillAfter(true);
+
+		return animationSet;
+	}
+
+	private static Animation createHintSwitchAnimation(final boolean expanded) {
+		Animation animation = new RotateAnimation(expanded ? 45 : 0, expanded ? 0 : 45, Animation.RELATIVE_TO_SELF,
+				0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+		animation.setStartOffset(0);
+		animation.setDuration(100);
+		animation.setInterpolator(new DecelerateInterpolator());
+		animation.setFillAfter(true);
+
+		return animation;
+	}
+
+}

+ 138 - 0
app_core/common/src/main/java/com/core/widget/arcmenu/RotateAndTranslateAnimation.java

@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2012 Capricorn
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.core.widget.arcmenu;
+
+import android.view.animation.Animation;
+import android.view.animation.Transformation;
+
+/**
+ * An animation that controls the position of an object, and make the object
+ * rotate on its center at the same time.
+ * 
+ */
+public class RotateAndTranslateAnimation extends Animation {
+    private int mFromXType = ABSOLUTE;
+
+    private int mToXType = ABSOLUTE;
+
+    private int mFromYType = ABSOLUTE;
+
+    private int mToYType = ABSOLUTE;
+
+    private float mFromXValue = 0.0f;
+
+    private float mToXValue = 0.0f;
+
+    private float mFromYValue = 0.0f;
+
+    private float mToYValue = 0.0f;
+
+    private float mFromXDelta;
+
+    private float mToXDelta;
+
+    private float mFromYDelta;
+
+    private float mToYDelta;
+
+    private float mFromDegrees;
+
+    private float mToDegrees;
+
+    private int mPivotXType = ABSOLUTE;
+
+    private int mPivotYType = ABSOLUTE;
+
+    private float mPivotXValue = 0.0f;
+
+    private float mPivotYValue = 0.0f;
+
+    private float mPivotX;
+
+    private float mPivotY;
+
+    /**
+     * Constructor to use when building a TranslateAnimation from code
+     * 
+     * @param fromXDelta
+     *            Change in X coordinate to apply at the start of the animation
+     * @param toXDelta
+     *            Change in X coordinate to apply at the end of the animation
+     * @param fromYDelta
+     *            Change in Y coordinate to apply at the start of the animation
+     * @param toYDelta
+     *            Change in Y coordinate to apply at the end of the animation
+     * 
+     * @param fromDegrees
+     *            Rotation offset to apply at the start of the animation.
+     * @param toDegrees
+     *            Rotation offset to apply at the end of the animation.
+     */
+    public RotateAndTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta,
+            float fromDegrees, float toDegrees) {
+        mFromXValue = fromXDelta;
+        mToXValue = toXDelta;
+        mFromYValue = fromYDelta;
+        mToYValue = toYDelta;
+
+        mFromXType = ABSOLUTE;
+        mToXType = ABSOLUTE;
+        mFromYType = ABSOLUTE;
+        mToYType = ABSOLUTE;
+
+        mFromDegrees = fromDegrees;
+        mToDegrees = toDegrees;
+
+        mPivotXValue = 0.5f;
+        mPivotXType = RELATIVE_TO_SELF;
+        mPivotYValue = 0.5f;
+        mPivotYType = RELATIVE_TO_SELF;
+    }
+
+    @Override
+    protected void applyTransformation(float interpolatedTime, Transformation t) {
+        final float degrees = mFromDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime);
+        if (mPivotX == 0.0f && mPivotY == 0.0f) {
+            t.getMatrix().setRotate(degrees);
+        } else {
+            t.getMatrix().setRotate(degrees, mPivotX, mPivotY);
+        }
+
+        float dx = mFromXDelta;
+        float dy = mFromYDelta;
+        if (mFromXDelta != mToXDelta) {
+            dx = mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime);
+        }
+        if (mFromYDelta != mToYDelta) {
+            dy = mFromYDelta + ((mToYDelta - mFromYDelta) * interpolatedTime);
+        }
+
+        t.getMatrix().postTranslate(dx, dy);
+    }
+
+    @Override
+    public void initialize(int width, int height, int parentWidth, int parentHeight) {
+        super.initialize(width, height, parentWidth, parentHeight);
+        mFromXDelta = resolveSize(mFromXType, mFromXValue, width, parentWidth);
+        mToXDelta = resolveSize(mToXType, mToXValue, width, parentWidth);
+        mFromYDelta = resolveSize(mFromYType, mFromYValue, height, parentHeight);
+        mToYDelta = resolveSize(mToYType, mToYValue, height, parentHeight);
+
+        mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
+        mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
+    }
+}

+ 8 - 0
app_core/common/src/main/res/anim/anim_activity_back_bottom_in.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+           android:duration="300"
+           android:fromYDelta="100%p"
+           android:toYDelta="0"
+    >
+
+</translate>

+ 8 - 0
app_core/common/src/main/res/anim/anim_activity_back_top_out.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+       android:duration="300"
+       android:fromYDelta="0"
+       android:toYDelta="-100%"
+    >
+
+</translate>

+ 8 - 0
app_core/common/src/main/res/anim/anim_activity_bottom_out.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+       android:duration="300"
+       android:fromYDelta="0"
+       android:toYDelta="100%"
+    >
+
+</translate>

+ 8 - 0
app_core/common/src/main/res/anim/anim_activity_top_in.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+           android:duration="300"
+           android:fromYDelta="-100%p"
+           android:toYDelta="0"
+    >
+
+</translate>

BIN
app_core/common/src/main/res/drawable-hdpi/composer_button_normal.png


BIN
app_core/common/src/main/res/drawable-hdpi/composer_button_pressed.png


BIN
app_core/common/src/main/res/drawable-hdpi/composer_icn_plus_normal.png


BIN
app_core/common/src/main/res/drawable-hdpi/composer_icn_plus_pressed.png


BIN
app_core/common/src/main/res/drawable-xhdpi/composer_button_normal.png


BIN
app_core/common/src/main/res/drawable-xhdpi/composer_button_pressed.png


BIN
app_core/common/src/main/res/drawable-xhdpi/composer_icn_plus_normal.png


BIN
app_core/common/src/main/res/drawable-xhdpi/composer_icn_plus_pressed.png


BIN
app_core/common/src/main/res/drawable-xxhdpi/composer_button_normal.png


BIN
app_core/common/src/main/res/drawable-xxhdpi/composer_button_pressed.png


BIN
app_core/common/src/main/res/drawable-xxhdpi/composer_icn_plus_normal.png


BIN
app_core/common/src/main/res/drawable-xxhdpi/composer_icn_plus_pressed.png


+ 7 - 0
app_core/common/src/main/res/drawable/composer_button.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@drawable/composer_button_pressed" android:state_pressed="true"/>
+    <item android:drawable="@drawable/composer_button_normal"/>
+
+</selector>

+ 7 - 0
app_core/common/src/main/res/drawable/composer_icn_plus.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@drawable/composer_icn_plus_pressed" android:state_pressed="true"/>
+    <item android:drawable="@drawable/composer_icn_plus_normal"/>
+
+</selector>

+ 48 - 0
app_core/common/src/main/res/drawable/progress_vertical_gradient_simple_shape.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:id="@android:id/background">
+        <shape>
+            <size android:width="2dp" />
+            <corners android:radius="5dip" />
+            <gradient
+                android:angle="270"
+                android:centerColor="#AFAFAF"
+                android:centerY="0.75"
+                android:endColor="#AFAFAF"
+                android:startColor="#AFAFAF" />
+        </shape>
+    </item>
+
+    <item android:id="@android:id/secondaryProgress">
+        <clip
+            android:clipOrientation="vertical"
+            android:gravity="top">
+            <shape>
+                <size android:width="4dp" />
+                <corners android:radius="5dip" />
+                <gradient
+                    android:angle="90"
+                    android:endColor="#0051C7"
+                    android:startColor="#0051C7" />
+            </shape>
+        </clip>
+    </item>
+
+    <item android:id="@android:id/progress">
+        <!-- 定义ClipDrawable的剪裁方向为垂直 -->
+        <clip
+            android:clipOrientation="vertical"
+            android:gravity="top">
+            <shape>
+                <size android:width="4dp" />
+                <corners android:radius="5dip" />
+                <gradient
+                    android:angle="90"
+                    android:endColor="#0051C7"
+                    android:startColor="#0051C7" />
+            </shape>
+        </clip>
+    </item>
+
+</layer-list>

+ 9 - 0
app_core/common/src/main/res/drawable/shape_time_helper_indicate.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="oval">
+    <solid android:color="#61B8FF" />
+
+    <size
+        android:width="16dp"
+        android:height="16dp" />
+</shape>

+ 8 - 0
app_core/common/src/main/res/drawable/shape_time_helper_meeting_left.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:topLeftRadius="8dp" />
+    <stroke
+        android:width="2px"
+        android:color="#3A820F" />
+</shape>

+ 6 - 0
app_core/common/src/main/res/drawable/shape_time_helper_meeting_left_title.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">
+    <corners android:bottomRightRadius="8dp" />
+    <solid android:color="#3A820F" />
+</shape>

+ 8 - 0
app_core/common/src/main/res/drawable/shape_time_helper_meeting_right.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:topRightRadius="8dp" />
+    <stroke
+        android:width="2px"
+        android:color="#3A820F" />
+</shape>

+ 6 - 0
app_core/common/src/main/res/drawable/shape_time_helper_meeting_right_title.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">
+    <corners android:bottomLeftRadius="8dp" />
+    <solid android:color="#3A820F" />
+</shape>

+ 8 - 0
app_core/common/src/main/res/drawable/shape_time_helper_order_left.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:topLeftRadius="8dp" />
+    <stroke
+        android:width="2px"
+        android:color="#8B1515" />
+</shape>

+ 6 - 0
app_core/common/src/main/res/drawable/shape_time_helper_order_left_title.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">
+    <corners android:bottomRightRadius="8dp" />
+    <solid android:color="#8B1515" />
+</shape>

+ 8 - 0
app_core/common/src/main/res/drawable/shape_time_helper_order_right.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:topRightRadius="8dp" />
+    <stroke
+        android:width="2px"
+        android:color="#8B1515" />
+</shape>

+ 6 - 0
app_core/common/src/main/res/drawable/shape_time_helper_order_right_title.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">
+    <corners android:bottomLeftRadius="8dp" />
+    <solid android:color="#8B1515" />
+</shape>

+ 8 - 0
app_core/common/src/main/res/drawable/shape_time_helper_schedule_left.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:topLeftRadius="8dp" />
+    <stroke
+        android:width="2px"
+        android:color="#0F5482" />
+</shape>

+ 6 - 0
app_core/common/src/main/res/drawable/shape_time_helper_schedule_left_title.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">
+    <corners android:bottomRightRadius="8dp" />
+    <solid android:color="#105482" />
+</shape>

+ 8 - 0
app_core/common/src/main/res/drawable/shape_time_helper_schedule_right.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:topRightRadius="8dp" />
+    <stroke
+        android:width="2px"
+        android:color="#0F5482" />
+</shape>

+ 6 - 0
app_core/common/src/main/res/drawable/shape_time_helper_schedule_right_title.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">
+    <corners android:bottomLeftRadius="8dp" />
+    <solid android:color="#105482" />
+</shape>

+ 1 - 1
app_core/common/src/main/res/layout/act_staff_query_list.xml

@@ -17,7 +17,7 @@
         android:id="@+id/act_staff_query_refresh_layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        app:srlEnableLoadmore="false"
+        app:srlEnableLoadMore="false"
         app:srlEnablePreviewInEditMode="false">
 
         <com.scwang.smartrefresh.layout.header.ClassicsHeader

+ 30 - 0
app_core/common/src/main/res/layout/arc_menu.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <com.core.widget.arcmenu.ArcLayout
+        android:id="@+id/item_layout"
+        xmlns:custom="http://schemas.android.com/apk/res-auto"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        custom:childSize="45dp"
+        custom:fromDegrees="270.0"
+        custom:toDegrees="360.0" />
+
+    <FrameLayout
+        android:id="@+id/control_layout"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:layout_centerInParent="true"
+        android:background="@drawable/composer_button">
+
+        <ImageView
+            android:id="@+id/control_hint"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:layout_gravity="center"
+            android:duplicateParentState="true"
+            android:src="@drawable/composer_icn_plus" />
+    </FrameLayout>
+
+</merge>

+ 202 - 0
app_core/common/src/main/res/layout/item_list_time_helper.xml

@@ -0,0 +1,202 @@
+<?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="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_horizontal"
+    android:orientation="horizontal">
+
+    <FrameLayout
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:paddingBottom="50dp">
+
+        <LinearLayout
+            android:id="@+id/item_time_helper_order_left_ll"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical|right"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                android:id="@+id/item_time_helper_order_left_tv"
+                style="@style/time_helper_content"
+                android:background="@drawable/shape_time_helper_order_left"
+                tools:text="您预约了赵四"
+                />
+
+            <TextView
+                style="@style/time_helper_title"
+                android:layout_marginLeft="3dp"
+                android:background="@drawable/shape_time_helper_order_left_title"
+                android:text="预\n约"
+                />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/item_time_helper_schedule_left_ll"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical|right"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                android:id="@+id/item_time_helper_schedule_left_tv"
+                style="@style/time_helper_content"
+                android:background="@drawable/shape_time_helper_schedule_left"
+                tools:text="拜访客户张先生"
+                />
+
+            <TextView
+                style="@style/time_helper_title"
+                android:layout_marginLeft="3dp"
+                android:background="@drawable/shape_time_helper_schedule_left_title"
+                android:text="日\n程"
+                />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/item_time_helper_meeting_left_ll"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical|right"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                android:id="@+id/item_time_helper_meeting_left_tv"
+                style="@style/time_helper_content"
+                android:background="@drawable/shape_time_helper_meeting_left"
+                tools:text="股东大会"
+                />
+
+            <TextView
+                style="@style/time_helper_title"
+                android:layout_marginLeft="3dp"
+                android:background="@drawable/shape_time_helper_meeting_left_title"
+                android:text="会\n议"
+                />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/item_time_helper_time_left"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            android:textColor="#5B5B5B"
+            android:textSize="14sp"
+            android:visibility="gone"
+            tools:text="14:00" />
+    </FrameLayout>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+
+        <View
+            android:id="@+id/item_time_helper_indicate"
+            android:layout_width="16dp"
+            android:layout_height="16dp"
+            android:background="@drawable/shape_time_helper_indicate" />
+
+        <ProgressBar
+            android:id="@+id/item_time_helper_progress"
+            android:layout_width="3dp"
+            android:layout_height="match_parent"
+            android:indeterminateOnly="false"
+            android:max="100"
+            android:progress="0"
+            android:progressDrawable="@drawable/progress_vertical_gradient_simple_shape" />
+    </LinearLayout>
+
+    <FrameLayout
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:paddingBottom="50dp">
+
+        <TextView
+            android:id="@+id/item_time_helper_time_right"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="#5B5B5B"
+            android:textSize="14sp"
+            android:visibility="gone"
+            tools:text="14:00" />
+
+        <LinearLayout
+            android:id="@+id/item_time_helper_order_right_ll"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                style="@style/time_helper_title"
+                android:layout_marginRight="3dp"
+                android:background="@drawable/shape_time_helper_order_right_title"
+                android:text="预\n约"
+                />
+
+            <TextView
+                android:id="@+id/item_time_helper_order_right_tv"
+                style="@style/time_helper_content"
+                android:background="@drawable/shape_time_helper_order_right"
+                tools:text="您预约了赵四" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/item_time_helper_schedule_right_ll"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                style="@style/time_helper_title"
+                android:layout_marginRight="3dp"
+                android:background="@drawable/shape_time_helper_schedule_right_title"
+                android:text="日\n程"
+                />
+
+            <TextView
+                android:id="@+id/item_time_helper_schedule_right_tv"
+                style="@style/time_helper_content"
+                android:background="@drawable/shape_time_helper_schedule_right"
+                tools:text="拜访客户张先生" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/item_time_helper_meeting_right_ll"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                style="@style/time_helper_title"
+                android:layout_marginRight="3dp"
+                android:background="@drawable/shape_time_helper_meeting_right_title"
+                android:text="会\n议"
+                />
+
+            <TextView
+                android:id="@+id/item_time_helper_meeting_right_tv"
+                style="@style/time_helper_content"
+                android:background="@drawable/shape_time_helper_meeting_right"
+                tools:text="股东大会" />
+        </LinearLayout>
+    </FrameLayout>
+</LinearLayout>

+ 27 - 0
app_core/common/src/main/res/layout/item_time_helper_setting.xml

@@ -0,0 +1,27 @@
+<?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="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/white"
+    android:gravity="center_vertical"
+    android:orientation="horizontal"
+    android:padding="10dp">
+
+    <TextView
+        android:id="@+id/item_time_helper_setting_tv"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:textColor="#383838"
+        android:textSize="14sp"
+        tools:text="添加日程" />
+
+    <com.core.widget.view.SwitchView
+        android:id="@+id/item_time_helper_setting_sv"
+        android:layout_width="40dp"
+        android:layout_height="25dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true" />
+</LinearLayout>

+ 30 - 0
app_core/common/src/main/res/layout/ray_menu.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <com.core.widget.arcmenu.RayLayout
+        android:id="@+id/item_layout"
+        xmlns:custom="http://schemas.android.com/apk/res-auto"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        custom:childSize="44px"
+        custom:leftHolderWidth="60dp" />
+
+    <FrameLayout
+        android:id="@+id/control_layout"
+        android:layout_width="52dp"
+        android:layout_height="52dp"
+        android:layout_centerVertical="true"
+        android:layout_margin="4dp"
+        android:background="@drawable/composer_button">
+
+        <ImageView
+            android:id="@+id/control_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:duplicateParentState="true"
+            android:src="@drawable/composer_icn_plus" />
+    </FrameLayout>
+
+</merge>

+ 22 - 0
app_core/common/src/main/res/values-zh-rCN/strings.xml

@@ -1689,4 +1689,26 @@
     <string name="str_common_empty_text">暂无记录</string>
     <string name="str_system_admin">系统管理员</string>
     <string name="font_size">字体大小</string>
+
+    <!--smartrefresh-->
+    <string name="srl_header_pulling">下拉可以刷新</string>
+    <string name="srl_header_refreshing">正在刷新…</string>
+    <string name="srl_header_loading">正在加载…</string>
+    <string name="srl_header_release">释放立即刷新</string>
+    <string name="srl_header_finish">刷新完成</string>
+    <string name="srl_header_failed">刷新失败</string>
+    <string name="srl_header_update">上次更新 M-d HH:mm</string>
+    <string name="srl_header_secondary">释放进入二楼</string>
+
+    <string name="srl_footer_pulling">上拉加载更多</string>
+    <string name="srl_footer_release">释放立即加载</string>
+    <string name="srl_footer_loading">正在加载…</string>
+    <string name="srl_footer_refreshing">正在刷新…</string>
+    <string name="srl_footer_finish">加载完成</string>
+    <string name="srl_footer_failed">加载失败</string>
+    <string name="srl_footer_nothing">没有更多数据了</string>
+
+    <string name="srl_content_empty">SmartRefreshLayout中没有找到内容视图。您是否忘记在xml布局文件中添加?</string>
+    <string name="srl_component_falsify" formatted="false">%s 虚假区域\n代表运行时拖动的高度【%.1fdp】 \n而不会显示任何东西</string>
+
 </resources>

+ 145 - 1
app_core/common/src/main/res/values/attrs.xml

@@ -269,6 +269,150 @@
         <attr name="el_expanded" format="boolean" />
         <attr name="el_translate_children" format="boolean" />
         <attr name="layout_expandable" format="boolean" />
-        <attr name="android:orientation"/>
+        <attr name="android:orientation" />
     </declare-styleable>
+
+
+    <!--arcmenu-->
+    <attr name="fromDegrees" format="float|reference" />
+    <attr name="toDegrees" format="float|reference" />
+    <attr name="childSize" format="dimension|reference" />
+
+    <declare-styleable name="ArcLayout">
+        <attr name="fromDegrees" />
+        <attr name="toDegrees" />
+        <attr name="childSize" />
+    </declare-styleable>
+
+    <declare-styleable name="ArcMenu">
+        <attr name="fromDegrees" />
+        <attr name="toDegrees" />
+        <attr name="childSize" />
+    </declare-styleable>
+
+    <declare-styleable name="RayLayout">
+        <attr name="leftHolderWidth" format="dimension" />
+    </declare-styleable>
+
+    <attr name="srlDrawableSize" format="dimension"/><!--图片尺寸-->
+    <attr name="srlDrawableArrowSize" format="dimension"/><!--箭头图片尺寸-->
+    <attr name="srlDrawableProgressSize" format="dimension"/><!--箭头图片尺寸-->
+    <attr name="srlDrawableMarginRight" format="dimension"/><!--图片和文字的间距-->
+    <attr name="srlTextSizeTitle" format="dimension"/><!--标题字体-->
+    <attr name="srlTextSizeTime" format="dimension"/><!--时间字体-->
+    <attr name="srlFinishDuration" format="integer"/><!--完成时停留时间-->
+    <attr name="srlPrimaryColor" format="color"/><!--主要颜色-->
+    <attr name="srlAccentColor" format="color"/><!--强调颜色-->
+    <attr name="srlDrawableArrow" format="reference"/><!--箭头图片-->
+    <attr name="srlDrawableProgress" format="reference"/><!--转动图片-->
+    <attr name="srlEnableHorizontalDrag" format="boolean"/><!--支持水平拖动-->
+
+    <attr name="srlClassicsSpinnerStyle" format="enum">
+        <enum name="Translate" value="0"/><!--平行移动-->
+        <enum name="Scale" value="1"/><!--拉伸形变-->
+        <enum name="FixedBehind" value="2"/><!--固定在背后-->
+    </attr>
+
+    <attr name="layout_srlSpinnerStyle" format="enum">
+        <enum name="Translate" value="0"/><!--平行移动-->
+        <enum name="Scale" value="1"/><!--拉伸形变-->
+        <enum name="FixedBehind" value="2"/><!--固定在背后-->
+        <enum name="FixedFront" value="3"/><!--固定在前面-->
+        <enum name="MatchLayout" value="4"/><!--填满布局-->
+    </attr>
+
+    <declare-styleable name="SmartRefreshLayout">
+        <attr name="srlPrimaryColor"/>
+        <attr name="srlAccentColor"/>
+        <attr name="srlReboundDuration" format="integer"/>
+        <attr name="srlHeaderHeight" format="dimension"/>
+        <attr name="srlFooterHeight" format="dimension"/>
+        <attr name="srlHeaderInsetStart" format="dimension"/>
+        <attr name="srlFooterInsetStart" format="dimension"/>
+        <attr name="srlDragRate" format="float"/>
+        <attr name="srlHeaderMaxDragRate" format="float"/>
+        <attr name="srlFooterMaxDragRate" format="float"/>
+        <attr name="srlHeaderTriggerRate" format="float"/>
+        <attr name="srlFooterTriggerRate" format="float"/>
+        <attr name="srlEnableRefresh" format="boolean"/>
+        <attr name="srlEnableLoadMore" format="boolean"/>
+        <attr name="srlEnableHeaderTranslationContent" format="boolean"/>
+        <attr name="srlEnableFooterTranslationContent" format="boolean"/>
+        <attr name="srlHeaderTranslationViewId" format="reference"/>
+        <attr name="srlFooterTranslationViewId" format="reference"/>
+        <attr name="srlEnablePreviewInEditMode" format="boolean"/>
+        <attr name="srlEnableAutoLoadMore" format="boolean"/>
+        <attr name="srlEnableOverScrollBounce" format="boolean"/>
+        <attr name="srlEnablePureScrollMode" format="boolean"/>
+        <attr name="srlEnableNestedScrolling" format="boolean"/>
+        <attr name="srlEnableScrollContentWhenLoaded" format="boolean"/>
+        <attr name="srlEnableScrollContentWhenRefreshed" format="boolean"/>
+        <attr name="srlEnableLoadMoreWhenContentNotFull" format="boolean"/>
+        <attr name="srlEnableFooterFollowWhenLoadFinished" format="boolean"/>
+        <attr name="srlEnableClipHeaderWhenFixedBehind" format="boolean"/>
+        <attr name="srlEnableClipFooterWhenFixedBehind" format="boolean"/>
+        <attr name="srlEnableOverScrollDrag" format="boolean"/>
+        <attr name="srlDisableContentWhenRefresh" format="boolean"/>
+        <attr name="srlDisableContentWhenLoading" format="boolean"/>
+        <attr name="srlFixedHeaderViewId" format="reference"/>
+        <attr name="srlFixedFooterViewId" format="reference"/>
+    </declare-styleable>
+
+    <declare-styleable name="SmartRefreshLayout_Layout">
+        <attr name="layout_srlSpinnerStyle"/>
+        <attr name="layout_srlBackgroundColor" format="color"/>
+    </declare-styleable>
+
+    <declare-styleable name="BezierRadarHeader">
+        <attr name="srlPrimaryColor"/>
+        <attr name="srlAccentColor"/>
+        <attr name="srlEnableHorizontalDrag"/>
+    </declare-styleable>
+
+    <declare-styleable name="BallPulseFooter">
+        <attr name="srlClassicsSpinnerStyle"/>
+        <attr name="srlAnimatingColor" format="color"/>
+        <attr name="srlNormalColor" format="color"/>
+    </declare-styleable>
+
+    <declare-styleable name="ClassicsHeader">
+        <attr name="srlClassicsSpinnerStyle"/>
+        <attr name="srlPrimaryColor"/>
+        <attr name="srlAccentColor"/>
+        <attr name="srlFinishDuration"/>
+        <attr name="srlDrawableArrow"/>
+        <attr name="srlDrawableProgress"/>
+        <attr name="srlDrawableMarginRight"/>
+        <attr name="srlDrawableSize"/>
+        <attr name="srlDrawableArrowSize"/>
+        <attr name="srlDrawableProgressSize"/>
+        <attr name="srlTextSizeTitle"/>
+        <attr name="srlTextSizeTime"/>
+        <attr name="srlTextTimeMarginTop" format="dimension"/>
+        <attr name="srlEnableLastTime" format="boolean"/>
+    </declare-styleable>
+
+    <declare-styleable name="ClassicsFooter">
+        <attr name="srlClassicsSpinnerStyle"/>
+        <attr name="srlPrimaryColor"/>
+        <attr name="srlAccentColor"/>
+        <attr name="srlFinishDuration"/>
+        <attr name="srlTextSizeTitle"/>
+        <attr name="srlDrawableArrow"/>
+        <attr name="srlDrawableProgress"/>
+        <attr name="srlDrawableMarginRight"/>
+        <attr name="srlDrawableSize"/>
+        <attr name="srlDrawableArrowSize"/>
+        <attr name="srlDrawableProgressSize"/>
+    </declare-styleable>
+
+    <declare-styleable name="TwoLevelHeader">
+        <attr name="srlMaxRage" format="float"/>
+        <attr name="srlFloorRage" format="float"/>
+        <attr name="srlRefreshRage" format="float"/>
+        <attr name="srlFloorDuration" format="integer"/>
+        <attr name="srlEnableTwoLevel" format="boolean"/>
+        <attr name="srlEnablePullToCloseTwoLevel" format="boolean"/>
+    </declare-styleable>
+
 </resources>

+ 21 - 0
app_core/common/src/main/res/values/strings.xml

@@ -2037,4 +2037,25 @@
     <string name="str_system_admin">系统管理员</string>
     <string name="font_size">字体大小</string>
     <!--end s商家设置-->
+
+    <!--smartrefresh-->
+    <string name="srl_header_pulling">Pull Down To Refresh</string>
+    <string name="srl_header_release">Release To Refresh</string>
+    <string name="srl_header_refreshing">Refreshing…</string>
+    <string name="srl_header_loading">Loading…</string>
+    <string name="srl_header_finish">Refresh Success</string>
+    <string name="srl_header_failed">Refresh Failed</string>
+    <string name="srl_header_update">\'Last Update\' M-d HH:mm</string>
+    <string name="srl_header_secondary">Release To Second Floor</string>
+
+    <string name="srl_footer_pulling">Pull Up To Load More</string>
+    <string name="srl_footer_release">Release To Load More</string>
+    <string name="srl_footer_loading">Loading…</string>
+    <string name="srl_footer_refreshing">Refreshing…</string>
+    <string name="srl_footer_finish">Load Success</string>
+    <string name="srl_footer_failed">Load Failed</string>
+    <string name="srl_footer_nothing">No More Data</string>
+
+    <string name="srl_content_empty">The content view in SmartRefreshLayout is empty. Do you forget to add it in xml layout file?</string>
+    <string name="srl_component_falsify" formatted="false">%s falsify area,\n Represents the height[%.1fdp] of drag at run time,\n It does not show anything.</string>
 </resources>

+ 18 - 0
app_core/common/src/main/res/values/styles.xml

@@ -1355,4 +1355,22 @@
         <item name="actionMenuTextColor">#ffffff</item>
         <item name="android:windowBackground">@color/base_bg</item>
     </style>
+
+    <style name="time_helper_content">
+        <item name="android:layout_width">120dp</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:gravity">center</item>
+        <item name="android:padding">6dp</item>
+        <item name="android:textColor">#282828</item>
+        <item name="android:textSize">13sp</item>
+    </style>
+
+    <style name="time_helper_title">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:gravity">center</item>
+        <item name="android:padding">3dp</item>
+        <item name="android:textColor">#FFFFFF</item>
+        <item name="android:textSize">15sp</item>
+    </style>
 </resources>

+ 23 - 22
app_modular/appme/src/main/java/com/uas/appme/settings/activity/SettingActivity.java

@@ -424,7 +424,7 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
             } else {
                 dialog.setMessage(getString(R.string.set_check_update_wait));
                 dialog.show();
-                
+
                 BDAutoUpdateSDK.cpUpdateCheck(this, new MyCPCheckUpdateCallback());
 //                BDAutoUpdateSDK.uiUpdateAction(this, new UICheckUpdateCallback() {
 //                    @Override
@@ -749,8 +749,8 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
 
         @Override
         public void onPercent(int percent, long rcvLen, long fileSize) {
-            LogUtil.d("SettingActivity","percent:"+percent+"fileSize:"+Integer.valueOf(String.valueOf(fileSize))+" rcvLen:"+rcvLen);
-            NotifyUtil.buildProgress(102,R.drawable.uuu,"正在下载,共"+byteToMb(fileSize),percent,100).show();
+            LogUtil.d("SettingActivity", "percent:" + percent + "fileSize:" + Integer.valueOf(String.valueOf(fileSize)) + " rcvLen:" + rcvLen);
+            NotifyUtil.buildProgress(102, R.drawable.uuu, "正在下载,共" + byteToMb(fileSize), percent, 100).show();
         }
 
         @Override
@@ -765,7 +765,7 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
 
     }
 
-    private static  String byteToMb(long fileSize) {
+    private static String byteToMb(long fileSize) {
         float size = ((float) fileSize) / (1024f * 1024f);
         return String.format("%.2fMB", size);
     }
@@ -782,24 +782,25 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
             if (infoForInstall != null && !TextUtils.isEmpty(infoForInstall.getInstallPath())) {
                 BDAutoUpdateSDK.cpUpdateInstall(getApplicationContext(), infoForInstall.getInstallPath());
             } else if (info != null) {
-                showUpdateVersionPopup(SettingActivity.this,info);
+                showUpdateVersionPopup(SettingActivity.this, info);
             } else {
                 PopupWindowHelper.showAlart(SettingActivity.this,
-                                getString(R.string.app_dialog_title), getString(R.string.set_isnewVersion)
-                                , new PopupWindowHelper.OnSelectListener() {
-                                    @Override
-                                    public void select(boolean selectOk) {
-                                      dialog.dismiss();
-                                    }
-                                });
+                        getString(R.string.app_dialog_title), getString(R.string.set_isnewVersion)
+                        , new PopupWindowHelper.OnSelectListener() {
+                            @Override
+                            public void select(boolean selectOk) {
+                                dialog.dismiss();
+                            }
+                        });
             }
             dialog.dismiss();
         }
-}
+    }
 
 
     public static PopupWindow updatePopupWindow = null;
-    public static void  showUpdateVersionPopup(final Activity activity, final AppUpdateInfo info){
+
+    public static void showUpdateVersionPopup(final Activity activity, final AppUpdateInfo info) {
         updatePopupWindow = null;
         View view = null;
         Button bt_update;
@@ -810,17 +811,17 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
         if (updatePopupWindow == null) {
             LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             view = layoutInflater.inflate(R.layout.pop_update_version, null);
-            bt_update=view.findViewById(R.id.bt_update);
-            bt_noUpdate=view.findViewById(R.id.bt_noUpdate);
-            tv_update_content=view.findViewById(R.id.tv_update_content);
-            tv_apkVersion=view.findViewById(R.id.tv_apkVersion);
-            tv_apkVersion.setText( SystemUtil.getVersionName(activity)+"-->v"+info.getAppVersionName()+"/"+byteToMb(info.getAppSize()));
+            bt_update = view.findViewById(R.id.bt_update);
+            bt_noUpdate = view.findViewById(R.id.bt_noUpdate);
+            tv_update_content = view.findViewById(R.id.tv_update_content);
+            tv_apkVersion = view.findViewById(R.id.tv_apkVersion);
+            tv_apkVersion.setText(SystemUtil.getVersionName(activity) + "-->v" + info.getAppVersionName() + "/" + byteToMb(info.getAppSize()));
             tv_update_content.setText(info.getAppChangeLog());
             bt_update.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View view) {
                     updatePopupWindow.dismiss();
-                    ToastUtil.showToast(MyApplication.getInstance(),"开始下载...");
+                    ToastUtil.showToast(MyApplication.getInstance(), "开始下载...");
                     BDAutoUpdateSDK.cpUpdateDownload(activity, info, new UpdateDownloadCallback());
                 }
             });
@@ -846,6 +847,6 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
         updatePopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
         updatePopupWindow.showAtLocation(activity.getWindow().getDecorView(), Gravity.CENTER, 0, 0);
     }
- 
- 
+
+
 }

+ 9 - 0
app_modular/appworks/src/main/AndroidManifest.xml

@@ -482,6 +482,15 @@
         <activity android:name=".activity.InviteRegisterListActivity" />
         <activity android:name=".activity.RegisterDetailActivity" />
         <activity android:name=".activity.EnterpriseInviteStatisticsActivity" />
+
+        <!--时间助手-->
+        <activity android:name=".activity.TimeHelperActivity">
+            <intent-filter>
+                <action android:name="com.modular.work.TimeHelperActivity" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".activity.TimeHelperSettingActivity" />
     </application>
 
 </manifest>

+ 1 - 4
app_modular/appworks/src/main/java/com/uas/appworks/activity/CityIndustryServiceMainActivity.java

@@ -33,7 +33,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.common.LogUtil;
 import com.common.data.JSONUtil;
 import com.core.base.activity.BaseMVPActivity;
-import com.core.net.http.http.Request;
 import com.core.utils.CommonUtil;
 import com.core.utils.SpanUtils;
 import com.core.utils.StatusBarUtil;
@@ -63,8 +62,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import retrofit2.http.GET;
-
 /**
  * @author RaoMeng
  * @describe 智慧产城首页
@@ -293,7 +290,7 @@ public class CityIndustryServiceMainActivity extends BaseMVPActivity<WorkPlatPre
 
     @Override
     protected void initData() {
-        mRefreshLayout.autoRefresh(400, 1f);
+        mRefreshLayout.autoRefresh(400, 1, 1f);
 
         initTextSwitcher();
     }

+ 6 - 6
app_modular/appworks/src/main/java/com/uas/appworks/activity/CompanyBusinessListActivity.java

@@ -25,7 +25,7 @@ import com.me.network.app.base.HttpParams;
 import com.me.network.app.http.HttpRequest;
 import com.me.network.app.http.Method;
 import com.scwang.smartrefresh.layout.api.RefreshLayout;
-import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener;
+import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
 import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
 import com.uas.appworks.R;
 import com.uas.appworks.adapter.B2bBusinessListAdapter;
@@ -71,8 +71,8 @@ public class CompanyBusinessListActivity extends BaseMVPActivity<SimplePresenter
         mEnuu = CommonUtil.getSharedPreferences(mContext, Constants.CACHE.B2B_BUSINESS_ENUU);
         mRecyclerView = $(R.id.b2b_list_rv);
         mRefreshLayout = $(R.id.b2b_list_refreshlayout);
-        mRefreshLayout.setEnableAutoLoadmore(true);
-        mRefreshLayout.setEnableLoadmoreWhenContentNotFull(true);
+        mRefreshLayout.setEnableAutoLoadMore(true);
+        mRefreshLayout.setEnableLoadMoreWhenContentNotFull(true);
 
         mB2BBusinessListBeans = new ArrayList<>();
         mB2BBusinessListAdapter = new B2bBusinessListAdapter(mContext, mB2BBusinessListBeans);
@@ -171,15 +171,15 @@ public class CompanyBusinessListActivity extends BaseMVPActivity<SimplePresenter
             }
         });
 
-        mRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
+        mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
             @Override
-            public void onLoadmore(RefreshLayout refreshLayout) {
+            public void onLoadMore(RefreshLayout refreshLayout) {
                 if (CommonUtil.isNetWorkConnected(mContext)) {
                     mPageIndex++;
                     getListData(mPageIndex, mKeyWord);
                 } else {
                     toast(R.string.networks_out);
-                    mRefreshLayout.finishLoadmore(500, false);
+                    mRefreshLayout.finishLoadMore(500, false, false);
                 }
             }
         });

+ 49 - 7
app_modular/appworks/src/main/java/com/uas/appworks/activity/DeviceQueryActivity.java

@@ -17,6 +17,7 @@ import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.afollestad.materialdialogs.MaterialDialog;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -25,6 +26,7 @@ import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
 import com.core.app.Constants;
+import com.core.app.MyApplication;
 import com.core.base.activity.BaseMVPActivity;
 import com.core.dao.historical.HistoricalRecordBean;
 import com.core.dao.historical.HistoricalRecordDao;
@@ -37,6 +39,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase;
 import com.handmark.pulltorefresh.library.PullToRefreshListView;
 import com.me.network.app.base.HttpParams;
 import com.me.network.app.http.Method;
+import com.uas.appworks.CRM.erp.activity.ScanDetailActivity;
 import com.uas.appworks.OA.erp.activity.CommonDocDetailsActivity;
 import com.uas.appworks.R;
 import com.uas.appworks.adapter.DeviceQueryConditionAdapter;
@@ -212,7 +215,7 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 int reallyPosition = (int) parent.getItemIdAtPosition(position);
                 if (Constants.FLAG.DEVICE_FROM_COMMON.equals(mWhichPage)) {
-                    String keyValue = null, status = null, title=null;
+                    String keyValue = null, status = null, title = null;
                     if (ListUtils.getSize(mDeviceQueryFlexAdapter.getRowChildBeans()) <= reallyPosition)
                         return;
                     List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = mDeviceQueryFlexAdapter.getRowChildBeans().get(reallyPosition);
@@ -233,10 +236,24 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                     startActivityForResult(new Intent(mContext, CommonDocDetailsActivity.class)
                             .putExtra("caller", mCaller)
                             .putExtra("keyValue", keyValue)
-                            .putExtra("title", StringUtil.isEmpty(title)?"单据":title)
+                            .putExtra("title", StringUtil.isEmpty(title) ? "单据" : title)
                             .putExtra("device", true)
                             .putExtra("status", status), 0x981);
 
+                } else if (Constants.FLAG.DEVICE_FROM_QUERY.equals(mWhichPage)) {
+                    String decode = null;
+                    if (ListUtils.getSize(mDeviceQueryFlexAdapter.getRowChildBeans()) <= reallyPosition) {
+                        return;
+                    }
+                    List<DataInquiryFlexBean.RowBean.RowChildBean> childBeans = mDeviceQueryFlexAdapter.getRowChildBeans().get(reallyPosition);
+                    for (DataInquiryFlexBean.RowBean.RowChildBean rowChildBean : childBeans) {
+                        if ("de_code".equals(rowChildBean.getField())) {
+                            decode = rowChildBean.getValue();
+                            break;
+                        }
+                    }
+
+                    startActivityForResult(new Intent(ct, ScanDetailActivity.class).putExtra("decode", decode), 0x22);
                 } else {
                     if (CommonUtil.isRepeatClick()) {
                         if (mOldPosition == reallyPosition) {
@@ -481,9 +498,34 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
         if (requestCode == 0x981) {
             mPageIndex = 1;
             obtainDeviceList();
+        } else if (requestCode == 0x22) {
+            if (data != null) {
+                showDialog(data.getStringExtra("data"));
+            }
         }
     }
 
+    private void showDialog(String message) {
+        if (StringUtil.isEmpty(message)) return;
+        new MaterialDialog.Builder(ct)
+                .title(R.string.app_dialog_title)
+                .content(message)
+                .positiveText(MyApplication.getInstance().getString(R.string.app_dialog_ok))
+                .autoDismiss(false)
+                .callback(new MaterialDialog.ButtonCallback() {
+                    @Override
+                    public void onPositive(MaterialDialog dialog) {
+                        dialog.dismiss();
+
+                    }
+
+                    @Override
+                    public void onNegative(MaterialDialog dialog) {
+                        dialog.dismiss();
+                    }
+                }).show();
+    }
+
     @NonNull
     private SchemeConditionBean initCondition(String caption, String field, String type) {
         ArrayList<SchemeConditionBean.Property> properties = new ArrayList<>();
@@ -512,10 +554,10 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
                 } else {
                     mCondition = "";
                     for (int i = 0; i < mfuzzyConditionBeans.size(); i++) {
-                        mCondition = mCondition + "("
+                        mCondition = mCondition + "(upper("
                                 + (TextUtils.isEmpty(mfuzzyConditionBeans.get(i).getTable()) ? "" : (mfuzzyConditionBeans.get(i).getTable() + "."))
                                 + mfuzzyConditionBeans.get(i).getField()
-                                + " like \'%" + fuzzyField + "%\') or ";
+                                + ") like upper(\'%" + fuzzyField + "%\')) or ";
                     }
                     if (mCondition.length() >= 4) {
                         mCondition = mCondition.substring(0, mCondition.length() - 4);
@@ -885,11 +927,11 @@ public class DeviceQueryActivity extends BaseMVPActivity<WorkPlatPresenter> impl
             } else {
                 if (schemeConditionBean.getProperties().size() == 1) {
                     if (!TextUtils.isEmpty(schemeConditionBean.getProperties().get(0).getDisplay())) {
-                        mCondition = mCondition + "("
+                        mCondition = mCondition + "(upper("
                                 + (TextUtils.isEmpty(schemeConditionBean.getTable()) ? "" : (schemeConditionBean.getTable() + "."))
                                 + schemeConditionBean.getField()
-                                + " like \'%" + schemeConditionBean.getProperties().get(0).getDisplay()
-                                + "%\') and ";
+                                + ") like upper(\'%" + schemeConditionBean.getProperties().get(0).getDisplay()
+                                + "%\')) and ";
                     }
                 }
             }

+ 8 - 8
app_modular/appworks/src/main/java/com/uas/appworks/activity/InviteRegisterListActivity.java

@@ -30,7 +30,7 @@ import com.me.network.app.http.HttpRequest;
 import com.me.network.app.http.Method;
 import com.modular.apputils.utils.RecyclerItemDecoration;
 import com.scwang.smartrefresh.layout.api.RefreshLayout;
-import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener;
+import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
 import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
 import com.uas.appworks.R;
 import com.uas.appworks.adapter.InviteRegisterListAdapter;
@@ -76,10 +76,10 @@ public class InviteRegisterListActivity extends BaseMVPActivity<WorkPlatPresente
                 setTitle(R.string.invite_detail);
                 mListState = "";
             } else if (mState == Constants.FLAG.STATE_REGISTER) {
-               setTitle(R.string.register_detail);
+                setTitle(R.string.register_detail);
                 mListState = "done";
             } else if (mState == Constants.FLAG.STATE_UNREGISTER) {
-             setTitle(R.string.unregister_detail);
+                setTitle(R.string.unregister_detail);
                 mListState = "todo";
             }
         }
@@ -87,8 +87,8 @@ public class InviteRegisterListActivity extends BaseMVPActivity<WorkPlatPresente
         mSearchEt = (ClearEditText) $(R.id.invite_register_list_search_et);
         mVoiceIv = (ImageView) $(R.id.invite_register_list_search_voice_iv);
         mRefreshLayout = (RefreshLayout) $(R.id.invite_register_list_refresh);
-        mRefreshLayout.setEnableAutoLoadmore(true);
-        mRefreshLayout.setEnableLoadmoreWhenContentNotFull(true);
+        mRefreshLayout.setEnableAutoLoadMore(true);
+        mRefreshLayout.setEnableLoadMoreWhenContentNotFull(true);
 
         mRecyclerView = (RecyclerView) $(R.id.invite_register_list_rv);
         mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -121,12 +121,12 @@ public class InviteRegisterListActivity extends BaseMVPActivity<WorkPlatPresente
             }
         });
 
-        mRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
+        mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
             @Override
-            public void onLoadmore(RefreshLayout refreshLayout) {
+            public void onLoadMore(RefreshLayout refreshLayout) {
                 if (!CommonUtil.isNetWorkConnected(mContext)) {
                     toast(R.string.networks_out);
-                    mRefreshLayout.finishLoadmore(500, false);
+                    mRefreshLayout.finishLoadMore(500, false, false);
                 } else {
                     mPageIndex++;
                     requestList();

+ 279 - 0
app_modular/appworks/src/main/java/com/uas/appworks/activity/TimeHelperActivity.java

@@ -0,0 +1,279 @@
+package com.uas.appworks.activity;
+
+import android.graphics.drawable.AnimationDrawable;
+import android.support.v7.widget.AppCompatTextView;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.CalendarUtil;
+import com.common.data.DateFormatUtil;
+import com.common.data.JSONUtil;
+import com.core.app.MyApplication;
+import com.core.base.activity.BaseMVPActivity;
+import com.core.base.presenter.SimplePresenter;
+import com.core.base.view.SimpleView;
+import com.core.widget.arcmenu.ArcMenu;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.Method;
+import com.uas.appworks.R;
+import com.uas.appworks.adapter.TimeHelperAdapter;
+import com.uas.appworks.model.bean.TimeHelperBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author RaoMeng
+ * @describe 时间助手页面
+ * @date 2018/8/21 15:02
+ */
+public class TimeHelperActivity extends BaseMVPActivity<SimplePresenter> implements SimpleView {
+    private static final int FLAG_GETBYDAY_SCHEDULE = 0x11;
+
+    private ArcMenu mArcMenu;
+    private static final int[] ITEM_DRAWABLES = {R.drawable.ic_timehelper_metting, R.drawable.ic_timehelper_order,
+            R.drawable.ic_timehelper_schedule};
+    private RecyclerView mRecyclerView;
+    private ImageView mBottomImageView;
+    private View mGrayView;
+    private List<TimeHelperBean> mTimeHelperBeans;
+    private TimeHelperAdapter mTimeHelperAdapter;
+    private AnimationDrawable mAnimationDrawable;
+    private View mEmptyView;
+    private AppCompatTextView mEmptyTextView;
+    private TextView mDateTextView;
+
+    @Override
+    protected int getLayout() {
+        return R.layout.activity_time_helper;
+    }
+
+    @Override
+    protected void initView() {
+        setTitle("时间助手");
+
+        mArcMenu = $(R.id.time_helper_arcmenu);
+        mDateTextView = $(R.id.time_helper_date_tv);
+        mRecyclerView = $(R.id.time_helper_rv);
+        mBottomImageView = $(R.id.time_helper_bottom_iv);
+        mBottomImageView.setImageResource(R.drawable.animlist_time_helper_icon);
+        mAnimationDrawable = (AnimationDrawable) mBottomImageView.getDrawable();
+
+        mGrayView = $(R.id.time_helper_gray_view);
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+
+        mTimeHelperBeans = new ArrayList<>();
+        mTimeHelperAdapter = new TimeHelperAdapter(mTimeHelperBeans);
+        mRecyclerView.setAdapter(mTimeHelperAdapter);
+
+        mEmptyView = View.inflate(this, R.layout.common_empty_view, null);
+        mEmptyTextView = mEmptyView.findViewById(R.id.emptyTv);
+    }
+
+    @Override
+    protected SimplePresenter initPresenter() {
+        return new SimplePresenter();
+    }
+
+    @Override
+    protected void initEvent() {
+        mArcMenu.setOnMenuClickListener(new ArcMenu.OnMenuClickListener() {
+            @Override
+            public void onMenuClick(boolean isExpanded) {
+                if (isExpanded) {
+                    mGrayView.setVisibility(View.VISIBLE);
+                } else {
+                    mGrayView.setVisibility(View.GONE);
+                }
+            }
+        });
+
+        mGrayView.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View view, MotionEvent motionEvent) {
+                return true;
+            }
+        });
+
+        mBottomImageView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onBackPressed();
+            }
+        });
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        mAnimationDrawable.start();
+    }
+
+    @Override
+    protected void initData() {
+        //添加弹出按钮
+        final int itemCount = ITEM_DRAWABLES.length;
+        for (int i = 0; i < itemCount; i++) {
+            ImageView item = new ImageView(this);
+            item.setImageResource(ITEM_DRAWABLES[i]);
+
+            final int position = i;
+            mArcMenu.addItem(item, new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    mGrayView.setVisibility(View.GONE);
+                    switch (position) {
+                        case 0:
+                            toast("创建会议");
+                            break;
+                        case 1:
+                            toast("创建预约");
+                            break;
+                        case 2:
+                            toast("创建日程");
+                            break;
+                    }
+                }
+            });
+        }
+
+        String currentDate = DateFormatUtil.long2Str(System.currentTimeMillis(), "MM月dd日");
+        String currentWeek = CalendarUtil.getWeek(System.currentTimeMillis());
+        mDateTextView.setText(currentDate + "(" + currentWeek + ")");
+
+        getByDaySchedule(DateFormatUtil.long2Str(1535320567000L, DateFormatUtil.YMD));
+    }
+
+    private void getByDaySchedule(String day) {
+        mPresenter.httpRequest(mContext, "http://192.168.253.230:8080/",
+                new HttpParams.Builder()
+                        .url("schedule/schedule/getByDaySchedule")
+                        .method(Method.GET)
+                        .flag(FLAG_GETBYDAY_SCHEDULE)
+                        .addParam("imid", MyApplication.getInstance().getLoginUserId())
+                        .addParam("day", day).build());
+    }
+
+    @Override
+    public void requestSuccess(int what, Object object) {
+        try {
+            String result = object.toString();
+            switch (what) {
+                case FLAG_GETBYDAY_SCHEDULE:
+                    if (JSONUtil.validate(result)) {
+                        mTimeHelperBeans.clear();
+                        JSONObject resultObject = JSON.parseObject(result);
+                        JSONArray dataArray = resultObject.getJSONArray("data");
+                        if (dataArray != null && dataArray.size() > 0) {
+                            for (int i = 0; i < dataArray.size(); i++) {
+                                JSONObject dataObject = dataArray.getJSONObject(i);
+                                if (dataObject != null) {
+                                    TimeHelperBean timeHelperBean = new TimeHelperBean();
+                                    timeHelperBean.setScheduleId(JSONUtil.getInt(dataObject, "scheduleId"));
+                                    timeHelperBean.setImid(JSONUtil.getInt(dataObject, "imid"));
+                                    timeHelperBean.setType(JSONUtil.getText(dataObject, "type"));
+                                    timeHelperBean.setAllDay(JSONUtil.getInt(dataObject, "allDay"));
+                                    timeHelperBean.setRepeat(JSONUtil.getText(dataObject, "repeat"));
+                                    timeHelperBean.setTitle(JSONUtil.getText(dataObject, "title"));
+                                    timeHelperBean.setTag(JSONUtil.getText(dataObject, "tag"));
+                                    timeHelperBean.setRemarks(JSONUtil.getText(dataObject, "remarks"));
+                                    timeHelperBean.setStartTime(JSONUtil.getText(dataObject, "startTime"));
+                                    timeHelperBean.setEndTime(JSONUtil.getText(dataObject, "endTime"));
+                                    timeHelperBean.setWarnTime(JSONUtil.getInt(dataObject, "warnTime"));
+                                    timeHelperBean.setWarnRealTime(JSONUtil.getText(dataObject, "warnRealTime"));
+                                    timeHelperBean.setAddress(JSONUtil.getText(dataObject, "address"));
+                                    timeHelperBean.setStatus(JSONUtil.getInt("status"));
+
+                                    mTimeHelperBeans.add(timeHelperBean);
+                                }
+                            }
+
+                            mTimeHelperAdapter.setTimeProgress(1, 50);
+
+                            mTimeHelperAdapter.notifyDataSetChanged();
+                            if (mTimeHelperBeans.size() == 0) {
+                                mEmptyTextView.setText("您今日的日程为空");
+                                mTimeHelperAdapter.setEmptyView(mEmptyView);
+                            }
+                        } else {
+                            mEmptyTextView.setText("您今日的日程为空");
+                            mTimeHelperAdapter.setEmptyView(mEmptyView);
+                        }
+                    }
+
+                    break;
+            }
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Override
+    public void requestError(int what, String errorMsg) {
+        try {
+            switch (what) {
+                case FLAG_GETBYDAY_SCHEDULE:
+                    toast(errorMsg);
+                    break;
+            }
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Override
+    public void showLoading(String loadStr) {
+        progressDialog.show();
+    }
+
+    @Override
+    public void hideLoading() {
+        progressDialog.dismiss();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.menu_time_helper, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            finish();
+            overridePendingTransition(R.anim.anim_activity_back_bottom_in, R.anim.anim_activity_back_top_out);
+            return true;
+        } else if (item.getItemId() == R.id.menu_time_helper_setting) {
+            startActivity(TimeHelperSettingActivity.class);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onBackPressed() {
+        super.onBackPressed();
+        overridePendingTransition(R.anim.anim_activity_back_bottom_in, R.anim.anim_activity_back_top_out);
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        overridePendingTransition(R.anim.anim_activity_back_bottom_in, R.anim.anim_activity_back_top_out);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mAnimationDrawable.stop();
+    }
+}

+ 205 - 0
app_modular/appworks/src/main/java/com/uas/appworks/activity/TimeHelperSettingActivity.java

@@ -0,0 +1,205 @@
+package com.uas.appworks.activity;
+
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.core.app.MyApplication;
+import com.core.base.activity.BaseMVPActivity;
+import com.core.base.presenter.SimplePresenter;
+import com.core.base.view.SimpleView;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.Method;
+import com.modular.apputils.utils.RecyclerItemDecoration;
+import com.uas.appworks.R;
+import com.uas.appworks.adapter.TimeHelperSettingAdapter;
+import com.uas.appworks.model.bean.TimeHelperSettingBean;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author RaoMeng
+ * @describe 时间助手设置页面
+ * @date 2018/8/27 17:51
+ */
+public class TimeHelperSettingActivity extends BaseMVPActivity<SimplePresenter> implements SimpleView {
+    private static final int FLAG_LOADCONFIG = 0x21;
+    private static final int FLAG_SAVECONFIG = 0x22;
+
+    private RecyclerView mRecyclerView;
+    private List<TimeHelperSettingBean> mTimeHelperSettingBeans;
+    private TimeHelperSettingAdapter mTimeHelperSettingAdapter;
+    private Map<String, Integer> mSettings = new HashMap<>();
+
+    @Override
+    protected int getLayout() {
+        return R.layout.activity_time_helper_setting;
+    }
+
+    @Override
+    protected void initView() {
+        setTitle("添加到时间助手");
+
+        mRecyclerView = $(R.id.time_helper_setting_rv);
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.addItemDecoration(new RecyclerItemDecoration(1));
+        mTimeHelperSettingBeans = new ArrayList<>();
+        mTimeHelperSettingAdapter = new TimeHelperSettingAdapter(mTimeHelperSettingBeans);
+        mRecyclerView.setAdapter(mTimeHelperSettingAdapter);
+    }
+
+    @Override
+    protected SimplePresenter initPresenter() {
+        return new SimplePresenter();
+    }
+
+    @Override
+    protected void initEvent() {
+
+    }
+
+    @Override
+    protected void initData() {
+        mPresenter.httpRequest(this, "http://192.168.253.230:8080/",
+                new HttpParams.Builder()
+                        .url("schedule/config/loadConfig")
+                        .method(Method.GET)
+                        .flag(FLAG_LOADCONFIG)
+                        .addParam("imid", MyApplication.getInstance().getLoginUserId())
+                        .build());
+    }
+
+    @Override
+    public void requestSuccess(int what, Object object) {
+        try {
+            switch (what) {
+                case FLAG_LOADCONFIG:
+                    analysisLoadConfig(object);
+                    break;
+                case FLAG_SAVECONFIG:
+                    toast("保存成功");
+                    break;
+            }
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Override
+    public void requestError(int what, String errorMsg) {
+        switch (what) {
+            case FLAG_LOADCONFIG:
+            case FLAG_SAVECONFIG:
+                toast(errorMsg);
+                break;
+        }
+    }
+
+    private void analysisLoadConfig(Object object) {
+        if (object == null) {
+            toast("用户配置获取失败");
+            return;
+        }
+        String result = object.toString();
+        Log.d("timehelperconfig", result);
+        if (!JSONUtil.validate(result)) {
+            toast("用户配置获取失败");
+            return;
+        }
+        JSONObject resultObject = JSON.parseObject(result);
+        JSONObject dataObject = resultObject.getJSONObject("data");
+        if (dataObject == null) {
+            toast("用户配置获取失败");
+            return;
+        }
+        Set<String> keys = dataObject.keySet();
+        if (keys == null) {
+            toast("用户配置获取失败");
+            return;
+        }
+        Iterator<String> iterator = keys.iterator();
+        while (iterator.hasNext()) {
+            TimeHelperSettingBean timeHelperSettingBean = new TimeHelperSettingBean();
+            String next = iterator.next();
+            switch (next) {
+                case "schedule":
+                    timeHelperSettingBean.setName("日程");
+                    break;
+                case "meeting":
+                    timeHelperSettingBean.setName("会议");
+                    break;
+                case "book":
+                    timeHelperSettingBean.setName("预约");
+                    break;
+                case "outSign":
+                    timeHelperSettingBean.setName("外勤");
+                    break;
+                case "outWork":
+                    timeHelperSettingBean.setName("出差");
+                    break;
+                default:
+                    timeHelperSettingBean.setName(null);
+                    break;
+            }
+            if (timeHelperSettingBean.getName() != null) {
+                int config = JSONUtil.getInt(dataObject, next);
+                timeHelperSettingBean.setConfig(next);
+                timeHelperSettingBean.setChecked(config);
+
+                mSettings.put(next, config);
+                mTimeHelperSettingBeans.add(timeHelperSettingBean);
+            }
+
+        }
+        mTimeHelperSettingAdapter.setSettings(mSettings);
+        mTimeHelperSettingAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void showLoading(String loadStr) {
+        progressDialog.show();
+    }
+
+    @Override
+    public void hideLoading() {
+        progressDialog.dismiss();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.menu_time_helper_setting, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == R.id.menu_time_helper_setting_save) {
+
+            mPresenter.httpRequest(this, "http://192.168.253.230:8080/",
+                    new HttpParams.Builder()
+                            .url("schedule/config/saveConfig")
+                            .method(Method.POST)
+                            .flag(FLAG_SAVECONFIG)
+                            .addParam("imid", MyApplication.getInstance().getLoginUserId())
+                            .addParam("schedule", mTimeHelperSettingAdapter.getSettings().get("schedule"))
+                            .addParam("meeting", mTimeHelperSettingAdapter.getSettings().get("meeting"))
+                            .addParam("book", mTimeHelperSettingAdapter.getSettings().get("book"))
+                            .addParam("outSign", mTimeHelperSettingAdapter.getSettings().get("outSign"))
+                            .addParam("outWork", mTimeHelperSettingAdapter.getSettings().get("outWork"))
+                            .build());
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}

+ 115 - 0
app_modular/appworks/src/main/java/com/uas/appworks/adapter/TimeHelperAdapter.java

@@ -0,0 +1,115 @@
+package com.uas.appworks.adapter;
+
+import android.support.annotation.Nullable;
+import android.widget.ProgressBar;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.common.data.DateFormatUtil;
+import com.uas.appworks.R;
+import com.uas.appworks.model.bean.TimeHelperBean;
+
+import java.util.List;
+
+/**
+ * @author RaoMeng
+ * @describe
+ * @date 2018/8/23 11:26
+ */
+public class TimeHelperAdapter extends BaseQuickAdapter<TimeHelperBean, BaseViewHolder> {
+
+    private int mTimePosition = 0;
+    private int mTimeProgress = 0;
+
+    public void setTimeProgress(int timePosition, int timeProgress) {
+        mTimePosition = timePosition;
+        mTimeProgress = timeProgress;
+
+        notifyDataSetChanged();
+    }
+
+    public TimeHelperAdapter(@Nullable List<TimeHelperBean> timeHelperBeans) {
+        super(R.layout.item_list_time_helper, timeHelperBeans);
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, TimeHelperBean item) {
+        int adapterPosition = helper.getAdapterPosition();
+        int scheduleType = item.getScheduleType();
+        if (adapterPosition % 2 == 0) {
+            helper.setVisible(R.id.item_time_helper_order_right_ll, false);
+            helper.setVisible(R.id.item_time_helper_schedule_right_ll, false);
+            helper.setVisible(R.id.item_time_helper_meeting_right_ll, false);
+            helper.setVisible(R.id.item_time_helper_order_left_ll, false);
+            helper.setVisible(R.id.item_time_helper_schedule_left_ll, false);
+            helper.setVisible(R.id.item_time_helper_meeting_left_ll, false);
+            helper.setVisible(R.id.item_time_helper_time_left, false);
+            helper.setVisible(R.id.item_time_helper_time_right, true);
+
+            String startTime = item.getStartTime();
+            try {
+                long startLong = DateFormatUtil.str2Long(item.getStartTime(), DateFormatUtil.YMD_HMS);
+                startTime = DateFormatUtil.long2Str(startLong, DateFormatUtil.HM);
+            } catch (Exception e) {
+
+            }
+            helper.setText(R.id.item_time_helper_time_right, startTime);
+
+            switch (scheduleType) {
+                case TimeHelperBean.TYPE_TIME_HELPER_ORDER:
+                    helper.setVisible(R.id.item_time_helper_order_left_ll, true);
+                    helper.setText(R.id.item_time_helper_order_left_tv, item.getTitle());
+                    break;
+                case TimeHelperBean.TYPE_TIME_HELPER_SCHEDULE:
+                    helper.setVisible(R.id.item_time_helper_schedule_left_ll, true);
+                    helper.setText(R.id.item_time_helper_schedule_left_tv, item.getTitle());
+                    break;
+                case TimeHelperBean.TYPE_TIME_HELPER_MEETING:
+                    helper.setVisible(R.id.item_time_helper_meeting_left_ll, true);
+                    helper.setText(R.id.item_time_helper_meeting_left_tv, item.getTitle());
+                    break;
+            }
+        } else {
+            helper.setVisible(R.id.item_time_helper_order_right_ll, false);
+            helper.setVisible(R.id.item_time_helper_schedule_right_ll, false);
+            helper.setVisible(R.id.item_time_helper_meeting_right_ll, false);
+            helper.setVisible(R.id.item_time_helper_order_left_ll, false);
+            helper.setVisible(R.id.item_time_helper_schedule_left_ll, false);
+            helper.setVisible(R.id.item_time_helper_meeting_left_ll, false);
+            helper.setVisible(R.id.item_time_helper_time_right, false);
+            helper.setVisible(R.id.item_time_helper_time_left, true);
+
+            String startTime = item.getStartTime();
+            try {
+                long startLong = DateFormatUtil.str2Long(item.getStartTime(), DateFormatUtil.YMD_HMS);
+                startTime = DateFormatUtil.long2Str(startLong, DateFormatUtil.HM);
+            } catch (Exception e) {
+
+            }
+            helper.setText(R.id.item_time_helper_time_left, startTime);
+
+            switch (scheduleType) {
+                case TimeHelperBean.TYPE_TIME_HELPER_ORDER:
+                    helper.setVisible(R.id.item_time_helper_order_right_ll, true);
+                    helper.setText(R.id.item_time_helper_order_right_tv, item.getTitle());
+                    break;
+                case TimeHelperBean.TYPE_TIME_HELPER_SCHEDULE:
+                    helper.setVisible(R.id.item_time_helper_schedule_right_ll, true);
+                    helper.setText(R.id.item_time_helper_schedule_right_tv, item.getTitle());
+                    break;
+                case TimeHelperBean.TYPE_TIME_HELPER_MEETING:
+                    helper.setVisible(R.id.item_time_helper_meeting_right_ll, true);
+                    helper.setText(R.id.item_time_helper_meeting_right_tv, item.getTitle());
+                    break;
+            }
+        }
+
+        if (adapterPosition < mTimePosition) {
+            ((ProgressBar) helper.getView(R.id.item_time_helper_progress)).setProgress(100);
+        } else if (adapterPosition == (mTimePosition) && mTimeProgress > 0) {
+            ((ProgressBar) helper.getView(R.id.item_time_helper_progress)).setProgress(mTimeProgress);
+        } else {
+            ((ProgressBar) helper.getView(R.id.item_time_helper_progress)).setProgress(0);
+        }
+    }
+}

+ 52 - 0
app_modular/appworks/src/main/java/com/uas/appworks/adapter/TimeHelperSettingAdapter.java

@@ -0,0 +1,52 @@
+package com.uas.appworks.adapter;
+
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.core.widget.view.SwitchView;
+import com.uas.appworks.R;
+import com.uas.appworks.model.bean.TimeHelperSettingBean;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author RaoMeng
+ * @describe
+ * @date 2018/8/28 8:57
+ */
+public class TimeHelperSettingAdapter extends BaseQuickAdapter<TimeHelperSettingBean, BaseViewHolder> {
+    private Map<String, Integer> mSettings = new HashMap<>();
+
+    public void setSettings(Map<String, Integer> settings) {
+        mSettings = settings;
+    }
+
+    public Map<String, Integer> getSettings() {
+        return mSettings;
+    }
+
+    public TimeHelperSettingAdapter(@Nullable List<TimeHelperSettingBean> data) {
+        super(R.layout.item_time_helper_setting, data);
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, final TimeHelperSettingBean item) {
+        helper.setText(R.id.item_time_helper_setting_tv, item.getName());
+        ((SwitchView) helper.getView(R.id.item_time_helper_setting_sv)).setChecked(item.getChecked() == 1);
+
+        ((SwitchView) helper.getView(R.id.item_time_helper_setting_sv)).setOnCheckedChangeListener(new SwitchView.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(View view, boolean isChecked) {
+                item.setChecked(isChecked ? 1 : 0);
+                if (mSettings != null) {
+                    mSettings.put(item.getConfig(), isChecked ? 1 : 0);
+                }
+                notifyDataSetChanged();
+            }
+        });
+    }
+}

+ 6 - 6
app_modular/appworks/src/main/java/com/uas/appworks/fragment/B2BBusinessListFragment.java

@@ -25,7 +25,7 @@ import com.me.network.app.base.HttpParams;
 import com.me.network.app.http.HttpRequest;
 import com.me.network.app.http.Method;
 import com.scwang.smartrefresh.layout.api.RefreshLayout;
-import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener;
+import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
 import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
 import com.uas.appworks.OA.platform.activity.PurchaseDetailsActivity;
 import com.uas.appworks.R;
@@ -109,8 +109,8 @@ public class B2BBusinessListFragment extends BaseMVPFragment<WorkPlatPresenter>
         mEnuu = CommonUtil.getSharedPreferences(mContext, Constants.CACHE.B2B_BUSINESS_ENUU);
         mRecyclerView = $(R.id.b2b_list_rv);
         mRefreshLayout = $(R.id.b2b_list_refreshlayout);
-        mRefreshLayout.setEnableAutoLoadmore(true);
-        mRefreshLayout.setEnableLoadmoreWhenContentNotFull(true);
+        mRefreshLayout.setEnableAutoLoadMore(true);
+        mRefreshLayout.setEnableLoadMoreWhenContentNotFull(true);
 
         mB2BBusinessListBeans = new ArrayList<>();
         mB2BBusinessListAdapter = new B2bBusinessListAdapter(mContext, mB2BBusinessListBeans);
@@ -229,15 +229,15 @@ public class B2BBusinessListFragment extends BaseMVPFragment<WorkPlatPresenter>
             }
         });
 
-        mRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
+        mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
             @Override
-            public void onLoadmore(RefreshLayout refreshLayout) {
+            public void onLoadMore(RefreshLayout refreshLayout) {
                 if (CommonUtil.isNetWorkConnected(mContext)) {
                     mPageIndex++;
                     getListData(mPageIndex, mKeyWord);
                 } else {
                     toast(R.string.networks_out);
-                    mRefreshLayout.finishLoadmore(500, false);
+                    mRefreshLayout.finishLoadMore(500, false, false);
                 }
             }
         });

+ 166 - 0
app_modular/appworks/src/main/java/com/uas/appworks/model/bean/TimeHelperBean.java

@@ -0,0 +1,166 @@
+package com.uas.appworks.model.bean;
+
+/**
+ * @author RaoMeng
+ * @describe
+ * @date 2018/8/23 11:26
+ */
+public class TimeHelperBean {
+    public static final int TYPE_TIME_HELPER_ORDER = 1;
+    public static final int TYPE_TIME_HELPER_SCHEDULE = 2;
+    public static final int TYPE_TIME_HELPER_MEETING = 3;
+
+
+    /**
+     * scheduleId : 7
+     * imid : 110462
+     * type : UU互联
+     * allDay : 1
+     * repeat : 不重复
+     * title : 工作
+     * tag : 工作
+     * remarks : 工作
+     * startTime : 2018-08-27 15:37:06
+     * endTime : 2018-08-27 15:37:22
+     * warnTime : 1
+     * warnRealTime : 2018-08-27 15:37:39
+     * address : null
+     * status : 1
+     */
+
+    private int scheduleId;
+    private int imid;
+    private String type;
+    private int allDay;
+    private String repeat;
+    private String title;
+    private String tag;
+    private String remarks;
+    private String startTime;
+    private String endTime;
+    private int warnTime;
+    private String warnRealTime;
+    private String address;
+    private int status;
+    private int scheduleType;
+
+    public int getScheduleId() {
+        return scheduleId;
+    }
+
+    public void setScheduleId(int scheduleId) {
+        this.scheduleId = scheduleId;
+    }
+
+    public int getImid() {
+        return imid;
+    }
+
+    public void setImid(int imid) {
+        this.imid = imid;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public int getAllDay() {
+        return allDay;
+    }
+
+    public void setAllDay(int allDay) {
+        this.allDay = allDay;
+    }
+
+    public String getRepeat() {
+        return repeat;
+    }
+
+    public void setRepeat(String repeat) {
+        this.repeat = repeat;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public int getWarnTime() {
+        return warnTime;
+    }
+
+    public void setWarnTime(int warnTime) {
+        this.warnTime = warnTime;
+    }
+
+    public String getWarnRealTime() {
+        return warnRealTime;
+    }
+
+    public void setWarnRealTime(String warnRealTime) {
+        this.warnRealTime = warnRealTime;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public int getScheduleType() {
+        return scheduleType;
+    }
+
+    public void setScheduleType(int scheduleType) {
+        this.scheduleType = scheduleType;
+    }
+}

+ 36 - 0
app_modular/appworks/src/main/java/com/uas/appworks/model/bean/TimeHelperSettingBean.java

@@ -0,0 +1,36 @@
+package com.uas.appworks.model.bean;
+
+/**
+ * @author RaoMeng
+ * @describe
+ * @date 2018/8/28 8:58
+ */
+public class TimeHelperSettingBean {
+    private String mName;
+    private String mConfig;
+    private int mChecked;
+
+    public String getName() {
+        return mName;
+    }
+
+    public void setName(String name) {
+        mName = name;
+    }
+
+    public String getConfig() {
+        return mConfig;
+    }
+
+    public void setConfig(String config) {
+        mConfig = config;
+    }
+
+    public int getChecked() {
+        return mChecked;
+    }
+
+    public void setChecked(int checked) {
+        mChecked = checked;
+    }
+}

BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_bottom1.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_bottom2.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_bottom3.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_time_helper_setting.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_timehelper_metting.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_timehelper_order.png


BIN
app_modular/appworks/src/main/res/drawable-hdpi/ic_timehelper_schedule.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_bottom1.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_bottom2.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_bottom3.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_time_helper_setting.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_timehelper_metting.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_timehelper_order.png


BIN
app_modular/appworks/src/main/res/drawable-xhdpi/ic_timehelper_schedule.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_bottom1.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_bottom2.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_bottom3.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_time_helper_setting.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_timehelper_metting.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_timehelper_order.png


BIN
app_modular/appworks/src/main/res/drawable-xxhdpi/ic_timehelper_schedule.png


+ 14 - 0
app_modular/appworks/src/main/res/drawable/animlist_time_helper_icon.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
+                android:oneshot="false">
+
+    <item
+        android:drawable="@drawable/ic_time_helper_bottom2"
+        android:duration="300" />
+    <item
+        android:drawable="@drawable/ic_time_helper_bottom3"
+        android:duration="300" />
+    <item
+        android:drawable="@drawable/ic_time_helper_bottom1"
+        android:duration="300" />
+</animation-list>

+ 1 - 1
app_modular/appworks/src/main/res/layout/activity_b2b_business_main.xml

@@ -7,7 +7,7 @@
     android:layout_height="match_parent"
     android:focusable="true"
     android:focusableInTouchMode="true"
-    app:srlEnableLoadmore="false"
+    app:srlEnableLoadMore="false"
     app:srlEnablePreviewInEditMode="false">
 
     <com.scwang.smartrefresh.layout.header.ClassicsHeader

+ 1 - 1
app_modular/appworks/src/main/res/layout/activity_main_city_industry_service.xml

@@ -14,7 +14,7 @@
         android:layout_height="match_parent"
         android:focusable="true"
         android:focusableInTouchMode="true"
-        app:srlEnableLoadmore="false"
+        app:srlEnableLoadMore="false"
         app:srlEnablePreviewInEditMode="false">
 
         <com.scwang.smartrefresh.layout.header.ClassicsHeader

+ 68 - 0
app_modular/appworks/src/main/res/layout/activity_time_helper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:arc="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/time_helper_date_tv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:padding="8dp"
+            android:textColor="#4E4E4E"
+            android:textSize="16sp"
+            tools:text="8月8日(周三)" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_marginLeft="15dp"
+            android:layout_marginRight="15dp"
+            android:background="#E2E2E2" />
+
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/time_helper_rv"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginTop="10dp" />
+    </LinearLayout>
+
+    <ImageView
+        android:id="@+id/time_helper_bottom_iv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginBottom="10dp"
+        android:src="@drawable/animlist_time_helper_icon" />
+
+    <View
+        android:id="@+id/time_helper_gray_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#80000000"
+        android:visibility="gone" />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <com.core.widget.arcmenu.ArcMenu
+            android:id="@+id/time_helper_arcmenu"
+            android:layout_width="200dp"
+            android:layout_height="200dp"
+            android:layout_alignParentBottom="true"
+            android:layout_marginBottom="-60dp"
+            android:layout_marginLeft="-60dp"
+            arc:childSize="45dp" />
+    </RelativeLayout>
+
+</RelativeLayout>

+ 14 - 0
app_modular/appworks/src/main/res/layout/activity_time_helper_setting.xml

@@ -0,0 +1,14 @@
+<?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:background="#f2f2f2"
+    android:orientation="vertical">
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/time_helper_setting_rv"
+        android:layout_marginTop="12dp"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+</LinearLayout>

+ 12 - 0
app_modular/appworks/src/main/res/menu/menu_time_helper.xml

@@ -0,0 +1,12 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto"
+      xmlns:tools="http://schemas.android.com/tools"
+      tools:context="com.xzjmyk.pm.activity.MainActivity">
+
+    <item
+        android:id="@+id/menu_time_helper_setting"
+        android:icon="@drawable/ic_time_helper_setting"
+        android:title="@string/setting"
+        app:showAsAction="ifRoom" />
+
+</menu>

+ 9 - 0
app_modular/appworks/src/main/res/menu/menu_time_helper_setting.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/menu_time_helper_setting_save"
+        android:title="@string/common_save_button"
+        app:showAsAction="ifRoom" />
+</menu>

+ 8 - 3
settings.gradle

@@ -17,9 +17,9 @@ include ':appworks'
 include ':appmoments'
 include ':apptasks'
 include ':apputils'
-include  ':appmusic'
-include  ':facesdk'
-include  ':applocation'
+include ':appmusic'
+include ':facesdk'
+include ':applocation'
 //第三库模块
 
 include ':lib-zxing'
@@ -34,6 +34,8 @@ include ':MPAndroidChart'
 include ':pullToRefershLibraryMy'
 //include ':android-pdf-viewer'
 include ':recyclerlibrary'
+//include ':refresh-layout'
+//include ':refresh-header'
 
 //核心模块
 project(':network').projectDir = new File('app_core/network')
@@ -68,3 +70,6 @@ project(':libfloatingactionbutton').projectDir = new File('app_third/libfloating
 project(':library-swipemenu_lv').projectDir = new File('app_third/library-swipemenu_lv')
 //project(':android-pdf-viewer').projectDir = new File('app_third/android-pdf-viewer')
 project(':recyclerlibrary').projectDir = new File('app_third/recyclerlibrary')
+//project(':refresh-layout').projectDir = new File('app_third/refresh-layout')
+//project(':refresh-header').projectDir = new File('app_third/refresh-header')
+

+ 1 - 1
version.gradle

@@ -47,7 +47,7 @@ ext {
             BaseRecyclerViewAdapterHelperVersion: '2.9.30',
             addSubUtilsVersion                  : '1.5.0',
             bannerVersion                       : '1.4.10',
-            smartRefreshLayoutVersion           : '1.0.4',
+            smartRefreshLayoutVersion           : '1.0.5',
             rxJava2Version                      : '2.0.7',
             rxAndroid2Version                   : '2.0.1',
             bottomsheetVersion                  : '1.5.3'