package com.samsung.spensdk.example.scratcheffect;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.samsung.samm.common.SObjectStroke;
import com.samsung.spen.lib.image.SPenImageFilterConstants;
import com.samsung.spensdk.SCanvasConstants;
import com.samsung.spensdk.SCanvasView;
import com.samsung.spensdk.applistener.SCanvasInitializeListener;
import com.samsung.spensdk.example.R;
import com.samsung.spensdk.example.tools.SPenSDKUtils;
public class SPen_Example_ScratchEffect extends Activity {
private final String TAG = "SPenSDK ScratchEffect";
private final int MENU_IMAGE_OPERATION = Menu.FIRST + 1;
private final int MENU_IMAGE_OPERATION_LEVEL = Menu.FIRST + 2;
private final int MENU_CLEAR_ALL = Menu.FIRST + 3;
private final int MENU_RESET = Menu.FIRST + 4;
private SCanvasView mSCanvas1;
private SCanvasView mSCanvas2;
private SCanvasView mSCanvas3;
// Conversion array to map menu index to Image Filter Index (only 10 Image filter)
private int[] imageOperationByIndex = {SPenImageFilterConstants.FILTER_GRAY,
SPenImageFilterConstants.FILTER_NEGATIVE, SPenImageFilterConstants.FILTER_DARK, SPenImageFilterConstants.FILTER_COLORIZE,
SPenImageFilterConstants.FILTER_BLUR, SPenImageFilterConstants.FILTER_PENCILSKETCH, SPenImageFilterConstants.FILTER_RETRO,
SPenImageFilterConstants.FILTER_MOSAIC, SPenImageFilterConstants.FILTER_MAGICPEN, SPenImageFilterConstants.FILTER_CARTOONIZE,};
private int mImageOperationIndex = 4; // IMAGE_OPERATION_BLUR
private int mImageOperationLevelIndex = 2; // OPERATION_LEVEL_MEDIUM
private int mImageOperation = SPenImageFilterConstants.FILTER_BLUR;
private int mImageOperationLevel = SPenImageFilterConstants.FILTER_LEVEL_LARGE;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewer_scratch);
mSCanvas1 = (SCanvasView) findViewById(R.id.canvas_view1);
mSCanvas2 = (SCanvasView) findViewById(R.id.canvas_view2);
mSCanvas3 = (SCanvasView) findViewById(R.id.canvas_view3);
//====================================================================================
//
// Set Callback Listener(Interface)
//
//====================================================================================
//------------------------------------------------
// SCanvasLayout Initialization Listener
//------------------------------------------------
SCanvasInitializeListener scanvasInitializeListener1 = new SCanvasInitializeListener() {
@Override
public void onInitialized() {
mSCanvas1.setCanvasZoomEnable(false);
mSCanvas1.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mSCanvas1.setEraserStrokeSetting(SObjectStroke.SAMM_DEFAULT_MAX_ERASERSIZE);
// Set Clear Image Bitmap
// It is better to use the bitmap whose size is same as those of canvas.
// If it is different, setClearImageBitmap() resize the bitmap inside.
Bitmap bmScratch = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_pattern);
mSCanvas1.setClearImageBitmap(bmScratch, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
}
};
SCanvasInitializeListener scanvasInitializeListener2 = new SCanvasInitializeListener() {
@Override
public void onInitialized() {
mSCanvas2.setCanvasZoomEnable(false);
mSCanvas2.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mSCanvas2.setEraserStrokeSetting(SObjectStroke.SAMM_DEFAULT_MAX_ERASERSIZE);
// Set Clear Image Bitmap
// It is better to use the bitmap whose size is same as those of canvas.
// If it is different, setClearImageBitmap() resize the bitmap inside.
Bitmap bmScratch = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_pattern);
mSCanvas2.setClearImageBitmap(bmScratch, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
}
};
SCanvasInitializeListener scanvasInitializeListener3 = new SCanvasInitializeListener() {
@Override
public void onInitialized() {
mSCanvas3.setCanvasZoomEnable(false);
mSCanvas3.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mSCanvas3.setEraserStrokeSetting(SObjectStroke.SAMM_DEFAULT_MAX_ERASERSIZE);
// Set Clear Image Bitmap
// It is better to use the bitmap whose size is same as those of canvas.
// If it is different, setClearImageBitmap() resize the bitmap inside.
Bitmap bmScratch = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_bg);
mSCanvas3.setClearImageBitmap(bmScratch, mImageOperation, mImageOperationLevel);
}
};
mSCanvas1.setSCanvasInitializeListener(scanvasInitializeListener1);
mSCanvas2.setSCanvasInitializeListener(scanvasInitializeListener2);
mSCanvas3.setSCanvasInitializeListener(scanvasInitializeListener3);
// Caution:
// Do NOT load file or start animation here because we don't know canvas size here.
// Start such SCanvasView Task at onInitialized() of SCanvasInitializeListener
}
@Override
protected void onDestroy() {
super.onDestroy();
// Release SCanvasView resources
if(!mSCanvas1.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
if(!mSCanvas2.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
if(!mSCanvas3.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
}
@Override
public void onBackPressed() {
SPenSDKUtils.alertActivityFinish(this, "Exit");
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
menu.add(MENU_IMAGE_OPERATION, MENU_IMAGE_OPERATION, Menu.NONE, "Operation");
menu.add(MENU_IMAGE_OPERATION_LEVEL, MENU_IMAGE_OPERATION_LEVEL, Menu.NONE, "Level");
menu.add(MENU_CLEAR_ALL, MENU_CLEAR_ALL, Menu.NONE, "Clear All");
menu.add(MENU_RESET, MENU_RESET, Menu.NONE, "Reset");
return super.onCreateOptionsMenu(menu);
}
void resetClearImage(boolean bClearAll, int nImageOperationOption, int nLevel){
if(bClearAll){
mSCanvas1.setClearImageBitmap(null, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
mSCanvas2.setClearImageBitmap(null, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
mSCanvas3.setClearImageBitmap(null, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
}
else{
// Set Clear Image Bitmap
// It is better to use the bitmap whose size is same as those of canvas.
// If it is different, setClearImageBitmap() resize the bitmap inside.
Bitmap bmScratch = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_pattern);
mSCanvas1.setClearImageBitmap(bmScratch, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
mSCanvas2.setClearImageBitmap(bmScratch, SPenImageFilterConstants.FILTER_ORIGINAL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
Bitmap bmScratchPic = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_bg);
mSCanvas3.setClearImageBitmap(bmScratchPic, nImageOperationOption, nLevel);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
super.onOptionsItemSelected(item);
switch(item.getItemId()) {
case MENU_CLEAR_ALL:
resetClearImage(true, mImageOperation, mImageOperationLevel);
break;
case MENU_RESET:
resetClearImage(false, mImageOperation, mImageOperationLevel);
break;
case MENU_IMAGE_OPERATION:
new AlertDialog.Builder(this)
.setTitle("Image Operation")
.setSingleChoiceItems(R.array.imageoperation_simple, mImageOperationIndex, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(mImageOperation != imageOperationByIndex[which]){
applyImageOperation(which);
}
dialog.dismiss();
}
})
.show();
break;
case MENU_IMAGE_OPERATION_LEVEL:
new AlertDialog.Builder(this)
.setTitle("Image Operation")
.setSingleChoiceItems(R.array.imageoperation_level, mImageOperationLevel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(mImageOperationLevel != which){
applyOperationLevel(which);
}
dialog.dismiss();
}
})
.show();
break;
}
return true;
}
private void applyImageOperation(final int whichValue){
new AlertDialog.Builder(this)
.setTitle("Change Image Operation?")
.setMessage("Drawing will be cleared.")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mImageOperationIndex = whichValue;
mImageOperation = imageOperationByIndex[mImageOperationIndex];
Bitmap bmScratchPic = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_bg);
mSCanvas3.setClearImageBitmap(bmScratchPic, mImageOperation, mImageOperationLevel);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
private void applyOperationLevel(final int whichValue){
new AlertDialog.Builder(this)
.setTitle("Change Operation Level?")
.setMessage("Drawing will be cleared.")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mImageOperationLevelIndex = whichValue;
mImageOperationLevel = mImageOperationLevelIndex; // same as it is.
Bitmap bmScratchPic = BitmapFactory.decodeResource(getResources(), R.drawable.scratch_bg);
mSCanvas3.setClearImageBitmap(bmScratchPic, mImageOperation, mImageOperationLevel);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
}