From 0e4a03c94a1a7869eeaeca995cfa5f84c89fe80b Mon Sep 17 00:00:00 2001 From: ErikWaegerle Date: Tue, 30 Jun 2020 00:00:52 +0200 Subject: [PATCH] Create the CreateSudokuButtonLayout class. Is identical to the SudokuSpecialButtonLayout slight modification to cover different cases. Provides the display of the different button types. --- .../view/CreateSudokuSpecialButtonLayout.java | 224 ++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 app/src/main/java/org/secuso/privacyfriendlysudoku/ui/view/CreateSudokuSpecialButtonLayout.java diff --git a/app/src/main/java/org/secuso/privacyfriendlysudoku/ui/view/CreateSudokuSpecialButtonLayout.java b/app/src/main/java/org/secuso/privacyfriendlysudoku/ui/view/CreateSudokuSpecialButtonLayout.java new file mode 100644 index 0000000..3fe8168 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlysudoku/ui/view/CreateSudokuSpecialButtonLayout.java @@ -0,0 +1,224 @@ +package org.secuso.privacyfriendlysudoku.ui.view; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.FragmentManager; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.Toast; + +import androidx.core.content.ContextCompat; + +import org.secuso.privacyfriendlysudoku.controller.GameController; +import org.secuso.privacyfriendlysudoku.game.listener.IHighlightChangedListener; +import org.secuso.privacyfriendlysudoku.ui.GameActivity; +import org.secuso.privacyfriendlysudoku.ui.listener.IHintDialogFragmentListener; + +import java.util.LinkedList; + +import static org.secuso.privacyfriendlysudoku.ui.view.CreateSudokuButtonType.Spacer; +import static org.secuso.privacyfriendlysudoku.ui.view.CreateSudokuButtonType.getSpecialButtons; + +/** + * Created by TMZ_LToP on 17.11.2015. + */ +public class CreateSudokuSpecialButtonLayout extends LinearLayout implements IHighlightChangedListener { + + + CreateSudokuSpecialButton[] fixedButtons; + public int fixedButtonsCount = getSpecialButtons().size(); + GameController gameController; + SudokuKeyboardLayout keyboard; + Bitmap bitMap,bitResult; + Canvas canvas; + FragmentManager fragmentManager; + Context context; + + OnClickListener listener = new OnClickListener() { + @Override + public void onClick(View v) { + if(v instanceof CreateSudokuSpecialButton) { + CreateSudokuSpecialButton btn = (CreateSudokuSpecialButton)v; + + //int row = gameController.getSelectedRow(); + //int col = gameController.getSelectedCol(); + + switch(btn.getType()) { + case Delete: + gameController.deleteSelectedCellsValue(); + break; + case NoteToggle: + // rotates the Drawable + gameController.setNoteStatus(!gameController.getNoteStatus()); + keyboard.updateNotesEnabled(); + onHighlightChanged(); + break; + case Do: + gameController.ReDo(); + break; + case Undo: + gameController.UnDo(); + break; + case Finalize: + default: + break; + } + } + } + }; + + + public CreateSudokuSpecialButtonLayout(Context context, AttributeSet attrs) { + super(context, attrs); + setWeightSum(fixedButtonsCount); + this.context = context; + } + + public void setButtonsEnabled(boolean enabled) { + for(CreateSudokuSpecialButton b : fixedButtons) { + b.setEnabled(enabled); + } + } + + public void setButtons(int width, GameController gc, SudokuKeyboardLayout key, FragmentManager fm, int orientation, Context cxt) { + fragmentManager = fm; + keyboard=key; + gameController = gc; + context = cxt; + if(gameController != null) { + gameController.registerHighlightChangedListener(this); + } + fixedButtons = new CreateSudokuSpecialButton[fixedButtonsCount]; + LayoutParams p; + int i = 0; + //ArrayList type = (ArrayList) SudokuButtonType.getSpecialButtons(); + for (CreateSudokuButtonType t : getSpecialButtons()){ + fixedButtons[i] = new CreateSudokuSpecialButton(getContext(),null); + if(orientation == LinearLayout.HORIZONTAL) { + p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1); + } else { + p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1); + fixedButtons[i].setPadding(25, 0, 25, 0); + } + p.setMargins(5, 5, 5, 5); + + //int width2 =width/(fixedButtonsCount); + //p.width= width2-15; + if(t == Spacer) { + fixedButtons[i].setVisibility(View.INVISIBLE); + } + /*if(t == SudokuButtonType.Do && !gameController.isRedoAvailable()) { + fixedButtons[i].setEnabled(false); + } + if(t == SudokuButtonType.Undo && !gameController.isUndoAvailable()) { + fixedButtons[i].setEnabled(false); + }*/ + fixedButtons[i].setLayoutParams(p); + fixedButtons[i].setType(t); + fixedButtons[i].setImageDrawable(getResources().getDrawable(t.getResID())); + // fixedButtons[i].setText(SudokuButtonType.getName(t)); + fixedButtons[i].setScaleType(ImageView.ScaleType.CENTER); + fixedButtons[i].setAdjustViewBounds(true); + fixedButtons[i].setOnClickListener(listener); + fixedButtons[i].setBackgroundResource(R.drawable.numpad_highlighted_four); + addView(fixedButtons[i]); + + if(fixedButtons[i].getVisibility() == View.VISIBLE) { + Drawable drawable = ContextCompat.getDrawable(context, fixedButtons[i].getType().getResID()); + setUpVectorDrawable(drawable); + drawable.draw(canvas); + fixedButtons[i].setImageBitmap(bitResult); + } + i++; + } + + } + + @Override + public void onHighlightChanged() { + for(int i = 0; i < fixedButtons.length; i++) { + switch(fixedButtons[i].getType()) { + case Undo: + fixedButtons[i].setBackgroundResource(gameController.isUndoAvailable() ? + R.drawable.numpad_highlighted_four : R.drawable.inactive_button); + break; + case Do: + fixedButtons[i].setBackgroundResource(gameController.isRedoAvailable() ? + R.drawable.numpad_highlighted_four : R.drawable.inactive_button); + break; + case NoteToggle: + Drawable drawable = ContextCompat.getDrawable(context, fixedButtons[i].getType().getResID()); + setUpVectorDrawable(drawable); + + canvas.rotate(gameController.getNoteStatus() ? 45.0f : 0.0f, bitMap.getWidth()/2, bitMap.getHeight()/2); + canvas.drawBitmap(bitMap, 0, 0, null); + drawable.draw(canvas); + + fixedButtons[i].setImageBitmap(bitResult); + fixedButtons[i].setBackgroundResource(gameController.getNoteStatus() ? R.drawable.numpad_highlighted_three : R.drawable.numpad_highlighted_four); + + keyboard.updateNotesEnabled(); + + break; + default: + break; + } + } + } + + private void setUpVectorDrawable(Drawable drawable) { + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + bitMap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + bitResult = Bitmap.createBitmap(bitMap.getWidth(), bitMap.getHeight(), Bitmap.Config.ARGB_8888); + + canvas = new Canvas(bitResult); + } + /* + public static class HintConfirmationDialog extends DialogFragment { + + LinkedList listeners = new LinkedList<>(); + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + // Verify that the host activity implements the callback interface + if(activity instanceof IHintDialogFragmentListener) { + listeners.add((IHintDialogFragmentListener) activity); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + // Use the Builder class for convenient dialog construction + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_Dialog); + builder.setMessage(R.string.hint_confirmation) + .setPositiveButton(R.string.hint_confirmation_confirm, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + for(IHintDialogFragmentListener l : listeners) { + l.onHintDialogPositiveClick(); + } + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // User cancelled the dialog + } + }); + return builder.create(); + } + } + */ +}