package com.talk.demo.daily;
import android.accounts.Account;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.renderscript.Allocation;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import com.faizmalkani.floatingactionbutton.FloatingActionButton;
import com.talk.demo.R;
import com.talk.demo.core.RecordManager;
import com.talk.demo.persistence.DBManager;
import com.talk.demo.persistence.DialogRecord;
import com.talk.demo.persistence.TimeRecord;
import com.talk.demo.prewrite.PreWrite;
import com.talk.demo.time.DateInfo;
import com.talk.demo.types.PrvDialog;
import com.talk.demo.util.AccountUtils;
import com.talk.demo.util.AlarmManagerUtil;
import com.talk.demo.util.NetworkUtilities;
import com.talk.demo.util.TalkUtil;
import org.apache.http.ParseException;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DailyEditActivity extends Activity {
private static String TAG = "DailyEditActivity";
private EditText edit_content;
private String pre_content;
private TextView tv, head;
private ImageView content_bg;
private ImageView add_photo;
private FloatingActionButton btn_accept;
private String fileName = null;
private DBManager mgr;
private RecordManager rMgr;
private String friend = null;
private TimeRecord tr = null;
private DialogRecord dr = null;
private String ownUser;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*set it to be no title*/
requestWindowFeature(Window.FEATURE_NO_TITLE);
/*set it to be full screen*/
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_dailyedit);
Bundle bundle = getIntent().getExtras();
if(bundle != null)
pre_content = bundle.getString("precontent");
edit_content = (EditText) findViewById(R.id.edit_content);
tv = (TextView) findViewById(R.id.daily_title);
head = (TextView) findViewById(R.id.daily_head);
PreWrite pw = new PreWrite(this);
// when need to change week day, am/pm
String when = pw.getWhen();
DateInfo dateInfo = new DateInfo(when);
dateInfo.parseCreateTime();
String current = dateInfo.getTimeHead();
String where = pw.getWhere();
head.setText(current+"\n"+where);
if(pre_content != null) {
tv.setVisibility(View.VISIBLE);
tv.setText(pre_content);
}
content_bg = (ImageView) findViewById(R.id.content_bg);
add_photo = (ImageView) findViewById(R.id.add_photo);
add_photo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
/*
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 300);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
*/
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), TalkUtil.REQUEST_SELECT_PICTURE);
}
});
btn_accept = (FloatingActionButton) findViewById(R.id.btn_accept);
btn_accept.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
send_dialog();
}
});
mgr = new DBManager(this);
rMgr = new RecordManager(mgr, this);
Account accout = AccountUtils.getPasswordAccessibleAccount(this);
if (accout != null && !TextUtils.isEmpty(accout.name)) {
Log.d(TAG,"ccount name: "+accout.name);
ownUser = accout.name;
}
/*
new Thread(new Runnable() {
@Override
public void run() {
applyBlur();
}
}).start();
*/
}
private void applyBlur() {
content_bg.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
content_bg.getViewTreeObserver()
.removeOnPreDrawListener(this);
content_bg.buildDrawingCache();
Bitmap bmp = content_bg.getDrawingCache();
blur(bmp, edit_content);
return true;
}
});
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void blur(Bitmap bkg, View view) {
long startMs = System.currentTimeMillis();
float radius = 20;
Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()),
(int) (view.getMeasuredHeight()), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(overlay);
canvas.translate(-view.getLeft(), -view.getTop());
canvas.drawBitmap(bkg, 0, 0, null);
RenderScript rs = RenderScript.create(this);
Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs,
overlayAlloc.getElement());
blur.setInput(overlayAlloc);
blur.setRadius(radius);
blur.forEach(overlayAlloc);
overlayAlloc.copyTo(overlay);
view.setBackground(new BitmapDrawable(getResources(), overlay));
rs.destroy();
}
private String shareToFriend(DialogRecord dialog, String name) {
String result = "ok";
//TODO
PrvDialog raw = PrvDialog.create(ownUser, ownUser, friend, friend, dialog.getPrvDialog().getContent(),
dialog.getPrvDialog().getCreateDate(), dialog.getPrvDialog().getCreateTime(), dialog.getPrvDialog().getContentType(), null,
null, 0, 11, 12, -1, 1);
try {
NetworkUtilities.shareRecord(raw, ownUser, name);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
private void uploadPhotoServer(String file) {
NetworkUtilities.uploadPhoto(file);
}
private class SyncPhotoTask extends AsyncTask<Void, Void, Integer> {
@Override
protected Integer doInBackground(Void... params) {
uploadPhotoServer("/sdcard/Demo/"+fileName);
return 0;
}
@Override
protected void onPostExecute(Integer e) {
}
@Override
protected void onCancelled() {
}
}
private void confirmDone() {
// save to db
String content = edit_content.getText().toString();
// Do nothing if content is empty
if (content.length() > 0) {
tr = new TimeRecord(content);
if(fileName != null) {
//tr = new TimeRecord("/sdcard/Demo/"+fileName);
tr.getTimeRecord().setPhoto(fileName);
new SyncPhotoTask().execute();
tr.getTimeRecord().setContentType(TalkUtil.MEDIA_TYPE_PHOTO_TEXT);
} else {
tr.getTimeRecord().setContentType(TalkUtil.MEDIA_TYPE_TEXT);
}
if(pre_content != null) {
tr.getTimeRecord().setTitle(pre_content);
}
tr.getTimeRecord().setHandle(ownUser);
tr.getTimeRecord().setDeleted(0);
tr.getTimeRecord().setDirty(1);
rMgr.addRecord(tr);
}
}
private void confirmDone(String target) {
friend = target;
Log.d(TAG, "friend is : "+friend);
//TODO: get time according to friend intimate
// for test: set 10 as default wait time
int wait_x_time = 20;
// save to db
String content = edit_content.getText().toString();
// Do nothing if content is empty
if (content.length() > 0) {
dr = new DialogRecord(content);
if(fileName != null) {
//tr = new TimeRecord("/sdcard/Demo/"+fileName);
dr.getPrvDialog().setPhoto(fileName);
new SyncPhotoTask().execute();
dr.getPrvDialog().setContentType(TalkUtil.MEDIA_TYPE_PHOTO_TEXT);
} else {
dr.getPrvDialog().setContentType(TalkUtil.MEDIA_TYPE_TEXT);
}
//TODO: add msg_interval_time and msg_done_time
dr.getPrvDialog().setSendInterval(wait_x_time);
//current+interval
Calendar calendar = Calendar.getInstance();
int doneSeconds = calendar.get(Calendar.SECOND) + wait_x_time;
calendar.set(Calendar.SECOND, doneSeconds);
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
String done_time = DateFormat.format("yyyyMMddHHmmss", calendar.getTime()).toString();
String test_time = formatter.format(date);
Log.d(TAG , "done time "+done_time+" test time "+test_time);
dr.getPrvDialog().setSendDoneTime(done_time);
// add sender object
dr.getPrvDialog().setSender(ownUser);
// save link object
dr.getPrvDialog().setLink(target);
rMgr.addDialog(dr);
}
//TODO: start Alarm Manager to send message after wait time
AlarmManagerUtil.sendUpdateBroadcast(this, wait_x_time*1000);
if(friend != null) {
new ShareRecordTask().execute();
}
}
private void confirmToTag(String tag) {
Log.d(TAG, "tag is : "+tag);
// save to db
String content = edit_content.getText().toString();
// Do nothing if content is empty
if (content.length() > 0) {
tr = new TimeRecord(content);
if (fileName != null) {
// tr = new TimeRecord("/sdcard/Demo/"+fileName);
tr.getTimeRecord().setPhoto(fileName);
new SyncPhotoTask().execute();
tr.getTimeRecord().setContentType(TalkUtil.MEDIA_TYPE_PHOTO_TEXT);
} else {
tr.getTimeRecord().setContentType(TalkUtil.MEDIA_TYPE_TEXT);
}
if(pre_content != null) {
tr.getTimeRecord().setTitle(pre_content);
}
// save tag object
tr.getTimeRecord().setTag(tag);
tr.getTimeRecord().setDeleted(0);
tr.getTimeRecord().setDirty(1);
rMgr.addRecord(tr);
}
//startActivity(new Intent(this, TagActivity.class));
//finish();
}
private void send_dialog() {
startActivityForResult(new Intent(this,SelectPopupActivity.class),TalkUtil.REQUEST_SEND_TO_WHAT);
}
@Override
public void finish() {
super.finish();
//关闭窗体动画显示
this.overridePendingTransition(0, R.anim.out_to_bottom);
}
private class ShareRecordTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
return shareToFriend(dr, friend);
}
@Override
protected void onPostExecute(final String authToken) {
}
@Override
protected void onCancelled() {
}
}
private void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, TalkUtil.REQUEST_PHOTO_CROPPER);
}
private void createDirAndSaveFile(Bitmap imageToSave, String fileName) {
File direct = new File(Environment.getExternalStorageDirectory() + "/Demo");
if(!direct.exists()) {
File fileDirectory = new File("/sdcard/Demo/");
fileDirectory.mkdirs();
}
File file = new File(new File("/sdcard/Demo/"), fileName);
if(file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}
private String getTimeAsFileName() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
return dateFormat.format(date);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "got the return :" + requestCode + " :" + resultCode);
switch (requestCode) {
case TalkUtil.REQUEST_SELECT_PICTURE:
if (resultCode == RESULT_OK) {
if(data != null ) {
Uri selectedImageUri = data.getData();
startPhotoZoom(selectedImageUri);
}
}
break;
case TalkUtil.REQUEST_PHOTO_CROPPER:// 返回的结果
if (resultCode == RESULT_OK) {
if(data != null ) {
Bundle bundle = data.getExtras();
if (bundle != null) {
Bitmap photo = bundle.getParcelable("data");
fileName = getTimeAsFileName();
createDirAndSaveFile(photo, fileName);
content_bg.setImageBitmap(photo);
//apply blur
//applyBlur();
}
}
}
break;
case TalkUtil.REQUEST_SEND_TO_WHAT:
if (resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
int to_what = extras.getInt("TO_WHAT");
Log.d(TAG, "result to what : "+to_what);
switch (to_what) {
case 1:
confirmDone();
break;
case 2:
case 3:
String target = extras.getString("TARGET");
Log.d(TAG, "target is : "+target);
confirmDone(target);
break;
case 4:
String tag = extras.getString("TAG");
Log.d(TAG, "tag is : "+tag);
confirmToTag(tag);
break;
}
finish();
}
break;
}
}
}