package org.sechat.app.adapter; /** * Copyright (c) 2014 Sechat GbR <support@sechat.org> * * You should have received a copy of the MIT License * along with this program (license.txt). * If not, see <http://sechat.github.io/license.txt>. */ import java.util.ArrayList; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.LastActivityManager; import org.jivesoftware.smackx.packet.LastActivity; import org.sechat.app.R; import org.sechat.app.ThreadHelper; import org.sechat.app.User; import org.sechat.app.activity.MessageBoard; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; public class UserAdapter extends BaseAdapter { private static ThreadHelper th = new ThreadHelper(); String TAG = getClass().getName(); Activity act; Context context; ArrayList<User> data; static LayoutInflater inflater = null; public UserAdapter(Activity act, ArrayList<User> data) { this.act = act; /** * There is a bug in several Android versions, * which returns null if you call getBaseContext from a Activity * This problem exists only for the AlertDialog function */ this.context = act; // workaround for AlertDialog this.data = data; inflater = (LayoutInflater) act.getBaseContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if (vi == null) vi = inflater.inflate(R.layout.user_adapter, null); RelativeLayout list = (RelativeLayout)vi.findViewById(R.id.userList); TextView text = (TextView)vi.findViewById(R.id.userTitle); ImageView status = (ImageView)vi.findViewById(R.id.userStatus); final ImageView newMessage = (ImageView)vi.findViewById(R.id.newMessageView); TextView lastActivity = (TextView)vi.findViewById(R.id.lastActivity); final User user = data.get(position); list.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { String keyName = user.jid; if (th.D) Log.e(TAG, "Switch to user chat: "+keyName); th.setActiveChatUser(keyName); th.hasUserNewMessages(keyName, false); // switch to the message board Intent intent = new Intent(context, MessageBoard.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); context.startActivity(intent); } }); list.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View arg0) { if (ThreadHelper.xmppConnection != null && ThreadHelper.xmppConnection.isAuthenticated()) { DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { Roster roster = ThreadHelper.xmppConnection.getRoster(); if (roster.contains(user.jid)) { RosterEntry entry = roster.getEntry(user.jid); try { roster.removeEntry(entry); } catch (XMPPException e) { Log.e(TAG, "Failed removing user from roster!", e); } th.updateUserList(act); } } } }; AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("Do you want to remove '" + user.jid + "'?") .setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener).show(); } return true; } }); if (user.online) status.setImageResource(R.drawable.online_icon); else status.setImageResource(R.drawable.offline_icon); if (user.name != null) text.setText(user.name); else text.setText(user.jid); if (th.hasUserNewMessages(user.jid)) newMessage.setVisibility(View.VISIBLE); else newMessage.setVisibility(View.GONE); try { LastActivity activty = LastActivityManager.getLastActivity( ThreadHelper.xmppConnection, user.jid); String result; if (activty.lastActivity > 3600) result = (activty.lastActivity / 3600) + " hours"; else if (activty.lastActivity > 60) result = (activty.lastActivity / 60) + " minutes"; else result = activty.lastActivity + " seconds"; lastActivity.setText("Idle since " + result); } catch (XMPPException e) { if (th.D) Log.e(TAG, e.getMessage()); lastActivity.setText("Idle not available, yet"); } return vi; } }