/*
* 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 my.home.lehome.mvp.presenters;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.squareup.otto.Subscribe;
import java.io.File;
import java.lang.ref.WeakReference;
import my.home.common.BusProvider;
import my.home.common.util.PrefUtil;
import my.home.domain.events.DRecordingMsgEvent;
import my.home.domain.events.DSendingMsgEvent;
import my.home.domain.usecase.RecordMsgUsecase;
import my.home.domain.usecase.RecordMsgUsecaseImpl;
import my.home.domain.usecase.SendMsgUsecase;
import my.home.domain.usecase.SendMsgUsecaseImpl;
import my.home.lehome.mvp.views.SendMessageView;
import my.home.lehome.util.Constants;
/**
* Created by legendmohe on 15/11/28.
*/
public class MessageViewPresenter extends MVPPresenter implements RecordMsgUsecaseImpl.RecorderStateListener {
private static final String TAG = MessageViewPresenter.class.getSimpleName();
private static final int START_RECORD = 0;
private static final int STOP_RECORD = 1;
private static final int CANCEL_RECORD = 2;
private WeakReference<SendMessageView> mMessageView;
private H mH;
private RecordMsgUsecase mRecordMsgUsecase;
private SendMsgUsecase mSendMsgUsecase;
private File mSendingFile;
public MessageViewPresenter(SendMessageView messageView) {
mH = new H();
this.mMessageView = new WeakReference<>(messageView);
if (this.mMessageView.get() != null) {
this.mRecordMsgUsecase = new RecordMsgUsecaseImpl(mMessageView.get().getContext(), Constants.MESSAGE_PREFIX);
((RecordMsgUsecaseImpl) this.mRecordMsgUsecase).setListener(this);
String homeId = PrefUtil.getStringValue(this.mMessageView.get().getContext(), "pref_bind_device", "");
this.mSendMsgUsecase = new SendMsgUsecaseImpl(mMessageView.get().getContext(), homeId);
}
}
@Override
public void start() {
BusProvider.getUIBusInstance().register(this);
}
@Override
public void stop() {
mRecordMsgUsecase.cleanup();
mSendMsgUsecase.cleanup();
BusProvider.getUIBusInstance().unregister(this);
}
public void startRecording() {
mH.removeMessages(START_RECORD);
mH.sendEmptyMessageDelayed(START_RECORD, 300);
}
public void cancelRecording() {
mH.removeMessages(START_RECORD);
mRecordMsgUsecase
.setEvent(RecordMsgUsecase.Event.CANCEL)
.execute();
}
public void finishRecording() {
mH.removeMessages(START_RECORD);
mH.removeMessages(STOP_RECORD);
mH.sendEmptyMessageDelayed(STOP_RECORD, 500);
}
public void cancelSending() {
if (mSendingFile != null)
mSendMsgUsecase.cancel(mSendingFile);
}
@Subscribe
public void onRecordingStart(DRecordingMsgEvent.TYPE startEvent) {
if (mMessageView.get() != null)
mMessageView.get().onRecordingBegin();
}
@Subscribe
public void onRecordingMsgEvent(DRecordingMsgEvent event) {
if (event.getMsgItem() != null) {
Log.d(TAG, "onRecordingMsgEvent: " + event.getMsgItem().getTitle());
if (mMessageView.get() != null) {
mMessageView.get().onRecordingEnd();
}
mSendingFile = event.getResultFile();
mSendMsgUsecase
.setTargetFile(mSendingFile)
.setEvent(SendMsgUsecase.Event.START)
.execute();
} else {
if (mMessageView.get() != null)
mMessageView.get().onRecordingEnd();
Log.d(TAG, "record fail or cancel");
}
}
@Subscribe
public void onSendingMsgEvent(DSendingMsgEvent event) {
if (mMessageView.get() == null) {
Log.e(TAG, "onSendingMsgEvent: mMessage is null");
return;
}
Log.d(TAG, "onSendingMsgEvent: " + event.type);
switch (event.type) {
case BEGIN:
mMessageView.get().onSendingMsgBegin(event.tag);
break;
case SUCCESS:
mMessageView.get().onSendingMsgSuccess(event.tag);
mSendingFile = null;
break;
case FAIL:
mMessageView.get().onSendingMsgFail(event.tag);
mSendingFile = null;
break;
}
}
@Override
public void onGetAmplitude(double value) {
mMessageView.get().onRecordingAmplitude(value);
}
@Override
public void processWaveform(short[] notProcessData, int len) {
if (mMessageView.get() != null) {
mMessageView.get().putDataForWaveform(notProcessData, len);
}
}
private class H extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case START_RECORD:
mH.removeMessages(START_RECORD);
mRecordMsgUsecase
.setEvent(RecordMsgUsecase.Event.START)
.execute();
break;
case CANCEL_RECORD:
break;
case STOP_RECORD:
mH.removeMessages(STOP_RECORD);
mRecordMsgUsecase
.setEvent(RecordMsgUsecase.Event.STOP)
.execute();
break;
}
}
}
}