5
0
mirror of https://github.com/cwinfo/envayasms.git synced 2025-04-16 13:08:20 +00:00
envayasms/src/org/envaya/sms/ui/PendingMessages.java

285 lines
9.2 KiB
Java
Executable File

package org.envaya.sms.ui;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import org.envaya.sms.App;
import org.envaya.sms.IncomingMessage;
import org.envaya.sms.OutgoingMessage;
import org.envaya.sms.QueuedMessage;
import org.envaya.sms.R;
public class PendingMessages extends ListActivity {
private App app;
private List<QueuedMessage> displayedMessages;
private BroadcastReceiver refreshReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
refreshMessages();
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
app = (App) getApplication();
setContentView(R.layout.pending_messages);
IntentFilter refreshReceiverFilter = new IntentFilter();
refreshReceiverFilter.addAction(App.INBOX_CHANGED_INTENT);
refreshReceiverFilter.addAction(App.OUTBOX_CHANGED_INTENT);
registerReceiver(refreshReceiver, refreshReceiverFilter);
ListView listView = getListView();
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
final QueuedMessage message = displayedMessages.get(position);
final CharSequence[] options = {"Retry", "Delete", "Cancel"};
new AlertDialog.Builder(PendingMessages.this)
.setTitle(message.getDescription())
.setItems(options, new OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
if (which == 0)
{
retryMessage(message);
}
else if (which == 1)
{
deleteMessage(message);
}
dialog.dismiss();
}
})
.show();
}
});
refreshMessages();
}
@Override
public void onDestroy()
{
this.unregisterReceiver(refreshReceiver);
super.onDestroy();
}
public void refreshMessages()
{
final ArrayList<QueuedMessage> messages = new ArrayList<QueuedMessage>();
synchronized(app.outbox)
{
for (OutgoingMessage message : app.outbox.getMessages())
{
messages.add(message);
}
}
synchronized(app.inbox)
{
for (IncomingMessage message : app.inbox.getMessages())
{
messages.add(message);
}
}
Collections.sort(messages, new Comparator<QueuedMessage>(){
public int compare(QueuedMessage t1, QueuedMessage t2)
{
return t1.getDateCreated().compareTo(t2.getDateCreated());
}
});
displayedMessages = messages;
this.setTitle("EnvayaSMS : Pending Messages ("+messages.size()+")");
final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final DateFormat longFormat = new SimpleDateFormat("dd MMM hh:mm:ss");
final DateFormat shortFormat = new SimpleDateFormat("hh:mm:ss");
final Date now = new Date();
ArrayAdapter<QueuedMessage> arrayAdapter = new ArrayAdapter<QueuedMessage>(this,
R.layout.pending_message,
messages.toArray(new QueuedMessage[]{})) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
v = inflater.inflate(R.layout.pending_message, null);
}
QueuedMessage message = messages.get(position);
if (message == null)
{
return null;
}
TextView addr = (TextView) v.findViewById(R.id.pending_address);
TextView time = (TextView) v.findViewById(R.id.pending_time);
TextView status = (TextView) v.findViewById(R.id.pending_status);
addr.setText(message.getDescription());
String statusText = message.getStatusText();
int numRetries = message.getNumRetries();
if (numRetries > 0)
{
statusText = statusText + " (tries=" + numRetries + ")";
}
status.setText(statusText);
Date date = message.getDateCreated();
DateFormat format =
(date.getDate() == now.getDate() && date.getMonth() == now.getMonth())
? shortFormat : longFormat;
time.setText(format.format(date));
return v;
}
};
setListAdapter(arrayAdapter);
}
public void deleteMessage(QueuedMessage message)
{
if (message instanceof IncomingMessage)
{
app.inbox.deleteMessage((IncomingMessage)message);
}
else
{
app.outbox.deleteMessage((OutgoingMessage)message);
}
}
public void deleteAll()
{
for (QueuedMessage message : displayedMessages)
{
deleteMessage(message);
}
}
public void deleteAllClicked() {
new AlertDialog.Builder(this)
.setTitle("Confirm Action")
.setMessage("Do you want to delete all "+displayedMessages.size()+" pending messages?")
.setPositiveButton("OK",
new OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
deleteAll();
}
}
)
.setNegativeButton("Cancel",
new OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
}
)
.show();
}
public void retryMessage(QueuedMessage message)
{
if (message instanceof IncomingMessage)
{
app.inbox.enqueueMessage((IncomingMessage)message);
}
else
{
app.outbox.enqueueMessage((OutgoingMessage)message);
}
}
public void retryAllClicked()
{
for (QueuedMessage message : displayedMessages)
{
retryMessage(message);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.retry_all:
retryAllClicked();
return true;
case R.id.delete_all:
deleteAllClicked();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// first time the Menu key is pressed
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.pending_messages, menu);
return(true);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem retryItem = menu.findItem(R.id.retry_all);
MenuItem deleteItem = menu.findItem(R.id.delete_all);
int numMessages = displayedMessages.size();
retryItem.setEnabled(numMessages > 0);
deleteItem.setEnabled(numMessages > 0);
return true;
}
}