2008-11-01 17:32:06 -04:00
2009-12-14 21:50:53 -05:00
package com.fsck.k9.mail.store ;
2008-11-01 17:32:06 -04:00
2010-12-23 18:16:54 -05:00
import java.io.* ;
2010-11-13 16:40:56 -05:00
import java.net.URLEncoder ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Date ;
import java.util.HashMap ;
import java.util.HashSet ;
import java.util.LinkedList ;
import java.util.List ;
import java.util.Map ;
import java.util.Set ;
import java.util.UUID ;
import java.util.regex.Matcher ;
import org.apache.commons.io.IOUtils ;
2008-11-01 17:32:06 -04:00
import android.app.Application ;
import android.content.ContentValues ;
2010-11-13 16:40:56 -05:00
import android.content.Context ;
2009-12-09 22:16:42 -05:00
import android.content.SharedPreferences ;
2008-11-01 17:32:06 -04:00
import android.database.Cursor ;
import android.database.sqlite.SQLiteDatabase ;
2010-01-24 15:41:04 -05:00
import android.database.sqlite.SQLiteException ;
2008-11-01 17:32:06 -04:00
import android.net.Uri ;
2010-10-16 04:27:47 -04:00
import android.text.Html ;
2009-12-09 22:16:42 -05:00
import android.util.Log ;
2010-11-13 16:40:56 -05:00
2010-03-03 23:00:30 -05:00
import com.fsck.k9.Account ;
2009-12-14 21:50:53 -05:00
import com.fsck.k9.K9 ;
import com.fsck.k9.Preferences ;
2010-05-19 14:17:06 -04:00
import com.fsck.k9.controller.MessageRemovalListener ;
import com.fsck.k9.controller.MessageRetrievalListener ;
2010-05-19 15:16:36 -04:00
import com.fsck.k9.helper.Regex ;
2010-05-19 14:17:06 -04:00
import com.fsck.k9.helper.Utility ;
2010-11-13 16:40:56 -05:00
import com.fsck.k9.mail.Address ;
import com.fsck.k9.mail.Body ;
import com.fsck.k9.mail.BodyPart ;
import com.fsck.k9.mail.FetchProfile ;
import com.fsck.k9.mail.Flag ;
import com.fsck.k9.mail.Folder ;
import com.fsck.k9.mail.Message ;
2010-12-18 17:56:40 -05:00
import com.fsck.k9.mail.Message.RecipientType ;
2010-11-13 16:40:56 -05:00
import com.fsck.k9.mail.MessagingException ;
import com.fsck.k9.mail.Part ;
import com.fsck.k9.mail.Store ;
2010-05-19 14:17:06 -04:00
import com.fsck.k9.mail.filter.Base64OutputStream ;
2010-11-13 16:40:56 -05:00
import com.fsck.k9.mail.internet.MimeBodyPart ;
import com.fsck.k9.mail.internet.MimeHeader ;
import com.fsck.k9.mail.internet.MimeMessage ;
import com.fsck.k9.mail.internet.MimeMultipart ;
import com.fsck.k9.mail.internet.MimeUtility ;
import com.fsck.k9.mail.internet.TextBody ;
2010-12-18 17:56:40 -05:00
import com.fsck.k9.mail.store.LockableDatabase.DbCallback ;
import com.fsck.k9.mail.store.LockableDatabase.WrappedException ;
2010-11-13 16:40:56 -05:00
import com.fsck.k9.mail.store.StorageManager.StorageProvider ;
2009-12-14 21:50:53 -05:00
import com.fsck.k9.provider.AttachmentProvider ;
2008-11-01 17:32:06 -04:00
/ * *
* < pre >
* Implements a SQLite database backed local store for Messages .
* < / pre >
* /
2010-12-18 17:56:40 -05:00
public class LocalStore extends Store implements Serializable
2009-11-24 19:40:29 -05:00
{
2010-08-02 07:55:31 -04:00
2010-08-07 11:10:07 -04:00
private static final Message [ ] EMPTY_MESSAGE_ARRAY = new Message [ 0 ] ;
2010-08-02 07:55:31 -04:00
/ * *
* Immutable empty { @link String } array
* /
private static final String [ ] EMPTY_STRING_ARRAY = new String [ 0 ] ;
2010-04-05 22:54:48 -04:00
private static final Flag [ ] PERMANENT_FLAGS = { Flag . DELETED , Flag . X_DESTROYED , Flag . SEEN , Flag . FLAGGED } ;
2008-11-01 17:32:06 -04:00
2010-10-23 13:33:08 -04:00
private static final int MAX_SMART_HTMLIFY_MESSAGE_LENGTH = 1024 * 256 ;
2009-06-08 23:11:35 -04:00
private static Set < String > HEADERS_TO_SAVE = new HashSet < String > ( ) ;
static
{
2009-12-14 21:50:53 -05:00
HEADERS_TO_SAVE . add ( K9 . K9MAIL_IDENTITY ) ;
2010-07-02 10:57:55 -04:00
HEADERS_TO_SAVE . add ( " To " ) ;
HEADERS_TO_SAVE . add ( " Cc " ) ;
HEADERS_TO_SAVE . add ( " From " ) ;
2009-11-17 16:13:29 -05:00
HEADERS_TO_SAVE . add ( " In-Reply-To " ) ;
HEADERS_TO_SAVE . add ( " References " ) ;
2010-08-14 22:37:06 -04:00
HEADERS_TO_SAVE . add ( " Content-ID " ) ;
HEADERS_TO_SAVE . add ( " Content-Disposition " ) ;
2009-11-24 19:40:29 -05:00
HEADERS_TO_SAVE . add ( " X-User-Agent " ) ;
2009-06-08 23:11:35 -04:00
}
2009-12-27 11:53:31 -05:00
/ *
* a String containing the columns getMessages expects to work with
* in the correct order .
* /
static private String GET_MESSAGES_COLS =
" subject, sender_list, date, uid, flags, id, to_list, cc_list, "
2010-01-12 22:36:36 -05:00
+ " bcc_list, reply_to_list, attachment_count, internal_date, message_id, folder_id, preview " ;
2009-12-27 11:53:31 -05:00
2010-12-23 18:16:54 -05:00
/ * *
* When generating previews , Spannable objects that can ' t be converted into a String are
* represented as 0xfffc . When displayed , these show up as undisplayed squares . These constants
* define the object character and the replacement character .
* /
private static final char PREVIEW_OBJECT_CHARACTER = ( char ) 0xfffc ;
private static final char PREVIEW_OBJECT_REPLACEMENT = ( char ) 0x20 ; // space
2010-12-18 17:56:40 -05:00
protected static final int DB_VERSION = 39 ;
2010-11-13 16:40:56 -05:00
2010-12-18 17:56:40 -05:00
protected String uUid = null ;
private final Application mApplication ;
private LockableDatabase database ;
2010-11-13 16:40:56 -05:00
2008-11-01 17:32:06 -04:00
/ * *
2010-03-03 23:00:30 -05:00
* local : //localhost/path/to/database/uuid.db
2010-11-13 16:40:56 -05:00
* This constructor is only used by { @link Store # getLocalInstance ( Account , Application ) }
2010-12-28 04:10:50 -05:00
* @param account
* @param application
2010-11-13 16:40:56 -05:00
* @throws UnavailableStorageException if not { @link StorageProvider # isReady ( Context ) }
2008-11-01 17:32:06 -04:00
* /
2010-12-18 17:56:40 -05:00
public LocalStore ( final Account account , final Application application ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-03-03 23:00:30 -05:00
super ( account ) ;
2010-12-18 17:56:40 -05:00
database = new LockableDatabase ( application , account . getUuid ( ) , new StoreSchemaDefinition ( ) ) ;
2008-11-01 17:32:06 -04:00
mApplication = application ;
2010-12-18 17:56:40 -05:00
database . setStorageProviderId ( account . getLocalStorageProviderId ( ) ) ;
2010-11-13 16:40:56 -05:00
uUid = account . getUuid ( ) ;
2010-12-18 17:56:40 -05:00
database . open ( ) ;
2010-11-13 16:40:56 -05:00
}
2009-11-17 11:54:50 -05:00
2010-12-18 17:56:40 -05:00
public void switchLocalStorage ( final String newStorageProviderId ) throws MessagingException
2010-11-13 16:40:56 -05:00
{
2010-12-18 17:56:40 -05:00
database . switchProvider ( newStorageProviderId ) ;
2010-11-13 16:40:56 -05:00
}
2010-01-24 15:41:04 -05:00
2010-12-18 17:56:40 -05:00
private class StoreSchemaDefinition implements LockableDatabase . SchemaDefinition
2010-11-13 16:40:56 -05:00
{
2010-12-18 17:56:40 -05:00
@Override
public int getVersion ( )
2010-11-13 16:40:56 -05:00
{
2010-12-18 17:56:40 -05:00
return DB_VERSION ;
2010-11-13 16:40:56 -05:00
}
2010-12-24 13:55:05 -05:00
2010-12-18 17:56:40 -05:00
@Override
public void doDbUpgrade ( final SQLiteDatabase db )
2010-11-13 16:40:56 -05:00
{
2010-12-24 13:55:05 -05:00
Log . i ( K9 . LOG_TAG , String . format ( " Upgrading database from version %d to version %d " ,
db . getVersion ( ) , DB_VERSION ) ) ;
2009-11-29 23:03:16 -05:00
2010-01-24 15:41:04 -05:00
2010-12-24 13:55:05 -05:00
AttachmentProvider . clear ( mApplication ) ;
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
try
2010-11-13 16:40:56 -05:00
{
2010-12-24 13:55:05 -05:00
// schema version 29 was when we moved to incremental updates
// in the case of a new db or a < v29 db, we blow away and start from scratch
if ( db . getVersion ( ) < 29 )
{
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " DROP TABLE IF EXISTS folders " ) ;
db . execSQL ( " CREATE TABLE folders (id INTEGER PRIMARY KEY, name TEXT, "
+ " last_updated INTEGER, unread_count INTEGER, visible_limit INTEGER, status TEXT, push_state TEXT, last_pushed INTEGER, flagged_count INTEGER default 0) " ) ;
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " CREATE INDEX IF NOT EXISTS folder_name ON folders (name) " ) ;
db . execSQL ( " DROP TABLE IF EXISTS messages " ) ;
db . execSQL ( " CREATE TABLE messages (id INTEGER PRIMARY KEY, deleted INTEGER default 0, folder_id INTEGER, uid TEXT, subject TEXT, "
+ " date INTEGER, flags TEXT, sender_list TEXT, to_list TEXT, cc_list TEXT, bcc_list TEXT, reply_to_list TEXT, "
+ " html_content TEXT, text_content TEXT, attachment_count INTEGER, internal_date INTEGER, message_id TEXT, preview TEXT) " ) ;
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " DROP TABLE IF EXISTS headers " ) ;
db . execSQL ( " CREATE TABLE headers (id INTEGER PRIMARY KEY, message_id INTEGER, name TEXT, value TEXT) " ) ;
db . execSQL ( " CREATE INDEX IF NOT EXISTS header_folder ON headers (message_id) " ) ;
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " CREATE INDEX IF NOT EXISTS msg_uid ON messages (uid, folder_id) " ) ;
db . execSQL ( " DROP INDEX IF EXISTS msg_folder_id " ) ;
db . execSQL ( " DROP INDEX IF EXISTS msg_folder_id_date " ) ;
db . execSQL ( " CREATE INDEX IF NOT EXISTS msg_folder_id_deleted_date ON messages (folder_id,deleted,internal_date) " ) ;
db . execSQL ( " DROP TABLE IF EXISTS attachments " ) ;
db . execSQL ( " CREATE TABLE attachments (id INTEGER PRIMARY KEY, message_id INTEGER, "
+ " store_data TEXT, content_uri TEXT, size INTEGER, name TEXT, "
+ " mime_type TEXT, content_id TEXT, content_disposition TEXT) " ) ;
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " DROP TABLE IF EXISTS pending_commands " ) ;
db . execSQL ( " CREATE TABLE pending_commands " +
" (id INTEGER PRIMARY KEY, command TEXT, arguments TEXT) " ) ;
2010-11-13 16:40:56 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " DROP TRIGGER IF EXISTS delete_folder " ) ;
db . execSQL ( " CREATE TRIGGER delete_folder BEFORE DELETE ON folders BEGIN DELETE FROM messages WHERE old.id = folder_id; END; " ) ;
2010-01-24 15:41:04 -05:00
2010-12-24 13:55:05 -05:00
db . execSQL ( " DROP TRIGGER IF EXISTS delete_message " ) ;
db . execSQL ( " CREATE TRIGGER delete_message BEFORE DELETE ON messages BEGIN DELETE FROM attachments WHERE old.id = message_id; "
+ " DELETE FROM headers where old.id = message_id; END; " ) ;
}
else
2010-01-24 15:41:04 -05:00
{
2010-12-24 13:55:05 -05:00
// in the case that we're starting out at 29 or newer, run all the needed updates
if ( db . getVersion ( ) < 30 )
2010-01-24 15:41:04 -05:00
{
2010-12-24 13:55:05 -05:00
try
2010-01-24 15:41:04 -05:00
{
2010-12-24 13:55:05 -05:00
db . execSQL ( " ALTER TABLE messages ADD deleted INTEGER default 0 " ) ;
}
catch ( SQLiteException e )
{
if ( ! e . toString ( ) . startsWith ( " duplicate column name: deleted " ) )
{
throw e ;
}
2010-01-24 15:41:04 -05:00
}
}
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) < 31 )
{
db . execSQL ( " DROP INDEX IF EXISTS msg_folder_id_date " ) ;
db . execSQL ( " CREATE INDEX IF NOT EXISTS msg_folder_id_deleted_date ON messages (folder_id,deleted,internal_date) " ) ;
}
if ( db . getVersion ( ) < 32 )
2010-01-24 15:41:04 -05:00
{
2010-12-24 13:55:05 -05:00
db . execSQL ( " UPDATE messages SET deleted = 1 WHERE flags LIKE '%DELETED%' " ) ;
2010-01-24 15:41:04 -05:00
}
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) < 33 )
2010-01-24 15:41:04 -05:00
{
2010-12-24 13:55:05 -05:00
try
2010-01-24 15:41:04 -05:00
{
2010-12-24 13:55:05 -05:00
db . execSQL ( " ALTER TABLE messages ADD preview TEXT " ) ;
}
catch ( SQLiteException e )
{
if ( ! e . toString ( ) . startsWith ( " duplicate column name: preview " ) )
{
throw e ;
}
2010-01-24 15:41:04 -05:00
}
2010-04-16 10:33:54 -04:00
}
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) < 34 )
2010-04-16 10:33:54 -04:00
{
2010-12-24 13:55:05 -05:00
try
2010-04-16 10:33:54 -04:00
{
2010-12-24 13:55:05 -05:00
db . execSQL ( " ALTER TABLE folders ADD flagged_count INTEGER default 0 " ) ;
}
catch ( SQLiteException e )
{
if ( ! e . getMessage ( ) . startsWith ( " duplicate column name: flagged_count " ) )
{
throw e ;
}
2010-04-16 10:33:54 -04:00
}
}
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) < 35 )
2010-08-14 22:37:06 -04:00
{
2010-12-24 13:55:05 -05:00
try
{
db . execSQL ( " update messages set flags = replace(flags, 'X_NO_SEEN_INFO', 'X_BAD_FLAG') " ) ;
}
catch ( SQLiteException e )
{
Log . e ( K9 . LOG_TAG , " Unable to get rid of obsolete flag X_NO_SEEN_INFO " , e ) ;
}
2010-08-14 22:37:06 -04:00
}
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) < 36 )
2010-08-14 22:37:06 -04:00
{
2010-12-24 13:55:05 -05:00
try
{
db . execSQL ( " ALTER TABLE attachments ADD content_id TEXT " ) ;
}
catch ( SQLiteException e )
{
Log . e ( K9 . LOG_TAG , " Unable to add content_id column to attachments " ) ;
}
2010-08-14 22:37:06 -04:00
}
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) < 37 )
2010-08-14 22:37:06 -04:00
{
2010-12-24 13:55:05 -05:00
try
{
db . execSQL ( " ALTER TABLE attachments ADD content_disposition TEXT " ) ;
}
catch ( SQLiteException e )
{
Log . e ( K9 . LOG_TAG , " Unable to add content_disposition column to attachments " ) ;
}
2010-08-14 22:37:06 -04:00
}
2010-01-24 15:41:04 -05:00
2009-11-29 23:03:16 -05:00
2010-12-24 13:55:05 -05:00
// Database version 38 is solely to prune cached attachments now that we clear them better
if ( db . getVersion ( ) < 39 )
2010-10-08 02:33:04 -04:00
{
2010-12-24 13:55:05 -05:00
try
{
db . execSQL ( " DELETE FROM headers WHERE id in (SELECT headers.id FROM headers LEFT JOIN messages ON headers.message_id = messages.id WHERE messages.id IS NULL) " ) ;
}
catch ( SQLiteException e )
{
Log . e ( K9 . LOG_TAG , " Unable to remove extra header data from the database " ) ;
}
2010-10-08 02:33:04 -04:00
}
2010-08-29 12:58:04 -04:00
2010-12-24 13:55:05 -05:00
}
}
catch ( SQLiteException e )
{
Log . e ( K9 . LOG_TAG , " Exception while upgrading database. Resetting the DB to v0 " ) ;
db . setVersion ( 0 ) ;
throw new Error ( " Database upgrade failed! Resetting your DB version to 0 to force a full schema recreation. " ) ;
2010-01-24 15:41:04 -05:00
}
2009-11-17 11:54:50 -05:00
2010-01-24 15:41:04 -05:00
2009-11-17 11:54:50 -05:00
2010-12-24 13:55:05 -05:00
db . setVersion ( DB_VERSION ) ;
2009-11-29 23:03:16 -05:00
2010-12-24 13:55:05 -05:00
if ( db . getVersion ( ) ! = DB_VERSION )
{
throw new Error ( " Database upgrade failed! " ) ;
}
2010-01-24 15:41:04 -05:00
2010-12-24 13:55:05 -05:00
// Unless we're blowing away the whole data store, there's no reason to prune attachments
// every time the user upgrades. it'll just cost them money and pain.
// try
//{
// pruneCachedAttachments(true);
//}
//catch (Exception me)
//{
// Log.e(K9.LOG_TAG, "Exception while force pruning attachments during DB update", me);
//}
2009-11-24 19:40:29 -05:00
}
2010-12-18 17:56:40 -05:00
}
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
public long getSize ( ) throws UnavailableStorageException
2009-02-09 22:18:42 -05:00
{
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
final StorageManager storageManager = StorageManager . getInstance ( mApplication ) ;
final File attachmentDirectory = storageManager . getAttachmentDirectory ( uUid ,
2010-12-18 17:56:40 -05:00
database . getStorageProviderId ( ) ) ;
2010-11-13 16:40:56 -05:00
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Long > ( )
2010-02-11 16:16:37 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Long doDbWork ( final SQLiteDatabase db )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
final File [ ] files = attachmentDirectory . listFiles ( ) ;
long attachmentLength = 0 ;
for ( File file : files )
{
if ( file . exists ( ) )
{
attachmentLength + = file . length ( ) ;
}
}
2010-02-17 22:28:31 -05:00
2010-12-18 17:56:40 -05:00
final File dbFile = storageManager . getDatabase ( uUid , database . getStorageProviderId ( ) ) ;
2010-11-13 16:40:56 -05:00
return dbFile . length ( ) + attachmentLength ;
}
} ) ;
2009-02-09 22:18:42 -05:00
}
2009-11-24 19:40:29 -05:00
2009-02-09 22:18:42 -05:00
public void compact ( ) throws MessagingException
{
2010-04-21 22:20:35 -04:00
if ( K9 . DEBUG )
2010-12-01 01:04:28 -05:00
Log . i ( K9 . LOG_TAG , " Before compaction size = " + getSize ( ) ) ;
2009-11-24 19:40:29 -05:00
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . execSQL ( " VACUUM " ) ;
return null ;
}
} ) ;
2010-04-21 22:20:35 -04:00
if ( K9 . DEBUG )
Log . i ( K9 . LOG_TAG , " After compaction size = " + getSize ( ) ) ;
2009-02-09 22:18:42 -05:00
}
2008-11-01 17:32:06 -04:00
2009-11-24 19:40:29 -05:00
2009-02-09 22:18:42 -05:00
public void clear ( ) throws MessagingException
{
2010-04-21 22:20:35 -04:00
if ( K9 . DEBUG )
Log . i ( K9 . LOG_TAG , " Before prune size = " + getSize ( ) ) ;
2009-11-24 19:40:29 -05:00
pruneCachedAttachments ( true ) ;
2010-04-21 22:20:35 -04:00
if ( K9 . DEBUG )
{
Log . i ( K9 . LOG_TAG , " After prune / before compaction size = " + getSize ( ) ) ;
2009-11-24 19:40:29 -05:00
2010-04-21 22:20:35 -04:00
Log . i ( K9 . LOG_TAG , " Before clear folder count = " + getFolderCount ( ) ) ;
Log . i ( K9 . LOG_TAG , " Before clear message count = " + getMessageCount ( ) ) ;
2009-11-24 19:40:29 -05:00
2010-04-21 22:20:35 -04:00
Log . i ( K9 . LOG_TAG , " After prune / before clear size = " + getSize ( ) ) ;
}
2009-11-24 19:40:29 -05:00
// don't delete messages that are Local, since there is no copy on the server.
// Don't delete deleted messages. They are essentially placeholders for UIDs of messages that have
2009-11-29 23:57:29 -05:00
// been deleted locally. They take up insignificant space
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db )
{
db . execSQL ( " DELETE FROM messages WHERE deleted = 0 and uid not like 'Local%' " ) ;
db . execSQL ( " update folders set flagged_count = 0, unread_count = 0 " ) ;
return null ;
}
} ) ;
2009-11-24 19:40:29 -05:00
compact ( ) ;
2010-11-13 16:40:56 -05:00
2010-04-21 22:20:35 -04:00
if ( K9 . DEBUG )
{
Log . i ( K9 . LOG_TAG , " After clear message count = " + getMessageCount ( ) ) ;
2009-11-24 19:40:29 -05:00
2010-04-21 22:20:35 -04:00
Log . i ( K9 . LOG_TAG , " After clear size = " + getSize ( ) ) ;
}
2009-02-09 22:18:42 -05:00
}
2009-11-24 19:40:29 -05:00
public int getMessageCount ( ) throws MessagingException
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Integer > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Integer doDbWork ( final SQLiteDatabase db )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
cursor = db . rawQuery ( " SELECT COUNT(*) FROM messages " , null ) ;
cursor . moveToFirst ( ) ;
2010-12-28 04:10:30 -05:00
return cursor . getInt ( 0 ) ; // message count
2010-11-13 16:40:56 -05:00
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
2009-11-24 19:40:29 -05:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2009-11-24 19:40:29 -05:00
}
public int getFolderCount ( ) throws MessagingException
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Integer > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Integer doDbWork ( final SQLiteDatabase db )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
cursor = db . rawQuery ( " SELECT COUNT(*) FROM folders " , null ) ;
cursor . moveToFirst ( ) ;
2010-12-28 04:10:30 -05:00
return cursor . getInt ( 0 ) ; // folder count
2010-11-13 16:40:56 -05:00
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
2009-02-09 22:18:42 -05:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2009-02-09 22:18:42 -05:00
}
2009-11-24 19:40:29 -05:00
2008-11-01 17:32:06 -04:00
@Override
2010-12-01 01:32:29 -05:00
public LocalFolder getFolder ( String name )
{
2008-11-01 17:32:06 -04:00
return new LocalFolder ( name ) ;
}
// TODO this takes about 260-300ms, seems slow.
@Override
2010-05-30 12:56:50 -04:00
public List < ? extends Folder > getPersonalNamespaces ( boolean forceListAll ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
final List < LocalFolder > folders = new LinkedList < LocalFolder > ( ) ;
2009-11-24 19:40:29 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < List < ? extends Folder > > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public List < ? extends Folder > doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
Cursor cursor = null ;
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
try
{
2010-11-16 22:42:14 -05:00
cursor = db . rawQuery ( " SELECT id, name, unread_count, visible_limit, last_updated, status, push_state, last_pushed, flagged_count FROM folders ORDER BY name ASC " , null ) ;
2010-11-13 16:40:56 -05:00
while ( cursor . moveToNext ( ) )
{
LocalFolder folder = new LocalFolder ( cursor . getString ( 1 ) ) ;
folder . open ( cursor . getInt ( 0 ) , cursor . getString ( 1 ) , cursor . getInt ( 2 ) , cursor . getInt ( 3 ) , cursor . getLong ( 4 ) , cursor . getString ( 5 ) , cursor . getString ( 6 ) , cursor . getLong ( 7 ) , cursor . getInt ( 8 ) ) ;
folders . add ( folder ) ;
}
return folders ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
catch ( WrappedException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
2010-04-21 22:20:35 -04:00
return folders ;
2008-11-01 17:32:06 -04:00
}
@Override
2009-11-24 19:40:29 -05:00
public void checkSettings ( ) throws MessagingException
{
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
public void delete ( ) throws UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . delete ( ) ;
2010-11-13 16:40:56 -05:00
}
public void recreate ( ) throws UnavailableStorageException
{
2010-12-18 17:56:40 -05:00
database . recreate ( ) ;
2008-11-01 17:32:06 -04:00
}
2010-05-15 15:46:16 -04:00
2009-11-24 19:40:29 -05:00
public void pruneCachedAttachments ( ) throws MessagingException
{
pruneCachedAttachments ( false ) ;
2009-02-09 22:18:42 -05:00
}
2009-11-24 19:40:29 -05:00
2010-02-17 22:28:31 -05:00
/ * *
* Deletes all cached attachments for the entire store .
2010-12-28 04:10:50 -05:00
* @param force
* @throws com . fsck . k9 . mail . MessagingException
2010-02-17 22:28:31 -05:00
* /
2010-12-28 04:10:50 -05:00
private void pruneCachedAttachments ( final boolean force ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
if ( force )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
ContentValues cv = new ContentValues ( ) ;
cv . putNull ( " content_uri " ) ;
db . update ( " attachments " , cv , null , null ) ;
}
final StorageManager storageManager = StorageManager . getInstance ( mApplication ) ;
2010-12-18 17:56:40 -05:00
File [ ] files = storageManager . getAttachmentDirectory ( uUid , database . getStorageProviderId ( ) ) . listFiles ( ) ;
2010-11-13 16:40:56 -05:00
for ( File file : files )
{
if ( file . exists ( ) )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
if ( ! force )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
cursor = db . query (
" attachments " ,
new String [ ] { " store_data " } ,
" id = ? " ,
new String [ ] { file . getName ( ) } ,
null ,
null ,
null ) ;
if ( cursor . moveToNext ( ) )
{
if ( cursor . getString ( 0 ) = = null )
{
if ( K9 . DEBUG )
Log . d ( K9 . LOG_TAG , " Attachment " + file . getAbsolutePath ( ) + " has no store data, not deleting " ) ;
/ *
* If the attachment has no store data it is not recoverable , so
* we won ' t delete it .
* /
continue ;
}
}
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
}
if ( ! force )
{
try
{
ContentValues cv = new ContentValues ( ) ;
cv . putNull ( " content_uri " ) ;
db . update ( " attachments " , cv , " id = ? " , new String [ ] { file . getName ( ) } ) ;
}
catch ( Exception e )
2010-02-11 16:16:37 -05:00
{
2010-02-17 22:28:31 -05:00
/ *
2010-11-13 16:40:56 -05:00
* If the row has gone away before we got to mark it not - downloaded that ' s
* okay .
2010-02-17 22:28:31 -05:00
* /
2010-02-11 16:16:37 -05:00
}
2009-11-24 19:40:29 -05:00
}
2010-11-13 16:40:56 -05:00
if ( ! file . delete ( ) )
2010-02-11 16:16:37 -05:00
{
2010-11-13 16:40:56 -05:00
file . deleteOnExit ( ) ;
2010-02-11 16:16:37 -05:00
}
2009-11-24 19:40:29 -05:00
}
2010-02-17 22:28:31 -05:00
}
2010-11-13 16:40:56 -05:00
return null ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
public void resetVisibleLimits ( ) throws UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-05-30 17:20:47 -04:00
resetVisibleLimits ( mAccount . getDisplayCount ( ) ) ;
2008-12-11 00:25:59 -05:00
}
2010-11-13 16:40:56 -05:00
public void resetVisibleLimits ( int visibleLimit ) throws UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
final ContentValues cv = new ContentValues ( ) ;
2008-12-11 00:25:59 -05:00
cv . put ( " visible_limit " , Integer . toString ( visibleLimit ) ) ;
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . update ( " folders " , cv , null , null ) ;
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
public ArrayList < PendingCommand > getPendingCommands ( ) throws UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < ArrayList < PendingCommand > > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public ArrayList < PendingCommand > doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
Cursor cursor = null ;
try
{
cursor = db . query ( " pending_commands " ,
new String [ ] { " id " , " command " , " arguments " } ,
null ,
null ,
null ,
null ,
" id ASC " ) ;
ArrayList < PendingCommand > commands = new ArrayList < PendingCommand > ( ) ;
while ( cursor . moveToNext ( ) )
{
PendingCommand command = new PendingCommand ( ) ;
command . mId = cursor . getLong ( 0 ) ;
command . command = cursor . getString ( 1 ) ;
String arguments = cursor . getString ( 2 ) ;
command . arguments = arguments . split ( " , " ) ;
for ( int i = 0 ; i < command . arguments . length ; i + + )
{
command . arguments [ i ] = Utility . fastUrlDecode ( command . arguments [ i ] ) ;
}
commands . add ( command ) ;
}
return commands ;
}
finally
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
if ( cursor ! = null )
{
cursor . close ( ) ;
}
2008-11-01 17:32:06 -04:00
}
}
2010-11-13 16:40:56 -05:00
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
public void addPendingCommand ( PendingCommand command ) throws UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
try
{
for ( int i = 0 ; i < command . arguments . length ; i + + )
{
2008-11-01 17:32:06 -04:00
command . arguments [ i ] = URLEncoder . encode ( command . arguments [ i ] , " UTF-8 " ) ;
}
2010-11-13 16:40:56 -05:00
final ContentValues cv = new ContentValues ( ) ;
2008-11-01 17:32:06 -04:00
cv . put ( " command " , command . command ) ;
cv . put ( " arguments " , Utility . combine ( command . arguments , ',' ) ) ;
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . insert ( " pending_commands " , " command " , cv ) ;
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2009-11-24 19:40:29 -05:00
catch ( UnsupportedEncodingException usee )
{
2008-11-01 17:32:06 -04:00
throw new Error ( " Aparently UTF-8 has been lost to the annals of history. " ) ;
}
}
2010-11-13 16:40:56 -05:00
public void removePendingCommand ( final PendingCommand command ) throws UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . delete ( " pending_commands " , " id = ? " , new String [ ] { Long . toString ( command . mId ) } ) ;
return null ;
}
} ) ;
}
public void removePendingCommands ( ) throws UnavailableStorageException
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . delete ( " pending_commands " , null , null ) ;
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2009-11-24 19:40:29 -05:00
public static class PendingCommand
{
2008-11-01 17:32:06 -04:00
private long mId ;
public String command ;
public String [ ] arguments ;
@Override
2009-11-24 19:40:29 -05:00
public String toString ( )
{
2008-11-01 17:32:06 -04:00
StringBuffer sb = new StringBuffer ( ) ;
sb . append ( command ) ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
sb . append ( " : " ) ;
2009-11-24 19:40:29 -05:00
for ( String argument : arguments )
{
2009-11-29 11:55:35 -05:00
sb . append ( " , " ) ;
2008-11-01 17:32:06 -04:00
sb . append ( argument ) ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
//sb.append("\n");
2008-11-01 17:32:06 -04:00
}
return sb . toString ( ) ;
}
}
2009-11-24 19:40:29 -05:00
2010-04-16 08:20:10 -04:00
@Override
2009-11-24 19:40:29 -05:00
public boolean isMoveCapable ( )
{
return true ;
2009-03-05 02:32:45 -05:00
}
2009-12-27 11:53:37 -05:00
2010-04-16 08:20:10 -04:00
@Override
2009-11-24 19:40:29 -05:00
public boolean isCopyCapable ( )
{
return true ;
2009-03-05 02:32:45 -05:00
}
2008-11-01 17:32:06 -04:00
2010-05-29 17:56:17 -04:00
public Message [ ] searchForMessages ( MessageRetrievalListener listener , String [ ] queryFields , String queryString ,
2010-04-29 00:59:14 -04:00
List < LocalFolder > folders , Message [ ] messages , final Flag [ ] requiredFlags , final Flag [ ] forbiddenFlags ) throws MessagingException
2009-12-27 11:53:37 -05:00
{
2010-04-05 22:54:48 -04:00
List < String > args = new LinkedList < String > ( ) ;
2010-04-29 00:59:14 -04:00
2010-04-05 22:54:48 -04:00
StringBuilder whereClause = new StringBuilder ( ) ;
if ( queryString ! = null & & queryString . length ( ) > 0 )
{
2010-05-29 17:56:17 -04:00
boolean anyAdded = false ;
2010-04-05 22:54:48 -04:00
String likeString = " % " + queryString + " % " ;
2010-05-29 17:56:17 -04:00
whereClause . append ( " AND ( " ) ;
2010-05-30 00:17:00 -04:00
for ( String queryField : queryFields )
{
2010-08-29 19:39:26 -04:00
if ( anyAdded )
2010-05-29 17:56:17 -04:00
{
whereClause . append ( " OR " ) ;
}
2010-11-30 22:06:50 -05:00
whereClause . append ( queryField ) . append ( " LIKE ? " ) ;
2010-05-29 17:56:17 -04:00
args . add ( likeString ) ;
anyAdded = true ;
}
whereClause . append ( " ) " ) ;
2010-04-05 22:54:48 -04:00
}
if ( folders ! = null & & folders . size ( ) > 0 )
{
whereClause . append ( " AND folder_id in ( " ) ;
boolean anyAdded = false ;
for ( LocalFolder folder : folders )
{
2010-08-29 19:39:26 -04:00
if ( anyAdded )
2010-04-05 22:54:48 -04:00
{
whereClause . append ( " , " ) ;
}
anyAdded = true ;
whereClause . append ( " ? " ) ;
args . add ( Long . toString ( folder . getId ( ) ) ) ;
}
whereClause . append ( " ) " ) ;
}
if ( messages ! = null & & messages . length > 0 )
{
whereClause . append ( " AND ( " ) ;
boolean anyAdded = false ;
for ( Message message : messages )
{
2010-08-29 19:39:26 -04:00
if ( anyAdded )
2010-04-05 22:54:48 -04:00
{
whereClause . append ( " OR " ) ;
}
anyAdded = true ;
whereClause . append ( " ( uid = ? AND folder_id = ? ) " ) ;
args . add ( message . getUid ( ) ) ;
args . add ( Long . toString ( ( ( LocalFolder ) message . getFolder ( ) ) . getId ( ) ) ) ;
}
whereClause . append ( " ) " ) ;
}
if ( forbiddenFlags ! = null & & forbiddenFlags . length > 0 )
{
whereClause . append ( " AND ( " ) ;
boolean anyAdded = false ;
for ( Flag flag : forbiddenFlags )
{
2010-08-29 19:39:26 -04:00
if ( anyAdded )
2010-04-05 22:54:48 -04:00
{
whereClause . append ( " AND " ) ;
}
anyAdded = true ;
whereClause . append ( " flags NOT LIKE ? " ) ;
2010-04-29 00:59:14 -04:00
2010-04-05 22:54:48 -04:00
args . add ( " % " + flag . toString ( ) + " % " ) ;
}
whereClause . append ( " ) " ) ;
}
if ( requiredFlags ! = null & & requiredFlags . length > 0 )
{
whereClause . append ( " AND ( " ) ;
boolean anyAdded = false ;
for ( Flag flag : requiredFlags )
{
2010-08-29 19:39:26 -04:00
if ( anyAdded )
2010-04-05 22:54:48 -04:00
{
whereClause . append ( " OR " ) ;
}
anyAdded = true ;
whereClause . append ( " flags LIKE ? " ) ;
2010-04-29 00:59:14 -04:00
2010-04-05 22:54:48 -04:00
args . add ( " % " + flag . toString ( ) + " % " ) ;
}
whereClause . append ( " ) " ) ;
}
2010-04-29 00:59:14 -04:00
2010-04-21 22:20:35 -04:00
if ( K9 . DEBUG )
{
Log . v ( K9 . LOG_TAG , " whereClause = " + whereClause . toString ( ) ) ;
Log . v ( K9 . LOG_TAG , " args = " + args ) ;
}
2009-12-27 11:53:37 -05:00
return getMessages (
listener ,
null ,
" SELECT "
+ GET_MESSAGES_COLS
2010-04-05 22:54:48 -04:00
+ " FROM messages WHERE deleted = 0 " + whereClause . toString ( ) + " ORDER BY date DESC "
2010-08-02 07:55:31 -04:00
, args . toArray ( EMPTY_STRING_ARRAY )
2009-12-27 11:53:37 -05:00
) ;
}
/ *
* Given a query string , actually do the query for the messages and
* call the MessageRetrievalListener for each one
* /
private Message [ ] getMessages (
2010-11-13 16:40:56 -05:00
final MessageRetrievalListener listener ,
final LocalFolder folder ,
final String queryString , final String [ ] placeHolders
2009-12-27 11:53:37 -05:00
) throws MessagingException
{
2010-11-13 16:40:56 -05:00
final ArrayList < LocalMessage > messages = new ArrayList < LocalMessage > ( ) ;
2010-12-18 17:56:40 -05:00
final int j = database . execute ( false , new DbCallback < Integer > ( )
2009-12-27 11:53:37 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Integer doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-12-27 11:53:37 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
int i = 0 ;
try
{
cursor = db . rawQuery ( queryString + " LIMIT 10 " , placeHolders ) ;
2009-12-27 11:53:37 -05:00
2010-11-13 16:40:56 -05:00
while ( cursor . moveToNext ( ) )
{
LocalMessage message = new LocalMessage ( null , folder ) ;
message . populateFromGetMessageCursor ( cursor ) ;
messages . add ( message ) ;
if ( listener ! = null )
{
listener . messageFinished ( message , i , - 1 ) ;
}
i + + ;
}
cursor . close ( ) ;
cursor = db . rawQuery ( queryString + " LIMIT -1 OFFSET 10 " , placeHolders ) ;
while ( cursor . moveToNext ( ) )
{
LocalMessage message = new LocalMessage ( null , folder ) ;
message . populateFromGetMessageCursor ( cursor ) ;
messages . add ( message ) ;
if ( listener ! = null )
{
listener . messageFinished ( message , i , - 1 ) ;
}
i + + ;
}
}
catch ( Exception e )
{
Log . d ( K9 . LOG_TAG , " Got an exception " + e ) ;
}
finally
2009-12-27 11:53:37 -05:00
{
2010-11-13 16:40:56 -05:00
if ( cursor ! = null )
{
cursor . close ( ) ;
}
2009-12-27 11:53:37 -05:00
}
2010-11-13 16:40:56 -05:00
return i ;
2009-12-27 11:53:37 -05:00
}
2010-11-13 16:40:56 -05:00
} ) ;
if ( listener ! = null )
{
listener . messagesFinished ( j ) ;
}
2010-10-21 16:48:28 -04:00
2010-11-13 16:40:56 -05:00
return messages . toArray ( EMPTY_MESSAGE_ARRAY ) ;
}
public String getAttachmentType ( final String attachmentId ) throws UnavailableStorageException
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < String > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public String doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-12-27 11:53:37 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
cursor = db . query (
" attachments " ,
new String [ ] { " mime_type " , " name " } ,
" id = ? " ,
new String [ ] { attachmentId } ,
null ,
null ,
null ) ;
cursor . moveToFirst ( ) ;
String type = cursor . getString ( 0 ) ;
String name = cursor . getString ( 1 ) ;
cursor . close ( ) ;
2010-10-21 16:48:28 -04:00
2010-11-13 16:40:56 -05:00
if ( MimeUtility . DEFAULT_ATTACHMENT_MIME_TYPE . equals ( type ) )
{
type = MimeUtility . getMimeTypeByExtension ( name ) ;
}
return type ;
}
finally
2010-10-21 16:48:28 -04:00
{
2010-11-13 16:40:56 -05:00
if ( cursor ! = null )
{
cursor . close ( ) ;
}
2010-10-21 16:48:28 -04:00
}
2009-12-27 11:53:37 -05:00
}
2010-11-13 16:40:56 -05:00
} ) ;
}
public AttachmentInfo getAttachmentInfo ( final String attachmentId ) throws UnavailableStorageException
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < AttachmentInfo > ( )
2009-12-27 11:53:37 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public AttachmentInfo doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-12-27 11:53:37 -05:00
{
2010-12-28 04:10:50 -05:00
String name ;
int size ;
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
cursor = db . query (
" attachments " ,
new String [ ] { " name " , " size " } ,
" id = ? " ,
new String [ ] { attachmentId } ,
null ,
null ,
null ) ;
if ( ! cursor . moveToFirst ( ) )
{
return null ;
}
name = cursor . getString ( 0 ) ;
size = cursor . getInt ( 1 ) ;
final AttachmentInfo attachmentInfo = new AttachmentInfo ( ) ;
attachmentInfo . name = name ;
attachmentInfo . size = size ;
return attachmentInfo ;
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
2009-12-27 11:53:37 -05:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2009-12-27 11:53:37 -05:00
}
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
public static class AttachmentInfo
{
public String name ;
public int size ;
}
2009-11-24 19:40:29 -05:00
public class LocalFolder extends Folder implements Serializable
{
2009-12-27 12:22:26 -05:00
private String mName = null ;
2008-11-01 17:32:06 -04:00
private long mFolderId = - 1 ;
private int mUnreadMessageCount = - 1 ;
2010-04-16 10:33:54 -04:00
private int mFlaggedMessageCount = - 1 ;
2008-11-01 17:32:06 -04:00
private int mVisibleLimit = - 1 ;
2009-11-24 19:40:29 -05:00
private FolderClass displayClass = FolderClass . NO_CLASS ;
private FolderClass syncClass = FolderClass . INHERITED ;
private FolderClass pushClass = FolderClass . SECOND_CLASS ;
2010-03-07 12:02:21 -05:00
private boolean inTopGroup = false ;
2009-11-24 19:40:29 -05:00
private String prefId = null ;
private String mPushState = null ;
2010-04-05 22:54:48 -04:00
private boolean mIntegrate = false ;
2011-01-02 04:01:23 -05:00
// mLastUid is used during syncs. It holds the highest UID within the local folder so we
// know whether or not an unread message added to the local folder is actually "new" or not.
private Integer mLastUid = null ;
2009-12-27 11:50:14 -05:00
2009-11-24 19:40:29 -05:00
public LocalFolder ( String name )
{
2010-03-03 23:00:30 -05:00
super ( LocalStore . this . mAccount ) ;
2008-11-01 17:32:06 -04:00
this . mName = name ;
2009-11-24 19:40:29 -05:00
2009-12-14 21:50:53 -05:00
if ( K9 . INBOX . equals ( getName ( ) ) )
2009-01-02 20:47:24 -05:00
{
2009-11-24 19:40:29 -05:00
syncClass = FolderClass . FIRST_CLASS ;
pushClass = FolderClass . FIRST_CLASS ;
2010-03-07 12:02:21 -05:00
inTopGroup = true ;
2009-01-02 20:47:24 -05:00
}
2009-11-24 19:40:29 -05:00
2008-11-01 17:32:06 -04:00
}
2009-12-27 11:53:16 -05:00
public LocalFolder ( long id )
{
2010-03-03 23:00:30 -05:00
super ( LocalStore . this . mAccount ) ;
2009-12-27 11:53:16 -05:00
this . mFolderId = id ;
}
2009-11-24 19:40:29 -05:00
public long getId ( )
{
2008-11-01 17:32:06 -04:00
return mFolderId ;
}
@Override
2010-11-13 16:40:56 -05:00
public void open ( final OpenMode mode ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
if ( isOpen ( ) )
{
return ;
}
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
String baseQuery =
" SELECT id, name,unread_count, visible_limit, last_updated, status, push_state, last_pushed, flagged_count FROM folders " ;
if ( mName ! = null )
{
cursor = db . rawQuery ( baseQuery + " where folders.name = ? " , new String [ ] { mName } ) ;
}
else
{
cursor = db . rawQuery ( baseQuery + " where folders.id = ? " , new String [ ] { Long . toString ( mFolderId ) } ) ;
}
if ( cursor . moveToFirst ( ) )
{
int folderId = cursor . getInt ( 0 ) ;
if ( folderId > 0 )
{
open ( folderId , cursor . getString ( 1 ) , cursor . getInt ( 2 ) , cursor . getInt ( 3 ) , cursor . getLong ( 4 ) , cursor . getString ( 5 ) , cursor . getString ( 6 ) , cursor . getLong ( 7 ) , cursor . getInt ( 8 ) ) ;
}
}
else
{
Log . w ( K9 . LOG_TAG , " Creating folder " + getName ( ) + " with existing id " + getId ( ) ) ;
create ( FolderType . HOLDS_MESSAGES ) ;
open ( mode ) ;
}
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
return null ;
2009-11-24 19:40:29 -05:00
}
2010-11-13 16:40:56 -05:00
} ) ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2010-11-13 16:40:56 -05:00
catch ( WrappedException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
2009-11-24 19:40:29 -05:00
2010-04-16 10:33:54 -04:00
private void open ( int id , String name , int unreadCount , int visibleLimit , long lastChecked , String status , String pushState , long lastPushed , int flaggedCount ) throws MessagingException
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
{
2009-11-24 19:40:29 -05:00
mFolderId = id ;
2009-12-27 11:53:16 -05:00
mName = name ;
2009-11-24 19:40:29 -05:00
mUnreadMessageCount = unreadCount ;
mVisibleLimit = visibleLimit ;
mPushState = pushState ;
2010-04-16 10:33:54 -04:00
mFlaggedMessageCount = flaggedCount ;
2009-11-24 19:40:29 -05:00
super . setStatus ( status ) ;
// Only want to set the local variable stored in the super class. This class
// does a DB update on setLastChecked
super . setLastChecked ( lastChecked ) ;
super . setLastPush ( lastPushed ) ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2008-11-01 17:32:06 -04:00
@Override
2009-11-24 19:40:29 -05:00
public boolean isOpen ( )
{
2009-12-27 12:22:26 -05:00
return ( mFolderId ! = - 1 & & mName ! = null ) ;
2008-11-01 17:32:06 -04:00
}
@Override
2010-12-01 01:32:29 -05:00
public OpenMode getMode ( )
{
2008-11-01 17:32:06 -04:00
return OpenMode . READ_WRITE ;
}
@Override
2009-11-24 19:40:29 -05:00
public String getName ( )
{
2008-11-01 17:32:06 -04:00
return mName ;
}
@Override
2009-11-24 19:40:29 -05:00
public boolean exists ( ) throws MessagingException
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Boolean > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Boolean doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
try
{
cursor = db . rawQuery ( " SELECT id FROM folders "
+ " where folders.name = ? " , new String [ ] { LocalFolder . this
. getName ( )
} ) ;
if ( cursor . moveToFirst ( ) )
{
int folderId = cursor . getInt ( 0 ) ;
return ( folderId > 0 ) ;
}
else
{
return false ;
}
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
2008-11-01 23:56:13 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2008-11-01 23:56:13 -04:00
}
2008-11-01 17:32:06 -04:00
@Override
2009-11-24 19:40:29 -05:00
public boolean create ( FolderType type ) throws MessagingException
{
if ( exists ( ) )
{
2008-11-01 17:32:06 -04:00
throw new MessagingException ( " Folder " + mName + " already exists. " ) ;
}
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . execSQL ( " INSERT INTO folders (name, visible_limit) VALUES (?, ?) " , new Object [ ]
{
mName ,
mAccount . getDisplayCount ( )
} ) ;
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
return true ;
}
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public boolean create ( FolderType type , final int visibleLimit ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
if ( exists ( ) )
{
2008-12-11 00:25:59 -05:00
throw new MessagingException ( " Folder " + mName + " already exists. " ) ;
}
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
db . execSQL ( " INSERT INTO folders (name, visible_limit) VALUES (?, ?) " , new Object [ ]
{
mName ,
visibleLimit
} ) ;
return null ;
}
} ) ;
2008-12-11 00:25:59 -05:00
return true ;
}
2008-11-01 17:32:06 -04:00
@Override
Implementation of complete IMAP two-phase "delete/expunge" behavior.
On each IMAP account, the expunge behavior can be set to expunge
messages in a folder as soon as a move or delete is performed on the
folder ("immediately"), each time the folder is polled, or only when
executed manually.
In the Message List, there is now an Expunge action in the option
menu.
In the Folder List, there is now an Expunge action in the context
menu (long-press on the folder).
For IMAP accounts, it is also possible to disable the copying of deleted messages to the
Trash folder, by setting the Trash folder to -NONE-.
Fixes Issue 536.
Separately, in WebDAV accounts, the user can now choose the
server-side equivalents of the special folders, just like for IMAP.
2009-12-20 18:13:49 -05:00
public void close ( )
2009-11-24 19:40:29 -05:00
{
2008-11-01 17:32:06 -04:00
mFolderId = - 1 ;
}
@Override
2009-11-24 19:40:29 -05:00
public int getMessageCount ( ) throws MessagingException
{
try
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Integer > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Integer doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
Cursor cursor = null ;
try
{
2010-12-28 04:10:30 -05:00
cursor = db . rawQuery ( " SELECT COUNT(*) FROM messages WHERE folder_id = ? " ,
2010-11-13 16:40:56 -05:00
new String [ ]
{
Long . toString ( mFolderId )
} ) ;
cursor . moveToFirst ( ) ;
2010-12-28 04:10:30 -05:00
return cursor . getInt ( 0 ) ; //messagecount
2010-11-13 16:40:56 -05:00
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
catch ( WrappedException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
@Override
2009-11-24 19:40:29 -05:00
public int getUnreadMessageCount ( ) throws MessagingException
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
return mUnreadMessageCount ;
}
2010-04-29 00:59:14 -04:00
2010-04-16 10:33:54 -04:00
@Override
public int getFlaggedMessageCount ( ) throws MessagingException
{
open ( OpenMode . READ_WRITE ) ;
return mFlaggedMessageCount ;
}
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
public void setUnreadMessageCount ( final int unreadMessageCount ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
mUnreadMessageCount = Math . max ( 0 , unreadMessageCount ) ;
db . execSQL ( " UPDATE folders SET unread_count = ? WHERE id = ? " ,
new Object [ ] { mUnreadMessageCount , mFolderId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2009-11-24 19:40:29 -05:00
}
2010-04-29 00:59:14 -04:00
2010-11-13 16:40:56 -05:00
public void setFlaggedMessageCount ( final int flaggedMessageCount ) throws MessagingException
2010-04-16 10:33:54 -04:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Integer > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Integer doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
mFlaggedMessageCount = Math . max ( 0 , flaggedMessageCount ) ;
db . execSQL ( " UPDATE folders SET flagged_count = ? WHERE id = ? " , new Object [ ]
{ mFlaggedMessageCount , mFolderId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2010-04-16 10:33:54 -04:00
}
2009-11-24 19:40:29 -05:00
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void setLastChecked ( final long lastChecked ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
LocalFolder . super . setLastChecked ( lastChecked ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
db . execSQL ( " UPDATE folders SET last_updated = ? WHERE id = ? " , new Object [ ]
{ lastChecked , mFolderId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2009-11-24 19:40:29 -05:00
}
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void setLastPush ( final long lastChecked ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
LocalFolder . super . setLastPush ( lastChecked ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
db . execSQL ( " UPDATE folders SET last_pushed = ? WHERE id = ? " , new Object [ ]
{ lastChecked , mFolderId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2009-10-21 20:41:06 -04:00
}
2008-11-01 17:32:06 -04:00
2009-11-24 19:40:29 -05:00
public int getVisibleLimit ( ) throws MessagingException
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
return mVisibleLimit ;
}
2009-11-26 00:10:12 -05:00
public void purgeToVisibleLimit ( MessageRemovalListener listener ) throws MessagingException
{
2010-11-12 20:47:08 -05:00
if ( mVisibleLimit = = 0 )
2010-11-12 18:41:43 -05:00
{
2010-11-12 20:47:08 -05:00
return ;
2010-11-12 18:41:43 -05:00
}
2009-11-26 00:10:12 -05:00
open ( OpenMode . READ_WRITE ) ;
2009-11-29 23:57:29 -05:00
Message [ ] messages = getMessages ( null , false ) ;
2009-11-29 11:55:35 -05:00
for ( int i = mVisibleLimit ; i < messages . length ; i + + )
2009-11-26 00:10:12 -05:00
{
2009-11-29 11:55:35 -05:00
if ( listener ! = null )
2009-11-26 00:10:12 -05:00
{
2009-11-29 11:55:35 -05:00
listener . messageRemoved ( messages [ i ] ) ;
2009-11-26 00:10:12 -05:00
}
2010-11-12 16:38:02 -05:00
messages [ i ] . destroy ( ) ;
2009-11-29 23:03:16 -05:00
2009-11-26 00:10:12 -05:00
}
}
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
public void setVisibleLimit ( final int visibleLimit ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
mVisibleLimit = visibleLimit ;
db . execSQL ( " UPDATE folders SET visible_limit = ? WHERE id = ? " ,
new Object [ ] { mVisibleLimit , mFolderId } ) ;
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2009-11-24 19:40:29 -05:00
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void setStatus ( final String status ) throws MessagingException
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
LocalFolder . super . setStatus ( status ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
db . execSQL ( " UPDATE folders SET status = ? WHERE id = ? " , new Object [ ]
{ status , mFolderId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2010-11-13 16:40:56 -05:00
public void setPushState ( final String pushState ) throws MessagingException
2009-10-21 20:41:06 -04:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
{
try
{
open ( OpenMode . READ_WRITE ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
mPushState = pushState ;
db . execSQL ( " UPDATE folders SET push_state = ? WHERE id = ? " , new Object [ ]
{ pushState , mFolderId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2009-10-21 20:41:06 -04:00
}
public String getPushState ( )
{
return mPushState ;
}
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
@Override
2009-11-24 19:40:29 -05:00
public FolderClass getDisplayClass ( )
{
return displayClass ;
}
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
@Override
2009-11-24 19:40:29 -05:00
public FolderClass getSyncClass ( )
{
if ( FolderClass . INHERITED = = syncClass )
{
return getDisplayClass ( ) ;
}
else
{
return syncClass ;
}
}
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
public FolderClass getRawSyncClass ( )
2009-11-24 19:40:29 -05:00
{
return syncClass ;
}
2010-04-16 08:20:10 -04:00
@Override
2009-10-21 20:41:06 -04:00
public FolderClass getPushClass ( )
{
if ( FolderClass . INHERITED = = pushClass )
{
return getSyncClass ( ) ;
}
else
{
return pushClass ;
}
}
2009-11-24 19:40:29 -05:00
public FolderClass getRawPushClass ( )
2009-10-21 20:41:06 -04:00
{
return pushClass ;
2008-11-01 17:32:06 -04:00
2009-10-21 20:41:06 -04:00
}
2009-11-24 19:40:29 -05:00
public void setDisplayClass ( FolderClass displayClass )
2009-10-21 20:41:06 -04:00
{
2009-11-24 19:40:29 -05:00
this . displayClass = displayClass ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2009-11-24 19:40:29 -05:00
public void setSyncClass ( FolderClass syncClass )
2009-02-24 00:03:28 -05:00
{
2009-11-24 19:40:29 -05:00
this . syncClass = syncClass ;
2009-02-24 00:03:28 -05:00
}
2009-11-24 19:40:29 -05:00
public void setPushClass ( FolderClass pushClass )
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
{
2009-11-24 19:40:29 -05:00
this . pushClass = pushClass ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2010-04-29 00:59:14 -04:00
2010-04-05 22:54:48 -04:00
public boolean isIntegrate ( )
{
return mIntegrate ;
}
public void setIntegrate ( boolean integrate )
{
mIntegrate = integrate ;
}
2010-04-29 00:59:14 -04:00
2009-11-24 19:40:29 -05:00
private String getPrefId ( ) throws MessagingException
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
{
2009-11-24 19:40:29 -05:00
open ( OpenMode . READ_WRITE ) ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
2009-11-24 19:40:29 -05:00
if ( prefId = = null )
{
prefId = uUid + " . " + mName ;
}
return prefId ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2009-11-24 19:40:29 -05:00
public void delete ( Preferences preferences ) throws MessagingException
2009-10-21 20:41:06 -04:00
{
2009-11-24 19:40:29 -05:00
String id = getPrefId ( ) ;
SharedPreferences . Editor editor = preferences . getPreferences ( ) . edit ( ) ;
editor . remove ( id + " .displayMode " ) ;
editor . remove ( id + " .syncMode " ) ;
2010-03-07 12:02:21 -05:00
editor . remove ( id + " .pushMode " ) ;
editor . remove ( id + " .inTopGroup " ) ;
2010-04-05 22:54:48 -04:00
editor . remove ( id + " .integrate " ) ;
2009-11-24 19:40:29 -05:00
editor . commit ( ) ;
2009-10-21 20:41:06 -04:00
}
2009-11-24 19:40:29 -05:00
public void save ( Preferences preferences ) throws MessagingException
2009-10-21 20:41:06 -04:00
{
2009-11-24 19:40:29 -05:00
String id = getPrefId ( ) ;
SharedPreferences . Editor editor = preferences . getPreferences ( ) . edit ( ) ;
// there can be a lot of folders. For the defaults, let's not save prefs, saving space, except for INBOX
2009-12-14 21:50:53 -05:00
if ( displayClass = = FolderClass . NO_CLASS & & ! K9 . INBOX . equals ( getName ( ) ) )
2009-11-24 19:40:29 -05:00
{
editor . remove ( id + " .displayMode " ) ;
}
else
{
editor . putString ( id + " .displayMode " , displayClass . name ( ) ) ;
}
2009-12-14 21:50:53 -05:00
if ( syncClass = = FolderClass . INHERITED & & ! K9 . INBOX . equals ( getName ( ) ) )
2009-11-24 19:40:29 -05:00
{
editor . remove ( id + " .syncMode " ) ;
}
else
{
editor . putString ( id + " .syncMode " , syncClass . name ( ) ) ;
}
2009-12-14 21:50:53 -05:00
if ( pushClass = = FolderClass . SECOND_CLASS & & ! K9 . INBOX . equals ( getName ( ) ) )
2009-11-24 19:40:29 -05:00
{
editor . remove ( id + " .pushMode " ) ;
}
else
{
editor . putString ( id + " .pushMode " , pushClass . name ( ) ) ;
}
2010-03-07 12:02:21 -05:00
editor . putBoolean ( id + " .inTopGroup " , inTopGroup ) ;
2009-11-24 19:40:29 -05:00
2010-04-05 22:54:48 -04:00
editor . putBoolean ( id + " .integrate " , mIntegrate ) ;
2009-11-24 19:40:29 -05:00
editor . commit ( ) ;
2009-10-21 20:41:06 -04:00
}
2010-04-29 00:59:14 -04:00
2010-04-21 22:20:35 -04:00
public FolderClass getDisplayClass ( Preferences preferences ) throws MessagingException
{
String id = getPrefId ( ) ;
return FolderClass . valueOf ( preferences . getPreferences ( ) . getString ( id + " .displayMode " ,
2010-04-29 00:59:14 -04:00
FolderClass . NO_CLASS . name ( ) ) ) ;
2010-04-21 22:20:35 -04:00
}
2010-04-29 00:59:14 -04:00
2010-04-16 08:20:10 -04:00
@Override
2009-11-24 19:40:29 -05:00
public void refresh ( Preferences preferences ) throws MessagingException
2009-10-21 20:41:06 -04:00
{
2009-11-24 19:40:29 -05:00
String id = getPrefId ( ) ;
try
{
displayClass = FolderClass . valueOf ( preferences . getPreferences ( ) . getString ( id + " .displayMode " ,
FolderClass . NO_CLASS . name ( ) ) ) ;
}
catch ( Exception e )
{
2009-12-14 21:50:53 -05:00
Log . e ( K9 . LOG_TAG , " Unable to load displayMode for " + getName ( ) , e ) ;
2009-11-24 19:40:29 -05:00
displayClass = FolderClass . NO_CLASS ;
}
if ( displayClass = = FolderClass . NONE )
{
displayClass = FolderClass . NO_CLASS ;
}
FolderClass defSyncClass = FolderClass . INHERITED ;
2009-12-14 21:50:53 -05:00
if ( K9 . INBOX . equals ( getName ( ) ) )
2009-11-24 19:40:29 -05:00
{
defSyncClass = FolderClass . FIRST_CLASS ;
}
try
{
syncClass = FolderClass . valueOf ( preferences . getPreferences ( ) . getString ( id + " .syncMode " ,
defSyncClass . name ( ) ) ) ;
}
catch ( Exception e )
{
2009-12-14 21:50:53 -05:00
Log . e ( K9 . LOG_TAG , " Unable to load syncMode for " + getName ( ) , e ) ;
2009-11-24 19:40:29 -05:00
syncClass = defSyncClass ;
}
if ( syncClass = = FolderClass . NONE )
{
syncClass = FolderClass . INHERITED ;
}
FolderClass defPushClass = FolderClass . SECOND_CLASS ;
2010-03-07 12:02:21 -05:00
boolean defInTopGroup = false ;
2010-04-05 22:54:48 -04:00
boolean defIntegrate = false ;
2009-12-14 21:50:53 -05:00
if ( K9 . INBOX . equals ( getName ( ) ) )
2009-11-24 19:40:29 -05:00
{
defPushClass = FolderClass . FIRST_CLASS ;
2010-03-07 12:02:21 -05:00
defInTopGroup = true ;
2010-04-05 22:54:48 -04:00
defIntegrate = true ;
2009-11-24 19:40:29 -05:00
}
try
{
pushClass = FolderClass . valueOf ( preferences . getPreferences ( ) . getString ( id + " .pushMode " ,
defPushClass . name ( ) ) ) ;
}
catch ( Exception e )
{
2009-12-14 21:50:53 -05:00
Log . e ( K9 . LOG_TAG , " Unable to load pushMode for " + getName ( ) , e ) ;
2009-11-24 19:40:29 -05:00
pushClass = defPushClass ;
}
if ( pushClass = = FolderClass . NONE )
{
pushClass = FolderClass . INHERITED ;
}
2010-03-07 12:02:21 -05:00
inTopGroup = preferences . getPreferences ( ) . getBoolean ( id + " .inTopGroup " , defInTopGroup ) ;
2010-04-05 22:54:48 -04:00
mIntegrate = preferences . getPreferences ( ) . getBoolean ( id + " .integrate " , defIntegrate ) ;
2009-11-24 19:40:29 -05:00
2009-10-21 20:41:06 -04:00
}
2008-11-01 17:32:06 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void fetch ( final Message [ ] messages , final FetchProfile fp , final MessageRetrievalListener listener )
2009-11-24 19:40:29 -05:00
throws MessagingException
{
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
open ( OpenMode . READ_WRITE ) ;
if ( fp . contains ( FetchProfile . Item . BODY ) )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
for ( Message message : messages )
{
LocalMessage localMessage = ( LocalMessage ) message ;
Cursor cursor = null ;
MimeMultipart mp = new MimeMultipart ( ) ;
mp . setSubType ( " mixed " ) ;
try
{
cursor = db . rawQuery ( " SELECT html_content, text_content FROM messages "
+ " WHERE id = ? " ,
new String [ ] { Long . toString ( localMessage . mId ) } ) ;
cursor . moveToNext ( ) ;
String htmlContent = cursor . getString ( 0 ) ;
String textContent = cursor . getString ( 1 ) ;
if ( textContent ! = null )
{
LocalTextBody body = new LocalTextBody ( textContent , htmlContent ) ;
MimeBodyPart bp = new MimeBodyPart ( body , " text/plain " ) ;
mp . addBodyPart ( bp ) ;
}
else
{
TextBody body = new TextBody ( htmlContent ) ;
MimeBodyPart bp = new MimeBodyPart ( body , " text/html " ) ;
mp . addBodyPart ( bp ) ;
}
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
try
{
cursor = db . query (
" attachments " ,
new String [ ]
{
" id " ,
" size " ,
" name " ,
" mime_type " ,
" store_data " ,
" content_uri " ,
" content_id " ,
" content_disposition "
} ,
" message_id = ? " ,
new String [ ] { Long . toString ( localMessage . mId ) } ,
null ,
null ,
null ) ;
while ( cursor . moveToNext ( ) )
{
long id = cursor . getLong ( 0 ) ;
int size = cursor . getInt ( 1 ) ;
String name = cursor . getString ( 2 ) ;
String type = cursor . getString ( 3 ) ;
String storeData = cursor . getString ( 4 ) ;
String contentUri = cursor . getString ( 5 ) ;
String contentId = cursor . getString ( 6 ) ;
String contentDisposition = cursor . getString ( 7 ) ;
Body body = null ;
if ( contentDisposition = = null )
{
contentDisposition = " attachment " ;
}
if ( contentUri ! = null )
{
body = new LocalAttachmentBody ( Uri . parse ( contentUri ) , mApplication ) ;
}
MimeBodyPart bp = new LocalAttachmentBodyPart ( body , id ) ;
bp . setHeader ( MimeHeader . HEADER_CONTENT_TYPE ,
String . format ( " %s; \ n name= \" %s \" " ,
type ,
name ) ) ;
bp . setHeader ( MimeHeader . HEADER_CONTENT_TRANSFER_ENCODING , " base64 " ) ;
bp . setHeader ( MimeHeader . HEADER_CONTENT_DISPOSITION ,
String . format ( " %s; \ n filename= \" %s \" ; \ n size=%d " ,
contentDisposition ,
name ,
size ) ) ;
bp . setHeader ( MimeHeader . HEADER_CONTENT_ID , contentId ) ;
/ *
* HEADER_ANDROID_ATTACHMENT_STORE_DATA is a custom header we add to that
* we can later pull the attachment from the remote store if neccesary .
* /
bp . setHeader ( MimeHeader . HEADER_ANDROID_ATTACHMENT_STORE_DATA , storeData ) ;
mp . addBodyPart ( bp ) ;
}
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
if ( mp . getCount ( ) = = 1 )
{
BodyPart part = mp . getBodyPart ( 0 ) ;
localMessage . setHeader ( MimeHeader . HEADER_CONTENT_TYPE , part . getContentType ( ) ) ;
localMessage . setBody ( part . getBody ( ) ) ;
}
else
{
localMessage . setHeader ( MimeHeader . HEADER_CONTENT_TYPE , " multipart/mixed " ) ;
localMessage . setBody ( mp ) ;
}
}
2008-11-01 17:32:06 -04:00
}
}
2010-11-13 16:40:56 -05:00
catch ( MessagingException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw new WrappedException ( e ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
return null ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
@Override
2010-05-30 17:20:47 -04:00
public Message [ ] getMessages ( int start , int end , Date earliestDate , MessageRetrievalListener listener )
2009-11-24 19:40:29 -05:00
throws MessagingException
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
throw new MessagingException (
2009-11-24 19:40:29 -05:00
" LocalStore.getMessages(int, int, MessageRetrievalListener) not yet implemented " ) ;
2008-11-01 17:32:06 -04:00
}
2010-05-21 11:34:29 -04:00
/ * *
* Populate the header fields of the given list of messages by reading
* the saved header data from the database .
2010-05-30 00:17:00 -04:00
*
2010-05-21 11:34:29 -04:00
* @param messages
* The messages whose headers should be loaded .
2010-11-13 16:40:56 -05:00
* @throws UnavailableStorageException
2010-05-21 11:34:29 -04:00
* /
2010-11-13 16:40:56 -05:00
private void populateHeaders ( final List < LocalMessage > messages ) throws UnavailableStorageException
2009-06-08 23:11:35 -04:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
2009-06-08 23:11:35 -04:00
{
2010-11-13 16:40:56 -05:00
Cursor cursor = null ;
if ( messages . size ( ) = = 0 )
2009-06-08 23:11:35 -04:00
{
2010-11-13 16:40:56 -05:00
return null ;
2009-06-08 23:11:35 -04:00
}
2010-11-13 16:40:56 -05:00
try
{
Map < Long , LocalMessage > popMessages = new HashMap < Long , LocalMessage > ( ) ;
List < String > ids = new ArrayList < String > ( ) ;
StringBuffer questions = new StringBuffer ( ) ;
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
for ( int i = 0 ; i < messages . size ( ) ; i + + )
{
if ( i ! = 0 )
{
questions . append ( " , " ) ;
}
questions . append ( " ? " ) ;
LocalMessage message = messages . get ( i ) ;
Long id = message . getId ( ) ;
ids . add ( Long . toString ( id ) ) ;
popMessages . put ( id , message ) ;
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
}
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
cursor = db . rawQuery (
" SELECT message_id, name, value FROM headers " + " WHERE message_id in ( " + questions + " ) " ,
ids . toArray ( EMPTY_STRING_ARRAY ) ) ;
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
while ( cursor . moveToNext ( ) )
{
Long id = cursor . getLong ( 0 ) ;
String name = cursor . getString ( 1 ) ;
String value = cursor . getString ( 2 ) ;
//Log.i(K9.LOG_TAG, "Retrieved header name= " + name + ", value = " + value + " for message " + id);
popMessages . get ( id ) . addHeader ( name , value ) ;
}
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
return null ;
2009-06-08 23:11:35 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2009-06-08 23:11:35 -04:00
}
2008-11-01 17:32:06 -04:00
@Override
2010-11-13 16:40:56 -05:00
public Message getMessage ( final String uid ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
try
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Message > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Message doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
try
{
open ( OpenMode . READ_WRITE ) ;
LocalMessage message = new LocalMessage ( uid , LocalFolder . this ) ;
Cursor cursor = null ;
try
{
cursor = db . rawQuery (
" SELECT "
+ GET_MESSAGES_COLS
+ " FROM messages WHERE uid = ? AND folder_id = ? " ,
new String [ ]
{
message . getUid ( ) , Long . toString ( mFolderId )
} ) ;
if ( ! cursor . moveToNext ( ) )
{
return null ;
}
message . populateFromGetMessageCursor ( cursor ) ;
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
return message ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
catch ( WrappedException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
@Override
2009-11-24 19:40:29 -05:00
public Message [ ] getMessages ( MessageRetrievalListener listener ) throws MessagingException
{
return getMessages ( listener , true ) ;
}
2009-11-17 11:54:50 -05:00
@Override
2010-11-13 16:40:56 -05:00
public Message [ ] getMessages ( final MessageRetrievalListener listener , final boolean includeDeleted ) throws MessagingException
2009-12-27 11:50:21 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
return database . execute ( false , new DbCallback < Message [ ] > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Message [ ] doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
try
{
open ( OpenMode . READ_WRITE ) ;
return LocalStore . this . getMessages (
listener ,
LocalFolder . this ,
" SELECT " + GET_MESSAGES_COLS
+ " FROM messages WHERE "
+ ( includeDeleted ? " " : " deleted = 0 AND " )
+ " folder_id = ? ORDER BY date DESC "
, new String [ ]
{
Long . toString ( mFolderId )
}
) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2009-12-27 11:50:21 -05:00
}
2008-11-01 17:32:06 -04:00
@Override
public Message [ ] getMessages ( String [ ] uids , MessageRetrievalListener listener )
2009-11-24 19:40:29 -05:00
throws MessagingException
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
2009-11-24 19:40:29 -05:00
if ( uids = = null )
{
2008-11-01 17:32:06 -04:00
return getMessages ( listener ) ;
}
ArrayList < Message > messages = new ArrayList < Message > ( ) ;
2009-11-24 19:40:29 -05:00
for ( String uid : uids )
{
2010-03-03 23:00:30 -05:00
Message message = getMessage ( uid ) ;
if ( message ! = null )
{
messages . add ( message ) ;
}
2008-11-01 17:32:06 -04:00
}
2010-08-07 11:10:07 -04:00
return messages . toArray ( EMPTY_MESSAGE_ARRAY ) ;
2008-11-01 17:32:06 -04:00
}
@Override
2009-11-24 19:40:29 -05:00
public void copyMessages ( Message [ ] msgs , Folder folder ) throws MessagingException
{
if ( ! ( folder instanceof LocalFolder ) )
{
2008-11-01 17:32:06 -04:00
throw new MessagingException ( " copyMessages called with incorrect Folder " ) ;
}
( ( LocalFolder ) folder ) . appendMessages ( msgs , true ) ;
}
2009-11-24 19:40:29 -05:00
2009-03-05 02:32:45 -05:00
@Override
2010-11-13 16:40:56 -05:00
public void moveMessages ( final Message [ ] msgs , final Folder destFolder ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
if ( ! ( destFolder instanceof LocalFolder ) )
{
2010-01-09 14:49:54 -05:00
throw new MessagingException ( " moveMessages called with non-LocalFolder " ) ;
2009-03-05 02:32:45 -05:00
}
2009-03-07 02:20:15 -05:00
2010-11-13 16:40:56 -05:00
final LocalFolder lDestFolder = ( LocalFolder ) destFolder ;
2010-04-29 00:59:14 -04:00
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-04-16 10:33:54 -04:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
try
{
lDestFolder . open ( OpenMode . READ_WRITE ) ;
for ( Message message : msgs )
{
LocalMessage lMessage = ( LocalMessage ) message ;
2010-01-13 20:07:28 -05:00
2010-11-13 16:40:56 -05:00
if ( ! message . isSet ( Flag . SEEN ) )
{
setUnreadMessageCount ( getUnreadMessageCount ( ) - 1 ) ;
lDestFolder . setUnreadMessageCount ( lDestFolder . getUnreadMessageCount ( ) + 1 ) ;
}
2010-01-13 20:07:28 -05:00
2010-11-13 16:40:56 -05:00
if ( message . isSet ( Flag . FLAGGED ) )
{
setFlaggedMessageCount ( getFlaggedMessageCount ( ) - 1 ) ;
lDestFolder . setFlaggedMessageCount ( lDestFolder . getFlaggedMessageCount ( ) + 1 ) ;
}
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
String oldUID = message . getUid ( ) ;
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
if ( K9 . DEBUG )
Log . d ( K9 . LOG_TAG , " Updating folder_id to " + lDestFolder . getId ( ) + " for message with UID "
+ message . getUid ( ) + " , id " + lMessage . getId ( ) + " currently in folder " + getName ( ) ) ;
message . setUid ( K9 . LOCAL_UID_PREFIX + UUID . randomUUID ( ) . toString ( ) ) ;
db . execSQL ( " UPDATE messages " + " SET folder_id = ?, uid = ? " + " WHERE id = ? " , new Object [ ]
{
lDestFolder . getId ( ) ,
message . getUid ( ) ,
lMessage . getId ( )
} ) ;
LocalMessage placeHolder = new LocalMessage ( oldUID , LocalFolder . this ) ;
placeHolder . setFlagInternal ( Flag . DELETED , true ) ;
placeHolder . setFlagInternal ( Flag . SEEN , true ) ;
appendMessages ( new Message [ ] { placeHolder } ) ;
}
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
2009-11-24 19:40:29 -05:00
}
2009-03-05 02:32:45 -05:00
}
2008-11-01 17:32:06 -04:00
2010-12-18 05:12:52 -05:00
/ * *
* Convenience transaction wrapper for storing a message and set it as fully downloaded . Implemented mainly to speed up DB transaction commit .
2010-12-24 13:55:05 -05:00
*
2010-12-18 05:12:52 -05:00
* @param message Message to store . Never < code > null < / code > .
* @param runnable What to do before setting { @link Flag # X_DOWNLOADED_FULL } . Never < code > null < / code > .
* @return The local version of the message . Never < code > null < / code > .
* @throws MessagingException
* /
public Message storeSmallMessage ( final Message message , final Runnable runnable ) throws MessagingException
{
2010-12-18 17:56:40 -05:00
return database . execute ( true , new DbCallback < Message > ( )
2010-12-18 05:12:52 -05:00
{
@Override
public Message doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
try
{
appendMessages ( new Message [ ] { message } ) ;
final String uid = message . getUid ( ) ;
final Message result = getMessage ( uid ) ;
runnable . run ( ) ;
// Set a flag indicating this message has now be fully downloaded
result . setFlag ( Flag . X_DOWNLOADED_FULL , true ) ;
return result ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
}
} ) ;
}
2008-11-01 17:32:06 -04:00
/ * *
* The method differs slightly from the contract ; If an incoming message already has a uid
* assigned and it matches the uid of an existing message then this message will replace the
* old message . It is implemented as a delete / insert . This functionality is used in saving
* of drafts and re - synchronization of updated server messages .
2010-05-21 11:34:29 -04:00
*
* NOTE that although this method is located in the LocalStore class , it is not guaranteed
* that the messages supplied as parameters are actually { @link LocalMessage } instances ( in
* fact , in most cases , they are not ) . Therefore , if you want to make local changes only to a
* message , retrieve the appropriate local message instance first ( if it already exists ) .
2008-11-01 17:32:06 -04:00
* /
@Override
2009-11-24 19:40:29 -05:00
public void appendMessages ( Message [ ] messages ) throws MessagingException
{
2008-11-01 17:32:06 -04:00
appendMessages ( messages , false ) ;
}
/ * *
* The method differs slightly from the contract ; If an incoming message already has a uid
* assigned and it matches the uid of an existing message then this message will replace the
* old message . It is implemented as a delete / insert . This functionality is used in saving
* of drafts and re - synchronization of updated server messages .
2010-05-21 11:34:29 -04:00
*
* NOTE that although this method is located in the LocalStore class , it is not guaranteed
* that the messages supplied as parameters are actually { @link LocalMessage } instances ( in
* fact , in most cases , they are not ) . Therefore , if you want to make local changes only to a
* message , retrieve the appropriate local message instance first ( if it already exists ) .
2010-12-28 04:10:50 -05:00
* @param messages
* @param copy
2008-11-01 17:32:06 -04:00
* /
2010-11-13 16:40:56 -05:00
private void appendMessages ( final Message [ ] messages , final boolean copy ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( true , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
for ( Message message : messages )
{
if ( ! ( message instanceof MimeMessage ) )
{
throw new Error ( " LocalStore can only store Messages that extend MimeMessage " ) ;
}
String uid = message . getUid ( ) ;
if ( uid = = null | | copy )
{
uid = K9 . LOCAL_UID_PREFIX + UUID . randomUUID ( ) . toString ( ) ;
if ( ! copy )
{
message . setUid ( uid ) ;
}
}
else
{
Message oldMessage = getMessage ( uid ) ;
if ( oldMessage ! = null & & ! oldMessage . isSet ( Flag . SEEN ) )
{
setUnreadMessageCount ( getUnreadMessageCount ( ) - 1 ) ;
}
if ( oldMessage ! = null & & oldMessage . isSet ( Flag . FLAGGED ) )
{
setFlaggedMessageCount ( getFlaggedMessageCount ( ) - 1 ) ;
}
/ *
* The message may already exist in this Folder , so delete it first .
* /
deleteAttachments ( message . getUid ( ) ) ;
db . execSQL ( " DELETE FROM messages WHERE folder_id = ? AND uid = ? " ,
new Object [ ]
{ mFolderId , message . getUid ( ) } ) ;
}
ArrayList < Part > viewables = new ArrayList < Part > ( ) ;
ArrayList < Part > attachments = new ArrayList < Part > ( ) ;
MimeUtility . collectParts ( message , viewables , attachments ) ;
StringBuffer sbHtml = new StringBuffer ( ) ;
StringBuffer sbText = new StringBuffer ( ) ;
for ( Part viewable : viewables )
{
try
{
String text = MimeUtility . getTextFromPart ( viewable ) ;
/ *
* Anything with MIME type text / html will be stored as such . Anything
* else will be stored as text / plain .
* /
if ( viewable . getMimeType ( ) . equalsIgnoreCase ( " text/html " ) )
{
sbHtml . append ( text ) ;
}
else
{
sbText . append ( text ) ;
}
}
catch ( Exception e )
{
throw new MessagingException ( " Unable to get text for message part " , e ) ;
}
}
String text = sbText . toString ( ) ;
String html = markupContent ( text , sbHtml . toString ( ) ) ;
String preview = calculateContentPreview ( text ) ;
2010-12-12 19:33:00 -05:00
// If we couldn't generate a reasonable preview from the text part, try doing it with the HTML part.
if ( preview = = null | | preview . length ( ) = = 0 )
{
2010-12-23 18:16:54 -05:00
preview = calculateContentPreview ( Html . fromHtml ( html ) . toString ( ) . replace ( PREVIEW_OBJECT_CHARACTER , PREVIEW_OBJECT_REPLACEMENT ) ) ;
2010-12-12 19:33:00 -05:00
}
2010-11-13 16:40:56 -05:00
try
{
ContentValues cv = new ContentValues ( ) ;
cv . put ( " uid " , uid ) ;
cv . put ( " subject " , message . getSubject ( ) ) ;
cv . put ( " sender_list " , Address . pack ( message . getFrom ( ) ) ) ;
cv . put ( " date " , message . getSentDate ( ) = = null
? System . currentTimeMillis ( ) : message . getSentDate ( ) . getTime ( ) ) ;
cv . put ( " flags " , Utility . combine ( message . getFlags ( ) , ',' ) . toUpperCase ( ) ) ;
cv . put ( " deleted " , message . isSet ( Flag . DELETED ) ? 1 : 0 ) ;
cv . put ( " folder_id " , mFolderId ) ;
cv . put ( " to_list " , Address . pack ( message . getRecipients ( RecipientType . TO ) ) ) ;
cv . put ( " cc_list " , Address . pack ( message . getRecipients ( RecipientType . CC ) ) ) ;
cv . put ( " bcc_list " , Address . pack ( message . getRecipients ( RecipientType . BCC ) ) ) ;
cv . put ( " html_content " , html . length ( ) > 0 ? html : null ) ;
cv . put ( " text_content " , text . length ( ) > 0 ? text : null ) ;
cv . put ( " preview " , preview . length ( ) > 0 ? preview : null ) ;
cv . put ( " reply_to_list " , Address . pack ( message . getReplyTo ( ) ) ) ;
cv . put ( " attachment_count " , attachments . size ( ) ) ;
cv . put ( " internal_date " , message . getInternalDate ( ) = = null
? System . currentTimeMillis ( ) : message . getInternalDate ( ) . getTime ( ) ) ;
String messageId = message . getMessageId ( ) ;
if ( messageId ! = null )
{
cv . put ( " message_id " , messageId ) ;
}
long messageUid ;
messageUid = db . insert ( " messages " , " uid " , cv ) ;
for ( Part attachment : attachments )
{
saveAttachment ( messageUid , attachment , copy ) ;
}
saveHeaders ( messageUid , ( MimeMessage ) message ) ;
if ( ! message . isSet ( Flag . SEEN ) )
{
setUnreadMessageCount ( getUnreadMessageCount ( ) + 1 ) ;
}
if ( message . isSet ( Flag . FLAGGED ) )
{
setFlaggedMessageCount ( getFlaggedMessageCount ( ) + 1 ) ;
}
}
catch ( Exception e )
{
throw new MessagingException ( " Error appending message " , e ) ;
}
}
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
return null ;
2010-04-16 10:33:54 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
/ * *
* Update the given message in the LocalStore without first deleting the existing
* message ( contrast with appendMessages ) . This method is used to store changes
* to the given message while updating attachments and not removing existing
* attachment data .
* TODO In the future this method should be combined with appendMessages since the Message
* contains enough data to decide what to do .
* @param message
* @throws MessagingException
* /
2010-11-13 16:40:56 -05:00
public void updateMessage ( final LocalMessage message ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
ArrayList < Part > viewables = new ArrayList < Part > ( ) ;
ArrayList < Part > attachments = new ArrayList < Part > ( ) ;
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
message . buildMimeRepresentation ( ) ;
2009-05-03 16:52:32 -04:00
2010-11-13 16:40:56 -05:00
MimeUtility . collectParts ( message , viewables , attachments ) ;
StringBuffer sbHtml = new StringBuffer ( ) ;
StringBuffer sbText = new StringBuffer ( ) ;
for ( int i = 0 , count = viewables . size ( ) ; i < count ; i + + )
2009-12-06 19:56:06 -05:00
{
2010-11-13 16:40:56 -05:00
Part viewable = viewables . get ( i ) ;
try
{
String text = MimeUtility . getTextFromPart ( viewable ) ;
/ *
* Anything with MIME type text / html will be stored as such . Anything
* else will be stored as text / plain .
* /
if ( viewable . getMimeType ( ) . equalsIgnoreCase ( " text/html " ) )
{
sbHtml . append ( text ) ;
}
else
{
sbText . append ( text ) ;
}
}
catch ( Exception e )
{
throw new MessagingException ( " Unable to get text for message part " , e ) ;
}
}
String text = sbText . toString ( ) ;
String html = markupContent ( text , sbHtml . toString ( ) ) ;
String preview = calculateContentPreview ( text ) ;
2010-12-12 19:33:00 -05:00
// If we couldn't generate a reasonable preview from the text part, try doing it with the HTML part.
2010-11-13 16:40:56 -05:00
if ( preview = = null | | preview . length ( ) = = 0 )
{
2010-12-23 18:16:54 -05:00
preview = calculateContentPreview ( Html . fromHtml ( html ) . toString ( ) . replace ( PREVIEW_OBJECT_CHARACTER , PREVIEW_OBJECT_REPLACEMENT ) ) ;
2010-11-13 16:40:56 -05:00
}
try
{
db . execSQL ( " UPDATE messages SET "
+ " uid = ?, subject = ?, sender_list = ?, date = ?, flags = ?, "
+ " folder_id = ?, to_list = ?, cc_list = ?, bcc_list = ?, "
+ " html_content = ?, text_content = ?, preview = ?, reply_to_list = ?, "
+ " attachment_count = ? WHERE id = ? " ,
new Object [ ]
{
message . getUid ( ) ,
message . getSubject ( ) ,
Address . pack ( message . getFrom ( ) ) ,
message . getSentDate ( ) = = null ? System
. currentTimeMillis ( ) : message . getSentDate ( )
. getTime ( ) ,
Utility . combine ( message . getFlags ( ) , ',' ) . toUpperCase ( ) ,
mFolderId ,
Address . pack ( message
. getRecipients ( RecipientType . TO ) ) ,
Address . pack ( message
. getRecipients ( RecipientType . CC ) ) ,
Address . pack ( message
. getRecipients ( RecipientType . BCC ) ) ,
html . length ( ) > 0 ? html : null ,
text . length ( ) > 0 ? text : null ,
preview . length ( ) > 0 ? preview : null ,
Address . pack ( message . getReplyTo ( ) ) ,
attachments . size ( ) ,
message . mId
} ) ;
for ( int i = 0 , count = attachments . size ( ) ; i < count ; i + + )
{
Part attachment = attachments . get ( i ) ;
saveAttachment ( message . mId , attachment , false ) ;
}
saveHeaders ( message . getId ( ) , message ) ;
}
catch ( Exception e )
{
throw new MessagingException ( " Error appending message " , e ) ;
}
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
return null ;
}
} ) ;
2009-11-24 19:40:29 -05:00
}
2010-11-13 16:40:56 -05:00
catch ( WrappedException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
2010-05-21 11:34:29 -04:00
/ * *
* Save the headers of the given message . Note that the message is not
* necessarily a { @link LocalMessage } instance .
2010-12-28 04:10:50 -05:00
* @param id
* @param message
* @throws com . fsck . k9 . mail . MessagingException
2010-05-21 11:34:29 -04:00
* /
2010-11-13 16:40:56 -05:00
private void saveHeaders ( final long id , final MimeMessage message ) throws MessagingException
2009-06-08 23:11:35 -04:00
{
2010-12-18 17:56:40 -05:00
database . execute ( true , new DbCallback < Void > ( )
2009-06-08 23:11:35 -04:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
2009-06-08 23:11:35 -04:00
{
2010-11-13 16:40:56 -05:00
boolean saveAllHeaders = mAccount . saveAllHeaders ( ) ;
boolean gotAdditionalHeaders = false ;
deleteHeaders ( id ) ;
for ( String name : message . getHeaderNames ( ) )
2009-06-08 23:11:35 -04:00
{
2010-11-13 16:40:56 -05:00
if ( saveAllHeaders | | HEADERS_TO_SAVE . contains ( name ) )
{
String [ ] values = message . getHeader ( name ) ;
for ( String value : values )
{
ContentValues cv = new ContentValues ( ) ;
cv . put ( " message_id " , id ) ;
cv . put ( " name " , name ) ;
cv . put ( " value " , value ) ;
db . insert ( " headers " , " name " , cv ) ;
}
}
else
{
gotAdditionalHeaders = true ;
}
2009-06-08 23:11:35 -04:00
}
2010-05-21 11:34:29 -04:00
2010-11-13 16:40:56 -05:00
if ( ! gotAdditionalHeaders )
{
// Remember that all headers for this message have been saved, so it is
// not necessary to download them again in case the user wants to see all headers.
List < Flag > appendedFlags = new ArrayList < Flag > ( ) ;
appendedFlags . addAll ( Arrays . asList ( message . getFlags ( ) ) ) ;
appendedFlags . add ( Flag . X_GOT_ALL_HEADERS ) ;
db . execSQL ( " UPDATE messages " + " SET flags = ? " + " WHERE id = ? " ,
new Object [ ]
{ Utility . combine ( appendedFlags . toArray ( ) , ',' ) . toUpperCase ( ) , id } ) ;
}
return null ;
}
} ) ;
2009-06-08 23:11:35 -04:00
}
2009-11-24 19:40:29 -05:00
2010-11-13 16:40:56 -05:00
private void deleteHeaders ( final long id ) throws UnavailableStorageException
2009-06-08 23:11:35 -04:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
db . execSQL ( " DELETE FROM headers WHERE message_id = ? " , new Object [ ]
{ id } ) ;
return null ;
}
} ) ;
2009-06-08 23:11:35 -04:00
}
2008-11-01 17:32:06 -04:00
/ * *
* @param messageId
* @param attachment
2010-12-28 04:10:50 -05:00
* @param saveAsNew
2008-11-01 17:32:06 -04:00
* @throws IOException
* @throws MessagingException
* /
2010-11-13 16:40:56 -05:00
private void saveAttachment ( final long messageId , final Part attachment , final boolean saveAsNew )
2009-11-24 19:40:29 -05:00
throws IOException , MessagingException
{
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( true , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
{
long attachmentId = - 1 ;
Uri contentUri = null ;
int size = - 1 ;
File tempAttachmentFile = null ;
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
if ( ( ! saveAsNew ) & & ( attachment instanceof LocalAttachmentBodyPart ) )
{
attachmentId = ( ( LocalAttachmentBodyPart ) attachment ) . getAttachmentId ( ) ;
}
2008-11-01 17:32:06 -04:00
2010-12-18 17:56:40 -05:00
final File attachmentDirectory = StorageManager . getInstance ( mApplication ) . getAttachmentDirectory ( uUid , database . getStorageProviderId ( ) ) ;
2010-11-13 16:40:56 -05:00
if ( attachment . getBody ( ) ! = null )
{
Body body = attachment . getBody ( ) ;
if ( body instanceof LocalAttachmentBody )
{
contentUri = ( ( LocalAttachmentBody ) body ) . getContentUri ( ) ;
}
else
{
/ *
* If the attachment has a body we ' re expected to save it into the local store
* so we copy the data into a cached attachment file .
* /
InputStream in = attachment . getBody ( ) . getInputStream ( ) ;
tempAttachmentFile = File . createTempFile ( " att " , null , attachmentDirectory ) ;
FileOutputStream out = new FileOutputStream ( tempAttachmentFile ) ;
size = IOUtils . copy ( in , out ) ;
in . close ( ) ;
out . close ( ) ;
}
}
2010-07-11 09:44:16 -04:00
2010-11-13 16:40:56 -05:00
if ( size = = - 1 )
{
/ *
* If the attachment is not yet downloaded see if we can pull a size
* off the Content - Disposition .
* /
String disposition = attachment . getDisposition ( ) ;
if ( disposition ! = null )
{
String s = MimeUtility . getHeaderParameter ( disposition , " size " ) ;
if ( s ! = null )
{
size = Integer . parseInt ( s ) ;
}
}
}
if ( size = = - 1 )
{
size = 0 ;
}
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
String storeData =
Utility . combine ( attachment . getHeader (
MimeHeader . HEADER_ANDROID_ATTACHMENT_STORE_DATA ) , ',' ) ;
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
String name = MimeUtility . getHeaderParameter ( attachment . getContentType ( ) , " name " ) ;
String contentId = MimeUtility . getHeaderParameter ( attachment . getContentId ( ) , null ) ;
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
String contentDisposition = MimeUtility . unfoldAndDecode ( attachment . getDisposition ( ) ) ;
if ( name = = null & & contentDisposition ! = null )
{
name = MimeUtility . getHeaderParameter ( contentDisposition , " filename " ) ;
}
if ( attachmentId = = - 1 )
{
ContentValues cv = new ContentValues ( ) ;
cv . put ( " message_id " , messageId ) ;
cv . put ( " content_uri " , contentUri ! = null ? contentUri . toString ( ) : null ) ;
cv . put ( " store_data " , storeData ) ;
cv . put ( " size " , size ) ;
cv . put ( " name " , name ) ;
cv . put ( " mime_type " , attachment . getMimeType ( ) ) ;
cv . put ( " content_id " , contentId ) ;
cv . put ( " content_disposition " , contentDisposition ) ;
attachmentId = db . insert ( " attachments " , " message_id " , cv ) ;
}
else
{
ContentValues cv = new ContentValues ( ) ;
cv . put ( " content_uri " , contentUri ! = null ? contentUri . toString ( ) : null ) ;
cv . put ( " size " , size ) ;
db . update ( " attachments " , cv , " id = ? " , new String [ ]
{ Long . toString ( attachmentId ) } ) ;
}
2010-07-11 09:44:16 -04:00
2010-11-13 16:40:56 -05:00
if ( attachmentId ! = - 1 & & tempAttachmentFile ! = null )
{
File attachmentFile = new File ( attachmentDirectory , Long . toString ( attachmentId ) ) ;
tempAttachmentFile . renameTo ( attachmentFile ) ;
contentUri = AttachmentProvider . getAttachmentUri (
mAccount ,
attachmentId ) ;
attachment . setBody ( new LocalAttachmentBody ( contentUri , mApplication ) ) ;
ContentValues cv = new ContentValues ( ) ;
cv . put ( " content_uri " , contentUri ! = null ? contentUri . toString ( ) : null ) ;
db . update ( " attachments " , cv , " id = ? " , new String [ ]
{ Long . toString ( attachmentId ) } ) ;
}
/* The message has attachment with Content-ID */
if ( contentId ! = null & & contentUri ! = null )
{
2010-12-28 04:10:50 -05:00
Cursor cursor = db . query ( " messages " , new String [ ]
2010-11-13 16:40:56 -05:00
{ " html_content " } , " id = ? " , new String [ ]
{ Long . toString ( messageId ) } , null , null , null ) ;
try
{
if ( cursor . moveToNext ( ) )
{
String new_html ;
new_html = cursor . getString ( 0 ) ;
new_html = new_html . replaceAll ( " cid: " + contentId ,
contentUri . toString ( ) ) ;
ContentValues cv = new ContentValues ( ) ;
cv . put ( " html_content " , new_html ) ;
db . update ( " messages " , cv , " id = ? " , new String [ ]
{ Long . toString ( messageId ) } ) ;
}
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
}
2010-07-11 09:44:16 -04:00
2010-11-13 16:40:56 -05:00
if ( attachmentId ! = - 1 & & attachment instanceof LocalAttachmentBodyPart )
{
( ( LocalAttachmentBodyPart ) attachment ) . setAttachmentId ( attachmentId ) ;
}
return null ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
catch ( IOException e )
{
throw new WrappedException ( e ) ;
}
2010-07-11 09:44:16 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
}
catch ( WrappedException e )
{
final Throwable cause = e . getCause ( ) ;
if ( cause instanceof IOException )
{
throw ( IOException ) cause ;
2010-07-11 09:44:16 -04:00
}
2010-11-13 16:40:56 -05:00
else
2010-07-13 17:16:56 -04:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) cause ;
2010-07-11 09:44:16 -04:00
}
}
2008-11-01 17:32:06 -04:00
}
/ * *
* Changes the stored uid of the given message ( using it ' s internal id as a key ) to
* the uid in the message .
* @param message
2010-12-28 04:10:50 -05:00
* @throws com . fsck . k9 . mail . MessagingException
2008-11-01 17:32:06 -04:00
* /
2010-11-13 16:40:56 -05:00
public void changeUid ( final LocalMessage message ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
2010-11-13 16:40:56 -05:00
final ContentValues cv = new ContentValues ( ) ;
2008-11-01 17:32:06 -04:00
cv . put ( " uid " , message . getUid ( ) ) ;
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
db . update ( " messages " , cv , " id = ? " , new String [ ]
{ Long . toString ( message . mId ) } ) ;
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
}
@Override
public void setFlags ( Message [ ] messages , Flag [ ] flags , boolean value )
2009-11-24 19:40:29 -05:00
throws MessagingException
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
2009-11-24 19:40:29 -05:00
for ( Message message : messages )
{
2008-11-01 17:32:06 -04:00
message . setFlags ( flags , value ) ;
}
}
2009-11-24 19:40:29 -05:00
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
@Override
public void setFlags ( Flag [ ] flags , boolean value )
2009-11-24 19:40:29 -05:00
throws MessagingException
{
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
open ( OpenMode . READ_WRITE ) ;
2009-11-24 19:40:29 -05:00
for ( Message message : getMessages ( null ) )
{
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
message . setFlags ( flags , value ) ;
}
}
2008-11-01 17:32:06 -04:00
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
@Override
public String getUidFromMessageId ( Message message ) throws MessagingException
{
2009-11-24 19:40:29 -05:00
throw new MessagingException ( " Cannot call getUidFromMessageId on LocalFolder " ) ;
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2009-12-27 11:50:21 -05:00
2010-11-13 19:49:08 -05:00
private void clearMessagesWhere ( final String whereClause , final String [ ] params ) throws MessagingException
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
{
2009-11-24 19:40:29 -05:00
open ( OpenMode . READ_ONLY ) ;
2010-08-29 12:57:57 -04:00
Message [ ] messages = LocalStore . this . getMessages (
2010-08-30 23:58:33 -04:00
null ,
this ,
2010-11-13 19:49:04 -05:00
" SELECT " + GET_MESSAGES_COLS + " FROM messages WHERE " + whereClause ,
2010-08-30 23:58:33 -04:00
params ) ;
2010-08-29 12:57:57 -04:00
for ( Message message : messages )
{
deleteAttachments ( message . getUid ( ) ) ;
}
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
2010-11-13 19:49:04 -05:00
db . execSQL ( " DELETE FROM messages WHERE " + whereClause , params ) ;
2010-11-13 16:40:56 -05:00
return null ;
}
} ) ;
2010-04-16 10:33:54 -04:00
resetUnreadAndFlaggedCounts ( ) ;
2009-10-21 20:41:06 -04:00
}
2009-11-24 19:40:29 -05:00
2010-11-13 19:49:08 -05:00
public void clearMessagesOlderThan ( long cutoff ) throws MessagingException
2010-11-13 19:49:04 -05:00
{
final String where = " folder_id = ? and date < ? " ;
final String [ ] params = new String [ ]
{
Long . toString ( mFolderId ) , Long . toString ( cutoff )
} ;
2010-11-13 19:49:08 -05:00
clearMessagesWhere ( where , params ) ;
2010-11-13 19:49:04 -05:00
}
2010-11-13 19:49:25 -05:00
public void clearAllMessages ( ) throws MessagingException
{
final String where = " folder_id = ? " ;
final String [ ] params = new String [ ]
{
Long . toString ( mFolderId )
} ;
clearMessagesWhere ( where , params ) ;
setPushState ( null ) ;
setLastPush ( 0 ) ;
setLastChecked ( 0 ) ;
}
2010-04-16 10:33:54 -04:00
private void resetUnreadAndFlaggedCounts ( )
2009-10-21 20:41:06 -04:00
{
try
{
int newUnread = 0 ;
2010-04-16 10:33:54 -04:00
int newFlagged = 0 ;
2009-10-21 20:41:06 -04:00
Message [ ] messages = getMessages ( null ) ;
for ( Message message : messages )
{
2010-08-29 19:39:26 -04:00
if ( ! message . isSet ( Flag . SEEN ) )
2009-10-21 20:41:06 -04:00
{
newUnread + + ;
}
2010-08-29 19:39:26 -04:00
if ( message . isSet ( Flag . FLAGGED ) )
2010-04-16 10:33:54 -04:00
{
newFlagged + + ;
}
2009-10-21 20:41:06 -04:00
}
setUnreadMessageCount ( newUnread ) ;
2010-04-16 10:33:54 -04:00
setFlaggedMessageCount ( newFlagged ) ;
2009-10-21 20:41:06 -04:00
}
catch ( Exception e )
{
2009-12-14 21:50:53 -05:00
Log . e ( K9 . LOG_TAG , " Unable to fetch all messages from LocalStore " , e ) ;
2009-10-21 20:41:06 -04:00
}
Complete merge of DAmail functionality into K9mail. Following
features are added to K9mail:
1) Show unread message count on each folder
2) Sum unread count of all shown folders in an account to the account display
3) Periodically check selected folders for new mail, not just Inbox
4) Don't refresh folder when opened (unless folder is empty)
5) Show date and time of last sync for each folder
6) Fix timer for automatic periodic sync (use wakelock to assure completion)
7) Optimize local folder queries (speeds up account and folder lists)
8) Show Loading... message in status bar indicating which folder is being synced
9) Eliminate redundant sync of new messages (performance enhancement)
10) Improve notification text for multiple accounts
11) Do not automatically sync folders more often than the account-specific period
12) Use user-configured date and time formats
13) Select which folders are shown, using configurable Classes
14) Select which folders are synced, using configurable Classes
15) Added context (long press) menu to folders, to provide for Refresh
and Folder Settings
16) Status light flashes purple when there are unread messages
17) Folder list more quickly eliminates display of deleted and out-of-Class folders.
18) Delete works
19) Mark all messages as read (in the folder context menu)
20) Notifications only for new unread messages
21) One minute synchronization frequency
22) Deleting an unread message decrements unread counter
23) Notifications work for POP3 accounts
24) Message deletes work for POP3 accounts
25) Explicit errors show in folder list
26) Stack traces saved to folder K9mail-errors
27) Clear pending actions (danger, for emergencies only!)
28) Delete policy in Account settings
29) DNS cache in InetAddress disabled
30) Trapped some crash-causing error conditions
31) Eliminate duplicate copies to Sent folder
32) Prevent crashes due to message listener concurrency
33) Empty Trash
34) Nuclear "Mark all messages as read" (marks all messages as read in
server-side folder, irrespective of which messages have been downloaded)
35) Forward (alternate) to allow forwarding email through other programs
36) Accept text/plain Intents to allow other programs to send email through K9mail
37) Displays Outbox sending status
38) Manual retry of outbox sending when "Refresh"ing Outbox
39) Folder error status is persisted
40) Ability to log to arbitrary file
Fixes K9 issues 11, 23, 24, 65, 69, 71, 79, 81, 82, 83, 87, 101, 104,
107, 120, 148, 154
2008-12-30 22:49:09 -05:00
}
2010-04-29 00:59:14 -04:00
2008-11-01 17:32:06 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void delete ( final boolean recurse ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
try
2009-12-06 19:56:06 -05:00
{
2010-11-13 16:40:56 -05:00
// We need to open the folder first to make sure we've got it's id
open ( OpenMode . READ_ONLY ) ;
Message [ ] messages = getMessages ( null ) ;
for ( Message message : messages )
{
deleteAttachments ( message . getUid ( ) ) ;
}
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
db . execSQL ( " DELETE FROM folders WHERE id = ? " , new Object [ ]
{ Long . toString ( mFolderId ) , } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2008-11-01 17:32:06 -04:00
}
@Override
2009-11-24 19:40:29 -05:00
public boolean equals ( Object o )
{
if ( o instanceof LocalFolder )
{
2008-11-01 17:32:06 -04:00
return ( ( LocalFolder ) o ) . mName . equals ( mName ) ;
}
return super . equals ( o ) ;
}
2010-03-03 23:00:30 -05:00
@Override
public int hashCode ( )
{
return mName . hashCode ( ) ;
}
2008-11-01 17:32:06 -04:00
@Override
2010-12-01 01:32:29 -05:00
public Flag [ ] getPermanentFlags ( )
{
2008-11-01 17:32:06 -04:00
return PERMANENT_FLAGS ;
}
2010-08-29 12:56:45 -04:00
2010-11-13 16:40:56 -05:00
private void deleteAttachments ( final long messageId ) throws MessagingException
2010-08-29 12:56:45 -04:00
{
open ( OpenMode . READ_WRITE ) ;
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2010-08-29 12:56:45 -04:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
2010-08-29 12:56:45 -04:00
{
2010-11-13 16:40:56 -05:00
Cursor attachmentsCursor = null ;
2010-08-29 12:56:45 -04:00
try
{
2010-11-13 16:40:56 -05:00
attachmentsCursor = db . query ( " attachments " , new String [ ]
{ " id " } , " message_id = ? " , new String [ ]
{ Long . toString ( messageId ) } , null , null , null ) ;
final File attachmentDirectory = StorageManager . getInstance ( mApplication )
2010-12-18 17:56:40 -05:00
. getAttachmentDirectory ( uUid , database . getStorageProviderId ( ) ) ;
2010-11-13 16:40:56 -05:00
while ( attachmentsCursor . moveToNext ( ) )
2010-08-29 12:56:45 -04:00
{
2010-11-13 16:40:56 -05:00
long attachmentId = attachmentsCursor . getLong ( 0 ) ;
try
{
File file = new File ( attachmentDirectory , Long . toString ( attachmentId ) ) ;
if ( file . exists ( ) )
{
file . delete ( ) ;
}
}
catch ( Exception e )
{
}
2010-08-29 12:56:45 -04:00
}
}
2010-11-13 16:40:56 -05:00
finally
2010-08-29 12:56:45 -04:00
{
2010-11-13 16:40:56 -05:00
if ( attachmentsCursor ! = null )
{
attachmentsCursor . close ( ) ;
}
2010-08-29 12:56:45 -04:00
}
2010-11-13 16:40:56 -05:00
return null ;
2010-08-29 12:56:45 -04:00
}
2010-11-13 16:40:56 -05:00
} ) ;
2010-08-29 12:56:45 -04:00
}
2010-11-13 16:40:56 -05:00
private void deleteAttachments ( final String uid ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2008-11-01 17:32:06 -04:00
open ( OpenMode . READ_WRITE ) ;
2009-11-24 19:40:29 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( false , new DbCallback < Void > ( )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
Cursor messagesCursor = null ;
try
{
messagesCursor = db . query ( " messages " , new String [ ]
{ " id " } , " folder_id = ? AND uid = ? " , new String [ ]
{ Long . toString ( mFolderId ) , uid } , null , null , null ) ;
while ( messagesCursor . moveToNext ( ) )
{
long messageId = messagesCursor . getLong ( 0 ) ;
deleteAttachments ( messageId ) ;
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
}
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
finally
{
if ( messagesCursor ! = null )
{
messagesCursor . close ( ) ;
}
}
return null ;
}
} ) ;
2008-11-01 17:32:06 -04:00
}
2010-11-13 16:40:56 -05:00
catch ( WrappedException e )
2009-11-24 19:40:29 -05:00
{
2010-11-13 16:40:56 -05:00
throw ( MessagingException ) e . getCause ( ) ;
2008-11-01 17:32:06 -04:00
}
}
2009-05-03 16:52:32 -04:00
2010-01-12 22:36:36 -05:00
/ *
2010-08-29 12:57:24 -04:00
* calculateContentPreview
2010-01-12 22:36:36 -05:00
* Takes a plain text message body as a string .
* Returns a message summary as a string suitable for showing in a message list
*
* A message summary should be about the first 160 characters
* of unique text written by the message sender
* Quoted text , " On $date " and so on will be stripped out .
* All newlines and whitespace will be compressed .
*
* /
public String calculateContentPreview ( String text )
{
2010-01-13 20:07:28 -05:00
if ( text = = null )
{
2010-01-12 22:36:36 -05:00
return null ;
}
2010-11-05 00:23:04 -04:00
2010-11-12 20:47:08 -05:00
// Only look at the first 8k of a message when calculating
2010-11-05 00:23:04 -04:00
// the preview. This should avoid unnecessary
// memory usage on large messages
if ( text . length ( ) > 8192 )
{
text = text . substring ( 0 , 8192 ) ;
}
2010-11-04 23:55:24 -04:00
text = text . replaceAll ( " (?m)^----.*?$ " , " " ) ;
text = text . replaceAll ( " (?m)^[#>].*$ " , " " ) ;
text = text . replaceAll ( " (?m)^On .*wrote.?$ " , " " ) ;
text = text . replaceAll ( " (?m)^.* \\ w+:$ " , " " ) ;
2010-07-23 22:09:12 -04:00
text = text . replaceAll ( " https?:// \\ S+ " , " ... " ) ;
2010-01-12 22:36:36 -05:00
text = text . replaceAll ( " ( \\ r| \\ n)+ " , " " ) ;
text = text . replaceAll ( " \\ s+ " , " " ) ;
2010-11-05 00:23:09 -04:00
if ( text . length ( ) < = 512 )
2010-01-13 20:07:28 -05:00
{
2010-01-12 22:36:36 -05:00
return text ;
}
else
{
2010-11-05 00:23:09 -04:00
text = text . substring ( 0 , 512 ) ;
2010-01-12 22:36:36 -05:00
return text ;
}
}
2009-11-24 19:40:29 -05:00
public String markupContent ( String text , String html )
{
if ( text . length ( ) > 0 & & html . length ( ) = = 0 )
{
2009-05-20 00:39:51 -04:00
html = htmlifyString ( text ) ;
}
2009-05-03 16:52:32 -04:00
2010-08-01 21:24:40 -04:00
html = convertEmoji2ImgForDocomo ( html ) ;
2010-07-11 09:44:16 -04:00
return html ;
2009-05-20 00:39:51 -04:00
}
2009-11-24 19:40:29 -05:00
public String htmlifyString ( String text )
{
2010-10-23 13:33:08 -04:00
// Our HTMLification code is somewhat memory intensive
// and was causing lots of OOM errors on the market
// if the message is big and plain text, just do
// a trivial htmlification
if ( text . length ( ) > MAX_SMART_HTMLIFY_MESSAGE_LENGTH )
{
return " <html><head/><body> " +
htmlifyMessageHeader ( ) +
text +
htmlifyMessageFooter ( ) +
" </body></html> " ;
}
2009-05-10 03:05:24 -04:00
StringReader reader = new StringReader ( text ) ;
StringBuilder buff = new StringBuilder ( text . length ( ) + 512 ) ;
2010-12-28 04:10:50 -05:00
int c ;
2009-11-24 19:40:29 -05:00
try
{
while ( ( c = reader . read ( ) ) ! = - 1 )
{
switch ( c )
{
2009-05-10 03:05:24 -04:00
case '&' :
buff . append ( " & " ) ;
break ;
case '<' :
buff . append ( " < " ) ;
break ;
case '>' :
buff . append ( " > " ) ;
break ;
case '\r' :
break ;
default :
buff . append ( ( char ) c ) ;
} //switch
}
2009-11-24 19:40:29 -05:00
}
catch ( IOException e )
{
2009-05-10 03:05:24 -04:00
//Should never happen
2009-12-14 21:50:53 -05:00
Log . e ( K9 . LOG_TAG , null , e ) ;
2009-05-10 03:05:24 -04:00
}
text = buff . toString ( ) ;
2009-11-27 23:56:47 -05:00
text = text . replaceAll ( " \\ s*([-=_]{30,}+) \\ s* " , " <hr /> " ) ;
2009-12-01 22:16:31 -05:00
text = text . replaceAll ( " (?m)^([^ \ r \ n]{4,}[ \\ s \\ w,:;+/])(?: \ r \ n| \ n| \ r)(?=[a-z] \\ S{0,10}[ \\ s \\ n \\ r]) " , " $1 " ) ;
text = text . replaceAll ( " (?m)( \ r \ n| \ n| \ r){4,} " , " \ n \ n " ) ;
2009-05-10 03:05:24 -04:00
2010-06-06 17:33:33 -04:00
2009-05-10 03:05:24 -04:00
Matcher m = Regex . WEB_URL_PATTERN . matcher ( text ) ;
StringBuffer sb = new StringBuffer ( text . length ( ) + 512 ) ;
2010-10-23 14:50:10 -04:00
sb . append ( " <html><head></head><body> " ) ;
2010-06-06 17:33:33 -04:00
sb . append ( htmlifyMessageHeader ( ) ) ;
2009-11-24 19:40:29 -05:00
while ( m . find ( ) )
{
2009-05-10 03:05:24 -04:00
int start = m . start ( ) ;
2009-11-24 19:40:29 -05:00
if ( start = = 0 | | ( start ! = 0 & & text . charAt ( start - 1 ) ! = '@' ) )
{
2010-11-04 22:59:21 -04:00
if ( m . group ( ) . indexOf ( ':' ) > 0 ) // With no URI-schema we may get "http:/" links with the second / missing
{
2010-11-04 09:35:39 -04:00
m . appendReplacement ( sb , " <a href= \" $0 \" >$0</a> " ) ;
2010-11-04 22:59:21 -04:00
}
else
{
m . appendReplacement ( sb , " <a href= \" http://$0 \" >$0</a> " ) ;
2010-11-04 09:35:39 -04:00
}
2009-11-24 19:40:29 -05:00
}
else
{
2009-05-10 03:05:24 -04:00
m . appendReplacement ( sb , " $0 " ) ;
}
}
2009-11-27 23:56:47 -05:00
2009-11-29 23:03:16 -05:00
2009-05-10 03:05:24 -04:00
m . appendTail ( sb ) ;
2010-06-06 17:33:33 -04:00
sb . append ( htmlifyMessageFooter ( ) ) ;
sb . append ( " </body></html> " ) ;
2009-05-10 03:05:24 -04:00
text = sb . toString ( ) ;
2009-05-03 16:52:32 -04:00
return text ;
}
2010-03-07 12:02:21 -05:00
2010-06-06 17:33:33 -04:00
private String htmlifyMessageHeader ( )
{
if ( K9 . messageViewFixedWidthFont ( ) )
{
return " <pre style= \" white-space: pre-wrap; word-wrap:break-word; \" > " ;
}
else
{
return " <div style= \" white-space: pre-wrap; word-wrap:break-word; \" > " ;
}
}
private String htmlifyMessageFooter ( )
{
if ( K9 . messageViewFixedWidthFont ( ) )
{
return " </pre> " ;
}
else
{
return " </div> " ;
}
}
2010-08-01 21:24:40 -04:00
public String convertEmoji2ImgForDocomo ( String html )
{
StringReader reader = new StringReader ( html ) ;
StringBuilder buff = new StringBuilder ( html . length ( ) + 512 ) ;
2010-12-28 04:10:50 -05:00
int c ;
2010-08-01 21:24:40 -04:00
try
{
while ( ( c = reader . read ( ) ) ! = - 1 )
{
switch ( c )
{
2010-08-17 22:48:55 -04:00
// These emoji codepoints are generated by tools/make_emoji in the K-9 source tree
2010-08-11 22:22:35 -04:00
case 0xE6F9 : //docomo kissmark
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/kissmark.gif \" alt= \" kissmark \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE729 : //docomo wink
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wink.gif \" alt= \" wink \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D2 : //docomo info02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/info02.gif \" alt= \" info02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE753 : //docomo smile
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/smile.gif \" alt= \" smile \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE68D : //docomo heart
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart.gif \" alt= \" heart \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6A5 : //docomo downwardleft
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/downwardleft.gif \" alt= \" downwardleft \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6AD : //docomo pouch
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pouch.gif \" alt= \" pouch \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D4 : //docomo by-d
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/by-d.gif \" alt= \" by-d \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D7 : //docomo free
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/free.gif \" alt= \" free \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E8 : //docomo seven
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/seven.gif \" alt= \" seven \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE74E : //docomo snail
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snail.gif \" alt= \" snail \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE658 : //docomo basketball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/basketball.gif \" alt= \" basketball \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE65A : //docomo pocketbell
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pocketbell.gif \" alt= \" pocketbell \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E3 : //docomo two
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/two.gif \" alt= \" two \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE74A : //docomo cake
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cake.gif \" alt= \" cake \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D0 : //docomo faxto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/faxto.gif \" alt= \" faxto \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE661 : //docomo ship
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ship.gif \" alt= \" ship \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE64B : //docomo virgo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/virgo.gif \" alt= \" virgo \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE67E : //docomo ticket
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ticket.gif \" alt= \" ticket \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D6 : //docomo yen
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/yen.gif \" alt= \" yen \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E0 : //docomo sharp
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sharp.gif \" alt= \" sharp \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6FE : //docomo bomb
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bomb.gif \" alt= \" bomb \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E1 : //docomo mobaq
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mobaq.gif \" alt= \" mobaq \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE70A : //docomo sign05
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign05.gif \" alt= \" sign05 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE667 : //docomo bank
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bank.gif \" alt= \" bank \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE731 : //docomo copyright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/copyright.gif \" alt= \" copyright \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE678 : //docomo upwardright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/upwardright.gif \" alt= \" upwardright \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE694 : //docomo scissors
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/scissors.gif \" alt= \" scissors \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE682 : //docomo bag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bag.gif \" alt= \" bag \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE64D : //docomo scorpius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/scorpius.gif \" alt= \" scorpius \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D9 : //docomo key
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/key.gif \" alt= \" key \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE734 : //docomo secret
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/secret.gif \" alt= \" secret \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE74F : //docomo chick
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/chick.gif \" alt= \" chick \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE691 : //docomo eye
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eye.gif \" alt= \" eye \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE70B : //docomo ok
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ok.gif \" alt= \" ok \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE714 : //docomo door
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/door.gif \" alt= \" door \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE64F : //docomo capricornus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/capricornus.gif \" alt= \" capricornus \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE674 : //docomo boutique
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/boutique.gif \" alt= \" boutique \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE726 : //docomo lovely
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/lovely.gif \" alt= \" lovely \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE68F : //docomo diamond
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/diamond.gif \" alt= \" diamond \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE69B : //docomo wheelchair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wheelchair.gif \" alt= \" wheelchair \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE747 : //docomo maple
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/maple.gif \" alt= \" maple \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE64C : //docomo libra
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/libra.gif \" alt= \" libra \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE647 : //docomo taurus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/taurus.gif \" alt= \" taurus \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE645 : //docomo sprinkle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sprinkle.gif \" alt= \" sprinkle \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6FC : //docomo annoy
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/annoy.gif \" alt= \" annoy \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E6 : //docomo five
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/five.gif \" alt= \" five \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE676 : //docomo karaoke
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/karaoke.gif \" alt= \" karaoke \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE69D : //docomo moon1
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon1.gif \" alt= \" moon1 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE709 : //docomo sign04
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign04.gif \" alt= \" sign04 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE72A : //docomo happy02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/happy02.gif \" alt= \" happy02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE669 : //docomo hotel
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hotel.gif \" alt= \" hotel \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE71B : //docomo ring
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ring.gif \" alt= \" ring \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE644 : //docomo mist
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mist.gif \" alt= \" mist \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE73B : //docomo full
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/full.gif \" alt= \" full \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE683 : //docomo book
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/book.gif \" alt= \" book \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE707 : //docomo sweat02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sweat02.gif \" alt= \" sweat02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE716 : //docomo pc
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pc.gif \" alt= \" pc \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE671 : //docomo bar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bar.gif \" alt= \" bar \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE72B : //docomo bearing
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bearing.gif \" alt= \" bearing \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE65C : //docomo subway
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/subway.gif \" alt= \" subway \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE725 : //docomo gawk
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gawk.gif \" alt= \" gawk \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE745 : //docomo apple
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/apple.gif \" alt= \" apple \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE65F : //docomo rvcar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rvcar.gif \" alt= \" rvcar \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE664 : //docomo building
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/building.gif \" alt= \" building \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE737 : //docomo danger
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/danger.gif \" alt= \" danger \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE702 : //docomo sign01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign01.gif \" alt= \" sign01 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6EC : //docomo heart01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart01.gif \" alt= \" heart01 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE660 : //docomo bus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bus.gif \" alt= \" bus \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE72D : //docomo crying
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/crying.gif \" alt= \" crying \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE652 : //docomo sports
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sports.gif \" alt= \" sports \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6B8 : //docomo on
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/on.gif \" alt= \" on \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE73C : //docomo leftright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/leftright.gif \" alt= \" leftright \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6BA : //docomo clock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clock.gif \" alt= \" clock \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F0 : //docomo happy01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/happy01.gif \" alt= \" happy01 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE701 : //docomo sleepy
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sleepy.gif \" alt= \" sleepy \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE63E : //docomo sun
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sun.gif \" alt= \" sun \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE67D : //docomo event
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/event.gif \" alt= \" event \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE689 : //docomo memo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/memo.gif \" alt= \" memo \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE68B : //docomo game
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/game.gif \" alt= \" game \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE718 : //docomo wrench
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wrench.gif \" alt= \" wrench \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE741 : //docomo clover
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clover.gif \" alt= \" clover \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE693 : //docomo rock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rock.gif \" alt= \" rock \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F6 : //docomo note
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/note.gif \" alt= \" note \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE67A : //docomo music
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/music.gif \" alt= \" music \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE743 : //docomo tulip
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tulip.gif \" alt= \" tulip \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE656 : //docomo soccer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/soccer.gif \" alt= \" soccer \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE69C : //docomo newmoon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/newmoon.gif \" alt= \" newmoon \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE73E : //docomo school
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/school.gif \" alt= \" school \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE750 : //docomo penguin
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/penguin.gif \" alt= \" penguin \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE696 : //docomo downwardright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/downwardright.gif \" alt= \" downwardright \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6CE : //docomo phoneto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/phoneto.gif \" alt= \" phoneto \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE728 : //docomo bleah
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bleah.gif \" alt= \" bleah \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE662 : //docomo airplane
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/airplane.gif \" alt= \" airplane \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE74C : //docomo noodle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/noodle.gif \" alt= \" noodle \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE704 : //docomo sign03
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign03.gif \" alt= \" sign03 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE68E : //docomo spade
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/spade.gif \" alt= \" spade \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE698 : //docomo foot
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/foot.gif \" alt= \" foot \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE712 : //docomo snowboard
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snowboard.gif \" alt= \" snowboard \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE684 : //docomo ribbon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ribbon.gif \" alt= \" ribbon \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6DA : //docomo enter
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/enter.gif \" alt= \" enter \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6EA : //docomo nine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/nine.gif \" alt= \" nine \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE722 : //docomo coldsweats01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/coldsweats01.gif \" alt= \" coldsweats01 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F7 : //docomo spa
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/spa.gif \" alt= \" spa \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE710 : //docomo rouge
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rouge.gif \" alt= \" rouge \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE73F : //docomo wave
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wave.gif \" alt= \" wave \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE686 : //docomo birthday
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/birthday.gif \" alt= \" birthday \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE721 : //docomo confident
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/confident.gif \" alt= \" confident \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6FF : //docomo notes
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/notes.gif \" alt= \" notes \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE724 : //docomo pout
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pout.gif \" alt= \" pout \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6A4 : //docomo xmas
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/xmas.gif \" alt= \" xmas \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6FB : //docomo flair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/flair.gif \" alt= \" flair \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE71D : //docomo bicycle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bicycle.gif \" alt= \" bicycle \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6DC : //docomo search
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/search.gif \" alt= \" search \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE757 : //docomo shock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shock.gif \" alt= \" shock \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE680 : //docomo nosmoking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/nosmoking.gif \" alt= \" nosmoking \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE66D : //docomo signaler
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/signaler.gif \" alt= \" signaler \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE66A : //docomo 24hours
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/24hours.gif \" alt= \" 24hours \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F4 : //docomo wobbly
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wobbly.gif \" alt= \" wobbly \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE641 : //docomo snow
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snow.gif \" alt= \" snow \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6AE : //docomo pen
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pen.gif \" alt= \" pen \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE70D : //docomo appli02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/appli02.gif \" alt= \" appli02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE732 : //docomo tm
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tm.gif \" alt= \" tm \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE755 : //docomo pig
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pig.gif \" alt= \" pig \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE648 : //docomo gemini
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gemini.gif \" alt= \" gemini \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6DE : //docomo flag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/flag.gif \" alt= \" flag \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6A1 : //docomo dog
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dog.gif \" alt= \" dog \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6EF : //docomo heart04
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart04.gif \" alt= \" heart04 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE643 : //docomo typhoon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/typhoon.gif \" alt= \" typhoon \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE65B : //docomo train
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/train.gif \" alt= \" train \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE746 : //docomo bud
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bud.gif \" alt= \" bud \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE653 : //docomo baseball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/baseball.gif \" alt= \" baseball \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6B2 : //docomo chair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/chair.gif \" alt= \" chair \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE64A : //docomo leo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/leo.gif \" alt= \" leo \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E7 : //docomo six
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/six.gif \" alt= \" six \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E4 : //docomo three
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/three.gif \" alt= \" three \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6DF : //docomo freedial
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/freedial.gif \" alt= \" freedial \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE744 : //docomo banana
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/banana.gif \" alt= \" banana \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6DB : //docomo clear
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clear.gif \" alt= \" clear \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6AC : //docomo slate
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/slate.gif \" alt= \" slate \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE666 : //docomo hospital
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hospital.gif \" alt= \" hospital \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE663 : //docomo house
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/house.gif \" alt= \" house \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE695 : //docomo paper
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/paper.gif \" alt= \" paper \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE67F : //docomo smoking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/smoking.gif \" alt= \" smoking \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE65D : //docomo bullettrain
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bullettrain.gif \" alt= \" bullettrain \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6B1 : //docomo shadow
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shadow.gif \" alt= \" shadow \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE670 : //docomo cafe
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cafe.gif \" alt= \" cafe \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE654 : //docomo golf
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/golf.gif \" alt= \" golf \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE708 : //docomo dash
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dash.gif \" alt= \" dash \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE748 : //docomo cherryblossom
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cherryblossom.gif \" alt= \" cherryblossom \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F1 : //docomo angry
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/angry.gif \" alt= \" angry \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE736 : //docomo r-mark
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/r-mark.gif \" alt= \" r-mark \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6A2 : //docomo cat
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cat.gif \" alt= \" cat \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6D1 : //docomo info01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/info01.gif \" alt= \" info01 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE687 : //docomo telephone
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/telephone.gif \" alt= \" telephone \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE68C : //docomo cd
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cd.gif \" alt= \" cd \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE70E : //docomo t-shirt
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/t-shirt.gif \" alt= \" t-shirt \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE733 : //docomo run
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/run.gif \" alt= \" run \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE679 : //docomo carouselpony
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/carouselpony.gif \" alt= \" carouselpony \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE646 : //docomo aries
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/aries.gif \" alt= \" aries \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE690 : //docomo club
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/club.gif \" alt= \" club \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE64E : //docomo sagittarius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sagittarius.gif \" alt= \" sagittarius \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F5 : //docomo up
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/up.gif \" alt= \" up \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE720 : //docomo think
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/think.gif \" alt= \" think \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6E2 : //docomo one
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/one.gif \" alt= \" one \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6D8 : //docomo id
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/id.gif \" alt= \" id \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE675 : //docomo hairsalon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hairsalon.gif \" alt= \" hairsalon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6B7 : //docomo soon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/soon.gif \" alt= \" soon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE717 : //docomo loveletter
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/loveletter.gif \" alt= \" loveletter \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE673 : //docomo fastfood
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fastfood.gif \" alt= \" fastfood \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE719 : //docomo pencil
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pencil.gif \" alt= \" pencil \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE697 : //docomo upwardleft
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/upwardleft.gif \" alt= \" upwardleft \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE730 : //docomo clip
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clip.gif \" alt= \" clip \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6ED : //docomo heart02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart02.gif \" alt= \" heart02 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE69A : //docomo eyeglass
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eyeglass.gif \" alt= \" eyeglass \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE65E : //docomo car
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/car.gif \" alt= \" car \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE742 : //docomo cherry
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cherry.gif \" alt= \" cherry \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE71C : //docomo sandclock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sandclock.gif \" alt= \" sandclock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE735 : //docomo recycle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/recycle.gif \" alt= \" recycle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE752 : //docomo delicious
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/delicious.gif \" alt= \" delicious \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE69E : //docomo moon2
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon2.gif \" alt= \" moon2 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE68A : //docomo tv
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tv.gif \" alt= \" tv \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE706 : //docomo sweat01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sweat01.gif \" alt= \" sweat01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE738 : //docomo ban
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ban.gif \" alt= \" ban \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE672 : //docomo beer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/beer.gif \" alt= \" beer \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE640 : //docomo rain
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rain.gif \" alt= \" rain \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE69F : //docomo moon3
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon3.gif \" alt= \" moon3 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE657 : //docomo ski
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ski.gif \" alt= \" ski \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE70C : //docomo appli01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/appli01.gif \" alt= \" appli01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6E5 : //docomo four
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/four.gif \" alt= \" four \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE699 : //docomo shoe
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shoe.gif \" alt= \" shoe \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE63F : //docomo cloud
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cloud.gif \" alt= \" cloud \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE72F : //docomo ng
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ng.gif \" alt= \" ng \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6A3 : //docomo yacht
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/yacht.gif \" alt= \" yacht \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE73A : //docomo pass
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pass.gif \" alt= \" pass \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE67C : //docomo drama
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/drama.gif \" alt= \" drama \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE727 : //docomo good
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/good.gif \" alt= \" good \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6EB : //docomo zero
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/zero.gif \" alt= \" zero \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE72C : //docomo catface
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/catface.gif \" alt= \" catface \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6D5 : //docomo d-point
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/d-point.gif \" alt= \" d-point \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6F2 : //docomo despair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/despair.gif \" alt= \" despair \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE700 : //docomo down
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/down.gif \" alt= \" down \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE655 : //docomo tennis
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tennis.gif \" alt= \" tennis \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE703 : //docomo sign02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign02.gif \" alt= \" sign02 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE711 : //docomo denim
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/denim.gif \" alt= \" denim \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE705 : //docomo impact
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/impact.gif \" alt= \" impact \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE642 : //docomo thunder
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/thunder.gif \" alt= \" thunder \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE66C : //docomo parking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/parking.gif \" alt= \" parking \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6F3 : //docomo sad
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sad.gif \" alt= \" sad \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE71E : //docomo japanesetea
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/japanesetea.gif \" alt= \" japanesetea \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6FD : //docomo punch
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/punch.gif \" alt= \" punch \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE73D : //docomo updown
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/updown.gif \" alt= \" updown \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE66F : //docomo restaurant
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/restaurant.gif \" alt= \" restaurant \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE66E : //docomo toilet
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/toilet.gif \" alt= \" toilet \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE739 : //docomo empty
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/empty.gif \" alt= \" empty \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE723 : //docomo coldsweats02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/coldsweats02.gif \" alt= \" coldsweats02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6B9 : //docomo end
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/end.gif \" alt= \" end \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE67B : //docomo art
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/art.gif \" alt= \" art \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE72E : //docomo weep
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/weep.gif \" alt= \" weep \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE715 : //docomo dollar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dollar.gif \" alt= \" dollar \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE6CF : //docomo mailto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mailto.gif \" alt= \" mailto \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6F8 : //docomo cute
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cute.gif \" alt= \" cute \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6DD : //docomo new
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/new.gif \" alt= \" new \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE651 : //docomo pisces
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pisces.gif \" alt= \" pisces \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE756 : //docomo wine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wine.gif \" alt= \" wine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE649 : //docomo cancer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cancer.gif \" alt= \" cancer \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE650 : //docomo aquarius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/aquarius.gif \" alt= \" aquarius \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE740 : //docomo fuji
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fuji.gif \" alt= \" fuji \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE681 : //docomo camera
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/camera.gif \" alt= \" camera \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE71F : //docomo watch
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/watch.gif \" alt= \" watch \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6EE : //docomo heart03
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart03.gif \" alt= \" heart03 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE71A : //docomo crown
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/crown.gif \" alt= \" crown \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6B3 : //docomo night
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/night.gif \" alt= \" night \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE66B : //docomo gasstation
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gasstation.gif \" alt= \" gasstation \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE692 : //docomo ear
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ear.gif \" alt= \" ear \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE685 : //docomo present
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/present.gif \" alt= \" present \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6E9 : //docomo eight
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eight.gif \" alt= \" eight \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE70F : //docomo moneybag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moneybag.gif \" alt= \" moneybag \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE749 : //docomo riceball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/riceball.gif \" alt= \" riceball \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6A0 : //docomo fullmoon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fullmoon.gif \" alt= \" fullmoon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE74D : //docomo bread
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bread.gif \" alt= \" bread \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE665 : //docomo postoffice
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/postoffice.gif \" alt= \" postoffice \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE677 : //docomo movie
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/movie.gif \" alt= \" movie \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE668 : //docomo atm
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/atm.gif \" alt= \" atm \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE688 : //docomo mobilephone
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mobilephone.gif \" alt= \" mobilephone \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6FA : //docomo shine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shine.gif \" alt= \" shine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE713 : //docomo bell
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bell.gif \" alt= \" bell \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE74B : //docomo bottle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bottle.gif \" alt= \" bottle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE754 : //docomo horse
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/horse.gif \" alt= \" horse \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE751 : //docomo fish
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fish.gif \" alt= \" fish \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE659 : //docomo motorsports
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/motorsports.gif \" alt= \" motorsports \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE6D3 : //docomo mail
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mail.gif \" alt= \" mail \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
2010-08-17 22:48:55 -04:00
// These emoji codepoints are generated by tools/make_emoji in the K-9 source tree
// The spaces between the < and the img are a hack to avoid triggering
// K-9's 'load images' button
2010-08-01 21:24:40 -04:00
2010-08-11 22:22:35 -04:00
case 0xE223 : //softbank eight
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eight.gif \" alt= \" eight \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE415 : //softbank coldsweats01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/coldsweats01.gif \" alt= \" coldsweats01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE21F : //softbank four
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/four.gif \" alt= \" four \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE125 : //softbank ticket
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ticket.gif \" alt= \" ticket \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE148 : //softbank book
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/book.gif \" alt= \" book \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE242 : //softbank cancer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cancer.gif \" alt= \" cancer \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE31C : //softbank rouge
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rouge.gif \" alt= \" rouge \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE252 : //softbank danger
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/danger.gif \" alt= \" danger \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE011 : //softbank scissors
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/scissors.gif \" alt= \" scissors \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE342 : //softbank riceball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/riceball.gif \" alt= \" riceball \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE04B : //softbank rain
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rain.gif \" alt= \" rain \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE03E : //softbank note
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/note.gif \" alt= \" note \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE43C : //softbank sprinkle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sprinkle.gif \" alt= \" sprinkle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE20A : //softbank wheelchair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wheelchair.gif \" alt= \" wheelchair \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE42A : //softbank basketball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/basketball.gif \" alt= \" basketball \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE03D : //softbank movie
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/movie.gif \" alt= \" movie \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE30E : //softbank smoking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/smoking.gif \" alt= \" smoking \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE003 : //softbank kissmark
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/kissmark.gif \" alt= \" kissmark \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE21C : //softbank one
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/one.gif \" alt= \" one \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE237 : //softbank upwardleft
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/upwardleft.gif \" alt= \" upwardleft \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE407 : //softbank sad
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sad.gif \" alt= \" sad \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE03B : //softbank fuji
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fuji.gif \" alt= \" fuji \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE40E : //softbank gawk
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gawk.gif \" alt= \" gawk \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE245 : //softbank libra
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/libra.gif \" alt= \" libra \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE24A : //softbank pisces
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pisces.gif \" alt= \" pisces \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE443 : //softbank typhoon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/typhoon.gif \" alt= \" typhoon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE052 : //softbank dog
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dog.gif \" alt= \" dog \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE244 : //softbank virgo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/virgo.gif \" alt= \" virgo \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE523 : //softbank chick
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/chick.gif \" alt= \" chick \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE023 : //softbank heart03
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart03.gif \" alt= \" heart03 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE325 : //softbank bell
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bell.gif \" alt= \" bell \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE239 : //softbank downwardleft
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/downwardleft.gif \" alt= \" downwardleft \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE20C : //softbank heart
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart.gif \" alt= \" heart \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE211 : //softbank freedial
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/freedial.gif \" alt= \" freedial \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE11F : //softbank chair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/chair.gif \" alt= \" chair \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE108 : //softbank coldsweats02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/coldsweats02.gif \" alt= \" coldsweats02 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE330 : //softbank dash
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dash.gif \" alt= \" dash \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE404 : //softbank smile
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/smile.gif \" alt= \" smile \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE304 : //softbank tulip
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tulip.gif \" alt= \" tulip \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE419 : //softbank eye
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eye.gif \" alt= \" eye \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE13D : //softbank thunder
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/thunder.gif \" alt= \" thunder \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE013 : //softbank ski
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ski.gif \" alt= \" ski \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE136 : //softbank bicycle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bicycle.gif \" alt= \" bicycle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE059 : //softbank angry
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/angry.gif \" alt= \" angry \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE01D : //softbank airplane
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/airplane.gif \" alt= \" airplane \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE048 : //softbank snow
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snow.gif \" alt= \" snow \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE435 : //softbank bullettrain
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bullettrain.gif \" alt= \" bullettrain \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE20E : //softbank spade
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/spade.gif \" alt= \" spade \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE247 : //softbank sagittarius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sagittarius.gif \" alt= \" sagittarius \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE157 : //softbank school
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/school.gif \" alt= \" school \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE10F : //softbank flair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/flair.gif \" alt= \" flair \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE502 : //softbank art
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/art.gif \" alt= \" art \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE338 : //softbank japanesetea
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/japanesetea.gif \" alt= \" japanesetea \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE34B : //softbank birthday
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/birthday.gif \" alt= \" birthday \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE22B : //softbank empty
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/empty.gif \" alt= \" empty \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE311 : //softbank bomb
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bomb.gif \" alt= \" bomb \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE012 : //softbank paper
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/paper.gif \" alt= \" paper \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE151 : //softbank toilet
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/toilet.gif \" alt= \" toilet \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE01A : //softbank horse
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/horse.gif \" alt= \" horse \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE03A : //softbank gasstation
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gasstation.gif \" alt= \" gasstation \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE03F : //softbank key
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/key.gif \" alt= \" key \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE00D : //softbank punch
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/punch.gif \" alt= \" punch \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE24D : //softbank ok
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ok.gif \" alt= \" ok \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE105 : //softbank bleah
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bleah.gif \" alt= \" bleah \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE00E : //softbank good
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/good.gif \" alt= \" good \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE154 : //softbank atm
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/atm.gif \" alt= \" atm \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE405 : //softbank wink
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wink.gif \" alt= \" wink \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE030 : //softbank cherryblossom
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cherryblossom.gif \" alt= \" cherryblossom \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE057 : //softbank happy01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/happy01.gif \" alt= \" happy01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE229 : //softbank id
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/id.gif \" alt= \" id \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE016 : //softbank baseball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/baseball.gif \" alt= \" baseball \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE044 : //softbank wine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wine.gif \" alt= \" wine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE115 : //softbank run
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/run.gif \" alt= \" run \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE14F : //softbank parking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/parking.gif \" alt= \" parking \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE327 : //softbank heart04
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart04.gif \" alt= \" heart04 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE014 : //softbank golf
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/golf.gif \" alt= \" golf \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE021 : //softbank sign01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign01.gif \" alt= \" sign01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE30A : //softbank music
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/music.gif \" alt= \" music \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE411 : //softbank crying
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/crying.gif \" alt= \" crying \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE536 : //softbank foot
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/foot.gif \" alt= \" foot \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE047 : //softbank beer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/beer.gif \" alt= \" beer \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE43E : //softbank wave
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wave.gif \" alt= \" wave \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE022 : //softbank heart01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart01.gif \" alt= \" heart01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE007 : //softbank shoe
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shoe.gif \" alt= \" shoe \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE010 : //softbank rock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rock.gif \" alt= \" rock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE32E : //softbank shine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shine.gif \" alt= \" shine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE055 : //softbank penguin
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/penguin.gif \" alt= \" penguin \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE03C : //softbank karaoke
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/karaoke.gif \" alt= \" karaoke \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE018 : //softbank soccer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/soccer.gif \" alt= \" soccer \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE159 : //softbank bus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bus.gif \" alt= \" bus \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE107 : //softbank shock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shock.gif \" alt= \" shock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE04A : //softbank sun
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sun.gif \" alt= \" sun \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE156 : //softbank 24hours
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/24hours.gif \" alt= \" 24hours \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE110 : //softbank clover
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clover.gif \" alt= \" clover \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE034 : //softbank ring
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ring.gif \" alt= \" ring \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE24F : //softbank r-mark
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/r-mark.gif \" alt= \" r-mark \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE112 : //softbank present
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/present.gif \" alt= \" present \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE14D : //softbank bank
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bank.gif \" alt= \" bank \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE42E : //softbank rvcar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rvcar.gif \" alt= \" rvcar \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE13E : //softbank boutique
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/boutique.gif \" alt= \" boutique \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE413 : //softbank weep
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/weep.gif \" alt= \" weep \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE241 : //softbank gemini
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gemini.gif \" alt= \" gemini \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE212 : //softbank new
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/new.gif \" alt= \" new \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE324 : //softbank slate
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/slate.gif \" alt= \" slate \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE220 : //softbank five
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/five.gif \" alt= \" five \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE503 : //softbank drama
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/drama.gif \" alt= \" drama \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE248 : //softbank capricornus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/capricornus.gif \" alt= \" capricornus \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE049 : //softbank cloud
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cloud.gif \" alt= \" cloud \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE243 : //softbank leo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/leo.gif \" alt= \" leo \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE326 : //softbank notes
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/notes.gif \" alt= \" notes \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE00B : //softbank faxto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/faxto.gif \" alt= \" faxto \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE221 : //softbank six
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/six.gif \" alt= \" six \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE240 : //softbank taurus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/taurus.gif \" alt= \" taurus \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE24E : //softbank copyright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/copyright.gif \" alt= \" copyright \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE224 : //softbank nine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/nine.gif \" alt= \" nine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE008 : //softbank camera
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/camera.gif \" alt= \" camera \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE01E : //softbank train
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/train.gif \" alt= \" train \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE20D : //softbank diamond
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/diamond.gif \" alt= \" diamond \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE009 : //softbank telephone
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/telephone.gif \" alt= \" telephone \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE019 : //softbank fish
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fish.gif \" alt= \" fish \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE01C : //softbank yacht
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/yacht.gif \" alt= \" yacht \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE40A : //softbank confident
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/confident.gif \" alt= \" confident \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE246 : //softbank scorpius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/scorpius.gif \" alt= \" scorpius \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE120 : //softbank fastfood
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fastfood.gif \" alt= \" fastfood \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE323 : //softbank bag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bag.gif \" alt= \" bag \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE345 : //softbank apple
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/apple.gif \" alt= \" apple \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE339 : //softbank bread
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bread.gif \" alt= \" bread \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE13C : //softbank sleepy
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sleepy.gif \" alt= \" sleepy \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE106 : //softbank lovely
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/lovely.gif \" alt= \" lovely \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE340 : //softbank noodle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/noodle.gif \" alt= \" noodle \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE20F : //softbank club
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/club.gif \" alt= \" club \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE114 : //softbank search
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/search.gif \" alt= \" search \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE10E : //softbank crown
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/crown.gif \" alt= \" crown \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE406 : //softbank wobbly
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wobbly.gif \" alt= \" wobbly \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE331 : //softbank sweat02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sweat02.gif \" alt= \" sweat02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE04F : //softbank cat
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cat.gif \" alt= \" cat \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE301 : //softbank memo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/memo.gif \" alt= \" memo \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE01B : //softbank car
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/car.gif \" alt= \" car \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE314 : //softbank ribbon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ribbon.gif \" alt= \" ribbon \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE315 : //softbank secret
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/secret.gif \" alt= \" secret \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE236 : //softbank up
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/up.gif \" alt= \" up \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE208 : //softbank nosmoking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/nosmoking.gif \" alt= \" nosmoking \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE006 : //softbank t-shirt
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/t-shirt.gif \" alt= \" t-shirt \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE12A : //softbank tv
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tv.gif \" alt= \" tv \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE238 : //softbank downwardright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/downwardright.gif \" alt= \" downwardright \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE10B : //softbank pig
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pig.gif \" alt= \" pig \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE126 : //softbank cd
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cd.gif \" alt= \" cd \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE402 : //softbank catface
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/catface.gif \" alt= \" catface \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE416 : //softbank pout
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pout.gif \" alt= \" pout \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE045 : //softbank cafe
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cafe.gif \" alt= \" cafe \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE41B : //softbank ear
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ear.gif \" alt= \" ear \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE23F : //softbank aries
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/aries.gif \" alt= \" aries \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE21E : //softbank three
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/three.gif \" alt= \" three \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE056 : //softbank delicious
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/delicious.gif \" alt= \" delicious \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE14E : //softbank signaler
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/signaler.gif \" alt= \" signaler \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE155 : //softbank hospital
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hospital.gif \" alt= \" hospital \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE033 : //softbank xmas
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/xmas.gif \" alt= \" xmas \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE22A : //softbank full
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/full.gif \" alt= \" full \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE123 : //softbank spa
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/spa.gif \" alt= \" spa \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE132 : //softbank motorsports
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/motorsports.gif \" alt= \" motorsports \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE434 : //softbank subway
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/subway.gif \" alt= \" subway \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE403 : //softbank think
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/think.gif \" alt= \" think \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE043 : //softbank restaurant
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/restaurant.gif \" alt= \" restaurant \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE537 : //softbank tm
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tm.gif \" alt= \" tm \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE058 : //softbank despair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/despair.gif \" alt= \" despair \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE04C : //softbank moon3
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon3.gif \" alt= \" moon3 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE21D : //softbank two
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/two.gif \" alt= \" two \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE202 : //softbank ship
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ship.gif \" alt= \" ship \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE30B : //softbank bottle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bottle.gif \" alt= \" bottle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE118 : //softbank maple
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/maple.gif \" alt= \" maple \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE103 : //softbank loveletter
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/loveletter.gif \" alt= \" loveletter \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE225 : //softbank zero
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/zero.gif \" alt= \" zero \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE00C : //softbank pc
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pc.gif \" alt= \" pc \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE210 : //softbank sharp
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sharp.gif \" alt= \" sharp \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE015 : //softbank tennis
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tennis.gif \" alt= \" tennis \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE038 : //softbank building
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/building.gif \" alt= \" building \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE02D : //softbank clock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clock.gif \" alt= \" clock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE334 : //softbank annoy
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/annoy.gif \" alt= \" annoy \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE153 : //softbank postoffice
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/postoffice.gif \" alt= \" postoffice \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE222 : //softbank seven
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/seven.gif \" alt= \" seven \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE12F : //softbank dollar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dollar.gif \" alt= \" dollar \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE00A : //softbank mobilephone
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mobilephone.gif \" alt= \" mobilephone \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE158 : //softbank hotel
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hotel.gif \" alt= \" hotel \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE249 : //softbank aquarius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/aquarius.gif \" alt= \" aquarius \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE036 : //softbank house
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/house.gif \" alt= \" house \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE046 : //softbank cake
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cake.gif \" alt= \" cake \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE104 : //softbank phoneto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/phoneto.gif \" alt= \" phoneto \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE44B : //softbank night
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/night.gif \" alt= \" night \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE313 : //softbank hairsalon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hairsalon.gif \" alt= \" hairsalon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
2010-08-17 22:48:55 -04:00
// These emoji codepoints are generated by tools/make_emoji in the K-9 source tree
// The spaces between the < and the img are a hack to avoid triggering
// K-9's 'load images' button
2010-08-01 21:24:40 -04:00
2010-08-11 22:22:35 -04:00
case 0xE488 : //kddi sun
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sun.gif \" alt= \" sun \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEA88 : //kddi id
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/id.gif \" alt= \" id \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4BA : //kddi baseball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/baseball.gif \" alt= \" baseball \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE525 : //kddi four
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/four.gif \" alt= \" four \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE578 : //kddi free
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/free.gif \" alt= \" free \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4C1 : //kddi wine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wine.gif \" alt= \" wine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE512 : //kddi bell
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bell.gif \" alt= \" bell \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB83 : //kddi rock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rock.gif \" alt= \" rock \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4D0 : //kddi cake
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cake.gif \" alt= \" cake \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE473 : //kddi crying
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/crying.gif \" alt= \" crying \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE48C : //kddi rain
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rain.gif \" alt= \" rain \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEAC2 : //kddi bearing
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bearing.gif \" alt= \" bearing \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE47E : //kddi nosmoking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/nosmoking.gif \" alt= \" nosmoking \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEAC0 : //kddi despair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/despair.gif \" alt= \" despair \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE559 : //kddi r-mark
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/r-mark.gif \" alt= \" r-mark \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB2D : //kddi up
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/up.gif \" alt= \" up \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEA89 : //kddi full
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/full.gif \" alt= \" full \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEAC9 : //kddi gawk
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gawk.gif \" alt= \" gawk \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB79 : //kddi recycle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/recycle.gif \" alt= \" recycle \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE5AC : //kddi zero
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/zero.gif \" alt= \" zero \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEAAE : //kddi japanesetea
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/japanesetea.gif \" alt= \" japanesetea \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB30 : //kddi sign03
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign03.gif \" alt= \" sign03 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4B6 : //kddi soccer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/soccer.gif \" alt= \" soccer \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE556 : //kddi downwardleft
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/downwardleft.gif \" alt= \" downwardleft \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4BE : //kddi slate
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/slate.gif \" alt= \" slate \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4A5 : //kddi toilet
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/toilet.gif \" alt= \" toilet \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
2010-08-17 22:48:55 -04:00
// Skipping kddi codepoint E523 two
// It conflicts with an earlier definition from another carrier:
// softbank chick
2010-08-01 21:24:40 -04:00
2010-08-11 22:22:35 -04:00
case 0xE496 : //kddi scorpius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/scorpius.gif \" alt= \" scorpius \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4C6 : //kddi game
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/game.gif \" alt= \" game \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A0 : //kddi birthday
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/birthday.gif \" alt= \" birthday \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5B8 : //kddi pc
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pc.gif \" alt= \" pc \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE516 : //kddi hairsalon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hairsalon.gif \" alt= \" hairsalon \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE475 : //kddi sleepy
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sleepy.gif \" alt= \" sleepy \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4A3 : //kddi atm
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/atm.gif \" alt= \" atm \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE59A : //kddi basketball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/basketball.gif \" alt= \" basketball \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE497 : //kddi sagittarius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sagittarius.gif \" alt= \" sagittarius \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEACD : //kddi delicious
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/delicious.gif \" alt= \" delicious \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE5A8 : //kddi newmoon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/newmoon.gif \" alt= \" newmoon \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE49E : //kddi ticket
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ticket.gif \" alt= \" ticket \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE5AE : //kddi wobbly
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wobbly.gif \" alt= \" wobbly \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4E6 : //kddi sweat02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sweat02.gif \" alt= \" sweat02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE59E : //kddi event
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/event.gif \" alt= \" event \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4AB : //kddi house
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/house.gif \" alt= \" house \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE491 : //kddi gemini
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gemini.gif \" alt= \" gemini \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4C9 : //kddi xmas
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/xmas.gif \" alt= \" xmas \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE5BE : //kddi note
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/note.gif \" alt= \" note \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB2F : //kddi sign02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign02.gif \" alt= \" sign02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE508 : //kddi music
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/music.gif \" alt= \" music \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5DF : //kddi hospital
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hospital.gif \" alt= \" hospital \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5BC : //kddi subway
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/subway.gif \" alt= \" subway \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5C9 : //kddi crown
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/crown.gif \" alt= \" crown \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4BC : //kddi spa
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/spa.gif \" alt= \" spa \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE514 : //kddi ring
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ring.gif \" alt= \" ring \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
2010-08-17 22:48:55 -04:00
// Skipping kddi codepoint E502 tv
// It conflicts with an earlier definition from another carrier:
// softbank art
2010-08-01 21:24:40 -04:00
2010-08-11 22:22:35 -04:00
case 0xE4AC : //kddi restaurant
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/restaurant.gif \" alt= \" restaurant \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE529 : //kddi eight
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eight.gif \" alt= \" eight \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE518 : //kddi search
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/search.gif \" alt= \" search \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE505 : //kddi notes
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/notes.gif \" alt= \" notes \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE498 : //kddi capricornus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/capricornus.gif \" alt= \" capricornus \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB7E : //kddi snail
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snail.gif \" alt= \" snail \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEA97 : //kddi bottle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bottle.gif \" alt= \" bottle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB08 : //kddi phoneto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/phoneto.gif \" alt= \" phoneto \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4D2 : //kddi cherry
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cherry.gif \" alt= \" cherry \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE54D : //kddi downwardright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/downwardright.gif \" alt= \" downwardright \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5C3 : //kddi wink
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wink.gif \" alt= \" wink \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAAC : //kddi ski
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ski.gif \" alt= \" ski \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE515 : //kddi camera
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/camera.gif \" alt= \" camera \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5B6 : //kddi t-shirt
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/t-shirt.gif \" alt= \" t-shirt \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5C4 : //kddi lovely
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/lovely.gif \" alt= \" lovely \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4AD : //kddi building
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/building.gif \" alt= \" building \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4CE : //kddi maple
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/maple.gif \" alt= \" maple \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5AA : //kddi moon2
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon2.gif \" alt= \" moon2 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5B4 : //kddi noodle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/noodle.gif \" alt= \" noodle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A6 : //kddi scissors
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/scissors.gif \" alt= \" scissors \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4AA : //kddi bank
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bank.gif \" alt= \" bank \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4B5 : //kddi train
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/train.gif \" alt= \" train \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE477 : //kddi heart03
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart03.gif \" alt= \" heart03 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE481 : //kddi danger
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/danger.gif \" alt= \" danger \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE597 : //kddi cafe
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cafe.gif \" alt= \" cafe \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB2B : //kddi shoe
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shoe.gif \" alt= \" shoe \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB7C : //kddi wave
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wave.gif \" alt= \" wave \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE471 : //kddi happy01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/happy01.gif \" alt= \" happy01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4CA : //kddi cherryblossom
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cherryblossom.gif \" alt= \" cherryblossom \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4D5 : //kddi riceball
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/riceball.gif \" alt= \" riceball \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE587 : //kddi wrench
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wrench.gif \" alt= \" wrench \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB2A : //kddi foot
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/foot.gif \" alt= \" foot \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE47D : //kddi smoking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/smoking.gif \" alt= \" smoking \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4DC : //kddi penguin
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/penguin.gif \" alt= \" penguin \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4B3 : //kddi airplane
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/airplane.gif \" alt= \" airplane \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4DE : //kddi pig
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pig.gif \" alt= \" pig \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE59B : //kddi pocketbell
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pocketbell.gif \" alt= \" pocketbell \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4AF : //kddi bus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bus.gif \" alt= \" bus \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4A6 : //kddi parking
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/parking.gif \" alt= \" parking \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE486 : //kddi moon3
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon3.gif \" alt= \" moon3 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A4 : //kddi eye
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eye.gif \" alt= \" eye \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE50C : //kddi cd
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cd.gif \" alt= \" cd \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE54C : //kddi upwardleft
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/upwardleft.gif \" alt= \" upwardleft \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEA82 : //kddi ship
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ship.gif \" alt= \" ship \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4B1 : //kddi car
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/car.gif \" alt= \" car \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB80 : //kddi smile
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/smile.gif \" alt= \" smile \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE5B0 : //kddi impact
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/impact.gif \" alt= \" impact \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE504 : //kddi moneybag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moneybag.gif \" alt= \" moneybag \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4B9 : //kddi motorsports
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/motorsports.gif \" alt= \" motorsports \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE494 : //kddi virgo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/virgo.gif \" alt= \" virgo \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE595 : //kddi heart01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart01.gif \" alt= \" heart01 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB03 : //kddi pen
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pen.gif \" alt= \" pen \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE57D : //kddi yen
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/yen.gif \" alt= \" yen \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE598 : //kddi mist
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mist.gif \" alt= \" mist \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE5A2 : //kddi diamond
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/diamond.gif \" alt= \" diamond \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4A4 : //kddi 24hours
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/24hours.gif \" alt= \" 24hours \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE524 : //kddi three
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/three.gif \" alt= \" three \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB7B : //kddi updown
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/updown.gif \" alt= \" updown \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A1 : //kddi spade
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/spade.gif \" alt= \" spade \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE495 : //kddi libra
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/libra.gif \" alt= \" libra \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE588 : //kddi mobilephone
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mobilephone.gif \" alt= \" mobilephone \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE599 : //kddi golf
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/golf.gif \" alt= \" golf \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE520 : //kddi faxto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/faxto.gif \" alt= \" faxto \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
2010-08-17 22:48:55 -04:00
// Skipping kddi codepoint E503 karaoke
// It conflicts with an earlier definition from another carrier:
// softbank drama
2010-08-01 21:24:40 -04:00
2010-08-11 22:22:35 -04:00
case 0xE4D6 : //kddi fastfood
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fastfood.gif \" alt= \" fastfood \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4A1 : //kddi pencil
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pencil.gif \" alt= \" pencil \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE522 : //kddi one
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/one.gif \" alt= \" one \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB84 : //kddi sharp
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sharp.gif \" alt= \" sharp \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE476 : //kddi flair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/flair.gif \" alt= \" flair \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE46B : //kddi run
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/run.gif \" alt= \" run \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAF5 : //kddi drama
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/drama.gif \" alt= \" drama \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAB9 : //kddi apple
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/apple.gif \" alt= \" apple \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4EB : //kddi kissmark
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/kissmark.gif \" alt= \" kissmark \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE55D : //kddi enter
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/enter.gif \" alt= \" enter \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE59F : //kddi ribbon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ribbon.gif \" alt= \" ribbon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE526 : //kddi five
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/five.gif \" alt= \" five \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE571 : //kddi gasstation
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/gasstation.gif \" alt= \" gasstation \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE517 : //kddi movie
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/movie.gif \" alt= \" movie \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4B8 : //kddi snowboard
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snowboard.gif \" alt= \" snowboard \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAE8 : //kddi sprinkle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sprinkle.gif \" alt= \" sprinkle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEA80 : //kddi school
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/school.gif \" alt= \" school \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE47C : //kddi sandclock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sandclock.gif \" alt= \" sandclock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB31 : //kddi sign05
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign05.gif \" alt= \" sign05 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5AB : //kddi clear
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clear.gif \" alt= \" clear \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5DE : //kddi postoffice
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/postoffice.gif \" alt= \" postoffice \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB62 : //kddi mailto
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mailto.gif \" alt= \" mailto \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE528 : //kddi seven
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/seven.gif \" alt= \" seven \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4C2 : //kddi bar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bar.gif \" alt= \" bar \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE487 : //kddi thunder
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/thunder.gif \" alt= \" thunder \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A9 : //kddi moon1
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/moon1.gif \" alt= \" moon1 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB7A : //kddi leftright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/leftright.gif \" alt= \" leftright \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE513 : //kddi clover
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clover.gif \" alt= \" clover \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE492 : //kddi cancer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cancer.gif \" alt= \" cancer \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB78 : //kddi loveletter
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/loveletter.gif \" alt= \" loveletter \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4E0 : //kddi chick
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/chick.gif \" alt= \" chick \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4CF : //kddi present
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/present.gif \" alt= \" present \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE478 : //kddi heart04
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart04.gif \" alt= \" heart04 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAC3 : //kddi sad
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sad.gif \" alt= \" sad \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE52A : //kddi nine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/nine.gif \" alt= \" nine \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE482 : //kddi sign01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sign01.gif \" alt= \" sign01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEABF : //kddi catface
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/catface.gif \" alt= \" catface \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE527 : //kddi six
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/six.gif \" alt= \" six \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE52C : //kddi mobaq
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mobaq.gif \" alt= \" mobaq \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE485 : //kddi snow
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/snow.gif \" alt= \" snow \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4B7 : //kddi tennis
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tennis.gif \" alt= \" tennis \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5BD : //kddi fuji
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/fuji.gif \" alt= \" fuji \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE558 : //kddi copyright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/copyright.gif \" alt= \" copyright \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4D8 : //kddi horse
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/horse.gif \" alt= \" horse \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4B0 : //kddi bullettrain
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bullettrain.gif \" alt= \" bullettrain \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE596 : //kddi telephone
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/telephone.gif \" alt= \" telephone \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE48F : //kddi aries
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/aries.gif \" alt= \" aries \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE46A : //kddi signaler
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/signaler.gif \" alt= \" signaler \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE472 : //kddi angry
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/angry.gif \" alt= \" angry \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE54E : //kddi tm
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tm.gif \" alt= \" tm \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE51A : //kddi boutique
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/boutique.gif \" alt= \" boutique \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE493 : //kddi leo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/leo.gif \" alt= \" leo \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A3 : //kddi club
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/club.gif \" alt= \" club \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE499 : //kddi aquarius
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/aquarius.gif \" alt= \" aquarius \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4AE : //kddi bicycle
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bicycle.gif \" alt= \" bicycle \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4E7 : //kddi bleah
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bleah.gif \" alt= \" bleah \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE49F : //kddi book
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/book.gif \" alt= \" book \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5AD : //kddi ok
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ok.gif \" alt= \" ok \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A7 : //kddi paper
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/paper.gif \" alt= \" paper \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4E5 : //kddi annoy
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/annoy.gif \" alt= \" annoy \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4A0 : //kddi clip
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clip.gif \" alt= \" clip \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE509 : //kddi rouge
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/rouge.gif \" alt= \" rouge \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAAF : //kddi bread
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bread.gif \" alt= \" bread \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE519 : //kddi key
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/key.gif \" alt= \" key \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE594 : //kddi clock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/clock.gif \" alt= \" clock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB7D : //kddi bud
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bud.gif \" alt= \" bud \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEA8A : //kddi empty
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/empty.gif \" alt= \" empty \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5B5 : //kddi new
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/new.gif \" alt= \" new \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE47A : //kddi bomb
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bomb.gif \" alt= \" bomb \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5C6 : //kddi coldsweats02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/coldsweats02.gif \" alt= \" coldsweats02 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE49A : //kddi pisces
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pisces.gif \" alt= \" pisces \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4F3 : //kddi punch
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/punch.gif \" alt= \" punch \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB5D : //kddi pout
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/pout.gif \" alt= \" pout \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE469 : //kddi typhoon
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/typhoon.gif \" alt= \" typhoon \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5B1 : //kddi sweat01
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/sweat01.gif \" alt= \" sweat01 \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4C7 : //kddi dollar
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dollar.gif \" alt= \" dollar \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5C5 : //kddi shock
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shock.gif \" alt= \" shock \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4F9 : //kddi good
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/good.gif \" alt= \" good \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4F1 : //kddi secret
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/secret.gif \" alt= \" secret \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4E4 : //kddi tulip
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/tulip.gif \" alt= \" tulip \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEA81 : //kddi hotel
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/hotel.gif \" alt= \" hotel \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4FE : //kddi eyeglass
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/eyeglass.gif \" alt= \" eyeglass \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAF1 : //kddi night
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/night.gif \" alt= \" night \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE555 : //kddi upwardright
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/upwardright.gif \" alt= \" upwardright \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB2E : //kddi down
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/down.gif \" alt= \" down \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4DB : //kddi cat
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cat.gif \" alt= \" cat \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE59C : //kddi art
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/art.gif \" alt= \" art \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB69 : //kddi weep
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/weep.gif \" alt= \" weep \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4F4 : //kddi dash
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dash.gif \" alt= \" dash \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE490 : //kddi taurus
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/taurus.gif \" alt= \" taurus \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE57A : //kddi watch
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/watch.gif \" alt= \" watch \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB2C : //kddi flag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/flag.gif \" alt= \" flag \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB77 : //kddi denim
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/denim.gif \" alt= \" denim \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEAC5 : //kddi confident
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/confident.gif \" alt= \" confident \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4B4 : //kddi yacht
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/yacht.gif \" alt= \" yacht \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE49C : //kddi bag
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/bag.gif \" alt= \" bag \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE5A5 : //kddi ear
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/ear.gif \" alt= \" ear \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE4E1 : //kddi dog
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/dog.gif \" alt= \" dog \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xE521 : //kddi mail
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/mail.gif \" alt= \" mail \" /> " ) ;
2010-08-11 22:22:35 -04:00
break ;
case 0xEB35 : //kddi banana
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/banana.gif \" alt= \" banana \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEAA5 : //kddi heart
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart.gif \" alt= \" heart \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE47F : //kddi wheelchair
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/wheelchair.gif \" alt= \" wheelchair \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEB75 : //kddi heart02
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/heart02.gif \" alt= \" heart02 \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE48D : //kddi cloud
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/cloud.gif \" alt= \" cloud \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xE4C3 : //kddi beer
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/beer.gif \" alt= \" beer \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEAAB : //kddi shine
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/shine.gif \" alt= \" shine \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
2010-08-11 22:22:35 -04:00
case 0xEA92 : //kddi memo
2010-08-15 10:52:59 -04:00
buff . append ( " <img src= \" file:///android_asset/emoticons/memo.gif \" alt= \" memo \" /> " ) ;
2010-08-01 21:24:40 -04:00
break ;
default :
buff . append ( ( char ) c ) ;
} //switch
}
}
catch ( IOException e )
{
//Should never happen
Log . e ( K9 . LOG_TAG , null , e ) ;
}
return buff . toString ( ) ;
}
2010-03-07 12:02:21 -05:00
@Override
public boolean isInTopGroup ( )
{
return inTopGroup ;
}
2010-04-29 00:59:14 -04:00
2010-03-07 12:02:21 -05:00
public void setInTopGroup ( boolean inTopGroup )
{
this . inTopGroup = inTopGroup ;
}
2011-01-02 04:01:23 -05:00
public Integer getLastUid ( )
{
return mLastUid ;
}
public void updateLastUid ( ) throws MessagingException
{
Integer lastUid = database . execute ( false , new DbCallback < Integer > ( )
{
@Override
public Integer doDbWork ( final SQLiteDatabase db )
{
Cursor cursor = null ;
try
{
open ( OpenMode . READ_ONLY ) ;
cursor = db . rawQuery ( " SELECT MAX(uid) FROM messages WHERE folder_id=? " , new String [ ] { Long . toString ( mFolderId ) } ) ;
if ( cursor . getCount ( ) > 0 )
{
cursor . moveToFirst ( ) ;
return cursor . getInt ( 0 ) ;
}
}
catch ( Exception e )
{
Log . e ( K9 . LOG_TAG , " Unable to updateLastUid: " , e ) ;
}
finally
{
if ( cursor ! = null )
{
cursor . close ( ) ;
}
}
return null ;
}
} ) ;
if ( K9 . DEBUG )
Log . d ( K9 . LOG_TAG , " Updated last UID for folder " + mName + " to " + lastUid ) ;
mLastUid = lastUid ;
}
2008-11-01 17:32:06 -04:00
}
2010-12-14 14:26:57 -05:00
public static class LocalTextBody extends TextBody
2009-11-24 19:40:29 -05:00
{
2010-12-29 02:34:57 -05:00
/ * *
* This is an HTML - ified version of the message for display purposes .
* /
2009-05-20 00:36:20 -04:00
private String mBodyForDisplay ;
2009-11-24 19:40:29 -05:00
public LocalTextBody ( String body )
{
2009-05-20 00:36:20 -04:00
super ( body ) ;
}
2010-12-01 01:32:29 -05:00
public LocalTextBody ( String body , String bodyForDisplay )
{
2009-05-20 00:36:20 -04:00
super ( body ) ;
this . mBodyForDisplay = bodyForDisplay ;
}
2009-11-24 19:40:29 -05:00
public String getBodyForDisplay ( )
{
2009-05-20 00:36:20 -04:00
return mBodyForDisplay ;
}
2009-11-24 19:40:29 -05:00
public void setBodyForDisplay ( String mBodyForDisplay )
{
2009-05-20 00:36:20 -04:00
this . mBodyForDisplay = mBodyForDisplay ;
}
} //LocalTextBody
2009-11-24 19:40:29 -05:00
public class LocalMessage extends MimeMessage
{
2008-11-01 17:32:06 -04:00
private long mId ;
private int mAttachmentCount ;
2009-12-01 08:45:28 -05:00
private String mSubject ;
2010-01-12 22:36:36 -05:00
private String mPreview = " " ;
2010-11-26 23:03:10 -05:00
private boolean mToMeCalculated = false ;
private boolean mCcMeCalculated = false ;
private boolean mToMe = false ;
private boolean mCcMe = false ;
2009-12-14 21:51:18 -05:00
private boolean mHeadersLoaded = false ;
2009-12-06 23:46:42 -05:00
private boolean mMessageDirty = false ;
public LocalMessage ( )
{
}
2010-12-01 01:32:29 -05:00
LocalMessage ( String uid , Folder folder )
{
2009-12-06 23:46:42 -05:00
this . mUid = uid ;
this . mFolder = folder ;
}
2009-12-27 11:52:57 -05:00
private void populateFromGetMessageCursor ( Cursor cursor )
throws MessagingException
{
2010-10-02 14:45:51 -04:00
final String subject = cursor . getString ( 0 ) ;
this . setSubject ( subject = = null ? " " : subject ) ;
2009-12-27 11:52:57 -05:00
Address [ ] from = Address . unpack ( cursor . getString ( 1 ) ) ;
if ( from . length > 0 )
{
this . setFrom ( from [ 0 ] ) ;
}
this . setInternalSentDate ( new Date ( cursor . getLong ( 2 ) ) ) ;
this . setUid ( cursor . getString ( 3 ) ) ;
String flagList = cursor . getString ( 4 ) ;
if ( flagList ! = null & & flagList . length ( ) > 0 )
{
String [ ] flags = flagList . split ( " , " ) ;
2010-04-29 00:59:14 -04:00
2010-04-25 02:17:15 -04:00
for ( String flag : flags )
2009-12-27 11:52:57 -05:00
{
2010-04-25 02:17:15 -04:00
try
2009-12-27 11:52:57 -05:00
{
this . setFlagInternal ( Flag . valueOf ( flag ) , true ) ;
}
2010-04-29 00:59:14 -04:00
2010-04-25 02:17:15 -04:00
catch ( Exception e )
{
2010-08-29 19:39:26 -04:00
if ( ! " X_BAD_FLAG " . equals ( flag ) )
2010-04-25 02:17:15 -04:00
{
Log . w ( K9 . LOG_TAG , " Unable to parse flag " + flag ) ;
}
}
2009-12-27 11:52:57 -05:00
}
}
this . mId = cursor . getLong ( 5 ) ;
this . setRecipients ( RecipientType . TO , Address . unpack ( cursor . getString ( 6 ) ) ) ;
this . setRecipients ( RecipientType . CC , Address . unpack ( cursor . getString ( 7 ) ) ) ;
this . setRecipients ( RecipientType . BCC , Address . unpack ( cursor . getString ( 8 ) ) ) ;
this . setReplyTo ( Address . unpack ( cursor . getString ( 9 ) ) ) ;
2010-04-05 22:54:48 -04:00
2009-12-27 11:52:57 -05:00
this . mAttachmentCount = cursor . getInt ( 10 ) ;
this . setInternalDate ( new Date ( cursor . getLong ( 11 ) ) ) ;
this . setMessageId ( cursor . getString ( 12 ) ) ;
2010-10-02 14:45:51 -04:00
final String preview = cursor . getString ( 14 ) ;
mPreview = ( preview = = null ? " " : preview ) ;
2009-12-27 12:22:26 -05:00
if ( this . mFolder = = null )
2009-12-27 11:53:51 -05:00
{
LocalFolder f = new LocalFolder ( cursor . getInt ( 13 ) ) ;
f . open ( LocalFolder . OpenMode . READ_WRITE ) ;
this . mFolder = f ;
}
2009-12-27 11:52:57 -05:00
}
2010-12-29 02:34:57 -05:00
/ * *
* Fetch the message text for display . This always returns an HTML - ified version of the
* message , even if it was originally a text - only message .
* @return HTML version of message for display purposes .
* @throws MessagingException
* /
public String getTextForDisplay ( ) throws MessagingException
2010-12-28 04:07:39 -05:00
{
2010-12-29 02:34:57 -05:00
String text ; // First try and fetch an HTML part.
2010-12-28 04:07:39 -05:00
Part part = MimeUtility . findFirstPartByMimeType ( this , " text/html " ) ;
if ( part = = null )
{
// If that fails, try and get a text part.
part = MimeUtility . findFirstPartByMimeType ( this , " text/plain " ) ;
if ( part = = null )
{
text = null ;
}
else
{
LocalStore . LocalTextBody body = ( LocalStore . LocalTextBody ) part . getBody ( ) ;
if ( body = = null )
{
text = null ;
}
else
{
text = body . getBodyForDisplay ( ) ;
}
}
}
else
{
// We successfully found an HTML part; do the necessary character set decoding.
text = MimeUtility . getTextFromPart ( part ) ;
}
return text ;
}
2009-12-06 23:46:42 -05:00
/ * Custom version of writeTo that updates the MIME message based on localMessage
* changes .
* /
2010-04-16 08:20:10 -04:00
@Override
2009-12-06 23:46:42 -05:00
public void writeTo ( OutputStream out ) throws IOException , MessagingException
{
if ( mMessageDirty ) buildMimeRepresentation ( ) ;
super . writeTo ( out ) ;
}
private void buildMimeRepresentation ( ) throws MessagingException
2009-12-01 08:45:28 -05:00
{
2009-12-06 23:46:42 -05:00
if ( ! mMessageDirty )
2009-12-01 08:45:28 -05:00
{
2009-12-06 23:46:42 -05:00
return ;
2009-12-01 08:45:28 -05:00
}
2009-12-06 23:46:42 -05:00
super . setSubject ( mSubject ) ;
if ( this . mFrom ! = null & & this . mFrom . length > 0 )
2009-12-01 08:45:28 -05:00
{
2009-12-06 23:46:42 -05:00
super . setFrom ( this . mFrom [ 0 ] ) ;
2009-12-01 08:45:28 -05:00
}
2009-12-06 23:46:42 -05:00
super . setReplyTo ( mReplyTo ) ;
super . setSentDate ( this . getSentDate ( ) ) ;
super . setRecipients ( RecipientType . TO , mTo ) ;
super . setRecipients ( RecipientType . CC , mCc ) ;
super . setRecipients ( RecipientType . BCC , mBcc ) ;
2009-12-07 23:58:10 -05:00
if ( mMessageId ! = null ) super . setMessageId ( mMessageId ) ;
2009-12-06 23:46:42 -05:00
mMessageDirty = false ;
2009-12-01 08:45:28 -05:00
}
2010-01-13 20:07:28 -05:00
public String getPreview ( )
{
return mPreview ;
2010-01-12 22:36:36 -05:00
}
2009-12-06 23:46:42 -05:00
2009-12-01 08:45:28 -05:00
@Override
2010-11-12 20:47:08 -05:00
public String getSubject ( )
2009-12-01 08:45:28 -05:00
{
2009-12-06 23:46:42 -05:00
return mSubject ;
2009-12-01 08:45:28 -05:00
}
2009-12-06 23:46:42 -05:00
@Override
public void setSubject ( String subject ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2009-12-06 23:46:42 -05:00
mSubject = subject ;
mMessageDirty = true ;
r62972@17h: jesse | 2009-05-07 10:49:32 -0400
First stab at a folderlist that doesn't know or care about messages
r62973@17h: jesse | 2009-05-07 10:50:11 -0400
A very broken first stab at a message list that only knows about one folder.
r62974@17h: jesse | 2009-05-07 10:50:44 -0400
When you go from an account list to an individual account, open a folderlist, not an fml
r62975@17h: jesse | 2009-05-07 10:51:24 -0400
Update Welcome activity to open an ml instead of an fml
r62976@17h: jesse | 2009-05-07 10:51:59 -0400
When setting up accounts is over, open an fl instead of an fml
r62977@17h: jesse | 2009-05-07 10:52:51 -0400
Update MessageView to use folderinfoholders and messageinfoholders from the 'correct' classes.
r62978@17h: jesse | 2009-05-07 10:59:07 -0400
MailService now notifies the fl instead of the fml. Not sure if it should also notify the ml. - will require testing
r62979@17h: jesse | 2009-05-07 11:01:09 -0400
Switch MessagingController's notifications from notifying the FML to notifying an ML
r62980@17h: jesse | 2009-05-07 11:25:22 -0400
Update AndroidManifest to know about the new world order
r62981@17h: jesse | 2009-05-07 11:26:11 -0400
Try to follow the android sdk docs for intent creation
r62982@17h: jesse | 2009-05-07 11:28:30 -0400
reset MessageList for another try at the conversion
r62983@17h: jesse | 2009-05-07 11:47:33 -0400
This version doesn't crash and has a working 'folder' layer. now to clean up the message list layer
r62984@17h: jesse | 2009-05-07 15:18:04 -0400
move step 1
r62985@17h: jesse | 2009-05-07 15:18:37 -0400
move step 1
r62986@17h: jesse | 2009-05-07 15:22:47 -0400
rename step 1
r62987@17h: jesse | 2009-05-07 17:38:02 -0400
checkpoint to move
r62988@17h: jesse | 2009-05-07 17:40:01 -0400
checkpointing a state with a working folder list and a message list that doesn't explode
r62989@17h: jesse | 2009-05-07 17:40:26 -0400
Remove debugging cruft from Welcome
r62990@17h: jesse | 2009-05-07 22:00:12 -0400
Basic functionality works.
r62991@17h: jesse | 2009-05-08 04:19:52 -0400
added a tool to build a K-9 "Beta"
r62992@17h: jesse | 2009-05-08 04:20:03 -0400
remove a disused file
r62993@17h: jesse | 2009-05-09 06:07:02 -0400
upgrading build infrastructure for the 1.5 sdk
r62994@17h: jesse | 2009-05-09 06:22:02 -0400
further refine onOpenMessage, removing more folder assumptions
r62995@17h: jesse | 2009-05-09 20:07:20 -0400
Make the Welcome activity open the autoexpandfolder rather than INBOX
r62996@17h: jesse | 2009-05-09 20:14:10 -0400
MessageList now stores the Folder name it was working with across pause-reload
r62997@17h: jesse | 2009-05-09 20:14:26 -0400
Removing dead code from FolderList
r63060@17h: jesse | 2009-05-10 00:07:33 -0400
Replace the old message list refreshing code which cleared and rebuilt the list from scratch with code which updates or deletes existing messages.
Add "go back to folder list" code
r63061@17h: jesse | 2009-05-10 00:07:50 -0400
fix message list menus for new world order
r63062@17h: jesse | 2009-05-10 00:08:11 -0400
Remove message list options from folder list menus
r63063@17h: jesse | 2009-05-10 00:10:02 -0400
remove more message list options from the folder list
r63064@17h: jesse | 2009-05-10 00:10:19 -0400
fix build.xml for the new android world order
r63065@17h: jesse | 2009-05-10 00:39:23 -0400
reformatted in advance of bug tracing
r63066@17h: jesse | 2009-05-10 05:53:28 -0400
fix our 'close' behavior to not leave extra activities around
clean up more vestigal code
r63067@17h: jesse | 2009-05-10 18:44:25 -0400
Improve "back button / accounts" workflow from FolderList -> AccountList
r63068@17h: jesse | 2009-05-10 19:11:47 -0400
* Add required code for the 'k9beta' build
r63069@17h: jesse | 2009-05-10 19:12:05 -0400
Make the folder list white backgrounded.
r63070@17h: jesse | 2009-05-10 19:12:26 -0400
* Include our required libraries in build.xml
r63071@17h: jesse | 2009-05-10 19:13:07 -0400
Added directories for our built code and our generated code
r63072@17h: jesse | 2009-05-10 19:13:36 -0400
Added a "back" button image
r63073@17h: jesse | 2009-05-10 20:13:50 -0400
Switch next/prev buttons to triangles for I18N and eventual "more easy-to-hit buttons" win
r63074@17h: jesse | 2009-05-10 20:17:18 -0400
Tidy Accounts.java for some perf hacking.
r63081@17h: jesse | 2009-05-10 22:13:33 -0400
First pass reformatting of the MessagingController
r63082@17h: jesse | 2009-05-10 23:50:28 -0400
MessageList now correctly updates when a background sync happens
r63083@17h: jesse | 2009-05-10 23:50:53 -0400
Tidying FolderList
r63084@17h: jesse | 2009-05-10 23:51:09 -0400
tidy
r63085@17h: jesse | 2009-05-10 23:51:27 -0400
tidy
r63086@17h: jesse | 2009-05-11 00:17:06 -0400
Properly update unread counts in the FolderList after sync
r63087@17h: jesse | 2009-05-11 01:38:14 -0400
Minor refactoring for readability. replace a boolean with a constant.
r63090@17h: jesse | 2009-05-11 02:58:31 -0400
now that the foreground of message lists is light, we don't need the light messagebox
r63091@17h: jesse | 2009-05-11 17:15:02 -0400
Added a string for "back to folder list"
r63092@17h: jesse | 2009-05-11 17:15:24 -0400
Added a message list header with a back button
r63093@17h: jesse | 2009-05-11 17:15:54 -0400
Remove the "folder list" button from the options menu. no sense duplicating it
r63094@17h: jesse | 2009-05-11 17:17:06 -0400
Refactored views, adding our replacement scrollable header
r63184@17h: jesse | 2009-05-12 07:07:15 -0400
fix weird bug where message lists could show a header element for a child
r63185@17h: jesse | 2009-05-12 07:08:12 -0400
Add new-style headers to folder lists. reimplement "get folder by name" to not use a bloody for loop
r63211@17h: jesse | 2009-05-12 18:37:48 -0400
Restore the former glory of the "load more messages" widget. it still needs an overhaul
r63296@17h: jesse | 2009-05-12 23:23:21 -0400
Get the indeterminate progress bar to show up again when you click "get more messages"
r63297@17h: jesse | 2009-05-13 02:40:39 -0400
Fixed off-by-one errors in click and keybindings for messagelist
r63298@17h: jesse | 2009-05-13 06:04:01 -0400
Put the folder title in the name of the folderSettings popup
r63299@17h: jesse | 2009-05-13 06:04:49 -0400
Reformatting. Removing debug logging
r63300@17h: jesse | 2009-05-13 06:05:32 -0400
Fixing "wrong item selected" bugs in the FolderList
r63328@17h: jesse | 2009-05-13 13:20:00 -0400
Update MessageView for 1.5
r63329@17h: jesse | 2009-05-13 13:50:29 -0400
A couple fixes to "picking the right item"
Titles on the message context menu
r63330@17h: jesse | 2009-05-13 13:58:37 -0400
Added an "open" context menu item to the folder list
r63347@17h: jesse | 2009-05-13 18:00:02 -0400
Try to get folderlists to sort in a stable way, so they jump around less in the ui
r63349@17h: jesse | 2009-05-13 20:37:19 -0400
Switch to using non-message-passing based notifications for redisplay of message lists, cut down redisplay frequency to not overload the display
r63432@17h: jesse | 2009-05-16 13:38:49 -0400
Android 1.5 no longer gives us apache.commons.codec by default and apache.commons.logging by default. Import them so we have em.
There's probably something smarter to do here.
r63438@17h: jesse | 2009-05-16 14:12:06 -0400
removed dead code
r63439@17h: jesse | 2009-05-16 14:30:57 -0400
Minor tidy
r63440@17h: jesse | 2009-05-16 14:39:34 -0400
First pass implementation making MessageList streamy for faster startup
r63441@17h: jesse | 2009-05-16 21:57:41 -0400
There's no reason for the FolderList to list local messages
r63442@17h: jesse | 2009-05-16 21:58:57 -0400
Switch to actually refreshing the message list after each item is loaded
r63450@17h: jesse | 2009-05-16 22:34:18 -0400
Default to pulling items out of the LocalStore by date, descending. (since that's the uneditable default ordering)
This makes our messages come out of the store in the order the user should see them
r63451@17h: jesse | 2009-05-16 22:34:44 -0400
Set some new defaults for the FolderList
r63452@17h: jesse | 2009-05-16 22:35:43 -0400
set some new message list item defaults
r63456@17h: jesse | 2009-05-17 12:56:10 -0400
It's not clear that Pop and WebDav actually set us an InternalDate. I'd rather use that so that spam doesn't topsort. But I also want this to _work_
r63457@17h: jesse | 2009-05-17 12:56:47 -0400
actually check to make sure we have a message to remove before removing it.
r63458@17h: jesse | 2009-05-17 13:10:07 -0400
Flip "security type" to before the port number, since changing security type is the thing more users are likely to know/care about and resets port number
r63469@17h: jesse | 2009-05-17 18:42:39 -0400
Provisional fix for "see the FoldeRList twice" bug
r63471@17h: jesse | 2009-05-17 20:47:41 -0400
Remove title bar from the message view
r63544@17h: jesse | 2009-05-20 23:53:38 -0400
folderlist tidying before i dig into the jumpy ordering bug
r63545@17h: jesse | 2009-05-20 23:56:00 -0400
Killing dead variables
r63546@17h: jesse | 2009-05-21 00:58:36 -0400
make the whole title section clicky
r63556@17h: jesse | 2009-05-21 01:48:13 -0400
Fix where we go when someone deletes a message
r63558@17h: jesse | 2009-05-21 22:44:46 -0400
Working toward switchable themes
r63563@17h: jesse | 2009-05-21 23:53:09 -0400
Make the MessageList's colors actually just inherit from the theme, rather than hardcoding black
r63567@17h: jesse | 2009-05-22 10:14:13 -0400
Kill a now-redundant comment
r63571@17h: jesse | 2009-05-22 19:43:30 -0400
further theme-independence work
r63572@17h: jesse | 2009-05-22 19:55:23 -0400
gete -> get (typo fix)
r63573@17h: jesse | 2009-05-22 22:48:49 -0400
First cut of a global prefs system as well as a theme preference. not that it works yet
r63577@17h: jesse | 2009-05-24 14:49:52 -0400
Once a user has actually put in valid user credentials, start syncing mail and folders in the background instantly.
This gives us a much better "new startup" experience
r63578@17h: jesse | 2009-05-24 14:55:00 -0400
MessageList doesn't need FolderUpdateWorker
r63579@17h: jesse | 2009-05-24 17:57:15 -0400
Fix "get message by uid"
Switch to showing messages 10 by 10, rather than 1 by 1 for huge loadtime performance improvements
r63587@17h: jesse | 2009-05-24 19:19:56 -0400
Cut down LocalMessage creation to not generate a MessageId or date formatter.
r63589@17h: jesse | 2009-05-24 22:22:32 -0400
Switch to null-escaping email address boundaries, rather than a VERY expensive URL-encoding
r63590@17h: jesse | 2009-05-24 22:23:21 -0400
Clean up our "auto-refresh the list when adding messages after a sync"
r63593@17h: jesse | 2009-05-24 22:53:45 -0400
replace isDateToday with a "rolling 18 hour window" variant that's more likely to give the user a useful answer and is 30x faster.
r63595@17h: jesse | 2009-05-24 23:54:14 -0400
When instantiating messges from the LocalStore, there's no need to clear headers before setting them, nor is there a need to set a generated message id
r63596@17h: jesse | 2009-05-24 23:54:39 -0400
make an overridable setGeneratedMessageId
r63597@17h: jesse | 2009-05-24 23:54:55 -0400
Remove new lies from comments
r63598@17h: jesse | 2009-05-24 23:55:35 -0400
Replace insanely expensive message header "name" part quoting with something consistent and cheap that does its work on the way INTO the database
r63605@17h: jesse | 2009-05-25 17:28:24 -0400
bring back the 1.1 sdk build.xml
r63606@17h: jesse | 2009-05-25 22:32:11 -0400
Actually enable switchable themese and compilation on 1.1
r63692@17h: jesse | 2009-05-29 23:55:17 -0400
Switch back to having titles for folder and message lists.
Restore auto-open-folder functionality
r63694@17h: jesse | 2009-05-30 18:50:39 -0400
Remove several off-by-one errors introduced by yesterday's return to android titlebars
r63696@17h: jesse | 2009-05-30 23:45:03 -0400
use convertView properly for performance and memory imrpovement in FolderList and MessageList
r63698@17h: jesse | 2009-05-31 19:42:59 -0400
Switch to using background shading to indicate "not yet fetched"
r63701@17h: jesse | 2009-05-31 21:28:47 -0400
Remving code we don't actually need these bits of apache commons on 1.1
2009-05-31 21:35:05 -04:00
}
2008-11-01 17:32:06 -04:00
2009-12-06 23:46:42 -05:00
2010-04-16 08:20:10 -04:00
@Override
2009-12-07 23:58:10 -05:00
public void setMessageId ( String messageId )
2009-11-24 19:40:29 -05:00
{
2009-12-06 23:46:42 -05:00
mMessageId = messageId ;
mMessageDirty = true ;
2008-11-01 17:32:06 -04:00
}
2009-11-24 19:40:29 -05:00
2010-11-26 23:02:56 -05:00
public boolean hasAttachments ( )
{
2010-11-28 15:28:37 -05:00
if ( mAttachmentCount > 0 )
{
return true ;
}
else
{
return false ;
}
2010-11-26 23:02:56 -05:00
}
2009-12-06 23:46:42 -05:00
2009-11-24 19:40:29 -05:00
public int getAttachmentCount ( )
{
2008-11-01 17:32:06 -04:00
return mAttachmentCount ;
}
2010-04-16 08:20:10 -04:00
@Override
2009-12-06 23:46:42 -05:00
public void setFrom ( Address from ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2009-12-06 23:46:42 -05:00
this . mFrom = new Address [ ] { from } ;
mMessageDirty = true ;
2008-11-01 17:32:06 -04:00
}
2009-12-06 23:46:42 -05:00
2010-04-16 08:20:10 -04:00
@Override
2009-12-06 23:46:42 -05:00
public void setReplyTo ( Address [ ] replyTo ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2009-12-06 23:46:42 -05:00
if ( replyTo = = null | | replyTo . length = = 0 )
2009-11-24 19:40:29 -05:00
{
2009-12-06 23:46:42 -05:00
mReplyTo = null ;
2009-11-24 19:40:29 -05:00
}
else
{
2009-12-06 23:46:42 -05:00
mReplyTo = replyTo ;
2009-11-24 19:40:29 -05:00
}
2009-12-06 23:46:42 -05:00
mMessageDirty = true ;
r62972@17h: jesse | 2009-05-07 10:49:32 -0400
First stab at a folderlist that doesn't know or care about messages
r62973@17h: jesse | 2009-05-07 10:50:11 -0400
A very broken first stab at a message list that only knows about one folder.
r62974@17h: jesse | 2009-05-07 10:50:44 -0400
When you go from an account list to an individual account, open a folderlist, not an fml
r62975@17h: jesse | 2009-05-07 10:51:24 -0400
Update Welcome activity to open an ml instead of an fml
r62976@17h: jesse | 2009-05-07 10:51:59 -0400
When setting up accounts is over, open an fl instead of an fml
r62977@17h: jesse | 2009-05-07 10:52:51 -0400
Update MessageView to use folderinfoholders and messageinfoholders from the 'correct' classes.
r62978@17h: jesse | 2009-05-07 10:59:07 -0400
MailService now notifies the fl instead of the fml. Not sure if it should also notify the ml. - will require testing
r62979@17h: jesse | 2009-05-07 11:01:09 -0400
Switch MessagingController's notifications from notifying the FML to notifying an ML
r62980@17h: jesse | 2009-05-07 11:25:22 -0400
Update AndroidManifest to know about the new world order
r62981@17h: jesse | 2009-05-07 11:26:11 -0400
Try to follow the android sdk docs for intent creation
r62982@17h: jesse | 2009-05-07 11:28:30 -0400
reset MessageList for another try at the conversion
r62983@17h: jesse | 2009-05-07 11:47:33 -0400
This version doesn't crash and has a working 'folder' layer. now to clean up the message list layer
r62984@17h: jesse | 2009-05-07 15:18:04 -0400
move step 1
r62985@17h: jesse | 2009-05-07 15:18:37 -0400
move step 1
r62986@17h: jesse | 2009-05-07 15:22:47 -0400
rename step 1
r62987@17h: jesse | 2009-05-07 17:38:02 -0400
checkpoint to move
r62988@17h: jesse | 2009-05-07 17:40:01 -0400
checkpointing a state with a working folder list and a message list that doesn't explode
r62989@17h: jesse | 2009-05-07 17:40:26 -0400
Remove debugging cruft from Welcome
r62990@17h: jesse | 2009-05-07 22:00:12 -0400
Basic functionality works.
r62991@17h: jesse | 2009-05-08 04:19:52 -0400
added a tool to build a K-9 "Beta"
r62992@17h: jesse | 2009-05-08 04:20:03 -0400
remove a disused file
r62993@17h: jesse | 2009-05-09 06:07:02 -0400
upgrading build infrastructure for the 1.5 sdk
r62994@17h: jesse | 2009-05-09 06:22:02 -0400
further refine onOpenMessage, removing more folder assumptions
r62995@17h: jesse | 2009-05-09 20:07:20 -0400
Make the Welcome activity open the autoexpandfolder rather than INBOX
r62996@17h: jesse | 2009-05-09 20:14:10 -0400
MessageList now stores the Folder name it was working with across pause-reload
r62997@17h: jesse | 2009-05-09 20:14:26 -0400
Removing dead code from FolderList
r63060@17h: jesse | 2009-05-10 00:07:33 -0400
Replace the old message list refreshing code which cleared and rebuilt the list from scratch with code which updates or deletes existing messages.
Add "go back to folder list" code
r63061@17h: jesse | 2009-05-10 00:07:50 -0400
fix message list menus for new world order
r63062@17h: jesse | 2009-05-10 00:08:11 -0400
Remove message list options from folder list menus
r63063@17h: jesse | 2009-05-10 00:10:02 -0400
remove more message list options from the folder list
r63064@17h: jesse | 2009-05-10 00:10:19 -0400
fix build.xml for the new android world order
r63065@17h: jesse | 2009-05-10 00:39:23 -0400
reformatted in advance of bug tracing
r63066@17h: jesse | 2009-05-10 05:53:28 -0400
fix our 'close' behavior to not leave extra activities around
clean up more vestigal code
r63067@17h: jesse | 2009-05-10 18:44:25 -0400
Improve "back button / accounts" workflow from FolderList -> AccountList
r63068@17h: jesse | 2009-05-10 19:11:47 -0400
* Add required code for the 'k9beta' build
r63069@17h: jesse | 2009-05-10 19:12:05 -0400
Make the folder list white backgrounded.
r63070@17h: jesse | 2009-05-10 19:12:26 -0400
* Include our required libraries in build.xml
r63071@17h: jesse | 2009-05-10 19:13:07 -0400
Added directories for our built code and our generated code
r63072@17h: jesse | 2009-05-10 19:13:36 -0400
Added a "back" button image
r63073@17h: jesse | 2009-05-10 20:13:50 -0400
Switch next/prev buttons to triangles for I18N and eventual "more easy-to-hit buttons" win
r63074@17h: jesse | 2009-05-10 20:17:18 -0400
Tidy Accounts.java for some perf hacking.
r63081@17h: jesse | 2009-05-10 22:13:33 -0400
First pass reformatting of the MessagingController
r63082@17h: jesse | 2009-05-10 23:50:28 -0400
MessageList now correctly updates when a background sync happens
r63083@17h: jesse | 2009-05-10 23:50:53 -0400
Tidying FolderList
r63084@17h: jesse | 2009-05-10 23:51:09 -0400
tidy
r63085@17h: jesse | 2009-05-10 23:51:27 -0400
tidy
r63086@17h: jesse | 2009-05-11 00:17:06 -0400
Properly update unread counts in the FolderList after sync
r63087@17h: jesse | 2009-05-11 01:38:14 -0400
Minor refactoring for readability. replace a boolean with a constant.
r63090@17h: jesse | 2009-05-11 02:58:31 -0400
now that the foreground of message lists is light, we don't need the light messagebox
r63091@17h: jesse | 2009-05-11 17:15:02 -0400
Added a string for "back to folder list"
r63092@17h: jesse | 2009-05-11 17:15:24 -0400
Added a message list header with a back button
r63093@17h: jesse | 2009-05-11 17:15:54 -0400
Remove the "folder list" button from the options menu. no sense duplicating it
r63094@17h: jesse | 2009-05-11 17:17:06 -0400
Refactored views, adding our replacement scrollable header
r63184@17h: jesse | 2009-05-12 07:07:15 -0400
fix weird bug where message lists could show a header element for a child
r63185@17h: jesse | 2009-05-12 07:08:12 -0400
Add new-style headers to folder lists. reimplement "get folder by name" to not use a bloody for loop
r63211@17h: jesse | 2009-05-12 18:37:48 -0400
Restore the former glory of the "load more messages" widget. it still needs an overhaul
r63296@17h: jesse | 2009-05-12 23:23:21 -0400
Get the indeterminate progress bar to show up again when you click "get more messages"
r63297@17h: jesse | 2009-05-13 02:40:39 -0400
Fixed off-by-one errors in click and keybindings for messagelist
r63298@17h: jesse | 2009-05-13 06:04:01 -0400
Put the folder title in the name of the folderSettings popup
r63299@17h: jesse | 2009-05-13 06:04:49 -0400
Reformatting. Removing debug logging
r63300@17h: jesse | 2009-05-13 06:05:32 -0400
Fixing "wrong item selected" bugs in the FolderList
r63328@17h: jesse | 2009-05-13 13:20:00 -0400
Update MessageView for 1.5
r63329@17h: jesse | 2009-05-13 13:50:29 -0400
A couple fixes to "picking the right item"
Titles on the message context menu
r63330@17h: jesse | 2009-05-13 13:58:37 -0400
Added an "open" context menu item to the folder list
r63347@17h: jesse | 2009-05-13 18:00:02 -0400
Try to get folderlists to sort in a stable way, so they jump around less in the ui
r63349@17h: jesse | 2009-05-13 20:37:19 -0400
Switch to using non-message-passing based notifications for redisplay of message lists, cut down redisplay frequency to not overload the display
r63432@17h: jesse | 2009-05-16 13:38:49 -0400
Android 1.5 no longer gives us apache.commons.codec by default and apache.commons.logging by default. Import them so we have em.
There's probably something smarter to do here.
r63438@17h: jesse | 2009-05-16 14:12:06 -0400
removed dead code
r63439@17h: jesse | 2009-05-16 14:30:57 -0400
Minor tidy
r63440@17h: jesse | 2009-05-16 14:39:34 -0400
First pass implementation making MessageList streamy for faster startup
r63441@17h: jesse | 2009-05-16 21:57:41 -0400
There's no reason for the FolderList to list local messages
r63442@17h: jesse | 2009-05-16 21:58:57 -0400
Switch to actually refreshing the message list after each item is loaded
r63450@17h: jesse | 2009-05-16 22:34:18 -0400
Default to pulling items out of the LocalStore by date, descending. (since that's the uneditable default ordering)
This makes our messages come out of the store in the order the user should see them
r63451@17h: jesse | 2009-05-16 22:34:44 -0400
Set some new defaults for the FolderList
r63452@17h: jesse | 2009-05-16 22:35:43 -0400
set some new message list item defaults
r63456@17h: jesse | 2009-05-17 12:56:10 -0400
It's not clear that Pop and WebDav actually set us an InternalDate. I'd rather use that so that spam doesn't topsort. But I also want this to _work_
r63457@17h: jesse | 2009-05-17 12:56:47 -0400
actually check to make sure we have a message to remove before removing it.
r63458@17h: jesse | 2009-05-17 13:10:07 -0400
Flip "security type" to before the port number, since changing security type is the thing more users are likely to know/care about and resets port number
r63469@17h: jesse | 2009-05-17 18:42:39 -0400
Provisional fix for "see the FoldeRList twice" bug
r63471@17h: jesse | 2009-05-17 20:47:41 -0400
Remove title bar from the message view
r63544@17h: jesse | 2009-05-20 23:53:38 -0400
folderlist tidying before i dig into the jumpy ordering bug
r63545@17h: jesse | 2009-05-20 23:56:00 -0400
Killing dead variables
r63546@17h: jesse | 2009-05-21 00:58:36 -0400
make the whole title section clicky
r63556@17h: jesse | 2009-05-21 01:48:13 -0400
Fix where we go when someone deletes a message
r63558@17h: jesse | 2009-05-21 22:44:46 -0400
Working toward switchable themes
r63563@17h: jesse | 2009-05-21 23:53:09 -0400
Make the MessageList's colors actually just inherit from the theme, rather than hardcoding black
r63567@17h: jesse | 2009-05-22 10:14:13 -0400
Kill a now-redundant comment
r63571@17h: jesse | 2009-05-22 19:43:30 -0400
further theme-independence work
r63572@17h: jesse | 2009-05-22 19:55:23 -0400
gete -> get (typo fix)
r63573@17h: jesse | 2009-05-22 22:48:49 -0400
First cut of a global prefs system as well as a theme preference. not that it works yet
r63577@17h: jesse | 2009-05-24 14:49:52 -0400
Once a user has actually put in valid user credentials, start syncing mail and folders in the background instantly.
This gives us a much better "new startup" experience
r63578@17h: jesse | 2009-05-24 14:55:00 -0400
MessageList doesn't need FolderUpdateWorker
r63579@17h: jesse | 2009-05-24 17:57:15 -0400
Fix "get message by uid"
Switch to showing messages 10 by 10, rather than 1 by 1 for huge loadtime performance improvements
r63587@17h: jesse | 2009-05-24 19:19:56 -0400
Cut down LocalMessage creation to not generate a MessageId or date formatter.
r63589@17h: jesse | 2009-05-24 22:22:32 -0400
Switch to null-escaping email address boundaries, rather than a VERY expensive URL-encoding
r63590@17h: jesse | 2009-05-24 22:23:21 -0400
Clean up our "auto-refresh the list when adding messages after a sync"
r63593@17h: jesse | 2009-05-24 22:53:45 -0400
replace isDateToday with a "rolling 18 hour window" variant that's more likely to give the user a useful answer and is 30x faster.
r63595@17h: jesse | 2009-05-24 23:54:14 -0400
When instantiating messges from the LocalStore, there's no need to clear headers before setting them, nor is there a need to set a generated message id
r63596@17h: jesse | 2009-05-24 23:54:39 -0400
make an overridable setGeneratedMessageId
r63597@17h: jesse | 2009-05-24 23:54:55 -0400
Remove new lies from comments
r63598@17h: jesse | 2009-05-24 23:55:35 -0400
Replace insanely expensive message header "name" part quoting with something consistent and cheap that does its work on the way INTO the database
r63605@17h: jesse | 2009-05-25 17:28:24 -0400
bring back the 1.1 sdk build.xml
r63606@17h: jesse | 2009-05-25 22:32:11 -0400
Actually enable switchable themese and compilation on 1.1
r63692@17h: jesse | 2009-05-29 23:55:17 -0400
Switch back to having titles for folder and message lists.
Restore auto-open-folder functionality
r63694@17h: jesse | 2009-05-30 18:50:39 -0400
Remove several off-by-one errors introduced by yesterday's return to android titlebars
r63696@17h: jesse | 2009-05-30 23:45:03 -0400
use convertView properly for performance and memory imrpovement in FolderList and MessageList
r63698@17h: jesse | 2009-05-31 19:42:59 -0400
Switch to using background shading to indicate "not yet fetched"
r63701@17h: jesse | 2009-05-31 21:28:47 -0400
Remving code we don't actually need these bits of apache commons on 1.1
2009-05-31 21:35:05 -04:00
}
2009-12-06 23:46:42 -05:00
2009-11-24 19:40:29 -05:00
/ *
* For performance reasons , we add headers instead of setting them ( see super implementation )
* which removes ( expensive ) them before adding them
* /
@Override
public void setRecipients ( RecipientType type , Address [ ] addresses ) throws MessagingException
{
if ( type = = RecipientType . TO )
{
if ( addresses = = null | | addresses . length = = 0 )
{
this . mTo = null ;
}
else
{
this . mTo = addresses ;
}
}
else if ( type = = RecipientType . CC )
{
if ( addresses = = null | | addresses . length = = 0 )
{
this . mCc = null ;
}
else
{
this . mCc = addresses ;
}
}
else if ( type = = RecipientType . BCC )
{
if ( addresses = = null | | addresses . length = = 0 )
{
this . mBcc = null ;
}
else
{
this . mBcc = addresses ;
}
}
else
{
throw new MessagingException ( " Unrecognized recipient type. " ) ;
}
2009-12-06 23:46:42 -05:00
mMessageDirty = true ;
2009-06-26 02:55:32 -04:00
}
2009-12-06 23:46:42 -05:00
2010-11-26 23:03:10 -05:00
public boolean toMe ( )
{
2010-11-28 15:28:37 -05:00
try
2010-11-26 23:03:10 -05:00
{
2010-11-30 22:01:20 -05:00
if ( ! mToMeCalculated )
2010-11-26 23:03:10 -05:00
{
2010-11-28 15:28:37 -05:00
for ( Address address : getRecipients ( RecipientType . TO ) )
{
if ( mAccount . isAnIdentity ( address ) )
{
mToMe = true ;
mToMeCalculated = true ;
}
}
2010-11-26 23:03:10 -05:00
}
}
2010-11-28 15:28:37 -05:00
catch ( MessagingException e )
{
// do something better than ignore this
// getRecipients can throw a messagingexception
}
2010-11-26 23:03:10 -05:00
return mToMe ;
}
public boolean ccMe ( )
{
2010-11-28 15:28:37 -05:00
try
{
2010-11-26 23:03:10 -05:00
2010-11-30 22:01:20 -05:00
if ( ! mCcMeCalculated )
2010-11-26 23:03:10 -05:00
{
2010-11-28 15:28:37 -05:00
for ( Address address : getRecipients ( RecipientType . CC ) )
2010-11-26 23:03:10 -05:00
{
2010-11-28 15:28:37 -05:00
if ( mAccount . isAnIdentity ( address ) )
{
mCcMe = true ;
mCcMeCalculated = true ;
}
2010-11-26 23:03:10 -05:00
}
2010-11-28 15:28:37 -05:00
}
}
catch ( MessagingException e )
{
// do something better than ignore this
// getRecipients can throw a messagingexception
}
2010-11-26 23:03:10 -05:00
return mCcMe ;
2010-11-28 15:28:37 -05:00
}
2010-11-26 23:03:10 -05:00
2009-11-24 19:40:29 -05:00
public void setFlagInternal ( Flag flag , boolean set ) throws MessagingException
{
2008-11-01 17:32:06 -04:00
super . setFlag ( flag , set ) ;
}
2009-11-24 19:40:29 -05:00
public long getId ( )
{
2008-11-01 17:32:06 -04:00
return mId ;
}
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void setFlag ( final Flag flag , final boolean set ) throws MessagingException
2009-11-24 19:40:29 -05:00
{
2010-08-29 12:57:31 -04:00
2010-11-13 16:40:56 -05:00
try
2009-11-24 19:40:29 -05:00
{
2010-12-18 17:56:40 -05:00
database . execute ( true , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
try
{
if ( flag = = Flag . DELETED & & set )
{
delete ( ) ;
}
2008-11-01 17:32:06 -04:00
2010-11-13 16:40:56 -05:00
updateFolderCountsOnFlag ( flag , set ) ;
2010-11-12 16:37:54 -05:00
2010-11-13 16:40:56 -05:00
LocalMessage . super . setFlag ( flag , set ) ;
}
catch ( MessagingException e )
2009-12-06 19:56:06 -05:00
{
2010-11-13 16:40:56 -05:00
throw new WrappedException ( e ) ;
}
/ *
* Set the flags on the message .
* /
db . execSQL ( " UPDATE messages " + " SET flags = ? " + " WHERE id = ? " , new Object [ ]
{ Utility . combine ( getFlags ( ) , ',' ) . toUpperCase ( ) , mId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2010-08-29 12:56:54 -04:00
}
2010-11-12 20:47:08 -05:00
/ *
* If a message is being marked as deleted we want to clear out it ' s content
* and attachments as well . Delete will not actually remove the row since we need
* to retain the uid for synchronization purposes .
* /
2010-08-29 12:56:54 -04:00
private void delete ( ) throws MessagingException
{
/ *
* Delete all of the message ' s content to save space .
* /
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( true , new DbCallback < Void > ( )
2010-08-29 12:56:54 -04:00
{
2010-11-13 16:40:56 -05:00
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException , UnavailableStorageException
{
db . execSQL ( " UPDATE messages SET " + " deleted = 1, " + " subject = NULL, "
+ " sender_list = NULL, " + " date = NULL, " + " to_list = NULL, "
+ " cc_list = NULL, " + " bcc_list = NULL, " + " preview = NULL, "
+ " html_content = NULL, " + " text_content = NULL, "
+ " reply_to_list = NULL " + " WHERE id = ? " , new Object [ ]
{ mId } ) ;
/ *
* Delete all of the message ' s attachments to save space .
* We do this explicit deletion here because we ' re not deleting the record
* in messages , which means our ON DELETE trigger for messages won ' t cascade
* /
try
2010-08-29 12:56:54 -04:00
{
2010-11-13 16:40:56 -05:00
( ( LocalFolder ) mFolder ) . deleteAttachments ( mId ) ;
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
db . execSQL ( " DELETE FROM attachments WHERE message_id = ? " , new Object [ ]
{ mId } ) ;
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2010-08-29 12:56:54 -04:00
( ( LocalFolder ) mFolder ) . deleteHeaders ( mId ) ;
2008-11-01 17:32:06 -04:00
}
2009-12-14 21:51:18 -05:00
2010-11-12 16:38:02 -05:00
/ *
* Completely remove a message from the local database
* /
@Override
public void destroy ( ) throws MessagingException
{
2010-11-13 16:40:56 -05:00
try
{
2010-12-18 17:56:40 -05:00
database . execute ( true , new DbCallback < Void > ( )
2010-11-13 16:40:56 -05:00
{
@Override
public Void doDbWork ( final SQLiteDatabase db ) throws WrappedException ,
UnavailableStorageException
{
try
{
2010-11-21 00:31:34 -05:00
updateFolderCountsOnFlag ( Flag . X_DESTROYED , true ) ;
2010-11-13 16:40:56 -05:00
( ( LocalFolder ) mFolder ) . deleteAttachments ( mId ) ;
2010-12-18 17:56:40 -05:00
db . execSQL ( " DELETE FROM messages WHERE id = ? " , new Object [ ] { mId } ) ;
2010-11-13 16:40:56 -05:00
}
catch ( MessagingException e )
{
throw new WrappedException ( e ) ;
}
return null ;
}
} ) ;
}
catch ( WrappedException e )
{
throw ( MessagingException ) e . getCause ( ) ;
}
2010-11-12 16:38:02 -05:00
}
2010-08-29 12:56:54 -04:00
2010-12-01 01:32:29 -05:00
private void updateFolderCountsOnFlag ( Flag flag , boolean set )
{
2010-11-12 16:38:11 -05:00
/ *
* Update the unread count on the folder .
* /
try
{
LocalFolder folder = ( LocalFolder ) mFolder ;
if ( flag = = Flag . DELETED | | flag = = Flag . X_DESTROYED )
{
2010-11-21 00:31:38 -05:00
if ( ! isSet ( Flag . SEEN ) )
2010-11-12 16:38:11 -05:00
{
2010-11-14 20:31:20 -05:00
folder . setUnreadMessageCount ( folder . getUnreadMessageCount ( ) + ( set ? - 1 : 1 ) ) ;
2010-11-12 16:38:11 -05:00
}
if ( isSet ( Flag . FLAGGED ) )
{
folder . setFlaggedMessageCount ( folder . getFlaggedMessageCount ( ) + ( set ? - 1 : 1 ) ) ;
}
}
2010-11-14 20:31:16 -05:00
if ( ! isSet ( Flag . DELETED ) )
2010-11-12 16:38:11 -05:00
{
2010-11-14 20:31:16 -05:00
if ( flag = = Flag . SEEN )
2010-11-12 16:38:11 -05:00
{
2010-11-14 20:31:16 -05:00
if ( set ! = isSet ( Flag . SEEN ) )
{
2010-11-21 00:31:42 -05:00
folder . setUnreadMessageCount ( folder . getUnreadMessageCount ( ) + ( set ? - 1 : 1 ) ) ;
2010-11-14 20:31:16 -05:00
}
2010-11-12 16:38:11 -05:00
}
2010-11-14 20:31:16 -05:00
if ( flag = = Flag . FLAGGED )
{
folder . setFlaggedMessageCount ( folder . getFlaggedMessageCount ( ) + ( set ? 1 : - 1 ) ) ;
}
2010-11-12 16:38:11 -05:00
}
}
catch ( MessagingException me )
{
Log . e ( K9 . LOG_TAG , " Unable to update LocalStore unread message count " ,
me ) ;
throw new RuntimeException ( me ) ;
}
}
2010-08-29 12:56:54 -04:00
2010-11-13 16:40:56 -05:00
private void loadHeaders ( ) throws UnavailableStorageException
2009-12-20 00:41:43 -05:00
{
ArrayList < LocalMessage > messages = new ArrayList < LocalMessage > ( ) ;
messages . add ( this ) ;
mHeadersLoaded = true ; // set true before calling populate headers to stop recursion
( ( LocalFolder ) mFolder ) . populateHeaders ( messages ) ;
2009-12-14 21:51:18 -05:00
2009-12-20 00:41:43 -05:00
}
2009-12-14 21:51:18 -05:00
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void addHeader ( String name , String value ) throws UnavailableStorageException
2009-12-14 21:51:18 -05:00
{
2009-12-20 00:41:43 -05:00
if ( ! mHeadersLoaded )
loadHeaders ( ) ;
super . addHeader ( name , value ) ;
2009-12-14 21:51:18 -05:00
}
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void setHeader ( String name , String value ) throws UnavailableStorageException
2009-12-20 00:41:43 -05:00
{
if ( ! mHeadersLoaded )
loadHeaders ( ) ;
super . setHeader ( name , value ) ;
}
2009-12-14 21:51:18 -05:00
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public String [ ] getHeader ( String name ) throws UnavailableStorageException
2009-12-20 00:41:43 -05:00
{
if ( ! mHeadersLoaded )
loadHeaders ( ) ;
return super . getHeader ( name ) ;
}
2009-12-14 21:51:18 -05:00
2010-04-16 08:20:10 -04:00
@Override
2010-11-13 16:40:56 -05:00
public void removeHeader ( String name ) throws UnavailableStorageException
2009-12-20 00:41:43 -05:00
{
if ( ! mHeadersLoaded )
loadHeaders ( ) ;
super . removeHeader ( name ) ;
}
2009-12-14 21:51:18 -05:00
2010-05-21 11:34:29 -04:00
@Override
2010-11-13 16:40:56 -05:00
public Set < String > getHeaderNames ( ) throws UnavailableStorageException
2010-05-30 00:17:00 -04:00
{
2010-05-21 11:34:29 -04:00
if ( ! mHeadersLoaded )
loadHeaders ( ) ;
return super . getHeaderNames ( ) ;
}
2008-11-01 17:32:06 -04:00
}
2010-12-14 14:26:57 -05:00
public static class LocalAttachmentBodyPart extends MimeBodyPart
2009-11-24 19:40:29 -05:00
{
2008-11-01 17:32:06 -04:00
private long mAttachmentId = - 1 ;
2009-11-24 19:40:29 -05:00
public LocalAttachmentBodyPart ( Body body , long attachmentId ) throws MessagingException
{
2008-11-01 17:32:06 -04:00
super ( body ) ;
mAttachmentId = attachmentId ;
}
/ * *
* Returns the local attachment id of this body , or - 1 if it is not stored .
* @return
* /
2009-11-24 19:40:29 -05:00
public long getAttachmentId ( )
{
2008-11-01 17:32:06 -04:00
return mAttachmentId ;
}
2009-11-24 19:40:29 -05:00
public void setAttachmentId ( long attachmentId )
{
2008-11-01 17:32:06 -04:00
mAttachmentId = attachmentId ;
}
2010-04-16 08:20:10 -04:00
@Override
2009-11-24 19:40:29 -05:00
public String toString ( )
{
2008-11-01 17:32:06 -04:00
return " " + mAttachmentId ;
}
}
2009-11-24 19:40:29 -05:00
public static class LocalAttachmentBody implements Body
{
2010-08-02 07:55:31 -04:00
private static final byte [ ] EMPTY_BYTE_ARRAY = new byte [ 0 ] ;
2008-11-01 17:32:06 -04:00
private Application mApplication ;
private Uri mUri ;
2009-11-24 19:40:29 -05:00
public LocalAttachmentBody ( Uri uri , Application application )
{
2008-11-01 17:32:06 -04:00
mApplication = application ;
mUri = uri ;
}
2009-11-24 19:40:29 -05:00
public InputStream getInputStream ( ) throws MessagingException
{
try
{
2008-11-01 17:32:06 -04:00
return mApplication . getContentResolver ( ) . openInputStream ( mUri ) ;
}
2010-02-17 22:28:31 -05:00
catch ( FileNotFoundException fnfe )
{
/ *
* Since it ' s completely normal for us to try to serve up attachments that
* have been blown away , we just return an empty stream .
* /
2010-08-02 07:55:31 -04:00
return new ByteArrayInputStream ( EMPTY_BYTE_ARRAY ) ;
2010-02-17 22:28:31 -05:00
}
2008-11-01 17:32:06 -04:00
}
2009-11-24 19:40:29 -05:00
public void writeTo ( OutputStream out ) throws IOException , MessagingException
{
2008-11-01 17:32:06 -04:00
InputStream in = getInputStream ( ) ;
Base64OutputStream base64Out = new Base64OutputStream ( out ) ;
IOUtils . copy ( in , base64Out ) ;
base64Out . close ( ) ;
}
2009-11-24 19:40:29 -05:00
public Uri getContentUri ( )
{
2008-11-01 17:32:06 -04:00
return mUri ;
}
}
}