diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + - - - - + - - - - + - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - + android:text="燃气智能监测管盯" /> + android:src="@mipmap/well_location" /> @@ -177,6 +172,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:nestedScrollingEnabled="false" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" @@ -204,6 +200,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:background="@drawable/bg_stroke_layout_radius_3" android:gravity="top" android:inputType="textMultiLine" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - + android:text="燃气智能监测管盯" /> + android:src="@mipmap/well_location" /> @@ -177,6 +172,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:nestedScrollingEnabled="false" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" @@ -204,6 +200,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:background="@drawable/bg_stroke_layout_radius_3" android:gravity="top" android:inputType="textMultiLine" diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8a87ae6 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - + android:text="燃气智能监测管盯" /> + android:src="@mipmap/well_location" /> @@ -177,6 +172,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:nestedScrollingEnabled="false" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" @@ -204,6 +200,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:background="@drawable/bg_stroke_layout_radius_3" android:gravity="top" android:inputType="textMultiLine" diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8a87ae6 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8157f41..a2a0bcd 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -91,7 +91,6 @@ android:textColor="@color/white" android:textSize="@dimen/sp_12" android:theme="@style/Theme.MaterialComponents" - android:visibility="gone" app:backgroundTint="@color/mainThemeColor" app:icon="@drawable/ic_add" app:iconPadding="0dp" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - + android:text="燃气智能监测管盯" /> + android:src="@mipmap/well_location" /> @@ -177,6 +172,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:nestedScrollingEnabled="false" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" @@ -204,6 +200,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:background="@drawable/bg_stroke_layout_radius_3" android:gravity="top" android:inputType="textMultiLine" diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8a87ae6 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8157f41..a2a0bcd 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -91,7 +91,6 @@ android:textColor="@color/white" android:textSize="@dimen/sp_12" android:theme="@style/Theme.MaterialComponents" - android:visibility="gone" app:backgroundTint="@color/mainThemeColor" app:icon="@drawable/ic_add" app:iconPadding="0dp" diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - + android:text="燃气智能监测管盯" /> + android:src="@mipmap/well_location" /> @@ -177,6 +172,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:nestedScrollingEnabled="false" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" @@ -204,6 +200,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:background="@drawable/bg_stroke_layout_radius_3" android:gravity="top" android:inputType="textMultiLine" diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8a87ae6 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8157f41..a2a0bcd 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -91,7 +91,6 @@ android:textColor="@color/white" android:textSize="@dimen/sp_12" android:theme="@style/Theme.MaterialComponents" - android:visibility="gone" app:backgroundTint="@color/mainThemeColor" app:icon="@drawable/ic_add" app:iconPadding="0dp" diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f37c9bb..085f3af 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -114,4 +114,14 @@ @color/white @dimen/sp_16 + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d8ef3b..26d9a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,9 @@ - - - - + = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") + private var selectedImages = ArrayList() override fun initLayoutView(): Int = R.layout.activity_add_device @@ -57,16 +63,15 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + } + override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { - //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) - deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } @@ -74,49 +79,35 @@ } ownerShipView.setOnClickListener { - "尽情期待~".show(this) + AlertInputDialog.Builder() + .setContext(context) + .setTitle("提示") + .setHintMessage("请输入该设备所属项目名,如:项目203") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + ownerShipView.text = value + } + }) + .build().show() } + //默认频率1min + collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) - .setActionItemTitle( - listOf( - "1min", - "2min", - "5min", - "10min", - "15min", - "30min", - "60min" - ) - ) + .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - - } - 1 -> { - - } - 2 -> { - - } - 3 -> { - - } - 4 -> { - - } - 5 -> { - - } - 6 -> { - - } - } + collectIntervalView.text = frequency[position] } }).build().show() } @@ -146,11 +137,6 @@ imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter - - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - } - - override fun initEvent() { imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -160,7 +146,7 @@ if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { -// navigatePageTo(position, realPaths) + navigatePageTo(position, realPaths) } } @@ -172,8 +158,10 @@ uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { - val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 4) { + if (imageAdapter.itemCount == selectedImages.size) { + DialogHelper.dismissLoadingDialog() + } + if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) @@ -185,16 +173,6 @@ } } }) - uploadImageViewModel.loadState.observe(this, { - when (it) { - LoadState.Loading -> { - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - } - else -> { - DialogHelper.dismissLoadingDialog() - } - } - }) sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -216,6 +194,13 @@ } } }) + + addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + //TODO 添加设备 + submitButton.setOnClickListener { + + } } private fun selectPicture() { @@ -235,6 +220,10 @@ "拍照保存失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result analyticalSelectResults(result[0]) } @@ -258,6 +247,10 @@ "选择照片失败,请重试".show(context) return } + DialogHelper.showLoadingDialog( + this@AddDeviceActivity, "图片上传中,请稍后..." + ) + selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { @@ -293,16 +286,6 @@ } private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 -// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { -// result.realPath -// } else { -// result.sandboxPath -// } -// Log.d(kTag, "初始路径:" + result.path) -// Log.d(kTag, "绝对路径:" + result.realPath) -// Log.d(kTag, "原图路径:" + result.originalPath) -// Log.d(kTag, "沙盒路径:" + result.sandboxPath) result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt new file mode 100644 index 0000000..2b9c7b2 --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -0,0 +1,95 @@ +package com.casic.smarttube.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) + val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity().finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt index badeda3..b3e7390 100644 --- a/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/UploadImageViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState import java.io.File class UploadImageViewModel : BaseViewModel() { @@ -20,20 +19,16 @@ val resultModel = MutableLiveData() fun uploadImage(image: File) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) val responseCode = response.separateResponseCode() if (responseCode == 200) { - loadState.value = LoadState.Success resultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { - loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml index bca9c08..e8c1e45 100644 --- a/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml +++ b/app/src/main/res/drawable/bg_stroke_layout_radius_3.xml @@ -2,7 +2,7 @@ - + - + android:text="燃气智能监测管盯" /> + android:src="@mipmap/well_location" /> @@ -177,6 +172,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:nestedScrollingEnabled="false" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" @@ -204,6 +200,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:background="@drawable/bg_stroke_layout_radius_3" android:gravity="top" android:inputType="textMultiLine" diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8a87ae6 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8157f41..a2a0bcd 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -91,7 +91,6 @@ android:textColor="@color/white" android:textSize="@dimen/sp_12" android:theme="@style/Theme.MaterialComponents" - android:visibility="gone" app:backgroundTint="@color/mainThemeColor" app:icon="@drawable/ic_add" app:iconPadding="0dp" diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f37c9bb..085f3af 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -114,4 +114,14 @@ @color/white @dimen/sp_16 + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 08b5d46..fd0a39a 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,6 @@ - + \ No newline at end of file