private void sendMedia(final String mediaType, String filePath) {
    File f = new File(filePath);
    final String key = S3UploadService.generateKey(f);
    S3UploadService.uploadFile(
        key,
        f,
        new TransferListener() {
          public void onStateChanged(int id, TransferState state) {
            switch (state) {
              case COMPLETED:
                updateList(mediaType, S3UploadService.buildUrl(key), false);
                HashMap<String, String> content = new HashMap<>();
                content.put("type", mediaType);
                content.put("url", S3UploadService.buildUrl(key));
                send(content);
                break;
              case CANCELED:
              case FAILED:
                Toast.makeText(ChatActivity.this, "Unable to upload.", Toast.LENGTH_LONG).show();
                break;
            }
          }

          public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {}

          public void onError(int id, Exception ex) {
            Log.e(TAG, "send(): exception during upload", ex);
          }
        });
  }
 /**
  * On destroying of this activity, unregister this activity as a listener so it won't process any
  * incoming messages.
  */
 @Override
 public void onDestroy() {
   MMX.unregisterListener(mEventListener);
   S3UploadService.destroy();
   mGPS.stopUsingGPS();
   super.onDestroy();
 }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    if (MMX.getCurrentUser() == null) {
      MMX.unregisterListener(mEventListener);
      MMX.logout(null);
      Intent intent = new Intent(ChatActivity.this, LoginActivity.class);
      startActivity(intent);
    }

    mUser = getIntent().getParcelableExtra("User");

    MMX.registerListener(mEventListener);
    S3UploadService.init(this);
    mGPS = new GPSTracker(this);

    ActionBar ab = getActionBar();
    if (ab != null) {
      ab.setTitle("Chatting With: " + mUser.getUsername());
    }

    rvMessages = (RecyclerView) findViewById(R.id.rvMessages);
    etMessage = (EditText) findViewById(R.id.etMessage);
    btnSendText = (ImageButton) findViewById(R.id.btnSendText);
    btnSendPicture = (ImageButton) findViewById(R.id.btnSendPicture);
    btnSendLocation = (ImageButton) findViewById(R.id.btnSendLocation);
    btnSendVideo = (ImageButton) findViewById(R.id.btnSendVideo);

    messageList = new ArrayList<>();
    adapter = new MessageRecyclerViewAdapter(this, messageList);

    rvMessages.setAdapter(new SlideInBottomAnimationAdapter(adapter));
    final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    layoutManager.setStackFromEnd(true);
    layoutManager.setReverseLayout(false);
    rvMessages.setLayoutManager(layoutManager);

    etMessage.setOnKeyListener(
        new View.OnKeyListener() {
          public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((event.getAction() == KeyEvent.ACTION_DOWN)
                && (keyCode == KeyEvent.KEYCODE_ENTER)) {
              sendMessage();
              return true;
            }
            return false;
          }
        });

    btnSendText.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            sendMessage();
          }
        });

    btnSendPicture.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            selectImage();
          }
        });

    btnSendLocation.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            sendLocation();
          }
        });

    btnSendVideo.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            selectVideo();
          }
        });
  }