/*
* Copyright (C) 2012 yueyueniao
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.suan.weclient.fragment.mass;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.suan.weclient.R;
import com.suan.weclient.activity.MainActivity;
import com.suan.weclient.adapter.MaterialListAdapter;
import com.suan.weclient.fragment.BaseFragment;
import com.suan.weclient.util.GlobalContext;
import com.suan.weclient.util.Util;
import com.suan.weclient.util.data.DataManager;
import com.suan.weclient.util.data.bean.MaterialBean;
import com.suan.weclient.util.data.bean.UserBean;
import com.suan.weclient.util.data.holder.resultHolder.MaterialResultHolder;
import com.suan.weclient.util.net.UploadHelper;
import com.suan.weclient.util.net.WechatManager;
import com.suan.weclient.util.voice.RecorderThread;
import com.suan.weclient.util.voice.VoiceHolder;
import com.suan.weclient.util.voice.VoiceManager;
import com.suan.weclient.view.ptr.PTRListview;
import java.io.File;
import java.io.FileInputStream;
public class MassVoiceFragment extends BaseFragment implements PTRListview.OnRefreshListener, PTRListview.OnLoadListener {
private DataManager mDataManager;
private Dialog popDialog;
private View view;
private RelativeLayout voicePlayLayout;
private ImageView playImageView;
private TextView voiceInfoTextView;
private LinearLayout selectLayout;
private TextView clickToUploadTextView;
private RelativeLayout uploadLayout;
private ImageView uploadLoadingView;
private Animation uploadCircleAnimation;
private boolean uploading = false;
private String wavAudioPath = "";
/*
common
*/
private TextView massLeftNumTextView;
private Button sendButton;
private PTRListview ptrListview;
private MaterialListAdapter materialListAdapter;
private MaterialListAdapter.ItemViewHolder selectedHolder;
private MaterialBean selectedBean;
private VoiceHolder selectedVoiceHolder;
private MaterialHandler mHandler;
private static final int PAGE_MESSAGE_AMOUNT = 10;
/*
about adapter list change
*/
public static final int MESSAGE_NOTIFY_TYPE_ONLY_REFRESH = 2;
public static final int MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA = 3;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.mass_voice_layout, null);
/*
init data
*/
MainActivity mainActivity = (MainActivity) getActivity();
mDataManager = ((GlobalContext) mainActivity.getApplicationContext()).getDataManager();
initWidgets();
initListener();
return view;
}
private void initListener() {
mHandler = new MaterialHandler();
mDataManager.addLoginListener(new DataManager.LoginListener() {
@Override
public void onLogin(final UserBean userBean) {
// TODO Auto-generated method stub
setMassLeft();
}
});
mDataManager.addMassDataGetListener(new DataManager.MassDataGetListener() {
@Override
public void onGet(UserBean userBean) {
setMassLeft();
}
});
mDataManager.addMaterialChangeListener(new DataManager.MaterialGetListener() {
@Override
public void onMaterialGet(int type, MaterialResultHolder materialResultHolder) {
if (type == MaterialBean.MATERIAL_TYPE_VOICE) {
Message notifyMessage = new Message();
notifyMessage.arg1 = MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA;
notifyMessage.obj = materialResultHolder;
mHandler.sendMessage(notifyMessage);
}
}
});
mDataManager.addRecordListener(new RecorderThread.RecordListener() {
@Override
public void onRecordStart(int type) {
}
@Override
public void onRecordFinish(int type, String filePath, long playLength) {
if (type == RecorderThread.RECORD_TYPE_MASS) {
wavAudioPath = filePath;
setContentVoice(playLength);
uploadLayout.setVisibility(View.VISIBLE);
}
}
@Override
public void onRecordError(int type) {
}
});
}
private void setUploadingView(boolean uploading) {
this.uploading = uploading;
if (uploading) {
clickToUploadTextView.setVisibility(View.INVISIBLE);
uploadLoadingView.setVisibility(View.VISIBLE);
uploadLoadingView.startAnimation(uploadCircleAnimation);
} else {
clickToUploadTextView.setVisibility(View.VISIBLE);
uploadLoadingView.clearAnimation();
uploadLoadingView.setVisibility(View.GONE);
}
}
private void initWidgets() {
clickToUploadTextView = (TextView) view.findViewById(R.id.mass_voice_text_click_to_upload);
uploadLayout = (RelativeLayout) view.findViewById(R.id.mass_voice_layout_upload);
uploadLoadingView = (ImageView) view.findViewById(R.id.mass_voice_img_upload_circle);
uploadCircleAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.loading_animation);
uploadLayout.setVisibility(View.GONE);
uploadLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (uploading) {
Toast.makeText(getActivity(), "正在上传,请稍后再点击", Toast.LENGTH_SHORT).show();
return;
}
if (wavAudioPath.length() > 1) {
setUploadingView(true);
mDataManager.getWechatManager().getUploadInfo(mDataManager.getCurrentPosition(), new WechatManager.OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
switch (code) {
case WechatManager.ACTION_SUCCESS:
Toast.makeText(getActivity(), "准备成功", Toast.LENGTH_SHORT).show();
mDataManager.getWechatManager().uploadImg(mDataManager.getCurrentPosition(), wavAudioPath, new WechatManager.OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
setUploadingView(false);
switch (code) {
case WechatManager.ACTION_SUCCESS:
Toast.makeText(getActivity(), "上传成功", Toast.LENGTH_SHORT).show();
UploadHelper.NowUploadBean nowUploadBean = (UploadHelper.NowUploadBean) object;
selectedBean = new MaterialBean(nowUploadBean.getContent(), MaterialBean.MATERIAL_TYPE_VOICE);
uploadLayout.setVisibility(View.GONE);
break;
case WechatManager.ACTION_TIME_OUT:
Toast.makeText(getActivity(), "上传失败,请求超时", Toast.LENGTH_SHORT).show();
break;
case WechatManager.ACTION_OTHER:
Toast.makeText(getActivity(), "上传失败,网路错误", Toast.LENGTH_SHORT).show();
break;
case WechatManager.ACTION_SPECIFICED_ERROR:
Toast.makeText(getActivity(), "上传失败", Toast.LENGTH_SHORT).show();
break;
}
}
});
break;
case WechatManager.ACTION_TIME_OUT:
Toast.makeText(getActivity(), "上传准备失败,请求超时", Toast.LENGTH_SHORT).show();
setUploadingView(false);
break;
case WechatManager.ACTION_OTHER:
Toast.makeText(getActivity(), "上传准备失败,网路错误", Toast.LENGTH_SHORT).show();
setUploadingView(false);
break;
case WechatManager.ACTION_SPECIFICED_ERROR:
Toast.makeText(getActivity(), "上传准备失败", Toast.LENGTH_SHORT).show();
setUploadingView(false);
break;
}
}
});
}
}
});
voicePlayLayout = (RelativeLayout) view.findViewById(R.id.mass_voice_layout_play);
playImageView = (ImageView) view.findViewById(R.id.mass_voice_button_play);
voiceInfoTextView = (TextView) view.findViewById(R.id.mass_voice_text_info);
voicePlayLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (selectedVoiceHolder != null) {
if (selectedVoiceHolder.getPlaying()) {
mDataManager.getVoiceManager().stopMusic();
} else {
mDataManager.getVoiceManager().playVoice(
selectedVoiceHolder.getBytes(),
selectedVoiceHolder.getPlayLength(),
selectedVoiceHolder.getLength(),
new VoiceManager.AudioPlayListener() {
@Override
public void onAudioStop() {
// TODO Auto-generated method stub
selectedVoiceHolder.setPlaying(false);
playImageView.setSelected(false);
}
@Override
public void onAudioStart() {
// TODO Auto-generated method stub
selectedVoiceHolder.setPlaying(true);
playImageView.setSelected(true);
}
@Override
public void onAudioError() {
// TODO Auto-generated method stub
}
});
}
} else {
popOptionDialog();
}
}
});
selectLayout = (LinearLayout) view.findViewById(R.id.mass_voice_layout_edit);
selectLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popOptionDialog();
}
});
massLeftNumTextView = (TextView) view
.findViewById(R.id.mass_text_left_num);
sendButton = (Button) view.findViewById(R.id.mass_button_send);
setMassLeft();
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mDataManager.getUserGroup().size() == 0) {
sendButton.setSelected(true);
} else {
if (mDataManager.getCurrentUser().getMassLeft() <= 0) {
sendButton.setSelected(true);
} else {
sendButton.setSelected(false);
dialogEnsureMass();
}
}
}
;
});
}
@Override
public void onResume() {
super.onResume();
setContentVoice();
}
private void popOptionDialog() {
popDialog = Util.createVoiceSelectDialog(getActivity(), new OnClickListener() {
@Override
public void onClick(View v) {
try {
mDataManager.getRecordLayoutControlListener().onLayoutShow();
} catch (Exception e) {
}
popDialog.dismiss();
}
}, new OnClickListener() {
@Override
public void onClick(View v) {
popDialog.dismiss();
popMaterialList();
}
}
);
popDialog.show();
}
private void setContentVoice() {
if (selectedHolder != null && selectedHolder.getDataLoaded()) {
selectedVoiceHolder = (VoiceHolder) selectedHolder.getData();
int playLength = Integer.parseInt(selectedHolder.getMaterialBean().getPlay_length());
int seconds = playLength / 1000;
int minutes = seconds / 60;
int leaveSecond = seconds % 60;
String info = "";
if (minutes != 0) {
info += minutes + "'";
}
info += " " + leaveSecond + "'";
voiceInfoTextView.setText(info);
} else if (selectedVoiceHolder != null) {
int playLength = selectedVoiceHolder.getPlayLength();
int seconds = playLength / 1000;
int minutes = seconds / 60;
int leaveSecond = seconds % 60;
String info = "";
if (minutes != 0) {
info += minutes + "'";
}
info += " " + leaveSecond + "'";
voiceInfoTextView.setText(info);
}
}
private void setContentVoice(long playLengthHa) {
try {
int playLength = (int) playLengthHa;
File file = new File(wavAudioPath);
FileInputStream fileInputStream = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fileInputStream.read(data);
selectedVoiceHolder = new VoiceHolder(data, playLength + "", data.length + "");
int seconds = playLength / 1000;
int minutes = seconds / 60;
int leaveSecond = seconds % 60;
String info = "";
if (minutes != 0) {
info += minutes + "'";
}
info += " " + leaveSecond + "'";
voiceInfoTextView.setText(info);
} catch (Exception e) {
}
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
private class MaterialHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.arg1) {
case MESSAGE_NOTIFY_TYPE_ONLY_REFRESH:
break;
case MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA:
MaterialResultHolder materialResultHolder = (MaterialResultHolder) msg.obj;
mDataManager.getMaterialHolder().mergeMaterialResult(materialResultHolder);
if (materialResultHolder != null) {
switch (materialResultHolder.getResultMode()) {
case MaterialResultHolder.RESULT_MODE_ADD:
try {
ptrListview.onLoadComplete();
} catch (Exception e) {
}
break;
case MaterialResultHolder.RESULT_MODE_REFRESH:
try {
materialListAdapter.updateCache();
ptrListview.onRefreshComplete();
ptrListview.setSelection(1);
} catch (Exception e) {
}
break;
}
}
break;
}
try {
int size = mDataManager.getMaterialHolder().getMaterialCount();
ptrListview.setLoadEnable(size % PAGE_MESSAGE_AMOUNT == 0);
ptrListview.requestLayout();
materialListAdapter.notifyDataSetChanged();
} catch (Exception e) {
}
}
}
@Override
public void onRefresh() {
new GetDataTask(ptrListview, PTRListview.PTR_MODE_REFRESH).execute();
}
@Override
public void onLoad() {
new GetDataTask(ptrListview, PTRListview.PTR_MODE_LOAD).execute();
}
private class GetDataTask extends AsyncTask<Void, Void, Void> {
private PTRListview mRefreshedView;
private boolean end = false;
private int mode;
public GetDataTask(PTRListview refreshedView, int mode) {
mRefreshedView = refreshedView;
this.mode = mode;
end = false;
if (mDataManager.getCurrentMessageHolder() == null) {
end = true;
mRefreshedView.onLoadComplete();
return;
}
try {
if (mode == PTRListview.PTR_MODE_LOAD) {
int size = mDataManager.getMaterialHolder().getMaterialCount();
// must be fuul amount of page
if (size % PAGE_MESSAGE_AMOUNT == 0) {
mDataManager.getWechatManager().getMaterialList(MaterialBean.MATERIAL_TYPE_VOICE, size, mDataManager.getCurrentPosition(), new WechatManager.OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
switch (code) {
case WechatManager.ACTION_SUCCESS:
mDataManager.doMaterialGet(MaterialBean.MATERIAL_TYPE_VOICE, (MaterialResultHolder) object);
break;
case WechatManager.ACTION_TIME_OUT:
break;
case WechatManager.ACTION_OTHER:
break;
case WechatManager.ACTION_SPECIFICED_ERROR:
mDataManager.doPopEnsureDialog(true, true, "登录超时", "登录超时", new DataManager.DialogSureClickListener() {
@Override
public void onClick(View v) {
mDataManager.doAutoLogin();
}
});
break;
}
try {
ptrListview.onLoadComplete();
} catch (Exception e) {
}
end = true;
}
});
} else {
try {
ptrListview.onLoadComplete();
} catch (Exception e) {
}
end = true;
}
} else if (mode == PTRListview.PTR_MODE_REFRESH) {
mDataManager.getWechatManager().getMaterialList(MaterialBean.MATERIAL_TYPE_VOICE, 0, mDataManager.getCurrentPosition(), new WechatManager.OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
switch (code) {
case WechatManager.ACTION_SUCCESS:
mDataManager.doMaterialGet(MaterialBean.MATERIAL_TYPE_VOICE, (MaterialResultHolder) object);
break;
case WechatManager.ACTION_TIME_OUT:
break;
case WechatManager.ACTION_OTHER:
break;
case WechatManager.ACTION_SPECIFICED_ERROR:
mDataManager.doPopEnsureDialog(true, true, "登录超时", "登录超时", new DataManager.DialogSureClickListener() {
@Override
public void onClick(View v) {
mDataManager.doAutoLogin();
}
});
break;
}
try {
ptrListview.onRefreshComplete();
} catch (Exception e) {
}
end = true;
}
});
}
} catch (Exception e) {
}
}
@Override
protected Void doInBackground(Void... params) {
// Simulates a background job.
try {
while (!end) {
Thread.sleep(50);
}
} catch (Exception exception) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
switch (mode) {
case PTRListview.PTR_MODE_LOAD:
try {
mRefreshedView.onLoadComplete();
} catch (Exception e) {
}
break;
case PTRListview.PTR_MODE_REFRESH:
try {
mRefreshedView.onRefreshComplete();
} catch (Exception e) {
}
break;
}
}
}
private void mass() {
mDataManager.doLoadingStart("发送中", WechatManager.DIALOG_POP_CANCELABLE);
mDataManager.getWechatManager().mass(mDataManager.getCurrentPosition(),
selectedBean, new WechatManager.OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
mDataManager.doPopEnsureDialog(false, true, "恭喜", "群发成功",
new DataManager.DialogSureClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mDataManager.doDismissAllDialog();
}
});
mDataManager.getCurrentUser().setMassLeft(mDataManager.getCurrentUser().getMassLeft() - 1);
setMassLeft();
}
});
}
public void setMassLeft() {
String typeString = "";
switch (mDataManager.getCurrentUser().getUserType()) {
case UserBean.USER_TYPE_SUBSTRICTION:
typeString = "今天";
break;
case UserBean.USER_TYPE_SERVICE:
typeString = "本月";
break;
}
if (mDataManager.getUserGroup().size() == 0) {
massLeftNumTextView.setText("你" + typeString + "还能群发 " + 0 + " 条消息");
} else {
massLeftNumTextView.setText("你" + typeString + "还能群发 "
+ mDataManager.getCurrentUser().getMassLeft() + " 条消息");
}
if (mDataManager.getUserGroup().size() == 0) {
sendButton.setSelected(true);
} else {
if (mDataManager.getCurrentUser().getMassLeft() <= 0) {
sendButton.setSelected(true);
} else {
sendButton.setSelected(false);
}
}
}
private void popMaterialList() {
mDataManager.createMaterialHolder(mDataManager.getCurrentUser());
popDialog = Util.createMaterialListDialog(getActivity(), "Img", new OnClickListener() {
@Override
public void onClick(View v) {
MaterialListAdapter.ItemViewHolder holder = materialListAdapter.getSelectedHolder();
if (holder != null) {
selectedHolder = holder;
selectedBean = holder.getMaterialBean();
setContentVoice();
popDialog.dismiss();
} else {
Toast.makeText(getActivity(), "请选择内容", Toast.LENGTH_LONG).show();
}
}
}, new OnClickListener() {
@Override
public void onClick(View v) {
popDialog.dismiss();
}
}
);
ptrListview = (PTRListview) popDialog.findViewById(R.id.dialog_material_list_content);
materialListAdapter = new MaterialListAdapter(getActivity(), mDataManager);
ptrListview.setonRefreshListener(this);
ptrListview.setOnLoadListener(this);
ptrListview.setAdapter(materialListAdapter);
ptrListview.setOnScrollListener(materialListAdapter);
ptrListview.onRefreshStart();
new GetDataTask(ptrListview, PTRListview.PTR_MODE_REFRESH).execute();
popDialog.show();
}
private void dialogEnsureMass() {
if (selectedBean == null) {
Toast.makeText(getActivity(), "请输入内容", Toast.LENGTH_SHORT).show();
return;
}
popDialog = Util.createEnsureDialog(new OnClickListener() {
@Override
public void onClick(View v) {
mass();
popDialog.dismiss();
}
}, true, getActivity(), "群发确认", "确认群发此消息", true);
popDialog.show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
}
}