package com.android.mirror.drawpicture;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.text.TextPaint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.io.InputStream;
import java.util.UUID;
import android.provider.MediaStore;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.widget.TextView;
import android.widget.Toast;
import master.flame.danmaku.controller.IDanmakuView;
import master.flame.danmaku.danmaku.loader.ILoader;
import master.flame.danmaku.danmaku.loader.IllegalDataException;
import master.flame.danmaku.danmaku.loader.android.DanmakuLoaderFactory;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.android.DanmakuGlobalConfig;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.model.android.SpannedCacheStuffer;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.danmaku.parser.DanmakuFactory;
import master.flame.danmaku.danmaku.parser.IDataSource;
import master.flame.danmaku.danmaku.parser.android.BiliDanmukuParser;
import master.flame.danmaku.controller.DrawHandler.Callback;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
public class MainActivity extends Activity implements View.OnClickListener{
//DanmakuViews
private IDanmakuView mDanmakuView;
private BaseDanmakuParser mParser;
//Views for drawing pictures
private DrawingView mDrawView;
private EditText messageEdT;
private ImageButton currPaint, drawBtn, newBtn, saveBtn;
private ImageView sendImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewsById();
startLogin();
}
private void findViewsById(){
mDanmakuView = (IDanmakuView) findViewById(R.id.sv_danmaku);
DanmakuGlobalConfig.DEFAULT.setDanmakuStyle(DanmakuGlobalConfig.DANMAKU_STYLE_NONE, 3)
.setDuplicateMergingEnabled(false)
.setMaximumVisibleSizeInScreen(300)
.setCacheStuffer(new BackgroundCacheStuffer());
if(mDanmakuView != null) {
mParser = createParser(this.getResources().openRawResource(R.raw.comments));
mDanmakuView.setCallback(new Callback() {
@Override
public void updateTimer(DanmakuTimer timer) {
}
@Override
public void prepared() {
mDanmakuView.start();
}
});
mDanmakuView.prepare(mParser);
mDanmakuView.enableDanmakuDrawingCache(true);
mDanmakuView.show();
}
//implements the interface to add a danmaku from your friends
mDrawView = (DrawingView)findViewById(R.id.drawing_view);
mDrawView.setDanmakuMessageListener(new DrawingView.DanmakuMessageListener() {
@Override
public void onMessageCome(String msg) {
addDanmaku(false, msg);
}
});
LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors);
currPaint = (ImageButton)paintLayout.getChildAt(0);
drawBtn = (ImageButton)findViewById(R.id.draw_btn);
drawBtn.setOnClickListener(this);
newBtn = (ImageButton)findViewById(R.id.new_btn);
newBtn.setOnClickListener(this);
saveBtn = (ImageButton)findViewById(R.id.save_btn);
saveBtn.setOnClickListener(this);
sendImg = (ImageView)findViewById(R.id.send);
sendImg.setOnClickListener(this);
messageEdT = (EditText)findViewById(R.id.message_edt);
messageEdT.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == R.id.send || actionId == EditorInfo.IME_NULL) {
String message = messageEdT.getText().toString().trim();
if(!"".equals(message)){
mDrawView.sendDanmaku(message);
messageEdT.setText("");
}
return true;
}
return false;
}
});
}
//custom danmakuViews
private static class BackgroundCacheStuffer extends SpannedCacheStuffer {
final Paint paint = new Paint();
@Override
public void measure(BaseDanmaku danmaku, TextPaint paint) {
danmaku.padding = 10;
super.measure(danmaku, paint);
}
@Override
public void drawBackground(BaseDanmaku danmaku, Canvas canvas, float left, float top) {
paint.setColor(Color.argb(0, 0, 0, 0));
canvas.drawRect(left + 2, top + 2, left + danmaku.paintWidth - 2, top + danmaku.paintHeight - 2, paint);
}
@Override
public void drawStroke(BaseDanmaku danmaku, String lineText, Canvas canvas, float left, float top, Paint paint) {
}
}
private void addDanmaku(boolean islive, String msg) {
BaseDanmaku danmaku = DanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
if (danmaku == null || mDanmakuView == null) {
return;
}
danmaku.text = msg;
danmaku.padding = 5;
danmaku.priority = 1;
danmaku.isLive = islive;
danmaku.time = mDanmakuView.getCurrentTime() + 1200;
danmaku.textColor = Color.RED;
danmaku.textSize = 30f * (mParser.getDisplayer().getDensity() - 0.6f);
danmaku.textShadowColor = Color.WHITE;
mDanmakuView.addDanmaku(danmaku);
}
private BaseDanmakuParser createParser(InputStream stream) {
if (stream == null) {
return new BaseDanmakuParser() {
@Override
protected Danmakus parse() {
return new Danmakus();
}
};
}
ILoader loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI);
try {
loader.load(stream);
} catch (IllegalDataException e) {
e.printStackTrace();
}
BaseDanmakuParser parser = new BiliDanmukuParser();
IDataSource<?> dataSource = loader.getDataSource();
parser.load(dataSource);
return parser;
}
//first to create a nice name
private void startLogin(){
startActivityForResult(new Intent(this, LoginActivity.class), 0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != Activity.RESULT_OK){
return;
}
String username = data.getStringExtra("username");
mDrawView.setUserName(username);
}
//when you change the color, you should let your friends know
public void chooseColor(View view){
if(view!=currPaint){
currPaint=(ImageButton)view;
String color = view.getTag().toString();
mDrawView.setColor(color);
mDrawView.sendChangedColor(color);
}
}
@Override
public void onClick(View view) {
if(view.getId()==R.id.draw_btn){
AlertDialog.Builder drawDialog = new AlertDialog.Builder(this);
drawDialog.setTitle("Have a good time");
drawDialog.setMessage("choose color to paint a picture");
drawDialog.show();
}
else if(view.getId()==R.id.new_btn){
AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
newDialog.setTitle("New drawing");
newDialog.setMessage("Start new drawing (you will lose the current drawing)?");
newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
mDrawView.startNew();
dialog.dismiss();
}
});
newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
dialog.cancel();
}
});
newDialog.show();
}
else if(view.getId()==R.id.save_btn){
AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
saveDialog.setTitle("Save drawing");
saveDialog.setMessage("Save drawing to device Gallery?");
saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
mDrawView.setDrawingCacheEnabled(true);
String imgSaved = MediaStore.Images.Media.insertImage(
getContentResolver(), mDrawView.getDrawingCache(),
UUID.randomUUID().toString()+".png", "drawing");
if(imgSaved!=null){
Toast savedToast = Toast.makeText(getApplicationContext(),
"Drawing saved to Gallery!", Toast.LENGTH_SHORT);
savedToast.show();
}
else{
Toast unsavedToast = Toast.makeText(getApplicationContext(),
"Oops! Image could not be saved.", Toast.LENGTH_SHORT);
unsavedToast.show();
}
mDrawView.destroyDrawingCache();
}
});
saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
dialog.cancel();
}
});
saveDialog.show();
}else if(view.getId()==R.id.send){
String message = messageEdT.getText().toString().trim();
if(!message.equals(""));
mDrawView.sendDanmaku(message);
messageEdT.setText("");
}
}
// when user click a blank place the keyboard should hide
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = { 0, 0 };
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
return false;
} else {
return true;
}
}
return false;
}
}