package com.samsung.spensdk.example.settingview;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.samsung.samm.common.SAMMLibConstants;
import com.samsung.samm.common.SObjectStroke;
import com.samsung.samm.common.SObjectText;
import com.samsung.spen.settings.SettingFillingInfo;
import com.samsung.spen.settings.SettingStrokeInfo;
import com.samsung.spen.settings.SettingTextInfo;
import com.samsung.spensdk.SCanvasConstants;
import com.samsung.spensdk.SCanvasView;
import com.samsung.spensdk.applistener.ColorPickerColorChangeListener;
import com.samsung.spensdk.applistener.HistoryUpdateListener;
import com.samsung.spensdk.applistener.SCanvasInitializeListener;
import com.samsung.spensdk.applistener.SCanvasModeChangedListener;
import com.samsung.spensdk.applistener.SettingFillingChangeListener;
import com.samsung.spensdk.applistener.SettingStrokeChangeListener;
import com.samsung.spensdk.applistener.SettingTextChangeListener;
import com.samsung.spensdk.applistener.SettingViewShowListener;
import com.samsung.spensdk.example.R;
import com.samsung.spensdk.example.tools.SPenSDKUtils;
public class SPen_Example_SettingView extends Activity {
private final String TAG = "SPenSDK Sample";
private final boolean SHOW_LOG = false;
//==============================
// Application Identifier Setting
// "SDK Sample Application 1.0"
//==============================
private final String APPLICATION_ID_NAME = "SDK Sample Application";
private final int APPLICATION_ID_VERSION_MAJOR = 2;
private final int APPLICATION_ID_VERSION_MINOR = 2;
private final String APPLICATION_ID_VERSION_PATCHNAME = "Debug";
//==============================
// Variables
//==============================
Context mContext = null;
private FrameLayout mLayoutContainer;
private RelativeLayout mCanvasContainer;
private SCanvasView mSCanvas;
private ImageView mPenBtn;
private ImageView mEraserBtn;
private ImageView mTextBtn;
private ImageView mFillingBtn;
private ImageView mColorPickerBtn;
private ImageView mUndoBtn;
private ImageView mRedoBtn;
private TextView mSettingInfo;
private ImageView mColorSettingInfo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editor_settingview);
mContext = this;
//------------------------------------
// UI Setting
//------------------------------------
mPenBtn = (ImageView) findViewById(R.id.penBtn);
mPenBtn.setOnClickListener(mBtnClickListener);
mPenBtn.setOnLongClickListener(mBtnLongClickListener);
mEraserBtn = (ImageView) findViewById(R.id.eraseBtn);
mEraserBtn.setOnClickListener(mBtnClickListener);
mEraserBtn.setOnLongClickListener(mBtnLongClickListener);
mTextBtn = (ImageView) findViewById(R.id.textBtn);
mTextBtn.setOnClickListener(mBtnClickListener);
mTextBtn.setOnLongClickListener(mBtnLongClickListener);
mFillingBtn = (ImageView) findViewById(R.id.fillingBtn);
mFillingBtn.setOnClickListener(mBtnClickListener);
mFillingBtn.setOnLongClickListener(mBtnLongClickListener);
mColorPickerBtn = (ImageView) findViewById(R.id.colorPickerBtn);
mColorPickerBtn.setOnClickListener(mColorPickerListener);
mUndoBtn = (ImageView) findViewById(R.id.undoBtn);
mUndoBtn.setOnClickListener(undoNredoBtnClickListener);
mRedoBtn = (ImageView) findViewById(R.id.redoBtn);
mRedoBtn.setOnClickListener(undoNredoBtnClickListener);
mSettingInfo = (TextView) findViewById(R.id.settingInfo);
mColorSettingInfo = (ImageView) findViewById(R.id.colorsettingInfo);
//------------------------------------
// Create SCanvasView
//------------------------------------
mLayoutContainer = (FrameLayout) findViewById(R.id.layout_container);
mCanvasContainer = (RelativeLayout) findViewById(R.id.canvas_container);
mSCanvas = new SCanvasView(mContext);
mCanvasContainer.addView(mSCanvas);
//------------------------------------
// SettingView Setting
//------------------------------------
// Resource Map for Layout & Locale
HashMap<String,Integer> settingResourceMapInt = SPenSDKUtils.getSettingLayoutLocaleResourceMap(true, true, true, true);
// Resource Map for Custom font path
HashMap<String,String> settingResourceMapString = SPenSDKUtils.getSettingLayoutStringResourceMap(true, true, true, true);
// Create Setting View
mSCanvas.createSettingView(mLayoutContainer, settingResourceMapInt, settingResourceMapString);
//====================================================================================
//
// Set Callback Listener(Interface)
//
//====================================================================================
//------------------------------------------------
// SCanvas Listener
//------------------------------------------------
mSCanvas.setSCanvasInitializeListener(new SCanvasInitializeListener() {
@Override
public void onInitialized() {
//--------------------------------------------
// Start SCanvasView/CanvasView Task Here
//--------------------------------------------
// Application Identifier Setting
if(!mSCanvas.setAppID(APPLICATION_ID_NAME, APPLICATION_ID_VERSION_MAJOR, APPLICATION_ID_VERSION_MINOR,APPLICATION_ID_VERSION_PATCHNAME))
Toast.makeText(mContext, "Fail to set App ID.", Toast.LENGTH_LONG).show();
// Set Title
if(!mSCanvas.setTitle("SPen-SDK Test"))
Toast.makeText(mContext, "Fail to set Title.", Toast.LENGTH_LONG).show();
// Update button state
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_PEN);
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_EXT);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, true);
updateModeState();
}
});
//------------------------------------------------
// History Change Listener
//------------------------------------------------
mSCanvas.setHistoryUpdateListener(new HistoryUpdateListener() {
@Override
public void onHistoryChanged(boolean undoable, boolean redoable) {
mUndoBtn.setEnabled(undoable);
mRedoBtn.setEnabled(redoable);
}
});
//------------------------------------------------
// SCanvas Mode Changed Listener
//------------------------------------------------
mSCanvas.setSCanvasModeChangedListener(new SCanvasModeChangedListener() {
@Override
public void onModeChanged(int mode) {
updateModeState();
}
});
//------------------------------------------------
// Color Picker Listener
//------------------------------------------------
mSCanvas.setColorPickerColorChangeListener(new ColorPickerColorChangeListener(){
@Override
public void onColorPickerColorChanged(int nColor) {
int nCurMode = mSCanvas.getCanvasMode();
if(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_PEN) {
SettingStrokeInfo strokeInfo = mSCanvas.getSettingViewStrokeInfo();
if(strokeInfo != null) {
strokeInfo.setStrokeColor(nColor);
mSCanvas.setSettingViewStrokeInfo(strokeInfo);
}
}
else if(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER) {
// do nothing
}
else if(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_TEXT){
SettingTextInfo textInfo = mSCanvas.getSettingViewTextInfo();
if(textInfo != null) {
textInfo.setTextColor(nColor);
mSCanvas.setSettingViewTextInfo(textInfo);
}
}
else if(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_FILLING) {
SettingFillingInfo fillingInfo = mSCanvas.getSettingViewFillingInfo();
if(fillingInfo != null) {
fillingInfo.setFillingColor(nColor);
mSCanvas.setSettingViewFillingInfo(fillingInfo);
}
}
}
});
//------------------------------------------------
// SettingView Show Listener : Optional
//------------------------------------------------
mSCanvas.setSettingViewShowListener(new SettingViewShowListener() {
@Override
public void onEraserSettingViewShow(boolean bVisible) {
if(SHOW_LOG){
if(bVisible) Log.i(TAG, "Eraser setting view is shown");
else Log.i(TAG, "Eraser setting view is closed");
}
}
@Override
public void onPenSettingViewShow(boolean bVisible) {
if(SHOW_LOG){
if(bVisible) Log.i(TAG, "Pen setting view is shown");
else Log.i(TAG, "Pen setting view is closed");
}
if(bVisible){
SettingStrokeInfo strokeInfo = mSCanvas.getSettingViewStrokeInfo();
if(strokeInfo != null) {
updateColor(strokeInfo.getStrokeColor());
}
}
}
@Override
public void onTextSettingViewShow(boolean bVisible) {
if(SHOW_LOG){
if(bVisible) Log.i(TAG, "Text setting view is shown");
else Log.i(TAG, "Text setting view is closed");
}
if(bVisible){
SettingTextInfo textInfo = mSCanvas.getSettingViewTextInfo();
if(textInfo != null) {
updateColor(textInfo.getTextColor());
}
}
}
@Override
public void onFillingSettingViewShow(boolean bVisible) {
if(SHOW_LOG){
if(bVisible) Log.i(TAG, "Text setting view is shown");
else Log.i(TAG, "Text setting view is closed");
}
if(bVisible){
SettingFillingInfo fillingInfo = mSCanvas.getSettingViewFillingInfo();
if(fillingInfo != null) {
updateColor(fillingInfo.getFillingColor());
}
}
}
});
//------------------------------------------------
// SettingStrokeChangeListener Listener
//------------------------------------------------
mSCanvas.setSettingStrokeChangeListener(new SettingStrokeChangeListener() {
@Override
public void onClearAll(boolean bClearAllCompleted) {
if(bClearAllCompleted) updateSetting("Clear All is completed");
}
@Override
public void onEraserWidthChanged(int eraserWidth) {
updateSetting("Eraser width is changed : " + eraserWidth);
}
@Override
public void onStrokeColorChanged(int strokeColor) {
updateColor(strokeColor);
}
@Override
public void onStrokeStyleChanged(int strokeStyle) {
if (strokeStyle == SObjectStroke.SAMM_STROKE_STYLE_PENCIL)
updateSetting("Stroke Style = Pen");
else if (strokeStyle == SObjectStroke.SAMM_STROKE_STYLE_BRUSH)
updateSetting("Stroke Style = Brush");
else if (strokeStyle == SObjectStroke.SAMM_STROKE_STYLE_CHINESE_BRUSH)
updateSetting("Stroke Style = Chinese Brush");
else if (strokeStyle == SObjectStroke.SAMM_STROKE_STYLE_CRAYON)
updateSetting("Stroke Style = Pencil Crayon");
else if (strokeStyle == SObjectStroke.SAMM_STROKE_STYLE_MARKER)
updateSetting("Stroke Style = Marker");
else if (strokeStyle == SObjectStroke.SAMM_STROKE_STYLE_ERASER)
updateSetting("Stroke Style = Eraser");
}
@Override
public void onStrokeWidthChanged(int strokeWidth) {
updateSetting("Stroke width is changed : " + strokeWidth);
}
@Override
public void onStrokeAlphaChanged(int strokeAlpha) {
updateSetting("Alpha is changed : " + strokeAlpha);
}
});
//------------------------------------------------
// OnSettingTextChangeListener Listener
//------------------------------------------------
mSCanvas.setSettingTextChangeListener(new SettingTextChangeListener(){
@Override
public void onTextColorChanged(int textColor) {
updateColor(textColor);
}
@Override
public void onTextFontChanged(String fontName) {
updateSetting("Font is changed : " + fontName);
}
@Override
public void onTextSizeChanged(int textSize) {
updateSetting("Text size is changed : " + textSize);
}
@Override
public void onTextStyleChanged(int textStyle) {
StringBuilder textStyleString = new StringBuilder();
boolean bDefault = (textStyle == SObjectText.SAMM_TEXT_STYLE_NONE);
if(bDefault) textStyleString.append("Default ");
boolean bBold = ((textStyle & SObjectText.SAMM_TEXT_STYLE_BOLD)!=0);
if(bBold) textStyleString.append("Bold ");
boolean bItalic = ((textStyle & SObjectText.SAMM_TEXT_STYLE_ITALIC)!=0);
if(bItalic) textStyleString.append("Italic ");
boolean bUnderline = ((textStyle & SObjectText.SAMM_TEXT_STYLE_UNDERLINE)!=0);
if(bUnderline) textStyleString.append("Underline ");
updateSetting("Text style is changed : " + textStyleString);
}
@Override
public void onTextAlignmentChanged(int textHorizAlignment) {
switch(textHorizAlignment){
case SAMMLibConstants.SAMM_ALIGN_NORMAL:
updateSetting("Text alignment is changed as Left alignment");
break;
case SAMMLibConstants.SAMM_ALIGN_CENTER:
updateSetting("Text alignment is changed as Center alignment");
break;
case SAMMLibConstants.SAMM_ALIGN_OPPOSITE:
updateSetting("Text alignment is changed as Right alignment");
break;
}
}
});
//------------------------------------------------
// SettingFillingChangeListener Listener
//------------------------------------------------
mSCanvas.setSettingFillingChangeListener(new SettingFillingChangeListener(){
@Override
public void onFillingColorChanged(int fillingColor) {
updateColor(fillingColor);
}
});
mUndoBtn.setEnabled(false);
mRedoBtn.setEnabled(false);
mPenBtn.setSelected(true);
// 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(!mSCanvas.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
}
@Override
public void onBackPressed() {
SPenSDKUtils.alertActivityFinish(this, "Exit");
}
private OnClickListener undoNredoBtnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(mUndoBtn)) {
mSCanvas.undo();
}
else if (v.equals(mRedoBtn)) {
mSCanvas.redo();
}
mUndoBtn.setEnabled(mSCanvas.isUndoable());
mRedoBtn.setEnabled(mSCanvas.isRedoable());
}
};
private OnClickListener mBtnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
int nBtnID = v.getId();
// If the mode is not changed, open the setting view. If the mode is same, close the setting view.
if(nBtnID == mPenBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_PEN){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_EXT);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_PEN);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, false);
updateModeState();
}
}
else if(nBtnID == mEraserBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_NORMAL);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER);
}
else {
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER, false);
updateModeState();
}
}
else if(nBtnID == mTextBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_TEXT){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_NORMAL);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_TEXT);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT, false);
updateModeState();
Toast.makeText(mContext, "Tap Canvas to insert Text", Toast.LENGTH_SHORT).show();
}
}
else if(nBtnID == mFillingBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_FILLING){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_FILLING, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_NORMAL);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_FILLING);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_FILLING);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_FILLING, false);
updateModeState();
Toast.makeText(mContext, "Tap Canvas to fill color", Toast.LENGTH_SHORT).show();
}
}
Toast.makeText(mContext, "Long Click to show mini-setting view", Toast.LENGTH_SHORT).show();
}
};
private OnLongClickListener mBtnLongClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int nBtnID = v.getId();
// If the mode is not changed, open the setting view. If the mode is same, close the setting view.
if(nBtnID == mPenBtn.getId()){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_MINI);
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_PEN){
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_PEN);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, true);
updateModeState();
}
return true;
}
else if(nBtnID == mEraserBtn.getId()){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_MINI);
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER){
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER);
}
else {
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER, true);
updateModeState();
}
return true;
}
else if(nBtnID == mTextBtn.getId()){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_MINI);
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_TEXT){
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_TEXT);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT, true);
updateModeState();
Toast.makeText(mContext, "Tap Canvas to insert Text", Toast.LENGTH_SHORT).show();
}
return true;
}
else if(nBtnID == mFillingBtn.getId()){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_FILLING, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_MINI);
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_FILLING){
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_FILLING);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_FILLING);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_FILLING, true);
updateModeState();
Toast.makeText(mContext, "Tap Canvas to fill color", Toast.LENGTH_SHORT).show();
}
return true;
}
return false;
}
};
// color picker mode
private OnClickListener mColorPickerListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(mColorPickerBtn)) {
// Toggle
boolean bIsColorPickerMode = !mSCanvas.isColorPickerMode();
mSCanvas.setColorPickerMode(bIsColorPickerMode);
mColorPickerBtn.setSelected(bIsColorPickerMode);
}
}
};
// Update tool button
private void updateModeState(){
int nCurMode = mSCanvas.getCanvasMode();
mPenBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_PEN);
mEraserBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mTextBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_TEXT);
mFillingBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_FILLING);
// Reset color picker tool when Eraser Mode
if(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER)
mSCanvas.setColorPickerMode(false);
mColorPickerBtn.setEnabled(nCurMode!=SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mColorPickerBtn.setSelected(mSCanvas.isColorPickerMode());
}
private void updateSetting(String strInfo){
mSettingInfo.setText(strInfo);
}
private void updateColor(int nColor){
mSettingInfo.setBackgroundDrawable(new ColorDrawable(nColor));
mColorSettingInfo.setAlpha(Color.alpha(nColor));
// mSettingInfo.setAlpha(Color.alpha(nColor));
}
}