package com.quickblox.sample.pushnotifications.activities; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.ProgressBar; import com.quickblox.auth.session.QBSessionManager; import com.quickblox.auth.session.QBSettings; import com.quickblox.core.QBEntityCallback; import com.quickblox.core.exception.QBResponseException; import com.quickblox.core.helper.StringifyArrayList; import com.quickblox.messages.QBPushNotifications; import com.quickblox.messages.model.QBEnvironment; import com.quickblox.messages.model.QBEvent; import com.quickblox.messages.model.QBNotificationType; import com.quickblox.sample.core.gcm.GooglePlayServicesHelper; import com.quickblox.sample.core.ui.activity.CoreBaseActivity; import com.quickblox.sample.core.utils.KeyboardUtils; import com.quickblox.sample.core.utils.Toaster; import com.quickblox.sample.core.utils.constant.GcmConsts; import com.quickblox.sample.pushnotifications.R; import java.util.ArrayList; import java.util.List; public class MessagesActivity extends CoreBaseActivity implements TextWatcher { private final String TAG = getClass().getSimpleName(); private EditText outgoingMessageEditText; private ProgressBar progressBar; private ArrayAdapter<String> adapter; private List<String> receivedPushes; private GooglePlayServicesHelper googlePlayServicesHelper; private BroadcastReceiver pushBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String message = intent.getStringExtra(GcmConsts.EXTRA_GCM_MESSAGE); Log.i(TAG, "Receiving event " + GcmConsts.ACTION_NEW_GCM_EVENT + " with data: " + message); retrieveMessage(message); } }; public static void start(Context context, String message) { Intent intent = new Intent(context, MessagesActivity.class); intent.putExtra(GcmConsts.EXTRA_GCM_MESSAGE, message); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messages); boolean enable = QBSettings.getInstance().isEnablePushNotification(); String subtitle = getSubtitleStatus(enable); setActionbarSubTitle(subtitle); receivedPushes = new ArrayList<>(); googlePlayServicesHelper = new GooglePlayServicesHelper(); initUI(); String message = getIntent().getStringExtra(GcmConsts.EXTRA_GCM_MESSAGE); if (message != null) { retrieveMessage(message); } registerReceiver(); } @Override protected void onDestroy() { super.onDestroy(); LocalBroadcastManager.getInstance(this).unregisterReceiver(pushBroadcastReceiver); } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.getItem(0).setEnabled(true); return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.activity_messages, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_send_message: item.setEnabled(false); sendPushMessage(); return true; case R.id.menu_enable_notification: QBSettings.getInstance().setEnablePushNotification(true); setActionbarSubTitle(getResources().getString(R.string.subtitle_enabled)); return true; case R.id.menu_disable_notification: QBSettings.getInstance().setEnablePushNotification(false); setActionbarSubTitle(getResources().getString(R.string.subtitle_disabled)); return true; default: return super.onOptionsItemSelected(item); } } private String getSubtitleStatus(boolean enable) { return enable ? getResources().getString(R.string.subtitle_enabled) : getResources().getString(R.string.subtitle_disabled); } private void setActionbarSubTitle(String subTitle) { if (actionBar != null) actionBar.setSubtitle(subTitle); } private void initUI() { progressBar = _findViewById(R.id.progress_bar); outgoingMessageEditText = _findViewById(R.id.edit_message_out); outgoingMessageEditText.addTextChangedListener(this); ListView incomingMessagesListView = _findViewById(R.id.list_messages); adapter = new ArrayAdapter<>(this, R.layout.list_item_message, R.id.item_message, receivedPushes); incomingMessagesListView.setAdapter(adapter); incomingMessagesListView.setEmptyView(_findViewById(R.id.text_empty_messages)); } private void registerReceiver() { googlePlayServicesHelper.checkPlayServicesAvailable(this); LocalBroadcastManager.getInstance(this).registerReceiver(pushBroadcastReceiver, new IntentFilter(GcmConsts.ACTION_NEW_GCM_EVENT)); } private void retrieveMessage(String message) { receivedPushes.add(0, message); adapter.notifyDataSetChanged(); progressBar.setVisibility(View.INVISIBLE); } private void sendPushMessage() { String outMessage = outgoingMessageEditText.getText().toString().trim(); if (!isValidData(outMessage)) { Toaster.longToast(R.string.error_field_is_empty); invalidateOptionsMenu(); return; } // Send Push: create QuickBlox Push Notification Event QBEvent qbEvent = new QBEvent(); qbEvent.setNotificationType(QBNotificationType.PUSH); qbEvent.setEnvironment(QBEnvironment.DEVELOPMENT); // Generic push - will be delivered to all platforms (Android, iOS, WP, Blackberry..) qbEvent.setMessage(outMessage); StringifyArrayList<Integer> userIds = new StringifyArrayList<>(); userIds.add(QBSessionManager.getInstance().getSessionParameters().getUserId()); qbEvent.setUserIds(userIds); QBPushNotifications.createEvent(qbEvent).performAsync(new QBEntityCallback<QBEvent>() { @Override public void onSuccess(QBEvent qbEvent, Bundle bundle) { progressBar.setVisibility(View.INVISIBLE); KeyboardUtils.hideKeyboard(outgoingMessageEditText); outgoingMessageEditText.setText(null); invalidateOptionsMenu(); } @Override public void onError(QBResponseException e) { View rootView = findViewById(R.id.activity_messages); showSnackbarError(rootView, R.string.connection_error, e, new View.OnClickListener() { @Override public void onClick(View v) { sendPushMessage(); } }); progressBar.setVisibility(View.INVISIBLE); KeyboardUtils.hideKeyboard(outgoingMessageEditText); invalidateOptionsMenu(); } }); progressBar.setVisibility(View.VISIBLE); } private boolean isValidData(String message) { return !TextUtils.isEmpty(message); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //ignore } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //ignore } @Override public void afterTextChanged(Editable s) { if (s.length() >= getResources().getInteger(R.integer.push_max_length)) { Toaster.shortToast(R.string.error_too_long_push); } } }