/* * 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 android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.text.format.DateFormat; import android.util.TypedValue; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.cloverstudio.spikademo.R; import com.cloverstudio.spikademo.couchdb.CouchDB; import com.cloverstudio.spikademo.couchdb.model.User; import com.cloverstudio.spikademo.dialog.HookUpAlertDialog; import com.cloverstudio.spikademo.dialog.HookUpProgressDialog; import com.cloverstudio.spikademo.extendables.SpikaActivity; import com.cloverstudio.spikademo.extendables.SpikaAsync; import com.cloverstudio.spikademo.lazy.ImageLoader; import com.cloverstudio.spikademo.management.SettingsManager; import com.cloverstudio.spikademo.management.UsersManagement; import com.cloverstudio.spikademo.utils.Const; import com.cloverstudio.spikademo.utils.Utils; /** * UserProfileActivity * * Shows profile of a user; has an option for login user to remove/add this user * to favorites. */ public class UserProfileActivity extends SpikaActivity { private ImageView mIvUserImage; private TextView mTvUserName; private TextView mTvUserLastLogin; private TextView mTvUserAbout; private TextView mTvUserBirthday; private TextView mTvUserGender; private Button mBtnContacts; private Button mBtnBack; private ProgressBar mPbLoading; private User mUser; private RelativeLayout mRlAbout; private RelativeLayout mRlBirthday; private RelativeLayout mRlGender; private Spinner mSpinnerStatus; private String mUserOnlineStatus; private Button mBtnOpenWall; // private boolean mIsUpdated = false; private static final int ADD = 1000; private static final int REMOVE = 1001; private static final int NO_BIRTHDAY = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResult(RESULT_CANCELED); setContentView(R.layout.activity_user_profile); Initialization(); OnClickListeners(); showTutorial(getString(R.string.tutorial_userprofile)); } @Override protected void setObjectsNull() { unbindDrawables(findViewById(R.id.ivUserImage)); mRlBirthday = null; mRlAbout = null; mRlGender = null; super.setObjectsNull(); } private void Initialization() { mIvUserImage = (ImageView) findViewById(R.id.ivProfileImage); mTvUserName = (TextView) findViewById(R.id.tvUserName); mTvUserLastLogin = (TextView) findViewById(R.id.tvUserLastLogin); mTvUserAbout = (TextView) findViewById(R.id.tvUserAbout); mTvUserBirthday = (TextView) findViewById(R.id.tvUserBirthday); mTvUserGender = (TextView) findViewById(R.id.tvUserGender); mBtnContacts = (Button) findViewById(R.id.btnContacts); mBtnContacts.setTypeface(SpikaApp.getTfMyriadProBold(), Typeface.BOLD); mBtnBack = (Button) findViewById(R.id.btnBack); mBtnBack.setTypeface(SpikaApp.getTfMyriadProBold(), Typeface.BOLD); mPbLoading = (ProgressBar) findViewById(R.id.pbLoadingForImage); mRlAbout = (RelativeLayout) findViewById(R.id.rlAbout); mRlGender = (RelativeLayout) findViewById(R.id.rlGender); mRlBirthday = (RelativeLayout) findViewById(R.id.rlBirthday); mBtnOpenWall = (Button) findViewById(R.id.btnOpenWall); mBtnOpenWall.setTypeface(SpikaApp.getTfMyriadPro()); mBtnOpenWall.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { openUserWall(mUser); } }); mSpinnerStatus = (Spinner) findViewById(R.id.spinnerStatus); mSpinnerStatus.setClickable(false); // If opened from link if (getIntent().getBooleanExtra(Const.USER_URI_INTENT, false)) { String userName = getIntent().getStringExtra(Const.USER_URI_NAME); new FindUserByNameAsync(this).execute(userName); // If opened from another activity } else { String userId = getIntent().getStringExtra("user_id"); if (getIntent().getStringExtra("user_id") != null) { getIntent().removeExtra("user_id"); } else { userId = UsersManagement.getToUser().getId(); } new FindUserByIdAsync(this).execute(userId); } final ArrayAdapter<String> onlineStatusAdapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, getResources() .getStringArray(R.array.online_status)) { @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); ((TextView) v).setTextSize(16); ((TextView) v).setTypeface(SpikaApp.getTfMyriadPro()); Drawable statusIcon = null; switch (position) { case 0: statusIcon = getContext().getResources().getDrawable( R.drawable.user_online_icon); ((TextView) v).setTextColor(getResources().getColor( R.color.hookup_positive)); break; case 1: statusIcon = getContext().getResources().getDrawable( R.drawable.user_away_icon); ((TextView) v).setTextColor(getResources().getColor( R.color.hookup_positive)); break; case 2: statusIcon = getContext().getResources().getDrawable( R.drawable.user_busy_icon); ((TextView) v).setTextColor(getResources().getColor( R.color.hookup_positive)); break; case 3: statusIcon = getContext().getResources().getDrawable( R.drawable.user_offline_icon); ((TextView) v).setTextColor(getResources().getColor( R.color.hookup_positive)); break; default: ((TextView) v).setTextColor(getResources().getColor( R.color.hookup_positive)); break; } ((TextView) v).setCompoundDrawablePadding(10); ((TextView) v).setCompoundDrawablesWithIntrinsicBounds( statusIcon, null, null, null); return v; } }; mSpinnerStatus.setAdapter(onlineStatusAdapter); } private void setUserProfile() { mUserOnlineStatus = mUser.getOnlineStatus(); if (mUserOnlineStatus != null && !"".equals(mUserOnlineStatus)) { if (mUserOnlineStatus.equals(Const.ONLINE)) { mSpinnerStatus.setSelection(0); } if (mUserOnlineStatus.equals(Const.AWAY)) { mSpinnerStatus.setSelection(1); } if (mUserOnlineStatus.equals(Const.BUSY)) { mSpinnerStatus.setSelection(2); } if (mUserOnlineStatus.equals(Const.OFFLINE)) { mSpinnerStatus.setSelection(3); } } else { mSpinnerStatus.setSelection(3); } Utils.displayImage(mUser.getAvatarFileId(), mIvUserImage, mPbLoading, ImageLoader.LARGE, R.drawable.user_stub_large, false); mTvUserName.setText(mUser.getName()); if (mUser.getLastLogin() != 0) { mTvUserLastLogin.setText(Utils.getFormattedDateTime(mUser .getLastLogin())); } if (mUser.getAbout() != null && !"".equals(mUser.getAbout())) { mRlAbout.setVisibility(View.VISIBLE); mTvUserAbout.setText(mUser.getAbout()); } else { mRlAbout.setVisibility(View.GONE); } if (mUser.getBirthday() == NO_BIRTHDAY) { mRlBirthday.setVisibility(View.GONE); } else { mRlBirthday.setVisibility(View.VISIBLE); String stringBirthday = DateFormat.format( getString(R.string.hookup_date_format), mUser.getBirthday() * 1000).toString(); mTvUserBirthday.setText(stringBirthday); } if (mUser.getGender() != null && !"".equals(mUser.getGender())) { mRlGender.setVisibility(View.VISIBLE); if (mUser.getGender().equalsIgnoreCase(Const.MALE)) { mTvUserGender.setText(R.string.male); } if (mUser.getGender().equalsIgnoreCase(Const.FEMALE)) { mTvUserGender.setText(R.string.female); } } else { mRlGender.setVisibility(View.GONE); } if (UsersManagement.getLoginUser().isInContacts(mUser)) { setButtonContacts(REMOVE); } else { setButtonContacts(ADD); } } private void OnClickListeners() { final HookUpAlertDialog alertDialog = new HookUpAlertDialog(this); mBtnContacts.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (UsersManagement.getLoginUser().isInContacts(mUser)) { new UpdateContactsAsync().execute(REMOVE); } else { if (UsersManagement.getLoginUser().canAddContact()) { new UpdateContactsAsync().execute(ADD); } else { alertDialog .show(getString(R.string.max_contacts_alert)); } } } }); mBtnBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { UserProfileActivity.this.finish(); } }); } private void setButtonContacts(int type) { mBtnContacts.setVisibility(View.VISIBLE); switch (type) { case ADD: mBtnContacts.setText(getString(R.string.ADD_CONTACT)); mBtnContacts.setBackgroundResource(R.drawable.positive_selector); mBtnContacts.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13); break; case REMOVE: mBtnContacts.setText(getString(R.string.REMOVE_CONTACT)); mBtnContacts.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); mBtnContacts.setBackgroundResource(R.drawable.alert_selector); break; default: break; } } // TODO need to check if success private class FindUserByIdAsync extends SpikaAsync<String, Void, User> { protected FindUserByIdAsync(Context context) { super(context); } @Override protected User doInBackground(String... params) { return CouchDB.findUserById(params[0]); } @Override protected void onPostExecute(User user) { super.onPostExecute(user); if (user != null) { mUser = user; } setUserProfile(); } } // TODO need to check if success private class FindUserByNameAsync extends SpikaAsync<String, Void, User> { protected FindUserByNameAsync(Context context) { super(context); } @Override protected User doInBackground(String... params) { return CouchDB.findUsersByName(params[0]).get(0); } @Override protected void onPostExecute(User user) { super.onPostExecute(user); if (user != null) { mUser = user; } setUserProfile(); } } private class UpdateContactsAsync extends AsyncTask<Integer, Void, Boolean> { private HookUpProgressDialog progressDialog; int updateType; @Override protected void onPreExecute() { super.onPreExecute(); if (progressDialog == null) { progressDialog = new HookUpProgressDialog( UserProfileActivity.this); } progressDialog.show(); } @Override protected Boolean doInBackground(Integer... params) { updateType = params[0]; if (updateType == ADD) { return CouchDB.addUserContact(mUser.getId()); } else if (updateType == REMOVE) { return CouchDB.removeUserContact(mUser.getId()); } return false; } @Override protected void onPostExecute(Boolean updated) { if (updated) { if (updateType == ADD) { setButtonContacts(REMOVE); } if (updateType == REMOVE) { setButtonContacts(ADD); } UserProfileActivity.this.setResult(RESULT_OK); } else { Toast.makeText(UserProfileActivity.this, getString(R.string.failed_to_update_contacts), Toast.LENGTH_SHORT).show(); } progressDialog.dismiss(); } } private void openUserWall(User user) { UsersManagement.setToUser(user); UsersManagement.setToGroup(null); SettingsManager.ResetSettings(); if (WallActivity.gCurrentMessages != null) { WallActivity.gCurrentMessages.clear(); } WallActivity.gIsRefreshUserProfile = true; UserProfileActivity.this.startActivity(new Intent( UserProfileActivity.this, WallActivity.class)); } }