/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2009, FriendConnect **
** All rights reserved. **
** **
** This program and the accompanying materials are made available under **
** the terms of the GPLv3 license which accompanies this **
** distribution. A copy is found in the textfile LICENSE.txt **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Main developers: **
** Juri Strumpflohner http://blog.js-development.com **
** Matthias Braunhofer http://matthias.jimdo.com **
** **
** ********************************************************************** */
package com.friendconnect.activities;
import java.util.Observable;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import com.friendconnect.R;
import com.friendconnect.adapters.FriendAdapter;
import com.friendconnect.controller.FriendListController;
import com.friendconnect.main.IoC;
import com.friendconnect.model.FriendConnectUser;
import com.friendconnect.model.User;
import com.friendconnect.model.UserComparator;
import com.friendconnect.utils.ActivityUtils;
public class FriendListActivity extends AuthenticationActivity implements IView {
private static final int ADD_FRIEND = Menu.FIRST;
private static final int REMOVE_FRIEND = Menu.FIRST + 1;
private static final int PENDINGINVITES_LIST = Menu.FIRST + 2;
private static final int PROFILE = Menu.FIRST + 3;
private static final int MAP_VIEW = Menu.FIRST + 4;
private static final int LOCATE_ON_MAP = Menu.FIRST + 5;
private boolean lock = false;
private UserComparator userComparator = new UserComparator();
private Handler handler;
private FriendListController controller;
private ListView listViewFriends;
private BaseAdapter adapter;
private User selectedUser;
static final private int FRIENDDETAILS_DIALOG = 10;
static final private int ADDFRIEND_DIALOG = 20;
public void onAuthenticated() {
setContentView(R.layout.friendlist);
handler = new Handler();
listViewFriends = (ListView) findViewById(R.id.listViewFriends);
controller = IoC.getInstance(FriendListController.class);
controller.setLayoutId(R.layout.friendlistrowitem);
controller.registerView(this);
FriendConnectUser user = controller.getModel();
showFriendConnectUserInfo(user);
adapter = controller.getAdapter(this);
listViewFriends.setAdapter(this.adapter);
listViewFriends.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedUser = controller.getFriend(position);
showDialog(FRIENDDETAILS_DIALOG);
}
});
registerForContextMenu(listViewFriends);
}
/**
* Shows information of the logged-in user
*
* @param user
*/
private void showFriendConnectUserInfo(FriendConnectUser user) {
((TextView) findViewById(R.id.textViewMyUsername)).setText(user.toString());
((TextView) findViewById(R.id.textViewMyStatus)).setText(user.getStatusMessage());
int imgResourceId;
if (user.getOnline()) {
imgResourceId = R.drawable.online;
} else {
imgResourceId = R.drawable.offline;
}
((ImageView) findViewById(R.id.imgViewMyStatus)).setImageResource(imgResourceId);
}
@Override
public Dialog onCreateDialog(int id) {
switch (id) {
case (FRIENDDETAILS_DIALOG): {
return ActivityUtils.createViewDialog(this, R.layout.frienddetailsview,
R.string.details, R.drawable.icon);
}
case (ADDFRIEND_DIALOG): {
return ActivityUtils.createViewDialog(this, R.layout.friendinvite, R.string.invitation,
R.drawable.icon);
}
}
return super.onCreateDialog(id);
}
@Override
public void onPrepareDialog(int id, final Dialog dialog) {
switch (id) {
case (FRIENDDETAILS_DIALOG): {
((TextView) dialog.findViewById(R.id.textViewName)).setText(selectedUser.getName());
((TextView) dialog.findViewById(R.id.textViewPhone)).setText(selectedUser.getPhone());
((TextView) dialog.findViewById(R.id.textViewEmail)).setText(selectedUser.getEmailAddress());
((TextView) dialog.findViewById(R.id.textViewWebsite)).setText(selectedUser.getWebsite());
((TextView) dialog.findViewById(R.id.textViewStatusmessage)).setText(selectedUser.getStatusMessage());
break;
}
case (ADDFRIEND_DIALOG): {
((Button) dialog.findViewById(R.id.buttonInvite))
.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
EditText editTextEmailAddress = (EditText) dialog
.findViewById(R.id.editTextInviteeEmail);
String emailAddress = editTextEmailAddress.getText().toString().trim();
if (!emailAddress.equals("") && emailAddress.contains("@")) {
if (!emailAddress.equals(controller.getModel().getEmailAddress())) {
showProgressDialog(getText(R.string.uiMessageSendingInvite));
controller.inviteFriend(emailAddress);
editTextEmailAddress.setText("");
editTextEmailAddress.requestFocus();
dialog.dismiss();
} else {
ActivityUtils.showToast(FriendListActivity.this,
R.string.uiMessageCannotInviteYourself,
Toast.LENGTH_LONG);
}
} else {
ActivityUtils.showToast(FriendListActivity.this,
R.string.uiMessageProvideEmailAddress, Toast.LENGTH_LONG);
}
}
});
break;
}
}
}
public void update(final Observable observable, final Object data) {
handler.post(new Runnable() {
public void run() {
showFriendConnectUserInfo((FriendConnectUser) observable);
while (lock);
((FriendAdapter) adapter).sort(userComparator);
adapter.notifyDataSetChanged();
}
});
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
int index = listViewFriends.getSelectedItemPosition();
MenuItem itemRemoveFriend = menu.findItem(REMOVE_FRIEND);
itemRemoveFriend.setVisible(index >= 0);
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Create and add new menu items.
MenuItem itemAddFriend = menu.add(0, ADD_FRIEND, Menu.NONE, this
.getString(R.string.menuAddFriend));
MenuItem itemRemoveFriend = menu.add(0, REMOVE_FRIEND, Menu.NONE, this
.getString(R.string.menuRemoveFriend));
MenuItem itemPendingInvitesList = menu.add(2, PENDINGINVITES_LIST, Menu.NONE, this
.getString(R.string.menuPendingInvitesListView));
MenuItem itemProfile = menu.add(3, PROFILE, Menu.NONE, this
.getString(R.string.menuEditProfile));
MenuItem itemMapView = menu.add(4, MAP_VIEW, Menu.NONE, this
.getString(R.string.menuMapView));
// Assign icons
itemAddFriend.setIcon(R.drawable.menu_invite);
itemRemoveFriend.setIcon(R.drawable.menu_delete);
itemPendingInvitesList.setIcon(R.drawable.menu_pendinginvites);
itemProfile.setIcon(R.drawable.menu_preferences);
itemMapView.setIcon(R.drawable.menu_mapmode);
// Allocate shortcuts to each of them.
itemAddFriend.setShortcut('0', 'a');
itemRemoveFriend.setShortcut('1', 'r');
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case (ADD_FRIEND): {
showDialog(ADDFRIEND_DIALOG);
return true;
}
case (REMOVE_FRIEND): {
doRemoveFriendActions(listViewFriends.getSelectedItemPosition());
return true;
}
case (PENDINGINVITES_LIST): {
startActivity(new Intent(FriendListActivity.this, PendingInvitesListActivity.class));
return true;
}
case (PROFILE): {
startActivity(new Intent(FriendListActivity.this, EditProfileActivity.class));
return true;
}
case (MAP_VIEW): {
startActivity(new Intent(FriendListActivity.this, FriendMapActivity.class));
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, REMOVE_FRIEND, Menu.NONE, R.string.menuRemoveFriend);
menu.add(0, LOCATE_ON_MAP, Menu.NONE, R.string.menuShowOnMap);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo;
menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int index = menuInfo.position;
switch (item.getItemId()) {
case (REMOVE_FRIEND): {
doRemoveFriendActions(index);
return true;
}
case (LOCATE_ON_MAP): {
final User friend = getSelectedFriend(index);
Intent mapIntent = new Intent(FriendListActivity.this, FriendMapActivity.class);
mapIntent.putExtra(FriendMapActivity.CENTER_LAT, friend.getPosition().getLatitude());
mapIntent.putExtra(FriendMapActivity.CENTER_LNG, friend.getPosition().getLongitude());
startActivity(mapIntent);
return true;
}
}
return super.onContextItemSelected(item);
}
/**
* Does preparative actions for calling the controller's removeFriend method
*/
private void doRemoveFriendActions(int index) {
final User friend = getSelectedFriend(index);
AlertDialog.Builder ad = ActivityUtils.createConfirmationDialog(this,
getString(R.string.dialogRemoveFriendTitle), String.format(
getString(R.string.dialogRemoveFriendMessage), friend.toString()));
ad.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (friend != null) {
showProgressDialog(getText(R.string.uiMessageRemovingFriend));
controller.removeFriend(friend.getId());
}
}
});
ad.setNegativeButton(R.string.cancel, null);
ad.setCancelable(true);
ad.show();
}
/**
* Locks the friend-list to be updated and retrieves the friend object that
* is being selected by the user
*
* @return the friend to remove
*/
private User getSelectedFriend(int index) {
User user;
lock = true;
try {
user = (User) listViewFriends.getItemAtPosition(index);
} finally {
lock = false;
}
return user;
}
@Override
protected void onDestroy() {
super.onDestroy();
controller.removeView(this);
}
/* Getters and setters */
public FriendListController getController() {
return controller;
}
}
|