Advertisement
Kvarz

expandalbeList with pagination

Sep 10th, 2015
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 21.72 KB | None | 0 0
  1. package com.gfl.linewise.ui.fragments;
  2.  
  3. import android.app.Activity;
  4. import android.app.Dialog;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.graphics.Bitmap;
  8. import android.net.Uri;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.provider.MediaStore;
  12. import android.support.annotation.Nullable;
  13. import android.support.v4.widget.SwipeRefreshLayout;
  14. import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
  15. import android.text.TextUtils;
  16. import android.view.LayoutInflater;
  17. import android.view.View;
  18. import android.view.ViewGroup;
  19. import android.view.Window;
  20. import android.view.inputmethod.InputMethodManager;
  21. import android.webkit.WebView;
  22. import android.widget.Button;
  23. import android.widget.EditText;
  24. import android.widget.ExpandableListView;
  25. import android.widget.TextView;
  26. import android.widget.Toast;
  27.  
  28. import com.alshvets.core.helpers.ViewHelper;
  29. import com.alshvets.core.structure.helpers.Logger;
  30. import com.alshvets.core.structure.ui.fragments.abs.BaseFragment;
  31. import com.gfl.linewise.R;
  32. import com.gfl.linewise.api.models.Poster;
  33. import com.gfl.linewise.api.models.responses.ReplyOn;
  34. import com.gfl.linewise.api.models.responses.SoundbiteWallResponse;
  35. import com.gfl.linewise.chat.MessageService;
  36. import com.gfl.linewise.chat.ui.MessagingActivity;
  37. import com.gfl.linewise.helpers.DateFormatHelper;
  38. import com.gfl.linewise.managers.SoundBiteFeedManager;
  39. import com.gfl.linewise.managers.SoundBiteFeedManager.OnSoundBiteWallListener;
  40. import com.gfl.linewise.models.abs.ActionBarListener;
  41. import com.gfl.linewise.preferences.AppPreference;
  42. import com.gfl.linewise.ui.activities.MainActivity;
  43. import com.gfl.linewise.ui.adapters.SoundBiteExpandableAdapter;
  44. import com.gfl.linewise.ui.adapters.SoundBiteExpandableAdapter.OnMainPostClickListener;
  45. import com.paging.listview.PagingExpandableListView;
  46. import com.paging.listview.PagingExpandableListView.Pagingable;
  47. import com.parse.FindCallback;
  48. import com.parse.ParseException;
  49. import com.parse.ParseQuery;
  50. import com.parse.ParseUser;
  51.  
  52. import java.io.File;
  53. import java.io.IOException;
  54. import java.util.ArrayList;
  55. import java.util.Arrays;
  56. import java.util.Collections;
  57. import java.util.HashMap;
  58. import java.util.List;
  59.  
  60. import static com.alshvets.core.helpers.BitmapHelper.base64Encode;
  61. import static com.alshvets.core.helpers.BitmapHelper.getResizedBitmap;
  62.  
  63. /**
  64.  * Created by kvarivoda on 8/28/2015.
  65.  */
  66. public class SoundBiteFeed extends BaseFragment implements View.OnClickListener,
  67.         OnMainPostClickListener, OnSoundBiteWallListener, OnRefreshListener, Pagingable {
  68.  
  69.     private ActionBarListener actionBarListener;
  70.     private static final String SOUND_BITE_FEED_ID = "0";
  71.  
  72.     private List<SoundbiteWallResponse> mainPosts = Collections.synchronizedList(new ArrayList<SoundbiteWallResponse>());
  73.     //<SoundbiteWallResponse id> <List<ReplyOn>
  74.     private HashMap<String, List<ReplyOn>> replyToMainPostMap = new HashMap<>();
  75.  
  76.     private PagingExpandableListView listView;
  77.     private SoundBiteExpandableAdapter soundBiteExpandableAdapter;
  78.     private String soundbiteWallId;
  79.     private SoundBiteFeedManager soundBiteFeedManager;
  80.     private EditText messageBodyField;
  81.     private Button addPhoto;
  82.     private String imagePath = "";
  83.     private String imageBase64 = "";
  84.     private ArrayList<String> names;
  85.     private boolean isFirstLoad;
  86.     private boolean isRefresh;
  87.     //    private SwipeRefreshLayout mSwipeRefreshLayout;
  88.     private int count = 10;
  89.     private int pager = 10;
  90.     private SwipeRefreshLayout mSwipeRefreshLayout;
  91.  
  92.     @Override
  93.     protected View initView(LayoutInflater inflater, ViewGroup container) {
  94.         return inflater.inflate(R.layout.fragment_soundbite_feed, container, false);
  95.     }
  96.  
  97.     @Override
  98.     public void onAttach(Activity activity) {
  99.         super.onAttach(activity);
  100.         try {
  101.             actionBarListener = (ActionBarListener) activity;
  102.         } catch (ClassCastException castException) {
  103.             Logger.error(getClass(), "The activity does not implement the listener.");
  104.         }
  105.     }
  106.  
  107.     @Override
  108.     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  109.         super.onViewCreated(view, savedInstanceState);
  110.         if (actionBarListener != null)
  111.             actionBarListener.changeActionBarBehavior(getString(R.string.soundBiteFeed));
  112.  
  113.         mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
  114.         mSwipeRefreshLayout.setOnRefreshListener(this);
  115.         mSwipeRefreshLayout.setColorScheme(R.color.blue, R.color.green);
  116.  
  117.         TextView dateText = (TextView) view.findViewById(R.id.dateText);
  118.         String eventDateText = DateFormatHelper.getDateTextFromMillis(System.currentTimeMillis());
  119.         dateText.setText(eventDateText);
  120.  
  121.         String[] soundBiteWallLines = getResources().getStringArray(R.array.soundBiteWallLines);
  122.         Collections.shuffle(Arrays.asList(soundBiteWallLines));
  123.  
  124.         StringBuilder builder = new StringBuilder();
  125.         for (String value : soundBiteWallLines) {
  126.             builder.append("           ");
  127.             builder.append(value);
  128.         }
  129.  
  130.  
  131.         TextView shareTextLine = (TextView) view.findViewById(R.id.shareTextLine);
  132.         shareTextLine.setText(builder);
  133.         shareTextLine.setSelected(true);
  134.  
  135.         listView = (PagingExpandableListView) view.findViewById(R.id.soundBiteListView);
  136.         listView.setChoiceMode(ExpandableListView.CHOICE_MODE_SINGLE);
  137.         soundBiteExpandableAdapter = new SoundBiteExpandableAdapter(getActivity(), mainPosts, replyToMainPostMap, this);
  138.         listView.setAdapter(soundBiteExpandableAdapter);
  139.         listView.setPagingableListener(this);
  140.  
  141.         View shareLayout = view.findViewById(R.id.shareLayout);
  142.         shareLayout.setOnClickListener(this);
  143.  
  144.         addPhoto = (Button) view.findViewById(R.id.addPhoto);
  145.         addPhoto.setOnClickListener(this);
  146.         messageBodyField = (EditText) view.findViewById(R.id.editTextComment);
  147.  
  148.         Button btnAddComment = (Button) view.findViewById(R.id.btnAddComment);
  149.         btnAddComment.setOnClickListener(this);
  150.  
  151.         mProgressDialog.show();
  152.         mProgressDialog.setCancelable(true);
  153.         soundBiteFeedManager = new SoundBiteFeedManager(this);
  154.         isFirstLoad = true;
  155.         int offset = 0;
  156.         soundBiteFeedManager.getSoundBiteWallByEventId(SOUND_BITE_FEED_ID, count, offset);
  157.  
  158.     }
  159.  
  160.     @Override
  161.     public void onPause() {
  162.         if (actionBarListener != null)
  163.             actionBarListener.changeActionBarBehavior("");
  164.         super.onPause();
  165.     }
  166.  
  167.     @Override
  168.     public void onResume() {
  169.         super.onResume();
  170.         if (actionBarListener != null)
  171.             actionBarListener.changeActionBarBehavior(getString(R.string.soundBiteFeed));
  172.     }
  173.  
  174.     @Override
  175.     public void onClick(View v) {
  176.         switch (v.getId()) {
  177.             case R.id.btnAddComment:
  178.                 String messageBody = messageBodyField.getText().toString();
  179.                 if(!TextUtils.isEmpty(imagePath)){
  180.                     sendMessage();
  181.                     return;
  182.                 } else if (messageBody.isEmpty()) {
  183.                     Toast.makeText(getActivity(), "Please enter a message", Toast.LENGTH_LONG).show();
  184.                     Logger.debug(getClass(), "id of event " + soundBiteExpandableAdapter.getSelectedMainPostId());
  185.                     Logger.debug(getClass(), "isPicked " + soundBiteExpandableAdapter.isPostPicked());
  186.                     return;
  187.                 }
  188.                 sendMessage();
  189.                 break;
  190.             case R.id.addPhoto:
  191.                 ((MainActivity)getActivity()).startPickImageWithoutCropping();
  192.                 break;
  193.             case R.id.shareLayout:
  194.                 showShareLineDialog();
  195.                 break;
  196.         }
  197.     }
  198.  
  199.     private void sendMessage() {
  200.         if (soundBiteExpandableAdapter.isPostPicked()) {
  201.             mProgressDialog.show();
  202.             final String selectedMainPostId = soundBiteExpandableAdapter.getSelectedMainPostId();
  203.             final String selectedMainAccountId = soundBiteExpandableAdapter.getSelectedMainAccountId();
  204.             if(!TextUtils.isEmpty(imagePath)){
  205.                 messageBodyField.setText("");
  206.             }
  207.             soundBiteFeedManager.replyOnComment(selectedMainPostId, selectedMainAccountId,
  208.                     messageBodyField.getText().toString(), imagePath, imageBase64);
  209.         } else {
  210.             mProgressDialog.show();
  211.             if(!TextUtils.isEmpty(imagePath)){
  212.                 messageBodyField.setText("");
  213.             }
  214.             soundBiteFeedManager.postComment(soundbiteWallId, messageBodyField.getText().toString(),
  215.                     imagePath, imageBase64);
  216.         }
  217.     }
  218.  
  219.     @Override
  220.     public void onMainPostClickListener(String id) {
  221.  
  222.  
  223.     }
  224.  
  225.     @Override
  226.     public void onOpenKeyboardListener() {
  227.         InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
  228.         imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  229.     }
  230.  
  231.     @Override
  232.     public void onOpenChatListener(String email, String accountId, String points, String photo) {
  233.         startChat(email, accountId, points, photo);
  234.     }
  235.  
  236.     private void hideKeyboard() {
  237.         View view = getActivity().getCurrentFocus();
  238.         ViewHelper.hideKeyboard(getActivity(), view);
  239.     }
  240.  
  241.     public void deliverImagePath(String path) {
  242.         Logger.debug(getClass(), "SoundBiteFeed imageDelivered " + path);
  243.         messageBodyField.setText("");
  244.         imagePath = path;
  245.  
  246.         messageBodyField.setFocusable(false);
  247.         messageBodyField.setText("File is ready to send...");
  248.  
  249.         Uri imageUri = Uri.fromFile(new File(path));
  250.         try {
  251.             Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), imageUri);
  252.             Bitmap imageBitmap = getResizedBitmap(bitmap);
  253.             imageBase64 = base64Encode(imageBitmap);
  254.         } catch (IOException e) {
  255.             e.printStackTrace();
  256.         }
  257.     }
  258.  
  259.     @Override
  260.     public void onSoundBiteWallListener(final List<SoundbiteWallResponse> soundbiteWallResponse, String soundbiteWallId) {
  261.         Logger.debug(getClass(), "GetSoundbiteWallRequest: OK");
  262.         this.soundbiteWallId = soundbiteWallId;
  263.  
  264.         if (soundbiteWallResponse != null) {
  265.             if (soundbiteWallResponse.size() == 0 && isFirstLoad) {
  266.                 Logger.debug(getClass(), "first load size == 0");
  267.                 listView.setHasMoreItems(false);
  268.                 safeClose(mProgressDialog);
  269.                 mSwipeRefreshLayout.setRefreshing(false);
  270.                 return;
  271.             } else if (isRefresh) {
  272.                 Logger.debug(getClass(), "is refresh");
  273.                 mainPosts.clear();
  274.                 Logger.debug(getClass(), "clear");
  275. //                listView.setHasMoreItems(true);
  276.                 Logger.debug(getClass(), "setHasMoreItems");
  277.             } else {
  278.                 Logger.debug(getClass(), "else setHasMoreItems...");
  279. //                listView.setHasMoreItems(true);
  280.             }
  281.  
  282.  
  283.             Logger.debug(getClass(), "addAll...");
  284.  
  285.  
  286.             for (SoundbiteWallResponse soundbiteWallItem : soundbiteWallResponse) {
  287.                 replyToMainPostMap.put(soundbiteWallItem.getId(), soundbiteWallItem.getSoundbiteWallReplyOns());
  288.             }
  289.             Logger.debug(getClass(), "notifyDataSetChanged...");
  290.             Logger.debug(getClass(), "isRefresh.. " + isRefresh);
  291.             getActivity().runOnUiThread(new Runnable() {
  292.                 public void run() {
  293.                     mainPosts.addAll(soundbiteWallResponse);
  294.                     soundBiteExpandableAdapter.notifyDataSetChanged();
  295.                     if (!isRefresh) {
  296.                         listView.onFinishLoading(true, mainPosts);
  297.                     }
  298.                     startUpdateTimer();
  299.                 }
  300.             });
  301.  
  302.             Logger.debug(getClass(), "listView.onFinishLoading(true, mainPosts...");
  303.  
  304.             if (isFirstLoad) {
  305.                 isFirstLoad = false;
  306.                 pager = 0;
  307.             }
  308.             pager += 10;
  309.             if(soundbiteWallResponse.size() == 0){
  310.                 Logger.debug(getClass(), "size == 0");
  311. //                listView.onFinishLoading(false, mainPosts);
  312.                 listView.setHasMoreItems(false);
  313. //                listView.setHasMoreItems(false);
  314.             }
  315.         }
  316.         isRefresh = false;
  317.         safeClose(mProgressDialog);
  318.         Logger.debug(getClass(), " mSwipeRefreshLayout.setRefreshing(false);");
  319.         mSwipeRefreshLayout.setRefreshing(false);
  320.     }
  321.  
  322.     private void startUpdateTimer() {
  323.         Handler handler = new Handler();
  324.  
  325.         handler.postDelayed(new Runnable() {
  326.             @Override
  327.             public void run() {
  328.                 getRefreshedPage();
  329.             }
  330.         }, 10000);
  331.     }
  332.  
  333.     @Override
  334.     public void onSoundBiteWallError(String getErrorMessage) {
  335.         safeClose(mProgressDialog);
  336.         listView.onFinishLoading(true, mainPosts);
  337.         mSwipeRefreshLayout.setRefreshing(false);
  338.     }
  339.  
  340.     @Override
  341.     public void onSoundBitePostCommentListener(String soundbiteWallResponseId, String comment,
  342.                                                String imageJsonPath) {
  343.         Logger.debug(getClass(), "CreateSoundBitePoster: OK");
  344.         safeClose(mProgressDialog);
  345.  
  346.         // save index and top position of listView
  347.         final int index = listView.getFirstVisiblePosition();
  348.         View v = listView.getChildAt(0);
  349.         final int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop());
  350.  
  351.         //updating UI with comment
  352.         SoundbiteWallResponse soundbiteWallResponse = new SoundbiteWallResponse();
  353.         soundbiteWallResponse.setId(soundbiteWallResponseId);
  354.         soundbiteWallResponse.setComment(messageBodyField.getText().toString());
  355.         soundbiteWallResponse.setPhoto(imageJsonPath);
  356.         Poster poster1 = new Poster(AppPreference.getInstance().getProfileId());
  357.         poster1.setPhoto(AppPreference.getInstance().getProfileResponse().getPhoto());
  358.         poster1.setAchievements(AppPreference.getInstance().getUserInfoResponse());
  359.         soundbiteWallResponse.setPoster(poster1);
  360.         mainPosts.add(0, soundbiteWallResponse);
  361.         replyToMainPostMap.put(soundbiteWallResponse.getId(), new ArrayList<ReplyOn>());
  362.  
  363.         soundBiteExpandableAdapter.notifyDataSetChanged();
  364.         this.imagePath = "";
  365.         this.imageBase64 = "";
  366.         messageBodyField.setText("");
  367.         hideKeyboard();
  368.  
  369.     }
  370.  
  371.     @Override
  372.     public void onSoundBitePostCommentError(String getErrorMessage) {
  373.         safeClose(mProgressDialog);
  374.     }
  375.  
  376.     @Override
  377.     public void onSoundBiteReplyOnCommentListener(String selectedMainPostId, String selectedMainAccountId,
  378.                                                   String replyOnId, String comment, String imageJsonPath) {
  379.  
  380.     Logger.debug(getClass(), "CreateSoundBiteReplyOn: OK");
  381.         Logger.debug(getClass(), "lets log everything ");
  382.         Logger.debug(getClass(), "lets log selectedMainPostId " + selectedMainPostId);
  383.         Logger.debug(getClass(), "lets log selectedMainAccountId " + selectedMainAccountId);
  384.         Logger.debug(getClass(), "lets log replyOnId " + replyOnId);
  385.         Logger.debug(getClass(), "lets log comment " + comment);
  386.         Logger.debug(getClass(), "lets log messageBodyField.getText().toString() " + messageBodyField.getText().toString());
  387.         Logger.debug(getClass(), "lets log imageBase64 " + imageJsonPath);
  388.         safeClose(mProgressDialog);
  389.  
  390.         // save index and top position of listView
  391.         final int index = listView.getFirstVisiblePosition();
  392.         View v = listView.getChildAt(0);
  393.         final int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop());
  394.  
  395.         List<ReplyOn> soundbiteWallReplyOns = replyToMainPostMap.get(selectedMainPostId);
  396.         ReplyOn replyOn = new ReplyOn();
  397.         replyOn.setId(replyOnId);
  398.         replyOn.setComment(messageBodyField.getText().toString());
  399.         replyOn.setPhoto(imageJsonPath);
  400.         Poster poster1 = new Poster(AppPreference.getInstance().getProfileId());
  401.         poster1.setPhoto(AppPreference.getInstance().getProfileResponse().getPhoto());
  402.         poster1.setAchievements(AppPreference.getInstance().getUserInfoResponse());
  403.         replyOn.setReplyOn(poster1);
  404.         soundbiteWallReplyOns.add(replyOn);
  405.  
  406.         replyToMainPostMap.put(selectedMainPostId, soundbiteWallReplyOns);
  407.  
  408.         getActivity().runOnUiThread(new Runnable() {
  409.             public void run() {
  410.                 hideKeyboard();
  411.             }
  412.         });
  413.  
  414.         soundBiteExpandableAdapter.notifyDataSetChanged();
  415.  
  416.         listView.setSelection(index);
  417.  
  418.         messageBodyField.setText("");
  419.         this.imagePath = "";
  420.         this.imageBase64 = "";
  421.         safeClose(mProgressDialog);
  422.     }
  423.  
  424.     @Override
  425.     public void onSoundBiteReplyOnCommentError(String getErrorMessage) {
  426.         safeClose(mProgressDialog);
  427.     }
  428.  
  429.     @Override
  430.     public void onRefresh() {
  431.         mSwipeRefreshLayout.setRefreshing(true);
  432.         getRefreshedPage();
  433.     }
  434.  
  435.     public void getRefreshedPage(){
  436.         soundBiteFeedManager = new SoundBiteFeedManager(this);
  437.         isFirstLoad = true;
  438.         isRefresh = true;
  439.         pager = 0;
  440.         soundBiteFeedManager.getSoundBiteWallByEventId(SOUND_BITE_FEED_ID, count, pager);
  441.     }
  442.  
  443.     @Override
  444.     public void onLoadMoreItems() {
  445.         Logger.debug(getClass(), "onLoadMoreItems");
  446.  
  447.         soundBiteFeedManager.getSoundBiteWallByEventId(SOUND_BITE_FEED_ID, count, pager);
  448.     }
  449.  
  450.     private void showShareLineDialog() {
  451.         final Dialog dialog = new Dialog(getActivity());
  452.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  453.         dialog.setContentView(R.layout.share_line_dialog);
  454.  
  455.         WebView licenceWebView = (WebView) dialog.findViewById(R.id.licenceWebView);
  456.         licenceWebView.getSettings();
  457.         licenceWebView.setBackgroundColor(0x00000000);
  458.         licenceWebView.loadUrl("file:///android_asset/share_line_text.html");
  459.  
  460.         dialog.show();
  461.     }
  462.  
  463.     private void startChat(final String email, final String accountId, final String points, final String photo) {
  464.  
  465.         if (email == null) {
  466.             Logger.debug(getClass(), "email null!");
  467.             return;
  468.         }
  469.  
  470.         Logger.debug(getClass(), "startChat()");
  471.         ParseUser currentUser = ParseUser.getCurrentUser();
  472.         if (currentUser != null) {
  473.             String currentUserId = ParseUser.getCurrentUser().getObjectId();
  474.             //don't include yourself in the list
  475.             names = new ArrayList<>();
  476.             ParseQuery<ParseUser> query = ParseUser.getQuery();
  477.             query.whereNotEqualTo("objectId", currentUserId);
  478.             query.findInBackground(new FindCallback<ParseUser>() {
  479.                 public void done(List<ParseUser> userList, ParseException e) {
  480.                     if (e == null) {
  481.                         for (int i = 0; i < userList.size(); i++) {
  482.                             names.add(userList.get(i).getUsername());
  483.                             if (email.equals(userList.get(i).getUsername())) {
  484.                                 Logger.debug(getClass(), "Chat: this is your user " + userList.get(i).getUsername());
  485.                                 openChatConversation(userList.get(i),accountId, points, photo );
  486.                             }
  487.                         }
  488.                     } else {
  489.                         Toast.makeText(getApplicationContext(),
  490.                                 "Chat: error loading user list",
  491.                                 Toast.LENGTH_LONG).show();
  492.                     }
  493.                 }
  494.             });
  495.         } else {
  496.             Logger.debug(getClass(), "currentUser==null");
  497.         }
  498.     }
  499.  
  500.     //open a chat conversation with one person
  501.     public void openChatConversation(ParseUser username, final String accountId, final String points, final String photo) {
  502.         Logger.debug(getClass(), "openConversation");
  503.         ParseQuery<ParseUser> query = ParseUser.getQuery();
  504.         query.whereEqualTo("username", username.getUsername());
  505.         query.findInBackground(new FindCallback<ParseUser>() {
  506.             public void done(List<ParseUser> user, ParseException e) {
  507.                 if (e == null) {
  508.                     startChatService();
  509.                     //start the messaging activity
  510.                     Intent intent = new Intent(getApplicationContext(), MessagingActivity.class);
  511.                     intent.putExtra(MessagingActivity.RECIPIENT_ID, user.get(0).getObjectId());
  512.                     intent.putExtra(MessagingActivity.USER_ID, accountId);
  513.                     intent.putExtra(MessagingActivity.POINTS, points);
  514.                     intent.putExtra(MessagingActivity.PHOTO_URL, photo);
  515.                     startActivity(intent);
  516.                     Logger.debug(getClass(), "RECIPIENT_ID " + user.get(0).getObjectId() );
  517.                 } else {
  518.                     Toast.makeText(getApplicationContext(),
  519.                             "Chat: error finding that user",
  520.                             Toast.LENGTH_SHORT).show();
  521.                 }
  522.             }
  523.         });
  524.     }
  525.  
  526.     private void startChatService() {
  527.         ParseUser currentUser = ParseUser.getCurrentUser();
  528.         if (currentUser != null) {
  529.             Logger.debug(getClass(), "currentUser !=null " + ParseUser.getCurrentUser().getUsername());
  530.             Logger.debug(getClass(), "start chat service");
  531.             Intent serviceIntent = new Intent(getApplicationContext(), MessageService.class);
  532.             getActivity().startService(serviceIntent);
  533.         }
  534.     }
  535.  
  536.  
  537. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement