Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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<String> list) {
mSelectionSpec.selectedFilePath = list;
return this;
}

/**
* Set a fixed span count for the media grid. Same for different screen orientations.
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.zhihu.matisse.internal.entity;

import android.content.pm.ActivityInfo;
import android.net.Uri;

import androidx.annotation.StyleRes;

Expand All @@ -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;

Expand Down Expand Up @@ -57,6 +59,7 @@ public final class SelectionSpec {
public int originalMaxSize;
public OnCheckedListener onCheckedListener;
public boolean showPreview;
public ArrayList<String> selectedFilePath;

private SelectionSpec() {
}
Expand Down Expand Up @@ -93,6 +96,7 @@ private void reset() {
autoHideToobar = false;
originalMaxSize = Integer.MAX_VALUE;
showPreview = true;
selectedFilePath = null;
}

public boolean singleSelectionModeEnabled() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<RecyclerView.ViewHolder> 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;
Expand All @@ -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;

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
27 changes: 26 additions & 1 deletion matisse/src/main/java/com/zhihu/matisse/ui/MatisseActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -59,6 +60,7 @@
import com.zhihu.matisse.internal.utils.PhotoMetadataUtils;

import com.zhihu.matisse.internal.utils.SingleMediaScanner;

import java.util.ArrayList;

/**
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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!");
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -141,10 +143,13 @@ private void startAction(View v) {
mAdapter.setData(null, null);
}

private ArrayList<String> 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)));
}
Expand Down