// Path: app/src/main/java/studio/androiddev/puzzle/PuzzleApplication.java
// public class PuzzleApplication extends Application{
// 
//     private static Context mContext;
// 
//     private static User mUser;
// 
//     private static DishManager dm;
// 
//     public static int getLevel() {
//         return level;
//     }
// 
//     public static void setLevel(int level) {
//         if(level < 3) return;
//         PuzzleApplication.level = level;
//         initDishManager();
//     }
// 
//     private static int level = 4;
// 
//     @Override
//     public void onCreate(){
//         super.onCreate();
//         LeakCanary.install(this);
//         Bmob.initialize(this, StaticValue.bmobId);
//         if(mContext == null) mContext = getApplicationContext();
//         SharedPreferences pref = getSharedPreferences(StaticValue.SP_NAME, MODE_PRIVATE);
//         setLevel(pref.getInt(StaticValue.SP_LEVEL, 4));
//     }
// 
//     public static User getmUser() {
//         return mUser;
//     }
// 
//     public static void setmUser(User mUser) {
//         PuzzleApplication.mUser = mUser;
//     }
// 
//     public static Context getAppContext(){
//         return mContext;
//     }
// 
//     public static void initDishManager(){
//         dm = new DishManager(level);
//     }
// 
//     public static DishManager getDishManager(){
//         return dm;
//     }
// }
// 
// Path: app/src/main/java/studio/androiddev/puzzle/event/GameSuccessEvent.java
// public class GameSuccessEvent {
// }
// 
// Path: app/src/main/java/studio/androiddev/puzzle/event/PieceMoveSuccessEvent.java
// public class PieceMoveSuccessEvent {
// 
//     private int index;
//     public PieceMoveSuccessEvent(int index){
//         this.index = index;
//     }
// 
//     public int getIndex(){
//         return index;
//     }
// }
// 
// Path: app/src/main/java/studio/androiddev/puzzle/utils/DensityUtil.java
// public class DensityUtil {
// 
//     /**
//      * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
//      */
//     public static int dip2px(Context context, float dpValue) {
//         final float scale = context.getResources().getDisplayMetrics().density;
//         return (int) (dpValue * scale + 0.5f);
//     }
// 
//     /**
//      * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
//      */
//     public static int px2dip(Context context, float pxValue) {
//         final float scale = context.getResources().getDisplayMetrics().density;
//         return (int) (pxValue / scale + 0.5f);
//     }
// 
//     public static float getScale(Context context){
//         return context.getResources().getDisplayMetrics().density;
//     }
// }


import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.widget.ImageView;
import org.greenrobot.eventbus.EventBus;
import studio.androiddev.puzzle.PuzzleApplication;
import studio.androiddev.puzzle.event.GameSuccessEvent;
import studio.androiddev.puzzle.event.PieceMoveSuccessEvent;
import studio.androiddev.puzzle.utils.DensityUtil;

        return new RectF(
                (i % mLevel) * rectWidth,
                (i / mLevel) * rectHeight,
                (i % mLevel + 1) * rectWidth,
                (i / mLevel + 1) * rectHeight);
    }

    /**
     * 当玩家将拼块移动到正确位置时调用，更新拼盘显示状态
     * @param i 正确的拼块下标
     */
    public void updatePiece(int i){
        if(i < 0 || i > mLevel * mLevel) return;

        mIndex[i] = true;
        refreshDish();
        EventBus.getDefault().post(new PieceMoveSuccessEvent(i));
        mLeftSize--;
        if(mLeftSize == 0){
            EventBus.getDefault().post(new GameSuccessEvent());
        }
    }

    /**
     * 根据拼盘大小和游戏难度初始化基本遮罩拼块
     */
    private void initMask(){

        rectWidth = DensityUtil.dip2px(PuzzleApplication.getAppContext(), (float) DISH_WIDTH / mLevel);
// Path: app/src/main/java/studio/androiddev/puzzle/PuzzleApplication.java
// public class PuzzleApplication extends Application{
// 
//     private static Context mContext;
// 
//     private static User mUser;
// 
//     private static DishManager dm;
// 
//     public static int getLevel() {
//         return level;
//     }
// 
//     public static void setLevel(int level) {
//         if(level < 3) return;
//         PuzzleApplication.level = level;
//         initDishManager();
//     }
// 
//     private static int level = 4;
// 
//     @Override
//     public void onCreate(){
//         super.onCreate();
//         LeakCanary.install(this);
//         Bmob.initialize(this, StaticValue.bmobId);
//         if(mContext == null) mContext = getApplicationContext();
//         SharedPreferences pref = getSharedPreferences(StaticValue.SP_NAME, MODE_PRIVATE);
//         setLevel(pref.getInt(StaticValue.SP_LEVEL, 4));
//     }
// 
//     public static User getmUser() {
//         return mUser;
//     }
// 
//     public static void setmUser(User mUser) {
//         PuzzleApplication.mUser = mUser;
//     }
// 
//     public static Context getAppContext(){
//         return mContext;
//     }
// 
//     public static void initDishManager(){
//         dm = new DishManager(level);
//     }
// 
//     public static DishManager getDishManager(){
//         return dm;
//     }
// }
// 
// Path: app/src/main/java/studio/androiddev/puzzle/event/GameSuccessEvent.java
// public class GameSuccessEvent {
// }
// 
// Path: app/src/main/java/studio/androiddev/puzzle/event/PieceMoveSuccessEvent.java
// public class PieceMoveSuccessEvent {
// 
//     private int index;
//     public PieceMoveSuccessEvent(int index){
//         this.index = index;
//     }
// 
//     public int getIndex(){
//         return index;
//     }
// }
// 
// Path: app/src/main/java/studio/androiddev/puzzle/utils/DensityUtil.java
// public class DensityUtil {
// 
//     /**
//      * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
//      */
//     public static int dip2px(Context context, float dpValue) {
//         final float scale = context.getResources().getDisplayMetrics().density;
//         return (int) (dpValue * scale + 0.5f);
//     }
// 
//     /**
//      * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
//      */
//     public static int px2dip(Context context, float pxValue) {
//         final float scale = context.getResources().getDisplayMetrics().density;
//         return (int) (pxValue / scale + 0.5f);
//     }
// 
//     public static float getScale(Context context){
//         return context.getResources().getDisplayMetrics().density;
//     }
// }


// Path: app/src/main/java/studio/androiddev/puzzle/dish/DishManager.java
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.widget.ImageView;
import org.greenrobot.eventbus.EventBus;
import studio.androiddev.puzzle.PuzzleApplication;
import studio.androiddev.puzzle.event.GameSuccessEvent;
import studio.androiddev.puzzle.event.PieceMoveSuccessEvent;
import studio.androiddev.puzzle.utils.DensityUtil;


        return new RectF(
                (i % mLevel) * rectWidth,
                (i / mLevel) * rectHeight,
                (i % mLevel + 1) * rectWidth,
                (i / mLevel + 1) * rectHeight);
    }

    /**
     * 当玩家将拼块移动到正确位置时调用，更新拼盘显示状态
     * @param i 正确的拼块下标
     */
    public void updatePiece(int i){
        if(i < 0 || i > mLevel * mLevel) return;

        mIndex[i] = true;
        refreshDish();
        EventBus.getDefault().post(new PieceMoveSuccessEvent(i));
        mLeftSize--;
        if(mLeftSize == 0){
            EventBus.getDefault().post(new GameSuccessEvent());
        }
    }

    /**
     * 根据拼盘大小和游戏难度初始化基本遮罩拼块
     */
    private void initMask(){

        rectWidth = DensityUtil.dip2px(PuzzleApplication.getAppContext(), (float) DISH_WIDTH / mLevel);
        rectHeight = DensityUtil.dip2px(PuzzleApplication.getAppContext(), (float) DISH_HEIGHT / mLevel);