/*
* Copyright (c) 2016 Magnet Systems, Inc.
*
* 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 com.magnet.samples.android.quickstart.activities;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import com.magnet.max.android.User;
import com.magnet.mmx.client.api.ListResult;
import com.magnet.mmx.client.api.MMX;
import com.magnet.mmx.client.api.MMXChannel;
import com.magnet.mmx.client.api.MMXMessage;
import com.magnet.samples.android.quickstart.R;
import com.magnet.samples.android.quickstart.adapters.MessageListAdapter;
import com.magnet.samples.android.quickstart.fragments.NewMessageDialogFragment;
import com.magnet.samples.android.quickstart.helpers.MessageHelper;
import com.magnet.samples.android.quickstart.util.Logger;
import java.util.Date;
import java.util.List;
/**
* For complete feature description, @see <a href="https://developer.magnet.com/docs/message/overview/user-to-user-chat/index.html">User-to-User Chat</a>
* For complete API example, @see <a href="https://developer.magnet.com/docs/message/v2.1/android/creating-your-first-android-app/index.html">Creating your First App</a>
*/
public class ChatActivity extends BaseActivity implements
NewMessageDialogFragment.NewMessageListener {
private MMXChannel myChatChannel;
private AlertDialog dialog;
private ListView messagesList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
messagesList = (ListView) findViewById(R.id.chatMessagesList);
findViewById(R.id.chatFetchAllBtn).setOnClickListener(this);
final User currentUser = User.getCurrentUser();
if (currentUser != null) {
final String name = currentUser.getUserName();
MMXChannel.getPrivateChannel(name, new MMXChannel.OnFinishedListener<MMXChannel>() {
@Override
public void onSuccess(MMXChannel mmxChannel) {
Logger.debug("get channel", "success");
myChatChannel = mmxChannel;
}
@Override
public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) {
if (failureCode.equals(MMXChannel.FailureCode.CHANNEL_NOT_FOUND)) {
String summary = "Chat channel for myself";
// Create a new channel
MMXChannel.create(name, summary, false, MMXChannel.PublishPermission.SUBSCRIBER, new MMXChannel.OnFinishedListener<MMXChannel>() {
@Override
public void onSuccess(MMXChannel mmxChannel) {
Logger.debug("create channel", "success");
myChatChannel = mmxChannel;
}
@Override
public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) {
showMessage("Can't create channel : " + failureCode + " : " + throwable.getMessage());
Logger.error("create channel", throwable, "error : ", failureCode);
}
});
} else {
showMessage("Can't get channel : " + failureCode + " : " + throwable.getMessage());
Logger.error("get channel", throwable, "error : ", failureCode);
}
}
});
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.chatFetchAllBtn:
getLastMessages();
break;
default:
break;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.chatMenuSend:
MessageHelper.showSendMessageDialog(getSupportFragmentManager(), myChatChannel);
break;
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_chat, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
protected void onPause() {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
MMX.unregisterListener(eventListener);
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
MMX.registerListener(eventListener);
}
private void updateList(List<MMXMessage> messages) {
MessageListAdapter adapter = new MessageListAdapter(this, messages);
messagesList.setAdapter(adapter);
}
private void getLastMessages() {
Date now = new Date();
Date anHourAgo = new Date(now.getTime() - (60 * 60 * 24 * 1000l));
myChatChannel.getMessages(anHourAgo, now, 1000, 0, false, new MMXChannel.OnFinishedListener<ListResult<MMXMessage>>() {
@Override
public void onSuccess(ListResult<MMXMessage> mmxMessageListResult) {
Logger.debug("get all messages", "success, messages count = ", mmxMessageListResult.totalCount);
updateList(mmxMessageListResult.items);
}
@Override
public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) {
showMessage("Can't get all messages : " + failureCode + " : " + throwable.getMessage());
Logger.error("get all messages", throwable, "error : ", failureCode);
}
});
}
private final MMX.EventListener eventListener = new MMX.EventListener() {
@Override
public boolean onMessageReceived(final MMXMessage mmxMessage) {
Logger.debug("received message", "from " + mmxMessage.getSender().getUserName());
AlertDialog.Builder builder = new AlertDialog.Builder(ChatActivity.this);
String title = "Message received";
if (mmxMessage.getAttachments().size() > 0) {
title += "\n(has attachment)";
}
builder.setTitle(title).setCancelable(false);
builder.setMessage(mmxMessage.getContent().get("content"));
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog = builder.show();
return true;
}
};
@Override public void decorateMessage(MMXMessage.Builder messageBuilder) {
}
@Override public void messageSent(MMXMessage message) {
}
@Override public void messageFailure(Throwable error) {
}
}