diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+ android:layout_height="wrap_content"
+ android:background="@color/white"
+ android:orientation="vertical">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+ android:layout_height="wrap_content"
+ android:background="@color/white"
+ android:orientation="vertical">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_horizontal_no_margin_line.xml b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
new file mode 100644
index 0000000..d530656
--- /dev/null
+++ b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+ android:layout_height="wrap_content"
+ android:background="@color/white"
+ android:orientation="vertical">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_horizontal_no_margin_line.xml b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
new file mode 100644
index 0000000..d530656
--- /dev/null
+++ b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_main_title.xml b/app/src/main/res/layout/include_main_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_main_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+ android:layout_height="wrap_content"
+ android:background="@color/white"
+ android:orientation="vertical">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_horizontal_no_margin_line.xml b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
new file mode 100644
index 0000000..d530656
--- /dev/null
+++ b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_main_title.xml b/app/src/main/res/layout/include_main_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_main_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 819a003..8295970 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -13,6 +13,7 @@
5dp
7dp
10dp
+ 15dp
20dp
25dp
30dp
@@ -25,7 +26,7 @@
300dp
- 1px
+ 1dp
56dp
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0e77665..611e149 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,7 +36,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..c374978
--- /dev/null
+++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.smarttube.callback
+
+import java.io.File
+
+interface OnImageCompressListener {
+ /**
+ * Fired when a compression returns successfully, override to handle in your own code
+ */
+ fun onSuccess(file: File)
+
+ /**
+ * Fired when a compression fails to complete, override to handle in your own code
+ */
+ fun onError(e: Throwable)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt
new file mode 100644
index 0000000..50479c7
--- /dev/null
+++ b/app/src/main/java/com/casic/br/extensions/String.kt
@@ -0,0 +1,36 @@
+package com.casic.br.extensions
+
+import android.content.Context
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.pengxh.kt.lite.extensions.createCompressImageDir
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * String扩展方法
+ */
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .filter {
+ !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif"))
+ }
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
index 4cfae63..b3f222a 100644
--- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -7,9 +7,13 @@
import com.casic.br.adapter.IconTextGridAdapter
import com.casic.br.adapter.IconTextListAdapter
import com.casic.br.utils.LocaleConstant
+import com.casic.br.view.AddressManagerActivity
+import com.casic.br.view.EditUserActivity
+import com.casic.br.view.SettingsActivity
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
import kotlinx.android.synthetic.main.fragment_mine.*
-import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_main_title.*
class MinePageFragment : KotlinBaseFragment() {
@@ -56,7 +60,7 @@
})
val settingsListAdapter = IconTextListAdapter(
- requireContext(), LocaleConstant.SETTINGS_OPERATE
+ requireContext(), LocaleConstant.USER_OPERATE
)
settingsRecyclerView.addItemDecoration(
DividerItemDecoration(
@@ -72,14 +76,19 @@
0 -> {}
1 -> {}
2 -> {}
- 3 -> {}
+ //地址管理
+ 3 -> requireContext().navigatePageTo()
+ //系统设置
+ 4 -> requireContext().navigatePageTo()
}
}
})
}
override fun initEvent() {
-
+ editUserView.setOnClickListener {
+ requireContext().navigatePageTo()
+ }
}
override fun onResume() {
diff --git a/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
new file mode 100644
index 0000000..33bb2b6
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/GlideLoadEngine.kt
@@ -0,0 +1,92 @@
+package com.casic.br.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import androidx.annotation.Nullable
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.casic.br.R
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.interfaces.OnCallbackListener
+import com.luck.picture.lib.utils.ActivityCompatHelper
+
+
+class GlideLoadEngine private constructor() : ImageEngine {
+
+ companion object {
+ val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
+ GlideLoadEngine()
+ }
+ }
+
+ override fun loadImage(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context).load(url).into(imageView);
+ }
+
+ override fun loadImageBitmap(
+ context: Context,
+ url: String,
+ maxWidth: Int,
+ maxHeight: Int,
+ call: OnCallbackListener?
+ ) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(object : CustomTarget() {
+ override fun onResourceReady(
+ resource: Bitmap, @Nullable transition: Transition?
+ ) {
+ call?.onCall(resource)
+ }
+
+ override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
+ call?.onCall(null)
+ }
+
+ override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
+ })
+ }
+
+ override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(CenterCrop(), RoundedCorners(8))
+ .placeholder(R.mipmap.load_image_error)
+ .into(imageView)
+ }
+
+ override fun pauseRequests(context: Context?) {
+ context?.let { Glide.with(it).pauseRequests() }
+ }
+
+ override fun resumeRequests(context: Context?) {
+ context?.let { Glide.with(it).resumeRequests() }
+ }
+
+ override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+ Glide.with(context)
+ .load(url)
+ .apply(RequestOptions().placeholder(R.mipmap.load_image_error))
+ .into(imageView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
index b2b3295..737e859 100644
--- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -25,7 +25,9 @@
R.mipmap.ic_launcher
)
val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价")
- val SETTINGS_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置")
+ val GENDER_ARRAY = arrayListOf("男", "女")
+ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们")
/**
* =============================================================================================
diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
new file mode 100644
index 0000000..bdf257e
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt
@@ -0,0 +1,29 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class AddressManagerActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_address
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "我的地址"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
new file mode 100644
index 0000000..9b04044
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt
@@ -0,0 +1,137 @@
+package com.casic.br.view
+
+import android.graphics.Color
+import android.util.Log
+import com.casic.br.R
+import com.casic.br.extensions.compressImage
+import com.casic.br.utils.GlideLoadEngine
+import com.casic.br.utils.LocaleConstant
+import com.casic.smarttube.callback.OnImageCompressListener
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.*
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import com.pengxh.kt.lite.widget.dialog.BottomActionSheet
+import kotlinx.android.synthetic.main.activity_edit_user.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+import java.util.*
+
+
+class EditUserActivity : KotlinBaseActivity() {
+
+ private val kTag = "EditUserActivity"
+ private val context = this@EditUserActivity
+
+ override fun initLayoutView(): Int = R.layout.activity_edit_user
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "个人中心"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ avatarLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(listOf("拍照", "相册"))
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+ when (position) {
+ 0 -> {
+ PictureSelector.create(context)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(context)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(1)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "选择照片失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }
+ }).build().show()
+ }
+
+ userNameLayout.setOnClickListener {
+
+ }
+
+ userPhoneLayout.setOnClickListener {
+
+ }
+
+ genderLayout.setOnClickListener {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitle(LocaleConstant.GENDER_ARRAY)
+ .setItemTextColor(Color.BLUE)
+ .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener {
+ override fun onActionItemClick(position: Int) {
+
+ }
+ })
+ .build().show()
+ }
+
+ birthdayLayout.setOnClickListener {
+
+ }
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
new file mode 100644
index 0000000..b8dd006
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt
@@ -0,0 +1,49 @@
+package com.casic.br.view
+
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.casic.br.R
+import com.casic.br.adapter.IconTextListAdapter
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_settings.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SettingsActivity : KotlinBaseActivity() {
+
+ override fun initLayoutView(): Int = R.layout.activity_settings
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+
+ leftBackView.setOnClickListener { finish() }
+ titleView.text = "系统设置"
+ }
+
+ override fun initData() {
+ val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE)
+ settingsRecyclerView.addItemDecoration(
+ DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
+ )
+ settingsRecyclerView.adapter = settingsListAdapter
+ settingsListAdapter.setOnGridItemClickListener(object :
+ IconTextListAdapter.OnListItemClickListener {
+ override fun onItemClick(position: Int) {
+ when (position) {
+ 0 -> {}
+ 1 -> {}
+ 2 -> {}
+ 3 -> {}
+ 4 -> {}
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_left_black.xml b/app/src/main/res/drawable/ic_left_black.xml
new file mode 100644
index 0000000..e3af6b5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_left_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_address.xml b/app/src/main/res/layout/activity_edit_address.xml
new file mode 100644
index 0000000..39b2929
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_address.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml
new file mode 100644
index 0000000..0818a49
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_user.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4615ad2
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index b73f9d3..a97ec1b 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -5,7 +5,7 @@
android:background="@color/mainBackColor"
android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+ android:layout_height="wrap_content"
+ android:background="@color/white"
+ android:orientation="vertical">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_horizontal_no_margin_line.xml b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
new file mode 100644
index 0000000..d530656
--- /dev/null
+++ b/app/src/main/res/layout/include_horizontal_no_margin_line.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_main_title.xml b/app/src/main/res/layout/include_main_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_main_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 819a003..8295970 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -13,6 +13,7 @@
5dp
7dp
10dp
+ 15dp
20dp
25dp
30dp
@@ -25,7 +26,7 @@
300dp
- 1px
+ 1dp
56dp
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d60f5c6..b10cdde 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -26,10 +26,36 @@
+
+
+
+
+
+
+
+