Quellcode durchsuchen

1.修改CommonEditor Android,增加NumberRange和DateRange Cell。

Pen Li vor 8 Jahren
Ursprung
Commit
1ce2f002f1
20 geänderte Dateien mit 907 neuen und 68 gelöschten Zeilen
  1. 46 33
      RedAnt Mobile/app/app.iml
  2. 1 1
      RedAnt Mobile/app/build.gradle
  3. 67 0
      RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorDateRangeCellHolder.java
  4. 2 0
      RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorEditCellHolder.java
  5. 183 0
      RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorRangeCellHolder.java
  6. 239 14
      RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditorActivity.java
  7. 19 0
      RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/DatePickerActivity.java
  8. 32 11
      RedAnt Mobile/app/src/main/java/com/usai/redant/Result/SearchResultActivity.java
  9. 74 1
      RedAnt Mobile/app/src/main/java/com/usai/redant/Search/RamSearchActivity.java
  10. 23 0
      RedAnt Mobile/app/src/main/java/com/usai/redant/util/Network.java
  11. 43 0
      RedAnt Mobile/app/src/main/java/com/usai/redant/util/RAUtil.java
  12. 1 2
      RedAnt Mobile/app/src/main/res/layout/activity_common_editor.xml
  13. 1 0
      RedAnt Mobile/app/src/main/res/layout/activity_date_picker.xml
  14. 8 3
      RedAnt Mobile/app/src/main/res/layout/activity_ram_search.xml
  15. 75 0
      RedAnt Mobile/app/src/main/res/layout/common_editor_date_range_cell.xml
  16. 75 0
      RedAnt Mobile/app/src/main/res/layout/common_editor_range_cell.xml
  17. 12 0
      RedAnt Mobile/app/src/main/res/menu/ram_search_menu.xml
  18. 1 1
      RedAnt Mobile/build.gradle
  19. 2 0
      RedAnt Mobile/gradle.properties
  20. 3 2
      RedAnt Mobile/gradle/wrapper/gradle-wrapper.properties

+ 46 - 33
RedAnt Mobile/app/app.iml

@@ -22,25 +22,26 @@
       </configuration>
     </facet>
   </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
     <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
     <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
     <exclude-output />
     <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
@@ -55,6 +56,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
@@ -78,15 +86,20 @@
       <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/splits-support" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
       <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
@@ -94,35 +107,35 @@
     </content>
     <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" exported="" name="support-core-ui-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="runner-0.5" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="espresso-idling-resource-2.2.2" level="project" />
-    <orderEntry type="library" exported="" name="core-2.3.0" level="project" />
-    <orderEntry type="library" exported="" name="support-fragment-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="constraint-layout-1.0.2" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="hamcrest-library-1.3" level="project" />
-    <orderEntry type="library" exported="" name="support-v4-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="support-media-compat-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="hamcrest-integration-1.3" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="jsr305-2.0.1" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="espresso-core-2.2.2" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="exposed-instrumentation-api-publish-0.5" level="project" />
-    <orderEntry type="library" exported="" name="support-core-utils-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="rules-0.5" level="project" />
-    <orderEntry type="library" exported="" name="constraint-layout-solver-1.0.2" level="project" />
-    <orderEntry type="library" exported="" name="httpmime-4.1.1" level="project" />
-    <orderEntry type="library" exported="" name="support-vector-drawable-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="javax.annotation-api-1.2" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="javax.inject-1" level="project" />
-    <orderEntry type="library" exported="" name="appcompat-v7-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="bcprov-jdk15on-157" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="javawriter-2.1.1" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="hamcrest-core-1.3" level="project" />
-    <orderEntry type="library" exported="" scope="TEST" name="junit-4.12" level="project" />
-    <orderEntry type="library" exported="" name="recyclerview-v7-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="support-compat-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="support-annotations-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="animated-vector-drawable-26.0.0-alpha1" level="project" />
-    <orderEntry type="library" exported="" name="org.apache.http.legacy-android-26" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.android.support.test:exposed-instrumentation-api-publish-0.5" level="project" />
+    <orderEntry type="library" scope="TEST" name="junit:junit:4.12@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:appcompat-v7-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="com.android.support:support-media-compat-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="com.android.support:recyclerview-v7-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" scope="TEST" name="javax.inject:javax.inject:1@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.squareup:javawriter:2.1.1@jar" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/macmini1/android project/RedAnt Mobile Android/app/libs/httpmime-4.1.1.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-v4-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/macmini1/android project/RedAnt Mobile Android/app/libs/core-2.3.0.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/macmini1/android project/RedAnt Mobile Android/app/libs/bcprov-jdk15on-157.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-compat-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="com.android.support:support-core-utils-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="com.android.support.constraint:constraint-layout-solver:1.0.2@jar" level="project" />
+    <orderEntry type="library" name="com.android.support.constraint:constraint-layout-1.0.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-vector-drawable-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="com.android.support:animated-vector-drawable-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="com.android.support:support-annotations:26.0.0-alpha1@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="org.hamcrest:hamcrest-core:1.3@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.android.support.test.espresso:espresso-core-2.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.android.support.test:rules-0.5" level="project" />
+    <orderEntry type="library" scope="TEST" name="org.hamcrest:hamcrest-library:1.3@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-core-ui-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.android.support.test:runner-0.5" level="project" />
+    <orderEntry type="library" scope="TEST" name="com.android.support.test.espresso:espresso-idling-resource-2.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="javax.annotation:javax.annotation-api:1.2@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-fragment-26.0.0-alpha1" level="project" />
+    <orderEntry type="library" name="org.apache.http.legacy-android-26" level="project" />
   </component>
 </module>

+ 1 - 1
RedAnt Mobile/app/build.gradle

@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
 
 android {
     compileSdkVersion 26
-    buildToolsVersion "26.0.0"
+    buildToolsVersion '26.0.2'
     defaultConfig {
         applicationId "com.usai.redant.redantmobile"
         minSdkVersion 19

+ 67 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorDateRangeCellHolder.java

@@ -0,0 +1,67 @@
+package com.usai.redant.CommonEditor.CommonEditor;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.usai.redant.CommonEditor.DatePickerActivity;
+import com.usai.redant.redantmobile.R;
+
+import org.json.JSONObject;
+
+/**
+ * Created by macmini1 on 2017/12/13.
+ */
+
+public class CommonEditorDateRangeCellHolder extends CommonEditorCellHolder {
+
+    public TextView title_lb;
+    public Button min_btn;
+    public Button max_btn;
+    public DateButtonClickListener clickListener;
+
+    public CommonEditorDateRangeCellHolder(Context context, View view) {
+        super(context, view);
+
+        title_lb = view.findViewById(R.id.range_title_tv);
+        min_btn = view.findViewById(R.id.range_minimum_btn);
+        max_btn = view.findViewById(R.id.range_maximum_btn);
+
+        clickListener = new DateButtonClickListener();
+        min_btn.setOnClickListener(clickListener);
+        max_btn.setOnClickListener(clickListener);
+
+    }
+
+    @Override
+    public void setItem(JSONObject item_json, boolean readonly, View view) {
+        super.setItem(item_json, readonly, view);
+    }
+
+    public class DateButtonClickListener implements View.OnClickListener {
+
+        @Override
+        public void onClick(View view) {
+
+            Intent intent = new Intent(mCtx, DatePickerActivity.class);
+
+            intent.putExtra("group",group);
+            intent.putExtra("child",child);
+
+            if (view.equals(min_btn)) {
+                intent.putExtra("value","min");
+            } else {
+                intent.putExtra("value","max");
+            }
+
+            intent.putExtra("min",min_btn.getText().toString());
+            intent.putExtra("max",max_btn.getText().toString());
+
+            ((Activity)mCtx).startActivityForResult(intent,14);
+
+        }
+    }
+}

+ 2 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorEditCellHolder.java

@@ -1,6 +1,7 @@
 package com.usai.redant.CommonEditor.CommonEditor;
 
 import android.content.Context;
+import android.text.TextWatcher;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -15,6 +16,7 @@ public class CommonEditorEditCellHolder extends CommonEditorCellHolder {
 
     public TextView name_lb;
     public EditText text_field;
+    public TextWatcher textWatcher;
 
     public CommonEditorEditCellHolder(Context context, View view) {
         super(context,view);

+ 183 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorRangeCellHolder.java

@@ -0,0 +1,183 @@
+package com.usai.redant.CommonEditor.CommonEditor;
+
+import android.content.Context;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.usai.redant.CommonEditor.CommonEditorActivity;
+import com.usai.redant.redantmobile.R;
+
+import org.json.JSONObject;
+
+/**
+ * Created by macmini1 on 2017/12/13.
+ */
+
+public class CommonEditorRangeCellHolder extends CommonEditorCellHolder {
+
+    public TextView title_lb;
+    public EditText min_et;
+    public EditText max_et;
+
+    public TextWatcher minTextChangeListener;
+
+    public TextWatcher maxTextChangeListener;
+
+    boolean processValues(String min_str, String max_str) {
+        float min = 0;
+        float max = Float.MAX_VALUE;
+
+        if (min_str != null && !min_str.isEmpty()) {
+            min = Float.valueOf(min_str);
+        }
+        if (max_str != null && !max_str.isEmpty()) {
+            max = Float.valueOf(max_str);
+        }
+
+        if (max < min) {
+
+            return false;
+        }
+        ((CommonEditorActivity)mCtx).commonEditorRangeDidChange(min_str,max_str,group,child);
+
+        return true;
+    }
+
+    public void clearTextWather() {
+        min_et.removeTextChangedListener(minTextChangeListener);
+        minTextChangeListener = null;
+
+        max_et.removeTextChangedListener(maxTextChangeListener);
+        maxTextChangeListener = null;
+    }
+
+    public void resetTextWather() {
+
+        minTextChangeListener = new TextWatcher() {
+
+            String origin_text;
+            String string;
+            int start_position;
+            int change_length; // 修改原文长度
+            int new_string_length;
+
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+                origin_text = s.toString();
+                start_position = start;
+                change_length = count;
+                new_string_length = after;
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+
+                /**
+                 * 文本处理
+                 * */
+                if (new_string_length == 0) {
+                    string = "";
+                } else {
+                    string = s.toString().substring(start_position,start_position + new_string_length);
+                }
+
+                if (change_length == 0) { // 新加内容
+
+                } else { // 替换原文或删除原文
+
+                }
+
+                /**
+                 * 业务逻辑
+                 */
+                String max_str = max_et.getText().toString();
+                String min_str = min_et.getText().toString();
+
+                if (!processValues(min_str,max_str)) {
+                    min_et.setText(origin_text);
+                }
+
+            }
+        };
+
+        maxTextChangeListener  = new TextWatcher() {
+
+            String origin_text;
+            String string;
+            int start_position;
+            int change_length; // 修改原文长度
+            int new_string_length;
+
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+                origin_text = s.toString();
+                start_position = start;
+                change_length = count;
+                new_string_length = after;
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+
+                /**
+                 * 文本处理
+                 * */
+                if (new_string_length == 0) {
+                    string = "";
+                } else {
+                    string = s.toString().substring(start_position,start_position + new_string_length);
+                }
+
+                if (change_length == 0) { // 新加内容
+
+                } else { // 替换原文或删除原文
+
+                }
+
+                /**
+                 * 业务逻辑
+                 */
+                String max_str = max_et.getText().toString();
+                String min_str = min_et.getText().toString();
+
+                if (!processValues(min_str,max_str)) {
+                    min_et.setText(origin_text);
+                }
+
+            }
+        };
+
+    }
+
+
+    public CommonEditorRangeCellHolder(Context context, View view) {
+        super(context, view);
+
+        title_lb = view.findViewById(R.id.range_title_tv);
+        min_et = view.findViewById(R.id.range_minimum_et);
+        max_et = view.findViewById(R.id.range_maximum_et);
+
+    }
+
+    @Override
+    public void setItem(JSONObject item_json, boolean readonly, View view) {
+        super.setItem(item_json, readonly, view);
+    }
+}

+ 239 - 14
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditorActivity.java

@@ -14,6 +14,7 @@ import android.text.InputFilter;
 import android.text.InputType;
 import android.text.TextWatcher;
 import android.util.Log;
+import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -27,16 +28,19 @@ import android.widget.CompoundButton;
 import android.widget.EditText;
 import android.widget.ExpandableListView;
 import android.widget.Switch;
+import android.widget.TextView;
 
 
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorActionCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorCellHolder;
+import com.usai.redant.CommonEditor.CommonEditor.CommonEditorDateRangeCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorEditCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorEnumCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorImageCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorLabelCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorModelCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorMultipleActionCellHolder;
+import com.usai.redant.CommonEditor.CommonEditor.CommonEditorRangeCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorSectionHeaderHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorSignatureCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorSwitchCellHolder;
@@ -45,6 +49,7 @@ import com.usai.redant.redantmobile.R;
 import com.usai.redant.util.Network;
 
 import org.json.JSONArray;
+import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.io.BufferedReader;
@@ -68,10 +73,14 @@ import static android.view.Gravity.TOP;
 
 public class CommonEditorActivity extends AppCompatActivity implements View.OnLayoutChangeListener{
 
-    private ExpandableListView listView;
-    private ExpandAdapter adapter;
+
+    public ExpandAdapter adapter;
     public String service_url;
 
+    public boolean hasChildView;
+    public ExpandableListView listView;
+    public View rootView;
+
     /**Child Activity Override*/
     public void download_success() {
 
@@ -90,7 +99,7 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
         public JSONArray missingfields;
     }
 
-    private ProgressDialog showProgressAlert(String title,String msg) {
+    public ProgressDialog showProgressAlert(String title,String msg) {
         ProgressDialog pd = new ProgressDialog(this);
         pd.setTitle(title);
         pd.setMessage(msg);
@@ -144,11 +153,20 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_common_editor);
 
-//        service_url = "http://192.168.0.133:8080/site/isales/getAddCustomer.htm";
 
-        listView = (ExpandableListView)findViewById(R.id.list_view);
+        if (!hasChildView) {
+            setContentView(R.layout.activity_common_editor);
+
+//            rootView = findViewById(R.id.root_layout);
+            listView = (ExpandableListView)findViewById(R.id.list_view);
+        }
+
+        rootView = getWindow().getDecorView().findViewById(android.R.id.content);
+
+        if (listView == null) {
+            return;
+        }
 
         adapter = new ExpandAdapter(this);
 
@@ -288,11 +306,13 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
 
     }
 
+
     @Override
     protected void onResume() {
         super.onResume();
-        View rootView = findViewById(R.id.root_layout);
-        rootView.addOnLayoutChangeListener(this);
+        if (rootView != null) {
+            rootView.addOnLayoutChangeListener(this);
+        }
     }
 
     @Override
@@ -439,6 +459,60 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
             signatureIsChanged(url_down,url_up,group,child);
         }
 
+        // date range
+        if (requestCode == 14) {
+            int group = data.getIntExtra("group",0);
+            int child = data.getIntExtra("child",0);
+            String min = data.getStringExtra("min");
+            String max = data.getStringExtra("max");
+
+            String min_components[] = min.split("/");
+            String max_components[] = max.split("/");
+
+            if (min_components.length == max_components.length) {
+
+                int min_year = Integer.valueOf(min_components[2]);
+                int min_month = Integer.valueOf(min_components[0]);
+                int min_day = Integer.valueOf(min_components[1]);
+
+                int max_year = Integer.valueOf(max_components[2]);
+                int max_month = Integer.valueOf(max_components[0]);
+                int max_day = Integer.valueOf(max_components[1]);
+
+                if (min_year > max_year) {
+                    showWarningAlert("minimum can't larger than maximum");
+                    return;
+                } else if (min_year == max_year) {
+
+                    if (min_month > max_month) {
+                        showWarningAlert("minimum can't larger than maximum");
+                        return;
+                    } else if (min_month == max_month) {
+
+                        if (min_day > max_day) {
+                            showWarningAlert("minimum can't larger than maximum");
+                            return;
+                        }
+
+                    }
+
+                }
+
+
+            }
+
+            commonEditorRangeDidChange(min,max,group,child);
+        }
+
+    }
+
+    private void showWarningAlert(String msg) {
+
+        new AlertDialog.Builder(mCtx)
+                .setTitle("Warning")
+                .setMessage(msg)
+                .show();
+
     }
 
     public void signatureIsChanged(String url_down,String url_up,int group,int child) {
@@ -1582,6 +1656,24 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
                         }
 
                     } // edit
+                    else if (itemjson.optString("control").equals("range")) {
+
+                        String min_str = itemjson.optString("min_value","");
+                        String max_str = itemjson.optString("max_value","");
+
+                        String required = itemjson.optString("required");
+                        if (required != null && required.equals("true") && (min_str.length() < 1 && max_str.length() < 1)) {
+                            cancommit = false;
+                            String mfield = itemjson.optString("aname") + " is missing";
+                            fields.put(mfield);
+                        } else {
+                            JSONObject range_obj = new JSONObject();
+                            range_obj.put("min",min_str);
+                            range_obj.put("max",max_str);
+                            upparams.put(itemjson.optString("name"),range_obj.toString());
+                        }
+
+                    } // range
                     else {
 
                         if (itemjson.optString("value") != null && !itemjson.optString("value").isEmpty()) {
@@ -1650,11 +1742,14 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
     public static int COMMON_EDITOR_CELL_TYPE_SWITCH = 8;
     public static int COMMON_EDITOR_CELL_TYPE_TEXT_VIEW = 9;
     public static int COMMON_EDITOR_CELL_TYPE_SECTION_HEADER = 10;
+    public static int COMMON_EDITOR_CELL_TYPE_RANGE = 11;
+    public static int COMMON_EDITOR_CELL_TYPE_DATE_RANGE = 12;
+
     /**
      * ExpandListView Adapter
      * */
-    JSONArray content_data_control;
-    JSONObject content_data_download;
+    public JSONArray content_data_control;
+    public JSONObject content_data_download;
 
     public class ExpandAdapter extends BaseExpandableListAdapter {
 
@@ -1714,7 +1809,7 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
 
         @Override
         public long getChildId(int groupPosition, int childPosition) {
-            return childPosition;
+            return groupPosition * 1000 + childPosition;
         }
 
         @Override
@@ -1820,6 +1915,21 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
                         holder = new CommonEditorSignatureCellHolder(mCtx,convertView);
                         setUpSignatureCellHolder((CommonEditorSignatureCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
 
+                    }  else if (control.equals("range")) {
+
+                        String type = item_json.optString("type");
+                        if (type != null && type.equals("date")) {
+                            convertView = LayoutInflater.from(mCtx).inflate(R.layout.common_editor_date_range_cell,null);
+                            holder = new CommonEditorDateRangeCellHolder(mCtx,convertView);
+                            setUpDateRangeCellHolder((CommonEditorDateRangeCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
+                        } else {
+                            convertView = LayoutInflater.from(mCtx).inflate(R.layout.common_editor_range_cell,null);
+                            holder = new CommonEditorRangeCellHolder(mCtx,convertView);
+                            setUpRangeCellHolder((CommonEditorRangeCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
+                        }
+
+
+
                     } else {
                         convertView = LayoutInflater.from(mCtx).inflate(R.layout.common_editor_edit_cell_small,null);
                         holder = new CommonEditorEditCellHolder(mCtx,convertView);
@@ -1883,7 +1993,19 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
                         holder = (CommonEditorSignatureCellHolder)convertView.getTag();
                         setUpSignatureCellHolder((CommonEditorSignatureCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
 
-                    } else {
+                    }  else if (control.equals("range")) {
+
+                        String type = item_json.optString("type");
+                        if (type != null && type.equals("date")) {
+                            holder = (CommonEditorDateRangeCellHolder)convertView.getTag();
+                            setUpDateRangeCellHolder((CommonEditorDateRangeCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
+                        } else {
+                            holder = (CommonEditorRangeCellHolder)convertView.getTag();
+                            setUpRangeCellHolder((CommonEditorRangeCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
+                        }
+
+
+                    }  else {
                         holder = (CommonEditorEditCellHolder)convertView.getTag();
                         setUpEditCellHolder((CommonEditorEditCellHolder)holder,convertView,item_json,readonly,groupPosition,childPosition);
 
@@ -1907,7 +2029,7 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
         @Override
         public int getChildTypeCount() {
 
-            return 11;
+            return 13;
         }
 
         @Override
@@ -1949,6 +2071,14 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
                     return COMMON_EDITOR_CELL_TYPE_SIGNATURE;
                 } else if (control.equals("header")){
                     return COMMON_EDITOR_CELL_TYPE_SECTION_HEADER;
+                } else if (control.equals("range")){
+                    String type = item_json.optString("type");
+                    if (type != null && type.equals("date")) {
+                        return COMMON_EDITOR_CELL_TYPE_DATE_RANGE;
+                    } else {
+                        return COMMON_EDITOR_CELL_TYPE_RANGE;
+                    }
+
                 } else {
                     return COMMON_EDITOR_CELL_TYPE_EDIT;
                 }
@@ -2432,7 +2562,15 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
 
         holder.text_field.setTag(group + "_" + child + "_" + "TextFiled");
         holder.text_field.setText(value);
-        holder.text_field.addTextChangedListener(new TextFieldTextWatcher(mCtx,holder.text_field,group,child));
+        if (holder.textWatcher == null) {
+            TextFieldTextWatcher textWatcher = new TextFieldTextWatcher(mCtx,holder.text_field,group,child);
+            holder.text_field.addTextChangedListener(textWatcher);
+            holder.textWatcher = textWatcher;
+        } else {
+            TextFieldTextWatcher textWatcher = (TextFieldTextWatcher)holder.textWatcher;
+            textWatcher.group = group;
+            textWatcher.child = child;
+        }
         holder.text_field.setOnFocusChangeListener(new EditTextFocusListener(mCtx,holder.text_field,group,child));
 
 
@@ -2972,6 +3110,93 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
         holder.hideControlBtn(hideControlBtn);
     }
 
+    public void setUpRangeCellHolder(CommonEditorRangeCellHolder holder, View cell, JSONObject item_json, boolean readonly, int group, int child) {
+
+        holder.clearTextWather();
+
+        String title = item_json.optString("aname");
+        holder.group = group;
+        holder.child = child;
+        holder.title_lb.setText(title);
+
+        String type = item_json.optString("type");
+        String keyboard = item_json.optString("keyboard");
+
+        int inputType = 0;
+        if (keyboard != null) {
+            if (keyboard.equals("number")) {
+                inputType = EditorInfo.TYPE_CLASS_NUMBER;
+            } else if (keyboard.equals("email")) {
+                inputType = EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
+            } else if (keyboard.equals("phone")) {
+                inputType = EditorInfo.TYPE_CLASS_PHONE;
+            } else {
+                inputType = EditorInfo.TYPE_CLASS_TEXT;
+            }
+        }
+
+        holder.min_et.setInputType(inputType);
+        holder.max_et.setInputType(inputType);
+
+        String min_str = item_json.optString("min_value");
+        String max_str = item_json.optString("max_value");
+
+        holder.min_et.setText(min_str);
+        holder.max_et.setText(max_str);
+
+//        if (disable == 1 || readonly) {
+//            holder.text_field.setEnabled(false);
+//            holder.text_field.setTextColor(Color.LTGRAY);
+//        } else {
+//            holder.text_field.setEnabled(true);
+//            holder.text_field.setTextColor(Color.BLACK);
+//        }
+
+
+        holder.resetTextWather();
+
+    }
+
+    public void setUpDateRangeCellHolder(CommonEditorDateRangeCellHolder holder, View cell, JSONObject item_json, boolean readonly, int group, int child) {
+
+        String title = item_json.optString("aname");
+        holder.group = group;
+        holder.child = child;
+        holder.title_lb.setText(title);
+
+//        String type = item_json.optString("type");
+
+        String min_str = item_json.optString("min_value");
+        String max_str = item_json.optString("max_value");
+
+        holder.min_btn.setText(min_str);
+        holder.max_btn.setText(max_str);
+
+    }
+
+    public void commonEditorRangeDidChange(String min, String max, int group, int child) {
+        String section_key = "section_" + group;
+        String item_key = "item_" + child;
+
+        try {
+            JSONObject section_json = content_data_download.getJSONObject(section_key);
+            JSONObject item_json = ((JSONArray)content_data_control.getJSONArray(group)).getJSONObject(child);
+
+            item_json.put("max_value",max);
+            item_json.put("min_value",min);
+
+            section_json.put(item_key,item_json);
+            content_data_download.put(section_key,section_json);
+            content_data_control = translateChange(content_data_download,changed_data);
+
+            adapter.notifyDataSetChanged();
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+    }
+
     private Context mCtx = this;
 
     /**Month Picker*/

+ 19 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/DatePickerActivity.java

@@ -4,6 +4,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
+import android.widget.DatePicker;
 
 import com.usai.redant.redantmobile.R;
 
@@ -34,9 +35,27 @@ public class DatePickerActivity extends AppCompatActivity {
         }
     }
 
+    private DatePicker datePicker;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_date_picker);
+
+        datePicker = (DatePicker) findViewById(R.id.date_picker);
+    }
+
+    @Override
+    public void finish() {
+
+        Intent intent = getIntent();
+        String select_date = datePicker.getMonth() + "/" + datePicker.getDayOfMonth() + "/" + datePicker.getYear();
+
+        String key = intent.getStringExtra("value");
+        intent.putExtra(key,select_date);
+
+        setResult(RESULT_OK,intent);
+
+        super.finish();
     }
 }

+ 32 - 11
RedAnt Mobile/app/src/main/java/com/usai/redant/Result/SearchResultActivity.java

@@ -32,6 +32,7 @@ import android.widget.TextView;
 
 import com.usai.redant.redantmobile.BuildConfig;
 import com.usai.redant.redantmobile.R;
+import com.usai.redant.util.Network;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -44,7 +45,7 @@ import java.util.Iterator;
 
 public class SearchResultActivity extends AppCompatActivity implements AbsListView.OnScrollListener {
 
-    private JSONObject mParams;
+    private Bundle mParams;
     private JSONObject resultData;
 
     private Context mContext;
@@ -93,10 +94,22 @@ public class SearchResultActivity extends AppCompatActivity implements AbsListVi
 
         resultListView.setOnScrollListener(this);
 
+        if (savedInstanceState != null) {
+            mParams = savedInstanceState.getBundle("query_params");
+        } else {
+            mParams = getIntent().getBundleExtra("query_params");
+        }
+
         loadData();
 
     }
 
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+
+        outState.putBundle("query_params",mParams);
+    }
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
@@ -238,21 +251,29 @@ public class SearchResultActivity extends AppCompatActivity implements AbsListVi
 
                 try {
 
-                    Thread.sleep(2000);
-
-                    InputStream in = getResources().openRawResource( R.raw.result);
-                    int length = in.available();
-                    byte[] buffer = new byte[length];
-                    in.read(buffer);
-                    String res = new String(buffer,"utf8");
-                    in.close();
-                    resultData = new JSONObject(res);
+                    resultData = Network.query(mParams);
 
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                             setupUI();
                             loadComplete();
+                            int result = resultData.optInt("result",0);
+                            if (result == 2) {
+
+                            } else {
+
+                                String msg = resultData.optString("msg");
+                                if (msg == null) {
+                                    msg = "Sorry,some error occurred";
+                                }
+
+                                new AlertDialog.Builder(mContext)
+                                        .setTitle("Warning")
+                                        .setMessage(msg)
+                                        .show();
+                            }
+
                             adapter.notifyDataSetChanged();
                         }
                     });
@@ -530,8 +551,8 @@ public class SearchResultActivity extends AppCompatActivity implements AbsListVi
 
             } catch (JSONException e) {
                 Log.e("Result", "getCount: ", e);
+                return 0;
             }
-            return 0;
         }
 
         @Override

+ 74 - 1
RedAnt Mobile/app/src/main/java/com/usai/redant/Search/RamSearchActivity.java

@@ -1,19 +1,92 @@
 package com.usai.redant.Search;
 
+import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.ExpandableListView;
 
 import com.usai.redant.CommonEditor.CommonEditorActivity;
+import com.usai.redant.Result.SearchResultActivity;
 import com.usai.redant.redantmobile.R;
 import com.usai.redant.util.Network;
+import com.usai.redant.util.RAUtil;
 
+import org.json.JSONArray;
+import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.Iterator;
+
 public class RamSearchActivity extends CommonEditorActivity {
 
+    private Context mContext;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+
+        mContext = this;
+
+        hasChildView = true;
+        setContentView(R.layout.activity_ram_search);
+        listView = (ExpandableListView)findViewById(R.id.ram_search_list_view);
+
         super.onCreate(savedInstanceState);
-//        setContentView(R.layout.activity_ram_search);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.ram_search_menu,menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        if (item.getItemId() == R.id.ram_search_search_btn) {
+            JSONObject upparams = check_cancomit(false);
+
+            if (cancommit == false) {
+                return true;
+            }
+
+            try {
+                JSONObject hidden_params = content_data_download.optJSONObject("hidden_params");
+
+                if (hidden_params != null) {
+
+                    Iterator<String> iterator = hidden_params.keys();
+                    while (iterator.hasNext()) {
+                        String key = iterator.next();
+                        Object value = hidden_params.get(key);
+                        if (value != null) {
+                            upparams.put(key,value);
+                        }
+                    }
+                }
+
+                JSONArray criteria = RAUtil.jsonObject2KVArray(upparams,true);
+
+                Bundle result_params = new Bundle();
+                result_params.putString("criteria",criteria.toString());
+                result_params.putString("query_id",selfParams.getString("query_id"));
+                result_params.putString("title",selfParams.getString("title"));
+
+                Intent intent = new Intent(mContext, SearchResultActivity.class);
+                intent.putExtra("query_params",result_params);
+
+                startActivity(intent);
+
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+
+        }
+
+        return true;
     }
 
     @Override

+ 23 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/util/Network.java

@@ -1647,6 +1647,29 @@ public class Network
 
 		String json_string = getJson(request_url,params);
 
+		if (json_string == null || json_string.isEmpty()) {
+			return null;
+		}
+
+		try {
+			return new JSONObject(json_string);
+		} catch (JSONException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	public static JSONObject query(Bundle params) {
+
+		params.putString("_action","ant_mobile");
+		params.putString("_operate","getResult");
+
+		String json_string = getJson(RedAntApplication.server,params);
+
+		if (json_string == null || json_string.isEmpty()) {
+			return null;
+		}
+
 		try {
 			return new JSONObject(json_string);
 		} catch (JSONException e) {

+ 43 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/util/RAUtil.java

@@ -566,4 +566,47 @@ public class RAUtil {
 //        }
 //        return bundle;
 //    }
+
+    public static JSONArray jsonObject2KVArray(JSONObject object, boolean trim) {
+
+        if (object == null) {
+            return null;
+        }
+
+        try {
+            JSONArray ret = new JSONArray();
+            Iterator<String> iterator = object.keys();
+
+            while (iterator.hasNext()) {
+
+                JSONObject kv = new JSONObject();
+
+                String key = iterator.next();
+                Object value = object.get(key);
+
+                kv.put("key",key);
+                if (trim) {
+                    if (value == null) {
+                        continue;
+                    }
+                    String val = value.toString();
+                    if (val.length() == 0) {
+                        continue;
+                    }
+                }
+
+                kv.put("value",value);
+                ret.put(kv);
+
+            }
+
+            return ret;
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
 }

+ 1 - 2
RedAnt Mobile/app/src/main/res/layout/activity_common_editor.xml

@@ -5,8 +5,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="com.usai.redant.CommonEditor.CommonEditorActivity"
-    android:background="#ffaaff">
+    tools:context="com.usai.redant.CommonEditor.CommonEditorActivity">
 
     
     <ExpandableListView

+ 1 - 0
RedAnt Mobile/app/src/main/res/layout/activity_date_picker.xml

@@ -7,6 +7,7 @@
     tools:context="com.usai.redant.CommonEditor.DatePickerActivity">
 
     <DatePicker
+        android:id="@+id/date_picker"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:datePickerMode="spinner"

+ 8 - 3
RedAnt Mobile/app/src/main/res/layout/activity_ram_search.xml

@@ -1,10 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout
+<RelativeLayout
     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"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context="com.usai.redant.Search.RamSearchActivity">
 
-</android.support.constraint.ConstraintLayout>
+    <ExpandableListView
+        android:id="@+id/ram_search_list_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
+
+</RelativeLayout>

+ 75 - 0
RedAnt Mobile/app/src/main/res/layout/common_editor_date_range_cell.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="120dp">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        >
+
+        <TextView
+            android:id="@+id/range_title_tv"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_centerVertical="true"
+            android:gravity="start|center_vertical"
+            android:layout_margin="5dp"
+            android:textSize="17sp"
+            android:textColor="#000000"
+            android:text="Label"
+            />
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="80dp"
+        >
+
+        <View
+            android:id="@+id/date_start_place"
+            android:layout_width="1dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentStart="true"
+            />
+
+        <Button
+            android:id="@+id/range_minimum_btn"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:layout_toEndOf="@+id/date_start_place"
+            android:background="@drawable/black_border"
+            android:gravity="center"
+            android:hint="minimum"
+            android:textSize="17sp"/>
+
+
+        <View
+            android:id="@+id/date_end_place"
+            android:layout_width="1dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentEnd="true"
+            />
+
+        <Button
+            android:id="@+id/range_maximum_btn"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:layout_alignBottom="@id/range_minimum_btn"
+            android:layout_alignTop="@id/range_minimum_btn"
+            android:layout_marginEnd="10dp"
+            android:layout_toStartOf="@id/date_end_place"
+            android:background="@drawable/black_border"
+            android:gravity="center"
+            android:hint="maximum"
+            android:textSize="17sp"/>
+
+    </RelativeLayout>
+
+
+</LinearLayout>

+ 75 - 0
RedAnt Mobile/app/src/main/res/layout/common_editor_range_cell.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="120dp">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        >
+
+        <TextView
+            android:id="@+id/range_title_tv"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:gravity="start|center_vertical"
+            android:layout_margin="5dp"
+            android:textSize="17sp"
+            android:textColor="#000000"
+            android:text="Label"
+            />
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="2"
+        >
+
+        <View
+            android:id="@+id/start_place"
+            android:layout_width="1dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentStart="true"
+            />
+
+        <EditText
+            android:id="@+id/range_minimum_et"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:layout_toEndOf="@id/start_place"
+            android:layout_centerVertical="true"
+            android:layout_margin="10dp"
+            android:gravity="center"
+            android:hint="minimum"
+            android:textSize="17sp"
+            />
+
+
+        <View
+            android:id="@+id/end_place"
+            android:layout_width="1dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentEnd="true"
+            />
+
+        <EditText
+            android:id="@+id/range_maximum_et"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:layout_marginEnd="10dp"
+            android:gravity="center"
+            android:hint="maximum"
+            android:textSize="17sp"
+            android:layout_alignBottom="@id/range_minimum_et"
+            android:layout_toStartOf="@id/end_place"
+            android:layout_alignTop="@id/range_minimum_et"/>
+
+    </RelativeLayout>
+
+
+</LinearLayout>

+ 12 - 0
RedAnt Mobile/app/src/main/res/menu/ram_search_menu.xml

@@ -0,0 +1,12 @@
+<?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/ram_search_search_btn"
+          android:title="Search"
+          android:icon="@drawable/camera"
+          app:showAsAction="always">
+
+    </item>
+
+</menu>

+ 1 - 1
RedAnt Mobile/build.gradle

@@ -5,7 +5,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:2.3.3'
+        classpath 'com.android.tools.build:gradle:3.0.1'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files

+ 2 - 0
RedAnt Mobile/gradle.properties

@@ -11,6 +11,8 @@
 # The setting is particularly useful for tweaking memory settings.
 org.gradle.jvmargs=-Xmx1536m
 
+android.enableAapt2=false
+
 # When configured, Gradle will run in incubating parallel mode.
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects

+ 3 - 2
RedAnt Mobile/gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,7 @@
-#Mon Dec 11 11:41:46 CST 2017
+#Wed Dec 13 16:48:05 CST 2017
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
+#distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
+distributionUrl=http\://127.0.0.1/gradle-4.1-all.zip