diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_list.xml b/app/src/main/res/layout/fragment_light_list.xml deleted file mode 100644 index 837b198..0000000 --- a/app/src/main/res/layout/fragment_light_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_list.xml b/app/src/main/res/layout/fragment_light_list.xml deleted file mode 100644 index 837b198..0000000 --- a/app/src/main/res/layout/fragment_light_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_map.xml b/app/src/main/res/layout/fragment_light_map.xml deleted file mode 100644 index 9ffea49..0000000 --- a/app/src/main/res/layout/fragment_light_map.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_list.xml b/app/src/main/res/layout/fragment_light_list.xml deleted file mode 100644 index 837b198..0000000 --- a/app/src/main/res/layout/fragment_light_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_map.xml b/app/src/main/res/layout/fragment_light_map.xml deleted file mode 100644 index 9ffea49..0000000 --- a/app/src/main/res/layout/fragment_light_map.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/include_line_view.xml b/app/src/main/res/layout/include_line_view.xml index d530656..9bde5f2 100644 --- a/app/src/main/res/layout/include_line_view.xml +++ b/app/src/main/res/layout/include_line_view.xml @@ -2,4 +2,4 @@ \ No newline at end of file + android:background="@color/lineColor" /> \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_list.xml b/app/src/main/res/layout/fragment_light_list.xml deleted file mode 100644 index 837b198..0000000 --- a/app/src/main/res/layout/fragment_light_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_map.xml b/app/src/main/res/layout/fragment_light_map.xml deleted file mode 100644 index 9ffea49..0000000 --- a/app/src/main/res/layout/fragment_light_map.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/include_line_view.xml b/app/src/main/res/layout/include_line_view.xml index d530656..9bde5f2 100644 --- a/app/src/main/res/layout/include_line_view.xml +++ b/app/src/main/res/layout/include_line_view.xml @@ -2,4 +2,4 @@ \ No newline at end of file + android:background="@color/lineColor" /> \ No newline at end of file diff --git a/app/src/main/res/layout/popu_street_light.xml b/app/src/main/res/layout/popu_street_light.xml index c2d356c..334b307 100644 --- a/app/src/main/res/layout/popu_street_light.xml +++ b/app/src/main/res/layout/popu_street_light.xml @@ -39,6 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" + android:layout_centerVertical="true" android:background="@drawable/ic_switch_off" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_list.xml b/app/src/main/res/layout/fragment_light_list.xml deleted file mode 100644 index 837b198..0000000 --- a/app/src/main/res/layout/fragment_light_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_map.xml b/app/src/main/res/layout/fragment_light_map.xml deleted file mode 100644 index 9ffea49..0000000 --- a/app/src/main/res/layout/fragment_light_map.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/include_line_view.xml b/app/src/main/res/layout/include_line_view.xml index d530656..9bde5f2 100644 --- a/app/src/main/res/layout/include_line_view.xml +++ b/app/src/main/res/layout/include_line_view.xml @@ -2,4 +2,4 @@ \ No newline at end of file + android:background="@color/lineColor" /> \ No newline at end of file diff --git a/app/src/main/res/layout/popu_street_light.xml b/app/src/main/res/layout/popu_street_light.xml index c2d356c..334b307 100644 --- a/app/src/main/res/layout/popu_street_light.xml +++ b/app/src/main/res/layout/popu_street_light.xml @@ -39,6 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" + android:layout_centerVertical="true" android:background="@drawable/ic_switch_off" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2fe7877..52dd8e7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #FFFFFF #F5F5F5 - #E5E5E5 + #CCCCCC #D3D3D3 #CCCCCC #D8D8D8 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd91f6c..d329792 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -123,7 +123,8 @@ - + + diff --git a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java index bd5e484..97254a7 100644 --- a/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/fragment/HomePageFragment.java @@ -19,7 +19,6 @@ import com.casic.dcms.view.OvertimeCaseActivity; import com.casic.dcms.view.PersonActivity; import com.casic.dcms.view.SearchCaseActivity; -import com.casic.dcms.view.StreetlightManagerActivity; import com.casic.dcms.view.UrgentCaseActivity; import com.casic.dcms.view.bridge.BridgeMaintainActivity; import com.casic.dcms.view.business.ChangeShopInfoActivity; @@ -30,6 +29,7 @@ import com.casic.dcms.view.map.CaseOnMapActivity; import com.casic.dcms.view.pipeline.PipelineManagerActivity; import com.casic.dcms.view.statistics.DataAnalysisActivity; +import com.casic.dcms.view.streetlight.StreetlightManagerActivity; import com.casic.dcms.view.toilet.PublicToiletActivity; import com.casic.dcms.view.upload.BriefCaseActivity; import com.casic.dcms.view.upload.BusinessCaseActivity; diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java deleted file mode 100644 index a9cc331..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.casic.dcms.fragment; - -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.NormalRecyclerAdapter; -import com.casic.dcms.databinding.FragmentLightListBinding; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightDetailBean; -import com.casic.dcms.model.LightListBean; -import com.casic.dcms.vm.LightViewModel; -import com.casic.dcms.widgets.LightDetailDialog; -import com.pengxh.androidx.lite.adapter.ViewHolder; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; -import com.pengxh.androidx.lite.kit.IntKit; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; - -import java.util.ArrayList; -import java.util.List; - -public class LightOnListFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnListFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private NormalRecyclerAdapter adapter; - private List dataBeans = new ArrayList<>(); - private int pageIndex = 1; - private boolean isRefresh, isLoadMore = false; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightList(pageIndex); - } - - @Override - protected void observeRequestState() { - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - } - - @Override - protected void initEvent() { - getBinding().refreshLayout.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - isRefresh = true; - //刷新之后页码重置 - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - }); - getBinding().refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - isLoadMore = true; - pageIndex++; - lightViewModel.getLightList(pageIndex); - } - }); - - lightViewModel.lightListModel.observe(this, new Observer() { - @Override - public void onChanged(LightListBean resultBean) { - if (resultBean.getCode() == 200) { - List dataRows = resultBean.getData().getRows(); - if (isRefresh) { - adapter.refresh(dataRows); - getBinding().refreshLayout.finishRefresh(); - isRefresh = false; - } else if (isLoadMore) { - if (dataRows.size() == 0) { - StringKit.show(requireContext(), "到底了,别拉了"); - } - adapter.loadMore(dataRows); - getBinding().refreshLayout.finishLoadMore(); - isLoadMore = false; - } else { - dataBeans = dataRows; - weakReferenceHandler.sendEmptyMessage(20210623); - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - - lightViewModel.lightDetailModel.observe(this, new Observer() { - @Override - public void onChanged(LightDetailBean resultBean) { - new LightDetailDialog.Builder().setContext(requireContext()).setLightDetailBean(resultBean).build().show(); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - if (msg.what == 20210623) { - //首次加载数据 - if (dataBeans.size() == 0) { - getBinding().emptyView.show("没有路灯数据", null); - } else { - getBinding().emptyView.hide(); - adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { - @Override - public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { - String statusName = item.getStatusName(); - viewHolder.setText(R.id.lightNameView, item.getLampName()) - .setText(R.id.lightStatusView, "已" + statusName); - - CardView statueTagView = viewHolder.getView(R.id.statueTagView); - if (statusName.equals("灭灯")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.darkGray)); - } else if (statusName.equals("报警")) { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.warnColor)); - } else { - viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); - statueTagView.setCardBackgroundColor(IntKit.convertColor(requireContext(), R.color.onLineColor)); - } - - viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(item.getLampId())); - - String statusName = item.getStatusName(); - String controlType; - if (statusName.equals("灭灯")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } - }; - getBinding().recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); - getBinding().recyclerView.setAdapter(adapter); - adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { - @Override - public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { - String lampId = rowsBean.getLampId(); - if (TextUtils.isEmpty(lampId)) { - StringKit.show(requireContext(), "错误,路灯编号为空"); - return; - } - - lightViewModel.getLightDetail(requireContext(), lampId); - } - }); - } - } else if (msg.what == 20210624) { - isRefresh = true; - pageIndex = 1; - lightViewModel.getLightList(pageIndex); - } - return true; - } -} diff --git a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java b/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java deleted file mode 100644 index db55ff0..0000000 --- a/app/src/main/java/com/casic/dcms/fragment/LightOnMapFragment.java +++ /dev/null @@ -1,441 +0,0 @@ -package com.casic.dcms.fragment; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.amap.api.location.AMapLocation; -import com.casic.dcms.R; -import com.casic.dcms.base.BaseApplication; -import com.casic.dcms.bean.LightLocalBean; -import com.casic.dcms.databinding.FragmentLightMapBinding; -import com.casic.dcms.greendao.LightLocalBeanDao; -import com.casic.dcms.model.ActionResultBean; -import com.casic.dcms.model.LightMapBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.AuthenticationHelper; -import com.casic.dcms.utils.HttpRequestManager; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.LocationHelper; -import com.casic.dcms.utils.callback.ILocationListener; -import com.casic.dcms.vm.LightViewModel; -import com.esri.arcgisruntime.concurrent.ListenableFuture; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.geometry.SpatialReferences; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; -import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseFragment; -import com.pengxh.androidx.lite.kit.StringKit; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.utils.WeakReferenceHandler; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LightOnMapFragment extends AndroidxBaseFragment implements Handler.Callback { - - private static final String TAG = "LightOnMapFragment"; - private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); - private LightViewModel lightViewModel; - private ListenableList graphicsOverlays; - private ListenableList graphics; - private double DELTA_L = LocaleConstant.DELTA_LNG_75; - private LightLocalBeanDao lightLocalBeanDao; - - @Override - protected void setupTopBarLayout() { - - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); - - lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); - lightViewModel.getLightOnMap(requireContext()); - lightViewModel.lightMapModel.observe(this, new Observer() { - @Override - public void onChanged(LightMapBean resultBean) { - if (resultBean.getCode() == 200) { - for (LightMapBean.DataBean dataBean : resultBean.getData()) { - LightLocalBean bean = new LightLocalBean(); - bean.setControllerCode(dataBean.getControllerCode()); - bean.setLampCode(dataBean.getLampCode()); - String lampId = dataBean.getLampId(); - bean.setLampId(lampId); - bean.setLatitude(dataBean.getLatitude()); - bean.setDeptId(dataBean.getDeptId()); - bean.setStatusName(dataBean.getStatusName()); - bean.setLampName(dataBean.getLampName()); - bean.setLatestTime(dataBean.getLatestTime()); - bean.setLongitude(dataBean.getLongitude()); - bean.setStatus(dataBean.getStatus()); - - LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); - if (uniqueBean == null) { - lightLocalBeanDao.insert(bean); - } else { - lightLocalBeanDao.update(bean); - } - } - } - } - }); - - lightViewModel.lightControlModel.observe(this, new Observer() { - @Override - public void onChanged(ActionResultBean resultBean) { - if (resultBean.getCode() == 200) { - //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 - StringKit.show(requireContext(), "指令发送成功"); - weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); - } - } - }); - lightViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(requireActivity(), "处理中,请稍后..."); - } else { - LoadingDialog.dismiss(); - } - } - }); - - getBinding().mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); - arcGISMap.setBasemap(basemap); - Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 - getBinding().mapView.setMap(arcGISMap); - - //Marker相关Layer - graphicsOverlays = getBinding().mapView.getGraphicsOverlays(); - //显示定位点附近路灯 - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - getBinding().mapView.setViewpointCenterAsync(point, 2800); - - List streetLightBeans = lightLocalBeanDao.loadAll(); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : streetLightBeans) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } -// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && -// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { -// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } - } - addPictureMarker(pointList); - } - } - }, true); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - protected void initEvent() { - getBinding().expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 0.5); - clearPictureMarker(); - //计算比例尺 - DELTA_L -= 0.0001; - if (DELTA_L < 0) { - DELTA_L = 0; - } -// List minusList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(minusList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List minusList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(minusList); - } - } - }, true); - } - }); - - getBinding().minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getBinding().mapView.setViewpointScaleAsync(getBinding().mapView.getMapScale() * 2); - clearPictureMarker(); - //计算比例尺 - DELTA_L += 0.0001; - if (DELTA_L > 0.01) { - DELTA_L = LocaleConstant.DELTA_LNG_75; - } -// List expandList = new ArrayList<>(); -// for (StreetLightLocalBean bean : lightBeans) { -// double longitude = bean.getLongitude(); -// double latitude = bean.getLatitude(); -// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || -// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { -// continue; -// } -// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); -// } -// addPictureMarker(expandList); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List expandList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { - expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(expandList); - } - } - }, true); - } - }); - - getBinding().removeToLocalView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - clearPictureMarker(); - LoadingDialog.show(requireActivity(), "定位中,请稍后"); - LocationHelper.getCurrentLocation(requireContext(), new ILocationListener() { - - @Override - public void onAMapLocationGet(AMapLocation aMapLocation) { - if (aMapLocation != null) { - double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); - Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); - List pointList = new ArrayList<>(); - for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { - double longitude = bean.getLongitude(); - double latitude = bean.getLatitude(); - if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { - pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); - } - } - addPictureMarker(pointList); - getBinding().mapView.setViewpointCenterAsync(point, 3000); - LoadingDialog.dismiss(); - } - } - }, true); - } - }); - - getBinding().mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(requireContext(), getBinding().mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - List lightBeans = lightLocalBeanDao.loadAll(); - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); - overlaysAsync.addDoneListener(new Runnable() { - @Override - public void run() { - try { - List overlayResultList = overlaysAsync.get(); - if (!overlayResultList.isEmpty()) { - IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); - Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); - for (LightLocalBean dataBean : lightBeans) { - if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { - Message message = weakReferenceHandler.obtainMessage(); - message.what = 2021062401; - message.obj = dataBean.getLampId(); - weakReferenceHandler.sendMessage(message); - } - } - } else { - weakReferenceHandler.sendEmptyMessage(2021062402); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - }); - return super.onSingleTapConfirmed(e); - } - }); - } - - @Override - public boolean handleMessage(@NonNull Message msg) { - switch (msg.what) { - case 2021062401: - String lampId = (String) msg.obj; - - View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.popu_street_light, null); - TextView lightStateView = popupView.findViewById(R.id.lightStateView); - TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); - TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); - TextView lightElecView = popupView.findViewById(R.id.lightElecView); - TextView lightVolView = popupView.findViewById(R.id.lightVolView); - TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); - ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); - - LoadingDialog.show(requireActivity(), "路灯详情获取中,请稍后..."); - String ip = (String) SaveKeyValues.getValue(LocaleConstant.IP_KEY, "http://111.198.10.15:11409"); - new HttpRequestManager.Builder() - .setAuthentication("token", AuthenticationHelper.getToken()) - .setRequestTarget(ip + LocaleConstant.LIGHT_DETAIL + lampId) - .setOnHttpRequestListener(new HttpRequestManager.OnHttpRequestListener() { - @Override - public void onSuccess(String result) { - LoadingDialog.dismiss(); - try { - JSONObject jsonObject = new JSONObject(result); - int code = jsonObject.getInt("code"); - if (code == 200) { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - String statusName = dataObject.getString("statusName"); - lightStateView.setText(statusName); - lightAddressView.setText(dataObject.getString("address")); - lightStreetView.setText(dataObject.getString("streetName")); - lightElecView.setText(String.valueOf(dataObject.getDouble("latestElec"))); - lightVolView.setText(String.valueOf(dataObject.getDouble("latestVol"))); - lightTimeView.setText(dataObject.getString("latestTime")); - - QMUIPopups.popup(requireContext(), QMUIDisplayHelper.dp2px(requireContext(), 280)).preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView).edgeProtection(QMUIDisplayHelper.dp2px(requireContext(), 20)).dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER).onDismiss(null).show(getBinding().mapView); - - lightSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - List lampIds = new ArrayList<>(); - lampIds.add(Long.parseLong(lampId)); - - String controlType; - if (statusName.equals("离线")) { - controlType = "1"; - } else { - controlType = "0"; - } - lightViewModel.controlLight(requireContext(), lampIds, controlType); - } - }); - } else { - StringKit.show(requireContext(), "服务器异常,请重新选点"); - } - } catch (JSONException e) { - StringKit.show(requireContext(), "解析失败,请重新选点"); - } - } - - @Override - public void onFailure(Throwable throwable) { - LoadingDialog.dismiss(); - StringKit.show(requireContext(), "网络连接失败,请重新选点"); - } - }).build().start(); - break; - case 2021062402: - StringKit.show(requireContext(), "此附近无路灯,请重新选点"); - break; - default: - break; - } - return true; - } - - private void addPictureMarker(List points) { - for (Point point : points) { - Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); - BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); - PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); - pictureMarker.setWidth(24); - pictureMarker.setHeight(24); - pictureMarker.loadAsync(); - - GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); - graphics = graphicsOverlay.getGraphics(); - graphics.add(new Graphic(point, pictureMarker)); - graphicsOverlays.add(graphicsOverlay); - } - } - - private void clearPictureMarker() { - if (graphics != null && graphicsOverlays != null) { - graphics.clear(); - graphicsOverlays.clear(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - getBinding().mapView.dispose(); - } -} diff --git a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java deleted file mode 100644 index 6640fd3..0000000 --- a/app/src/main/java/com/casic/dcms/view/StreetlightManagerActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.dcms.view; - -import android.os.Bundle; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.SubViewPagerAdapter; -import com.casic.dcms.databinding.ActivityStreetLightBinding; -import com.casic.dcms.fragment.LightOnListFragment; -import com.casic.dcms.fragment.LightOnMapFragment; -import com.casic.dcms.utils.LinearLayoutHelper; -import com.casic.dcms.utils.ViewGroupHub; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; - -import java.util.ArrayList; -import java.util.List; - -public class StreetlightManagerActivity extends AndroidxBaseActivity { - - private final String[] pageTitles = new String[]{"路灯分布", "路灯列表"}; - - @Override - protected void setupTopBarLayout() { - ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); - - binding.titleBarLayout.titleView.setText("路灯管理"); - binding.titleBarLayout.leftBackView.setOnClickListener(v -> finish()); - } - - @Override - protected void observeRequestState() { - - } - - @Override - protected void initOnCreate(@Nullable Bundle savedInstanceState) { - List fragmentList = new ArrayList<>(); - fragmentList.add(new LightOnMapFragment()); - fragmentList.add(new LightOnListFragment()); - SubViewPagerAdapter adapter = new SubViewPagerAdapter(getSupportFragmentManager(), pageTitles, fragmentList); - binding.viewPager.setAdapter(adapter); - //绑定TabLayout - binding.tabLayout.setupWithViewPager(binding.viewPager); - LinearLayout linearLayout = (LinearLayout) binding.tabLayout.getChildAt(0); - LinearLayoutHelper.setDivider(this, linearLayout); - } - - @Override - protected void initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java new file mode 100644 index 0000000..c09dbc8 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/LightOnMapActivity.java @@ -0,0 +1,454 @@ +package com.casic.dcms.view.streetlight; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.amap.api.location.AMapLocation; +import com.casic.dcms.R; +import com.casic.dcms.base.BaseApplication; +import com.casic.dcms.bean.LightLocalBean; +import com.casic.dcms.databinding.ActivityStreetLightMapBinding; +import com.casic.dcms.greendao.LightLocalBeanDao; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightMapBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.LocationHelper; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.utils.callback.ILocationListener; +import com.casic.dcms.vm.LightViewModel; +import com.esri.arcgisruntime.concurrent.ListenableFuture; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult; +import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class LightOnMapActivity extends AndroidxBaseActivity implements Handler.Callback { + + private static final String TAG = "LightOnMapFragment"; + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private ListenableList graphicsOverlays; + private ListenableList graphics; + private double DELTA_L = LocaleConstant.DELTA_LNG_75; + private LightLocalBeanDao lightLocalBeanDao; + private boolean isControlLight = false; + private boolean isGetLightDetail = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else if (isGetLightDetail) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "路灯详情获取中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(LightOnMapActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightLocalBeanDao = BaseApplication.getDaoSession().getLightLocalBeanDao(); + + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightOnMap(this); + lightViewModel.lightMapModel.observe(this, new Observer() { + @Override + public void onChanged(LightMapBean resultBean) { + if (resultBean.getCode() == 200) { + for (LightMapBean.DataBean dataBean : resultBean.getData()) { + LightLocalBean bean = new LightLocalBean(); + bean.setControllerCode(dataBean.getControllerCode()); + bean.setLampCode(dataBean.getLampCode()); + String lampId = dataBean.getLampId(); + bean.setLampId(lampId); + bean.setLatitude(dataBean.getLatitude()); + bean.setDeptId(dataBean.getDeptId()); + bean.setStatusName(dataBean.getStatusName()); + bean.setLampName(dataBean.getLampName()); + bean.setLatestTime(dataBean.getLatestTime()); + bean.setLongitude(dataBean.getLongitude()); + bean.setStatus(dataBean.getStatus()); + + LightLocalBean uniqueBean = lightLocalBeanDao.queryBuilder().where(LightLocalBeanDao.Properties.LampId.eq(lampId)).unique(); + if (uniqueBean == null) { + lightLocalBeanDao.insert(bean); + } else { + lightLocalBeanDao.update(bean); + } + } + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + isGetLightDetail = false; + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_street_light, null); + + TextView lightStateView = popupView.findViewById(R.id.lightStateView); + TextView lightAddressView = popupView.findViewById(R.id.lightAddressView); + TextView lightStreetView = popupView.findViewById(R.id.lightStreetView); + TextView lightElecView = popupView.findViewById(R.id.lightElecView); + TextView lightVolView = popupView.findViewById(R.id.lightVolView); + TextView lightTimeView = popupView.findViewById(R.id.lightTimeView); + ImageView lightSwitch = popupView.findViewById(R.id.lightSwitch); + + LightDetailBean.DataModel data = resultBean.getData(); + String statusName = data.getStatusName(); + lightStateView.setText(statusName); + lightAddressView.setText(data.getAddress()); + lightStreetView.setText(data.getStreetName()); + lightElecView.setText(String.format("%sA", data.getLatestElec())); + lightVolView.setText(String.format("%sA", data.getLatestVol())); + lightTimeView.setText(data.getLatestTime()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 280)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM).view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f).animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null).show(binding.mapView); + + lightSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(data.getLampId())); + + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createBaseLayer()); + arcGISMap.setBasemap(basemap); + Point point = new Point(LocaleConstant.DEFAULT_LNG, LocaleConstant.DEFAULT_LAT, SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800);//标注到指定经纬度并放大地图显示 + binding.mapView.setMap(arcGISMap); + + //Marker相关Layer + graphicsOverlays = binding.mapView.getGraphicsOverlays(); + //显示定位点附近路灯 + LocationHelper.getCurrentLocation(this, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + binding.mapView.setViewpointCenterAsync(point, 2800); + + List streetLightBeans = lightLocalBeanDao.loadAll(); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : streetLightBeans) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } +// if (Math.abs(longitude - Constant.DEFAULT_LNG) <= Constant.DELTA_LNG_75 && +// Math.abs(latitude - Constant.DEFAULT_LAT) <= Constant.DELTA_LAT_75) { +// pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } + } + addPictureMarker(pointList); + } + } + }, true); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + protected void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + clearPictureMarker(); + //计算比例尺 + DELTA_L -= 0.0001; + if (DELTA_L < 0) { + DELTA_L = 0; + } +// List minusList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(minusList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List minusList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + minusList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(minusList); + } + } + }, true); + } + }); + + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + clearPictureMarker(); + //计算比例尺 + DELTA_L += 0.0001; + if (DELTA_L > 0.01) { + DELTA_L = LocaleConstant.DELTA_LNG_75; + } +// List expandList = new ArrayList<>(); +// for (StreetLightLocalBean bean : lightBeans) { +// double longitude = bean.getLongitude(); +// double latitude = bean.getLatitude(); +// if (Math.abs(longitude - Constant.DEFAULT_LNG) > DELTA_L || +// Math.abs(latitude - Constant.DEFAULT_LAT) > DELTA_L) { +// continue; +// } +// expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); +// } +// addPictureMarker(expandList); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List expandList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= DELTA_L && Math.abs(latitude - gcjToWgs[1]) <= DELTA_L) { + expandList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(expandList); + } + } + }, true); + } + }); + + binding.removeToLocalView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearPictureMarker(); + LoadingDialog.show(LightOnMapActivity.this, "定位中,请稍后"); + LocationHelper.getCurrentLocation(context, new ILocationListener() { + + @Override + public void onAMapLocationGet(AMapLocation aMapLocation) { + if (aMapLocation != null) { + double[] gcjToWgs = LocationHelper.gcjToWgs(aMapLocation.getLongitude(), aMapLocation.getLatitude()); + Point point = new Point(gcjToWgs[0], gcjToWgs[1], SpatialReferences.getWgs84()); + List pointList = new ArrayList<>(); + for (LightLocalBean bean : lightLocalBeanDao.loadAll()) { + double longitude = bean.getLongitude(); + double latitude = bean.getLatitude(); + if (Math.abs(longitude - gcjToWgs[0]) <= LocaleConstant.DELTA_LNG_75 && Math.abs(latitude - gcjToWgs[1]) <= LocaleConstant.DELTA_LAT_75) { + pointList.add(new Point(longitude, latitude, SpatialReferences.getWgs84())); + } + } + addPictureMarker(pointList); + binding.mapView.setViewpointCenterAsync(point, 3000); + LoadingDialog.dismiss(); + } + } + }, true); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(context, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + List lightBeans = lightLocalBeanDao.loadAll(); + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + final ListenableFuture> overlaysAsync = mMapView.identifyGraphicsOverlaysAsync(screenPoint, 10.0, false, 1); + overlaysAsync.addDoneListener(new Runnable() { + @Override + public void run() { + try { + List overlayResultList = overlaysAsync.get(); + if (!overlayResultList.isEmpty()) { + IdentifyGraphicsOverlayResult identifyResult = overlayResultList.get(0); + Point point = identifyResult.getGraphicsOverlay().getExtent().getCenter(); + for (LightLocalBean dataBean : lightBeans) { + if (Math.abs(dataBean.getLongitude() - point.getX()) <= LocaleConstant.DELTA_LNG_10 && Math.abs(dataBean.getLatitude() - point.getY()) <= LocaleConstant.DELTA_LAT_10) { + Message message = weakReferenceHandler.obtainMessage(); + message.what = 2021062401; + message.obj = dataBean.getLampId(); + weakReferenceHandler.sendMessage(message); + } + } + } else { + weakReferenceHandler.sendEmptyMessage(2021062402); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + }); + return super.onSingleTapConfirmed(e); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + switch (msg.what) { + case 2021062401: + String lampId = (String) msg.obj; + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return true; + } + + isGetLightDetail = true; + lightViewModel.getLightDetail(context, lampId); + break; + case 2021062402: + StringKit.show(context, "此附近无路灯,请重新选点"); + break; + default: + break; + } + return true; + } + + private void addPictureMarker(List points) { + for (Point point : points) { + Bitmap caseBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.location_verify); + BitmapDrawable caseDrawable = new BitmapDrawable(getResources(), caseBitmap); + PictureMarkerSymbol pictureMarker = new PictureMarkerSymbol(caseDrawable); + pictureMarker.setWidth(24); + pictureMarker.setHeight(24); + pictureMarker.loadAsync(); + + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + graphics = graphicsOverlay.getGraphics(); + graphics.add(new Graphic(point, pictureMarker)); + graphicsOverlays.add(graphicsOverlay); + } + } + + private void clearPictureMarker() { + if (graphics != null && graphicsOverlays != null) { + graphics.clear(); + graphicsOverlays.clear(); + } + } +} diff --git a/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java new file mode 100644 index 0000000..15b3de9 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/streetlight/StreetlightManagerActivity.java @@ -0,0 +1,230 @@ +package com.casic.dcms.view.streetlight; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.NormalRecyclerAdapter; +import com.casic.dcms.databinding.ActivityStreetLightBinding; +import com.casic.dcms.model.ActionResultBean; +import com.casic.dcms.model.LightDetailBean; +import com.casic.dcms.model.LightListBean; +import com.casic.dcms.utils.ViewGroupHub; +import com.casic.dcms.vm.LightViewModel; +import com.casic.dcms.widgets.LightDetailDialog; +import com.pengxh.androidx.lite.adapter.ViewHolder; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.divider.RecyclerViewItemDivider; +import com.pengxh.androidx.lite.kit.ContextKit; +import com.pengxh.androidx.lite.kit.IntKit; +import com.pengxh.androidx.lite.kit.StringKit; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class StreetlightManagerActivity extends AndroidxBaseActivity implements Handler.Callback { + + private final Context context = this; + private final WeakReferenceHandler weakReferenceHandler = new WeakReferenceHandler(this); + private LightViewModel lightViewModel; + private NormalRecyclerAdapter adapter; + private List dataBeans = new ArrayList<>(); + private int pageIndex = 1; + private boolean isRefresh, isLoadMore = false; + private boolean isControlLight = false; + + @Override + protected void setupTopBarLayout() { + ViewGroupHub.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + ContextKit.navigatePageTo(context, LightOnMapActivity.class); + } + }); + } + + @Override + protected void observeRequestState() { + lightViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (isControlLight) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "处理中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } else { + if (loadState == LoadState.Loading) { + LoadingDialog.show(StreetlightManagerActivity.this, "数据加载中,请稍后..."); + } else { + LoadingDialog.dismiss(); + } + } + } + }); + } + + @Override + protected void initOnCreate(@Nullable Bundle savedInstanceState) { + lightViewModel = new ViewModelProvider(this).get(LightViewModel.class); + lightViewModel.getLightList(this, pageIndex); + } + + @Override + protected void initEvent() { + binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + isRefresh = true; + //刷新之后页码重置 + pageIndex = 1; + lightViewModel.getLightList(context, pageIndex); + } + }); + binding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + isLoadMore = true; + pageIndex++; + lightViewModel.getLightList(context, pageIndex); + } + }); + + lightViewModel.lightListModel.observe(this, new Observer() { + @Override + public void onChanged(LightListBean resultBean) { + if (resultBean.getCode() == 200) { + List dataRows = resultBean.getData().getRows(); + if (isRefresh) { + adapter.refresh(dataRows); + binding.refreshLayout.finishRefresh(); + isRefresh = false; + } else if (isLoadMore) { + if (dataRows.size() == 0) { + StringKit.show(context, "到底了,别拉了"); + } + adapter.loadMore(dataRows); + binding.refreshLayout.finishLoadMore(); + isLoadMore = false; + } else { + dataBeans = dataRows; + weakReferenceHandler.sendEmptyMessage(20210623); + } + } + } + }); + + lightViewModel.lightControlModel.observe(this, new Observer() { + @Override + public void onChanged(ActionResultBean resultBean) { + if (resultBean.getCode() == 200) { + isControlLight = false; + //开灯指令发下去之后,虽然返回成功,但仅仅表示app发送指令到后台成功,但是开没开灯无法确定,所以,只能延迟几秒再刷新列表 + StringKit.show(context, "指令发送成功"); + weakReferenceHandler.sendEmptyMessageDelayed(20210624, 3000); + } + } + }); + + lightViewModel.lightDetailModel.observe(this, new Observer() { + @Override + public void onChanged(LightDetailBean resultBean) { + new LightDetailDialog.Builder().setContext(context).setLightDetailBean(resultBean).build().show(); + } + }); + } + + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 20210623) { + //首次加载数据 + if (dataBeans.size() == 0) { + binding.emptyView.show("没有路灯数据", null); + } else { + binding.emptyView.hide(); + adapter = new NormalRecyclerAdapter(R.layout.item_light_recycleview, dataBeans) { + @Override + public void convertView(ViewHolder viewHolder, int position, LightListBean.DataBean.RowsBean item) { + String statusName = item.getStatusName(); + viewHolder.setText(R.id.lightNameView, item.getLampName()) + .setText(R.id.lightStatusView, "已" + statusName); + + CardView statueTagView = viewHolder.getView(R.id.statueTagView); + if (statusName.equals("灭灯")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_off); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.darkGray)); + } else if (statusName.equals("报警")) { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_warning); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.warnColor)); + } else { + viewHolder.setImageResource(R.id.lightSwitch, R.drawable.ic_switch_on); + statueTagView.setCardBackgroundColor(IntKit.convertColor(context, R.color.onLineColor)); + } + + viewHolder.setOnClickListener(R.id.lightSwitch, new View.OnClickListener() { + @Override + public void onClick(View v) { + isControlLight = true; + List lampIds = new ArrayList<>(); + lampIds.add(Long.parseLong(item.getLampId())); + + String statusName = item.getStatusName(); + String controlType; + if (statusName.equals("灭灯")) { + controlType = "1"; + } else { + controlType = "0"; + } + lightViewModel.controlLight(context, lampIds, controlType); + } + }); + } + }; + binding.recyclerView.addItemDecoration(new RecyclerViewItemDivider(1, Color.LTGRAY)); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickedListener(new NormalRecyclerAdapter.OnItemClickedListener() { + @Override + public void onItemClicked(int position, LightListBean.DataBean.RowsBean rowsBean) { + String lampId = rowsBean.getLampId(); + if (TextUtils.isEmpty(lampId)) { + StringKit.show(context, "错误,路灯编号为空"); + return; + } + + lightViewModel.getLightDetail(context, lampId); + } + }); + } + } else if (msg.what == 20210624) { + isRefresh = true; + pageIndex = 1; + lightViewModel.getLightList(this, pageIndex); + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java index 21d704c..9219a59 100644 --- a/app/src/main/java/com/casic/dcms/vm/LightViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/LightViewModel.java @@ -31,17 +31,18 @@ public MutableLiveData lightMapModel = new MutableLiveData<>(); public MutableLiveData lightDetailModel = new MutableLiveData<>(); - public void getLightList(int offset) { + public void getLightList(Context context, int offset) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(offset); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -53,6 +54,10 @@ LightListBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightListModel.setValue(listBean); + loadState.setValue(LoadState.Success); + } else { + loadState.setValue(LoadState.Fail); + StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { e.printStackTrace(); @@ -97,16 +102,17 @@ } public void getLightOnMap(Context context) { + loadState.setValue(LoadState.Loading); Observable observable = RetrofitServiceManager.getLightListResult(); ObserverSubscriber.addSubscribe(observable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { - + loadState.setValue(LoadState.Success); } @Override public void onError(Throwable e) { - + loadState.setValue(LoadState.Fail); } @Override @@ -118,7 +124,9 @@ LightMapBean listBean = gson.fromJson(response, new TypeToken() { }.getType()); lightMapModel.setValue(listBean); + loadState.setValue(LoadState.Success); } else { + loadState.setValue(LoadState.Fail); StringKit.show(context, StringHelper.getResponseMessage(response)); } } catch (IOException e) { diff --git a/app/src/main/res/layout/activity_street_light.xml b/app/src/main/res/layout/activity_street_light.xml index 1d13b1c..ff06cf2 100644 --- a/app/src/main/res/layout/activity_street_light.xml +++ b/app/src/main/res/layout/activity_street_light.xml @@ -6,34 +6,47 @@ android:layout_height="match_parent" android:orientation="vertical"> - + - + android:layout_height="match_parent" /> - - - + android:layout_height="match_parent"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_street_light_map.xml b/app/src/main/res/layout/activity_street_light_map.xml new file mode 100644 index 0000000..3a1aaad --- /dev/null +++ b/app/src/main/res/layout/activity_street_light_map.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_list.xml b/app/src/main/res/layout/fragment_light_list.xml deleted file mode 100644 index 837b198..0000000 --- a/app/src/main/res/layout/fragment_light_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_light_map.xml b/app/src/main/res/layout/fragment_light_map.xml deleted file mode 100644 index 9ffea49..0000000 --- a/app/src/main/res/layout/fragment_light_map.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/include_line_view.xml b/app/src/main/res/layout/include_line_view.xml index d530656..9bde5f2 100644 --- a/app/src/main/res/layout/include_line_view.xml +++ b/app/src/main/res/layout/include_line_view.xml @@ -2,4 +2,4 @@ \ No newline at end of file + android:background="@color/lineColor" /> \ No newline at end of file diff --git a/app/src/main/res/layout/popu_street_light.xml b/app/src/main/res/layout/popu_street_light.xml index c2d356c..334b307 100644 --- a/app/src/main/res/layout/popu_street_light.xml +++ b/app/src/main/res/layout/popu_street_light.xml @@ -39,6 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" + android:layout_centerVertical="true" android:background="@drawable/ic_switch_off" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2fe7877..52dd8e7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #FFFFFF #F5F5F5 - #E5E5E5 + #CCCCCC #D3D3D3 #CCCCCC #D8D8D8 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index bfbfc7a..fc219f1 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -35,7 +35,7 @@ 200dp - 1dp + 1px 56dp