package org.sechat.app.activity; /** * 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 java.util.Calendar; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import org.sechat.app.R; import org.sechat.app.ThreadHelper; import org.sechat.app.User; import org.sechat.app.adapter.UserAdapter; import org.sechat.app.services.Listener; import org.sechat.app.services.ListenerHandler; import org.sechat.app.services.SubscriptionHandler; import org.sechat.app.task.AddManualContacts; import org.sechat.app.task.SearchContacts; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Messenger; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; public class UserList extends Activity { private static boolean isBound = false; private static ThreadHelper th = new ThreadHelper(); private String TAG = getClass().getName(); public static ArrayList<User> listItems; public static UserAdapter adapter; public static TextView contactInfoBox; public static Button addManual; public static Button addAuto; public static ProgressBar updateUserListBar; Handler handler = new Handler(); Runnable updateUserList = new Runnable() { @Override public void run() { updateUserListBar.setVisibility(View.VISIBLE); th.updateUserList(UserList.this); handler.postDelayed(this, ThreadHelper.USERLIST_REPEAT_TIME); } }; @Override public synchronized void onResume() { super.onResume(); if (th.D) Log.e(TAG, "++ onResume ++"); ThreadHelper.activityResumed(); if (!isBound) { Intent service = new Intent(getBaseContext(), Listener.class); Messenger messenger = new Messenger(new ListenerHandler(this)); service.putExtra("MESSENGER", messenger); isBound = bindService(service, th.conn, Context.BIND_AUTO_CREATE); } handler.post(updateUserList); } @Override public synchronized void onPause() { super.onPause(); if (th.D) Log.e(TAG, "++ onPause ++"); ThreadHelper.activityPaused(); if (isBound) { unbindService(th.conn); isBound = false; } handler.removeCallbacks(updateUserList); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (th.D) Log.e(TAG, "++ onCreate ++"); setContentView(R.layout.userlist_activity); contactInfoBox = (TextView)findViewById(R.id.noContactHint); addManual = (Button)findViewById(R.id.addContactManual); addAuto = (Button)findViewById(R.id.addContacts); updateUserListBar = (ProgressBar)findViewById(R.id.updateUserListBar); /** * Start service listener */ Intent service = new Intent(getBaseContext(), Listener.class); Calendar cal = Calendar.getInstance(); PendingIntent pending = PendingIntent.getService( this, 0, service, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), ThreadHelper.REPEAT_TIME, pending); /** * Get roster contacts and print them as user list */ ListView myContacts = (ListView) findViewById(R.id.myContacts); listItems = new ArrayList<User>(); /** * Display a hint if the user has no contacts */ contactInfoBox.setVisibility(View.VISIBLE); addManual.setVisibility(View.VISIBLE); addAuto.setVisibility(View.VISIBLE); adapter = new UserAdapter(this, listItems); myContacts.setAdapter(adapter); /** * Add a packet listener for subscriptions * to the XMPP connection */ ThreadHelper.xmppConnection.addPacketListener(new SubscriptionHandler(this), new PacketFilter() { public boolean accept(Packet aPacket) { if (aPacket instanceof Presence) { Presence p = (Presence) aPacket; return ((Presence.Type.subscribe.equals(p.getType())) || (Presence.Type.unsubscribe.equals(p.getType())) || (Presence.Type.subscribed.equals(p.getType())) || (Presence.Type.unsubscribed.equals(p.getType()))); } return false; } }); } public void addContact(View v) { new AddManualContacts(this).execute(); } public void addContacts(View v) { new SearchContacts(this).execute(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.activity_userlist, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.searchContacts) { View v = new View(getBaseContext()); addContacts(v); return true; } if (item.getItemId() == R.id.addContact) { View v = new View(getBaseContext()); addContact(v); return true; } return false; } }