package com.samsung.spensdk.example.eraseranimation;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
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 android.widget.RelativeLayout;
import android.widget.Toast;
import com.samsung.samm.common.SAMMLibConstants;
import com.samsung.samm.common.SOptionSCanvas;
import com.samsung.spen.lib.image.SPenImageFilterConstants;
import com.samsung.spensdk.SCanvasView;
import com.samsung.spensdk.applistener.AnimationProcessListener;
import com.samsung.spensdk.applistener.SCanvasInitializeListener;
import com.samsung.spensdk.example.R;
import com.samsung.spensdk.example.tools.PreferencesOfAnimationOption;
public class SPen_Example_AnimationEraserViewer extends Activity {
private final String TAG = "SPenSDK Sample";
static public final String EXTRA_VIEW_FILE_PATH = "ExtraViewFilePath";
static public final String EXTRA_CONTENTS_ORIENTATION = "ExtraContentsOrientation";
static public final String EXTRA_VIEW_ORIENTATION = "ExtraViewOrientation";
static public final String EXTRA_IMAGE_OPERATION = "ExtraImageOperation";
static public final String EXTRA_IMAGE_OPERATION_LEVEL = "ExtraImageOperationLevel";
static public final String EXTRA_PLAY_BUTTON_CLICK = "ExtraPlayButtonClick";
private final int MENU_PLAYPAUSE = Menu.FIRST + 0;
private final int MENU_STOP = Menu.FIRST + 1;
private final int MENU_SPEED = Menu.FIRST + 2;
private SCanvasView mSCanvas;
Context mContext = null;
private String sDataKey = null;
int nImageOperation;
int nImageOperationLevel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createAnimationLayoutUI();
}
private void createAnimationLayoutUI() {
setContentView(R.layout.example_viewer_eraser);
mContext = this;
mSCanvas = (SCanvasView) findViewById(R.id.canvas_view);
//====================================================================================
//
// Set Callback Listener(Interface)
//
//====================================================================================
SCanvasInitializeListener scanvasInitializeListener = new SCanvasInitializeListener() {
@Override
public void onInitialized() {
//--------------------------------------------
// Start SCanvasView/CanvasView Task Here
//--------------------------------------------
// Set as animation mode
mSCanvas.setAnimationMode(true);
// Set the animation mode as Dimming eraser mode just like erasing frost on the glass by finger.
mSCanvas.setEraserAnimationMode(true);
// Set cursor invisible
mSCanvas.setEraserCursorVisible(false);
// Get the file path by intent
Intent intent = getIntent();
sDataKey = intent.getStringExtra(EXTRA_VIEW_FILE_PATH);
// SAMMData Load by Key
if(mSCanvas.loadSAMMData(sDataKey)){
// 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.
String strBackgroundImagePath = mSCanvas.getBGImagePathDecoded();
Bitmap bmDim = BitmapFactory.decodeFile(strBackgroundImagePath);
if(bmDim == null)
return;
nImageOperation = intent.getIntExtra(EXTRA_IMAGE_OPERATION, SPenImageFilterConstants.FILTER_DARK);
// range of level : 0~4
nImageOperationLevel = intent.getIntExtra(EXTRA_IMAGE_OPERATION_LEVEL, SPenImageFilterConstants.FILTER_LEVEL_MEDIUM);
mSCanvas.setClearImageBitmap(bmDim, nImageOperation, nImageOperationLevel);
// Set play option
SOptionSCanvas canvasOption = new SOptionSCanvas();
// Whether set transparent background or not
// Set false(default value), because transparent background will be displayed as black color.
//canvasOption.mPlayOption.setInvisibleBGImageAnimationOption(PreferencesOfAnimationOption.getPreferencePlayAnimationUsingTransparentBackground(mContext));
// Set Background audio play option
canvasOption.mPlayOption.setPlayBGAudioOption(PreferencesOfAnimationOption.getPreferencePlayBackgroundAudio(mContext));
// Set Background audio play repeat option
canvasOption.mPlayOption.setRepeatBGAudioOption(PreferencesOfAnimationOption.getPreferencePlayBackgroundAudioReplay(mContext));
// When stop animation play, whether set Background audio play stop or not
canvasOption.mPlayOption.setStopBGAudioOption(PreferencesOfAnimationOption.getPreferencePlayBackgroundAudioStop(mContext));
// When object drawing, whether set sound effect or not : Don't play back sound effect
canvasOption.mPlayOption.setSoundEffectOption(false);
// Set Background audio software volume
if(!canvasOption.mPlayOption.setBGAudioVolume(1.0f))
return;
// Set animation play speed
if(!canvasOption.mPlayOption.setAnimationSpeed(PreferencesOfAnimationOption.getPreferencePlayAnimationSpeed(mContext)))
return;
// Set Option
if(!mSCanvas.setOption(canvasOption))
return;
// Start animation
mSCanvas.doAnimationStart();
}
}
};
// Animation Processing Callback
AnimationProcessListener animationProcessListener = new AnimationProcessListener() {
@Override
public void onPlayComplete() {
Toast.makeText(SPen_Example_AnimationEraserViewer.this, "Play Complete.", Toast.LENGTH_SHORT).show();
// Close menu after play complete
closeOptionsMenu();
}
@Override
public void onChangeProgress(int nProgress) {
// TODO Auto-generated method stub
}
};
// Set the listener to execute when the animation completed.
mSCanvas.setAnimationProcessListener(animationProcessListener);
// Set the initialization finish listener
mSCanvas.setSCanvasInitializeListener(scanvasInitializeListener);
// 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
public void onConfigurationChanged(Configuration newConfig) {
// close previous animation when device is rotated
if(!mSCanvas.doAnimationClose())
Log.e(TAG, "Fail to doAnimationClose");
// Set as animation mode
mSCanvas.setAnimationMode(true);
// Set the animation mode as Dimming eraser mode just like erasing frost on the glass by finger.
mSCanvas.setEraserAnimationMode(true);
// Set cursor invisible
mSCanvas.setEraserCursorVisible(false);
// SAMMData Load by Key
if(mSCanvas.loadSAMMData(sDataKey)){
// Set delay for initializing the canvas before animation start
mSCanvas.postDelayed(new Runnable() {
@Override
public void run() {
// Start animation
mSCanvas.doAnimationStart();
}
}, 300);
}
closeOptionsMenu();
super.onConfigurationChanged(newConfig);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(!mSCanvas.doAnimationClose())
Log.e(TAG, "Fail to doAnimationClose");
// Release SCanvasView resources
if(!mSCanvas.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
}
@Override
public void onBackPressed() {
if(!mSCanvas.doAnimationClose())
Log.e(TAG, "Fail to doAnimationClose");
getIntent().putExtra(EXTRA_PLAY_BUTTON_CLICK, false);
setResult(RESULT_OK, getIntent());
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
menu.add(MENU_PLAYPAUSE, MENU_PLAYPAUSE, Menu.NONE, "Play");
menu.add(MENU_STOP, MENU_STOP, Menu.NONE, "Stop");
menu.add(MENU_SPEED, MENU_SPEED, Menu.NONE, "Speed");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu){
super.onMenuOpened(featureId, menu);
if (menu != null){
int nAnimationState = mSCanvas.getAnimationState();
boolean bAnimationMode = mSCanvas.isAnimationMode();
if(bAnimationMode){
if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_OFF_ANIMATION)
menu.findItem(MENU_PLAYPAUSE).setTitle("Play");
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_STOP)
menu.findItem(MENU_PLAYPAUSE).setTitle("Play");
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_PAUSED)
menu.findItem(MENU_PLAYPAUSE).setTitle("Resume");
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_RUNNING)
menu.findItem(MENU_PLAYPAUSE).setTitle("Pause");
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch(item.getItemId()) {
case MENU_PLAYPAUSE:
if(!mSCanvas.isAnimationMode())
break;
animationPlayOrPause();
break;
case MENU_STOP:
if(!mSCanvas.isAnimationMode())
break;
mSCanvas.doAnimationStop(true);
break;
case MENU_SPEED:
animationSpeedDialog();
break;
}
return true;
}
void initBackground(){
RelativeLayout canvasContainer = (RelativeLayout) findViewById(R.id.canvas_container);
if(canvasContainer==null) return;
// transparent
canvasContainer.setBackgroundColor(0);
}
// Load file to animation
boolean loadAnimationFile(String strFileName){
// initialize background
initBackground();
if(!mSCanvas.loadSAMMFile(strFileName, false)){
Toast.makeText(this, "Load AMS File("+ strFileName +") Fail!", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
// Start or Pause Animation
void animationPlayOrPause(){
int nAnimationState = mSCanvas.getAnimationState();
if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_STOP)
{
// Start Animation
mSCanvas.doAnimationStart();
}
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_PAUSED)
mSCanvas.doAnimationResume();
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_RUNNING)
mSCanvas.doAnimationPause();
}
// Show Animation Speed Dialog
void animationSpeedDialog(){
int nAnimationSpeed = mSCanvas.getAnimationSpeed();
new AlertDialog.Builder(this)
.setTitle(R.string.animation_speed_title)
.setSingleChoiceItems(R.array.animation_speed, nAnimationSpeed, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mSCanvas.setAnimationSpeed(which);
PreferencesOfAnimationOption.setPreferencePlayAnimationSpeed(mContext, which);
dialog.dismiss();
}
})
.show();
}
}