Package cc.vv.btongbaselibrary.ui.view.imagepicker;
Import Android. Manifest;
Import Android.animation.Animator;
Import Android.animation.AnimatorListenerAdapter;
Import Android.animation.ObjectAnimator;
Import android.app.Activity;
Import Android.app.AlertDialog;
Import Android.content.DialogInterface;
Import android.content.Intent;
Import Android.content.pm.PackageManager;
Import android.content.res.Configuration;
Import Android.graphics.Color;
Import Android.net.Uri;
Import Android.os.Build;
Import Android.os.Bundle;
Import android.os.Environment;
Import android.provider.Settings;
Import android.support.annotation.Nullable;
Import Android.support.v4.app.ActivityCompat;
Import Android.support.v4.content.ContextCompat;
Import android.support.v7.app.AppCompatActivity;
Import Android.support.v7.widget.GridLayoutManager;
Import Android.support.v7.widget.LinearLayoutManager;
Import Android.support.v7.widget.RecyclerView;
Import Android.support.v7.widget.SimpleItemAnimator;
Import android.view.KeyEvent;
Import Android.view.View;
Import Android.view.Window;
Import Android.view.WindowManager;
Import Android.widget.FrameLayout;
Import Android.widget.TextView;
Import Android.widget.Toast;
Import java.util.ArrayList;
Import CC.VV.BTONGBASELIBRARY.R;
Import Cc.vv.btongbaselibrary.ui.view.imagepicker.adapter.FolderAdapter;
Import Cc.vv.btongbaselibrary.ui.view.imagepicker.adapter.ImageAdapter;
Import CC.VV.BTONGBASELIBRARY.UI.VIEW.IMAGEPICKER.ENTRY.FOLDEROBJ;
Import CC.VV.BTONGBASELIBRARY.UI.VIEW.IMAGEPICKER.ENTRY.IMAGEOBJ;
Import Cc.vv.btongbaselibrary.ui.view.imagepicker.model.ImageModel;
Import Cc.vv.btongbaselibrary.vFinal.BTResultCode;
/**
* Image Selection Screen
*
* @author Zml
*/
public class Imageselectoractivity extends Appcompatactivity {
public static final String Key_max_select_count = "Max_select_count";
public static final String key_is_single = "Is_single";
private static final String key_selected = "SELECTED";
Private TextView Tvfoldername;
Private TextView tvconfirm;
Private TextView Tvpreview;
Private Framelayout btnconfirm;
Private Framelayout Btnpreview;
Private Recyclerview rvimage;
Private Recyclerview Rvfolder;
Private View masking;
Private Imageadapter Madapter;
Private Gridlayoutmanager Mlayoutmanager;
Private arraylist<folderobj> mfolders;
Private Folderobj Mfolder;
Private Boolean istosettings = false;
private static final int permission_request_code = 0x0011;
Private Boolean Isopenfolder;
Private Boolean Isinitfolder;
Private Boolean Issingle;
private int mmaxcount;
/**
* Used to receive a list of selected images that came in from the outside. When the user has already selected a picture, now re-open the selector,
* Allow users to pass in previously selected images, and make them default to the selected state.
*/
Private arraylist<string> mselectedimages;
/**
* Start Image Selector
*
* @param activity
* @param requestcode
* @param Issingle is a single choice
* @param the maximum number of maxselectcount pictures, less than or equal to 0 o'clock, an unlimited number, Issingle is false when used.
* @param selected receive a list of selected images that have been sent in from outside. When the user has already selected a picture, now reopen
* Selectors that allow users to pass in previously selected images and leave them selected by default.
*/
public static void openactivity (activity activity, int requestcode,
Boolean issingle, int maxselectcount, arraylist<string> selected) {
Intent Intent = new Intent (activity, imageselectoractivity.class);
Intent.putextra (Key_max_select_count, Maxselectcount);
Intent.putextra (Key_is_single, Issingle);
Intent.putstringarraylistextra (key_selected, SELECTED);
Activity.startactivityforresult (Intent, Requestcode);
}
@Override
protected void OnCreate (@Nullable Bundle savedinstancestate) {
Super.oncreate (savedinstancestate);
Setcontentview (R.layout.activity_image_select);
Intent Intent = Getintent ();
Mmaxcount = Intent.getintextra (key_max_select_count, 0);
Issingle = Intent.getbooleanextra (Key_is_single, false);
Mselectedimages = Intent.getstringarraylistextra (key_selected);
Setstatusbarcolor ();
Initview ();
Initlistener ();
Initimagelist ();
Checkpermissionandloadimages ();
Hidefolderlist ();
Setselectimagecount (0);
}
/**
* Modify status bar color
*/
private void Setstatusbarcolor () {
if (Build.VERSION.SDK_INT >= build.version_codes. LOLLIPOP) {
window window = GetWindow ();
Window.addflags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
Window.setstatusbarcolor (Color.parsecolor ("#373c3d"));
}
}
private void Initview () {
Rvimage = Findviewbyid (r.id.rv_image);
Rvfolder = Findviewbyid (R.id.rv_folder);
Tvconfirm = Findviewbyid (r.id.tv_confirm);
Tvpreview = Findviewbyid (R.id.tv_preview);
Btnconfirm = Findviewbyid (r.id.btn_confirm);
Btnpreview = Findviewbyid (R.id.btn_preview);
Tvfoldername = Findviewbyid (r.id.tv_folder_name);
masking = Findviewbyid (r.id.masking);
}
private void Initlistener () {
Findviewbyid (R.id.btn_back). Setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
Finish ();
}
});
Btnpreview.setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
arraylist<imageobj> images = new arraylist<> ();
Images.addall (Madapter.getselectimages ());
Topreviewactivity (images, 0);
}
});
Btnconfirm.setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
Confirm ();
}
});
Findviewbyid (R.id.btn_folder). Setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
if (Isinitfolder) {
if (Isopenfolder) {
Closefolder ();
} else {
Openfolder ();
}
}
}
});
Masking.setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
Closefolder ();
}
});
}
/**
* Initialize Picture List
*/
private void Initimagelist () {
Judging the screen orientation
Configuration configuration = Getresources (). GetConfiguration ();
if (configuration.orientation = = configuration.orientation_portrait) {
Mlayoutmanager = new Gridlayoutmanager (this, 3);
} else {
Mlayoutmanager = new Gridlayoutmanager (this, 5);
}
Rvimage.setlayoutmanager (Mlayoutmanager);
Madapter = new Imageadapter (this, mmaxcount, issingle);
Rvimage.setadapter (Madapter);
((Simpleitemanimator) Rvimage.getitemanimator ()). Setsupportschangeanimations (false);
if (mfolders! = null &&!mfolders.isempty ()) {
Setfolder (mfolders.get (0));
}
Madapter.setonimageselectlistener (New Imageadapter.onimageselectlistener () {
@Override
public void Onimageselect (Imageobj image, Boolean isselect, int selectcount) {
Setselectimagecount (SelectCount);
}
});
Madapter.setonitemclicklistener (New Imageadapter.onitemclicklistener () {
@Override
public void Onitemclick (imageobj image, int position) {
Topreviewactivity (Madapter.getdata (), position);
}
});
}
/**
* Initialize picture Folder List
*/
private void Initfolderlist () {
if (mfolders! = null &&!mfolders.isempty ()) {
Isinitfolder = true;
Rvfolder.setlayoutmanager (New Linearlayoutmanager (Imageselectoractivity.this));
Folderadapter adapter = new Folderadapter (imageselectoractivity.this, mfolders);
Adapter.setonfolderselectlistener (New Folderadapter.onfolderselectlistener () {
@Override
public void Onfolderselect (Folderobj folder) {
Setfolder (folder);
Closefolder ();
}
});
Rvfolder.setadapter (adapter);
}
}
/**
* First time Folder List is hidden by default
*/
private void Hidefolderlist () {
Rvfolder.post (New Runnable () {
@Override
public void Run () {
Rvfolder.settranslationy (Rvfolder.getheight ());
Rvfolder.setvisibility (View.gone);
}
});
}
/**
* Set the selected folder while refreshing the picture list
*
* @param folder
*/
private void Setfolder (Folderobj folder) {
if (folder! = NULL && Madapter! = null &&!folder.equals (Mfolder)) {
Mfolder = folder;
Tvfoldername.settext (Folder.getname ());
Rvimage.scrolltoposition (0);
Madapter.refresh (Folder.getimages ());
}
}
private void Setselectimagecount (int count) {
if (count = = 0) {
Btnconfirm.setenabled (FALSE);
Btnpreview.setenabled (FALSE);
Tvconfirm.settext ("OK");
Tvpreview.settext ("preview");
} else {
Btnconfirm.setenabled (TRUE);
Btnpreview.setenabled (TRUE);
Tvpreview.settext ("Preview (" + Count + ")");
if (Issingle) {
Tvconfirm.settext ("OK");
} else if (Mmaxcount > 0) {
Tvconfirm.settext ("OK (" + count + "/" + Mmaxcount + ")");
} else {
Tvconfirm.settext ("OK (" + count + ")");
}
}
}
/**
* Popup Folder List
*/
private void Openfolder () {
if (!isopenfolder) {
Masking.setvisibility (view.visible);
Objectanimator animator = Objectanimator.offloat (Rvfolder, "Translationy",
Rvfolder.getheight (), 0). setduration (300);
Animator.addlistener (New Animatorlisteneradapter () {
@Override
public void Onanimationstart (Animator animation) {
Super.onanimationstart (animation);
Rvfolder.setvisibility (view.visible);
}
});
Animator.start ();
Isopenfolder = true;
}
}
/**
* Close Folder List
*/
private void Closefolder () {
if (Isopenfolder) {
Masking.setvisibility (View.gone);
Objectanimator animator = Objectanimator.offloat (Rvfolder, "Translationy",
0, Rvfolder.getheight ()). Setduration (300);
Animator.addlistener (New Animatorlisteneradapter () {
@Override
public void Onanimationend (Animator animation) {
Super.onanimationend (animation);
Rvfolder.setvisibility (View.gone);
}
});
Animator.start ();
Isopenfolder = false;
}
}
private void confirm () {
if (Madapter = = null) {
Return
}
Because the entity class of the picture is an image, and we are returning a string array, we are going to convert it.
arraylist<imageobj> selectimages = Madapter.getselectimages ();
arraylist<string> images = new arraylist<> ();
for (Imageobj image:selectimages) {
Images.add (Image.getpath ());
}
Click OK to pass the selected image through intent to the previous activity.
Intent Intent = new Intent ();
Intent.putstringarraylistextra (imagegalleryutil.select_result, images);
Setresult (Btresultcode.imageselectoractivity_result_code, intent);
Finish ();
}
private void Topreviewactivity (arraylist<imageobj> images, int position) {
if (images! = null &&!images.isempty ()) {
Previewactivity.openactivity (this, images,
Madapter.getselectimages (), Issingle, mmaxcount, position);
}
}
@Override
protected void OnStart () {
Super.onstart ();
if (istosettings) {
Istosettings = false;
Checkpermissionandloadimages ();
}
}
/**
* Process The results returned by the picture preview page
*
* @param requestcode
* @param ResultCode
* @param data
*/
@Override
protected void Onactivityresult (int requestcode, int resultcode, Intent data) {
Super.onactivityresult (Requestcode, ResultCode, data);
if (Requestcode = = Previewactivity.request_code) {
if (data! = NULL && Data.getbooleanextra (Previewactivity.key_is_confirm, false)) {
If the user clicks OK on the preview page, the user's selected image is returned directly to the user.
Confirm ();
} else {
Otherwise, the current page is refreshed.
Madapter.notifydatasetchanged ();
Setselectimagecount (Madapter.getselectimages (). Size ());
}
}
}
/**
* Screen Switching processing
*
* @param newconfig
*/
@Override
public void onconfigurationchanged (Configuration newconfig) {
Super.onconfigurationchanged (Newconfig);
if (Mlayoutmanager! = NULL && Madapter! = null) {
Switch to vertical screen
if (newconfig.orientation = = configuration.orientation_portrait) {
Mlayoutmanager.setspancount (3);
}
Switch to horizontal screen
else if (newconfig.orientation = = Configuration.orientation_landscape) {
Mlayoutmanager.setspancount (5);
}
Madapter.notifydatasetchanged ();
}
}
/**
* Check permissions and load images from SD card.
*/
private void Checkpermissionandloadimages () {
if (! Environment.getexternalstoragestate (). Equals (environment.media_mounted)) {
Toast.maketext (This, "No picture", Toast.length_long). Show ();
Return
}
int haswritecontactspermission = Contextcompat.checkselfpermission (Getapplication (),
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (haswritecontactspermission = = packagemanager.permission_granted) {
have permission to load the picture.
Loadimageforsdcard ();
} else {
No permissions, request permission.
Activitycompat.requestpermissions (Imageselectoractivity.this,
New String[]{manifest.permission.write_external_storage}, Permission_request_code);
}
}
/**
* Callback that handles permission requests.
*
* @param requestcode
* @param permissions
* @param grantresults
*/
@Override
public void Onrequestpermissionsresult (int requestcode, string[] permissions, int[] grantresults) {
if (Requestcode = = Permission_request_code) {
if (Grantresults.length > 0
&& Grantresults[0] = = packagemanager.permission_granted) {
Allow permissions to load pictures.
Loadimageforsdcard ();
} else {
Deny permission, pop-up prompt box.
Showexceptiondialog ();
}
}
}
/**
* A hint dialog occurs when no permissions, such as exceptions, are displayed.
*/
private void Showexceptiondialog () {
New Alertdialog.builder (This)
. Setcancelable (False)
. Settitle ("hint")
. Setmessage ("the album requires permission to access the store, configure permissions in Settings > Apps > Permissions.") ")
. Setnegativebutton ("Cancel", new Dialoginterface.onclicklistener () {
@Override
public void OnClick (Dialoginterface dialog, int which) {
Dialog.cancel ();
Finish ();
}
}). Setpositivebutton ("OK", new Dialoginterface.onclicklistener () {
@Override
public void OnClick (Dialoginterface dialog, int which) {
Dialog.cancel ();
Startappsettings ();
Istosettings = true;
}
}). Show ();
}
/**
* Load images from SDcard.
*/
private void Loadimageforsdcard () {
Imagemodel.loadimageforsdcard (This, new Imagemodel.datacallback () {
@Override
public void onsuccess (arraylist<folderobj> folders) {
mfolders = folders;
Runonuithread (New Runnable () {
@Override
public void Run () {
if (mfolders! = null &&!mfolders.isempty ()) {
Initfolderlist ();
Setfolder (mfolders.get (0));
if (mselectedimages! = NULL && Madapter! = null) {
Madapter.setselectedimages (mselectedimages);
Mselectedimages = null;
}
}
}
});
}
});
}
/**
* Start the app's settings
*/
private void Startappsettings () {
Intent Intent = new Intent (
Settings.action_application_details_settings);
Intent.setdata (Uri.parse ("package:" + getpackagename ()));
StartActivity (Intent);
}
@Override
public boolean onKeyDown (int keycode, keyevent event) {
if (keycode = = Keyevent.keycode_back && event.getaction () = = Keyevent.action_down && isopenfolder) {
Closefolder ();
return true;
}
Return Super.onkeydown (KeyCode, event);
}
}
Android Photo Selection interface