package net.unverschaemt.pinfever; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.ProgressBar; import com.google.gson.JsonObject; import com.koushikdutta.async.future.FutureCallback; import java.util.ArrayList; import java.util.List; public class FriendsList extends Activity { public final static String USER = "net.unverschaemt.pinfever.USER"; private List<User> friends; private DataSource dataSource; private ProgressBar busyIndicator; private FriendsHandler friendsHandler; private BaseAdapter friendsListAdapter; private ServerAPI serverAPI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_friends_list); serverAPI = new ServerAPI(this); busyIndicator = (ProgressBar) findViewById(R.id.FriendsList_progressBar); dataSource = new DataSource(this); friendsHandler = new FriendsHandler(this); busyIndicator.setVisibility(View.VISIBLE); friends = friendsHandler.getFriends(new FriendsCallback() { @Override public void onFriendsLoaded(List<User> friends) { busyIndicator.setVisibility(View.GONE); fillFriendsList(friends); } }); fillFriendsList(friends); } private void updateFriendsList(User friend) { this.friends.add(friend); dataSource.open(); dataSource.createFriend(friend); dataSource.close(); fillFriendsList(this.friends); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_friends_list, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void openDialogToAddAFriend(View view) { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle(getString(R.string.addFriend)); alert.setMessage(getString(R.string.message_addFriend)); final EditText input = new EditText(this); alert.setView(input); alert.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String searchKey = input.getText().toString(); tryToAddTheFriend(searchKey); } }); alert.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Canceled. } }); alert.show(); } private void tryToAddTheFriend(String searchKey) { busyIndicator.setVisibility(View.VISIBLE); friendsHandler.getPlayer(searchKey, new GetPlayerCallback() { @Override public void onPlayerLoaded(User player) { busyIndicator.setVisibility(View.GONE); if (player != null) { addFriend(player); } } }); } private void addFriend(final User friend) { JsonObject jsonParam = new JsonObject(); jsonParam.addProperty(ServerAPI.paramPlayerId, friend.getId()); serverAPI.connect(serverAPI.urlAddFriend, friend.getId(), jsonParam, new FutureCallback() { @Override public void onCompleted(Exception e, Object result) { JsonObject jsonObject = (JsonObject) result; if (jsonObject.get(ServerAPI.errorObject).isJsonNull()) { updateFriendsList(friend); } else { ErrorHandler.showErrorMessage(jsonObject, getBaseContext()); } } }); } public void fillFriendsList(List<User> friends) { setChangesOfPFriends(friends); removeOldFriends(friends); if (friendsListAdapter == null) { friendsListAdapter = new FriendListAdapter(this, this.friends); ListView friendsList = (ListView) findViewById(R.id.FriendsList_friends); friendsList.setAdapter(friendsListAdapter); } else { friendsListAdapter.notifyDataSetChanged(); } } private void removeOldFriends(List<User> friends) { List<User> usersToRemove = new ArrayList<User>(); for (User user : this.friends) { if (!friends.contains(user)) { usersToRemove.add(user); } } this.friends.removeAll(usersToRemove); } private void setChangesOfPFriends(List<User> friends) { for (User friend : friends) { int index = this.friends.indexOf(friend); if (index > -1) { User oldFriend = this.friends.get(index); if (!oldFriend.getUserName().equals(friend.getUserName()) || !oldFriend.getAvatar().sameAs(friend.getAvatar())) { this.friends.set(index, friend); } } else { this.friends.add(friend); } } } }