app/build.gradle
@@ -90,11 +90,12 @@ dependencies { implementation project(':expand_button') implementation(project(':library')) implementation implementation(project(':bigimage_library',)) implementation project(':date_time_picker') implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.activity:activity-ktx:1.7.1" // testImplementation 'junit:junit:4.13.2' // androidTestImplementation 'androidx.test.ext:junit:1.1.5' // androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
@@ -45,7 +45,6 @@ import java.util.List; import java.util.Map; import cc.shinichi.library.ImagePreview; import cc.shinichi.library.bean.ImageInfo; import cc.shinichi.library.bean.Type; app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java
@@ -9,6 +9,7 @@ import com.dayu.pipirrapp.bean.db.InspectionLocationBean; import com.dayu.pipirrapp.bean.db.LoginBean; import com.dayu.pipirrapp.bean.db.MarkerBean; import com.dayu.pipirrapp.bean.db.PipeNetworkBean; import com.dayu.pipirrapp.bean.db.TagBean; @@ -18,7 +19,7 @@ * Date: 2023-11-05 16:23 * Description: */ @Database(entities = {DivideBean.class,InspectionBean.class,InspectionLocationBean.class, TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false) @Database(entities = {PipeNetworkBean.class,DivideBean.class,InspectionBean.class,InspectionLocationBean.class, TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { @@ -36,4 +37,6 @@ public abstract DivideDao divideDao(); public abstract PipeNetDao pipeNetDao(); } app/src/main/java/com/dayu/pipirrapp/dao/PipeNetDao.java
New file @@ -0,0 +1,50 @@ package com.dayu.pipirrapp.dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import com.dayu.pipirrapp.bean.db.PipeNetworkBean; import java.util.List; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.Single; /** * 管网相关dao */ public interface PipeNetDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(PipeNetworkBean pipeNetworkBean); @Insert(onConflict = OnConflictStrategy.REPLACE) Completable insertAll(List<PipeNetworkBean> pipeNetworkBeans); // 使用 Completable 进行异步插入 // @Insert(onConflict = OnConflictStrategy.REPLACE) // void insertAll(List<MarkerBean> markerBeans); // 使用 Completable 进行异步插入 @Update void update(PipeNetworkBean pipeNetworkBean); @Delete void delete(PipeNetworkBean pipeNetworkBean); @Query("DELETE FROM PipeNetworkBean") void deleteAll(); @Query("select * from PipeNetworkBean limit 1") PipeNetworkBean findFirst(); @Query("select * from PipeNetworkBean") List<PipeNetworkBean> findAll(); @Query("select * from PipeNetworkBean") Single<List<PipeNetworkBean>> findAllToSingle(); @Query("SELECT * FROM PipeNetworkBean") Maybe<List<PipeNetworkBean>> getAll(); } app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -5,11 +5,9 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -42,7 +40,6 @@ import com.dayu.pipirrapp.bean.net.InspectionRequest; import com.dayu.pipirrapp.bean.net.MarkerListResult; import com.dayu.pipirrapp.bean.net.MarkerResult; import com.dayu.pipirrapp.bean.net.PipeNetworkListResult; import com.dayu.pipirrapp.bean.net.PipeNetworkResult; import com.dayu.pipirrapp.dao.DaoSingleton; import com.dayu.pipirrapp.databinding.FragmentMapBinding; @@ -65,7 +62,6 @@ import com.dayu.pipirrapp.utils.WebViewUtils; import com.dayu.pipirrapp.view.ConfirmDialog; import com.dayu.pipirrapp.view.TipUtil; import com.example.expand_button.ExpandButton; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; @@ -145,6 +141,7 @@ getCenterPoint(); getMarkerData(); getDivideList(); getPipeNetworkList(); }); } @@ -237,6 +234,28 @@ for (DivideBean divide : divides) { divideBeanMap.put(divide.getId(), divide); setMapDivide(divide); } } }, throwable -> { Log.e(TAG, "Load divides error: " + throwable.getMessage()); getDivideList(); }, () -> { // 当Maybe为空时调用 getDivideList(); }) ); //异步加载管网数据 compositeDisposable.add( DaoSingleton.getAsynchInstance(this.getContext()).pipeNetDao().getAll() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pipeNetworkBeans -> { if (pipeNetworkBeans == null || pipeNetworkBeans.isEmpty()) { getPipeNetworkList(); } else { for (PipeNetworkBean pipeNetworkBean : pipeNetworkBeans) { } } }, throwable -> { @@ -1067,21 +1086,22 @@ * 获取管网 */ private void getPipeNetworkList() { ApiManager.getInstance().requestGetHideLoading(MapFragment.this.getContext(), BASE_URL + "/project/network/all", PipeNetworkListResult.class, null, new SubscriberListener<BaseResponse<PipeNetworkListResult>>() { ApiManager.getInstance().requestGetHideLoading(MapFragment.this.getContext(), BASE_URL + "/project/network/all", PipeNetworkResult.class, null, new SubscriberListener<BaseResponse<List<PipeNetworkResult>>>() { @Override public void onNext(BaseResponse<PipeNetworkListResult> t) { public void onNext(BaseResponse<List<PipeNetworkResult>> t) { try { if (t.isSuccess()) { if (t.getContent().getObj() != null && !t.getContent().getObj().isEmpty()) { if (t.getContent() != null && t.getContent().size() > 0) { List<DivideBean> divideBeans = new ArrayList<>(); for (PipeNetworkResult divideResult : t.getContent().getObj()) { PipeNetworkBean divideBean = getPipeNetworkBean(divideResult); setMapDivide(divideBean); // divideBeans.add(divideBean); List<PipeNetworkBean> pipeNetBeans = new ArrayList<>(); PipeNetworkBean pipeNetBean = new PipeNetworkBean(); for (PipeNetworkResult pipeNetworkResult : t.getContent()) { pipeNetBean.setNetworkId(pipeNetworkResult.getNetworkId()); pipeNetBean.setType(pipeNetworkResult.getType()); pipeNetBean.setData(pipeNetworkResult.getData()); } // 使用 RxJava 异步插入数据 DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).divideDao().insertAll(divideBeans) DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).pipeNetDao().insertAll(pipeNetBeans) .subscribeOn(Schedulers.io()) // 在 IO 线程上执行 .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察 .subscribe(() -> { bigimage_library/.gitignore
bigimage_library/build.gradle
File was renamed from library/build.gradle @@ -23,6 +23,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') compileOnly "androidx.activity:activity-ktx:1.7.1" compileOnly 'androidx.appcompat:appcompat:1.4.1' compileOnly 'com.google.android.material:material:1.5.0' compileOnly 'androidx.exifinterface:exifinterface:1.3.5' bigimage_library/proguard-rules.pro
bigimage_library/src/main/AndroidManifest.xml
bigimage_library/src/main/java/cc/shinichi/library/GlobalContext.kt
bigimage_library/src/main/java/cc/shinichi/library/ImagePreview.kt
bigimage_library/src/main/java/cc/shinichi/library/InitProvider.kt
bigimage_library/src/main/java/cc/shinichi/library/bean/ImageInfo.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/FileTarget.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/ImageLoader.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/SSLSocketClient.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/cache/DataCacheKey.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/cache/SafeKeyGenerator.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/progress/OnProgressListener.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/progress/ProgressLibraryGlideModule.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/progress/ProgressManager.kt
bigimage_library/src/main/java/cc/shinichi/library/glide/progress/ProgressResponseBody.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/DeviceUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/HandlerHolder.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/HttpUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/NetworkUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/PhoneUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/SLog.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/ToastUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/common/UIUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/file/FileUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/file/SingleMediaScanner.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/image/DownloadUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/tool/image/ImageUtil.kt
bigimage_library/src/main/java/cc/shinichi/library/view/HackyViewPager.kt
bigimage_library/src/main/java/cc/shinichi/library/view/ImagePreviewActivity.kt
bigimage_library/src/main/java/cc/shinichi/library/view/ImagePreviewAdapter.kt
bigimage_library/src/main/java/cc/shinichi/library/view/ImagePreviewFragment.kt
bigimage_library/src/main/java/cc/shinichi/library/view/helper/DragCloseView.java
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnBigImageClickListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnBigImageLongClickListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnBigImagePageChangeListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnCustomLayoutCallback.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnDownloadClickListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnDownloadListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnFinishListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnOriginProgressListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnPageDragListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/OnPageFinishListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/listener/SimpleOnImageEventListener.kt
bigimage_library/src/main/java/cc/shinichi/library/view/nine/AnimatorProxy.java
bigimage_library/src/main/java/cc/shinichi/library/view/nine/ViewHelper.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/Compat.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/CustomGestureDetector.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnGestureListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnMatrixChangedListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnOutsidePhotoTapListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnPhotoTapListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnScaleChangedListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnSingleFlingListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnViewDragListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/OnViewTapListener.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/PhotoView.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/PhotoViewAttacher.java
bigimage_library/src/main/java/cc/shinichi/library/view/photoview/Util.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/ImageSource.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/ImageViewState.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/SubsamplingScaleImageView.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/CompatDecoderFactory.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/DecoderFactory.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/ImageDecoder.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/ImageRegionDecoder.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/SkiaImageDecoder.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/SkiaImageRegionDecoder.java
bigimage_library/src/main/java/cc/shinichi/library/view/subsampling/decoder/SkiaPooledImageRegionDecoder.java
bigimage_library/src/main/res/anim/fade_in.xml
bigimage_library/src/main/res/anim/fade_out.xml
bigimage_library/src/main/res/anim/scale_in.xml
bigimage_library/src/main/res/anim/scale_out.xml
bigimage_library/src/main/res/drawable-xhdpi/ic_action_close.pngbigimage_library/src/main/res/drawable-xhdpi/icon_change_orientation.pngbigimage_library/src/main/res/drawable-xhdpi/icon_download_new.pngbigimage_library/src/main/res/drawable-xhdpi/icon_video_play.pngbigimage_library/src/main/res/drawable-xhdpi/icon_video_stop.pngbigimage_library/src/main/res/drawable-xhdpi/load_failed.pngbigimage_library/src/main/res/drawable-xxhdpi/ic_action_close.pngbigimage_library/src/main/res/drawable-xxhdpi/icon_change_orientation.pngbigimage_library/src/main/res/drawable-xxhdpi/icon_download_new.pngbigimage_library/src/main/res/drawable-xxhdpi/icon_video_play.pngbigimage_library/src/main/res/drawable-xxhdpi/icon_video_stop.pngbigimage_library/src/main/res/drawable-xxhdpi/load_failed.pngbigimage_library/src/main/res/drawable/gray_circle_bg.xml
bigimage_library/src/main/res/drawable/gray_square_circle_bg_white_stroke.xml
bigimage_library/src/main/res/drawable/shape_indicator_bg.xml
bigimage_library/src/main/res/layout/sh_default_progress_layout.xml
bigimage_library/src/main/res/layout/sh_item_photoview.xml
bigimage_library/src/main/res/layout/sh_layout_preview.xml
bigimage_library/src/main/res/layout/sh_media_controller.xml
bigimage_library/src/main/res/values-en-rUS/strings.xml
bigimage_library/src/main/res/values/attrs.xml
bigimage_library/src/main/res/values/ids.xml
bigimage_library/src/main/res/values/strings.xml
bigimage_library/src/main/res/values/style.xml
expand_button/src/main/java/com/example/expand_button/ExpandButton.kt
@@ -86,6 +86,14 @@ // 添加一个属性定义三角形图标的点击区域扩展范围 private val triangleClickPadding: Float = 15f * context.resources.displayMetrics.density // 20dp // 添加一个标识符,用于区分不同的 ExpandButton 实例 private var buttonId: String = "default" companion object { private const val PREFS_NAME = "expand_button_prefs" private const val KEY_LEGEND_STATES = "legend_states" } init { // 保存 XML 中设置的默认字体大小 defaultTextSize = textSize @@ -485,6 +493,43 @@ } /** * 设置按钮的唯一标识符 * @param id 标识符 */ fun setButtonId(id: String) { this.buttonId = id // 加载保存的状态 loadStates() } /** * 保存所有图例项的状态 */ private fun saveStates() { val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) val states = legendItems.map { it.isSelected } prefs.edit().putString("${KEY_LEGEND_STATES}_$buttonId", states.joinToString(",")).apply() } /** * 加载保存的状态 */ private fun loadStates() { val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) val savedStates = prefs.getString("${KEY_LEGEND_STATES}_$buttonId", null) if (savedStates != null && legendItems.isNotEmpty()) { val states = savedStates.split(",").map { it.toBoolean() } states.forEachIndexed { index, state -> if (index < legendItems.size) { legendItems[index].isSelected = state } } invalidate() } } /** * 设置图例内容 */ @JvmName("setLegendsList") @@ -494,6 +539,9 @@ unselectedIcon.setBounds(0, 0, iconSize, iconSize) LegendItem(selectedIcon, unselectedIcon, description) } // 加载保存的状态 loadStates() if (!isExpanded) { text = collapsedText @@ -587,6 +635,10 @@ index, legendItems[index].isSelected ) // 保存状态 saveStates() invalidate() } settings.gradle
@@ -1,5 +1,5 @@ rootProject.name = "pipIrrApp" include ':app' include ':expand_button' include ':library' include ':bigimage_library' include ':date_time_picker'