/* * The MIT License (MIT) * * Copyright � 2013 Clover Studio Ltd. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package com.cloverstudio.spikademo; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.HorizontalScrollView; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.SlidingDrawer; import android.widget.TextView; import com.cloverstudio.spikademo.R; import com.cloverstudio.spikademo.adapters.WallMessagesAdapter; import com.cloverstudio.spikademo.couchdb.CouchDB; import com.cloverstudio.spikademo.couchdb.model.Emoticon; import com.cloverstudio.spikademo.couchdb.model.Group; import com.cloverstudio.spikademo.couchdb.model.Message; import com.cloverstudio.spikademo.couchdb.model.User; import com.cloverstudio.spikademo.couchdb.model.WatchingGroupLog; import com.cloverstudio.spikademo.dialog.HookUpAlertDialog; import com.cloverstudio.spikademo.dialog.TempVideoChooseDialog; import com.cloverstudio.spikademo.dialog.HookUpAlertDialog.ButtonType; import com.cloverstudio.spikademo.extendables.SpikaAsync; import com.cloverstudio.spikademo.extendables.SideBarActivity; import com.cloverstudio.spikademo.lazy.Emoticons; import com.cloverstudio.spikademo.management.SettingsManager; import com.cloverstudio.spikademo.management.TimeMeasurer; import com.cloverstudio.spikademo.management.UsersManagement; import com.cloverstudio.spikademo.messageshandling.MessagesUpdater; import com.cloverstudio.spikademo.messageshandling.SendMessageAsync; import com.cloverstudio.spikademo.messageshandling.UpdateMessagesInListView; import com.cloverstudio.spikademo.messageshandling.WallScrollListener; import com.cloverstudio.spikademo.utils.Const; import com.cloverstudio.spikademo.view.EmoticonsLayout; /** * WallActivity * * Displays a list of messages in private wall or other user/group wall; has * options for sending text, photo, video, voice, location and emoticon message. */ public class WallActivity extends SideBarActivity { public static ListView gLvWallMessages; public static WallMessagesAdapter gMessagesAdapter; public static ArrayList<Message> gCurrentMessages = null; public static ArrayList<Message> gNewMessages = null; public static boolean gIsRefreshUserProfile = false; public static boolean gIsVisible = false; public static UpdateMessagesInListView gUpdater = null; public static MessagesUpdater gMessagesUpdater = null; private Button mBtnCamera; private Button mBtnGallery; private Button mBtnVideo; private Button mBtnEmoji; private Button mBtnLocation; private Button mBtnRecord; private Button mBtnWallSend; private ImageButton mBtnOpenSlidingDrawer; private EditText mEtMessageText; private SlidingDrawer mSlidingDrawer; private RelativeLayout mRlBottom; private RelativeLayout.LayoutParams mParamsOpened; private RelativeLayout.LayoutParams mParamsClosed; private Intent mProfileIntent; private LinearLayout mButtonsLayout; private EmoticonsLayout mEmoticonsLayout; private HorizontalScrollView mScrollViewEmoticons; private static WallActivity sInstance = null; private static final int REQUEST_CODE_FROM_LOCATION = 1001; private static final int OPENED = 1003; private static final int CLOSED = 1004; private TempVideoChooseDialog mChooseDialog; private TextView mTvNoMessages; private View mViewDeletedGroup; private boolean mPushHandledOnNewIntent = false; private HookUpAlertDialog mDeletedGroupDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sInstance = this; setContentView(R.layout.activity_wall); setSideBar(getString(R.string.WALL)); initialization(); onClickListeners(); } @Override protected void onNewIntent(Intent intent) { mPushHandledOnNewIntent = false; if (getIntent().getBooleanExtra(Const.PUSH_INTENT, false)) { mPushHandledOnNewIntent = true; intent.removeExtra(Const.PUSH_INTENT); openWallFromNotification(intent); } setWatchingGroupLog(); super.onNewIntent(intent); } @Override public void onResume() { super.onResume(); if (!mPushHandledOnNewIntent) { if (getIntent().getBooleanExtra(Const.PUSH_INTENT, false)) { mPushHandledOnNewIntent = false; openWallFromNotification(getIntent()); getIntent().removeExtra(Const.PUSH_INTENT); } } if (mSlidingDrawer.isOpened()) { setSlidingDrawer(CLOSED); } if (SpikaApp.hasNetworkConnection()) { refreshWallMessages(); setWatchingGroupLog(); checkIfGroupIsDeleted(); setTitle(); } } private void setTitle() { if (UsersManagement.getToUser() != null) { mTvTitle.setText(UsersManagement.getToUser().getName()); } else if (UsersManagement.getToGroup() != null) { mTvTitle.setText(UsersManagement.getToGroup().getName()); } else { mTvTitle.setText(getString(R.string.WALL)); } } private void setWatchingGroupLog() { String watchingGroupId = SpikaApp.getPreferences() .getWatchingGroupId(); User loginUser = UsersManagement.getLoginUser(); Group group = UsersManagement.getToGroup(); boolean alreadyHasWatchingGroup = !watchingGroupId.equals(""); if (alreadyHasWatchingGroup) { new DeleteWatchingLogAsync(this).execute(SpikaApp.getPreferences() .getWatchingGroupId(), SpikaApp.getPreferences() .getWatchingGroupRev()); SpikaApp.getPreferences().setWatchingGroupId(""); SpikaApp.getPreferences().setWatchingGroupRev(""); } if (group != null) { boolean isInFavorites = loginUser.isInFavoriteGroups(group); if (!isInFavorites) { WatchingGroupLog watchingGroupLog = new WatchingGroupLog(); watchingGroupLog.setGroupId(UsersManagement.getToGroup() .getId()); watchingGroupLog.setUserId(UsersManagement.getLoginUser() .getId()); new CreateWatchingLogAsync(this).execute(watchingGroupLog); } } } private boolean isGroupDeleted() { if (UsersManagement.getToGroup() != null) { return (UsersManagement.getToGroup().isDeleted()); } return false; } private void checkIfGroupIsDeleted() { if (isGroupDeleted()) { if (mDeletedGroupDialog == null) { mDeletedGroupDialog = new HookUpAlertDialog(this); mDeletedGroupDialog .show(getString(R.string.this_group_is_deleted_please_unsubscribe), ButtonType.CLOSE); } mViewDeletedGroup.setVisibility(View.VISIBLE); } else { mViewDeletedGroup.setVisibility(View.GONE); } } private void openWallFromNotification(Intent intent) { String fromUserId = intent.getStringExtra(Const.PUSH_FROM_USER_ID); String fromType = intent.getStringExtra(Const.PUSH_FROM_TYPE); User fromUser = null; Group fromGroup = null; try { fromUser = new GetUserByIdAsync(this).execute(fromUserId).get(); if (fromType.equals(Const.PUSH_TYPE_GROUP)) { String fromGroupId = intent .getStringExtra(Const.PUSH_FROM_GROUP_ID); fromGroup = new GetGroupByIdAsync(this).execute(fromGroupId) .get(); UsersManagement.setToGroup(fromGroup); UsersManagement.setToUser(null); SettingsManager.ResetSettings(); if (WallActivity.gCurrentMessages != null) { WallActivity.gCurrentMessages.clear(); } } if (fromType.equals(Const.PUSH_TYPE_USER)) { UsersManagement.setToUser(fromUser); UsersManagement.setToGroup(null); SettingsManager.ResetSettings(); if (WallActivity.gCurrentMessages != null) { WallActivity.gCurrentMessages.clear(); } WallActivity.gIsRefreshUserProfile = true; } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { gIsVisible = true; } else { gIsVisible = false; } } @Override protected void enableViews() { super.enableViews(); gLvWallMessages.setEnabled(true); mBtnOpenSlidingDrawer.setEnabled(true); } @Override protected void disableViews() { super.disableViews(); if (gLvWallMessages != null) gLvWallMessages.setEnabled(false); if (mSlidingDrawer.isOpened()) { setSlidingDrawer(CLOSED); } mBtnOpenSlidingDrawer.setEnabled(false); hideKeyboard(); } public static WallActivity getInstance() { return sInstance; } @Override protected void refreshWallMessages() { super.refreshWallMessages(); TimeMeasurer.start(); if (gUpdater == null || gMessagesUpdater == null) { gUpdater = new UpdateMessagesInListView(this); gMessagesUpdater = new MessagesUpdater(); } gMessagesUpdater.update(); if (gMessagesAdapter != null) { gMessagesAdapter.notifyDataSetChanged(); } if (gIsRefreshUserProfile) { setWallMessages(); gIsRefreshUserProfile = false; } } public void checkMessagesCount() { if (gCurrentMessages.size() > 0) { mTvNoMessages.setVisibility(View.GONE); } else { mTvNoMessages.setVisibility(View.VISIBLE); } } @Override protected void setObjectsNull() { gCurrentMessages = null; gUpdater = null; gMessagesUpdater = null; unbindDrawables(findViewById(R.id.galleryEmoticons)); mEmoticonsLayout.removeAllViews(); mEmoticonsLayout = null; sInstance = null; gLvWallMessages = null; gMessagesAdapter = null; mScrollViewEmoticons = null; mButtonsLayout.removeAllViews(); mButtonsLayout = null; super.setObjectsNull(); } private void onClickListeners() { mBtnWallSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String body = mEtMessageText.getText().toString(); if (!body.equals("") && !mSideBarOpened) { mEtMessageText.setText(""); setSlidingDrawer(CLOSED); new SendMessageAsync(getApplicationContext(), SendMessageAsync.TYPE_TEXT).execute(body, false); } } }); mBtnOpenSlidingDrawer.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mSlidingDrawer.isOpened()) { setSlidingDrawer(CLOSED); } else { setSlidingDrawer(OPENED); } } }); mEtMessageText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (mSlidingDrawer.isOpened()) { setSlidingDrawer(CLOSED); } smoothScrollToBottom(); } }); mEtMessageText.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { smoothScrollToBottom(); } }); mBtnCamera.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(WallActivity.this, CameraCropActivity.class); intent.putExtra("type", "camera"); WallActivity.this.startActivity(intent); } }); mBtnEmoji.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setEmoticonsLayout(OPENED); } }); mBtnGallery.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(WallActivity.this, CameraCropActivity.class); intent.putExtra("type", "gallery"); WallActivity.this.startActivity(intent); } }); mBtnLocation.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivityForResult(new Intent(WallActivity.this, LocationActivity.class).putExtra("location", "myLocation"), REQUEST_CODE_FROM_LOCATION); } }); mBtnRecord.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(WallActivity.this, RecordingActivity.class)); } }); mBtnVideo.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mChooseDialog.show(); } }); } private void smoothScrollToBottom() { if (gLvWallMessages != null && gMessagesAdapter != null && gMessagesAdapter.getCount() > 1) { gLvWallMessages .smoothScrollToPosition(gMessagesAdapter.getCount() - 1); } } private void initialization() { mTvNoMessages = (TextView) findViewById(R.id.tvNoMessages); mBtnOpenSlidingDrawer = (ImageButton) findViewById(R.id.btnSlideButton); mBtnWallSend = (Button) findViewById(R.id.btnWallSend); mBtnWallSend.setTypeface(SpikaApp.getTfMyriadProBold(), Typeface.BOLD); mEtMessageText = (EditText) findViewById(R.id.etWallMessage); mEtMessageText.setTypeface(SpikaApp.getTfMyriadPro()); mSlidingDrawer = (SlidingDrawer) findViewById(R.id.slDrawer); mButtonsLayout = (LinearLayout) findViewById(R.id.llButtonsLayout); mEmoticonsLayout = (EmoticonsLayout) findViewById(R.id.galleryEmoticons); mScrollViewEmoticons = (HorizontalScrollView) findViewById(R.id.svEmoticons); mRlBottom = (RelativeLayout) findViewById(R.id.rlBottom); mBtnCamera = (Button) findViewById(R.id.btnCamera); mBtnGallery = (Button) findViewById(R.id.btnGallery); mBtnVideo = (Button) findViewById(R.id.btnVideo); mBtnEmoji = (Button) findViewById(R.id.btnEmoji); mBtnLocation = (Button) findViewById(R.id.btnLocation); mBtnRecord = (Button) findViewById(R.id.btnRecord); mViewDeletedGroup = (View) findViewById(R.id.viewDeletedGroup); mParamsClosed = new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); mParamsClosed.leftMargin = 2; mParamsOpened = new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); mParamsOpened.leftMargin = 2; mParamsClosed.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); mParamsOpened.addRule(RelativeLayout.ABOVE, mSlidingDrawer.getId()); setWallMessages(); mProfileIntent = new Intent(WallActivity.this, MyProfileActivity.class); mProfileIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); new GetEmoticonsAsync(this).execute(); mChooseDialog = new TempVideoChooseDialog(this); mChooseDialog.setOnButtonClickListener( TempVideoChooseDialog.BUTTON_CAMERA, new OnClickListener() { @Override public void onClick(View v) { Intent recordVideoIntent = new Intent( WallActivity.this, RecordingVideoActivity.class); recordVideoIntent.putExtra("camera", true); startActivity(recordVideoIntent); mChooseDialog.dismiss(); } }); mChooseDialog.setOnButtonClickListener( TempVideoChooseDialog.BUTTON_GALLERY, new OnClickListener() { @Override public void onClick(View v) { Intent recordVideoIntent = new Intent( WallActivity.this, RecordingVideoActivity.class); recordVideoIntent.putExtra("gallery", true); startActivity(recordVideoIntent); mChooseDialog.dismiss(); } }); mChooseDialog.setCancelable(true); } private void setWallMessages() { if (gCurrentMessages == null) { gCurrentMessages = new ArrayList<Message>(); } gLvWallMessages = (ListView) findViewById(R.id.lvWallMessages); gLvWallMessages.setOnScrollListener(new WallScrollListener()); gMessagesAdapter = new WallMessagesAdapter(this, gCurrentMessages); gLvWallMessages.setAdapter(gMessagesAdapter); } public void resetBoard() { WallActivity.gUpdater = null; WallActivity.gMessagesUpdater = null; gIsRefreshUserProfile = true; gCurrentMessages = new ArrayList<Message>(); } public static void redirect(Context context) { Intent intent = new Intent(context, WallActivity.class); context.startActivity(intent); } @Override public void onBackPressed() { if (emoticonsLayoutIsOpened()) { setEmoticonsLayout(CLOSED); } else if (mSlidingDrawer.isOpened()) { setSlidingDrawer(CLOSED); } else { super.onBackPressed(); } } private class GetEmoticonsAsync extends SpikaAsync<Void, Void, List<Emoticon>> { protected GetEmoticonsAsync(Context context) { super(context); } @Override protected List<Emoticon> doInBackground(Void... params) { if (Emoticons.getInstance().getEmoticons() == null) { return CouchDB.findAllEmoticons(); } else { return Emoticons.getInstance().getEmoticons(); } } @Override protected void onPostExecute(List<Emoticon> emoticons) { if (emoticons != null) { Emoticons.getInstance().setEmoticons(emoticons); } fillEmoticonsGallery(emoticons); } } private class CreateWatchingLogAsync extends SpikaAsync<WatchingGroupLog, Void, String> { protected CreateWatchingLogAsync(Context context) { super(context); } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(WatchingGroupLog... params) { return CouchDB.createWatchingGroupLog(params[0]); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result != null) { // Toast.makeText(WallActivity.this, "log created", // Toast.LENGTH_LONG).show(); } else { // Toast.makeText(WallActivity.this, "log error", // Toast.LENGTH_LONG).show(); } } } private class DeleteWatchingLogAsync extends SpikaAsync<String, Void, Boolean> { private WatchingGroupLog watchingGroupLog; protected DeleteWatchingLogAsync(Context context) { super(context); } @Override protected void onPreExecute() { super.onPreExecute(); watchingGroupLog = new WatchingGroupLog(); watchingGroupLog.setId(SpikaApp.getPreferences() .getWatchingGroupId()); watchingGroupLog.setRev(SpikaApp.getPreferences() .getWatchingGroupRev()); } @Override protected Boolean doInBackground(String... params) { String id = params[0]; String rev = params[1]; return CouchDB.deleteWatchingGroupLog(id, rev); } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if (result == true) { // Toast.makeText(WallActivity.this, "log deleted", // Toast.LENGTH_LONG).show(); } else { // Toast.makeText(WallActivity.this, "log error", // Toast.LENGTH_LONG).show(); } } } private void fillEmoticonsGallery(final List<Emoticon> emoticons) { if (mEmoticonsLayout != null) { for (int i = 0; i < emoticons.size(); i = i + 2) { if (i + 1 < emoticons.size()) { mEmoticonsLayout .add(emoticons.get(i), emoticons.get(i + 1)); } else { mEmoticonsLayout.add(emoticons.get(i), null); } } } } /** * Sends message type "emoticon" to CouchDB and closes the sliding drawer * * @param Emoticon */ public void sendEmoticon(Emoticon emoticon) { if (mSlidingDrawer.isOpened()) { setSlidingDrawer(CLOSED); } new SendMessageAsync(getApplicationContext(), SendMessageAsync.TYPE_EMOTICON).execute(emoticon, false); } private void setSlidingDrawer(int state) { switch (state) { case OPENED: InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mEtMessageText.getWindowToken(), 0); mEtMessageText.clearFocus(); mBtnOpenSlidingDrawer .setImageResource(R.drawable.hide_more_button_selector); mSlidingDrawer.open(); mRlBottom.setLayoutParams(mParamsOpened); mButtonsLayout.setVisibility(View.VISIBLE); mScrollViewEmoticons.setVisibility(View.GONE); break; case CLOSED: mBtnOpenSlidingDrawer .setImageResource(R.drawable.more_button_selector); mSlidingDrawer.close(); mRlBottom.setLayoutParams(mParamsClosed); break; default: break; } } private void setEmoticonsLayout(int state) { switch (state) { case OPENED: mButtonsLayout.setVisibility(View.GONE); mScrollViewEmoticons.setVisibility(View.VISIBLE); break; case CLOSED: mScrollViewEmoticons.setVisibility(View.GONE); mButtonsLayout.setVisibility(View.VISIBLE); break; default: break; } } private boolean emoticonsLayoutIsOpened() { if (mScrollViewEmoticons.getVisibility() == View.VISIBLE) { return true; } else { return false; } } }