haijiang
2018-07-10 487102118041896810e4657a37eaab43a8998bc5
提交
49 files added
9 files modified
1896 ■■■■ changed files
app/build.gradle 15 ●●●●● patch | view | raw | blame | history
app/libs/BaiduLBS_Android.jar patch | view | raw | blame | history
app/libs/arm64-v8a/libBaiduMapSDK_base_v5_1_0.so patch | view | raw | blame | history
app/libs/arm64-v8a/libBaiduMapSDK_map_v5_1_0.so patch | view | raw | blame | history
app/libs/arm64-v8a/libindoor.so patch | view | raw | blame | history
app/libs/arm64-v8a/liblocSDK7b.so patch | view | raw | blame | history
app/libs/armeabi-v7a/libBaiduMapSDK_base_v5_1_0.so patch | view | raw | blame | history
app/libs/armeabi-v7a/libBaiduMapSDK_map_v5_1_0.so patch | view | raw | blame | history
app/libs/armeabi-v7a/libindoor.so patch | view | raw | blame | history
app/libs/armeabi-v7a/liblocSDK7b.so patch | view | raw | blame | history
app/libs/armeabi/libBaiduMapSDK_base_v5_1_0.so patch | view | raw | blame | history
app/libs/armeabi/libBaiduMapSDK_map_v5_1_0.so patch | view | raw | blame | history
app/libs/armeabi/libindoor.so patch | view | raw | blame | history
app/libs/armeabi/liblocSDK7b.so patch | view | raw | blame | history
app/libs/x86/libBaiduMapSDK_base_v5_1_0.so patch | view | raw | blame | history
app/libs/x86/libBaiduMapSDK_map_v5_1_0.so patch | view | raw | blame | history
app/libs/x86/libindoor.so patch | view | raw | blame | history
app/libs/x86/liblocSDK7b.so patch | view | raw | blame | history
app/libs/x86_64/libBaiduMapSDK_base_v5_1_0.so patch | view | raw | blame | history
app/libs/x86_64/libBaiduMapSDK_map_v5_1_0.so patch | view | raw | blame | history
app/libs/x86_64/libindoor.so patch | view | raw | blame | history
app/libs/x86_64/liblocSDK7b.so patch | view | raw | blame | history
app/src/main/AndroidManifest.xml 35 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/MainApp.java 11 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/activity/ChartActivity.java 267 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/activity/DeviceDataActivity.java 160 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/activity/LoginActivity.java 79 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/activity/MapActivity.java 257 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/adapter/DeviceDataAdapter.java 40 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/common/API.java 7 ●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/httputils/HttpUtils.java 461 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/model/DeviceBean.java 143 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/model/DeviceDataBean.java 89 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/model/SensorData.java 17 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/screen/utils/SharedPreferencesUtil.java 45 ●●●●● patch | view | raw | blame | history
app/src/main/res/drawable/my_progress_background.xml 18 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/ac_charts_layout.xml 53 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/ac_device_data_layout.xml 51 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/ac_login_layout.xml 2 ●●● patch | view | raw | blame | history
app/src/main/res/layout/ac_map_layout.xml 49 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/list_item_data.xml 46 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/pop_layout.xml 40 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/top_bar_layout.xml 9 ●●●●● patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/bg_chart.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/bg_data.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/bg_map.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/bg_pop.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_close.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_level1.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_level2.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_level3.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_normal.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_offline.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_white_jiantou.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_xia.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/icon_yuan.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/pro_kuang.png patch | view | raw | blame | history
app/src/main/res/values/colors.xml 2 ●●● patch | view | raw | blame | history
app/build.gradle
@@ -11,6 +11,20 @@
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        // your debug keystore
        debug {
            keyAlias 'moral'
            keyPassword 'moral123456'
            storeFile file("C:\\Users\\Administrator\\Desktop\\key\\key.jks")
            storePassword 'moral123456'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
@@ -36,4 +50,5 @@
    compile('com.github.niorgai:StatusBarCompat:2.1.4', {
        exclude group: 'com.android.support'
    })
    compile 'com.github.lecho:hellocharts-library:1.5.8@aar'
}
app/libs/BaiduLBS_Android.jar
Binary files differ
app/libs/arm64-v8a/libBaiduMapSDK_base_v5_1_0.so
Binary files differ
app/libs/arm64-v8a/libBaiduMapSDK_map_v5_1_0.so
Binary files differ
app/libs/arm64-v8a/libindoor.so
Binary files differ
app/libs/arm64-v8a/liblocSDK7b.so
Binary files differ
app/libs/armeabi-v7a/libBaiduMapSDK_base_v5_1_0.so
Binary files differ
app/libs/armeabi-v7a/libBaiduMapSDK_map_v5_1_0.so
Binary files differ
app/libs/armeabi-v7a/libindoor.so
Binary files differ
app/libs/armeabi-v7a/liblocSDK7b.so
Binary files differ
app/libs/armeabi/libBaiduMapSDK_base_v5_1_0.so
Binary files differ
app/libs/armeabi/libBaiduMapSDK_map_v5_1_0.so
Binary files differ
app/libs/armeabi/libindoor.so
Binary files differ
app/libs/armeabi/liblocSDK7b.so
Binary files differ
app/libs/x86/libBaiduMapSDK_base_v5_1_0.so
Binary files differ
app/libs/x86/libBaiduMapSDK_map_v5_1_0.so
Binary files differ
app/libs/x86/libindoor.so
Binary files differ
app/libs/x86/liblocSDK7b.so
Binary files differ
app/libs/x86_64/libBaiduMapSDK_base_v5_1_0.so
Binary files differ
app/libs/x86_64/libBaiduMapSDK_map_v5_1_0.so
Binary files differ
app/libs/x86_64/libindoor.so
Binary files differ
app/libs/x86_64/liblocSDK7b.so
Binary files differ
app/src/main/AndroidManifest.xml
@@ -2,7 +2,24 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.moral.screen">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    //获取设备网络状态,禁用后无法获取网络状态
    <uses-permission android:name="android.permission.INTERNET"/>
    //网络权限,当禁用后,无法进行检索等相关业务
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    //读取设备硬件信息,统计数据
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    //读取系统信息,包含系统版本等信息,用作统计
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    //获取设备的网络状态,鉴权所需网络代理
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    //允许sd卡写权限,需写入地图数据,禁用后无法显示地图
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    //获取统计数据
    <uses-permission android:name="android.permission.GET_TASKS" />
    //鉴权所需该权限获取进程列表
    <uses-permission android:name="android.permission.CAMERA" />
    <application
        android:name=".MainApp"
        android:allowBackup="true"
@@ -10,14 +27,26 @@
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        tools:replace="android:icon"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.LoginActivity">
        android:theme="@style/AppTheme"
        tools:replace="android:icon">
        <activity android:name=".activity.LoginActivity" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".activity.MapActivity" android:screenOrientation="portrait"/>
        <activity android:name=".activity.DeviceDataActivity" android:screenOrientation="portrait"/>
        <activity android:name=".activity.ChartActivity" android:screenOrientation="portrait"/>
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="Pel4i0XKOQFmw3kO2awBV7uFI1Cb5BMm" />
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>
    </application>
</manifest>
app/src/main/java/com/moral/screen/MainApp.java
@@ -3,10 +3,13 @@
import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;
import com.baidu.mapapi.SDKInitializer;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cookie.store.PersistentCookieStore;
import com.moral.andbrickslib.utils.ScreenUtils;
import com.moral.andbrickslib.utils.log.XLog;
import com.moral.screen.utils.SharedPreferencesUtil;
/**
@@ -15,8 +18,9 @@
public class MainApp extends Application {
    public static MainApp theApp;
    public SharedPreferencesUtil mSharedPreferencesUtil;
    //用户id
    public int userId = 0;
    public int orgId = 0;
    public int width;
    @Override
    public void onCreate() {
@@ -24,8 +28,13 @@
        this.theApp = this;
        XLog.init("haijiang");
        width = ScreenUtils.getScreenWidth(this);
        if(mSharedPreferencesUtil==null){
            mSharedPreferencesUtil = new SharedPreferencesUtil(this);
        }
        orgId = mSharedPreferencesUtil.getOrgId();
        OkGo.init(this);
        OkGo.getInstance().setCookieStore(new PersistentCookieStore());
        SDKInitializer.initialize(getApplicationContext());
    }
    @Override
app/src/main/java/com/moral/screen/activity/ChartActivity.java
New file
@@ -0,0 +1,267 @@
package com.moral.screen.activity;
import android.app.AlertDialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.TextView;
import com.lzy.okgo.cache.CacheMode;
import com.moral.andbrickslib.utils.FastJsonTools;
import com.moral.andbrickslib.utils.NumberUtils;
import com.moral.andbrickslib.utils.TimeUtil;
import com.moral.screen.R;
import com.moral.screen.base.BaseActivity;
import com.moral.screen.common.API;
import com.moral.screen.httputils.HttpCallBack;
import com.moral.screen.model.SensorData;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import lecho.lib.hellocharts.formatter.AxisValueFormatter;
import lecho.lib.hellocharts.formatter.LineChartValueFormatter;
import lecho.lib.hellocharts.formatter.SimpleAxisValueFormatter;
import lecho.lib.hellocharts.formatter.SimpleLineChartValueFormatter;
import lecho.lib.hellocharts.gesture.ContainerScrollType;
import lecho.lib.hellocharts.gesture.ZoomType;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.model.Viewport;
import lecho.lib.hellocharts.view.LineChartView;
/**
 * Created by haijiang on 2017/7/13.
 */
public class ChartActivity extends BaseActivity {
    private LineChartView chartView;
    Line line;
    LineChartData data;
    Axis axisX;
    Axis axisY;
    private List<PointValue> mPointValues = new ArrayList<>();
    private List<AxisValue> mAxisXValues = new ArrayList<>();
    private TextView tv_sub;
    private String sensorKey, mac, name, unit;
    private float maxValue;
    private Timer timer;
    /**
     * 计时器
     */
    private boolean isFinish = false;
    private void showChangeLineChart() {
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if(!isFinish){
                    getData(1,false);
                }
            }
        },0,5*1000);
    }
    @Override
    protected void getBundleExtras(Bundle extras) {
        sensorKey = getIntent().getStringExtra("sensorKey");
        mac = getIntent().getStringExtra("mac");
        name = getIntent().getStringExtra("name");
        unit = getIntent().getStringExtra("unit");
        maxValue = getIntent().getFloatExtra("maxValue", 0);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.ac_charts_layout;
    }
    @Override
    protected void initViews() {
        initTopBar();
        tv_title.setText("动态走势");
        tv_sub = findView(R.id.tv_sub);
        tv_sub.setText(name + "动态走势图");
        chartView = findView(R.id.chart);
        initLineChart();
    }
    @Override
    protected void initListener() {
    }
    @Override
    protected void initData() {
        getData(8,true);
        showChangeLineChart();
    }
    @Override
    protected void processClick(View view) {
        switch (view.getId()) {
            case R.id.tv_left:
                finish();
                break;
        }
    }
    @Override
    protected void onErrorPageClick() {
    }
    private void initLineChart() {
        line = new Line(mPointValues).setColor(Color.parseColor("#ffffff"));  //折线的颜色
        List<Line> lines = new ArrayList<>();
        line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状  这里是圆形 (有三种 :ValueShape.SQUARE  ValueShape.CIRCLE  ValueShape.DIAMOND)
        line.setPointColor(Color.parseColor("#ffffff"));
        line.setCubic(false);//曲线是否平滑,即是曲线还是折线
        line.setFilled(false);//是否填充曲线的面积
        line.setHasLabels(true);//曲线的数据坐标是否加上备注
//      line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效)
        line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示
        line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)
        LineChartValueFormatter chartValueFormatter = new SimpleLineChartValueFormatter(1);
        line.setFormatter(chartValueFormatter);//显示小数点
        lines.add(line);
        data = new LineChartData();
        data.setLines(lines);
        data.setValueLabelBackgroundColor(Color.TRANSPARENT);//此处设置坐标点旁边的文字背景
        data.setValueLabelBackgroundEnabled(false);
        data.setValueLabelsTextColor(Color.GRAY);
        //坐标轴
        axisX = new Axis(); //X轴
        axisX.setHasTiltedLabels(true);  //X坐标轴字体是斜的显示还是直的,true是斜的显示
        axisX.setName("实时数据");  //表格名称
        axisX.setTextSize(8);//设置字体大小
        axisX.setTextColor(getResources().getColor(R.color.blue_txt));
//        axisX.setMaxLabelChars(7); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length
        axisX.setValues(mAxisXValues);  //填充X轴的坐标名称
        axisX.setHasLines(true); //x 轴分割线
        axisX.setLineColor(getResources().getColor(R.color.blue_txt));
        axisX.setHasSeparationLine(true);
        data.setAxisXBottom(axisX); //x 轴在底部
        //data.setAxisXTop(axisX);  //x 轴在顶部
        // Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案)
        axisY = Axis.generateAxisFromRange((float) 0.0, maxValue == 0 ? 100 : maxValue, maxValue == 0 ? 10 : maxValue / 16);  //Y轴
//        axisY = new Axis();
        axisY.setAutoGenerated(false);
        AxisValueFormatter yvalue = new SimpleAxisValueFormatter(1);
        axisY.setFormatter(yvalue);
        axisY.setHasLines(true);
        axisY.setHasSeparationLine(true);
        axisY.setName("单位:" + unit);//y轴标注
        axisY.setTextSize(10);//设置字体大小
        axisY.setTextColor(getResources().getColor(R.color.blue_txt));
        axisY.setLineColor(getResources().getColor(R.color.blue_txt));
        data.setAxisYLeft(axisY);  //Y轴设置在左边
        //设置行为属性,支持缩放、滑动以及平移
        chartView.setInteractive(true);
        chartView.setZoomType(ZoomType.HORIZONTAL);
        chartView.setMaxZoom((float) 2);//最大方法比例
        chartView.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);
        chartView.setLineChartData(data);
        chartView.setVisibility(View.VISIBLE);
        /**注:下面的7,10只是代表一个数字去类比而已
         * 当时是为了解决X轴固定数据个数。见(http://forum.xda-developers.com/tools/programming/library-hellocharts-charting-library-t2904456/page2);
         */
        final Viewport v = new Viewport(chartView.getMaximumViewport());
        v.bottom = (float) 0.0;
        v.top = maxValue;
        chartView.setMaximumViewport(v);
        chartView.setCurrentViewport(v);
    }
    private int index = 0;
    private void reshowChart(final SensorData sensorData) {
        chartView.post(new Runnable() {
            @Override
            public void run() {
                mPointValues.add(new PointValue(index, sensorData.getValue()));
                mAxisXValues.add(new AxisValue(index).setLabel(index + ""));
                if(mPointValues.size()>8){
                    mPointValues.remove(0);
                }
                if(mAxisXValues.size()>8){
                    mAxisXValues.remove(0);
                }
                axisX.setValues(mAxisXValues);
                data.setAxisXBottom(axisX);
                line.setValues(mPointValues);
                List<Line> lines = new ArrayList<Line>();
                lines.add(line);
                data.setLines(lines);
                chartView.setLineChartData(data);
                index++;
                final Viewport v = new Viewport(chartView.getMaximumViewport());
                v.bottom = (float) 0.0;
                v.top = maxValue;
                chartView.setMaximumViewport(v);
                chartView.setCurrentViewport(v);
            }
        });
    }
    private ArrayList<SensorData> dataList = new ArrayList<>();
    private void getData(int size,boolean show) {
        HashMap<String, String> params = new HashMap<>();
        params.put("sensorKey", sensorKey);
        params.put("mac", mac);
        params.put("size", size + "");
        mHttpUtils.doGet(API.SENSOR, params, CacheMode.DEFAULT, show, new HttpCallBack() {
            @Override
            public void onSuccess(String res, String msg) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                ArrayList<SensorData> temp = (ArrayList<SensorData>) FastJsonTools.getArrayJson(res, SensorData.class);
                if (temp != null) {
                    dataList.clear();
                    dataList.addAll(temp);
                }
                for (SensorData data:dataList){
                    reshowChart(data);
                }
            }
            @Override
            public void showLoadingDialog() {
                progressDialog.show();
            }
            @Override
            public void onFail(int errno, String s) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
            }
        });
    }
}
app/src/main/java/com/moral/screen/activity/DeviceDataActivity.java
New file
@@ -0,0 +1,160 @@
package com.moral.screen.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.model.LatLng;
import com.lzy.okgo.cache.CacheMode;
import com.moral.andbrickslib.baseadapter.recyclerview.MultiItemTypeAdapter;
import com.moral.andbrickslib.utils.FastJsonTools;
import com.moral.screen.MainApp;
import com.moral.screen.R;
import com.moral.screen.adapter.DeviceDataAdapter;
import com.moral.screen.base.BaseActivity;
import com.moral.screen.common.API;
import com.moral.screen.httputils.HttpCallBack;
import com.moral.screen.model.DeviceBean;
import com.moral.screen.model.DeviceDataBean;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
/**
 * Created by hjzhang on 2018/7/4.
 */
public class DeviceDataActivity extends BaseActivity {
    private TextView tv_left;
    private RecyclerView rv_data;
    private DeviceDataAdapter adapter;
    private ArrayList<DeviceDataBean> dataList = new ArrayList<>();
    private int  deviceVersionId,deviceId;
    private String mac;
    private Timer timer;
    /**
     * 计时器
     */
    private boolean isFinish = false;
    private void getDataForTime() {
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if(!isFinish){
                    getData(false);
                }
            }
        },0,10*1000);
    }
    @Override
    protected void getBundleExtras(Bundle extras) {
        deviceVersionId = getIntent().getIntExtra("deviceVersionId",0);
        deviceId = getIntent().getIntExtra("deviceId",0);
        mac = getIntent().getStringExtra("mac");
    }
    @Override
    protected int getLayoutId() {
        return R.layout.ac_device_data_layout;
    }
    @Override
    protected void initViews() {
        tv_left = findView(R.id.tv_left);
        rv_data = findView(R.id.rv_data);
        adapter = new DeviceDataAdapter(rv_data,R.layout.list_item_data,dataList);
        rv_data.setLayoutManager(new LinearLayoutManager(rv_data.getContext()));
        rv_data.setAdapter(adapter);
        adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
                DeviceDataBean data = dataList.get(position);
                Intent intent = new Intent(DeviceDataActivity.this,ChartActivity.class);
                intent.putExtra("sensorKey",data.getSensor_key());
                intent.putExtra("name",data.getDescription());
                intent.putExtra("mac",mac);
                intent.putExtra("maxValue",data.getUpper());
                intent.putExtra("unit",data.getUnit());
                startActivity(intent);
            }
            @Override
            public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
                return false;
            }
        });
    }
    @Override
    protected void initListener() {
        tv_left.setOnClickListener(this);
    }
    @Override
    protected void initData() {
        getData(true);
        getDataForTime();
    }
    @Override
    protected void processClick(View view) {
        switch (view.getId()){
            case R.id.tv_left:
                finish();
                break;
        }
    }
    @Override
    protected void onErrorPageClick() {
    }
    private void getData(boolean show) {
        HashMap<String, String> params = new HashMap<>();
        params.put("deviceVersionId", deviceVersionId+"");
        params.put("deviceId", deviceId+"");
        params.put("mac", mac);
        mHttpUtils.doGet(API.SENSORS, params, CacheMode.DEFAULT, show, new HttpCallBack() {
            @Override
            public void onSuccess(String res, String msg) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                ArrayList<DeviceDataBean> temp = (ArrayList<DeviceDataBean>) FastJsonTools.getArrayJson(res,DeviceDataBean.class);
                if(temp!=null){
                    dataList.clear();
                    dataList.addAll(temp);
                }
                adapter.notifyDataSetChanged();
            }
            @Override
            public void showLoadingDialog() {
                progressDialog.setTitleText("正在获取数据...");
                progressDialog.show();
            }
            @Override
            public void onFail(int errno, String s) {
                mToatUtils.showSingletonToast(s);
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
            }
        });
    }
}
app/src/main/java/com/moral/screen/activity/LoginActivity.java
@@ -1,10 +1,24 @@
package com.moral.screen.activity;
import android.content.Intent;
import android.content.SearchRecentSuggestionsProvider;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.lzy.okgo.cache.CacheMode;
import com.moral.screen.MainApp;
import com.moral.screen.R;
import com.moral.screen.base.BaseActivity;
import com.moral.screen.common.API;
import com.moral.screen.httputils.HttpCallBack;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
/**
 * 登录界面
@@ -12,6 +26,9 @@
 */
public class LoginActivity extends BaseActivity {
    private Button bt_sure;
    private EditText et_phone, et_pwd;
    @Override
    protected void getBundleExtras(Bundle extras) {
@@ -24,11 +41,16 @@
    @Override
    protected void initViews() {
        bt_sure = findView(R.id.bt_sure);
        et_phone = findView(R.id.et_phone);
        et_pwd = findView(R.id.et_pwd);
        et_phone.setText("admin");
        et_pwd.setText("123456");
    }
    @Override
    protected void initListener() {
        bt_sure.setOnClickListener(this);
    }
    @Override
@@ -38,6 +60,21 @@
    @Override
    protected void processClick(View view) {
        switch (view.getId()) {
            case R.id.bt_sure:
                String phone = et_phone.getText().toString();
                if (TextUtils.isEmpty(phone)) {
                    mToatUtils.showSingletonToast("请输入手机号码");
                    return;
                }
                String password = et_pwd.getText().toString();
                if (TextUtils.isEmpty(password)) {
                    mToatUtils.showSingletonToast("请输入密码");
                    return;
                }
                login(phone, password);
                break;
        }
    }
@@ -45,4 +82,44 @@
    protected void onErrorPageClick() {
    }
    private void login(String phone, String password) {
        HashMap<String, String> params = new HashMap<>();
        params.put("account", phone);
        params.put("password", password);
        mHttpUtils.doGet(API.LOGIN, params, CacheMode.DEFAULT, true, new HttpCallBack() {
            @Override
            public void onSuccess(String res, String msg) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                try {
                    JSONObject json = new JSONObject(res);
                    int organizationId = json.optInt("organizationId");
                    MainApp.theApp.orgId = organizationId;
                    MainApp.theApp.mSharedPreferencesUtil.saveOrgId(organizationId);
                    Intent intent = new Intent(LoginActivity.this, MapActivity.class);
                    startActivity(intent);
                    finish();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void showLoadingDialog() {
                progressDialog.setTitleText("正在登录...");
                progressDialog.show();
            }
            @Override
            public void onFail(int errno, String s) {
                mToatUtils.showSingletonToast(s);
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
            }
        });
    }
}
app/src/main/java/com/moral/screen/activity/MapActivity.java
New file
@@ -0,0 +1,257 @@
package com.moral.screen.activity;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;
import com.lzy.okgo.cache.CacheMode;
import com.moral.andbrickslib.utils.FastJsonTools;
import com.moral.screen.MainApp;
import com.moral.screen.common.API;
import com.moral.screen.httputils.HttpCallBack;
import com.moral.screen.model.DeviceBean;
import com.moral.screen.R;
import com.moral.screen.base.BaseActivity;
import java.util.ArrayList;
import java.util.HashMap;
/**
 * Created by hjzhang on 2018/7/2.
 */
public class MapActivity extends BaseActivity {
    private TextView tv_left;
    private MapView bmapView;
    private BaiduMap mBaiduMap;
    BitmapDescriptor bdNormal = BitmapDescriptorFactory
            .fromResource(R.mipmap.icon_normal);
    BitmapDescriptor bdA = BitmapDescriptorFactory
            .fromResource(R.mipmap.icon_level1);
    BitmapDescriptor bdB = BitmapDescriptorFactory
            .fromResource(R.mipmap.icon_level2);
    BitmapDescriptor bdC = BitmapDescriptorFactory
            .fromResource(R.mipmap.icon_level3);
    BitmapDescriptor bdOffline = BitmapDescriptorFactory
            .fromResource(R.mipmap.icon_offline);
    private ArrayList<Marker> mkList = new ArrayList<>();
    private ArrayList<DeviceBean> deviceList = new ArrayList<>();
    private View popView;
    private TextView tv_name,tv_address;
    private ImageView iv_close;
    private LinearLayout ll_pop;
    private DeviceBean curDeviceBean;
    @Override
    protected void getBundleExtras(Bundle extras) {
    }
    @Override
    protected int getLayoutId() {
        return R.layout.ac_map_layout;
    }
    @Override
    protected void initViews() {
        tv_left = findView(R.id.tv_left);
        bmapView = findView(R.id.bmapView);
        popView = LayoutInflater.from(this).inflate(R.layout.pop_layout,null);
        tv_name = popView.findViewById(R.id.tv_name);
        tv_address = popView.findViewById(R.id.tv_address);
        iv_close = popView.findViewById(R.id.iv_close);
        ll_pop = popView.findViewById(R.id.ll_pop);
        initMap();
    }
    @Override
    protected void initListener() {
        tv_left.setOnClickListener(this);
        iv_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mBaiduMap.hideInfoWindow();
            }
        });
        ll_pop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if("4".equals(curDeviceBean.getState())){
                    mToatUtils.showSingletonToast("该设备正在维保中...");
                    return;
                }
                Intent intent = new Intent(MapActivity.this,DeviceDataActivity.class);
                intent.putExtra("deviceVersionId",curDeviceBean.getDeviceVersionId());
                intent.putExtra("mac",curDeviceBean.getMac());
                intent.putExtra("deviceId",curDeviceBean.getId());
                startActivity(intent);
            }
        });
    }
    @Override
    protected void initData() {
        getData();
    }
    @Override
    protected void processClick(View view) {
        switch (view.getId()){
            case R.id.tv_left:
                finish();
                break;
        }
    }
    @Override
    protected void onErrorPageClick() {
    }
    private void initMap(){
        mBaiduMap = bmapView.getMap();
        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            public boolean onMarkerClick(final Marker marker) {
                if (marker != null) {
                    curDeviceBean = deviceList.get(marker.getZIndex());
                    tv_address.setText("地址:"+curDeviceBean.getAddress());
                    tv_name.setText(curDeviceBean.getName());
                    final LatLng ll = marker.getPosition();
                    InfoWindow mInfoWindow;
                    Point p = mBaiduMap.getProjection().toScreenLocation(ll);
                    p.y -= 47;
                    LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p);
                    //为弹出的InfoWindow添加点击事件
                    mInfoWindow = new InfoWindow(popView,llInfo,0);
                    mBaiduMap.showInfoWindow(mInfoWindow);
                }
                return true;
            }
        });
    }
    /**
     * 标注地图
     */
    private void showMapData(){
        mBaiduMap.clear();
        MarkerOptions mo = null;
        Marker mMarker = null;
        LatLng ll = null;
        for (int i = 0; i < deviceList.size(); i++) {
            DeviceBean bean = deviceList.get(i);
            double lat = bean.getLatitude();
            double lon = bean.getLongitude();
            ll = new LatLng(lat, lon);
//            0 正常
//            1 一级警报
//            2 二级警报
//            3 三级警报
//            4 维保
            if ("0".equals(bean.getState())) {
                mo = new MarkerOptions().position(ll).icon(bdNormal)
                        .zIndex(i);
            } else if ("1".equals(bean.getState())) {
                mo = new MarkerOptions().position(ll).icon(bdA)
                        .zIndex(i);
            } else if ("2".equals(bean.getState())) {
                mo = new MarkerOptions().position(ll).icon(bdB)
                        .zIndex(i);
            }else if ("3".equals(bean.getState())) {
                mo = new MarkerOptions().position(ll).icon(bdC)
                        .zIndex(i);
            }else if ("4".equals(bean.getState())) {
                mo = new MarkerOptions().position(ll).icon(bdOffline)
                        .zIndex(i);
            }
            // 掉下动画
            mo.animateType(MarkerOptions.MarkerAnimateType.drop);
            mMarker = (Marker) (mBaiduMap.addOverlay(mo));
            mkList.add(mMarker);
        }
    }
    @Override
    public void onResume() {
        super.onResume();
        bmapView.onResume();
    }
    @Override
    public void onPause() {
        super.onPause();
        bmapView.onPause();
    }
    @Override
    public void onDestroy() {
        bdNormal.recycle();
        bdOffline.recycle();
        bdA.recycle();
        bdB.recycle();
        bdC.recycle();
        super.onDestroy();
        bmapView.onDestroy();
    }
    private void getData() {
        HashMap<String, String> params = new HashMap<>();
        params.put("organizationId", MainApp.theApp.orgId+"");
        mHttpUtils.doGet(API.DEVICES, params, CacheMode.DEFAULT, true, new HttpCallBack() {
            @Override
            public void onSuccess(String res, String msg) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                ArrayList<DeviceBean> temp = (ArrayList<DeviceBean>) FastJsonTools.getArrayJson(res,DeviceBean.class);
                if(temp!=null){
                    deviceList.clear();
                    deviceList.addAll(temp);
                }
                if(deviceList.size()>0){
                    DeviceBean bean = deviceList.get(0);
                    LatLng ll = new LatLng(bean.getLatitude(),
                            bean.getLongitude());
                    MapStatus.Builder builder = new MapStatus.Builder();
                    builder.target(ll).zoom(18.0f);
                    mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
                }
                showMapData();
            }
            @Override
            public void showLoadingDialog() {
                progressDialog.setTitleText("正在获取数据...");
                progressDialog.show();
            }
            @Override
            public void onFail(int errno, String s) {
                mToatUtils.showSingletonToast(s);
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
            }
        });
    }
}
app/src/main/java/com/moral/screen/adapter/DeviceDataAdapter.java
New file
@@ -0,0 +1,40 @@
package com.moral.screen.adapter;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.moral.andbrickslib.baseadapter.recyclerview.CommonAdapter;
import com.moral.andbrickslib.baseadapter.recyclerview.base.ViewHolder;
import com.moral.screen.R;
import com.moral.screen.model.DeviceBean;
import com.moral.screen.model.DeviceDataBean;
import java.util.List;
/**
 * Created by hjzhang on 2018/7/4.
 */
public class DeviceDataAdapter extends CommonAdapter<DeviceDataBean> {
    public DeviceDataAdapter(RecyclerView v, int layoutId, List<DeviceDataBean> datas) {
        super(v, layoutId, datas);
    }
    @Override
    protected void convert(ViewHolder holder, DeviceDataBean item, int position) {
        TextView tv_name = holder.getView(R.id.tv_name);
        TextView tv_unit = holder.getView(R.id.tv_unit);
        ProgressBar progressBar = holder.getView(R.id.progressBar);
        tv_name.setText(item.getDescription());
        tv_unit.setText(item.getValue()+" ("+item.getUnit()+")");
        float barIndex = 0;
        try {
            barIndex = (Math.abs(item.getValue()) /item.getUpper());
        }catch (Exception e){
        }finally {
            progressBar.setProgress((int) (barIndex*100));
        }
    }
}
app/src/main/java/com/moral/screen/common/API.java
@@ -5,7 +5,10 @@
 */
public class API {
    public static final String BASE_HTTP = "http://dcdev3.s1.natapp.cc/bronzecoll/";
    public static final String URL_HTTP = BASE_HTTP+"api/";
    public static final String BASE_HTTP = "http://192.168.1.101:8090/screen_api_v2";
    public static final String LOGIN = BASE_HTTP+"/mobile/login";
    public static final String DEVICES = BASE_HTTP+"/mobile/devices";
    public static final String SENSORS = BASE_HTTP+"/mobile/sensors";
    public static final String SENSOR = BASE_HTTP+"/mobile/sensor";
}
app/src/main/java/com/moral/screen/httputils/HttpUtils.java
@@ -28,19 +28,21 @@
public class HttpUtils {
    private Context mConetext;
    public HttpUtils(Context context) {
        this.mConetext = context;
    }
    /**
     * Get请求
     *
     * @param url
     * @param params
     * @param cacheMode
     * @param showLoadingDialog
     * @param httpCallBack
     */
    public  void doGet(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpCallBack httpCallBack) {
    public void doGet(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpCallBack httpCallBack) {
        OkGo.get(url)
                .params(params)
                .cacheKey(String.valueOf(url))
@@ -62,102 +64,13 @@
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            if(errno == 1){
                                httpCallBack.onSuccess(jsonObject.optString("resObj"),message);
                            }else if(errno == 1002||errno == 1003){
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            }else{
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        if (response != null) {
                            int httpCode = response.code();
                            switch (httpCode) {
                                case 400:
                                    XLog.e("请求的语法出错");
                                    T.show("请求的语法出错");
                                    break;
                                case 401:
                                    XLog.e("未授权");
                                    T.show("未授权");
                                    break;
                                case 403:
                                    XLog.e("请求被拒绝");
                                    T.show("请求被拒绝");
                                    break;
                                case 404:
                                    XLog.e("请求的接口不存在");
                                    T.show("请求的接口不存在");
                                    break;
                                case 408:
                                    XLog.e("请求超时");
                                    T.show("请求超时");
                                    break;
                                case 500:
                                    XLog.e("服务器错误");
                                    T.show("服务器错误");
                                    break;
                                case 503:
                                    XLog.e("服务器停机或正在维护");
                                    T.show("服务器停机或正在维护");
                                    break;
                            }
                        }
                    }
                });
    }
    /**
     * Get请求
     * @param url
     * @param params
     * @param cacheMode
     * @param showLoadingDialog
     * @param httpCallBack
     */
    public void doGet(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpListCallBack httpCallBack) {
        OkGo.get(url)
                .params(params)
                .cacheKey(String.valueOf(url))
                .tag(String.valueOf(url))
                .cacheMode(cacheMode)
                .execute(new StringCallback() {
                    @Override
                    public void onBefore(BaseRequest request) {
                        super.onBefore(request);
                        XLog.e("url:" + request.getUrl());
                        XLog.e("method:" + request.getMethod());
                        XLog.e("params:" + request.getParams().toString());
                        if (showLoadingDialog)
                            httpCallBack.showLoadingDialog();
                    }
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            int totalPage = jsonObject.optInt("totalPage");
                            if(errno == 1){
                                httpCallBack.onSuccess(jsonObject.optString("resObj"),message,totalPage);
                            }else if(errno == 1002||errno == 1003){
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            }else{
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            int errno = jsonObject.optInt("code");
                            String message = jsonObject.optString("message");
                            if (errno == 1) {
                                httpCallBack.onSuccess(jsonObject.optString("data"), message);
                            } else {
                                String errorMsg = jsonObject.optString("message");
                                httpCallBack.onFail(errno, errorMsg);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
@@ -204,101 +117,7 @@
                });
    }
    /**
     * POST请求
     * @param url
     * @param params
     * @param cacheMode
     * @param showLoadingDialog
     * @param httpCallBack
     */
    public void doPostList(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpListCallBack httpCallBack) {
        OkGo.post(url)
                .params(params)
                .cacheKey(String.valueOf(url))
                .tag(String.valueOf(url))
                .cacheMode(cacheMode)
                .execute(new StringCallback() {
                    @Override
                    public void onBefore(BaseRequest request) {
                        super.onBefore(request);
                        XLog.e("url:" + request.getUrl());
                        XLog.e("method:" + request.getMethod());
                        XLog.e("params:" + request.getParams().toString());
                        if (showLoadingDialog)
                            httpCallBack.showLoadingDialog();
                    }
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            int totalPage = jsonObject.optInt("totalPage");
                            if(errno == 1){
                                httpCallBack.onSuccess(jsonObject.optString("resObj"),message,totalPage);
                            }else if(errno == 1002||errno == 1003){
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            }else{
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        if (response != null) {
                            int httpCode = response.code();
                            switch (httpCode) {
                                case 400:
                                    XLog.e("请求的语法出错");
                                    T.show("请求的语法出错");
                                    break;
                                case 401:
                                    XLog.e("未授权");
                                    T.show("未授权");
                                    break;
                                case 403:
                                    XLog.e("请求被拒绝");
                                    T.show("请求被拒绝");
                                    break;
                                case 404:
                                    XLog.e("请求的接口不存在");
                                    T.show("请求的接口不存在");
                                    break;
                                case 408:
                                    XLog.e("请求超时");
                                    T.show("请求超时");
                                    break;
                                case 500:
                                    XLog.e("服务器错误");
                                    T.show("服务器错误");
                                    break;
                                case 503:
                                    XLog.e("服务器停机或正在维护");
                                    T.show("服务器停机或正在维护");
                                    break;
                            }
                        }
                    }
                });
    }
    /**
     * Post请求
     * @param url
     * @param params
     * @param cacheMode
     * @param showLoadingDialog
     * @param httpCallBack
     */
    public  void doPost(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpCallBack httpCallBack) {
    public void doPost(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpCallBack httpCallBack) {
        OkGo.post(url)
                .cacheKey(String.valueOf(url))
                .tag(String.valueOf(url))
@@ -320,16 +139,13 @@
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            if(errno == 1){
                                httpCallBack.onSuccess(jsonObject.optString("resObj"),message);
                            }else if(errno == 1002||errno == 1003){
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            }else{
                                String errorMsg = jsonObject.optString("errorMsg");
                                httpCallBack.onFail(errno,errorMsg);
                            int errno = jsonObject.optInt("code");
                            String message = jsonObject.optString("message");
                            if (errno == 1) {
                                httpCallBack.onSuccess(jsonObject.optString("data"), message);
                            } else {
                                String errorMsg = jsonObject.optString("message");
                                httpCallBack.onFail(errno, errorMsg);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
@@ -367,247 +183,6 @@
                                break;
                        }
                    }
                });
    }
    /**
     * 上传文件
     * @param url
     * @param params
     * @param uploadCallBack
     * @param files
     */
    public  void uploadFiles(final String url, Map<String, String> params, final UploadCallBack uploadCallBack, List<File> files) {
        OkGo.post(url)
                .params(params)
                .isMultipart(true)
                .addFileParams("file", files)
                .execute(new StringCallback() {
                    @Override
                    public void onBefore(BaseRequest request) {
                        super.onBefore(request);
                        PostRequest re = (PostRequest) request;
                        XLog.e("url:" + re.getUrl());
                        XLog.e("method:" + re.getMethod());
                    }
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            if(errno == 1){
                                uploadCallBack.onSuccess(jsonObject.optString("resObj"),message);
                            }else{
                                uploadCallBack.onFail(message);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                        super.upProgress(currentSize, totalSize, progress, networkSpeed);
                        uploadCallBack.onProgress(currentSize, totalSize, progress, networkSpeed);
                    }
                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        if (response == null)
                            return;
                        int httpCode = response.code();
                        switch (httpCode) {
                            case 400:
                                T.show("请求的语法出错");
                                break;
                            case 401:
                                T.show("未授权");
                                break;
                            case 403:
                                T.show("请求被拒绝");
                                break;
                            case 404:
                                T.show("请求的接口不存在");
                                break;
                            case 408:
                                T.show("请求超时");
                                break;
                            case 500:
                                T.show("服务器错误");
                                break;
                            case 503:
                                T.show("服务器停机或正在维护");
                                break;
                        }
                    }
                });
    }
    public  void uploadFiles(final String url, Map<String, String> params, final UploadCallBack uploadCallBack, List<File> files,List<File> files2) {
        OkGo.post(url)
                .params(params)
                .isMultipart(true)
                .addFileParams("door", files)
                .addFileParams("images", files2)
                .execute(new StringCallback() {
                    @Override
                    public void onBefore(BaseRequest request) {
                        super.onBefore(request);
                        PostRequest re = (PostRequest) request;
                        XLog.e("url:" + re.getUrl());
                        XLog.e("method:" + re.getMethod());
                    }
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            if(errno == 1){
                                uploadCallBack.onSuccess(jsonObject.optString("resObj"),message);
                            }else{
                                uploadCallBack.onFail(message);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                        super.upProgress(currentSize, totalSize, progress, networkSpeed);
                        uploadCallBack.onProgress(currentSize, totalSize, progress, networkSpeed);
                    }
                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        if (response == null)
                            return;
                        int httpCode = response.code();
                        switch (httpCode) {
                            case 400:
                                T.show("请求的语法出错");
                                break;
                            case 401:
                                T.show("未授权");
                                break;
                            case 403:
                                T.show("请求被拒绝");
                                break;
                            case 404:
                                T.show("请求的接口不存在");
                                break;
                            case 408:
                                T.show("请求超时");
                                break;
                            case 500:
                                T.show("服务器错误");
                                break;
                            case 503:
                                T.show("服务器停机或正在维护");
                                break;
                        }
                    }
                });
    }
    /**
     * 上传文件
     * @param url
     * @param params
     * @param uploadCallBack
     * @param files
     */
    public  void uploadFiles(final String url, Map<String, String> params, final UploadCallBack uploadCallBack, Map<String, File> files) {
        PostRequest postRequest = OkGo.post(url);
        postRequest.isMultipart(true);
        for (String key : files.keySet()) {
            postRequest.params(key, files.get(key));
        }
        postRequest.params(params)
                .execute(new StringCallback() {
                    @Override
                    public void onBefore(BaseRequest request) {
                        super.onBefore(request);
                        PostRequest re = (PostRequest) request;
                        XLog.e("url:" + re.getUrl());
                        XLog.e("method:" + re.getMethod());
                    }
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        XLog.e("result:" + s);
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            int errno = jsonObject.optInt("resultCode");
                            String message = jsonObject.optString("msg");
                            if(errno == 1){
                                uploadCallBack.onSuccess(jsonObject.optString("resObj"),message);
                            }else{
                                uploadCallBack.onFail(message);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                        super.upProgress(currentSize, totalSize, progress, networkSpeed);
                        uploadCallBack.onProgress(currentSize, totalSize, progress, networkSpeed);
                    }
                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        if (response == null)
                            return;
                        int httpCode = response.code();
                        switch (httpCode) {
                            case 400:
                                T.show("请求的语法出错");
                                break;
                            case 401:
                                T.show("未授权");
                                break;
                            case 403:
                                T.show("请求被拒绝");
                                break;
                            case 404:
                                T.show("请求的接口不存在");
                                break;
                            case 408:
                                T.show("请求超时");
                                break;
                            case 500:
                                T.show("服务器错误");
                                break;
                            case 503:
                                T.show("服务器停机或正在维护");
                                break;
                        }
                    }
                });
    }
    public interface UploadCallBack {
        void onSuccess(String res, String msg);
        void onFail(String s);
        void onProgress(long currentSize, long totalSize, float progress, long networkSpeed);
    }
}
app/src/main/java/com/moral/screen/model/DeviceBean.java
New file
@@ -0,0 +1,143 @@
package com.moral.screen.model;
/**
 * Created by hjzhang on 2018/7/4.
 */
public class DeviceBean {
    private int id;
    private String name;
    private String address;
    private double longitude;
    private double latitude;
    private String mac;
    private int operateUserId;
    private String state;
    private long createTime;
    private String installTime;
    private int monitorPointId;
    private int deviceVersionId;
    private String isDelete;
    private int professionId;
    private String device_name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public double getLongitude() {
        return longitude;
    }
    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
    public double getLatitude() {
        return latitude;
    }
    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }
    public String getMac() {
        return mac;
    }
    public void setMac(String mac) {
        this.mac = mac;
    }
    public int getOperateUserId() {
        return operateUserId;
    }
    public void setOperateUserId(int operateUserId) {
        this.operateUserId = operateUserId;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public long getCreateTime() {
        return createTime;
    }
    public void setCreateTime(long createTime) {
        this.createTime = createTime;
    }
    public String getInstallTime() {
        return installTime;
    }
    public void setInstallTime(String installTime) {
        this.installTime = installTime;
    }
    public int getMonitorPointId() {
        return monitorPointId;
    }
    public void setMonitorPointId(int monitorPointId) {
        this.monitorPointId = monitorPointId;
    }
    public int getDeviceVersionId() {
        return deviceVersionId;
    }
    public void setDeviceVersionId(int deviceVersionId) {
        this.deviceVersionId = deviceVersionId;
    }
    public String getIsDelete() {
        return isDelete;
    }
    public void setIsDelete(String isDelete) {
        this.isDelete = isDelete;
    }
    public int getProfessionId() {
        return professionId;
    }
    public void setProfessionId(int professionId) {
        this.professionId = professionId;
    }
    public String getDevice_name() {
        return device_name;
    }
    public void setDevice_name(String device_name) {
        this.device_name = device_name;
    }
}
app/src/main/java/com/moral/screen/model/DeviceDataBean.java
New file
@@ -0,0 +1,89 @@
package com.moral.screen.model;
/**
 * Created by hjzhang on 2018/7/4.
 */
public class DeviceDataBean {
    private String sensor_key;
    private String unit;
    private float upper;
    private float lower;
    private String name;
    private String description;
    private int id;
    private String state;
    private float value;
    public String getSensor_key() {
        return sensor_key;
    }
    public void setSensor_key(String sensor_key) {
        this.sensor_key = sensor_key;
    }
    public String getUnit() {
        return unit;
    }
    public void setUnit(String unit) {
        this.unit = unit;
    }
    public float getUpper() {
        return upper;
    }
    public void setUpper(float upper) {
        this.upper = upper;
    }
    public float getLower() {
        return lower;
    }
    public void setLower(float lower) {
        this.lower = lower;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public float getValue() {
        return value;
    }
    public void setValue(float value) {
        this.value = value;
    }
}
app/src/main/java/com/moral/screen/model/SensorData.java
New file
@@ -0,0 +1,17 @@
package com.moral.screen.model;
/**
 * Created by hjzhang on 2018/7/10.
 */
public class SensorData {
    private float value;
    public float getValue() {
        return value;
    }
    public void setValue(float value) {
        this.value = value;
    }
}
app/src/main/java/com/moral/screen/utils/SharedPreferencesUtil.java
New file
@@ -0,0 +1,45 @@
package com.moral.screen.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class SharedPreferencesUtil {
    private Context mContext;
    public final static String SP_LOGIN_USER_KEY = "login_user";
    public SharedPreferencesUtil(Context context) {
        this.mContext = context;
    }
    public void saveOrgId(int orgId){
        SharedPreferences preferences = mContext.getSharedPreferences(SP_LOGIN_USER_KEY, Context.MODE_PRIVATE);
        Editor editor = preferences.edit();
        editor.putInt("orgId",orgId);
        editor.commit();
    }
    public int getOrgId(){
        SharedPreferences sp = mContext.getSharedPreferences(SP_LOGIN_USER_KEY, Context.MODE_PRIVATE);
        int orgId = sp.getInt("orgId",0);
        return orgId;
    }
    /**
     * 保存是否第一次登陆
     * @param flag
     */
    public void saveFirstUse(int flag) {
        SharedPreferences preferences = mContext.getSharedPreferences("firstInfo",
                Context.MODE_PRIVATE);
        Editor editor = preferences.edit();
        editor.putInt("firstUse", flag);
        editor.commit();
    }
    public int getFirstUse() {
        SharedPreferences preferences = mContext.getSharedPreferences("firstInfo",
                Context.MODE_PRIVATE);
        int firstUse = preferences.getInt("firstUse", 0);
        return firstUse;
    }
}
app/src/main/res/drawable/my_progress_background.xml
New file
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <color android:color="#00ffffff"/>
    </item>
    <item android:id="@android:id/progress">
        <clip
            android:clipOrientation="horizontal"
            android:gravity="left">
            <shape>
                <gradient
                    android:startColor="#00a445"
                    android:endColor="#00ffde"/>
            </shape>
        </clip>
    </item>
</layer-list>
app/src/main/res/layout/ac_charts_layout.xml
New file
@@ -0,0 +1,53 @@
<?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="@mipmap/bg"
    android:fitsSystemWindows="true"
    android:orientation="vertical">
    <include layout="@layout/top_bar_layout"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginLeft="@dimen/x8"
        android:layout_marginRight="@dimen/x8"
        android:layout_marginTop="@dimen/x20"
        android:padding="@dimen/x10"
        android:background="@mipmap/bg_chart">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <ImageView
                android:layout_width="@dimen/x10"
                android:layout_height="@dimen/x10"
                android:src="@mipmap/icon_yuan"/>
            <TextView
                android:id="@+id/tv_sub"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:textSize="16sp"
                android:layout_gravity="center_horizontal"
                android:text="PM2.5走势图"
                android:layout_marginRight="@dimen/x4"
                android:layout_marginLeft="@dimen/x4"
                />
            <ImageView
                android:layout_width="@dimen/x10"
                android:layout_height="@dimen/x10"
                android:src="@mipmap/icon_xia"/>
        </LinearLayout>
        <lecho.lib.hellocharts.view.LineChartView
            android:id="@+id/chart"
            android:layout_width="match_parent"
            android:layout_marginTop="@dimen/x8"
            android:layout_height="@dimen/y300">
        </lecho.lib.hellocharts.view.LineChartView>
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/ac_device_data_layout.xml
New file
@@ -0,0 +1,51 @@
<?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="@mipmap/bg"
    android:fitsSystemWindows="true"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/y38">
        <TextView
            android:id="@+id/tv_left"
            android:layout_width="@dimen/x60"
            android:layout_height="match_parent"
            android:gravity="center"
            android:textColor="@color/white"
            android:drawablePadding="@dimen/x4"
            android:textSize="16sp"
            android:text="返回"
            android:paddingLeft="@dimen/x16"
            />
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:ellipsize="marquee"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center"
            android:textColor="@color/white"
            android:marqueeRepeatLimit="marquee_forever"
            android:singleLine="true"
            android:text="详细数据"
            android:textSize="17sp" />
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/x6"
        android:paddingLeft="@dimen/x2"
        android:paddingRight="@dimen/x2"
        android:paddingBottom="@dimen/x10"
        android:paddingTop="@dimen/x2"
        android:background="@mipmap/bg_data">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_data"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </RelativeLayout>
</LinearLayout>
app/src/main/res/layout/ac_login_layout.xml
@@ -19,7 +19,6 @@
        android:layout_height="@dimen/x40"
        android:layout_marginLeft="@dimen/x36"
        android:layout_marginRight="@dimen/x36"
        android:inputType="number"
        android:textSize="16sp"
        android:textColor="@color/white"
        android:textColorHint="@color/white"
@@ -59,5 +58,6 @@
        android:textColor="@color/blue_txt"
        android:text="忘记密码"
        android:gravity="center"
        android:visibility="invisible"
        android:layout_marginTop="@dimen/x60"/>
</LinearLayout>
app/src/main/res/layout/ac_map_layout.xml
New file
@@ -0,0 +1,49 @@
<?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="@mipmap/bg"
    android:fitsSystemWindows="true"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/y38">
        <TextView
            android:id="@+id/tv_left"
            android:layout_width="@dimen/x60"
            android:layout_height="match_parent"
            android:gravity="center"
            android:textColor="@color/white"
            android:drawablePadding="@dimen/x4"
            android:textSize="16sp"
            android:text="返回"
            android:paddingLeft="@dimen/x16"
            />
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:ellipsize="marquee"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center"
            android:textColor="@color/white"
            android:marqueeRepeatLimit="marquee_forever"
            android:singleLine="true"
            android:text="监测地点"
            android:textSize="17sp" />
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/x6"
        android:padding="@dimen/x2"
        android:background="@mipmap/bg_map">
        <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />
    </RelativeLayout>
</LinearLayout>
app/src/main/res/layout/list_item_data.xml
New file
@@ -0,0 +1,46 @@
<?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="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingTop="@dimen/x14"
    android:paddingLeft="@dimen/x4"
    android:paddingRight="@dimen/x4">
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:layout_weight="1.2"
        android:textSize="13sp"
        android:textColor="@color/white"
        android:text="颗粒物2.5"/>
    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:background="@mipmap/pro_kuang"
        android:layout_marginRight="@dimen/x6"
        android:layout_marginLeft="@dimen/x6"
        android:padding="@dimen/x2">
        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            style="?android:attr/progressBarStyleHorizontal"
            android:max="100"
            android:progressDrawable="@drawable/my_progress_background"
            />
    </RelativeLayout>
    <TextView
        android:id="@+id/tv_unit"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:layout_weight="2.2"
        android:textColor="@color/white"
        android:textSize="13sp"
        android:text="6396(PCS/0.1L)"/>
</LinearLayout>
app/src/main/res/layout/pop_layout.xml
New file
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_pop"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@mipmap/bg_pop"
    android:paddingLeft="@dimen/x8"
    android:paddingTop="@dimen/x8"
    android:paddingRight="@dimen/x8"
    android:paddingBottom="@dimen/x16"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="XXXXXXXXXXXXXXXXXXXXXXX"
            android:textSize="13sp"
            android:textColor="@color/yellow_txt"
            android:layout_weight="1"/>
        <ImageView
            android:id="@+id/iv_close"
            android:layout_width="@dimen/x20"
            android:layout_height="@dimen/x20"
            android:padding="@dimen/x6"
            android:src="@mipmap/icon_close" />
    </LinearLayout>
    <TextView
        android:id="@+id/tv_address"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="XXXXXXXXXXXXXXXXXXXXXXX"
        android:textSize="13sp"
        android:layout_marginTop="@dimen/x4"
        android:layout_weight="1"/>
</LinearLayout>
app/src/main/res/layout/top_bar_layout.xml
@@ -1,15 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/y38"
    android:background="@color/white">
    android:layout_height="@dimen/y38">
    <TextView
        android:id="@+id/tv_left"
        android:layout_width="@dimen/x60"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textColor="@color/black_txt"
        android:textColor="@color/white"
        android:drawablePadding="@dimen/x4"
        android:textSize="16sp"
        android:text="返回"
@@ -25,7 +24,7 @@
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:gravity="center"
        android:textColor="@color/black_txt"
        android:textColor="@color/white"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:text="标题"
@@ -48,6 +47,6 @@
        android:gravity="center"
        android:text=""
        android:visibility="gone"
        android:textColor="@color/black_txt"
        android:textColor="@color/white"
        android:layout_alignParentRight="true" />
</RelativeLayout>
app/src/main/res/mipmap-xxxhdpi/bg_chart.png
app/src/main/res/mipmap-xxxhdpi/bg_data.png
app/src/main/res/mipmap-xxxhdpi/bg_map.png
app/src/main/res/mipmap-xxxhdpi/bg_pop.png
app/src/main/res/mipmap-xxxhdpi/icon_close.png
app/src/main/res/mipmap-xxxhdpi/icon_level1.png
app/src/main/res/mipmap-xxxhdpi/icon_level2.png
app/src/main/res/mipmap-xxxhdpi/icon_level3.png
app/src/main/res/mipmap-xxxhdpi/icon_normal.png
app/src/main/res/mipmap-xxxhdpi/icon_offline.png
app/src/main/res/mipmap-xxxhdpi/icon_white_jiantou.png
app/src/main/res/mipmap-xxxhdpi/icon_xia.png
app/src/main/res/mipmap-xxxhdpi/icon_yuan.png
app/src/main/res/mipmap-xxxhdpi/pro_kuang.png
app/src/main/res/values/colors.xml
@@ -10,7 +10,7 @@
    <color name="dark_black_txt">#040000</color>
    <color name="black_txt">#323333</color>
    <color name="green_txt">#92c755</color>
    <color name="yellow_txt">#eb8600</color>
    <color name="yellow_txt">#ff7800</color>
    <color name="ac_bg">#f0f0f0</color>
    <color name="trans_white">#CCffffff</color>
    <color name="trans">#00ffffff</color>