app/build.gradle
@@ -164,11 +164,20 @@ implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0' //阿里的RocketMQ implementation 'org.apache.rocketmq:rocketmq-client:4.9.4' // implementation 'org.apache.rocketmq:rocketmq-client:4.9.4' implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' //room数据库 implementation "androidx.room:room-runtime:2.3.0" implementation "androidx.room:room-ktx:2.3.0" runtimeOnly("androidx.room:room-common:2.3.0") annotationProcessor "androidx.room:room-compiler:2.3.0" //图片 implementation 'com.github.bumptech.glide:glide:4.11.0' // PictureSelector 基础 (必须图片选择) implementation 'io.github.lucksiege:pictureselector:v3.11.2' // 图片压缩 (按需引入) implementation 'io.github.lucksiege:compress:v3.11.2' } app/proguard-rules.pro
@@ -145,4 +145,11 @@ # Note: if you use a custom API parser for parsing, you need to add confusion to your custom API entities. Here are the custom API entity obfuscation rules configured in this demo: -keep class com.xuexiang.xupdatedemo.entity.** { *; } -keep class com.hjq.permissions.** {*;} -keep class com.hjq.permissions.** {*;} #选择图片的框架 -keep class com.luck.picture.lib.** { *; } -keep class com.luck.lib.camerax.** { *; } -dontwarn com.yalantis.ucrop** -keep class com.yalantis.ucrop** { *; } -keep interface com.yalantis.ucrop** { *; } app/src/main/AndroidManifest.xml
@@ -3,6 +3,9 @@ xmlns:tools="http://schemas.android.com/tools" package="com.dayu.pipirrapp"> <!--用于进行网络定位--> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> @@ -22,10 +25,44 @@ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明--> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.VIBRATE" /> <!-- Android 13版本适配,细化存储权限--> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- 模拟位置--> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" tools:ignore="MockLocation,ProtectedPermissions" /> <queries package="${applicationId}"> <intent> <action android:name="android.media.action.IMAGE_CAPTURE"> </action> </intent> <intent> <action android:name="android.media.action.ACTION_VIDEO_CAPTURE"> </action> </intent> </queries> <application android:name=".MyApplication" @@ -66,6 +103,10 @@ android:launchMode="singleTop"> </activity> <activity android:name=".activity.OrderDetailActivity" /> <activity android:name=".activity.OrderDealActivity" /> <!-- <activity android:name=".activity.MainActivity" />--> <!-- Required since 5.2.0 --> <!-- 新的 tag/alias 接口结果返回需要开发者配置一个自定义的Service --> app/src/main/assets/js/map.js
@@ -271,19 +271,22 @@ } //保存定位坐标生成轨迹 var path=[]; function updateLocation(lat,log){ var newPoint = new T.LatLng(latitude, longitude); path.push(newPoint); var polyline = new T.Polyline({ path: path, // 轨迹坐标 strokeColor: "#FF0000", // 轨迹颜色 strokeWeight: 6, // 轨迹线宽 strokeOpacity: 0.7 // 轨迹透明度 }); map.addOverlay(polyline); // 移动地图视角到最后一个位置 map.panTo(newPoint); var lineLayer = new T.Polyline([], { color: 'red', weight: 3, opacity: 0.8 }); function updateLocation(log,lat){ var lastLat=lat; const intervalId = setInterval(() => { lastLat=lastLat+0.0001; var newPoint = new T.LngLat(log,lastLat); path.push(newPoint); lineLayer.setLngLats(path); map.addOverLay(lineLayer); // 移动地图视角到最后一个位置 map.panTo(newPoint); }, 500); } })(); app/src/main/java/com/dayu/pipirrapp/MyApplication.java
@@ -18,6 +18,7 @@ public static MyApplication myApplication; public String myTag = "-1"; public String token; public String userId; @Override public void onCreate() { app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java
@@ -139,7 +139,7 @@ data.put("type", "math");//图片类型:char-文本,math-一位数算式,math2-两位数算式 ApiManager.getInstance().requestGetHideLoading(LoginActivity.this, BASE_URL + ":8088/app/captcha/get", CodeResult.class, data, new SubscriberListener<BaseResponse<CodeResult>>() { ApiManager.getInstance().requestGetHideLoading(LoginActivity.this, BASE_URL + "/app/captcha/get", CodeResult.class, data, new SubscriberListener<BaseResponse<CodeResult>>() { @Override public void onNext(BaseResponse<CodeResult> t) { try { @@ -214,22 +214,26 @@ data.put("token", token); data.put("code", code); } ApiManager.getInstance().requestPostLoading(LoginActivity.this, BASE_URL + ":8079/sso/sso/loginJson", LoginResult.class, data, new SubscriberListener<BaseResponse<LoginResult>>() { ApiManager.getInstance().requestPostLoading(LoginActivity.this, BASE_URL + "/sso/sso/loginJson", LoginResult.class, data, new SubscriberListener<BaseResponse<LoginResult>>() { @Override public void onNext(BaseResponse<LoginResult> t) { try { if (t.isSuccess()) { SharedPreferencesHelper.getInstance(LoginActivity.this).put(CommonKeyName.Token, t.getContent().getToken()); MyApplication.myApplication.token = t.getContent().getToken(); MyApplication.myApplication.userId = t.getContent().getId(); LoginBean loginBean = DaoSingleton.getInstance(LoginActivity.this).loginDao().findFirst(); if (loginBean == null) { loginBean = new LoginBean(); } loginBean.setName(t.getContent().getName()); loginBean.setPhone(t.getContent().getPhone()); loginBean.setUserID(t.getContent().getId()); DaoSingleton.getInstance(LoginActivity.this).loginDao().insert(loginBean); SharedPreferencesHelper.getInstance(LoginActivity.this).put(CommonKeyName.isShowCode, false); ToastUtil.showToastLong(LoginActivity.this, "登录成功!"); startMainActivity(); } else { ToastUtil.showToast(LoginActivity.this, t.getMsg()); loginError++; app/src/main/java/com/dayu/pipirrapp/activity/MainActivity.java
@@ -15,6 +15,7 @@ import com.dayu.pipirrapp.fragment.OrderFragment; import com.dayu.pipirrapp.fragment.MapFragment; import com.dayu.pipirrapp.fragment.MyFragment; import com.dayu.pipirrapp.net.MqttManager; import java.util.ArrayList; import java.util.List; @@ -26,6 +27,7 @@ private ActivityMainBinding binding; private List<Fragment> fragments = new ArrayList<>(); private long mExitTime; MqttManager mqttManager; private enum Tab { ORDER, MAP, MY @@ -40,6 +42,8 @@ setupFragments(); initView(); initTab(); mqttManager = new MqttManager(this); mqttManager.connect(); } private void setupFragments() { @@ -76,6 +80,13 @@ return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { super.onDestroy(); //关闭MQ mqttManager.disconnect(); } /** * 修改底部状态 */ app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
New file @@ -0,0 +1,101 @@ package com.dayu.pipirrapp.activity; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.os.Bundle; import android.provider.MediaStore; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; import com.dayu.pipirrapp.adapter.AddPictureAdapter; import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding; import com.dayu.pipirrapp.tool.FullyGridLayoutManager; import com.dayu.pipirrapp.tool.GlideEngine; import com.luck.picture.lib.basic.PictureSelectionModel; import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.config.SelectModeConfig; import com.luck.picture.lib.decoration.GridSpacingItemDecoration; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.interfaces.OnGridItemSelectAnimListener; import com.luck.picture.lib.interfaces.OnQueryFilterListener; import com.luck.picture.lib.interfaces.OnSelectAnimListener; import com.luck.picture.lib.utils.DensityUtil; import java.util.ArrayList; import java.util.List; /** * OrderDealDetailActivity - * 工单处理界面 * * @author zuoxiao * @version 1.0 * @since 2024-11-27 */ public class OrderDealActivity extends BaseActivity { ActivityOrderDealBinding binding; RecyclerView mRecyclerView; AddPictureAdapter mAdapter; int maxSelectNum = 10;//最大照片 int maxSelectVideoNum = 0;//最大视频 private final List<LocalMedia> mData = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); initView(); } void initView() { mRecyclerView = binding.recycler; FullyGridLayoutManager manager = new FullyGridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(manager); RecyclerView.ItemAnimator itemAnimator = mRecyclerView.getItemAnimator(); if (itemAnimator != null) { ((SimpleItemAnimator) itemAnimator).setSupportsChangeAnimations(false); } mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); mAdapter = new AddPictureAdapter(this, mData); mAdapter.setSelectMax(maxSelectNum + maxSelectVideoNum); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener(new AddPictureAdapter.OnItemClickListener() { @Override public void onItemClick(View v, int position) { } @Override public void openPicture() { mOpenPicture(); } }); } private void mOpenPicture() { // 进入相册 PictureSelectionModel selectionModel = PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) .setMaxSelectNum(maxSelectNum) .setMaxVideoSelectNum(maxSelectVideoNum) .setImageEngine(GlideEngine.createGlideEngine()) .setSelectedData(mAdapter.getData()); selectionModel.forResult(PictureConfig.CHOOSE_REQUEST); } } app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
New file @@ -0,0 +1,93 @@ package com.dayu.pipirrapp.activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import androidx.annotation.Nullable; import com.dayu.pipirrapp.bean.net.OrderDetailResult; import com.dayu.pipirrapp.databinding.ActivityOrderDetailBinding; import com.dayu.pipirrapp.net.ApiManager; import com.dayu.pipirrapp.net.BaseResponse; import com.dayu.pipirrapp.net.Constants; import com.dayu.pipirrapp.net.subscribers.SubscriberListener; import com.dayu.pipirrapp.utils.ToastUtil; import com.dayu.pipirrapp.view.TitleBar; import java.util.HashMap; import java.util.Map; /** * OrderDetailActivity - * 工单详情界面 * * @author zuoxiao * @version 1.0 * @since 2024-11-27 */ public class OrderDetailActivity extends BaseActivity { ActivityOrderDetailBinding binding; String workOrderId; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityOrderDetailBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); new TitleBar(this).setTitleText("工单详情"); initView(); } void initView() { workOrderId = this.getIntent().getStringExtra("workOrderId"); if (!TextUtils.isEmpty(workOrderId)) { getMarkerData(workOrderId); } else { this.finish(); ToastUtil.showToastLong(this, "当前workOrderId为空"); } binding.setItemclidk(OrderDetailActivity.this); } /** * 获取工单详情 */ private void getMarkerData(String workOrderId) { Map<String, Object> params = new HashMap<>(); params.put("workOrderId", workOrderId); ApiManager.getInstance().requestGetHideLoading(this, Constants.BASE_URL + "/app/workOrder/getOneWorkOrder", OrderDetailResult.class, params, new SubscriberListener<BaseResponse<OrderDetailResult>>() { @Override public void onNext(BaseResponse<OrderDetailResult> t) { if (t.isSuccess()) { if (t.isSuccess()) { if (t.getContent() != null) { binding.setData(t.getContent()); } else { ToastUtil.showToast(OrderDetailActivity.this, t.getMsg()); } } } else { ToastUtil.showToast(OrderDetailActivity.this, t.getMsg()); } } @Override public void onCloose() { super.onCloose(); } }); } public void startDealActivity() { Intent intent = new Intent(this, OrderDealActivity.class); intent.putExtra("workOrderId", workOrderId); startActivity(intent); } } app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java
@@ -12,7 +12,6 @@ import com.dayu.pipirrapp.bean.db.LoginBean; import com.dayu.pipirrapp.dao.DaoSingleton; import com.dayu.pipirrapp.databinding.ActivitySplashScreenBinding; import com.dayu.pipirrapp.utils.CommonData; import com.dayu.pipirrapp.utils.CommonKeyName; import com.dayu.pipirrapp.utils.SharedPreferencesHelper; @@ -31,14 +30,17 @@ binding = ActivitySplashScreenBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); new Handler().postDelayed(() -> { LoginBean loginBean = DaoSingleton.getInstance(SplashScreenActivity.this).loginDao().findFirst(); String token = SharedPreferencesHelper.getInstance(SplashScreenActivity.this).get(CommonKeyName.Token, ""); if (loginBean != null && !TextUtils.isEmpty(token)) { startMainActivity(); MyApplication.myApplication.token = token; } else { startLoginActivity(); } // LoginBean loginBean = DaoSingleton.getInstance(SplashScreenActivity.this).loginDao().findFirst(); // String token = SharedPreferencesHelper.getInstance(SplashScreenActivity.this).get(CommonKeyName.Token, ""); // if (loginBean != null && !TextUtils.isEmpty(token)) { // startMainActivity(); // MyApplication.myApplication.token = token; // MyApplication.myApplication.userId = loginBean.getUserID(); // } else { // startLoginActivity(); // } Intent intent = new Intent(this, OrderDealActivity.class); startActivity(intent); SplashScreenActivity.this.finish(); }, 1000); } app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java
New file @@ -0,0 +1,225 @@ package com.dayu.pipirrapp.adapter; import android.content.Context; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.listener.OnItemLongClickListener; import com.luck.picture.lib.adapter.holder.PreviewGalleryAdapter; import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.utils.DateUtils; import java.util.ArrayList; import java.util.List; /** * AddPictureAdapter - * 添加图片 * * @author zuoxiao * @version 1.0 * @since 2024-11-28 */ public class AddPictureAdapter extends RecyclerView.Adapter<AddPictureAdapter.ViewHolder> { public static final String TAG = "PictureSelector"; public static final int TYPE_CAMERA = 1; public static final int TYPE_PICTURE = 2; private final LayoutInflater mInflater; private final ArrayList<LocalMedia> list = new ArrayList<>(); private int selectMax = 9; /** * 删除 */ public void delete(int position) { try { if (position != RecyclerView.NO_POSITION && list.size() > position) { list.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, list.size()); } } catch (Exception e) { e.printStackTrace(); } } public AddPictureAdapter(Context context, List<LocalMedia> result) { this.mInflater = LayoutInflater.from(context); this.list.addAll(result); } public void setSelectMax(int selectMax) { this.selectMax = selectMax; } public int getSelectMax() { return selectMax; } public ArrayList<LocalMedia> getData() { return list; } public void remove(int position) { if (position < list.size()) { list.remove(position); } } public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mImg; ImageView mIvDel; TextView tvDuration; public ViewHolder(View view) { super(view); mImg = view.findViewById(R.id.fiv); mIvDel = view.findViewById(R.id.iv_del); tvDuration = view.findViewById(R.id.tv_duration); } } @Override public int getItemCount() { if (list.size() < selectMax) { return list.size() + 1; } else { return list.size(); } } @Override public int getItemViewType(int position) { if (isShowAddItem(position)) { return TYPE_CAMERA; } else { return TYPE_PICTURE; } } /** * 创建ViewHolder */ @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = mInflater.inflate(R.layout.item_add_filter_image, viewGroup, false); return new ViewHolder(view); } private boolean isShowAddItem(int position) { int size = list.size(); return position == size; } /** * 设置值 */ @Override public void onBindViewHolder(final ViewHolder viewHolder, final int position) { //少于MaxSize张,显示继续添加的图标 if (getItemViewType(position) == TYPE_CAMERA) { viewHolder.mImg.setImageResource(R.mipmap.ic_add_image); viewHolder.mImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mItemClickListener != null) { mItemClickListener.openPicture(); } } }); viewHolder.mIvDel.setVisibility(View.INVISIBLE); } else { viewHolder.mIvDel.setVisibility(View.VISIBLE); viewHolder.mIvDel.setOnClickListener(view -> { int index = viewHolder.getAbsoluteAdapterPosition(); if (index != RecyclerView.NO_POSITION && list.size() > index) { list.remove(index); notifyItemRemoved(index); notifyItemRangeChanged(index, list.size()); } }); LocalMedia media = list.get(position); int chooseModel = media.getChooseModel(); String path = media.getAvailablePath(); long duration = media.getDuration(); viewHolder.tvDuration.setVisibility(PictureMimeType.isHasVideo(media.getMimeType()) ? View.VISIBLE : View.GONE); if (chooseModel == SelectMimeType.ofAudio()) { viewHolder.tvDuration.setVisibility(View.VISIBLE); viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds (R.mipmap.ps_ic_audio, 0, 0, 0); } else { viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds (R.mipmap.ps_ic_video, 0, 0, 0); } viewHolder.tvDuration.setText(DateUtils.formatDurationTime(duration)); if (chooseModel == SelectMimeType.ofAudio()) { viewHolder.mImg.setImageResource(R.drawable.ps_audio_placeholder); } else { Glide.with(viewHolder.itemView.getContext()) .load(PictureMimeType.isContent(path) && !media.isCut() && !media.isCompressed() ? Uri.parse(path) : path) .centerCrop() .placeholder(R.color.app_color_f6) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(viewHolder.mImg); } //itemView 的点击事件 if (mItemClickListener != null) { viewHolder.itemView.setOnClickListener(v -> { int adapterPosition = viewHolder.getAbsoluteAdapterPosition(); mItemClickListener.onItemClick(v, adapterPosition); }); } if (mItemLongClickListener != null) { viewHolder.itemView.setOnLongClickListener(v -> { int adapterPosition = viewHolder.getAbsoluteAdapterPosition(); mItemLongClickListener.onItemLongClick(viewHolder, adapterPosition, v); return true; }); } } } private OnItemClickListener mItemClickListener; public void setOnItemClickListener(OnItemClickListener l) { this.mItemClickListener = l; } public interface OnItemClickListener { /** * Item click event * * @param v * @param position */ void onItemClick(View v, int position); /** * Open PictureSelector */ void openPicture(); } private OnItemLongClickListener mItemLongClickListener; public void setItemLongClickListener(OnItemLongClickListener l) { this.mItemLongClickListener = l; } } app/src/main/java/com/dayu/pipirrapp/adapter/BaseRecyclerAdapter.java
New file @@ -0,0 +1,64 @@ package com.dayu.pipirrapp.adapter; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.dayu.pipirrapp.databinding.ItemNoMoreBinding; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-04-20 8:48 * Description: */ public class BaseRecyclerAdapter<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<T> { /** * viewType--分别为item以及空view */ public static final int VIEW_TYPE_ITEM = 1; public static final int VIEW_TYPE_EMPTY = 0; public int myiewType; @NonNull @Override public T onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(@NonNull T holder, int position) { } @Override public int getItemCount() { return 0; } static class ViewHolderEmpty extends RecyclerView.ViewHolder { ItemNoMoreBinding mBinding; public ItemNoMoreBinding getBinding() { return mBinding; } public void setBinding(ItemNoMoreBinding binding) { this.mBinding = binding; } public ViewHolderEmpty(ItemNoMoreBinding itemView) { super(itemView.getRoot()); this.mBinding = itemView; } } } app/src/main/java/com/dayu/pipirrapp/adapter/ImageAdapter.java
New file @@ -0,0 +1,58 @@ package com.dayu.pipirrapp.adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.dayu.pipirrapp.R; /** * ImageAdapter - * * @author zuoxiao * @version 1.0 * @since 2024-11-27 */ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder>{ private String[] imageUrls; // 图片的 URL 或本地路径 // 构造方法 public ImageAdapter(String[] imageUrls) { this.imageUrls = imageUrls; } @Override public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 获取布局文件 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); return new ImageViewHolder(view); } @Override public void onBindViewHolder(ImageViewHolder holder, int position) { // 使用 Glide 加载图片到 ImageView 中 Glide.with(holder.itemView.getContext()) .load(imageUrls[position]) // 加载图片的 URL 或路径 .thumbnail(0.1f) // 设置缩略图比例 .into(holder.imageView); } @Override public int getItemCount() { return imageUrls.length; } public static class ImageViewHolder extends RecyclerView.ViewHolder { ImageView imageView; public ImageViewHolder(View itemView) { super(itemView); // imageView = itemView.findViewById(R.id.thumbnailImageView); } } } app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java
New file @@ -0,0 +1,110 @@ package com.dayu.pipirrapp.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.bean.net.OrderListResult; import com.dayu.pipirrapp.databinding.ItemNoMoreBinding; import com.dayu.pipirrapp.databinding.ItemOrderBinding; import com.dayu.pipirrapp.fragment.OrderFragment; import java.util.List; /** * OrderAdapter - * 工单列表 * * @author zuoxiao * @version 1.0 * @since 2024-11-27 */ public class OrderAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> { List<OrderListResult.Data> recordsList; Context context; OrderFragment orderFragment; public OrderAdapter(Context context, List<OrderListResult.Data> recordsList, OrderFragment orderFragment) { this.context = context; this.recordsList = recordsList; this.orderFragment = orderFragment; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_EMPTY) { ItemNoMoreBinding emptyView = DataBindingUtil.inflate((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_no_more, parent, false); return new BaseRecyclerAdapter.ViewHolderEmpty(emptyView); } else { ItemOrderBinding binding = DataBindingUtil.inflate((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_order, parent, false); return new OrderAdapter.ViewHolder(binding, orderFragment); } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof OrderAdapter.ViewHolder) { if (recordsList.size() > 0) { OrderListResult.Data record = recordsList.get(position); ((OrderAdapter.ViewHolder) holder).getBinding().setData(record); } } } @Override public int getItemCount() { //同时这里也需要添加判断,如果mData.size()为0的话,只引入一个布局,就是emptyView // 那么,这个recyclerView的itemCount为1 if (recordsList != null) { if (recordsList.size() == 0) { return 1; } return recordsList.size(); } else { return 1; } } @Override public int getItemViewType(int position) { if (recordsList != null) { if (recordsList.size() == 0) { return VIEW_TYPE_EMPTY; } else { return VIEW_TYPE_ITEM; } } else { return VIEW_TYPE_EMPTY; } } static class ViewHolder extends RecyclerView.ViewHolder { ItemOrderBinding mBinding; public ItemOrderBinding getBinding() { return mBinding; } public void setBinding(ItemOrderBinding binding) { this.mBinding = binding; } public ViewHolder(ItemOrderBinding itemView, OrderFragment orderFragment) { super(itemView.getRoot()); this.mBinding = itemView; mBinding.setItemclidk(orderFragment); } } } app/src/main/java/com/dayu/pipirrapp/bean/db/LoginBean.java
@@ -19,6 +19,15 @@ public String phone; public String userID; public String getUserID() { return userID; } public void setUserID(String userID) { this.userID = userID; } public String getName() { return name; app/src/main/java/com/dayu/pipirrapp/bean/net/BaseListResult.java
New file @@ -0,0 +1,15 @@ package com.dayu.pipirrapp.bean.net; /** * BaseListResult - * * @author zuoxiao * @version 1.0 * @since 2024-11-26 */ public class BaseListResult { } app/src/main/java/com/dayu/pipirrapp/bean/net/OrderDetailResult.java
New file @@ -0,0 +1,30 @@ package com.dayu.pipirrapp.bean.net; /** * OrderDetailResult - * * @author zuoxiao * @version 1.0 * @since 2024-11-28 */ public class OrderDetailResult { public String workOrderId;//工单ID public String dispatcherId;//派单人ID public String dispatcher;//派单人姓名 public String inspectorId;//巡检员ID public String inspector;//巡检员姓名 public String taskType;//任务类型 public String taskContent;//任务内容 public String completeCriteria;//完成标准 public String deadLine;//要求完成时间 public String clientReportId;//农户问题上报ID public String inspectorReportId;//巡检员问题上报ID public String completeTime;//任务完成时间 public String dispatchTime;//派单时间 public int rejectTimes;//驳回次数 public String state;//工单状态 public String processingState;//处理状态 } app/src/main/java/com/dayu/pipirrapp/bean/net/OrderListResult.java
New file @@ -0,0 +1,82 @@ package com.dayu.pipirrapp.bean.net; import java.util.List; /** * OrderListResult - * 未删除工单列表 * * @author zuoxiao * @version 1.0 * @since 2024-11-26 */ public class OrderListResult { int itemTotal; int pageCurr; int pageSize; int pageTotal; List<Data> obj; public int getItemTotal() { return itemTotal; } public void setItemTotal(int itemTotal) { this.itemTotal = itemTotal; } public int getPageCurr() { return pageCurr; } public void setPageCurr(int pageCurr) { this.pageCurr = pageCurr; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPageTotal() { return pageTotal; } public void setPageTotal(int pageTotal) { this.pageTotal = pageTotal; } public List<Data> getObj() { return obj; } public void setObj(List<Data> obj) { this.obj = obj; } public class Data { public String workOrderId;//工单ID public String dispatcherId;//派单人ID public String dispatcher;//派单人姓名 public String inspectorId;//巡检员ID public String inspector;//巡检员姓名 public String taskType;//任务类型 public String taskContent;//任务内容 public String completeCriteria;//完成标准 public String deadLine;//要求完成时间 public String clientReportId;//农户问题上报ID public String inspectorReportId;//巡检员问题上报ID public String completeTime;//任务完成时间 public String dispatchTime;//派单时间 public int rejectTimes;//驳回次数 public String state;//工单状态 public String processingState;//处理状态 } } app/src/main/java/com/dayu/pipirrapp/fragment/BaseFragment.java
@@ -2,6 +2,8 @@ import androidx.fragment.app.Fragment; import com.scwang.smart.refresh.layout.api.RefreshLayout; /** * author: zuo * Date: 2023/12/20 @@ -9,4 +11,14 @@ * 备注: */ public class BaseFragment extends Fragment { public void layoutFinish(RefreshLayout refreshLayout, boolean isRefresh) { if (refreshLayout != null) { if (isRefresh) { refreshLayout.finishRefresh(); } else { refreshLayout.finishLoadMore(); } } } } app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -106,8 +106,10 @@ LiveEventBus.get(CommonKeyName.locationData).observeForever(new Observer<Object>() { @Override public void onChanged(Object o) { LatLonBean latLonBean = (LatLonBean) o; mWebView.evaluateJavascript("javascript:updateLocation(\"" + latLonBean.getLatitude()+ "\",\"" + latLonBean.getLongitude()+ "\")", value -> { Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude()); mWebView.evaluateJavascript("javascript:updateLocation(\"" + latLonBean.getLatitude() + "\",\"" + latLonBean.getLongitude() + "\")", value -> { }); } }); @@ -200,7 +202,7 @@ * 获取取水口列表 */ private void getMarkerData() { ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + ":8085/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() { ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() { @Override public void onNext(BaseResponse<MarkerResult> t) { if (t.isSuccess()) { @@ -284,11 +286,7 @@ void initView() { //跳转到指定位置 binding.flyBtn.setOnClickListener(v -> { mWebView.evaluateJavascript("javascript:locationOverLay(116.399565,39.89432)", value -> { }); }); mWebView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { @@ -346,15 +344,15 @@ }); //巡检按钮 binding.inspectButton.setOnClickListener(v -> { if (isStartInspec){ ConfirmDialog confirmDialog=new ConfirmDialog(MapFragment.this.getActivity(), "提示", "确认关闭巡检吗?", new View.OnClickListener() { if (isStartInspec) { ConfirmDialog confirmDialog = new ConfirmDialog(MapFragment.this.getActivity(), "提示", "确认关闭巡检吗?", new View.OnClickListener() { @Override public void onClick(View v) { isStartInspec = !isStartInspec; chageInspecState(); } }); }else { } else { isStartInspec = !isStartInspec; chageInspecState(); } @@ -374,7 +372,7 @@ */ private void getCenterPoint() { ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + ":8080/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() { ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() { @Override public void onNext(BaseResponse<CenterPointResult> t) { if (t.isSuccess()) { app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
@@ -98,6 +98,6 @@ @Override public void onStart() { super.onStart(); new TitleBar(MyFragment.this.getActivity()).setTitleText("我的"); } } app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java
@@ -1,5 +1,7 @@ package com.dayu.pipirrapp.fragment; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -8,23 +10,31 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.Observer; import androidx.recyclerview.widget.LinearLayoutManager; import com.dayu.pipirrapp.bean.db.LatLonBean; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.activity.OrderDetailActivity; import com.dayu.pipirrapp.adapter.OrderAdapter; import com.dayu.pipirrapp.bean.net.OrderListResult; import com.dayu.pipirrapp.bean.net.WeatherResponse; import com.dayu.pipirrapp.databinding.FragmentMainBinding; import com.dayu.pipirrapp.databinding.FragmentOrderBinding; import com.dayu.pipirrapp.net.ApiManager; import com.dayu.pipirrapp.utils.ImageUtils; import com.dayu.pipirrapp.utils.MyJsonParser; import com.dayu.pipirrapp.utils.SharedPreferencesHelper; import com.dayu.pipirrapp.view.TitleBar; import com.dayu.pipirrapp.net.BaseResponse; import com.dayu.pipirrapp.net.Constants; import com.dayu.pipirrapp.net.subscribers.SubscriberListener; import com.dayu.pipirrapp.utils.CommonKeyName; import com.dayu.pipirrapp.utils.ToastUtil; import com.jeremyliao.liveeventbus.LiveEventBus; import com.tencent.bugly.crashreport.CrashReport; import com.scwang.smart.refresh.footer.ClassicsFooter; import com.scwang.smart.refresh.header.ClassicsHeader; import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener; import com.scwang.smart.refresh.layout.listener.OnRefreshListener; import java.util.Calendar; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * author: zuo @@ -34,89 +44,221 @@ */ public class OrderFragment extends BaseFragment { FragmentMainBinding binding; WeatherResponse weatherResponse; //收到定位广播后获取天气信息 Observer<LatLonBean> myObserver = new Observer<LatLonBean>() { @Override public void onChanged(LatLonBean latLonBean) { String jsonStr = SharedPreferencesHelper.getInstance(OrderFragment.this.getActivity()).get("WeatherResponse", ""); weatherResponse = MyJsonParser.getBeanFromJson(jsonStr, WeatherResponse.class); if (weatherResponse == null) { weatherResponse = new WeatherResponse(); } // 获取当前时间 Calendar calendar = Calendar.getInstance(); // 获取当前年月日 int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; // 注意月份是从0开始计数的,所以要加1 int day = calendar.get(Calendar.DAY_OF_MONTH); String date = year + "年" + month + "月" + day + "日"; if (weatherResponse == null || !date.equals(weatherResponse.getDate())) { weatherResponse.setDate(date); ApiManager.getInstance().requestWeather(latLonBean.getLatitude() + ":" + latLonBean.getLongitude(), new Callback<WeatherResponse>() { @Override public void onResponse(Call<WeatherResponse> call, Response<WeatherResponse> response) { private final int STATE_DONE = 2; private final int STATE_UNDONE = 1; if (response.isSuccessful()) { weatherResponse.setResults(response.body().getResults()); SharedPreferencesHelper.getInstance(OrderFragment.this.getActivity()).put("WeatherResponse", weatherResponse); setWeatherData(weatherResponse); } } @Override public void onFailure(Call<WeatherResponse> call, Throwable t) { } }); } else { setWeatherData(weatherResponse); } LiveEventBus.get("location", LatLonBean.class).removeObserver(myObserver); } }; FragmentOrderBinding binding; OrderAdapter mAdapter; int page = 1; int pageSize = 10; int state = 1; List<OrderListResult.Data> recordsListDone = new ArrayList<>(); List<OrderListResult.Data> recordsList = new ArrayList<>(); /** * 设置天气相关信息 * * @param data * @param */ private void setWeatherData(WeatherResponse data) { try { if (data.getResults() != null) { binding.cityName.setText(data.getResults()[0].getLocation().getName()); binding.time.setText(data.getDate()); int weatherImg = ImageUtils.getWeatherDrawable(data.getResults()[0].getDaily()[0].getCode_day()); if (weatherImg != 0) { binding.weatherImg.setImageDrawable(getResources().getDrawable(weatherImg)); } binding.weatherName.setText(data.getResults()[0].getDaily()[0].getText_day()); binding.weatherTemperature.setText(data.getResults()[0].getDaily()[0].getLow() + "°C ~ " + data.getResults()[0].getDaily()[0].getHigh() + "°C"); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } // private void setWeatherData(WeatherResponse data) { // try { // if (data.getResults() != null) { // binding.cityName.setText(data.getResults()[0].getLocation().getName()); // binding.time.setText(data.getDate()); // int weatherImg = ImageUtils.getWeatherDrawable(data.getResults()[0].getDaily()[0].getCode_day()); // if (weatherImg != 0) { // binding.weatherImg.setImageDrawable(getResources().getDrawable(weatherImg)); // } // binding.weatherName.setText(data.getResults()[0].getDaily()[0].getText_day()); // binding.weatherTemperature.setText(data.getResults()[0].getDaily()[0].getLow() + "°C ~ " + data.getResults()[0].getDaily()[0].getHigh() + "°C"); // } // } catch (Exception e) { // e.printStackTrace(); // CrashReport.postCatchedException(e); // } // } @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = FragmentMainBinding.inflate(inflater, container, false); //获取到经纬度后获取天气信息 LiveEventBus .get("location", LatLonBean.class) .observeForever(myObserver); binding = FragmentOrderBinding.inflate(inflater, container, false); initView(); //获取定位服务传过来的坐标点 LiveEventBus.get(CommonKeyName.MQTTData).observeForever(new Observer<Object>() { @Override public void onChanged(Object o) { } }); return binding.getRoot(); } void initView() { //未完成 binding.manageStateProgress.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chooseStateView(true); state = STATE_UNDONE;//1 未开始 2 已完成 } }); //已完成 binding.manageStateFinish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chooseStateView(false); state = STATE_DONE;//1 未开始 2 已完成 } }); //未完成 RefreshLayout myRefreshLayout = (RefreshLayout) binding.refreshLayout; myRefreshLayout.setRefreshHeader(new ClassicsHeader(this.getContext())); myRefreshLayout.setRefreshFooter(new ClassicsFooter(this.getContext())); myRefreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(RefreshLayout refreshlayout) { // refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败 recordsList.clear(); page = 0; getMarkerData(refreshlayout, true, STATE_UNDONE); } }); myRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(RefreshLayout refreshlayout) { page = page + 1; getMarkerData(refreshlayout, false, STATE_UNDONE); } }); mAdapter = new OrderAdapter(this.getContext(), recordsList, this); LinearLayoutManager layoutManager = new LinearLayoutManager(this.getContext()); binding.recyclerView.setLayoutManager(layoutManager); binding.recyclerView.setAdapter(mAdapter); getMarkerData(myRefreshLayout, true, STATE_UNDONE); //已完成 RefreshLayout myRefreshLayoutDone = (RefreshLayout) binding.refreshLayoutDone; myRefreshLayoutDone.setRefreshHeader(new ClassicsHeader(this.getContext())); myRefreshLayoutDone.setRefreshFooter(new ClassicsFooter(this.getContext())); myRefreshLayoutDone.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(RefreshLayout refreshlayout) { // refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败 recordsList.clear(); page = 0; getMarkerData(refreshlayout, true, STATE_DONE); } }); myRefreshLayoutDone.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(RefreshLayout refreshlayout) { page = page + 1; getMarkerData(refreshlayout, false, STATE_DONE); } }); mAdapter = new OrderAdapter(this.getContext(), recordsListDone, this); LinearLayoutManager layoutManagerDone = new LinearLayoutManager(this.getContext()); binding.recyclerViewDone.setLayoutManager(layoutManagerDone); binding.recyclerViewDone.setAdapter(mAdapter); getMarkerData(myRefreshLayoutDone, true, 2); } @Override public void onStart() { super.onStart(); new TitleBar(OrderFragment.this.getActivity()).setTitleText("工单"); } /** * 获取未删除工单 */ private void getMarkerData(RefreshLayout refreshlayout, boolean isRefresh, int state) { Map<String, Object> params = new HashMap<>(); if (isRefresh) { page = 1; if (state == STATE_UNDONE) { recordsList.clear(); } else { recordsListDone.clear(); } } params.put("pageSize", pageSize); params.put("pageCurr", page); params.put("state", state); // params.put("inspectorId", MyApplication.myApplication.userId); ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/app/workOrder/getWorkOrders", OrderListResult.class, params, new SubscriberListener<BaseResponse<OrderListResult>>() { @Override public void onNext(BaseResponse<OrderListResult> t) { if (t.isSuccess()) { if (t.isSuccess()) { if (t.getContent().getObj() != null && t.getContent().getObj().size() > 0) { if (state == STATE_UNDONE) { recordsList.addAll(t.getContent().getObj()); } else { recordsListDone.addAll(t.getContent().getObj()); } if (t.getContent().getObj().size() < pageSize) { refreshlayout.finishLoadMoreWithNoMoreData(); } } else { refreshlayout.finishLoadMoreWithNoMoreData(); } } } else { ToastUtil.showToast(OrderFragment.this.getContext(), t.getMsg()); } } @Override public void onCloose() { super.onCloose(); layoutFinish(refreshlayout, isRefresh); mAdapter.notifyDataSetChanged(); } }); } public void startDetail(String id) { Intent intent = new Intent(this.getContext(), OrderDetailActivity.class); intent.putExtra("workOrderId", id); startActivity(intent); } /** * 修改进度状态 * * @param state true为未完成 false为已完成 */ void chooseStateView(boolean state) { if (state) { binding.manageStateProgress.setTextColor(getResources().getColor(R.color.title_color)); binding.manageStateProgress.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit)); binding.manageStateProgress.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); binding.manageStateFinish.setTextColor(getResources().getColor(R.color.black)); binding.manageStateFinish.setBackground(getResources().getDrawable(R.color.title_choose_bg)); binding.manageStateFinish.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); binding.refreshLayout.setVisibility(View.VISIBLE); binding.refreshLayoutDone.setVisibility(View.GONE); } else { binding.manageStateFinish.setTextColor(getResources().getColor(R.color.title_color)); binding.manageStateFinish.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit)); binding.manageStateFinish.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); binding.manageStateProgress.setTextColor(getResources().getColor(R.color.black)); binding.manageStateProgress.setBackground(getResources().getDrawable(R.color.title_choose_bg)); binding.manageStateProgress.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); binding.refreshLayout.setVisibility(View.GONE); binding.refreshLayoutDone.setVisibility(View.VISIBLE); } } } app/src/main/java/com/dayu/pipirrapp/listener/OnItemLongClickListener.java
New file @@ -0,0 +1,14 @@ package com.dayu.pipirrapp.listener; import android.view.View; import androidx.recyclerview.widget.RecyclerView; /** * @author:luck * @date:2020-01-13 17:58 * @describe:长按事件 */ public interface OnItemLongClickListener { void onItemLongClick(RecyclerView.ViewHolder holder, int position, View v); } app/src/main/java/com/dayu/pipirrapp/net/Constants.java
@@ -6,8 +6,8 @@ * Description: */ public class Constants { // public static final String BASE_URL = "http://192.168.10.52"; public static final String BASE_URL = "http://192.168.40.166"; // public static final String BASE_URL = "http://192.168.10.52:8088"; public static final String BASE_URL = "https://no253541tf71.vicp.fun"; /** * 代表请求成功 */ app/src/main/java/com/dayu/pipirrapp/net/MqttManager.java
New file @@ -0,0 +1,202 @@ package com.dayu.pipirrapp.net; import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.util.Log; import com.dayu.pipirrapp.utils.CommonKeyName; import com.jeremyliao.liveeventbus.LiveEventBus; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * MQTT相关设置 * * @author zuoxiao * @version 1.0 * @since 2024-11-26 */ public class MqttManager { private static final String MQTT_BROKER_URL = "tcp://115.236.153.170:30764"; // 修改为你的 broker 地址 private static final String CLIENT_ID = "mqttx_54052fa0"; private static final String TOPIC = "workOrder"; // 订阅的主题 private ConnectivityManager connectivityManager; private MqttClient mqttClient; private MqttConnectOptions connectOptions; boolean isHasNet = false; public MqttManager(Context context) { try { mqttClient = new MqttClient(MQTT_BROKER_URL, CLIENT_ID, new MemoryPersistence()); connectOptions = new MqttConnectOptions(); connectOptions.setUserName("mqtt_yjy"); connectOptions.setPassword("yjy".toCharArray()); connectOptions.setCleanSession(false); connectOptions.setKeepAliveInterval(60); // 设置保持连接的时间 connectOptions.setAutomaticReconnect(true); // 启用自动重连 connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); checkNetwork(); } catch (MqttException e) { e.printStackTrace(); } } // 连接到 MQTT broker public void connect() { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { try { if (isHasNet) { mqttClient.connect(connectOptions); if (mqttClient.isConnected()) { Log.d("MqttManager", "Connected to MQTT broker"); subscribeToTopic(); } } else { reconnect(); } } catch (MqttException e) { reconnect(); Log.e("MqttManager", "Error connecting to MQTT broker", e); } } }); } // 订阅主题 private void subscribeToTopic() { try { mqttClient.subscribe(TOPIC, (topic, message) -> { // 收到消息时的处理逻辑 Log.d("MqttManager", "Received message:" + new String(message.getPayload())); //传递MQ收到的信息 LiveEventBus.get(CommonKeyName.locationData).post(message.getPayload()); }); mqttClient.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { Log.d("MqttManager", "connectionLost" + cause.getMessage()); reconnect(); // 处理连接丢失,可以尝试重新连接 } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { Log.d("MqttManager", "Received messageArrived:" + new String(message.getPayload())); // 处理收到的消息 } @Override public void deliveryComplete(IMqttDeliveryToken token) { // 处理消息发送完成 try { Log.d("MqttManager", "deliveryComplete:" + new String(token.getMessage().toString())); } catch (MqttException e) { e.printStackTrace(); } } }); } catch (MqttException e) { e.printStackTrace(); } } // 发布消息 public void publishMessage(String message) { try { MqttMessage mqttMessage = new MqttMessage(message.getBytes()); mqttClient.publish(TOPIC, mqttMessage); } catch (MqttException e) { e.printStackTrace(); } } // 断开连接 public void disconnect() { try { if (mqttClient != null && mqttClient.isConnected()) { mqttClient.disconnect(); System.out.println("Disconnected from MQTT broker"); } } catch (MqttException e) { e.printStackTrace(); } } // 自动重连方法 private void reconnect() { try { if (isHasNet) { while (!mqttClient.isConnected() && isHasNet) { Log.d("MqttManager", "Attempting to reconnect..."); mqttClient.connect(connectOptions); // 重试连接 if (mqttClient.isConnected()) { Log.d("MqttManager", "Connected to MQTT broker"); subscribeToTopic(); } Thread.sleep(5000); // 每 5 秒重试一次 } Log.d("MqttManager", "Reconnected to MQTT broker! isHasNet=true"); } else { Log.d("MqttManager", "isHasNet is false"); Thread.sleep(5000); reconnect(); } } catch (MqttException | InterruptedException e) { try { Thread.sleep(5000); } catch (InterruptedException ex) { e.printStackTrace(); }// 每 5 秒重试一次 reconnect(); } } public void checkNetwork() { NetworkRequest request = new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) // 必须具备互联网能力 .build(); connectivityManager.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { super.onAvailable(network); // 网络可用时的处理逻辑 Log.d("MqttManager", "Network is available."); isHasNet = true; reconnect(); } @Override public void onLost(Network network) { super.onLost(network); // 网络丢失时的处理逻辑 Log.d("MqttManager", "Network is lost."); isHasNet = false; try { mqttClient.disconnect(); } catch (MqttException e) { e.printStackTrace(); } } }); } } app/src/main/java/com/dayu/pipirrapp/tool/FullyGridLayoutManager.java
New file @@ -0,0 +1,104 @@ package com.dayu.pipirrapp.tool; import android.content.Context; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; /** * FullyGridLayoutManager - * * @author zuoxiao * @version 1.0 * @since 2024-11-28 */ public class FullyGridLayoutManager extends GridLayoutManager { private final int[] mMeasuredDimension = new int[2]; public FullyGridLayoutManager(Context context, int spanCount) { super(context, spanCount); } public FullyGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { super(context, spanCount, orientation, reverseLayout); } @Override public void onMeasure(@NonNull RecyclerView.Recycler recycler, @NonNull RecyclerView.State state, int widthSpec, int heightSpec) { final int widthMode = View.MeasureSpec.getMode(widthSpec); final int heightMode = View.MeasureSpec.getMode(heightSpec); final int widthSize = View.MeasureSpec.getSize(widthSpec); final int heightSize = View.MeasureSpec.getSize(heightSpec); int width = 0; int height = 0; int count = getItemCount(); int span = getSpanCount(); for (int i = 0; i < count; i++) { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); if (getOrientation() == HORIZONTAL) { if (i % span == 0) { width = width + mMeasuredDimension[0]; } if (i == 0) { height = mMeasuredDimension[1]; } } else { if (i % span == 0) { height = height + mMeasuredDimension[1]; } if (i == 0) { width = mMeasuredDimension[0]; } } } switch (widthMode) { case View.MeasureSpec.EXACTLY: width = widthSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } switch (heightMode) { case View.MeasureSpec.EXACTLY: height = heightSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } setMeasuredDimension(width, height); } final RecyclerView.State mState = new RecyclerView.State(); private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { int itemCount = mState.getItemCount(); if (position < itemCount) { try { View view = recycler.getViewForPosition(0); if (view != null) { RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, getPaddingLeft() + getPaddingRight(), p.width); int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, getPaddingTop() + getPaddingBottom(), p.height); view.measure(childWidthSpec, childHeightSpec); measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin; measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin; recycler.recycleView(view); } } catch (Exception e) { e.printStackTrace(); } } } } app/src/main/java/com/dayu/pipirrapp/tool/GlideEngine.java
New file @@ -0,0 +1,119 @@ package com.dayu.pipirrapp.tool; import android.content.Context; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.dayu.pipirrapp.R; import com.luck.picture.lib.engine.ImageEngine; import com.luck.picture.lib.utils.ActivityCompatHelper; /** * GlideEngine -Glide加载引擎 * * @author zuoxiao * @version 1.0 * @since 2024-11-28 */ public class GlideEngine implements ImageEngine { /** * 加载图片 * * @param context 上下文 * @param url 资源url * @param imageView 图片承载控件 */ @Override public void loadImage(Context context, String url, ImageView imageView) { if (!ActivityCompatHelper.assertValidRequest(context)) { return; } Glide.with(context) .load(url) .into(imageView); } @Override public void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) { if (!ActivityCompatHelper.assertValidRequest(context)) { return; } Glide.with(context) .load(url) .override(maxWidth, maxHeight) .into(imageView); } /** * 加载相册目录封面 * * @param context 上下文 * @param url 图片路径 * @param imageView 承载图片ImageView */ @Override public void loadAlbumCover(Context context, String url, ImageView imageView) { if (!ActivityCompatHelper.assertValidRequest(context)) { return; } Glide.with(context) .asBitmap() .load(url) .override(180, 180) .sizeMultiplier(0.5f) .transform(new CenterCrop(), new RoundedCorners(8)) .placeholder(R.drawable.ps_image_placeholder) .into(imageView); } /** * 加载图片列表图片 * * @param context 上下文 * @param url 图片路径 * @param imageView 承载图片ImageView */ @Override public void loadGridImage(Context context, String url, ImageView imageView) { if (!ActivityCompatHelper.assertValidRequest(context)) { return; } Glide.with(context) .load(url) .override(200, 200) .centerCrop() .placeholder(R.drawable.ps_image_placeholder) .into(imageView); } @Override public void pauseRequests(Context context) { if (!ActivityCompatHelper.assertValidRequest(context)) { return; } Glide.with(context).pauseRequests(); } @Override public void resumeRequests(Context context) { if (!ActivityCompatHelper.assertValidRequest(context)) { return; } Glide.with(context).resumeRequests(); } private GlideEngine() { } private static final class InstanceHolder { static final GlideEngine instance = new GlideEngine(); } public static GlideEngine createGlideEngine() { return InstanceHolder.instance; } } app/src/main/java/com/dayu/pipirrapp/tool/RocketMQConsumer.java
File was deleted app/src/main/java/com/dayu/pipirrapp/utils/CommonKeyName.java
@@ -17,6 +17,8 @@ public final static String isStartInspec = "isStartInspec"; //定位后 public final static String locationData="locationData"; public final static String locationData = "locationData"; public final static String MQTTData = "MQTTData"; } app/src/main/res/drawable/edittext_backgroud.xml
New file @@ -0,0 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 背景颜色 --> <solid android:color="#FFFFFF" /> <!-- 圆角 --> <corners android:radius="6dp" /> <!-- 边框 --> <stroke android:color="#CCCCCC" android:width="2dp" /> <!-- 内边距 --> <padding android:left="16dp" android:right="16dp" android:top="10dp" android:bottom="10dp" /> </shape> app/src/main/res/drawable/ic_choose_bg_whit.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ffffff" /> <corners android:radius="5dp" /> <stroke android:width="1dp" android:color="#ffffff" /> </shape> app/src/main/res/drawable/ic_choose_gray_edge.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ffffff" /> <corners android:radius="5dp" /> <stroke android:width="1dp" android:color="#ededed" /> </shape> app/src/main/res/drawable/ps_audio_placeholder.xml
New file @@ -0,0 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <size android:width="100dp" android:height="100dp" /> <solid android:color="@color/ps_color_light_grey" /> </shape> </item> <item> <bitmap android:gravity="center" android:src="@drawable/ps_ic_audio_placeholder" /> </item> </layer-list> app/src/main/res/drawable/ps_image_placeholder.xml
New file @@ -0,0 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <size android:width="100dp" android:height="100dp" /> <solid android:color="@color/ps_color_light_grey" /> </shape> </item> <item> <bitmap android:gravity="center" android:src="@drawable/ps_ic_placeholder" /> </item> </layer-list> app/src/main/res/drawable/top_state_bg.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/title_choose_bg" /> <corners android:radius="5dp" /> <stroke android:width="1dp" android:color="@color/title_choose_bg" /> </shape> app/src/main/res/layout/activity_login.xml
@@ -45,7 +45,7 @@ android:hint="请输入密码" android:inputType="textPassword" android:maxLines="1" android:text="admin" android:text="dyyjy" android:paddingLeft="10dp" android:singleLine="true" /> app/src/main/res/layout/activity_order_deal.xml
New file @@ -0,0 +1,80 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="itemclidk" type="com.dayu.pipirrapp.fragment.OrderFragment" /> <variable name="data" type="com.dayu.pipirrapp.bean.net.OrderListResult.Data" /> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include android:id="@+id/title" layout="@layout/top_title" /> <LinearLayout android:id="@+id/center" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/deal_button" android:layout_below="@+id/title" android:orientation="vertical" android:padding="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="反馈内容:" android:textColor="@color/black" android:textSize="@dimen/order_detail_button_size" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="@drawable/edittext_backgroud" android:minHeight="100dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="提交图片:" android:layout_marginTop="10dp" android:textColor="@color/black" android:textSize="@dimen/order_detail_button_size" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:overScrollMode="never" /> </LinearLayout> <TextView android:id="@+id/deal_button" android:layout_width="match_parent" android:layout_height="@dimen/order_detail_button_height" android:layout_alignParentBottom="true" android:background="@color/title_color" android:gravity="center" android:text="提 交" android:textColor="@color/white" android:textSize="@dimen/order_detail_button_size" /> </RelativeLayout> </layout> app/src/main/res/layout/activity_order_detail.xml
New file @@ -0,0 +1,363 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="itemclidk" type="com.dayu.pipirrapp.activity.OrderDetailActivity" /> <variable name="data" type="com.dayu.pipirrapp.bean.net.OrderDetailResult" /> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include android:id="@+id/title" layout="@layout/top_title" /> <ScrollView android:id="@+id/ScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/title"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="20dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="30dp" android:orientation="horizontal"> <ImageView android:id="@+id/ic_project" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginRight="15dp" android:layout_centerVertical="true" android:src="@mipmap/icon_project" /> <TextView android:id="@+id/projectName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginEnd="15dp" android:layout_toStartOf="@+id/stateText" android:layout_toEndOf="@+id/ic_project" android:ellipsize="end" android:maxLines="1" android:text="@{data.taskType}" android:textColor="@color/title_color" android:textSize="@dimen/order_detail_text_size" /> <TextView android:id="@+id/stateText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/ic_edt_gray_bg" android:gravity="center" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingRight="10dp" android:paddingBottom="5dp" android:text="@{data.state}" android:textSize="@dimen/manage_item_text_state_size" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <TextView android:id="@+id/jinduTag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="工单ID:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:id="@+id/jindu" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.workOrderId}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="派单人姓名:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{data.dispatcher}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="派单时间:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.dispatchTime}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:text="任务类型:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:id="@+id/startTime" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.taskType}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <TextView android:id="@+id/daiShenPiTag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="要求完成时间:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:id="@+id/daiShenPi" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.deadLine}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="完成标准:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:id="@+id/xiangMuJianCheng" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.completeCriteria}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="任务内容:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:id="@+id/xiangMuType" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.taskContent}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:id="@+id/orderDealLL" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="gone"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:gravity="center" android:text="处理结果" android:textColor="@color/base_blue" android:textSize="@dimen/order_detail_text_size" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="反馈:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.completeCriteria}" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="反馈图片:" android:textColor="@color/manage_item_text" android:textSize="@dimen/order_detail_text_size" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginTop="10dp" /> </LinearLayout> </LinearLayout> </LinearLayout> </ScrollView> <TextView android:id="@+id/deal_button" android:layout_width="match_parent" android:layout_height="@dimen/order_detail_button_height" android:layout_alignParentBottom="true" android:background="@color/title_color" android:gravity="center" android:text="处理工单" android:onClick="@{()->itemclidk.startDealActivity()}" android:textColor="@color/white" android:textSize="@dimen/order_detail_button_size" /> </RelativeLayout> </layout> app/src/main/res/layout/fragment_main.xml
File was deleted app/src/main/res/layout/fragment_map.xml
@@ -12,13 +12,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/flyBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="跳转到指定位置" /> <TextView android:id="@+id/stateText" app/src/main/res/layout/fragment_my.xml
@@ -7,9 +7,16 @@ android:background="@color/bg_color"> <include <TextView android:id="@+id/title" layout="@layout/top_title" /> android:layout_width="match_parent" android:background="@color/title_color" android:textSize="@dimen/title_center_text_size" android:gravity="center" android:text="我的" android:textColor="@color/white" android:layout_height="@dimen/title_height"/> <View app/src/main/res/layout/fragment_order.xml
New file @@ -0,0 +1,232 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="activity" type="com.dayu.pipirrapp.fragment.OrderFragment" /> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="@dimen/title_height" android:background="@color/title_color" android:gravity="center" android:text="工单" android:textColor="@color/white" android:textSize="@dimen/title_center_text_size" /> <LinearLayout android:id="@+id/manage_choose_ll" android:layout_width="match_parent" android:layout_height="@dimen/title_choose_height" android:layout_below="@+id/title" android:background="@color/title_choose_bg" android:orientation="horizontal" android:paddingTop="10dp" android:paddingBottom="10dp" android:visibility="gone"> <RelativeLayout android:id="@+id/choose_manage_rl" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight="1" android:background="@drawable/ic_choose_bg_whit" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/choose_manage_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toStartOf="@+id/choose_xiangmu_right" android:gravity="center" android:text="全部项目" android:textColor="@color/choose_grey" android:textSize="@dimen/top_choose_text_size" /> <ImageView android:id="@+id/choose_xiangmu_right" android:layout_width="15dp" android:layout_height="15dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="8dp" android:src="@mipmap/icon_bottom" /> </RelativeLayout> <RelativeLayout android:id="@+id/choose_pianqu_rl" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight="1" android:background="@drawable/ic_choose_bg_whit" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/choose_pianqu_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toStartOf="@+id/choose_pianqu_right" android:gravity="center" android:text="全部片区" android:textColor="@color/choose_grey" android:textSize="@dimen/top_choose_text_size" /> <ImageView android:id="@+id/choose_pianqu_right" android:layout_width="15dp" android:layout_height="15dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="8dp" android:src="@mipmap/icon_bottom" /> </RelativeLayout> <RelativeLayout android:id="@+id/choose_project_rl" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight="1" android:background="@drawable/ic_choose_bg_whit" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/choose_project_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toStartOf="@+id/choose_project_right" android:gravity="center" android:text="全部工程" android:textColor="@color/choose_grey" android:textSize="@dimen/top_choose_text_size" /> <ImageView android:id="@+id/choose_project_right" android:layout_width="15dp" android:layout_height="15dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="8dp" android:src="@mipmap/icon_bottom" /> </RelativeLayout> </LinearLayout> <LinearLayout android:id="@+id/manage_state_ll" android:layout_width="match_parent" android:layout_height="@dimen/top_state_height" android:layout_below="@+id/manage_choose_ll" android:layout_margin="10dp" android:background="@drawable/top_state_bg" android:orientation="horizontal"> <TextView android:id="@+id/manage_state_progress" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="5dp" android:layout_weight="1" android:background="@drawable/ic_choose_bg_whit" android:gravity="center" android:text="未解决" android:textColor="@color/title_color" android:textSize="@dimen/top_state_text_size" android:textStyle="bold" /> <TextView android:id="@+id/manage_state_finish" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="5dp" android:layout_weight="1" android:gravity="center" android:text="已解决" android:textColor="@color/black" android:textSize="@dimen/top_state_text_size" /> </LinearLayout> <ImageView android:id="@+id/line" android:layout_width="match_parent" android:layout_height="2px" android:layout_below="@+id/manage_state_ll" android:src="@color/line_bg" /> <com.scwang.smart.refresh.layout.SmartRefreshLayout android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/line"> <com.scwang.smart.refresh.header.ClassicsHeader android:layout_width="match_parent" android:layout_height="wrap_content" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:overScrollMode="never" android:padding="10dp" /> <com.scwang.smart.refresh.footer.ClassicsFooter android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.scwang.smart.refresh.layout.SmartRefreshLayout> <com.scwang.smart.refresh.layout.SmartRefreshLayout android:id="@+id/refreshLayoutDone" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/line" android:visibility="gone"> <com.scwang.smart.refresh.header.ClassicsHeader android:layout_width="match_parent" android:layout_height="wrap_content" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerViewDone" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:overScrollMode="never" android:padding="10dp" /> <com.scwang.smart.refresh.footer.ClassicsFooter android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.scwang.smart.refresh.layout.SmartRefreshLayout> </RelativeLayout> </layout> app/src/main/res/layout/item_add_filter_image.xml
New file @@ -0,0 +1,44 @@ <?xml version="1.0" encoding="utf-8"?> <com.luck.picture.lib.widget.SquareRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/fiv" android:layout_width="match_parent" android:layout_height="match_parent" tools:src="@color/app_color_f6" /> <ImageView android:id="@+id/iv_del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/fiv" android:layout_alignRight="@id/fiv" android:paddingLeft="10dp" android:paddingBottom="10dp" android:scaleType="centerInside" android:src="@mipmap/ic_item_delete" android:visibility="gone" tools:visibility="visible" /> <TextView android:id="@+id/tv_duration" android:layout_width="match_parent" android:layout_height="30dp" android:layout_alignLeft="@id/fiv" android:layout_alignRight="@id/fiv" android:layout_alignBottom="@id/fiv" android:background="@drawable/ps_ic_shadow_bg" android:drawableLeft="@drawable/ps_ic_video" android:drawablePadding="5dp" android:gravity="center_vertical" android:paddingLeft="5dp" android:paddingTop="8dp" android:text="00:00" android:textColor="@color/app_color_white" android:textSize="11sp" android:visibility="gone" tools:visibility="visible" /> </com.luck.picture.lib.widget.SquareRelativeLayout> app/src/main/res/layout/item_image.xml
New file @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" android:elevation="4dp"> <ImageView android:id="@+id/thumbnailImageView" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop"/> </androidx.cardview.widget.CardView> app/src/main/res/layout/item_no_more.xml
New file @@ -0,0 +1,29 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="50dp" android:layout_marginRight="50dp" android:src="@mipmap/ic_no_more" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="没有数据" android:textColor="@color/choose_grey" /> </LinearLayout> </layout> app/src/main/res/layout/item_order.xml
New file @@ -0,0 +1,282 @@ <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="itemclidk" type="com.dayu.pipirrapp.fragment.OrderFragment" /> <variable name="data" type="com.dayu.pipirrapp.bean.net.OrderListResult.Data" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:background="@drawable/ic_choose_gray_edge" android:onClick="@{()->itemclidk.startDetail(data.workOrderId)}" android:orientation="vertical" android:padding="10dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="30dp" android:orientation="horizontal"> <ImageView android:id="@+id/ic_project" android:layout_width="20dp" android:layout_height="20dp" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:src="@mipmap/icon_project" /> <TextView android:id="@+id/projectName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginEnd="15dp" android:layout_toStartOf="@+id/stateText" android:layout_toEndOf="@+id/ic_project" android:ellipsize="end" android:maxLines="1" android:text="@{data.taskType}" android:textColor="@color/title_color" android:textSize="@dimen/manage_item_text_size" /> <TextView android:id="@+id/stateText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/ic_edt_gray_bg" android:gravity="center" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingRight="10dp" android:paddingBottom="5dp" android:text="@{data.state}" android:textSize="@dimen/manage_item_text_state_size" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:id="@+id/jinduTag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="工单ID:" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> <TextView android:id="@+id/jindu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{data.workOrderId}" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:id="@+id/daiShenPiTag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="要求完成时间:" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> <TextView android:id="@+id/daiShenPi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{data.deadLine}" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical" android:orientation="horizontal" android:paddingRight="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="完成标准:" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> <TextView android:id="@+id/xiangMuJianCheng" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:text="@{data.completeCriteria}" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical" android:orientation="horizontal" android:paddingRight="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="任务内容:" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> <TextView android:id="@+id/xiangMuType" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:text="@{data.taskContent}" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_weight="2" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:text="派单时间:" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> <TextView android:id="@+id/startTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{data.dispatchTime}" android:textColor="@color/manage_item_text" android:textSize="@dimen/manage_item_text_size" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:layout_marginRight="10dp" android:layout_weight="1" android:orientation="horizontal" android:visibility="gone"> <TextView android:id="@+id/lookDetail" android:layout_width="0dp" android:layout_height="@dimen/manage_item_btn_height" android:layout_weight="1" android:background="@drawable/ic_blue_background" android:gravity="center" android:text="查看" android:textColor="@color/white" android:textSize="@dimen/manage_item_btn_text_size" /> <TextView android:id="@+id/examineBtn" android:layout_width="0dp" android:layout_height="@dimen/manage_item_btn_height" android:layout_marginLeft="15dp" android:layout_weight="1" android:background="@drawable/ic_blue_background" android:gravity="center" android:text="审批" android:textColor="@color/white" android:textSize="@dimen/manage_item_btn_text_size" /> </LinearLayout> </LinearLayout> </LinearLayout> </layout> app/src/main/res/mipmap-xhdpi/ic_add_image.png
app/src/main/res/mipmap-xhdpi/ic_item_delete.png
app/src/main/res/mipmap-xhdpi/ic_no_more.png
app/src/main/res/mipmap-xhdpi/icon_bottom.png
app/src/main/res/mipmap-xhdpi/icon_project.png
app/src/main/res/mipmap-xhdpi/ps_ic_audio.png
app/src/main/res/mipmap-xhdpi/ps_ic_video.png
app/src/main/res/values/colors.xml
@@ -15,4 +15,10 @@ <color name="line_bg">#DADADA</color> <color name="text_on">#BEBEBE</color> <color name="text_color">#696969</color> <color name="title_choose_bg">#D9D9D9</color> <color name="choose_grey">#cdcdcd</color> <color name="manage_item_text">#000000</color> <color name="manage_item_time">#AAAAAA</color> <color name="app_color_f6">#f6f6f6</color> <color name="app_color_white">#FFFFFF</color> </resources> app/src/main/res/values/dimens.xml
@@ -10,4 +10,19 @@ <dimen name="dialog_btn_height">45dp</dimen> <dimen name="dialog_bg_margin">30dp</dimen> <dimen name="title_choose_height">50dp</dimen> <dimen name="top_choose_text_size">11sp</dimen> <dimen name="top_state_height">40dp</dimen> <dimen name="top_state_text_size">14sp</dimen> <dimen name="manage_item_text_size">13sp</dimen> <dimen name="manage_item_text_state_size">10sp</dimen> <dimen name="manage_item_text_time_size">10sp</dimen> <dimen name="manage_item_btn_height">30dp</dimen> <dimen name="manage_item_btn_text_size">14sp</dimen> <dimen name="order_detail_text_size">17sp</dimen> <dimen name="order_detail_button_size">17sp</dimen> <dimen name="order_detail_button_height">50dp</dimen> </resources>