package com.architjn.materialicons.adapters; import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import com.architjn.materialicons.R; import com.architjn.materialicons.items.WallpaperItem; import com.architjn.materialicons.tasks.ColorGridTask; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class WallAdapter extends RecyclerView.Adapter<WallAdapter.SimpleItemViewHolder> { public static final int REQUEST_STORAGE = 102; private List<WallpaperItem> items; private Context context; private int reqPos = 0; public final static class SimpleItemViewHolder extends RecyclerView.ViewHolder { public ImageView wall; public TextView name, author; public View mainView; public RelativeLayout realBackground; public ProgressBar pb; public SimpleItemViewHolder(final View view) { super(view); wall = (ImageView) view.findViewById(R.id.wall_grid_art); name = (TextView) view.findViewById(R.id.wall_grid_name); author = (TextView) view.findViewById(R.id.wall_grid_desc); pb = (ProgressBar) view.findViewById(R.id.progressBar_wall_grid); realBackground = (RelativeLayout) view.findViewById(R.id.wall_real_background); mainView = view; } } public WallAdapter(Context context, List<WallpaperItem> items) { this.items = items; this.context = context; } @Override public WallAdapter.SimpleItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.wall_grid, parent, false); return new SimpleItemViewHolder(itemView); } @Override public void onBindViewHolder(final SimpleItemViewHolder holder, final int position) { holder.realBackground.setBackgroundColor(context.getResources().getColor(android.R.color.white)); holder.name.setText(items.get(position).getName()); holder.author.setText(items.get(position).getAuthor()); Picasso.with(context).load(items.get(position).getThumb()) .resize(getScreenWidth() / 2, dpToPx(200)).centerCrop().into(new Target() { @Override public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { holder.pb.setVisibility(View.GONE); holder.wall.setImageBitmap(bitmap); holder.realBackground.setBackgroundColor(context.getResources().getColor(android.R.color.white)); new ColorGridTask(context, bitmap, holder).execute(); } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); holder.mainView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Snackbar.make(((Activity) context).findViewById(R.id.coordinating_wall), "Wait!", Snackbar.LENGTH_LONG).show(); new Thread(new Runnable() { @Override public void run() { checkForStoragePermission(position, holder); } }).start(); } }); } private int getScreenWidth() { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); return display.getWidth(); } public int dpToPx(int dp) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); return px; } private void checkForStoragePermission(int position, SimpleItemViewHolder holder) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { getWallpaper(position); } else { if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Snackbar.make(holder.mainView, R.string.permission_storage_rationale, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.ok, new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE); } }) .show(); } else { reqPos = position; ActivityCompat.requestPermissions(((Activity) context), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE); } } } private void getWallpaper(int position) { try { Uri wallUri = getBitmapFromURL(items.get(position).getUrl()); if (wallUri != null) { Intent setWall = new Intent(Intent.ACTION_ATTACH_DATA); setWall.setDataAndType(wallUri, "image/*"); setWall.putExtra("png", "image/*"); ((Activity) context).startActivityForResult( Intent.createChooser(setWall, "Set Wallpaper using:"), 1); } } catch (Exception e) { e.printStackTrace(); } } public Uri getLocalBitmapUri(Bitmap bmp) { try { String saveWallLocation = Environment.getExternalStorageDirectory().getAbsolutePath() + context.getResources().getString(R.string.walls_save_location); SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss"); String format = s.format(new Date()); File file = new File(saveWallLocation, format + ".png"); file.getParentFile().mkdirs(); file.delete(); FileOutputStream out = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 100, out); out.close(); return Uri.fromFile(file); } catch (IOException e) { e.printStackTrace(); } return null; } public Uri getBitmapFromURL(String src) { try { java.net.URL url = new java.net.URL(src); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); return getLocalBitmapUri(myBitmap); } catch (IOException e) { e.printStackTrace(); return null; } } @Override public int getItemCount() { return this.items.size(); } public void storageRequestAccepted() { getWallpaper(reqPos); } }