Android Open Source - Android-App-Project___Stay-Anonymous Chatting Room Activity






From Project

Back to project page Android-App-Project___Stay-Anonymous.

License

The source code is released under:

Apache License

If you think the Android project Android-App-Project___Stay-Anonymous listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package mobile_final;
/*w  ww  . java  2s  .  co  m*/
/*
 * Some parts of the following code uses some code from google's demo.
 */

/*
 * Copyright (c) 2013 Google 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.
 */

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.cloud.backend.R;
import com.google.cloud.backend.core.CloudBackendFragment;
import com.google.cloud.backend.core.CloudBackendFragment.OnListener;
import com.google.cloud.backend.core.CloudCallbackHandler;
import com.google.cloud.backend.core.CloudEntity;
import com.google.cloud.backend.core.CloudQuery.Order;
import com.google.cloud.backend.core.CloudQuery.Scope;
import com.google.cloud.backend.core.Consts;

/**
 * Sample Guestbook app with Mobile Backend Starter.
 */
public class ChattingRoomActivity extends Activity implements OnListener {

  private static final String    BROADCAST_PROP_DURATION  = "duration";
  private static final String    BROADCAST_PROP_MESSAGE  = "message";
  private static final String    debugTag        = "ChattingRoomActivity";

  private static final String    PROCESSING_FRAGMENT_TAG  = "BACKEND_FRAGMENT";
  // private static final String SPLASH_FRAGMENT_TAG = "SPLASH_FRAGMENT";

  // public static final String GUESTBOOK_SHARED_PREFS =
  // "GUESTBOOK_SHARED_PREFS";
  public static final String    SCOPE_PREFS_KEY      = "SCOPE_PREFS_KEY";

  /*
   * For chatting
   */
  private ListView        messageListView;
  private TextView        stubView;
  private EditText        textField;
  private ImageView        sendButton;
  // private TextView mAnnounceTxt;

  private FragmentManager      fragmentManager;
  private CloudBackendFragment  processFragment;
  // private SplashFragment mSplashFragment;
  private List<CloudEntity>    allPosts        = new LinkedList<CloudEntity>();

  /*
   * For Vote
   */

  private VoteHandler        voteHandler;
  private BroadcastReceiver    messageReceiver;
  private Context          context;

  /*
   * For general room property
   */
  private boolean          isRoomHolder;
  private String          roomTitle;
  private ProgressDialog      pDialog;

  /**
   * Override Activity lifecycle method.
   */
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    context = this;
    isRoomHolder = false;
    roomTitle = "defaultRoom";
    pDialog = new ProgressDialog(this);
    pDialog.setMessage("Refreshing...");

    // Extract intent
    Intent receivingIntent = getIntent();
    if (receivingIntent != null && receivingIntent.getExtras() != null) {

      roomTitle = receivingIntent.getExtras().getString("joinTitle") != null ? receivingIntent
          .getExtras().getString("joinTitle") : "defaultRoom";
      String isInstructor = receivingIntent.getExtras().getString("isInstructor") != null ? receivingIntent
          .getExtras().getString("isInstructor") : "no";
      isRoomHolder = isInstructor.equals("yes") ? true : false;
    }

    // Create voteHandler
    voteHandler = new VoteHandler(this);
    messageReceiver = new BroadcastReceiver() {

      @Override
      public void onReceive(Context context, Intent intent) {
        Log.d("messagetest", "Receiving msg");
        sendMessage((HashMap<String, String>) intent.getExtras().get("map"));
      }
    };
    LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver,
        new IntentFilter("SEND_MESSAGE_L"));

    // Create the view
    messageListView = (ListView) findViewById(R.id.posts_list);
    stubView = (TextView) findViewById(R.id.no_messages);
    textField = (EditText) findViewById(R.id.message);
    textField.setHint("Type message");
    textField.setEnabled(false);
    sendButton = (ImageView) findViewById(R.id.send_btn);
    sendButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        onSendButtonPressed(v);
      }
    });
    sendButton.setEnabled(false);
    // mAnnounceTxt = (TextView) findViewById(R.id.announce_text);

    fragmentManager = getFragmentManager();

    initiateFragments();
  }

  /**
   * Override Activity lifecycle method.
   */
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.chatting_room, menu);
    return super.onCreateOptionsMenu(menu);
  }

  /**
   * Override Activity lifecycle method.
   */
  @Override
  public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem loginItem = menu.findItem(R.id.switch_account);
    loginItem.setVisible(Consts.IS_AUTH_ENABLED);
    MenuItem voteItem = menu.findItem(R.id.vote);
    voteItem.setVisible(true);
    MenuItem voteResultItem = menu.findItem(R.id.voteResult);
    return true;
  }

  /**
   * Override Activity lifecycle method.
   * <p>
   * To add more option menu items in your client, add the item to
   * menu/activity_main.xml, and provide additional case statements in this
   * method.
   */
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case R.id.switch_account:
        processFragment.signInAndSubscribe(true);
        return true;
      case R.id.vote:
        voteHandler.raiseAVote(10, "testVote");
        return true;
      case R.id.voteResult:
        voteHandler.showResult();
        return true;
      case R.id.refresh:
        refresh();
        return true;
      default:
        return super.onOptionsItemSelected(item);
    }
  }

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
  }

  /**
   * Method called via OnListener in {@link CloudBackendFragment}.
   */
  @Override
  public void onCreateFinished() {
    Log.d(debugTag, "list post");
    listPosts();
  }

  /**
   * Method called via OnListener in {@link CloudBackendFragment}.
   */
  @Override
  public void onBroadcastMessageReceived(List<CloudEntity> l) {
    for (CloudEntity e : l) {
      String message = (String) e.get(BROADCAST_PROP_MESSAGE);
      int duration = Integer.parseInt((String) e.get(BROADCAST_PROP_DURATION));
      Toast.makeText(this, message, duration).show();
      Log.i(Consts.TAG, "A message was recieved with content: " + message);
    }
  }

  private void initiateFragments() {
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    // Check to see if we have retained the fragment which handles
    // asynchronous backend calls
    // processFragment = (CloudBackendFragment) fragmentManager
    // .findFragmentByTag(PROCESSING_FRAGMENT_TAG);
    // If not retained (or first time running), create a new one
    if (processFragment == null) {
      processFragment = new CloudBackendFragment();
      processFragment.setRetainInstance(true);
      // fragmentTransaction.add(processFragment,
      // PROCESSING_FRAGMENT_TAG);
    }

    // // Add the splash screen fragment
    // mSplashFragment = new SplashFragment();
    // fragmentTransaction.add(R.id.activity_main, mSplashFragment,
    // SPLASH_FRAGMENT_TAG);
    fragmentTransaction.commit();
  }

  /*
   * sendMessage for general use : vote etc
   */
  private void sendMessage(HashMap<String, String> message) {
    // create a CloudEntity with the new post
    CloudEntity newPost = new CloudEntity("Guestbook");

    // see what we have in the message
    Set<Entry<String, String>> set = message.entrySet();

    Iterator<Entry<String, String>> setIterator = set.iterator();
    while (setIterator.hasNext()) {
      Entry<String, String> mapEntry = setIterator.next();
      newPost.put(mapEntry.getKey(), mapEntry.getValue());
    }

    newPost.put("room_title", roomTitle);

    CloudCallbackHandler<CloudEntity> handler = new CloudCallbackHandler<CloudEntity>() {
      @Override
      public void onComplete(final CloudEntity result) {
        Log.d("test", "it's completed : " + result.toString());
      }

      @Override
      public void onError(final IOException exception) {
        handleEndpointException(exception);
      }
    };

    processFragment.getCloudBackend().insert(newPost, handler);

  }

  /**
   * onClick method.
   */
  public void onSendButtonPressed(View view) {

    // create a CloudEntity with the new post
    CloudEntity newPost = new CloudEntity("Guestbook");
    newPost.put("api", "chat");
    newPost.put("room_title", roomTitle);
    newPost.put("message", textField.getText().toString());
    // create a response handler that will receive the result or an error
    CloudCallbackHandler<CloudEntity> handler = new CloudCallbackHandler<CloudEntity>() {
      @Override
      public void onComplete(final CloudEntity result) {
        allPosts.add(0, result);
        updateChatRoomView();
        textField.setText("");
        textField.setEnabled(true);
        sendButton.setEnabled(true);
      }

      @Override
      public void onError(final IOException exception) {
        handleEndpointException(exception);
      }
    };

    // execute the insertion with the handler
    processFragment.getCloudBackend().insert(newPost, handler);
    textField.setEnabled(false);
    sendButton.setEnabled(false);
  }

  /*
   * Refresh request
   */

  private void refresh() {
    request(Scope.FUTURE_AND_PAST);
  }

  private void request(Scope s) {

    // create a response handler that will receive the result or an error
    CloudCallbackHandler<List<CloudEntity>> handler = new CloudCallbackHandler<List<CloudEntity>>() {
      @Override
      public void onComplete(List<CloudEntity> results) {
        // First we need to distinguish the chat messages and other APIs
        // such as vote etc.
        pDialog.dismiss();
        if (!results.isEmpty()) {
          LinkedList<CloudEntity> chatMsgs = new LinkedList<CloudEntity>();
          // mAnnounceTxt.setText(R.string.announce_success);
          for (CloudEntity ce : results) {
            if ((ce.get("api")) != null) {

              if ((ce.get("api")).equals("chat")) {
                // seperating rooms
                if (ce.get("room_title") != null) {
                  if (ce.get("room_title").equals(roomTitle)) {
                    chatMsgs.add(ce);
                  }
                }

              }
            }

          }

          allPosts = chatMsgs;
          // animateArrival();
          updateChatRoomView();

          // send broadcast to voter

          CloudEntity latestMsg = results.get(0);
          Toast.makeText(context, "newPost : " + latestMsg.getId(), Toast.LENGTH_SHORT)
              .show();

          Map<String, Object> resultMap = latestMsg.getProperties();
          Set<Entry<String, Object>> resultSet = resultMap.entrySet();
          Iterator<Entry<String, Object>> st = resultSet.iterator();
          HashMap<String, String> map = new HashMap<String, String>();
          while (st.hasNext()) {
            Entry<String, Object> currentEntry = st.next();
            map.put(currentEntry.getKey(), currentEntry.getValue().toString());
          }
          if (map.get("room_title") != null) {
            // Toast.makeText(context, "roomTitle"
            // +map.get("room_title"), Toast.LENGTH_SHORT).show();

            if (map.get("room_title").equals(roomTitle)) {
              map.put("id", latestMsg.getId());
              Intent intent = new Intent("RECEIVE_MESSAGE_L");
              intent.putExtra("map", map);
              LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
            }
          }
          else {
            Toast.makeText(context, "roomTitle is null", Toast.LENGTH_SHORT).show();
          }

        }
        else {
          // animateArrival();
          updateChatRoomView();
        }

      }

      @Override
      public void onError(IOException exception) {
        // mAnnounceTxt.setText(R.string.announce_fail);
        // animateArrival();
        handleEndpointException(exception);
      }
    };
    // execute the query with the handler
    pDialog.show();
    processFragment.getCloudBackend().listByKind("Guestbook", CloudEntity.PROP_CREATED_AT,
        Order.DESC, 50, Scope.FUTURE_AND_PAST, handler);

  }

  /**
   * Retrieves the list of all posts from the backend and updates the UI. For
   * demonstration in this sample, the query that is executed is:
   * "SELECT * FROM Guestbook ORDER BY _createdAt DESC LIMIT 50" This query
   * will be re-executed when matching entity is updated.
   */
  private void listPosts() {

    request(Scope.FUTURE_AND_PAST);
  }

  // private boolean firstArrival = true;
  // private void animateArrival() {
  // FragmentTransaction fragmentTransaction =
  // fragmentManager.beginTransaction();
  // mSplashFragment = (SplashFragment) fragmentManager.findFragmentByTag(
  // SPLASH_FRAGMENT_TAG);
  // if (mSplashFragment != null) {
  // fragmentTransaction.remove(mSplashFragment);
  // fragmentTransaction.commitAllowingStateLoss();
  // }
  //
  // // if (firstArrival) {
  // // mAnnounceTxt.setVisibility(View.VISIBLE);
  // // Animation anim = AnimationUtils.loadAnimation(this,
  // R.anim.translate_progress);
  // // anim.setAnimationListener(new Animation.AnimationListener() {
  // //
  // // @Override
  // // public void onAnimationStart(Animation animation) {
  // // }
  // //
  // // @Override
  // // public void onAnimationRepeat(Animation animation) {
  // // }
  // //
  // // @Override
  // // public void onAnimationEnd(Animation animation) {
  // // mAnnounceTxt.setVisibility(View.GONE);
  // // }
  // // });
  // //// mAnnounceTxt.startAnimation(anim);
  // // firstArrival = false;
  // // }
  // }

  private void updateChatRoomView() {
    textField.setEnabled(true);
    sendButton.setEnabled(true);
    if (!allPosts.isEmpty()) {
      stubView.setVisibility(View.GONE);
      messageListView.setVisibility(View.VISIBLE);
      messageListView.setAdapter(new PostAdapter(this, android.R.layout.simple_list_item_1,
          allPosts));
    }
    else {
      stubView.setVisibility(View.VISIBLE);
      messageListView.setVisibility(View.GONE);
    }
  }

  private void handleEndpointException(IOException e) {
    Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
    sendButton.setEnabled(true);
  }

}




Java Source Code List

com.google.cloud.backend.GCMBroadcastReceiver.java
com.google.cloud.backend.GCMIntentService.java
com.google.cloud.backend.android.mobilebackend.MobilebackendRequestInitializer.java
com.google.cloud.backend.android.mobilebackend.MobilebackendRequest.java
com.google.cloud.backend.android.mobilebackend.Mobilebackend.java
com.google.cloud.backend.android.mobilebackend.model.BlobAccess.java
com.google.cloud.backend.android.mobilebackend.model.EntityDto.java
com.google.cloud.backend.android.mobilebackend.model.EntityListDto.java
com.google.cloud.backend.android.mobilebackend.model.FilterDto.java
com.google.cloud.backend.android.mobilebackend.model.Filter.java
com.google.cloud.backend.android.mobilebackend.model.QueryDto.java
com.google.cloud.backend.core.CloudBackendAsync.java
com.google.cloud.backend.core.CloudBackendFragment.java
com.google.cloud.backend.core.CloudBackendMessaging.java
com.google.cloud.backend.core.CloudBackend.java
com.google.cloud.backend.core.CloudCallbackHandler.java
com.google.cloud.backend.core.CloudEndpointUtils.java
com.google.cloud.backend.core.CloudEntity.java
com.google.cloud.backend.core.CloudQuery.java
com.google.cloud.backend.core.Consts.java
com.google.cloud.backend.core.Filter.java
mobile_final.ChattingRoomActivity.java
mobile_final.EventListAdaptor.java
mobile_final.PostAdapter.java
mobile_final.SecondActivity.java
mobile_final.SplashFragment.java
mobile_final.StartingActivity.java
mobile_final.TestActivity.java
mobile_final.VoteHandler.java