Advertisement
Guest User

Untitled

a guest
Jul 31st, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.36 KB | None | 0 0
  1. package com.docotel.esimpns.service.messaging;
  2.  
  3. import android.app.ActivityManager;
  4. import android.app.Notification;
  5. import android.app.NotificationManager;
  6. import android.app.PendingIntent;
  7. import android.app.Service;
  8. import android.content.BroadcastReceiver;
  9. import android.content.ComponentName;
  10. import android.content.Context;
  11. import android.content.Intent;
  12. import android.content.IntentFilter;
  13. import android.graphics.BitmapFactory;
  14. import android.media.RingtoneManager;
  15. import android.net.ConnectivityManager;
  16. import android.net.Uri;
  17. import android.os.Handler;
  18. import android.os.HandlerThread;
  19. import android.os.IBinder;
  20. import android.support.annotation.Nullable;
  21. import android.support.v7.app.NotificationCompat;
  22. import android.text.TextUtils;
  23. import android.util.Log;
  24.  
  25. import com.docotel.esimpns.MainApplication;
  26. import com.docotel.esimpns.R;
  27. import com.docotel.esimpns.helper.LoggerHelper;
  28. import com.docotel.esimpns.helper.NetworkHelper;
  29. import com.docotel.esimpns.helper.PreferenceHelper;
  30. import com.docotel.esimpns.model.form.ChatForm;
  31. import com.docotel.esimpns.model.form.ContactForm;
  32. import com.docotel.esimpns.model.response.contact.DataContact;
  33. import com.docotel.esimpns.model.response.contact.FriendData;
  34. import com.docotel.esimpns.modul.main.MainActivity;
  35. import com.docotel.esimpns.modul.messaging.conversation.ConversationActivity;
  36. import com.docotel.esimpns.setting.MessagingSetting;
  37. import com.docotel.esimpns.util.SimpleObserver;
  38.  
  39. import org.jivesoftware.smack.packet.Message;
  40. import org.jivesoftware.smack.packet.Stanza;
  41. import org.jivesoftware.smackx.receipts.DeliveryReceiptManager;
  42. import org.jivesoftware.smackx.receipts.ReceiptReceivedListener;
  43.  
  44. import java.util.ArrayList;
  45. import java.util.List;
  46.  
  47. import rx.Observable;
  48.  
  49. import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
  50. import static com.docotel.esimpns.helper.PreferenceHelper.CURRENT_ACTIVE_CHAT_CONTACT;
  51. import static com.docotel.esimpns.helper.PreferenceHelper.LOGIN_XMPP;
  52.  
  53. /**
  54.  * Created by Docotel on 7/6/2017.
  55.  */
  56.  
  57. public class MessagingService extends Service implements MessagingServiceView {
  58.  
  59.     public static final String ASK_FOR_LOCATION = "[DOCOTEL-ASK]";
  60.     public static final String ALLOW_YOUR_LOCATION = "[DOCOTEL-ALLOW]";
  61.     public static final String DENY_YOUR_LOCATION = "[DOCOTEL-DENY]";
  62.  
  63.     public static final String TRIGGER_CONVERSATION = "com.doco.trigger.action.CONVERSATION";
  64.     public static final String TRIGGER_CONVERSATION_KEY = "com.doco.trigger.CONVERSATION.KEY";
  65.     public static final int INCOMING_NOTIF_ID = 864;
  66.  
  67.     public static List<ContactForm> listContact;
  68.     public static MessagingSetting messagingSetting;
  69.     public static DeliveryReceiptManager deliveryReceiptManager;
  70.  
  71.     private Handler worker;
  72.     private PreferenceHelper preferences;
  73.  
  74.     private String message;
  75.     private String email;
  76.     private String typeOfMessage;
  77.     private String updateParams;
  78.     private boolean isRunAgain = false;
  79.  
  80.     private MessagingServiceRequestImpl request;
  81.  
  82.     @Nullable
  83.     @Override
  84.     public IBinder onBind(Intent intent) {
  85.         return null;
  86.     }
  87.  
  88.     @Override
  89.     public void onCreate() {
  90.         super.onCreate();
  91.         listContact = new ArrayList<>();
  92.         request = new MessagingServiceRequestImpl(this);
  93.         request.setBaseView(this);
  94.  
  95.         initDependencies();
  96.         registerReceiver();
  97.     }
  98.  
  99.     @Override
  100.     public int onStartCommand(Intent intent, int flags, int startId) {
  101.         updatePrefference(PreferenceHelper.INCOMING_CHAT_CONTACT_ID, "");
  102.         initMessageSetting();
  103.         initDeliveryMessageRecepient();
  104.  
  105.         if (intent != null) {
  106.             message = getExtraFromIntent(intent, ".message");
  107.             email = getExtraFromIntent(intent, ".email");
  108.             typeOfMessage = getExtraFromIntent(intent, ".typeOfMessage");
  109.             updateParams = getExtraFromIntent(intent, ".updateParams");
  110.  
  111.             updateMessageSetting(email, message);
  112.             connect();
  113.         }
  114.  
  115.         runHandler();
  116.  
  117.         return Service.START_STICKY;
  118.     }
  119.  
  120.     private void registerReceiver() {
  121.         IntentFilter filter = new IntentFilter();
  122.         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  123.         this.registerReceiver(wifiReceiver, filter);
  124.     }
  125.  
  126.     private BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
  127.         @Override
  128.         public void onReceive(Context context, Intent intent) {
  129.             switch (intent.getAction()) {
  130.                 case CONNECTIVITY_ACTION:
  131.                     if (NetworkHelper.isConnected(context)) {
  132.                         if (!isRunAgain) {
  133.                             sendPendingMessage();
  134.                             isRunAgain = true;
  135.                             request.onRestartService();
  136.                         }
  137.                     } else {
  138.                         isRunAgain = false;
  139.                     }
  140.                     break;
  141.             }
  142.         }
  143.     };
  144.  
  145.     private void sendPendingMessage() {
  146.         List<ChatForm> chats = new ChatForm(this).getListPendingChat("0");
  147.         if (!chats.isEmpty()) {
  148.             for (int i = 0; i < chats.size(); i++) {
  149.                 String msgToLocalDB = getMessageBy(chats.get(i).getType(), chats.get(i).getMessage());
  150.                 messagingSetting.sendPendingMessage(chats.get(i), msgToLocalDB);
  151.             }
  152.         }
  153.     }
  154.  
  155.     private void initDependencies() {
  156.         preferences = new PreferenceHelper(getApplicationContext());
  157.     }
  158.  
  159.     private void initHandler() {
  160.         HandlerThread workerThread = new HandlerThread("ConnectionService - WorkerThread");
  161.         workerThread.start();
  162.         worker = new Handler(workerThread.getLooper());
  163.     }
  164.  
  165.     private void initMessageSetting() {
  166.         System.out.println("MessagingService.initMessageSetting");
  167.         messagingSetting = new MessagingSetting(getApplicationContext());
  168.         messagingSetting.initMessaging();
  169.  
  170.         messagingSetting.setMessagesListener(new MessagingSetting.MessagesListener() {
  171.  
  172.             @Override
  173.             public void OnReceiveMessages(Message message) {
  174.                 syncContact();
  175.                 String firstLogin = getPrefference(PreferenceHelper.IS_LOGIN);
  176.                 if (TextUtils.isEmpty(firstLogin)) {
  177.                     disconnect();
  178.                     return;
  179.                 }
  180.  
  181.                 if (listContact == null)
  182.                     return;
  183.  
  184.                 ContactForm contact = getContactForm(listContact, message);
  185.                 if (contact == null)
  186.                     return;
  187.  
  188.                 if (TextUtils.isEmpty(message.getBody()))
  189.                     return;
  190.  
  191.                 if (!TextUtils.isEmpty(contact.getUsernameOpenFire())) {
  192.                     sendResult(contact, message.getBody(), message.getStanzaId());
  193.                     updatePrefference(PreferenceHelper.INCOMING_CHAT_CONTACT_ID, contact.getUsernameOpenFire());
  194.  
  195.                     Notification notification = createNotification(contact, message).build();
  196.                     notifyUser(contact, INCOMING_NOTIF_ID, notification);
  197.                 }
  198.             }
  199.         });
  200.     }
  201.  
  202.     private ContactForm getContactForm(List<ContactForm> listContact, Message message) {
  203.         return ContactForm.getContactByUsernameOpenFire(listContact, message.getFrom());
  204.     }
  205.  
  206.     private void connect() {
  207.         if (messagingSetting != null)
  208.             messagingSetting.connectToMessaging();
  209.     }
  210.  
  211.     private void disconnect() {
  212.         if (messagingSetting != null)
  213.             messagingSetting.disconnect();
  214.     }
  215.  
  216.     private void initDeliveryMessageRecepient() {
  217.         deliveryReceiptManager = getDeliveryReceiptManager();
  218.         deliveryReceiptManager.addReceiptReceivedListener(new ReceiptReceivedListener() {
  219.             @Override
  220.             public void onReceiptReceived(String fromJid, String toJid, String receiptId, Stanza receipt) {
  221.                 LoggerHelper.error("RECEIPT RECEIVED" + "From JID : " + fromJid + ", To JID : " + toJid + ", Receipt ID : " + receiptId + ", receipt : " + receiptId);
  222.  
  223.                 String contactId = getContactId(fromJid);
  224.                 List<ChatForm> listChat = getListOfChat(contactId);
  225.                 updateDatabaseOfChatForm(listChat, receiptId);
  226.                 broadCastNow("");
  227.             }
  228.         });
  229.     }
  230.  
  231.     private DeliveryReceiptManager getDeliveryReceiptManager() {
  232.         return messagingSetting.getDeliveryReceiptManager();
  233.     }
  234.  
  235.     private void updateDatabaseOfChatForm(List<ChatForm> chatForms, String receiptId) {
  236.         for (ChatForm chat : chatForms) {
  237.             if (chat.getMessageId().equalsIgnoreCase(receiptId)) {
  238.                 chat.updateByQuery("messageId", receiptId, "isReceived", "1");
  239.             }
  240.         }
  241.     }
  242.  
  243.     private String getContactId(String fromJid) {
  244.         String[] username = fromJid.split("@");
  245.         return username[0];
  246.     }
  247.  
  248.     private List<ChatForm> getListOfChat(String fromContactId) {
  249.         return new ChatForm().getChatByContactId(fromContactId);
  250.     }
  251.  
  252.     private NotificationCompat.Builder createNotification(ContactForm contact, Message message) {
  253.         Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
  254.         NotificationCompat.Builder builder = new NotificationCompat.Builder(MessagingService.this);
  255.         builder.setSmallIcon(R.drawable.ic_notif_chat);
  256.         builder.setContentTitle("Anda mendapat pesan baru");
  257.         builder.setContentText("Pesan dari : " + contact.getName());
  258.         builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
  259.         if (alarmSound != null) {
  260.             builder.setSound(alarmSound);
  261.         }
  262.         PendingIntent resultPendingIntent = getPendingIntent(contact, message);
  263.  
  264.         builder.setContentIntent(resultPendingIntent);
  265.         builder.setAutoCancel(true);
  266.  
  267.         return builder;
  268.     }
  269.  
  270.     private PendingIntent getPendingIntent(ContactForm contact, Message message) {
  271.         Intent resultIntent = new Intent(MessagingService.this, ConversationActivity.class);
  272.         resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
  273.         resultIntent.putExtra(ConversationActivity.class.getSimpleName() + ".usernameOpenFire", contact.getUsernameOpenFire());
  274.         resultIntent.putExtra(ConversationActivity.class.getSimpleName() + ".message", message.getBody());
  275.         PendingIntent resultPendingIntent = PendingIntent.getActivity(MessagingService.this,
  276.                 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  277.  
  278.         return resultPendingIntent;
  279.     }
  280.  
  281.     private void notifyUser(ContactForm contact, int notifId, Notification notification) {
  282.         ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  283.         List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1);
  284.         ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
  285.         String currentActiveChat = preferences.getString(CURRENT_ACTIVE_CHAT_CONTACT);
  286.  
  287.         boolean isAbleToNotify = !ConversationActivity.CONVERSATION_CLASS_NAME.equalsIgnoreCase(componentInfo.getClassName())
  288.                 || !contact.getUsernameOpenFire().equalsIgnoreCase(currentActiveChat);
  289.  
  290.         if (isAbleToNotify) {
  291.             NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  292.             mNotifyMgr.notify(notifId, notification);
  293.         }
  294.     }
  295.  
  296.     private void sendResult(ContactForm contact, String message, String messageId) {
  297.         String msg = getMessageType(message);
  298.         saveChatForm(contact, msg, messageId);
  299.         broadCastNow(message);
  300.     }
  301.  
  302.     private String getMessageType(String rawMessage) {
  303.         String result = rawMessage;
  304.         if (message.contains(ASK_FOR_LOCATION)) {
  305.             result = message.substring(ASK_FOR_LOCATION.length() + 1);
  306.         } else if (message.contains(DENY_YOUR_LOCATION)) {
  307.             result = message.substring(DENY_YOUR_LOCATION.length() + 1);
  308.         }
  309.         return result;
  310.     }
  311.  
  312.     private void saveChatForm(ContactForm contact, String message, String messageId) {
  313.         new ChatForm(MainApplication.CONTEXT, contact.getUsernameOpenFire(), message, ChatForm.TYPE_RECEIVE, "", "", "1").save();
  314.     }
  315.  
  316.     private void updatePrefference(String key, String object) {
  317.         preferences.putString(key, object);
  318.     }
  319.  
  320.     private String getPrefference(String key) {
  321.         return preferences.getString(key);
  322.     }
  323.  
  324.     private void broadCastNow(String message) {
  325.         Intent intent = new Intent(TRIGGER_CONVERSATION);
  326.         intent.putExtra(TRIGGER_CONVERSATION_KEY, message);
  327.         sendBroadcast(intent);
  328.         updatePrefference(PreferenceHelper.INCOMING_CHAT_MESSAGE, message);
  329.     }
  330.  
  331.     private String getExtraFromIntent(Intent intent, String prefix) {
  332.         return intent.getStringExtra(MessagingService.class.getSimpleName() + prefix);
  333.     }
  334.  
  335.     private void updateMessageSetting(String email, String message) {
  336.         if (messagingSetting == null)
  337.             return;
  338.         messagingSetting.setEmail(email);
  339.         messagingSetting.setMessage(message);
  340.     }
  341.  
  342.     private void loginChat(String username, String password) {
  343.         if (messagingSetting == null)
  344.             return;
  345.         messagingSetting.loginChat(username, password);
  346.     }
  347.  
  348.     private boolean isChatConnected() {
  349.         return messagingSetting.isConnected();
  350.     }
  351.  
  352.     private void runHandler() {
  353.         String firstLogin = getPrefference(PreferenceHelper.IS_LOGIN);
  354.         if (TextUtils.isEmpty(firstLogin)) {
  355.             disconnect();
  356.         }
  357.  
  358.         String user = getPrefference(LOGIN_XMPP);
  359.         String password = getPrefference(PreferenceHelper.PASS_XMPP);
  360.         boolean isProcessToChat = !messagingSetting.isConnected() && !TextUtils.isEmpty(user) && !TextUtils.isEmpty(password);
  361.  
  362.         if (isProcessToChat) {
  363.             connect();
  364.             loginChat(user, password);
  365.         }
  366.  
  367.         if (isChatConnected()) {
  368.             syncContact();
  369.  
  370.             boolean isProcessMessage = !TextUtils.isEmpty(message) && !TextUtils.isEmpty(user);
  371.             if (isProcessMessage) {
  372.                 String msgToLocalDB = getMessageBy(typeOfMessage, message);
  373.                 String latlon = "0";
  374.                 if (typeOfMessage.equalsIgnoreCase(ALLOW_YOUR_LOCATION)) {
  375.                     latlon = "1";
  376.                 }
  377.                 sendMessage(latlon, msgToLocalDB, updateParams);
  378.             }
  379.             fireMessageReceived();
  380.         }
  381.     }
  382.  
  383.     private void sendMessage(String latitudeLongitude, String messageToLocalDb, String updateParams) {
  384.         messagingSetting.sendMessage(message, email, latitudeLongitude, messageToLocalDb, getApplicationContext(), updateParams);
  385.     }
  386.  
  387.     private void fireMessageReceived() {
  388.         messagingSetting.receiveMessage();
  389.     }
  390.  
  391.     private String getMessageBy(String typeOfMessage, String defaultMessage) {
  392.         if (typeOfMessage.equalsIgnoreCase(ASK_FOR_LOCATION)) {
  393.             return "You ask to his/her location";
  394.         } else if (typeOfMessage.equalsIgnoreCase(ALLOW_YOUR_LOCATION)) {
  395.             return "You allow to be tracked";
  396.         } else if (typeOfMessage.equalsIgnoreCase(DENY_YOUR_LOCATION)) {
  397.             return "You deny to be tracked";
  398.         } else {
  399.             return defaultMessage;
  400.         }
  401.     }
  402.  
  403.     private synchronized void syncContact() {
  404.         String userId = preferences.getString(PreferenceHelper.USER_ID);
  405.         if (!TextUtils.isEmpty(userId)) {
  406.             if (listContact.size() <= 0) {
  407.                 getSyncContactList(userId);
  408.             }
  409.         }
  410.     }
  411.  
  412.     private void getSyncContactList(String userId) {
  413.         request.getSyncContactList(userId);
  414.     }
  415.  
  416.     private void stopThis() {
  417.         listContact.clear();
  418.         messagingSetting.disconnect();
  419.         unregisterReceiver(wifiReceiver);
  420.         stopSelf();
  421.     }
  422.  
  423.     @Override
  424.     public void onDestroy() {
  425.         Log.wtf("DESTROY", "GTALK SERVICE HAS BEEN DESTROYED !");
  426.         stopThis();
  427.         super.onDestroy();
  428.     }
  429.  
  430.     @Override
  431.     public void onSuccessRequestContactList(DataContact contactList) {
  432.         List<FriendData> listUsers = contactList.getFriendData();
  433.         clearContact();
  434.  
  435.         Observable.just(listUsers)
  436.                 .flatMap(friendDatas -> Observable.from(friendDatas))
  437.                 .flatMap(friend -> getContact(friend))
  438.                 .subscribe(new SimpleObserver<ContactForm>() {
  439.                     @Override
  440.                     public void onNext(ContactForm contactForm) {
  441.                         addContact(contactForm);
  442.                     }
  443.                 });
  444.     }
  445.  
  446.     private void clearContact() {
  447.         listContact.clear();
  448.     }
  449.  
  450.     private void addContact(ContactForm contact) {
  451.         listContact.add(contact);
  452.     }
  453.  
  454.     private Observable<ContactForm> getContact(FriendData friendData) {
  455.         ContactForm c = new ContactForm(MainActivity.CONTEXT);
  456.         c.setName(friendData.getName());
  457.         c.setUserIdFriend(friendData.getUserIdFriend());
  458.         c.setJid(friendData.getJid());
  459.         c.setUsernameOpenFire(friendData.getUserNameOpenfireFriend());
  460.         return Observable.just(c);
  461.     }
  462.  
  463.     @Override
  464.     public void onFailure(String message) {
  465.         LoggerHelper.error(message);
  466.     }
  467. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement