package com.adamnickle.deck; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.SeekBar; import com.larswerkman.holocolorpicker.ColorPicker; import com.larswerkman.holocolorpicker.SVBar; import java.io.File; import de.keyboardsurfer.android.widget.crouton.Style; public class ScratchPadFragment extends Fragment { private ViewGroup mContent; private ScratchPadView mScratchPadView; private DrawerLayout mDrawerLayout; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setRetainInstance( true ); setHasOptionsMenu( false ); } @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) { if( mContent == null ) { mContent = (ViewGroup) inflater.inflate( R.layout.scratchpad_layout, container, false ); mScratchPadView = (ScratchPadView) mContent.findViewById( R.id.scratchpadView ); } else { ( (ViewGroup) mContent.getParent() ).removeView( mContent ); } return mContent; } @Override public void onActivityCreated( Bundle savedInstanceState ) { super.onActivityCreated( savedInstanceState ); mDrawerLayout = (DrawerLayout) getActivity().findViewById( R.id.drawerLayout ); } @Override public void onCreateOptionsMenu( Menu menu, MenuInflater inflater ) { inflater.inflate( R.menu.scratch_pad, menu ); final Context context = getActivity(); menu.findItem( R.id.actionSaveScratchPad ).setIcon( Icons.getScratchPadSave( context ) ); menu.findItem( R.id.actionLoadScratchPad ).setIcon( Icons.getScratchPadLoad( context ) ); menu.findItem( R.id.actionClearScratchPad ).setIcon( Icons.getDeleteAction( context ) ); menu.findItem( R.id.actionCloseScratchPad ).setIcon( Icons.getCloseAction( context ) ); menu.findItem( R.id.actionUndo ).setIcon( Icons.getScratchPadUndo( context ) ); menu.findItem( R.id.actionRedo ).setIcon( Icons.getScratchPadRedo( context ) ); menu.findItem( R.id.actionEraser ).setIcon( Icons.getScratchPadEraser( context ) ); menu.findItem( R.id.actionPen ).setIcon( Icons.getScratchPadPen( context ) ); } @Override public void onPrepareOptionsMenu( Menu menu ) { final boolean isEraser = mScratchPadView.isEraser(); menu.findItem( R.id.actionEraser ).setVisible( !isEraser ); menu.findItem( R.id.actionPen ).setVisible( isEraser ); menu.findItem( R.id.actionSetPaintColor ).setVisible( !isEraser ); menu.findItem( R.id.actionUndo ).setEnabled( mScratchPadView.canUndo() ); menu.findItem( R.id.actionRedo ).setEnabled( mScratchPadView.canRedo() ); } @Override public boolean onOptionsItemSelected( MenuItem item ) { switch( item.getItemId() ) { case R.id.actionPen: case R.id.actionEraser: mScratchPadView.toggleEraser(); getActivity().invalidateOptionsMenu(); return true; case R.id.actionCloseScratchPad: mDrawerLayout.closeDrawer( GravityCompat.END ); return true; case R.id.actionClearScratchPad: mScratchPadView.clearDrawing(); return true; case R.id.actionSaveScratchPad: handleSaveScratchPadClick(); return true; case R.id.actionLoadScratchPad: handleLoadScratchPadClick(); return true; case R.id.actionSetStrokeSize: handleSetStrokeSize(); return true; case R.id.actionSetPaintColor: handleSetPaintColor(); return true; case R.id.actionUndo: mScratchPadView.undo(); return true; case R.id.actionRedo: mScratchPadView.redo(); return true; default: return super.onOptionsItemSelected( item ); } } private void handleSetPaintColor() { final ViewGroup contentView = (ViewGroup) LayoutInflater.from( getActivity() ).inflate( R.layout.color_picker_layout, null ); final ColorPicker colorPicker = (ColorPicker) contentView.findViewById( R.id.colorPicker ); final SVBar svBar = (SVBar) contentView.findViewById( R.id.saturationValueBar ); colorPicker.addSVBar( svBar ); colorPicker.setColor( mScratchPadView.getPaintColor() ); colorPicker.setOldCenterColor( mScratchPadView.getPaintColor() ); DialogHelper .createBlankAlertDialog( getActivity(), "Select paint color:" ) .setView( contentView ) .setNegativeButton( "Cancel", null ) .setPositiveButton( "OK", new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialogInterface, int i ) { mScratchPadView.setPaintColor( colorPicker.getColor() ); } } ).show(); } private void handleSetStrokeSize() { final ViewGroup contentView = (ViewGroup) LayoutInflater.from( getActivity() ).inflate( R.layout.seekbar_popup, null ); final SeekBar seekBar = (SeekBar) contentView.findViewById( R.id.seekBar ); final ImageView sizeDisplay = (ImageView) contentView.findViewById( R.id.sizeDisplay ); int initialStrokeSize = mScratchPadView.getStrokeSize(); final CircleDrawable circleDrawable = new CircleDrawable(); circleDrawable.setColor( mScratchPadView.getPaintColor() ); circleDrawable.setSize( initialStrokeSize ); sizeDisplay.setImageDrawable( circleDrawable ); seekBar.setMax( getResources().getDimensionPixelSize( R.dimen.max_stroke_size ) ); seekBar.setProgress( initialStrokeSize ); seekBar.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged( SeekBar seekBar, int progress, boolean userChanged ) { circleDrawable.setSize( progress ); } @Override public void onStartTrackingTouch( SeekBar seekBar ) { } @Override public void onStopTrackingTouch( SeekBar seekBar ) { } } ); DialogHelper .createBlankAlertDialog( getActivity(), "Select paint size:" ) .setView( contentView ) .setNegativeButton( "Cancel", null ) .setPositiveButton( "OK", new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialogInterface, int i ) { mScratchPadView.setStrokeSize( seekBar.getProgress() ); } } ) .show(); } private void handleSaveScratchPadClick() { ScratchPadIO.saveScratchPad( getActivity(), mScratchPadView.getBitmap(), new ScratchPadIO.Callback() { @Override public void onSuccess() { DialogHelper.displayNotification( getActivity(), "Scratch Pad save successful.", Style.CONFIRM ); } @Override public void onFail() { DialogHelper.displayNotification( getActivity(), "Scratch Pad save not successful.", Style.ALERT ); } } ); } private void handleLoadScratchPadClick() { final ScratchPadIO.ScratchPadCardAdapter adapter = ScratchPadIO.getScratchPadCards( getActivity() ); if( adapter != null ) { final AlertDialog dialog = DialogHelper .createBlankAlertDialog( getActivity(), "Select scratch pad to load:" ) .setPositiveButton( "Close", null ) .create(); final RecyclerView recyclerView = new RecyclerView( getActivity() ); recyclerView.setLayoutManager( new LinearLayoutManager( getActivity() ) ); recyclerView.setAdapter( adapter ); dialog.setView( recyclerView ); adapter.setScratchPadOnClickListener( new ScratchPadIO.ScratchPadCardAdapter.ScratchPadOnClickListener() { @Override public void onScratchPadClick( File scratchPad ) { Bitmap bitmap = ScratchPadIO.openScratchPad( scratchPad ); if( bitmap != null ) { mScratchPadView.setScratchPadBitmap( bitmap ); DialogHelper.displayNotification( getActivity(), "Scratch pad load successful.", Style.CONFIRM ); }else { DialogHelper.displayNotification( getActivity(), "Scratch pad load unsuccessful.", Style.ALERT ); } dialog.dismiss(); } } ); adapter.registerAdapterDataObserver( new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { if( recyclerView.getAdapter().getItemCount() == 0 ) { if( dialog.isShowing() ) { dialog.dismiss(); handleLoadScratchPadClick(); } } } } ); recyclerView.setItemAnimator( new DefaultItemAnimator() ); dialog.show(); } else { DialogHelper.showPopup( getActivity(), "Select scratch pad to load:", "There are no scratch pads to load.", "OK" ); } } public static class CircleDrawable extends Drawable { private final Paint mPaint; public CircleDrawable() { mPaint = new Paint(); mPaint.setAntiAlias( true ); mPaint.setStyle( Paint.Style.STROKE ); mPaint.setStrokeJoin( Paint.Join.ROUND ); mPaint.setStrokeCap( Paint.Cap.ROUND ); } public void setColor( int color ) { mPaint.setColor( color ); invalidateSelf(); } public void setSize( int size ) { mPaint.setStrokeWidth( size ); invalidateSelf(); } @Override public void draw( Canvas canvas ) { final float x = canvas.getWidth() / 2.0f; final float y = canvas.getHeight() / 2.0f; canvas.drawCircle( x, y, 1, mPaint ); } @Override public void setAlpha( int i ) { mPaint.setAlpha( i ); invalidateSelf(); } @Override public void setColorFilter( ColorFilter colorFilter ) { mPaint.setColorFilter( colorFilter ); invalidateSelf(); } @Override public int getOpacity() { return mPaint.getAlpha(); } } }