package com.samsung.spensdk.example.bgfg; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Bitmap.CompressFormat; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.View.OnClickListener; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.Toast; import com.samsung.samm.common.SOptionSAMM; import com.samsung.samm.common.SOptionSCanvas; import com.samsung.spensdk.SCanvasConstants; import com.samsung.spensdk.SCanvasView; import com.samsung.spensdk.applistener.HistoryUpdateListener; import com.samsung.spensdk.applistener.SCanvasInitializeListener; import com.samsung.spensdk.applistener.SCanvasModeChangedListener; import com.samsung.spensdk.example.R; import com.samsung.spensdk.example.tools.SPenSDKUtils; public class SPen_Example_BackgroundForeground extends Activity { public final static String TAG = "SPenSDK Sample"; //============================== // 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"; //============================== // BG & FG Path //============================== public static final String DEFAULT_APP_IMAGEDATA_DIRECTORY = "SPenSDK2.2/images"; public static final String EXTRA_IMAGE_PATH = "path"; public static final String EXTRA_IMAGE_NAME = "filename"; public static final String SAVED_FILE_EXTENSION = "png"; private static final int DIALOG_CHANGE_BACKGROUND = 1; //============================== // Menu //============================== private final int MENU_SAVE_AS_IMAGE_GROUP = 1000; private final int MENU_SAVE_AS_IMAGE_FOREGROUND_ONLY = 1001; private final int MENU_SAVE_AS_IMAGE_ALL = 1002; private final int MENU_LOAD_AS_IMAGE_GROUP = 2000; private final int MENU_LOAD_AS_FOREGROUND_IMAGE = 2001; private final int MENU_LOAD_AS_BACKGROUND_IMAGE = 2002; private final int MENU_CHANGE_BACKGROUND = 3000; private final int MENU_SAVE_SAMM_FILE = 4000; private final int MENU_LOAD_SAMM_FILE = 5000; //============================== // Activity Request code //============================== private final int REQUEST_CODE_LOAD_IMAGE_AS_FOREGROUND = 101; private final int REQUEST_CODE_LOAD_IMAGE_AS_BACKGROUND = 102; private final int REQUEST_CODE_LOAD_SAMM_FILE = 103; //============================== // Variables //============================== Context mContext = null; private FrameLayout mLayoutContainer; private RelativeLayout mCanvasContainer; private SCanvasView mSCanvas; private ImageView mPenBtn; private ImageView mEraserBtn; private ImageView mTextBtn; private ImageView mUndoBtn; private ImageView mRedoBtn; private File mFolder = null; private int mChangeBGItem; private String[] mBgNames = { "Background 1", "Background 2", "Background 3", "Clear background", }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.editor_bg_fg); mContext = this; mChangeBGItem = 0; //------------------------------------ // UI Setting //------------------------------------ mPenBtn = (ImageView) findViewById(R.id.penBtn); mPenBtn.setOnClickListener(mBtnClickListener); mEraserBtn = (ImageView) findViewById(R.id.eraseBtn); mEraserBtn.setOnClickListener(mBtnClickListener); mTextBtn = (ImageView) findViewById(R.id.textBtn); mTextBtn.setOnClickListener(mBtnClickListener); mUndoBtn = (ImageView) findViewById(R.id.undoBtn); mUndoBtn.setOnClickListener(undoNredoBtnClickListener); mRedoBtn = (ImageView) findViewById(R.id.redoBtn); mRedoBtn.setOnClickListener(undoNredoBtnClickListener); //------------------------------------ // 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 updateModeState(); Bitmap bg = BitmapFactory.decodeResource(getResources(), R.drawable.letter_bg_grass); if(bg == null) return; mSCanvas.setBackgroundImage(bg); bg.recycle(); } }); //------------------------------------------------ // 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(); } }); mUndoBtn.setEnabled(false); mRedoBtn.setEnabled(false); mPenBtn.setSelected(true); // create basic save/road file path File sdcard_path = Environment.getExternalStorageDirectory(); mFolder = new File(sdcard_path, DEFAULT_APP_IMAGEDATA_DIRECTORY); if(!mFolder.exists()){ if(!mFolder.mkdirs()){ Log.e(TAG, "Default Save Path Creation Error"); return ; } } // 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()); } }; 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_NORMAL); 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(); } } } }; @Override public boolean onCreateOptionsMenu(Menu menu){ SubMenu fileMenu = menu.addSubMenu("Save as Image"); fileMenu.add(MENU_SAVE_AS_IMAGE_GROUP, MENU_SAVE_AS_IMAGE_FOREGROUND_ONLY, 1, "Foreground Only"); fileMenu.add(MENU_SAVE_AS_IMAGE_GROUP, MENU_SAVE_AS_IMAGE_ALL, 2, "Foreground + background"); SubMenu dataMenu = menu.addSubMenu("Load Image"); dataMenu.add(MENU_LOAD_AS_IMAGE_GROUP, MENU_LOAD_AS_FOREGROUND_IMAGE, 1, "Into Foreground"); dataMenu.add(MENU_LOAD_AS_IMAGE_GROUP, MENU_LOAD_AS_BACKGROUND_IMAGE, 2, "Into Background"); menu.add(MENU_CHANGE_BACKGROUND, MENU_CHANGE_BACKGROUND, 1, "Change Background"); menu.add(MENU_SAVE_SAMM_FILE, MENU_SAVE_SAMM_FILE, 1, "Save as SAMM File"); menu.add(MENU_LOAD_SAMM_FILE, MENU_LOAD_SAMM_FILE, 1, "Load SAMM File"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch(item.getItemId()) { case MENU_SAVE_AS_IMAGE_FOREGROUND_ONLY: saveCanvasImage(true); break; case MENU_SAVE_AS_IMAGE_ALL: saveCanvasImage(false); break; case MENU_SAVE_SAMM_FILE: saveSAMMFile(); break; case MENU_LOAD_AS_FOREGROUND_IMAGE: selectImageForCanvasImage(true); break; case MENU_LOAD_AS_BACKGROUND_IMAGE: selectImageForCanvasImage(false); break; case MENU_LOAD_SAMM_FILE: selectSAMMFile(); break; case MENU_CHANGE_BACKGROUND: showDialog(DIALOG_CHANGE_BACKGROUND); break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode==RESULT_OK){ if(data == null) return; Bundle bundle = data.getExtras(); if(bundle == null) return; if(requestCode == REQUEST_CODE_LOAD_IMAGE_AS_FOREGROUND) { String mFileName = bundle.getString(EXTRA_IMAGE_NAME); loadCanvasImage(mFileName, true); } else if(requestCode == REQUEST_CODE_LOAD_IMAGE_AS_BACKGROUND) { String mFileName = bundle.getString(EXTRA_IMAGE_NAME); loadCanvasImage(mFileName, false); }else if(requestCode == REQUEST_CODE_LOAD_SAMM_FILE) { String mFileName = bundle.getString(EXTRA_IMAGE_NAME); loadSAMMFile(mFileName); } } } // 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); } private boolean saveCanvasImage(boolean bSaveOnlyForegroundImage) { Bitmap bmCanvas = mSCanvas.getCanvasBitmap(bSaveOnlyForegroundImage); if (!(mFolder.exists())) if(!mFolder.mkdirs()) return false; String savePath = mFolder.getPath() + '/' + ExampleUtils.getUniqueFilename(mFolder, "image", SAVED_FILE_EXTENSION); Log.d(TAG, "Save Path = " + savePath); return saveBitmapPNG(savePath, bmCanvas); } private boolean saveBitmapPNG(String strFileName, Bitmap bitmap){ if(strFileName==null || bitmap==null) return false; boolean bSuccess1 = false; boolean bSuccess2; boolean bSuccess3; File saveFile = new File(strFileName); if(saveFile.exists()) { if(!saveFile.delete()) return false; } try { bSuccess1 = saveFile.createNewFile(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } OutputStream out = null; try { out = new FileOutputStream(saveFile); bSuccess2 = bitmap.compress(CompressFormat.PNG, 100, out); } catch (Exception e) { e.printStackTrace(); bSuccess2 = false; } try { if(out!=null) { out.flush(); out.close(); bSuccess3 = true; } else bSuccess3 = false; } catch (IOException e) { e.printStackTrace(); bSuccess3 = false; }finally { if(out != null) { try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return (bSuccess1 && bSuccess2 && bSuccess3); } private boolean saveSAMMFile() { String savePath = mFolder.getPath() + '/' + ExampleUtils.getUniqueFilename(mFolder, "SAMM", SAVED_FILE_EXTENSION); Log.d(TAG, "Save Path = " + savePath); // canvas option setting SOptionSCanvas canvasOption = mSCanvas.getOption(); if(canvasOption == null) return false; canvasOption.mSAMMOption.setSaveImageSize(SOptionSAMM.SAMM_SAVE_OPTION_ORIGINAL_SIZE); mSCanvas.setOption(canvasOption); return mSCanvas.saveSAMMFile(savePath); } private void selectSAMMFile() { Intent intent = new Intent(getApplicationContext(), ListActivity.class); startActivityForResult(intent, REQUEST_CODE_LOAD_SAMM_FILE); } private boolean loadSAMMFile(String fileName) { String loadPath = mFolder.getPath() + '/' + fileName; return mSCanvas.loadSAMMFile(loadPath, true, true); } private void selectImageForCanvasImage(boolean loadAsForegroundImage){ if(loadAsForegroundImage){ Intent intent = new Intent(getApplicationContext(), ListActivity.class); startActivityForResult(intent, REQUEST_CODE_LOAD_IMAGE_AS_FOREGROUND); } else{ Intent intent = new Intent(mContext, ListActivity.class); startActivityForResult(intent, REQUEST_CODE_LOAD_IMAGE_AS_BACKGROUND); } } private boolean loadCanvasImage(String fileName, boolean loadAsForegroundImage) { String loadPath = mFolder.getPath() + '/' + fileName; Log.i(TAG, "Load Path = " + loadPath); if(loadAsForegroundImage){ Bitmap bmForeground = BitmapFactory.decodeFile(loadPath); if(bmForeground == null) return false; int nWidth = mSCanvas.getWidth(); int nHeight = mSCanvas.getHeight(); bmForeground = Bitmap.createScaledBitmap(bmForeground, nWidth, nHeight, true); return mSCanvas.setClearImageBitmap(bmForeground); } else { return mSCanvas.setBGImagePath(loadPath); } } protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_CHANGE_BACKGROUND: AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setSingleChoiceItems(mBgNames, mChangeBGItem, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mChangeBGItem = which; Bitmap bm = null; switch(which) { case 0: bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.letter_bg_grass); break; case 1: bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.letter_bg_present); break; case 2: bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.letter_bg); break; case 3: mSCanvas.setBGColor(0x00000000); break; } if(bm != null) { mSCanvas.setBGImage(bm); } removeDialog(DIALOG_CHANGE_BACKGROUND); } }); return builder.create(); } return super.onCreateDialog(id); } }