package com.RSen.Commandr.builtincommands;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.widget.Toast;
import com.RSen.Commandr.R;
import com.RSen.Commandr.core.MAPIReceiver;
import com.RSen.Commandr.core.MostWantedCommand;
import com.seebye.messengerapi.api.Contact;
import com.seebye.messengerapi.api.MessengerAPI;
import com.seebye.messengerapi.api.constants.Action;
import com.seebye.messengerapi.api.constants.MessageType;
import com.seebye.messengerapi.api.constants.Messenger;
import com.seebye.messengerapi.api.constants.ResponseType;
import com.seebye.messengerapi.api.utils.PackageUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Seebye
* Commandr for Google Now
* MAPISendWhatsappCommand.java
* @version 1.0
* 23.05.15
*/
public class MAPISendWhatsappCommand extends MostWantedCommand
implements MAPIReceiver.ResponseCallback
{
private static final String PKG_WHATSAPP = "com.whatsapp";
private static String TITLE;
private static String DEFAULT_PHRASE;
private Context context;
private ConcurrentHashMap<Long, String> m_mapPredicate = new ConcurrentHashMap<Long, String>();
public MAPISendWhatsappCommand(Context ctx) {
DEFAULT_PHRASE = ctx.getString(isMAPIAvailable() ? R.string.send_whatsapp_phrase_mapi : R.string.send_whatsapp_phrase);
TITLE = ctx.getString(R.string.send_whatsapp_title);
context = ctx;
}
@Override
public void execute(Context context, String predicate) {
if(!PackageUtils.exists(PKG_WHATSAPP))
{
installWhatsApp();
}
else
{
if(!isMAPIAvailable())
{
executeEasySolution(predicate);
}
else
{
try
{
executeMAPISolution(predicate);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
private boolean isMAPIAvailable()
{
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
}
private void interpretMessage(ArrayList<Contact> aContacts, String predicate)
{
boolean bFound = false;
Collections.sort(aContacts, new Comparator<Contact>()
{
@Override
public int compare(Contact lhs, Contact rhs)
{
return rhs.getDisplayname().length() - lhs.getDisplayname().length();
}
});
for(int i = 0; i < aContacts.size()
&& !bFound;
i++)
{
Contact contact = aContacts.get(i);
String strText;
if(predicate.startsWith(contact.getDisplayname().toLowerCase()))
{
bFound = true;
strText = predicate.substring(contact.getDisplayname().length()).trim();
try
{
MessengerAPI.sendMessage(Messenger.WHATSAPP, contact.getIDMessenger(), MessageType.TEXT, strText).send();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
if(!bFound)
{
Toast.makeText(context, context.getString(R.string.unknown_contact), Toast.LENGTH_LONG).show();
}
}
private void executeMAPISolution(String predicate) throws Exception
{
if(MessengerAPI.isInstalled())
{
if(MessengerAPI.isEnabled())
{
long lBroadcastID = MessengerAPI.getContacts(Messenger.WHATSAPP.getFlag()).send().getID();
m_mapPredicate.put(lBroadcastID, predicate);
MAPIReceiver.registerRequest(this, lBroadcastID, this);
}
else
{
requestAccess();
}
}
else
{
installMAPI();
}
}
private void executeEasySolution(String predicate)
{
/**
* Duplicated from {@link SendWhatsappCommand#execute(Context, String)}
*/
try {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, predicate);
sendIntent.setType("text/plain");
sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sendIntent.setPackage(PKG_WHATSAPP);
context.startActivity(sendIntent);
} catch (Exception e) {}
}
private void requestAccess() throws Exception
{
Toast.makeText(context, context.getString(R.string.allow_access_mapi), Toast.LENGTH_LONG).show();
MessengerAPI.requestAccess().send();
}
private void installMAPI()
{
Toast.makeText(context, context.getString(R.string.install_mapi), Toast.LENGTH_LONG).show();
MessengerAPI.openPlayStoreEntry();
}
private void installWhatsApp()
{
Toast.makeText(context, context.getString(R.string.install_whatsapp), Toast.LENGTH_LONG).show();
final String appPackageName = PKG_WHATSAPP;
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
} catch (android.content.ActivityNotFoundException anfe) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
}
@Override
protected boolean isOnByDefault() {
return false;
}
@Override
public boolean isAvailable(Context context) {
return true;
}
@Override
public String getTitle() {
return TITLE;
}
@Override
public String getDefaultPhrase() {
return DEFAULT_PHRASE;
}
@Override
public boolean isHandlingGoogleNowReset() {
return true;
}
@Override
public String getPredicateHint() {
return context.getString(isMAPIAvailable() ? R.string.syntax_mapi : R.string.message);
}
@Override
public void onResponseReceived(long lBroadcastID, int nRequestActionID, @NonNull ResponseType responseType, @NonNull Action action, @NonNull Bundle extras)
{
try
{
String strPredicate = m_mapPredicate.remove(lBroadcastID);
if(strPredicate != null && responseType == ResponseType.SUCCESS)
{
interpretMessage(Contact.fromBundle(extras), strPredicate);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}