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 @@ + + + + + + + + + +