package it.neokree.materialnavigationdrawer.elements;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.view.View;
import it.neokree.materialnavigationdrawer.elements.listeners.MaterialSectionListener;
import it.neokree.materialnavigationdrawer.util.Utils;

public class MaterialAccount {
    // datas

    private Drawable photo;
    private Drawable background;
    private Drawable circularPhoto;
    private String title;
    private String subTitle;
    private int accountNumber;
    private String notifications;

    private boolean hasNotifications;

    private Resources resources;
    private OnAccountDataLoaded listener;
    private MaterialSection sectionView;

    public static final int FIRST_ACCOUNT = 0;
    public static final int SECOND_ACCOUNT = 1;
    public static final int THIRD_ACCOUNT = 2;

    // constructors

    public MaterialAccount(Resources resources, String title, String subTitle, int photo, Bitmap background) {
        this.title = title;
        this.subTitle = subTitle;
        this.resources = resources;

        // resize and caching bitmap
        new ResizePhotoResource().execute(photo);
        if (background != null) {
            new ResizeBackgroundBitmap().execute(background);
        }

    }

    public MaterialAccount(Resources resources, String title, String subTitle, int photo, int background) {
        this.title = title;
        this.subTitle = subTitle;
        this.resources = resources;

        // resize and caching bitmap
        new ResizePhotoResource().execute(photo);
        new ResizeBackgroundResource().execute(background);
    }

    public MaterialAccount(Resources resources, String title, String subTitle, Bitmap photo, int background) {
        this.title = title;
        this.subTitle = subTitle;
        this.resources = resources;

        // resize and caching bitmap
        if (photo != null) {
            new ResizePhotoBitmap().execute(photo);
        }
        new ResizeBackgroundResource().execute(background);
    }

    public MaterialAccount(Resources resources, String title, String subTitle, Bitmap photo, Bitmap background) {
        this.title = title;
        this.subTitle = subTitle;
        this.resources = resources;

        // resize and caching bitmap
        if (photo != null) {
            new ResizePhotoBitmap().execute(photo);
        }
        if (background != null) {
            new ResizeBackgroundBitmap().execute(background);
        }
    }

    // setter

    public void setPhoto(int photo) {
        new ResizePhotoResource().execute(photo);
    }

    public void setPhoto(Bitmap photo) {
        new ResizePhotoBitmap().execute(photo);
    }

    public void setBackground(Bitmap background) {
        new ResizeBackgroundBitmap().execute(background);
    }

    public void setBackground(int background) {
        new ResizeBackgroundResource().execute(background);
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setSubTitle(String subTitle) {
        this.subTitle = subTitle;
    }

    public void setAccountNumber(int number) {
        this.accountNumber = number;
    }

    public void setAccountListener(OnAccountDataLoaded listener) {
        this.listener = listener;
    }

    public MaterialAccount setNotifications(int number) {
        hasNotifications = true;
        notifications = String.valueOf(number);

        if (number >= 100) {
            notifications = "99+";
        }
        if (number < 0) {
            notifications = "0";
        }

        return this;

    }

    // getter

    public Drawable getPhoto() {
        return photo;
    }

    public Drawable getBackground() {
        return background;
    }

    public Drawable getCircularPhoto() {
        return circularPhoto;
    }

    public String getTitle() {
        return title;
    }

    public String getSubTitle() {
        return subTitle;
    }

    public int getAccountNumber() {
        return accountNumber;
    }

    public View getSectionView(Context ctx, Typeface font, MaterialSectionListener listener, boolean rippleSupport, boolean rippleDelayClick, int position) {
        if (sectionView == null) {
            sectionView = new MaterialSection(ctx, MaterialSection.ICON_40DP, rippleSupport, rippleDelayClick, MaterialSection.TARGET_LISTENER);
            sectionView.useRealColor();
        }

        // set dei dati passati
        sectionView.setTypeface(font);
        sectionView.setOnClickListener(listener);

        // set dei dati dell'account
        sectionView.setIcon(getCircularPhoto());
        sectionView.setTitle(getTitle());
        if (hasNotifications) {
            sectionView.setNotificationsText(notifications);
        }
        sectionView.setAccountPosition(position);

        return sectionView.getView();
    }

    // custom

    public void recycle() {
        Utils.recycleDrawable(photo);
        Utils.recycleDrawable(circularPhoto);
        Utils.recycleDrawable(background);
    }

    public interface OnAccountDataLoaded {
        void onUserPhotoLoaded(MaterialAccount account);

        void onBackgroundLoaded(MaterialAccount account);
    }

    // asynctasks

    private class ResizePhotoResource extends AsyncTask<Integer, Void, BitmapDrawable> {

        @Override
        protected BitmapDrawable doInBackground(Integer... params) {
            Point photoSize = Utils.getUserPhotoSize(resources);

            Bitmap photo = Utils.resizeBitmapFromResource(resources, params[0], photoSize.x, photoSize.y);

            circularPhoto = new BitmapDrawable(resources, Utils.getCroppedBitmapDrawable(photo));
            return new BitmapDrawable(resources, photo);
        }

        @Override
        protected void onPostExecute(BitmapDrawable drawable) {
            photo = drawable;

            if (listener != null) {
                listener.onUserPhotoLoaded(MaterialAccount.this);
            }
        }
    }

    private class ResizePhotoBitmap extends AsyncTask<Bitmap, Void, BitmapDrawable> {

        @Override
        protected BitmapDrawable doInBackground(Bitmap... params) {
            Point photoSize = Utils.getUserPhotoSize(resources);

            Bitmap photo = Utils.resizeBitmap(params[0], photoSize.x, photoSize.y);

            circularPhoto = new BitmapDrawable(resources, Utils.getCroppedBitmapDrawable(photo));
            return new BitmapDrawable(resources, photo);
        }

        @Override
        protected void onPostExecute(BitmapDrawable drawable) {
            photo = drawable;

            if (listener != null) {
                listener.onUserPhotoLoaded(MaterialAccount.this);
            }
        }
    }

    private class ResizeBackgroundResource extends AsyncTask<Integer, Void, BitmapDrawable> {
        @Override
        protected BitmapDrawable doInBackground(Integer... params) {
            Point backSize = Utils.getBackgroundSize(resources);

            Bitmap back = Utils.resizeBitmapFromResource(resources, params[0], backSize.x, backSize.y);

            return new BitmapDrawable(resources, back);
        }

        @Override
        protected void onPostExecute(BitmapDrawable drawable) {
            background = drawable;

            if (listener != null) {
                listener.onBackgroundLoaded(MaterialAccount.this);
            }
        }
    }

    private class ResizeBackgroundBitmap extends AsyncTask<Bitmap, Void, BitmapDrawable> {

        @Override
        protected BitmapDrawable doInBackground(Bitmap... params) {
            Point backSize = Utils.getBackgroundSize(resources);

            Bitmap back = Utils.resizeBitmap(params[0], backSize.x, backSize.y);

            return new BitmapDrawable(resources, back);
        }

        @Override
        protected void onPostExecute(BitmapDrawable drawable) {
            background = drawable;

            if (listener != null) {
                listener.onBackgroundLoaded(MaterialAccount.this);
            }
        }
    }
}

@@ -6537,32 +6537,297 @@
  photoSize.y);%0A%0A
+            Bitmap croppedBitmap;%0A            try %7B%0A                croppedBitmap = Utils.getCroppedBitmapDrawable(photo);%0A            %7D catch (RuntimeException e) %7B%0A                // this will just show an empty bitmap%0A                return null;%0A            %7D%0A%0A
             circ
@@ -6864,34 +6864,25 @@
 (resources, 
-Utils.getC
+c
 roppedBitmap
@@ -6877,39 +6877,24 @@
 roppedBitmap
-Drawable(photo)
 );%0A         

Fix crash