diff --git a/app/src/main/java/top/limuyang2/pohotopicker/MainActivity.kt b/app/src/main/java/top/limuyang2/pohotopicker/MainActivity.kt index 3b57b98..62b198a 100755 --- a/app/src/main/java/top/limuyang2/pohotopicker/MainActivity.kt +++ b/app/src/main/java/top/limuyang2/pohotopicker/MainActivity.kt @@ -91,28 +91,13 @@ class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks { //验证权限 if (EasyPermissions.hasPermissions(this, WRITE_EXTERNAL_STORAGE)) { - val intent = LPhotoPickerActivity.IntentBuilder(this) - .maxChooseCount(multiMumTv.text.toString().toInt()) - .columnsNumber(columnsNumberMumTv.text.toString().toInt()) - .imageType(LPPImageType.ofAll()) - .pauseOnScroll(pauseOnScroll_cb.isChecked) - .isSingleChoose(singleChoose_cb.isChecked) - .imageEngine(LGlideEngine()) - .theme(theme) -// .selectedPhotos(ArrayList().apply { -// add("/storage/emulated/0/DCIM/Screenshots/Screenshot_2018-07-09-11-43-08-936_com.wxm.android.png") -// add("/storage/emulated/0/pictures/li_mumuの二维码.jpg") -// }) - .build() - -// startActivityForResult(intent, CHOOSE_PHOTO_REQUEST) - LPhotoHelper.Builder() .maxChooseCount(multiMumTv.text.toString().toInt()) .columnsNumber(columnsNumberMumTv.text.toString().toInt()) .imageType(LPPImageType.ofAll()) .pauseOnScroll(pauseOnScroll_cb.isChecked) .isSingleChoose(singleChoose_cb.isChecked) + .isOpenLastAlbum(true) .theme(theme) .build() .start(this, CHOOSE_PHOTO_REQUEST) @@ -127,7 +112,7 @@ class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks { if (resultCode == RESULT_OK) { when (requestCode) { CHOOSE_PHOTO_REQUEST -> { - val selectedPhotos = LPhotoPickerActivity.getSelectedPhotos(data) + val selectedPhotos = LPhotoHelper.getSelectedPhotos(data) if (singleChoose_cb.isChecked) { //单选模式 if (use_uCrop_cb.isChecked) { diff --git a/photolibrary/src/main/java/top/limuyang2/photolibrary/LPhotoHelper.kt b/photolibrary/src/main/java/top/limuyang2/photolibrary/LPhotoHelper.kt index 5ab1a49..181a4e7 100644 --- a/photolibrary/src/main/java/top/limuyang2/photolibrary/LPhotoHelper.kt +++ b/photolibrary/src/main/java/top/limuyang2/photolibrary/LPhotoHelper.kt @@ -16,6 +16,7 @@ import top.limuyang2.photolibrary.util.ImageEngineUtils */ class LPhotoHelper internal constructor(private val intent: Intent) { companion object { + const val EXTRA_LAST_OPENED_ALBUM = "EXTRA_LAST_OPENED_ALBUM" const val EXTRA_SELECTED_PHOTOS = "EXTRA_SELECTED_PHOTOS" const val EXTRA_MAX_CHOOSE_COUNT = "EXTRA_MAX_CHOOSE_COUNT" const val EXTRA_PAUSE_ON_SCROLL = "EXTRA_PAUSE_ON_SCROLL" @@ -23,6 +24,17 @@ class LPhotoHelper internal constructor(private val intent: Intent) { const val EXTRA_IS_SINGLE_CHOOSE = "EXTRA_IS_SINGLE_CHOOSE" const val EXTRA_TYPE = "EXTRA_TYPE" const val EXTRA_THEME = "EXTRA_THEME" + + /** + * 获取已选择的图片集合 + * + * @param intent + * @return + */ + @JvmStatic + fun getSelectedPhotos(intent: Intent?): ArrayList { + return intent?.getStringArrayListExtra(EXTRA_SELECTED_PHOTOS) ?: ArrayList() + } } @@ -39,13 +51,13 @@ class LPhotoHelper internal constructor(private val intent: Intent) { class Builder { private val mIntent: Intent = Intent() -// /** -// * 拍照后图片保存的目录。如果传 null 表示没有拍照功能,如果不为 null 则具有拍照功能, -// */ -// fun cameraFileDir(cameraFileDir: File?): IntentBuilder { -// mIntent.putExtra(EXTRA_CAMERA_FILE_DIR, cameraFileDir) -// return this -// } + + fun isOpenLastAlbum(isOpen: Boolean): Builder { + mIntent.putExtra(EXTRA_LAST_OPENED_ALBUM, isOpen) + return this + } + + /** * 需要显示哪种类型的图片(JPG\PNG\GIF\WEBP),默认全部加载 diff --git a/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoFolderActivity.kt b/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoFolderActivity.kt index e7063aa..3cd88bb 100644 --- a/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoFolderActivity.kt +++ b/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoFolderActivity.kt @@ -1,17 +1,23 @@ package top.limuyang2.photolibrary.activity +import android.app.Activity import android.content.ComponentName +import android.content.Context +import android.content.Intent import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util.TypedValue import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_LAST_OPENED_ALBUM import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_TYPE import top.limuyang2.photolibrary.R import top.limuyang2.photolibrary.adapter.LFolderAdapter import top.limuyang2.photolibrary.databinding.LPpActivityFolderBinding +import top.limuyang2.photolibrary.model.LFolderModel import top.limuyang2.photolibrary.util.dip import top.limuyang2.photolibrary.util.findFolder import top.limuyang2.photolibrary.util.setStatusBarColor @@ -25,24 +31,30 @@ class LPhotoFolderActivity : LBaseActivity() { private val mFolderAdapter: LFolderAdapter by lazy(LazyThreadSafetyMode.NONE) { LFolderAdapter() } - private val showTypeArray by lazy { intent.getStringArrayExtra(EXTRA_TYPE) } + private val showTypeArray by lazy(LazyThreadSafetyMode.NONE) { intent.getStringArrayExtra(EXTRA_TYPE) } + + private val isOpenLastAlbum by lazy(LazyThreadSafetyMode.NONE) { intent.getBooleanExtra(EXTRA_LAST_OPENED_ALBUM, false) } override fun initBinding(): LPpActivityFolderBinding { return LPpActivityFolderBinding.inflate(layoutInflater) } override fun initView(savedInstanceState: Bundle?) { + // 判断是否需要打开最后记录的相册 + if (isOpenLastAlbum) { + val lastModel = lastOpenAlbum + if (lastModel.bucketId != 0L) { + openAlbum(lastModel) + } + } initAttr() viewBinding.apply { recyclerView.adapter = mFolderAdapter mFolderAdapter.setOnItemClick { _, _, model -> - println(model) - intent.component = ComponentName(this@LPhotoFolderActivity, LPhotoPickerActivity::class.java) - intent.putExtra("bucketId", model.bucketId) - intent.putExtra("bucketName", model.bucketName) - startActivity(intent) + openAlbum(model) + lastOpenAlbum = model } } } @@ -58,6 +70,10 @@ class LPhotoFolderActivity : LBaseActivity() { viewBinding.apply { + // 背景色 + val activityBg = typedArray.getColor(R.styleable.LPPAttr_l_pp_picker_activity_bg, Color.parseColor("#F9F9F9")) + window.setBackgroundDrawable(ColorDrawable(activityBg)) + val toolBarHeight = typedArray.getDimensionPixelSize(R.styleable.LPPAttr_l_pp_toolBar_height, dip(56).toInt()) val l = toolBar.layoutParams l.height = toolBarHeight @@ -97,5 +113,47 @@ class LPhotoFolderActivity : LBaseActivity() { } } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + PICK_CODE -> { + if (resultCode == Activity.RESULT_OK) { + // 透传数据 + setResult(Activity.RESULT_OK, data) + finish() + } else { + // 如果取消了选择,则清除最后打开的记录 + lastOpenAlbum = LFolderModel() + } + } + } + } + + private fun openAlbum(model: LFolderModel) { + intent.component = ComponentName(this@LPhotoFolderActivity, LPhotoPickerActivity::class.java) + intent.putExtra("bucketId", model.bucketId) + intent.putExtra("bucketName", model.bucketName) + startActivityForResult(intent, PICK_CODE) + } + + private var lastOpenAlbum: LFolderModel + set(value) { + val sp = getSharedPreferences("l_pp_sp", Context.MODE_PRIVATE) + sp.edit().putLong(SP_LAST_BUCKET_ID, value.bucketId) + .putString(SP_LAST_BUCKET_NAME, value.bucketName) + .apply() + } + get() { + val sp = getSharedPreferences("l_pp_sp", Context.MODE_PRIVATE) + val id = sp.getLong(SP_LAST_BUCKET_ID, 0) + val name = sp.getString(SP_LAST_BUCKET_NAME, "") ?: "" + return LFolderModel(name, id, "", -1) + } + + companion object { + private const val PICK_CODE = 8 + private const val SP_LAST_BUCKET_ID = "bucketId" + private const val SP_LAST_BUCKET_NAME = "bucketName" + } } \ No newline at end of file diff --git a/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoPickerActivity.kt b/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoPickerActivity.kt index 4620aee..d4a0ff1 100755 --- a/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoPickerActivity.kt +++ b/photolibrary/src/main/java/top/limuyang2/photolibrary/activity/LPhotoPickerActivity.kt @@ -17,13 +17,18 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_COLUMNS_NUMBER +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_IS_SINGLE_CHOOSE +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_MAX_CHOOSE_COUNT +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_PAUSE_ON_SCROLL +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_SELECTED_PHOTOS +import top.limuyang2.photolibrary.LPhotoHelper.Companion.EXTRA_TYPE import top.limuyang2.photolibrary.R import top.limuyang2.photolibrary.adapter.LPPGridDivider import top.limuyang2.photolibrary.adapter.PhotoPickerRecyclerAdapter import top.limuyang2.photolibrary.databinding.LPpActivityPhotoPickerBinding import top.limuyang2.photolibrary.engine.LImageEngine import top.limuyang2.photolibrary.util.* -import kotlin.math.ceil /** @@ -36,119 +41,12 @@ import kotlin.math.ceil class LPhotoPickerActivity : LBaseActivity() { companion object { - // private const val EXTRA_CAMERA_FILE_DIR = "EXTRA_CAMERA_FILE_DIR" - private const val EXTRA_SELECTED_PHOTOS = "EXTRA_SELECTED_PHOTOS" - private const val EXTRA_MAX_CHOOSE_COUNT = "EXTRA_MAX_CHOOSE_COUNT" - private const val EXTRA_PAUSE_ON_SCROLL = "EXTRA_PAUSE_ON_SCROLL" - private const val EXTRA_COLUMNS_NUMBER = "EXTRA_COLUMNS_NUMBER" - private const val EXTRA_IS_SINGLE_CHOOSE = "EXTRA_IS_SINGLE_CHOOSE" - private const val EXTRA_TYPE = "EXTRA_TYPE" - private const val EXTRA_THEME = "EXTRA_THEME" - -// private val STATE_SELECTED_PHOTOS = "STATE_SELECTED_PHOTOS" - /** * 预览照片的请求码 */ private const val RC_PREVIEW_CODE = 2 - - /** - * 获取已选择的图片集合 - * - * @param intent - * @return - */ - @JvmStatic - fun getSelectedPhotos(intent: Intent?): ArrayList { - return intent?.getStringArrayListExtra(EXTRA_SELECTED_PHOTOS) ?: ArrayList() - } } - class IntentBuilder(context: Context) { - private val mIntent: Intent = Intent(context, LPhotoPickerActivity::class.java) - -// /** -// * 拍照后图片保存的目录。如果传 null 表示没有拍照功能,如果不为 null 则具有拍照功能, -// */ -// fun cameraFileDir(cameraFileDir: File?): IntentBuilder { -// mIntent.putExtra(EXTRA_CAMERA_FILE_DIR, cameraFileDir) -// return this -// } - - /** - * 需要显示哪种类型的图片(JPG\PNG\GIF\WEBP),默认全部加载 - * @return IntentBuilder - */ - fun imageType(typeArray: Array): IntentBuilder { - mIntent.putExtra(EXTRA_TYPE, typeArray) - return this - } - - /** - * 图片选择张数的最大值 - * - * @param maxChooseCount - * @return - */ - fun maxChooseCount(maxChooseCount: Int): IntentBuilder { - mIntent.putExtra(EXTRA_MAX_CHOOSE_COUNT, maxChooseCount) - return this - } - - /** - * 是否是单选模式,默认false - * @param isSingle Boolean - * @return IntentBuilder - */ - fun isSingleChoose(isSingle: Boolean): IntentBuilder { - mIntent.putExtra(EXTRA_IS_SINGLE_CHOOSE, isSingle) - return this - } - - /** - * 当前已选中的图片路径集合,可以传 null - */ - fun selectedPhotos(selectedPhotos: java.util.ArrayList?): IntentBuilder { - mIntent.putStringArrayListExtra(EXTRA_SELECTED_PHOTOS, selectedPhotos) - return this - } - - /** - * 滚动列表时是否暂停加载图片,默认为 false - */ - fun pauseOnScroll(pauseOnScroll: Boolean): IntentBuilder { - mIntent.putExtra(EXTRA_PAUSE_ON_SCROLL, pauseOnScroll) - return this - } - - /** - * 图片选择以几列展示,默认3列 - */ - fun columnsNumber(number: Int): IntentBuilder { - mIntent.putExtra(EXTRA_COLUMNS_NUMBER, number) - return this - } - - /** - * 设置图片加载引擎 - */ - fun imageEngine(engine: LImageEngine): IntentBuilder { - ImageEngineUtils.engine = engine - return this - } - - /** - * 设置主题 - */ - fun theme(@StyleRes style: Int): IntentBuilder { - mIntent.putExtra(EXTRA_THEME, style) - return this - } - - fun build(): Intent { - return mIntent - } - } // // 获取拍照图片保存目录 // private val cameraFileDir by lazy { intent.getSerializableExtra(EXTRA_CAMERA_FILE_DIR) as File } @@ -268,7 +166,7 @@ class LPhotoPickerActivity : LBaseActivity() { } override fun initListener() { - viewBinding.toolBar.setNavigationOnClickListener { finish() } + viewBinding.toolBar.setNavigationOnClickListener { finishWithCancel() } viewBinding.previewBtn.setOnClickListener { gotoPreview() @@ -276,14 +174,14 @@ class LPhotoPickerActivity : LBaseActivity() { viewBinding.applyBtn.setOnClickListener(object : OnNoDoubleClickListener() { override fun onNoDoubleClick(v: View) { - returnSelectedPhotos(adapter.getSelectedItems()) + finishWithSelectedPhotos(adapter.getSelectedItems()) } }) adapter.onPhotoItemClick = { view, path, _ -> if (isSingleChoose) { val list = ArrayList().apply { add(path) } - returnSelectedPhotos(list) + finishWithSelectedPhotos(list) } else { adapter.setChooseItem(path, view.findViewById(R.id.checkView)) setBottomBtn() @@ -323,13 +221,19 @@ class LPhotoPickerActivity : LBaseActivity() { * * @param selectedPhotos */ - private fun returnSelectedPhotos(selectedPhotos: ArrayList) { + private fun finishWithSelectedPhotos(selectedPhotos: ArrayList) { val intent = Intent() intent.putStringArrayListExtra(EXTRA_SELECTED_PHOTOS, selectedPhotos) setResult(Activity.RESULT_OK, intent) finish() } + private fun finishWithCancel() { + val intent = Intent() + setResult(Activity.RESULT_CANCELED, intent) + finish() + } + private fun gotoPreview() { val intent = LPhotoPickerPreviewActivity.IntentBuilder(this) .maxChooseCount(maxChooseCount) @@ -354,13 +258,12 @@ class LPhotoPickerActivity : LBaseActivity() { Activity.RESULT_OK -> { data?.let { - returnSelectedPhotos(LPhotoPickerPreviewActivity.getSelectedPhotos(it)) + finishWithSelectedPhotos(LPhotoPickerPreviewActivity.getSelectedPhotos(it)) } } } } } - } /** diff --git a/photolibrary/src/main/java/top/limuyang2/photolibrary/model/LFolderModel.kt b/photolibrary/src/main/java/top/limuyang2/photolibrary/model/LFolderModel.kt index 479e3bc..a6dd35c 100644 --- a/photolibrary/src/main/java/top/limuyang2/photolibrary/model/LFolderModel.kt +++ b/photolibrary/src/main/java/top/limuyang2/photolibrary/model/LFolderModel.kt @@ -5,7 +5,7 @@ package top.limuyang2.photolibrary.model * @date:2020/4/26 * @description: */ -internal data class LFolderModel(val bucketName: String, - val bucketId: Long, - val previewImgPath: String, - var count: Int) \ No newline at end of file +internal data class LFolderModel(val bucketName: String = "", + val bucketId: Long = 0, + val previewImgPath: String = "", + var count: Int = -1) \ No newline at end of file