package com.samsung.spensdk.example.sammeditor;
import java.io.File;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.samsung.samm.common.SAMMLibConstants;
import com.samsung.samm.common.SOptionSCanvas;
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;
import com.samsung.spensdk.example.tools.ToolListActivity;
public class SPen_Example_AnimationViewer 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_PLAY_BUTTON_CLICK = "ExtraPlayButtonClick";
private final int MENU_PLAYPAUSE = Menu.FIRST + 1;
private final int MENU_STOP = Menu.FIRST + 2;
private final int MENU_LOAD_SELECT = Menu.FIRST + 3;
private final int MENU_ANIMATION = Menu.FIRST + 4;
private final int REQUEST_CODE_FILE_SELECT = 100;
private final int REQUEST_CODE_PLAY_OPTION = 101;
private String mTempAMSFolderPath = null;
private final String DEFAULT_SAVE_PATH = "SPenSDK2.2";
private SCanvasView mSCanvas;
private ProgressBar mProgress;
Context mContext = null;
private boolean mIsRotation = false;
private boolean mIsLoadInViewer = false;
private String mStrFileName = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createAnimationLayoutUI(mIsRotation);
// Make basic folder and file name to load or save
File sdcard_path = Environment.getExternalStorageDirectory();
File spen_path = new File(sdcard_path, DEFAULT_SAVE_PATH);
if(!spen_path.exists()){
if(!spen_path.mkdirs()){
Log.e(TAG, "Default Save Path Creation Error");
return ;
}
}
mTempAMSFolderPath = spen_path.getAbsolutePath();
// 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
}
private void createAnimationLayoutUI(boolean bRotation) {
Intent intent = getIntent();
boolean bContentsOrientationHorizontal = intent.getBooleanExtra(EXTRA_CONTENTS_ORIENTATION, false);
boolean bScreenOrientationHorizontal = intent.getBooleanExtra(EXTRA_VIEW_ORIENTATION, false);
if(!bContentsOrientationHorizontal && !bScreenOrientationHorizontal) {
if(!bRotation)
setContentView(R.layout.viewer_vv);
else
setContentView(R.layout.viewer_vh);
}
else if(!bContentsOrientationHorizontal && bScreenOrientationHorizontal) {
if(!bRotation)
setContentView(R.layout.viewer_vh);
else
setContentView(R.layout.viewer_vv);
}
else if(bContentsOrientationHorizontal && !bScreenOrientationHorizontal) {
if(!bRotation)
setContentView(R.layout.viewer_hv);
else
setContentView(R.layout.viewer_hh);
}
else if(bContentsOrientationHorizontal && bScreenOrientationHorizontal) {
if(!bRotation)
setContentView(R.layout.viewer_hh);
else
setContentView(R.layout.viewer_hv);
}
mContext = this;
// Set progress
mProgress = (ProgressBar) findViewById(R.id.progressBar);
mProgress.setMax(100);
mProgress.setVisibility(View.VISIBLE);
mSCanvas = (SCanvasView) findViewById(R.id.canvas_view);
mSCanvas.setHistoricalOperationSupport(false);
//====================================================================================
//
// Set Callback Listener(Interface)
//
//====================================================================================
SCanvasInitializeListener scanvasInitializeListener = new SCanvasInitializeListener() {
@Override
public void onInitialized() {
//--------------------------------------------
// Start SCanvasView/CanvasView Task Here
//--------------------------------------------
// Set as animation mode
mSCanvas.setAnimationMode(true);
if(mIsLoadInViewer) {
if(loadAnimationFile(mStrFileName))
{
//Set Animation Option
SOptionSCanvas canvasOption = new SOptionSCanvas();
setPlayOption(canvasOption);
// Start animation
mSCanvas.doAnimationStart();
}
}
else {
// Get the file path by intent
Intent intent = getIntent();
String sDataKey = intent.getStringExtra(EXTRA_VIEW_FILE_PATH);
// Loading temporary save file of SAMMData
if(mSCanvas.loadSAMMData(sDataKey)){
//Set Animation Option
SOptionSCanvas canvasOption = new SOptionSCanvas();
setPlayOption(canvasOption);
// // Set play option
// SOptionSCanvas canvasOption = new SOptionSCanvas();
// // Whether set transparent background or not
// 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
// canvasOption.mPlayOption.setSoundEffectOption(PreferencesOfAnimationOption.getPreferencePlayAnimationUsingSoundEffect(mContext));
//
// // Set Background audio software volume
// if(!canvasOption.mPlayOption.setBGAudioVolume(1.0f))
// return;
// // Set Sound effect software volume
// if(!canvasOption.mPlayOption.setSoundEffectVolume(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();
}
}
}
};
//--------------------------------------------
// Set Callback Listener
//--------------------------------------------
// Play complete callback listener
AnimationProcessListener animationProcessListener = new AnimationProcessListener() {
@Override
public void onPlayComplete() {
Toast.makeText(SPen_Example_AnimationViewer.this, "Play Complete.", Toast.LENGTH_SHORT).show();
mProgress.setVisibility(View.GONE);
// Close menu after play complete
closeOptionsMenu();
}
@Override
public void onChangeProgress(int nProgress) {
if(nProgress==0) mProgress.setVisibility(View.VISIBLE);
else if(nProgress==100) mProgress.setVisibility(View.GONE);
mProgress.setProgress(nProgress);
}
};
// Set the initialization finish listener
mSCanvas.setSCanvasInitializeListener(scanvasInitializeListener);
// Set the listener to execute when the animation completed.
mSCanvas.setAnimationProcessListener(animationProcessListener);
//--------------------------------------------
// Custom Sound Effect
//--------------------------------------------
// mSCanvas.setCustomSoundEffectSettingListener(new CustomSoundEffectSettingListener(){
//
// String strSoundEffectPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
//
// @Override
// public String onLoadCustomSoundEffect(int nSoundEffectType) {
// switch(nSoundEffectType){
// case SCanvasConstants.SOUND_EFFECT_TYPE_PEN_CLICK:
// return strSoundEffectPath + "pen_click.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_CRAYON_CLICK:
// return strSoundEffectPath + "crayon_click.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_PEN_DRAW:
// return strSoundEffectPath + "pen_draw.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_CRAYON_DRAW:
// return strSoundEffectPath + "crayon_draw.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_MARKER_DRAW:
// return strSoundEffectPath + "shiny_draw.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_BRUSH_DRAW:
// return strSoundEffectPath + "brush_draw.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_CHINESE_BRUSH_DRAW:
// return strSoundEffectPath + "chinese_brush_draw.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_ERASER_DRAW:
// return strSoundEffectPath + "eraser_draw.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_IMAGE_INSERT:
// return strSoundEffectPath + "image_insert.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_TEXT_INSERT:
// return strSoundEffectPath + "text_type.ogg";
// case SCanvasConstants.SOUND_EFFECT_TYPE_FILLING_INSERT:
// return strSoundEffectPath + "color_filling.ogg";
// }
// return null;
// }
// });
// 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");
// Release SCanvasView resources
if(!mSCanvas.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
mProgress.setVisibility(View.GONE);
mIsRotation = !mIsRotation;
createAnimationLayoutUI(mIsRotation);
closeOptionsMenu();
super.onConfigurationChanged(newConfig);
}
@Override
protected void onPause() {
super.onPause();
if(mSCanvas.isAnimationMode()) {
int nAnimationState = mSCanvas.getAnimationState();
if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_STOP) {
mSCanvas.doAnimationStop(false);
}else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_RUNNING) {
mSCanvas.doAnimationPause();
}
}
}
@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
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
// Result of selection file to start animation
if(requestCode==REQUEST_CODE_FILE_SELECT){
if(resultCode==RESULT_OK){
if(data == null)
return;
Bundle bundle = data.getExtras();
if(bundle == null)
return;
mStrFileName = bundle.getString(ToolListActivity.EXTRA_SELECTED_FILE);
if(loadAnimationFile(mStrFileName))
{
mIsLoadInViewer = true;
// Start animation
mSCanvas.doAnimationStart();
}
}
}else if(requestCode==REQUEST_CODE_PLAY_OPTION){
SOptionSCanvas canvasOption = new SOptionSCanvas();
setPlayOption(canvasOption);
canvasOption = mSCanvas.getOption();
if(canvasOption!=null)
mSCanvas.setAnimationSpeed(canvasOption.mPlayOption.getAnimationSpeed());
}
}
@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_LOAD_SELECT, MENU_LOAD_SELECT, Menu.NONE, "Load");
menu.add(MENU_ANIMATION, MENU_ANIMATION, Menu.NONE, "Play Option");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu){
super.onMenuOpened(featureId, menu);
if (menu != null){
boolean bAnimationMode = mSCanvas.isAnimationMode();
if(bAnimationMode){
int nAnimationState = mSCanvas.getAnimationState();
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_LOAD_SELECT:
{
Intent intent = new Intent(getApplicationContext(), ToolListActivity.class);
String [] exts = new String [] { "jpg", "png" }; // file extension
intent.putExtra(ToolListActivity.EXTRA_LIST_PATH, mTempAMSFolderPath);
intent.putExtra(ToolListActivity.EXTRA_FILE_EXT_ARRAY, exts);
intent.putExtra(ToolListActivity.EXTRA_SEARCH_ONLY_SAMM_FILE, true);
startActivityForResult(intent, REQUEST_CODE_FILE_SELECT);
}
break;
case MENU_ANIMATION:
{
Intent intent = new Intent(this, PreferencesOfAnimationOption.class);
startActivityForResult(intent, REQUEST_CODE_PLAY_OPTION);
}
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.setAnimationSpeed(PreferencesOfAnimationOption.getPreferencePlayAnimationSpeed(mContext));
SOptionSCanvas canvasOption = new SOptionSCanvas();
setPlayOption(canvasOption);
mSCanvas.doAnimationStart();
}
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_PAUSED)
mSCanvas.doAnimationResume();
else if(nAnimationState==SAMMLibConstants.ANIMATION_STATE_ON_RUNNING)
mSCanvas.doAnimationPause();
}
// Set Play Option
void setPlayOption(SOptionSCanvas canvasOption) {
// Set play option
if(canvasOption == null) {
canvasOption = new SOptionSCanvas();
}
// Whether set transparent background or not
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
canvasOption.mPlayOption.setSoundEffectOption(PreferencesOfAnimationOption.getPreferencePlayAnimationUsingSoundEffect(mContext));
// Set Background audio software volume
if(!canvasOption.mPlayOption.setBGAudioVolume(1.0f))
return;
// Set Sound effect software volume
if(!canvasOption.mPlayOption.setSoundEffectVolume(1.0f))
return;
// Set animation play speed
if(!canvasOption.mPlayOption.setAnimationSpeed(PreferencesOfAnimationOption.getPreferencePlayAnimationSpeed(mContext)))
return;
// Set Option
if(!mSCanvas.setOption(canvasOption))
return;
}
}