I have created a private channel, and joined the channel. I like to invite another user to join that channel and chat. To be clear, this should be a chat between two members only.
public class MainActivity extends AppCompatActivity {
/*
Change this URL to match the token URL for your Twilio Function
*/
final static String SERVER_TOKEN_URL = "https://example.com/twilio/token/";
final static String MY_CHANNEL_NAME = "testchat1234567810";
final static String TAG = "TwilioChat";
// Update this identity for each individual user, for instance after they login
private String mIdentity ;
private String accessToken;
private RecyclerView mMessagesRecyclerView;
private MessagesAdapter mMessagesAdapter;
private ArrayList<Message> mMessages = new ArrayList<>();
private EditText mWriteMessageEditText;
private Button mSendChatMessageButton;
private ChatClient mChatClient;
private Channel mGeneralChannel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessagesRecyclerView = (RecyclerView) findViewById(R.id.messagesRecyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// for a chat app, show latest at the bottom
layoutManager.setStackFromEnd(true);
mMessagesRecyclerView.setLayoutManager(layoutManager);
mMessagesAdapter = new MessagesAdapter();
mMessagesRecyclerView.setAdapter(mMessagesAdapter);
mWriteMessageEditText = (EditText) findViewById(R.id.writeMessageEditText);
mSendChatMessageButton = (Button) findViewById(R.id.sendChatMessageButton);
mSendChatMessageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
createOrJoinChannel();
if (mGeneralChannel != null) {
String messageBody = mWriteMessageEditText.getText().toString();
Message.Options options = Message.options().withBody(messageBody);
// mGeneralChannel.getMembers().add();
Members members = mGeneralChannel.getMembers();
if (members != null) {
ArrayList<Member> list = (ArrayList<Member>) members.getMembersList();
for (int i = 0; i < list.size(); i++) {
Log.i(TAG, "member " + i + list.get(i).getIdentity());
}
}
mGeneralChannel.getMembers().inviteByIdentity("user1@gmail.com", new StatusListener() {
@Override
public void onSuccess() {
Log.d(TAG, "User Invited on send!");
}
@Override
public void onError(ErrorInfo errorInfo) {
Log.i(TAG, "chats: inviting user" + errorInfo.getMessage());
}
});
mGeneralChannel.getMembersCount(new CallbackListener<Long>() {
@Override
public void onSuccess(Long aLong) {
Log.e("member count >>", aLong + "");
}
});
mGeneralChannel.getMessages().sendMessage(options, new CallbackListener<Message>() {
@Override
public void onSuccess(Message message) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "Message created");
// need to modify user interface elements on the UI thread
mWriteMessageEditText.setText("");
}
});
}
});
}
}
});
retrieveAccessTokenfromServer();
}
private void retrieveAccessTokenfromServer() {
String deviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
Log.e("deviceid >>",deviceId);
String tokenURL = SERVER_TOKEN_URL + deviceId;
Ion.with(this)
.load(tokenURL)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
Log.e("result >>", result.toString() + "");
if (e == null) {
mIdentity = result.get("identity").getAsString();
accessToken = result.get("token").getAsString();
setTitle(mIdentity);
ChatClient.Properties.Builder builder = new ChatClient.Properties.Builder();
// ChatClient.setLogLevel(Log.VERBOSE);
ChatClient.Properties props = builder.createProperties();
ChatClient.create(MainActivity.this, accessToken, props, mChatClientCallback);
} else {
Toast.makeText(MainActivity.this,
R.string.error_retrieving_access_token, Toast.LENGTH_SHORT)
.show();
}
}
});
}
private CallbackListener<ChatClient> mChatClientCallback =
new CallbackListener<ChatClient>() {
@Override
public void onSuccess(ChatClient chatClient) {
mChatClient = chatClient;
// createOrJoinChannel();
// loadChannels();
Log.d(TAG, "Success creating Twilio Chat Client");
}
@Override
public void onError(ErrorInfo errorInfo) {
Log.e(TAG, "Error creating Twilio Chat Client: " + errorInfo.getMessage());
}
};
private void createOrJoinChannel() {
//Only SID or unique name of channel can be supplied as parameter
mChatClient.getChannels().getChannel(MY_CHANNEL_NAME, new CallbackListener<Channel>() {
@Override
public void onSuccess(Channel channel) {
if (channel != null) {
if (channel.getStatus() == Channel.ChannelStatus.JOINED) {
// already in the channel, load the messages
mGeneralChannel = channel;
mGeneralChannel.addListener(mDefaultChannelListener);
} else if (channel.getStatus() == Channel.ChannelStatus.NOT_PARTICIPATING) {
// already in the channel, load the messages
mGeneralChannel = channel;
mGeneralChannel.addListener(mDefaultChannelListener);
} else {
// join the channel
joinChannel(channel);
}
} else {
Log.i(TAG, "Error occurred in getting channel");
}
}
@Override
public void onError(ErrorInfo errorInfo) {
Log.i(TAG, "Error retrieving channel: " + errorInfo.getMessage());
createChannel();
}
});
}
private void joinChannel(final Channel channel) {
Log.i(TAG, "inside join channel" + channel.getUniqueName());
Log.i(TAG, "channel status: " + channel.getStatus());
Members members = channel.getMembers();
if (members != null) {
ArrayList<Member> list = (ArrayList<Member>) members.getMembersList();
for (int i = 0; i < list.size(); i++) {
Log.i(TAG, "member " + i + list.get(i).getIdentity());
}
} else {
Log.i(TAG, "null object"); //Getting this even when I get
//"Member already exists" error
}
channel.join(new StatusListener() {
@Override
public void onSuccess() {
mGeneralChannel = channel;
mGeneralChannel.addListener(mDefaultChannelListener);
}
@Override
public void onError(ErrorInfo errorInfo) {
//Error joining channel: Member already exists
Log.i(TAG, "Error joining channel: " + errorInfo.getMessage());
}
});
}
private void createChannel() {
mChatClient.getChannels().createChannel(MY_CHANNEL_NAME,
Channel.ChannelType.PUBLIC, new CallbackListener<Channel>() {
@Override
public void onSuccess(final Channel channel) {
if (channel != null) {
/* channel.getMembersCount(new CallbackListener<Long>() {
@Override
public void onSuccess(Long aLong) {
Log.e("member count >>",aLong+"");
}
});*/
channel.getMembers().inviteByIdentity("user1@gmail.com", new StatusListener() {
@Override
public void onSuccess() {
Log.d(TAG, "User Invited!");
}
@Override
public void onError(ErrorInfo errorInfo) {
Log.i(TAG, "chats: inviting user" + errorInfo.getMessage());
}
});
channel.join(new StatusListener() {
@Override
public void onSuccess() {
}
});
setUniqueNameAndJoin(channel);
}
}
@Override
public void onError(ErrorInfo errorInfo) {
Log.i(TAG, "chats: " + "Unique name could not be set: " + errorInfo.getMessage());
}
});
}
private void setUniqueNameAndJoin(final Channel channel) {
channel.setUniqueName(MY_CHANNEL_NAME, new StatusListener() {
@Override
public void onSuccess() {
Log.i(TAG, "channel with unique name created " + channel.getUniqueName());
joinChannel(channel);
}
@Override
public void onError(ErrorInfo errorInfo) {
super.onError(errorInfo);
}
});
}
private ChannelListener mDefaultChannelListener = new ChannelListener() {
@Override
public void onMessageAdded(final Message message) {
Log.d(TAG, "Message added");
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// need to modify user interface elements on the UI thread
mMessages.add(message);
mMessagesAdapter.notifyDataSetChanged();
}
});
}
@Override
public void onMessageUpdated(Message message, Message.UpdateReason updateReason) {
Log.d(TAG, "Message updated: " + message.getMessageBody());
}
@Override
public void onMessageDeleted(Message message) {
Log.d(TAG, "Message deleted");
}
@Override
public void onMemberAdded(Member member) {
Log.d(TAG, "Member added: " + member.getIdentity());
}
@Override
public void onMemberUpdated(Member member, Member.UpdateReason updateReason) {
Log.d(TAG, "Member updated: " + member.getIdentity());
}
@Override
public void onMemberDeleted(Member member) {
Log.d(TAG, "Member deleted: " + member.getIdentity());
}
@Override
public void onTypingStarted(Channel channel, Member member) {
Log.d(TAG, "Started Typing: " + member.getIdentity());
}
@Override
public void onTypingEnded(Channel channel, Member member) {
Log.d(TAG, "Ended Typing: " + member.getIdentity());
}
@Override
public void onSynchronizationChanged(Channel channel) {
}
};
class MessagesAdapter extends RecyclerView.Adapter<MessagesAdapter.ViewHolder> {
class ViewHolder extends RecyclerView.ViewHolder {
public TextView mMessageTextView;
public ViewHolder(TextView textView) {
super(textView);
mMessageTextView = textView;
}
}
public MessagesAdapter() {
}
@Override
public MessagesAdapter
.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
TextView messageTextView = (TextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.message_text_view, parent, false);
return new ViewHolder(messageTextView);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Message message = mMessages.get(position);
String messageText = String.format("%s: %s", message.getAuthor(), message.getMessageBody());
holder.mMessageTextView.setText(messageText);
}
@Override
public int getItemCount() {
return mMessages.size();
}
}
}
And also, I need to accept the invite. How it can be done?
from How can I invite a user to a newly created private chat channel using the Twilio?
No comments:
Post a Comment