diff --git a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java index 66aeadfe3..499497930 100644 --- a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java +++ b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java @@ -18,7 +18,9 @@ import android.app.Activity; import android.content.Intent; +import android.net.Uri; import android.os.Build; + import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -163,7 +165,7 @@ public SelectionCreator maxSelectable(int maxSelectable) { * * @param maxImageSelectable Maximum selectable count for image. * @param maxVideoSelectable Maximum selectable count for video. - * @return {@link SelectionCreator} for fluent API. + * @return {@link SelectionCreator} for fluent API. */ public SelectionCreator maxSelectablePerMediaType(int maxImageSelectable, int maxVideoSelectable) { if (maxImageSelectable < 1 || maxVideoSelectable < 1) @@ -216,6 +218,7 @@ public SelectionCreator originalEnable(boolean enable) { /** * Determines Whether to hide top and bottom toolbar in PreView mode ,when user tap the picture + * * @param enable * @return {@link SelectionCreator} for fluent API. */ @@ -260,6 +263,15 @@ public SelectionCreator restrictOrientation(@ScreenOrientation int orientation) return this; } + /** + * set last choose uris to make these pictures be selected by default. + * id is cursor id. not support crop picture + */ + public SelectionCreator setSelectedItems(ArrayList list) { + mSelectionSpec.selectedFilePath = list; + return this; + } + /** * Set a fixed span count for the media grid. Same for different screen orientations. *

diff --git a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java index 80b7d1098..f67dcb245 100644 --- a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java @@ -17,6 +17,7 @@ package com.zhihu.matisse.internal.entity; import android.content.pm.ActivityInfo; +import android.net.Uri; import androidx.annotation.StyleRes; @@ -28,6 +29,7 @@ import com.zhihu.matisse.listener.OnCheckedListener; import com.zhihu.matisse.listener.OnSelectedListener; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -57,6 +59,7 @@ public final class SelectionSpec { public int originalMaxSize; public OnCheckedListener onCheckedListener; public boolean showPreview; + public ArrayList selectedFilePath; private SelectionSpec() { } @@ -93,6 +96,7 @@ private void reset() { autoHideToobar = false; originalMaxSize = Integer.MAX_VALUE; showPreview = true; + selectedFilePath = null; } public boolean singleSelectionModeEnabled() { diff --git a/matisse/src/main/java/com/zhihu/matisse/internal/ui/adapter/AlbumMediaAdapter.java b/matisse/src/main/java/com/zhihu/matisse/internal/ui/adapter/AlbumMediaAdapter.java index f0eb97143..76cf96535 100644 --- a/matisse/src/main/java/com/zhihu/matisse/internal/ui/adapter/AlbumMediaAdapter.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/ui/adapter/AlbumMediaAdapter.java @@ -20,8 +20,13 @@ import android.database.Cursor; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; + import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; + +import android.net.Uri; +import android.provider.MediaStore; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,10 +42,14 @@ import com.zhihu.matisse.internal.ui.widget.CheckView; import com.zhihu.matisse.internal.ui.widget.MediaGrid; +import java.io.File; +import java.util.Objects; + public class AlbumMediaAdapter extends RecyclerViewCursorAdapter implements MediaGrid.OnMediaGridClickListener { + private Context mContext; private static final int VIEW_TYPE_CAPTURE = 0x01; private static final int VIEW_TYPE_MEDIA = 0x02; private final SelectedItemCollection mSelectedCollection; @@ -53,6 +62,8 @@ public class AlbumMediaAdapter extends public AlbumMediaAdapter(Context context, SelectedItemCollection selectedCollection, RecyclerView recyclerView) { super(null); + + mContext = context; mSelectionSpec = SelectionSpec.getInstance(); mSelectedCollection = selectedCollection; @@ -121,11 +132,13 @@ protected void onBindViewHolder(final RecyclerView.ViewHolder holder, Cursor cur )); mediaViewHolder.mMediaGrid.bindMedia(item); mediaViewHolder.mMediaGrid.setOnMediaGridClickListener(this); + setSelectedItems(item); setCheckStatus(item, mediaViewHolder.mMediaGrid); } } private void setCheckStatus(Item item, MediaGrid mediaGrid) { + if (mSelectionSpec.countable) { int checkedNum = mSelectedCollection.checkedNumOf(item); if (checkedNum > 0) { @@ -157,6 +170,35 @@ private void setCheckStatus(Item item, MediaGrid mediaGrid) { } } + /** + * 初始化外部传入上次选中的图片 + */ + private void setSelectedItems(Item item) { + if (mSelectionSpec.selectedFilePath == null || mSelectionSpec.selectedFilePath.size() == 0) + return; + + for (int index = 0; index < mSelectionSpec.selectedFilePath.size(); ++index) { + String filePath = mSelectionSpec.selectedFilePath.get(index); + if (filePath != null && + Objects.equals(filePath, getRealPathFromUri(item.uri))) { + mSelectedCollection.add(item); + mSelectionSpec.selectedFilePath.set(index, null); + } + } + + } + private String getRealPathFromUri(Uri uri) { + String[] projection = { MediaStore.Images.Media.DATA }; + Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null); + if (cursor == null) { + return null; + } + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + String filePath = cursor.getString(column_index); + cursor.close(); + return filePath; + } @Override public void onThumbnailClicked(ImageView thumbnail, Item item, RecyclerView.ViewHolder holder) { if (mSelectionSpec.showPreview) { diff --git a/matisse/src/main/java/com/zhihu/matisse/ui/MatisseActivity.java b/matisse/src/main/java/com/zhihu/matisse/ui/MatisseActivity.java index 662379a2e..fcefcf420 100644 --- a/matisse/src/main/java/com/zhihu/matisse/ui/MatisseActivity.java +++ b/matisse/src/main/java/com/zhihu/matisse/ui/MatisseActivity.java @@ -26,6 +26,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; + import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.appcompat.app.ActionBar; @@ -59,6 +60,7 @@ import com.zhihu.matisse.internal.utils.PhotoMetadataUtils; import com.zhihu.matisse.internal.utils.SingleMediaScanner; + import java.util.ArrayList; /** @@ -153,6 +155,28 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { mAlbumCollection.onCreate(this, this); mAlbumCollection.onRestoreInstanceState(savedInstanceState); mAlbumCollection.loadAlbums(); + initDefaultSelectedPictures(); + } + + + private void initDefaultSelectedPictures() { + + SelectionSpec selectionSpec = SelectionSpec.getInstance(); + + if (selectionSpec.selectedFilePath == null || selectionSpec.selectedFilePath.size() == 0) + return; + + int selectedCount = 0; + for (int index = 0; index < selectionSpec.selectedFilePath.size(); ++index) { + + if (selectionSpec.selectedFilePath.get(index) != null) ++selectedCount; + } + + if(selectedCount > 0){ + mButtonPreview.setEnabled(true); + mButtonApply.setEnabled(true); + mButtonApply.setText(getString(R.string.button_apply, selectedCount)); + } } @Override @@ -239,7 +263,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); new SingleMediaScanner(this.getApplicationContext(), path, new SingleMediaScanner.ScanListener() { - @Override public void onScanFinish() { + @Override + public void onScanFinish() { Log.i("SingleMediaScanner", "scan finish!"); } }); diff --git a/sample/src/main/java/com/zhihu/matisse/sample/SampleActivity.java b/sample/src/main/java/com/zhihu/matisse/sample/SampleActivity.java index 9788a6014..60f291022 100644 --- a/sample/src/main/java/com/zhihu/matisse/sample/SampleActivity.java +++ b/sample/src/main/java/com/zhihu/matisse/sample/SampleActivity.java @@ -40,6 +40,7 @@ import com.zhihu.matisse.filter.Filter; import com.zhihu.matisse.internal.entity.CaptureStrategy; +import java.util.ArrayList; import java.util.List; public class SampleActivity extends AppCompatActivity implements View.OnClickListener { @@ -91,6 +92,7 @@ private void startAction(View v) { .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K)) .gridExpectedSize( getResources().getDimensionPixelSize(R.dimen.grid_expected_size)) + .setSelectedItems(selectedList) .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) .thumbnailScale(0.85f) .imageEngine(new GlideEngine()) @@ -141,10 +143,13 @@ private void startAction(View v) { mAdapter.setData(null, null); } + private ArrayList selectedList = new ArrayList<>(); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) { + selectedList.clear(); + selectedList.addAll(Matisse.obtainPathResult(data)); mAdapter.setData(Matisse.obtainResult(data), Matisse.obtainPathResult(data)); Log.e("OnActivityResult ", String.valueOf(Matisse.obtainOriginalState(data))); }