/*
* 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.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.otto.Subscribe;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.List;
import my.home.common.BusProvider;
import my.home.domain.events.DSaveAutoCompleteLocalHistoryEvent;
import my.home.domain.events.DShowCmdSuggestionEvent;
import my.home.domain.usecase.MarkCurrentInputUsecaseImpl;
import my.home.lehome.asynctask.SaveCaptureAsyncTask;
import my.home.lehome.helper.LocationHelper;
import my.home.lehome.helper.MessageHelper;
import my.home.lehome.mvp.views.ChatItemListView;
import my.home.lehome.mvp.views.ChatSuggestionView;
import my.home.lehome.mvp.views.SaveLocalHistoryView;
import my.home.lehome.service.SendMsgIntentService;
import my.home.lehome.util.CommonUtils;
import my.home.lehome.util.Constants;
import my.home.model.entities.AutoCompleteItem;
import my.home.model.entities.ChatItem;
import my.home.model.entities.ChatItemConstants;
import my.home.model.manager.DBStaticManager;
/**
* Created by legendmohe on 15/2/19.
*/
public class ChatFragmentPresenter extends MVPPresenter {
private WeakReference<SaveLocalHistoryView> mSaveLocalHistoryView;
private WeakReference<ChatItemListView> mChatItemListView;
private WeakReference<ChatSuggestionView> mChatSuggestionView;
public static Handler SendMsgHandler;
private BgMessageBroadcastReceiver mbgMessageBroadcastReceiver;
private static class IntentServiceHandler extends Handler {
private final WeakReference<ChatItemListView> mChatItemListView;
public IntentServiceHandler(ChatItemListView listView) {
mChatItemListView = new WeakReference<>(listView);
}
@Override
public void handleMessage(Message msg) {
ChatItemListView listView = mChatItemListView.get();
if (listView != null) {
Bundle bundle = msg.getData();
bundle.setClassLoader(ChatItem.class.getClassLoader());
ChatItem item;
switch (msg.what) {
case SendMsgIntentService.MSG_BEGIN_SENDING:
Log.d("IntentServiceHandler", "SendMsgIntentService.MSG_BEGIN_SENDING");
item = bundle.getParcelable("item");
if (bundle.getBoolean("update", false)) {
listView.onChatItemRequest(item, true);
} else {
listView.onChatItemRequest(item, false);
}
break;
case SendMsgIntentService.MSG_END_SENDING:
Log.d("IntentServiceHandler", "SendMsgIntentService.MSG_END_SENDING");
int rep_code = bundle.getInt("rep_code", -1);
item = bundle.getParcelable("item");
if (item != null) {
if (rep_code == 200) {
listView.onChatItemResponse(rep_code, item.getId(), item.getState(), null);
} else {
ChatItem newItem = bundle.getParcelable("new_item");
listView.onChatItemResponse(rep_code, item.getId(), item.getState(), newItem);
}
}
break;
default:
break;
}
}
}
}
public ChatFragmentPresenter(SaveLocalHistoryView saveLocalHistoryView
, ChatItemListView chatItemListView
, ChatSuggestionView chatSuggestionView) {
this.mSaveLocalHistoryView = new WeakReference<>(saveLocalHistoryView);
this.mChatItemListView = new WeakReference<>(chatItemListView);
this.mChatSuggestionView = new WeakReference<>(chatSuggestionView);
SendMsgHandler = new IntentServiceHandler(chatItemListView);
}
public void markAndSendCurrentInput(String input, boolean local) {
if (mChatItemListView.get() == null)
return;
// new SendCommandAsyncTask(mChatItemListView.get().getContext(), input, local).execute();
Context context = mChatItemListView.get().getContext();
String message;
String serverURL;
if (local) {
message = MessageHelper.getFormatLocalMessage(context, input);
serverURL = MessageHelper.getLocalServerURL(mChatItemListView.get().getContext());
} else {
message = MessageHelper.getFormatMessage(context, input);
serverURL = MessageHelper.getServerURL(context, message);
}
Intent serviceIntent = new Intent(context, SendMsgIntentService.class);
serviceIntent.putExtra("local", local);
serviceIntent.putExtra("cmdString", message);
serviceIntent.putExtra("cmd", input.trim());
serviceIntent.putExtra("serverUrl", serverURL);
serviceIntent.putExtra("deviceID", MessageHelper.getDeviceID(context));
serviceIntent.putExtra("messenger", new Messenger(ChatFragmentPresenter.SendMsgHandler));
mChatItemListView.get().getContext().startService(serviceIntent);
new MarkCurrentInputUsecaseImpl(mSaveLocalHistoryView.get().getContext(), input.trim()).execute();
}
public void markAndSendCurrentChatItem(ChatItem chatItem, boolean local) {
if (mChatItemListView.get() == null)
return;
// new SendCommandAsyncTask(mChatItemListView.get().getContext(), chatItem, local).execute();
Context context = mChatItemListView.get().getContext();
String message;
String serverURL;
if (local) {
message = MessageHelper.getFormatLocalMessage(context, chatItem.getContent());
serverURL = MessageHelper.getLocalServerURL(mChatItemListView.get().getContext());
} else {
message = MessageHelper.getFormatMessage(context, chatItem.getContent());
serverURL = MessageHelper.getServerURL(context, message);
}
Intent serviceIntent = new Intent(context, SendMsgIntentService.class);
serviceIntent.putExtra("local", local);
serviceIntent.putExtra("update", chatItem);
serviceIntent.putExtra("cmdString", message);
serviceIntent.putExtra("cmd", chatItem.getContent().trim());
serviceIntent.putExtra("serverUrl", serverURL);
serviceIntent.putExtra("deviceID", MessageHelper.getDeviceID(context));
serviceIntent.putExtra("messenger", new Messenger(ChatFragmentPresenter.SendMsgHandler));
mChatItemListView.get().getContext().startService(serviceIntent);
new MarkCurrentInputUsecaseImpl(mSaveLocalHistoryView.get().getContext(), chatItem.getContent().trim()).execute();
// if (mChatItemListView.get() != null)
// mChatItemListView.get().onChatItemRequest(item, true);
}
// public void saveSaveLocalHistory() {
// new SaveAutoCompleteLocalHistoryUsecaseImpl(mSaveLocalHistoryView.get().getContext()).execute();
// }
public void resetDatas(Context context) {
List<ChatItem> chatItems = DBStaticManager.loadLatest(context, Constants.CHATITEM_LOAD_LIMIT);
if (chatItems != null) {
Collections.reverse(chatItems); // reverse descend items
mChatItemListView.get().onResetDatas(chatItems);
}
}
public void showNextCmdSuggestion(List<AutoCompleteItem> results, AutoCompleteItem item) {
for (int i = 0; i < results.size() - 1; i++) {
if (results.get(i).equals(item)) {
item = results.get(i + 1);
break;
}
}
if (mChatSuggestionView.get() != null) {
mChatSuggestionView.get().onShowSuggestion(item);
}
}
public void showPreCmdSuggestion(List<AutoCompleteItem> results, AutoCompleteItem item) {
if (item == null)
return;
for (int i = 1; i < results.size(); i++) {
if (results.get(i).equals(item)) {
item = results.get(i - 1);
break;
}
}
if (mChatSuggestionView.get() != null) {
mChatSuggestionView.get().onShowSuggestion(item);
}
}
@Override
public void start() {
BusProvider.getRestBusInstance().register(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SendMsgIntentService.ACTION_SEND_MSG_BEGIN);
intentFilter.addAction(SendMsgIntentService.ACTION_SEND_MSG_END);
mbgMessageBroadcastReceiver = new BgMessageBroadcastReceiver();
Context context = mChatItemListView.get().getContext();
context.registerReceiver(mbgMessageBroadcastReceiver, intentFilter);
}
@Override
public void stop() {
Context context = mChatItemListView.get().getContext();
if (mbgMessageBroadcastReceiver != null) {
context.unregisterReceiver(mbgMessageBroadcastReceiver);
mbgMessageBroadcastReceiver = null;
}
BusProvider.getRestBusInstance().unregister(this);
}
@Subscribe
public void onSaveAutoCompleteLocalHistoryItems(DSaveAutoCompleteLocalHistoryEvent event) {
if (event.getReturnCode() == DSaveAutoCompleteLocalHistoryEvent.SUCCESS)
this.mSaveLocalHistoryView.get().onSaveLocalHistoryFinish(true);
else
this.mSaveLocalHistoryView.get().onSaveLocalHistoryFinish(false);
}
@Subscribe
public void onShowCmdSuggestionEvent(DShowCmdSuggestionEvent event) {
if (mChatSuggestionView.get() != null) {
mChatSuggestionView.get().onShowSuggestion(event.getItem());
}
}
// @Subscribe
// public void onGetAutoCompleteItems(DShowAutoCompleteItemEvent event) {
// if (mChatSuggestionView.get() != null) {
// mChatSuggestionView.get().onGetAutoCompleteItems(event.getResultList());
// }
// }
public void saveImageItem(ChatItem item) {
if (mChatItemListView.get() == null
|| item == null
|| item.getType() != ChatItemConstants.TYPE_SERVER_IMAGE)
return;
String image_url = item.getContent();
String path = ImageLoader.getInstance().getDiskCache().get(image_url).getAbsolutePath();
// String fileName = new File(image_url).getName();
String fileName = CommonUtils.getDateFormatString("yyyy-MM-dd_hh-mm-ss") + ".jpg";
new SaveCaptureAsyncTask(mChatItemListView.get().getContext()).execute(path, fileName);
}
public void openLocationInBrowser(ChatItem item) {
if (mChatItemListView.get() == null)
return;
String src = item.getContent();
final String[] location = LocationHelper.parseLocationFromSrc(src);
final String latitude = location[2];
final String longitude = location[3];
Intent openIntent = LocationHelper.getBaiduMapUrlIntent(
longitude, latitude,
location[0], location[1],
"lehome", "lehome"
);
mChatItemListView.get().getContext().startActivity(openIntent);
}
public void copyLocationInfo(ChatItem item, String label) {
if (mChatItemListView.get() == null)
return;
Context context = mChatItemListView.get().getContext();
String src = item.getContent();
final String[] location = LocationHelper.parseLocationFromSrc(src);
CommonUtils.copyStringToClipboard(context, label, location[1]);
}
private class BgMessageBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (mChatItemListView.get() == null)
return;
Bundle bundle = intent.getExtras();
bundle.setClassLoader(ChatItem.class.getClassLoader());
ChatItemListView listView = mChatItemListView.get();
ChatItem item;
if (intent.getAction().equals(SendMsgIntentService.ACTION_SEND_MSG_BEGIN)) {
item = bundle.getParcelable("item");
if (bundle.getBoolean("update", false)) {
listView.onChatItemRequest(item, true);
} else {
listView.onChatItemRequest(item, false);
}
} else if (intent.getAction().equals(SendMsgIntentService.ACTION_SEND_MSG_END)) {
int rep_code = bundle.getInt("rep_code", -1);
item = bundle.getParcelable("item");
if (rep_code == 200) {
listView.onChatItemResponse(rep_code, item.getId(), item.getState(), null);
} else {
ChatItem newItem = bundle.getParcelable("new_item");
listView.onChatItemResponse(rep_code, item.getId(), item.getState(), newItem);
}
}
}
}
}