Back to project page smsAndCallFilter.
The source code is released under:
/* * Author: Hasib Al Muhaimin. * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the L...
If you think the Android project smsAndCallFilter listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/* * Author: Hasib Al Muhaimin.// w ww . jav a 2 s.com * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * ***courtesy to Jelle Geerts*** * Author: Jelle Geerts * Usage of the works is permitted provided that this instrument is * retained with the works, so that any entity that uses the works is * notified of this instrument. * * DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. */ package com.sadakhata.smsandcallfilter; import java.util.ArrayList; import java.util.List; import com.sadakhata.smsandcallfilter.R; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; 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 android.widget.Toast; import android.net.Uri; import android.content.ContentValues; public class MessageList extends Activity { //private static final String TAG = "Messages"; private MessageListArrayAdapter mAdapter; private ListView mListView; private BroadcastReceiver mReceiver; private class MessageListArrayAdapter extends ArrayAdapter<Message> { public MessageListArrayAdapter(Context context, List<Message> messages) { super(context, 0, messages); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.message_list_item, null); holder = new ViewHolder(); holder.addressTextView = (TextView) v.findViewById(R.id.address); holder.messageTextView = (TextView) v.findViewById(android.R.id.message); holder.receivedAtTextView = (TextView) v.findViewById(R.id.receivedAt); v.setTag(holder); } else { holder = (ViewHolder) v.getTag(); } Message message = getItem(position); holder.addressTextView.setText(message.address); holder.messageTextView.setText(message.message); holder.receivedAtTextView.setText( TimeFormatter.f( MessageList.this, message.receivedAt, TimeFormatter.SHORT_FORMAT)); return v; } private class ViewHolder { TextView addressTextView; TextView messageTextView; TextView receivedAtTextView; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(getString(R.string.messages)); setContentView(R.layout.message_list); mListView = (ListView) findViewById(R.id.messageList); List<Message> messages = new ArrayList<Message>(); mAdapter = new MessageListArrayAdapter(this, messages); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Message message = mAdapter.getItem(position); startViewerActivity(message.id); } }); registerForContextMenu(mListView); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mReceiver); } @Override protected void onResume() { super.onResume(); // Messages may have been removed via the notification, hence we simply // always refresh the message list. refreshList(); mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { refreshList(); } }; registerReceiver(mReceiver, new IntentFilter(Settings.ACTION_NEW_MESSAGE)); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); if (!(v instanceof ListView)) throw new AssertionError(); menu.setHeaderTitle(R.string.messageOptions); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.message_context_menu, menu); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); final int adapterPosition = info.position; final long messageID = mAdapter.getItem(adapterPosition).id; int menuItemID = item.getItemId(); if (menuItemID == R.id.view) { startViewerActivity(messageID); return true; } else if (menuItemID == R.id.delete) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(R.string.delete) .setMessage(R.string.messageWillBeDeleted) .setPositiveButton( R.string.delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new Settings(MessageList.this).deleteMessage(messageID); mAdapter.remove(mAdapter.getItem(adapterPosition)); mAdapter.notifyDataSetChanged(); Toast.makeText(getBaseContext(), "Message Deleted Successfully!", Toast.LENGTH_SHORT).show(); } }) .setNegativeButton(android.R.string.cancel, null); builder.show(); return true; } else if(menuItemID == R.id.restore) { try{ ContentValues values = new ContentValues(); Message m = new Settings(MessageList.this).getMessage(messageID); values.put("address", m.address); values.put("body", m.message); values.put("date", m.receivedAt); getContentResolver().insert(Uri.parse("content://sms/inbox"), values); new Settings(MessageList.this).deleteMessage(messageID); mAdapter.remove(mAdapter.getItem(adapterPosition)); mAdapter.notifyDataSetChanged(); Toast.makeText(getBaseContext(), this.getText(R.string.successRestoreMessage), Toast.LENGTH_SHORT).show(); //not sure about getBaseContext() }catch(Exception e) { Toast.makeText(getBaseContext(), this.getText(R.string.somethingWentWrong), Toast.LENGTH_LONG).show(); e.printStackTrace(); } return true; } return false; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MessageViewer.REQUEST_CODE_MUTATED) { if (resultCode == MessageViewer.RESULT_CODE_MUTATED) refreshList(); } } private void startViewerActivity(long messageID) { Intent intent = new Intent(this, MessageViewer.class); intent.putExtra(MessageViewer.MESSAGE_ID_EXTRA, messageID); startActivityForResult(intent, MessageViewer.REQUEST_CODE_MUTATED); } private void refreshList() { Settings settings = new Settings(this); List<Message> messages = settings.getMessages(); mAdapter.clear(); for (Message message : messages) mAdapter.add(message); mAdapter.notifyDataSetChanged(); } public void onConfirmDeleteAll(View v) { if (mAdapter.getCount() == 0) { Toast.makeText(this, R.string.noMessagesToDelete, Toast.LENGTH_SHORT).show(); return; } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(R.string.delete) .setMessage(R.string.allMessagesWillBeDeleted) .setPositiveButton( R.string.delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { deleteAll(); } }) .setNegativeButton(android.R.string.cancel, null); builder.show(); } private void deleteAll() { if (mAdapter.getCount() == 0) { // Condition should've been handled by confirmDeleteAll(). throw new AssertionError(); } Settings settings = new Settings(this); for (int i = 0; i < mAdapter.getCount(); ++i) { Message message = mAdapter.getItem(i); settings.deleteMessage(message.id); } mAdapter.clear(); mAdapter.notifyDataSetChanged(); } }