/* * 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.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; 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.fragments.ChannelMessagesFragment; import com.magnet.samples.android.quickstart.fragments.ChannelSubscribersFragment; import com.magnet.samples.android.quickstart.util.Logger; public class ChannelActivity extends BaseActivity implements ChannelSubscribersFragment.OnChannelSubscribersInteractionListener { public static final String TAG_SELECTED_CHANNEL = "selected_channel"; public static final String TAG_IS_PUBLIC = "is_public"; private MMXChannel currentChannel; private AlertDialog dialog; private ViewPager viewPager; private TabLayout tabLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_channel); String channelName = getIntent().getStringExtra(TAG_SELECTED_CHANNEL); boolean isPublic = getIntent().getBooleanExtra(TAG_IS_PUBLIC, false); if (channelName != null) { if (isPublic) { MMXChannel.getPublicChannel(channelName, getChannelListener); } else { MMXChannel.getPrivateChannel(channelName, getChannelListener); } } } @Override public void onClick(View v) { } @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); } @Override public void readSubscribers(MMXChannel.OnFinishedListener<ListResult<User>> resultOnFinishedListener) { currentChannel.getAllSubscribers(100, 0, resultOnFinishedListener); } @Override public void inviteUser() { currentChannel.inviteUser(User.getCurrentUser(), "Join to our channel", new MMXChannel.OnFinishedListener<MMXChannel.MMXInvite>() { @Override public void onSuccess(MMXChannel.MMXInvite mmxInvite) { Logger.debug("invite user", "success"); showMessage("Invite was sent. Wait while user accepts it"); } @Override public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) { showMessage("Can't invite user : " + failureCode + " : " + throwable.getMessage()); Logger.error("invite user", throwable, "error : ", failureCode); } }); } private void initTabLayout() { viewPager = (ViewPager) findViewById(R.id.vpChannelDetail); viewPager.setAdapter(new ChannelFragmentPagerAdapter(getSupportFragmentManager(), this)); tabLayout = (TabLayout) findViewById(R.id.tlChannelDetail); tabLayout.setupWithViewPager(viewPager); } private final MMXChannel.OnFinishedListener<MMXChannel> getChannelListener = new MMXChannel.OnFinishedListener<MMXChannel>() { @Override public void onSuccess(MMXChannel mmxChannel) { Logger.debug("get channel", "success"); currentChannel = mmxChannel; setTitle(currentChannel.getName()); initTabLayout(); } @Override public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) { showMessage("Can't get channel : " + failureCode + " : " + throwable.getMessage()); Logger.error("get channel", throwable, "error : ", failureCode); finish(); } }; 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(ChannelActivity.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 boolean onInviteReceived(final MMXChannel.MMXInvite invite) { MMXChannel.MMXInviteInfo inviteInfo = invite.getInviteInfo(); Logger.debug("received invite", "from " + inviteInfo.getInviter().getUserName()); AlertDialog.Builder builder = new AlertDialog.Builder(ChannelActivity.this); String title = "Invite received"; builder.setTitle(title).setCancelable(false); builder.setMessage(String.format("You have received an invite from %s to channel %s", inviteInfo.getInviter().getUserName(), inviteInfo.getChannel().getName())); builder.setNegativeButton("Decline", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { invite.decline("No, thanks", inviteAnswerListener); dialog.dismiss(); } }); builder.setPositiveButton("Accept", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { invite.accept("Yes, thanks", inviteAnswerListener); dialog.dismiss(); } }); dialog = builder.show(); return true; } @Override public boolean onInviteResponseReceived(MMXChannel.MMXInviteResponse inviteResponse) { Logger.debug("invite response received"); if (inviteResponse.isAccepted()) { showMessage("Your invite was accepted"); } else { showMessage("Your invite was declined"); } return super.onInviteResponseReceived(inviteResponse); } }; private final MMXChannel.OnFinishedListener<MMXChannel.MMXInvite> inviteAnswerListener = new MMXChannel.OnFinishedListener<MMXChannel.MMXInvite>() { @Override public void onSuccess(MMXChannel.MMXInvite mmxInvite) { Logger.debug("answer to invite", "success"); } @Override public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) { showMessage("Can't answer to invite : " + failureCode + " : " + throwable.getMessage()); Logger.error("answer to invite", throwable, "error : ", failureCode); } }; public class ChannelFragmentPagerAdapter extends FragmentPagerAdapter { private final String[] tabTitles = new String[] { "Messages", "Subscribers" }; private final Fragment[] fragments = new Fragment[2]; private final Context context; public ChannelFragmentPagerAdapter(FragmentManager fm, Context context) { super(fm); this.context = context; } @Override public int getCount() { return tabTitles.length; } @Override public Fragment getItem(int position) { Fragment f = fragments[position]; if(null == f) { if(position == 0) { f = ChannelMessagesFragment.newInstance(currentChannel); } else { f = new ChannelSubscribersFragment(); } fragments[position] = f; } return f; } @Override public CharSequence getPageTitle(int position) { return tabTitles[position]; } } }