From ee9b7de7eb3b6dc25d6ac606674f818ce1cc9b24 Mon Sep 17 00:00:00 2001 From: jax <1264247925@qq.com> Date: Sat, 6 Jan 2018 18:45:50 +0800 Subject: [PATCH] add album filter function. --- .../bilibili/boxing/impl/BoxingFilter.java | 68 +++++++++++++++++++ .../com/bilibili/boxing/ui/FirstActivity.java | 9 +++ app/src/main/res/layout/activity_first.xml | 35 ++++++---- .../boxing_impl/ui/BoxingViewFragment.java | 11 +-- .../src/main/res/values-en/strings.xml | 1 + boxing-impl/src/main/res/values/strings.xml | 1 + .../bilibili/boxing/BoxingMediaFilter.java | 32 +++++++++ .../boxing/loader/IBoxingMediaFilter.java | 32 +++++++++ 8 files changed, 173 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/com/bilibili/boxing/impl/BoxingFilter.java create mode 100644 boxing/src/main/java/com/bilibili/boxing/BoxingMediaFilter.java create mode 100644 boxing/src/main/java/com/bilibili/boxing/loader/IBoxingMediaFilter.java diff --git a/app/src/main/java/com/bilibili/boxing/impl/BoxingFilter.java b/app/src/main/java/com/bilibili/boxing/impl/BoxingFilter.java new file mode 100644 index 0000000..049e9e7 --- /dev/null +++ b/app/src/main/java/com/bilibili/boxing/impl/BoxingFilter.java @@ -0,0 +1,68 @@ +package com.bilibili.boxing.impl; + +import android.graphics.BitmapFactory; +import android.util.Log; + +import com.bilibili.boxing.loader.IBoxingMediaFilter; +import com.bilibili.boxing.model.entity.AlbumEntity; +import com.bilibili.boxing.model.entity.BaseMedia; + +import java.util.Iterator; +import java.util.List; + +/** + * @author jax + * @date 2018/1/5 + * @description filter album images. sample for filter img width and height. + */ + +public class BoxingFilter implements IBoxingMediaFilter { + private static final String TAG = "BoxingFilter"; + private static final int MIN_WIDTH = 1280; + private static final int MIN_HEIGHT = 720; + + @Override + public List filterAlbum(List albums) { + Iterator entityIterator = albums.iterator(); + while (entityIterator.hasNext()) { + AlbumEntity entity = entityIterator.next(); + List medias = entity.mImageList; + entity.mImageList = filterMedia(medias); + if (entity.mImageList.size() <= 0) { + entityIterator.remove(); + } + } + return albums; + } + + @Override + public List filterMedia(List medias) { + if (medias != null) { + Iterator baseMediaIterator = medias.iterator(); + while (baseMediaIterator.hasNext()) { + BaseMedia media = baseMediaIterator.next(); + if (!checkWH(media)) { + baseMediaIterator.remove(); + } + } + } + return medias; + } + + + private boolean checkWH(BaseMedia media) { + try { + String path = media.getPath(); + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(path, options); + int w = options.outWidth; + int h = options.outHeight; + Log.d(TAG, "checkWH: w -->" + w + " ,h -->" + h); + return w > MIN_WIDTH && h > MIN_HEIGHT; + } catch (Exception e) { + Log.e(TAG, "checkWH: ", e); + } + return true; + } +} diff --git a/app/src/main/java/com/bilibili/boxing/ui/FirstActivity.java b/app/src/main/java/com/bilibili/boxing/ui/FirstActivity.java index 7d73df2..43a5baf 100644 --- a/app/src/main/java/com/bilibili/boxing/ui/FirstActivity.java +++ b/app/src/main/java/com/bilibili/boxing/ui/FirstActivity.java @@ -33,8 +33,10 @@ import com.bilibili.boxing.AbsBoxingActivity; import com.bilibili.boxing.Boxing; +import com.bilibili.boxing.BoxingMediaFilter; import com.bilibili.boxing.BoxingMediaLoader; import com.bilibili.boxing.demo.R; +import com.bilibili.boxing.impl.BoxingFilter; import com.bilibili.boxing.model.BoxingManager; import com.bilibili.boxing.model.config.BoxingConfig; import com.bilibili.boxing.model.config.BoxingCropOption; @@ -70,6 +72,7 @@ protected void onCreate(Bundle savedInstanceState) { findViewById(R.id.single_image_btn).setOnClickListener(this); findViewById(R.id.single_image_btn_crop_btn).setOnClickListener(this); + findViewById(R.id.single_image_btn_filter_btn).setOnClickListener(this); findViewById(R.id.multi_image_btn).setOnClickListener(this); findViewById(R.id.video_btn).setOnClickListener(this); findViewById(R.id.outside_bs_btn).setOnClickListener(this); @@ -97,6 +100,7 @@ public void onClick(View v) { @Override public void onClick(View v) { int id = v.getId(); + BoxingMediaFilter.INSTANCE.init(null); switch (id) { case R.id.single_image_btn: BoxingConfig singleImgConfig = new BoxingConfig(BoxingConfig.Mode.SINGLE_IMG).withMediaPlaceHolderRes(R.drawable.ic_boxing_default_image); @@ -117,6 +121,11 @@ public void onClick(View v) { .withMediaPlaceHolderRes(R.drawable.ic_boxing_default_image); Boxing.of(singleCropImgConfig).withIntent(this, BoxingActivity.class).start(this, REQUEST_CODE); break; + case R.id.single_image_btn_filter_btn: + BoxingMediaFilter.INSTANCE.init(new BoxingFilter()); + BoxingConfig filterImgConfig = new BoxingConfig(BoxingConfig.Mode.SINGLE_IMG).withMediaPlaceHolderRes(R.drawable.ic_boxing_default_image); + Boxing.of(filterImgConfig).withIntent(this, BoxingActivity.class).start(this, COMPRESS_REQUEST_CODE); + break; case R.id.multi_image_btn: BoxingConfig config = new BoxingConfig(BoxingConfig.Mode.MULTI_IMG).needCamera(R.drawable.ic_boxing_camera_white).needGif(); Boxing.of(config).withIntent(this, BoxingActivity.class).start(this, REQUEST_CODE); diff --git a/app/src/main/res/layout/activity_first.xml b/app/src/main/res/layout/activity_first.xml index d3f9911..df21972 100644 --- a/app/src/main/res/layout/activity_first.xml +++ b/app/src/main/res/layout/activity_first.xml @@ -1,5 +1,4 @@ - - - - + + android:textColor="@color/boxing_colorPrimaryDark" /> + android:textColor="@color/boxing_colorPrimaryDark" /> + + + android:textColor="@color/boxing_colorPrimaryDark" /> + android:textColor="@color/boxing_colorPrimaryDark" /> @@ -104,17 +115,17 @@ android:gravity="center" android:padding="@dimen/boxing_item_spacing" android:text="@string/bottom_sheet" - android:textColor="@color/boxing_colorPrimaryDark"/> + android:textColor="@color/boxing_colorPrimaryDark" /> + tools:visibility="visible" /> diff --git a/boxing-impl/src/main/java/com/bilibili/boxing_impl/ui/BoxingViewFragment.java b/boxing-impl/src/main/java/com/bilibili/boxing_impl/ui/BoxingViewFragment.java index ecf0430..daf1cb7 100644 --- a/boxing-impl/src/main/java/com/bilibili/boxing_impl/ui/BoxingViewFragment.java +++ b/boxing-impl/src/main/java/com/bilibili/boxing_impl/ui/BoxingViewFragment.java @@ -40,6 +40,7 @@ import com.bilibili.boxing.AbsBoxingViewFragment; import com.bilibili.boxing.Boxing; +import com.bilibili.boxing.BoxingMediaFilter; import com.bilibili.boxing.model.BoxingManager; import com.bilibili.boxing.model.config.BoxingConfig; import com.bilibili.boxing.model.entity.AlbumEntity; @@ -110,7 +111,7 @@ public void onRequestPermissionError(String[] permissions, Exception e) { if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(getContext(), R.string.boxing_storage_permission_deny, Toast.LENGTH_SHORT).show(); showEmptyData(); - } else if (permissions[0].equals(Manifest.permission.CAMERA)){ + } else if (permissions[0].equals(Manifest.permission.CAMERA)) { Toast.makeText(getContext(), R.string.boxing_camera_permission_deny, Toast.LENGTH_SHORT).show(); } } @@ -176,6 +177,7 @@ && isEmptyData(mMediaAdapter.getAllMedias())) { return; } showData(); + medias = BoxingMediaFilter.INSTANCE.filterMedia(medias); mMediaAdapter.addAllData(medias); checkSelectedMedia(medias, mMediaAdapter.getSelectedMedias()); } @@ -204,6 +206,7 @@ public void showAlbum(@Nullable List albums) { mTitleTxt.setOnClickListener(null); return; } + albums = BoxingMediaFilter.INSTANCE.startFilter(albums); mAlbumWindowAdapter.addAllData(albums); } @@ -319,9 +322,9 @@ private void showProgressDialog() { mDialog.setIndeterminate(true); mDialog.setMessage(getString(R.string.boxing_handling)); } - if (!mDialog.isShowing()) { - mDialog.show(); - } + if (!mDialog.isShowing()) { + mDialog.show(); + } } private void dismissProgressDialog() { diff --git a/boxing-impl/src/main/res/values-en/strings.xml b/boxing-impl/src/main/res/values-en/strings.xml index a9bc3ed..6d3fc9c 100644 --- a/boxing-impl/src/main/res/values-en/strings.xml +++ b/boxing-impl/src/main/res/values-en/strings.xml @@ -29,6 +29,7 @@ Pick a video Pick pictures Pick a picture with crop + Pick a picture with filter Pick a picture videos Device storage read error or temporarily unavailable. Please try again later diff --git a/boxing-impl/src/main/res/values/strings.xml b/boxing-impl/src/main/res/values/strings.xml index 513728c..ef63b64 100644 --- a/boxing-impl/src/main/res/values/strings.xml +++ b/boxing-impl/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ 视频单选 图片多选 图片单选加裁剪 + 图片单选加筛选 图片单选 视频相册 完成 diff --git a/boxing/src/main/java/com/bilibili/boxing/BoxingMediaFilter.java b/boxing/src/main/java/com/bilibili/boxing/BoxingMediaFilter.java new file mode 100644 index 0000000..7cde3a1 --- /dev/null +++ b/boxing/src/main/java/com/bilibili/boxing/BoxingMediaFilter.java @@ -0,0 +1,32 @@ +package com.bilibili.boxing; + +import com.bilibili.boxing.loader.IBoxingMediaFilter; +import com.bilibili.boxing.model.entity.AlbumEntity; +import com.bilibili.boxing.model.entity.BaseMedia; + +import java.util.List; + +/** + * @author jax + * @date 2018/1/5 + * @description + */ + +public enum BoxingMediaFilter { + INSTANCE; + + private IBoxingMediaFilter filter; + + public void init(IBoxingMediaFilter filter) { + this.filter = filter; + } + + public List startFilter(List entities) { + return filter == null ? entities : filter.filterAlbum(entities); + } + + public List filterMedia(List medias) { + return filter == null ? medias : filter.filterMedia(medias); + } + +} diff --git a/boxing/src/main/java/com/bilibili/boxing/loader/IBoxingMediaFilter.java b/boxing/src/main/java/com/bilibili/boxing/loader/IBoxingMediaFilter.java new file mode 100644 index 0000000..5fc4f0c --- /dev/null +++ b/boxing/src/main/java/com/bilibili/boxing/loader/IBoxingMediaFilter.java @@ -0,0 +1,32 @@ +package com.bilibili.boxing.loader; + +import com.bilibili.boxing.model.entity.AlbumEntity; +import com.bilibili.boxing.model.entity.BaseMedia; + +import java.util.List; + +/** + * @author jax + * @date 2018/1/5 + * @description filter album images list. + */ + +public interface IBoxingMediaFilter { + + /** + * filter origin albums to new list. + * + * @param albums origin album image. + * @return last albumEntity list. + */ + List filterAlbum(List albums); + + /** + * filter media to new list. + * + * @param medias origin medias. + * @return filter medias + */ + List filterMedia(List medias); + +}