1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-30 13:12:25 -05:00

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
This commit is contained in:
Jesse Vincent 2009-06-01 01:35:05 +00:00
parent 9ffe4c44ad
commit 909f677f91
66 changed files with 4021 additions and 3005 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="114" android:versionCode="199"
android:versionName="0.114" package="com.fsck.k9"> android:versionName="0.199" package="com.fsck.k9">
<uses-sdk android:minSdkVersion="1"/> <uses-sdk android:minSdkVersion="1"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/>
@ -17,7 +17,7 @@
android:description="@string/read_attachment_desc"/> android:description="@string/read_attachment_desc"/>
<uses-permission android:name="com.android.email.permission.READ_ATTACHMENT"/> <uses-permission android:name="com.android.email.permission.READ_ATTACHMENT"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name="K9" <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="K9"
android:theme="@android:style/Theme.Light"> >
<activity android:name="com.android.email.activity.Welcome"> <activity android:name="com.android.email.activity.Welcome">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -26,6 +26,11 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name="com.android.email.activity.setup.Prefs"
android:label="@string/prefs_title"
>
</activity>
<activity <activity
android:name="com.android.email.activity.setup.AccountSetupBasics" android:name="com.android.email.activity.setup.AccountSetupBasics"
android:label="@string/account_setup_basics_title" android:label="@string/account_setup_basics_title"
@ -77,7 +82,6 @@
</activity> </activity>
<activity <activity
android:name="com.android.email.activity.setup.AccountSettings" android:name="com.android.email.activity.setup.AccountSettings"
android:theme="@android:style/Theme"
android:label="@string/account_settings_title_fmt" android:label="@string/account_settings_title_fmt"
> >
</activity> </activity>
@ -98,7 +102,7 @@
android:label="@string/accounts_title"> android:label="@string/accounts_title">
</activity> </activity>
<activity <activity
android:name="com.android.email.activity.FolderMessageList"> android:name="com.android.email.activity.FolderList">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.view" /> <action android:name="android.intent.action.view" />
<data <data
@ -108,6 +112,9 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name="com.android.email.activity.MessageList">
</activity>
<activity <activity
android:name="com.android.email.activity.MessageView"> android:name="com.android.email.activity.MessageView">
</activity> </activity>

View File

@ -1,4 +1,11 @@
<html> <html>
<body bgcolor="white"> <body bgcolor="white">
<table width="100%" height="100%">
<tr>
<td align="center" valign="center">
<font color="gray">No text</font>
</td>
</tr>
</table>
</body> </body>
</html> </html>

305
build-sdk-1.5.xml Normal file
View File

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="K9" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contain the path to the SDK. It should *NOT* be checked in in Version
Control Systems. -->
<property file="local.properties"/>
<!-- The build.properties file can be created by you and is never touched
by the 'android' tool. This is the place to change some of the default property values
used by the Ant rules.
Here are some properties you may want to change/update:
application-package
the name of your application package as defined in the manifest. Used by the
'uninstall' rule.
source-folder
the name of the source folder. Default is 'src'.
out-folder
the name of the output folder. Default is 'bin'.
Properties related to the SDK location or the project target should be updated
using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your application and
should be checked in in Version Control Systems.
-->
<property file="build.properties"/>
<!-- The default.properties file is created and updated by the 'android' tool, as well
as ADT.
This file is an integral part of the build system for your application and
should be checked in in Version Control Systems. -->
<property file="default.properties"/>
<!-- Custom Android task to deal with the project target, and import the proper rules.
This requires ant 1.6.0 or above. -->
<path id="android.antlibs">
<pathelement path="${sdk-location}/tools/lib/anttasks.jar" />
<pathelement path="${sdk-location}/tools/lib/sdklib.jar" />
<pathelement path="${sdk-location}/tools/lib/androidprefs.jar" />
<pathelement path="${sdk-location}/tools/lib/apkbuilder.jar" />
<pathelement path="${sdk-location}/tools/lib/jarutils.jar" />
</path>
<taskdef name="setup"
classname="com.android.ant.SetupTask"
classpathref="android.antlibs"/>
<setup import="false" />
<!-- Execute the Android Setup task that will setup some properties specific to the target,
and import the rules files.
To customize the rules, copy/paste them below the task, and disable import by setting
the import attribute to false:
This will ensure that the properties are setup correctly but that your customized
targets are used.
-->
<!--
This rules file is meant to be imported by the custom Ant task:
com.android.ant.AndroidInitTask
The following properties are put in place by the importing task:
android-jar, android-aidl, aapt, aidl, and dx
Additionnaly, the task sets up the following classpath reference:
android.target.classpath
This is used by the compiler task as the boot classpath.
-->
<!-- Custom tasks -->
<taskdef name="aaptexec"
classname="com.android.ant.AaptExecLoopTask"
classpathref="android.antlibs"/>
<taskdef name="apkbuilder"
classname="com.android.ant.ApkBuilderTask"
classpathref="android.antlibs"/>
<!-- Properties -->
<property name="android-tools" value="${sdk-location}/tools" />
<!-- Input directories -->
<property name="source-folder" value="src" />
<property name="gen-folder" value="gen" />
<property name="resource-folder" value="res" />
<property name="asset-folder" value="assets" />
<property name="source-location" value="${basedir}/${source-folder}" />
<!-- folder for the 3rd party java libraries -->
<property name="external-libs-folder" value="libs" />
<!-- folder for the native libraries -->
<property name="native-libs-folder" value="libs" />
<!-- Output directories -->
<property name="gen-folder" value="gen" />
<property name="out-folder" value="bin" />
<property name="out-classes" value="${out-folder}/classes" />
<property name="out-classes-location" value="${basedir}/${out-classes}"/>
<!-- out folders for a parent project if this project is an instrumentation project -->
<property name="main-out-folder" value="../${out-folder}" />
<property name="main-out-classes" value="${main-out-folder}/classes"/>
<!-- Intermediate files -->
<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${out-folder}/${dex-file}" />
<!-- dx does not properly support incorrect / or \ based on the platform
and Ant cannot convert them because the parameter is not a valid path.
Because of this we have to compute different paths depending on the platform. -->
<condition property="intermediate-dex-location"
value="${basedir}\${intermediate-dex}"
else="${basedir}/${intermediate-dex}" >
<os family="windows"/>
</condition>
<!-- The final package file to generate -->
<property name="out-debug-package" value="${out-folder}/${ant.project.name}-debug.apk"/>
<!-- Tools -->
<condition property="exe" value=".exe" else=""><os family="windows"/></condition>
<property name="adb" value="${android-tools}/adb${exe}"/>
<!-- rules -->
<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
<echo>Creating output directories if needed...</echo>
<mkdir dir="${resource-folder}" />
<mkdir dir="${external-libs-folder}" />
<mkdir dir="${gen-folder}" />
<mkdir dir="${out-folder}" />
<mkdir dir="${out-classes}" />
</target>
<!-- Generate the R.java file for this project's resources. -->
<target name="resource-src" depends="dirs">
<echo>Generating R.java / Manifest.java from the resources...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg path="${gen-folder}" />
<arg value="-M" />
<arg path="AndroidManifest.xml" />
<arg value="-S" />
<arg path="${resource-folder}" />
<arg value="-I" />
<arg path="${android-jar}" />
</exec>
<copy overwrite="true" file="gen/com/fsck/k9/R.java" tofile="gen/com/android/email/R.java">
<filterset begintoken="package " endtoken=";">
<filter token="com.fsck.k9" value="package com.android.email;"/>
</filterset>
</copy>
</target>
<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="dirs">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${aidl}" failonerror="true">
<arg value="-p${android-aidl}" />
<arg value="-I${source-folder}" />
<arg value="-o${gen-folder}" />
<fileset dir="${source-folder}">
<include name="**/*.aidl"/>
</fileset>
</apply>
</target>
<!-- Compile this project's .java files into .class files. -->
<target name="compile" depends="resource-src, aidl">
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
destdir="${out-classes}"
bootclasspathref="android.target.classpath">
<src path="${source-folder}" />
<src path="${gen-folder}" />
<classpath>
<fileset dir="${external-libs-folder}" includes="*.jar"/>
<fileset dir="${sdk-location}/platforms/android-1.5/" includes="**/*.jar"/>
<pathelement path="${main-out-classes}"/>
</classpath>
</javac>
</target>
<!-- Convert this project's .class files into .dex files. -->
<target name="dex" depends="compile">
<echo>Converting compiled files and external libraries into ${out-folder}/${dex-file}...</echo>
<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="-JXmx1024m" />
<arg value="--dex" />
<arg value="--output=${intermediate-dex-location}" />
<arg path="${out-classes-location}" />
<fileset dir="${external-libs-folder}" includes="*.jar"/>
</apply>
</target>
<!-- Put the project's resources into the output package file
This actually can create multiple resource package in case
Some custom apk with specific configuration have been
declared in default.properties.
-->
<target name="package-resources">
<echo>Packaging resources</echo>
<aaptexec executable="${aapt}"
command="package"
manifest="AndroidManifest.xml"
resources="${resource-folder}"
assets="${asset-folder}"
androidjar="${android-jar}"
outfolder="${out-folder}"
basename="${ant.project.name}" />
</target>
<!-- Package the application and sign it with a debug key.
This is the default target when building. It is used for debug. -->
<target name="debug" depends="dex, package-resources">
<apkbuilder
outfolder="${out-folder}"
basename="${ant.project.name}"
signed="true"
verbose="false">
<file path="${intermediate-dex}" />
<sourcefolder path="${source-folder}" />
<jarfolder path="${external-libs-folder}" />
<nativefolder path="${native-libs-folder}" />
</apkbuilder>
</target>
<!-- Package the application without signing it.
This allows for the application to be signed later with an official publishing key. -->
<target name="release" depends="dex, package-resources">
<apkbuilder
outfolder="${out-folder}"
basename="${ant.project.name}"
signed="false"
verbose="false">
<file path="${intermediate-dex}" />
<sourcefolder path="${source-folder}" />
<jarfolder path="${external-libs-folder}" />
<nativefolder path="${native-libs-folder}" />
</apkbuilder>
<echo>Signing ${out-unsigned-package}</echo>
<exec executable="jarsigner" failonerror="true">
<arg value="-verbose" />
<arg value="-storepass" />
<arg value="${env.jarpass}" />
<arg value="-signedjar" />
<arg value="${out-signed-package-ospath}" />
<arg value="${out-unsigned-package-ospath}" />
<arg value="fsckcom" />
</exec>
</target>
<!-- Install the package on the default emulator -->
<target name="install" depends="debug">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg path="${out-debug-package}" />
</exec>
</target>
<target name="reinstall" depends="debug">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg value="-r" />
<arg path="${out-debug-package}" />
</exec>
</target>
<!-- Uinstall the package from the default emulator -->
<target name="uninstall">
<echo>Uninstalling ${application-package} from the default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="uninstall" />
<arg path="${application-package}" />
</exec>
</target>
<target name="help">
<!-- displays starts at col 13
|13 80| -->
<echo>Android Ant Build. Available targets:</echo>
<echo> help: Displays this help.</echo>
<echo> debug: Builds the application and sign it with a debug key.</echo>
<echo> release: Builds the application. The generated apk file must be</echo>
<echo> signed before it is published.</echo>
<echo> install: Installs the debug package onto a running emulator or</echo>
<echo> device. This can only be used if the application has </echo>
<echo> not yet been installed.</echo>
<echo> reinstall: Installs the debug package on a running emulator or</echo>
<echo> device that already has the application.</echo>
<echo> The signatures must match.</echo>
<echo> uninstall: uninstall the application from a running emulator or</echo>
<echo> device.</echo>
</target>
</project>

2
build.properties Normal file
View File

@ -0,0 +1,2 @@
application-package=com.fsck.k9

11
default.properties Normal file
View File

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=Google Inc.:Google APIs:3

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_selected="true" <item android:state_window_focused="false" android:state_selected="true"
android:drawable="@color/folder_message_list_child_background" /> android:drawable="@color/folder_list_item_background" />
<item android:state_selected="true" <item android:state_selected="true"
android:drawable="@android:color/transparent" /> android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:state_selected="false" <item android:state_pressed="true" android:state_selected="false"
android:drawable="@android:color/transparent" /> android:drawable="@android:color/transparent" />
<item android:state_selected="false" <item android:state_selected="false"
android:drawable="@color/folder_message_list_child_background" /> android:drawable="@color/folder_list_item_background" />
</selector> </selector>

View File

@ -1,11 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_selected="true" <item android:state_window_focused="false" android:state_selected="true"
android:drawable="@color/folder_message_list_group_background" /> android:drawable="@android:color/transparent"
/>
<item android:state_selected="true" <item android:state_selected="true"
android:drawable="@android:color/transparent" /> android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:state_selected="false" <item android:state_pressed="true" android:state_selected="false"
android:drawable="@android:color/transparent" /> android:drawable="@android:color/transparent" />
<item android:state_selected="false" <item android:state_selected="false"
android:drawable="@color/folder_message_list_group_background" /> android:drawable="@android:color/transparent"
/>
</selector> </selector>

View File

@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_selected="true" <item android:state_window_focused="false" android:state_selected="true"
android:drawable="@color/folder_message_list_child_footer_background" /> android:drawable="@color/message_list_item_footer_background" />
<item android:state_selected="true" <item android:state_selected="true"
android:drawable="@android:color/transparent" /> android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:state_selected="false" <item android:state_pressed="true" android:state_selected="false"
android:drawable="@android:color/transparent" /> android:drawable="@android:color/transparent" />
<item android:state_selected="false" <item android:state_selected="false"
android:drawable="@color/folder_message_list_child_footer_background" /> android:drawable="@android:color/transparent"
/>
</selector> </selector>

View File

@ -5,7 +5,7 @@
android:layout_height="20px" android:layout_height="20px"
android:paddingRight="1px" android:paddingRight="1px"
android:paddingTop="2px" android:paddingTop="2px"
android:background="@drawable/folder_message_list_child_background"> android:background="@drawable/message_list_item_background">
<View <View
android:id="@+id/chip" android:id="@+id/chip"
android:background="@drawable/appointment_indicator_leftside_1" android:background="@drawable/appointment_indicator_leftside_1"

View File

@ -30,12 +30,14 @@
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="57px" android:layout_height="57px"
android:background="@drawable/ic_email_thread_open_bottom_default" android:background="@drawable/ic_email_thread_open_bottom_default"
android:gravity="bottom"> android:gravity="center_vertical">
<Button <Button
android:id="@+id/previous_scrolling" android:id="@+id/previous_scrolling"
android:text="@string/message_view_prev_action" android:text="@string/message_view_prev_action"
android:textSize="35px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:padding="0dip"
android:layout_weight="1" /> android:layout_weight="1" />
<Button <Button
android:id="@+id/reply_scrolling" android:id="@+id/reply_scrolling"
@ -58,8 +60,10 @@
<Button <Button
android:id="@+id/next_scrolling" android:id="@+id/next_scrolling"
android:text="@string/message_view_next_action" android:text="@string/message_view_next_action"
android:textSize="35px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:padding="0dip"
android:layout_weight="1" /> android:layout_weight="1" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
@ -75,7 +79,9 @@
<Button <Button
android:id="@+id/previous" android:id="@+id/previous"
android:text="@string/message_view_prev_action" android:text="@string/message_view_prev_action"
android:textSize="35px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="0dip"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_weight="1" /> android:layout_weight="1" />
<Button <Button
@ -99,6 +105,8 @@
<Button <Button
android:id="@+id/next" android:id="@+id/next"
android:text="@string/message_view_next_action" android:text="@string/message_view_next_action"
android:textSize="35px"
android:padding="0dip"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_weight="1" /> android:layout_weight="1" />

View File

@ -46,6 +46,16 @@
android:singleLine="true" android:singleLine="true"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<TextView
android:text="@string/account_setup_incoming_security_label"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary" />
<Spinner
android:id="@+id/account_security_type"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
<TextView <TextView
android:text="@string/account_setup_incoming_port_label" android:text="@string/account_setup_incoming_port_label"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -57,16 +67,6 @@
android:singleLine="true" android:singleLine="true"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<TextView
android:text="@string/account_setup_incoming_security_label"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary" />
<Spinner
android:id="@+id/account_security_type"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
<LinearLayout <LinearLayout
android:id="@+id/imap_path_prefix_section" android:id="@+id/imap_path_prefix_section"
android:layout_width="fill_parent" android:layout_width="fill_parent"

View File

@ -21,6 +21,16 @@
android:singleLine="true" android:singleLine="true"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<TextView
android:text="@string/account_setup_outgoing_security_label"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary" />
<Spinner
android:id="@+id/account_security_type"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
<TextView <TextView
android:text="@string/account_setup_outgoing_port_label" android:text="@string/account_setup_outgoing_port_label"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -32,16 +42,6 @@
android:singleLine="true" android:singleLine="true"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<TextView
android:text="@string/account_setup_outgoing_security_label"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary" />
<Spinner
android:id="@+id/account_security_type"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
<CheckBox <CheckBox
android:id="@+id/account_require_login" android:id="@+id/account_require_login"
android:layout_width="fill_parent" android:layout_width="fill_parent"

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@drawable/message_list_item_footer_background"
android:gravity="left"
android:orientation="horizontal">
<Button
android:id="@+id/account_list"
android:text="@string/back_to_accounts_action"
android:textSize="30px"
android:padding="5px"
android:layout_width="50px"
android:layout_height="fill_parent"
android:minWidth="@dimen/button_minWidth"
android:layout_centerVertical="true"
/>
<TextView
android:id="@+id/account_name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10px"
android:gravity="left"
/>
</LinearLayout>

View File

@ -5,7 +5,7 @@
android:layout_height="?android:attr/listPreferredItemHeight" android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="horizontal" android:orientation="horizontal"
android:gravity="center_vertical" android:gravity="center_vertical"
android:background="@drawable/folder_message_list_group_background" android:background="@android:color/transparent"
android:paddingLeft="36px" android:paddingLeft="36px"
android:paddingRight="4px"> android:paddingRight="4px">
@ -39,7 +39,7 @@
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/text_box_light" android:background="@drawable/text_box"
android:paddingLeft="10px" android:paddingLeft="10px"
android:paddingRight="10px" android:paddingRight="10px"
android:minWidth="64px" android:minWidth="64px"

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@android:color/transparent"
android:gravity="left"
android:orientation="horizontal">
<Button
android:id="@+id/folder_list"
android:text="@string/back_to_folder_list_action"
android:textSize="30px"
android:padding="5px"
android:layout_width="50px"
android:layout_height="fill_parent"
android:minWidth="@dimen/button_minWidth"
android:layout_centerVertical="true"
/>
<TextView
android:id="@+id/folder_name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10px"
android:gravity="left"
/>
</LinearLayout>

View File

@ -5,7 +5,7 @@
android:layout_height="38px" android:layout_height="38px"
android:paddingRight="1px" android:paddingRight="1px"
android:paddingTop="2px" android:paddingTop="2px"
android:background="@drawable/folder_message_list_child_background" android:background="#999999"
> >
<View <View
android:id="@+id/chip" android:id="@+id/chip"
@ -46,6 +46,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:background="@drawable/folder_message_list_child_background" android:background="@android:color/transparent"
/> />
</RelativeLayout> </RelativeLayout>

View File

@ -3,11 +3,11 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight" android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@drawable/folder_message_list_child_footer_background" android:background="@drawable/message_list_item_footer_background"
android:gravity="center" android:gravity="center"
android:orientation="horizontal"> android:orientation="horizontal">
<ProgressBar <ProgressBar
android:id="@+id/progress" android:id="@+id/message_list_progress"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_width="wrap_content"
style="?android:attr/progressBarStyleSmall" style="?android:attr/progressBarStyleSmall"

View File

@ -4,17 +4,19 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:background="@android:color/white"> >
<ScrollView <ScrollView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="0dip" android:layout_height="0dip"
android:layout_weight="1" android:layout_weight="1"
android:scrollbarStyle="outsideInset" android:scrollbarStyle="outsideInset"
android:fillViewport="true" android:fillViewport="true"
android:background="@android:color/transparent"
android:fadingEdge="none"> android:fadingEdge="none">
<LinearLayout <LinearLayout
android:orientation="vertical" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:background="@android:color/transparent"
android:layout_height="0dip" android:layout_height="0dip"
android:layout_weight="1"> android:layout_weight="1">
<include layout="@layout/message_view_header" /> <include layout="@layout/message_view_header" />
@ -27,7 +29,6 @@
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="57px" android:layout_height="57px"
android:background="@drawable/ic_email_thread_open_bottom_default"
android:gravity="center_vertical"> android:gravity="center_vertical">
<Button <Button
android:id="@+id/reply" android:id="@+id/reply"
@ -58,6 +59,8 @@
<Button <Button
android:id="@+id/previous_scrolling" android:id="@+id/previous_scrolling"
android:text="@string/message_view_prev_action" android:text="@string/message_view_prev_action"
android:textSize="35px"
android:padding="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_weight="1" /> android:layout_weight="1" />
@ -70,7 +73,9 @@
android:layout_weight="1" /> android:layout_weight="1" />
<Button <Button
android:id="@+id/next_scrolling" android:id="@+id/next_scrolling"
android:padding="0px"
android:text="@string/message_view_next_action" android:text="@string/message_view_next_action"
android:textSize="35px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_weight="1" /> android:layout_weight="1" />
@ -82,11 +87,13 @@
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="57px" android:layout_height="57px"
android:background="@drawable/ic_email_thread_open_bottom_default" android:background="@android:color/transparent"
android:gravity="center_vertical"> android:gravity="center_vertical">
<Button <Button
android:id="@+id/previous" android:id="@+id/previous"
android:text="@string/message_view_prev_action" android:text="@string/message_view_prev_action"
android:textSize="35px"
android:padding="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_weight="1" /> android:layout_weight="1" />
@ -100,6 +107,8 @@
<Button <Button
android:id="@+id/next" android:id="@+id/next"
android:text="@string/message_view_next_action" android:text="@string/message_view_next_action"
android:textSize="35px"
android:padding="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_weight="1" /> android:layout_weight="1" />

View File

@ -5,7 +5,8 @@
<RelativeLayout <RelativeLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/ic_email_thread_open_top_default"> android:padding="2dip"
android:background="@android:color/transparent">
<TextView <TextView
android:id="@+id/from" android:id="@+id/from"
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
@ -79,7 +80,6 @@
android:id="@+id/show_pictures_section" android:id="@+id/show_pictures_section"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="#ffefefef"
android:layout_marginTop="6dip" android:layout_marginTop="6dip"
android:paddingLeft="6dip" android:paddingLeft="6dip"
android:paddingRight="3dip" android:paddingRight="3dip"
@ -105,6 +105,8 @@
<WebView <WebView
android:id="@+id/message_content" android:id="@+id/message_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="?android:attr/textColorPrimary"
android:background="@android:color/transparent"
android:layout_width="fill_parent" android:layout_width="fill_parent"
/> />
<!-- attachments area --> <!-- attachments area -->

View File

@ -8,13 +8,15 @@
android:title="@string/empty_trash_action" /> android:title="@string/empty_trash_action" />
<item android:id="@+id/edit_account" <item android:id="@+id/edit_account"
android:title="@string/account_settings_action" /> android:title="@string/account_settings_action" />
<item android:id="@+id/edit_prefs"
android:title="@string/preferences_action" />
<item android:id="@+id/compact" <item android:id="@+id/compact"
android:title="@string/compact_action" /> android:title="@string/compact_action" />
<item android:id="@+id/clear"
android:title="@string/clear_action" />
<item android:id="@+id/delete_account" <item android:id="@+id/delete_account"
android:title="@string/remove_account_action" /> android:title="@string/remove_account_action" />
<item android:id="@+id/clear_pending" <item android:id="@+id/clear_pending"
android:title="@string/clear_pending_action" /> android:title="@string/clear_pending_action" />
<item android:id="@+id/clear"
android:title="@string/clear_action" />
</menu> </menu>

View File

@ -25,7 +25,9 @@
<!-- <!--
<item android:id="@+id/search" <item android:id="@+id/search"
android:title="@string/search_action" /> android:title="@string/search_action" />
<item android:id="@+id/preferences"
android:title="@string/preferences_action" />
--> -->
<item android:id="@+id/edit_prefs"
android:title="@string/preferences_action"
android:icon="@drawable/ic_menu_preferences"
/>
</menu> </menu>

View File

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/open_folder"
android:title="@string/open_action"
/>
<item <item
android:id="@+id/mark_all_as_read" android:id="@+id/mark_all_as_read"
android:title="@string/mark_all_as_read_action" android:title="@string/mark_all_as_read_action"
/> />
<item <item
android:id="@+id/empty_trash" android:id="@+id/empty_trash"
android:title="@string/empty_trash_action" android:title="@string/empty_trash_action"

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/compose"
android:alphabeticShortcut="c"
android:title="@string/compose_action"
android:icon="@drawable/ic_menu_compose"
/>
<item
android:id="@+id/check_mail"
android:alphabeticShortcut="r"
android:title="@string/check_mail_action"
android:icon="@drawable/ic_menu_refresh"
/>
<item
android:id="@+id/accounts"
android:title="@string/accounts_action"
android:icon="@drawable/ic_menu_account_list"
/>
<item
android:id="@+id/list_folders"
android:title="@string/list_folders_action"
android:icon="@drawable/ic_menu_refresh"
/>
<item
android:id="@+id/empty_trash"
android:alphabeticShortcut="e"
android:title="@string/empty_trash_action"
android:icon="@drawable/ic_menu_delete"
/>
<item
android:id="@+id/account_settings"
android:title="@string/account_settings_action"
android:icon="@android:drawable/ic_menu_preferences"
/>
<item
android:id="@+id/compact"
android:title="@string/compact_action"
android:icon="@drawable/ic_menu_compact"
/>
<item
android:id="@+id/clear"
android:title="@string/clear_action"
android:icon="@drawable/ic_menu_clear"
/>
</menu>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/open"
android:title="@string/open_action"
/>
<item
android:id="@+id/delete"
android:title="@string/delete_action"
/>
<item
android:id="@+id/forward"
android:title="@string/forward_action"
/>
<item
android:id="@+id/reply_all"
android:title="@string/reply_all_action"
/>
<item
android:id="@+id/reply"
android:title="@string/reply_action"
/>
<item
android:id="@+id/mark_as_read"
android:title="@string/mark_as_read_action"
/>
<item
android:id="@+id/flag"
android:title="@string/flag_action"
/>
<item
android:id="@+id/move"
android:title="@string/move_action"
/>
<item
android:id="@+id/copy"
android:title="@string/copy_action"
/>
<item
android:id="@+id/send_alternate"
android:title="@string/send_alternate_action"
/>
</menu>

View File

@ -49,37 +49,6 @@
android:title="@string/check_mail_action" android:title="@string/check_mail_action"
android:icon="@drawable/ic_menu_refresh" android:icon="@drawable/ic_menu_refresh"
/> />
<item
android:id="@+id/accounts"
android:title="@string/accounts_action"
android:icon="@drawable/ic_menu_account_list"
/>
<item
android:id="@+id/list_folders"
android:title="@string/list_folders_action"
android:icon="@drawable/ic_menu_refresh"
/>
<item
android:id="@+id/empty_trash"
android:alphabeticShortcut="e"
android:title="@string/empty_trash_action"
android:icon="@drawable/ic_menu_delete"
/>
<item
android:id="@+id/account_settings"
android:title="@string/account_settings_action"
android:icon="@android:drawable/ic_menu_preferences"
/>
<item
android:id="@+id/compact"
android:title="@string/compact_action"
android:icon="@drawable/ic_menu_compact"
/>
<item
android:id="@+id/clear"
android:title="@string/clear_action"
android:icon="@drawable/ic_menu_clear"
/>
</menu> </menu>

View File

@ -171,7 +171,7 @@ Willkommen zum K-9 Mail Setup. K-9 ist eine Open-Source E-Mail-Anwendung für A
<string name="message_compose_downloading_attachments_toast">Einige Anlagen wurden nicht heruntergeladen. Sie werden automatisch heruntergeladen bevor diese Nachricht gesendet wird.</string> <string name="message_compose_downloading_attachments_toast">Einige Anlagen wurden nicht heruntergeladen. Sie werden automatisch heruntergeladen bevor diese Nachricht gesendet wird.</string>
<string name="message_compose_attachments_skipped_toast">Einige Anlagen können nicht weitergeleitet werden, da diese nicht heruntergeladen wurden.</string> <string name="message_compose_attachments_skipped_toast">Einige Anlagen können nicht weitergeleitet werden, da diese nicht heruntergeladen wurden.</string>
<string name="folder_message_list_to_fmt">An: <xliff:g id="counterParty">%s</xliff:g></string> <string name="message_list_to_fmt">An: <xliff:g id="counterParty">%s</xliff:g></string>
<string name="message_view_to_label">An:</string> <string name="message_view_to_label">An:</string>
<string name="message_view_attachment_view_action">Öffnen</string> <string name="message_view_attachment_view_action">Öffnen</string>

View File

@ -140,4 +140,15 @@
<item>3</item> <item>3</item>
</string-array> </string-array>
<string-array name="settings_theme_entries">
<item>@string/setting_theme_light</item>
<item>@string/setting_theme_dark</item>
</string-array>
<string-array name="settings_theme_values">
<item>light</item>
<item>dark</item>
</string-array>
</resources> </resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="folder_message_list_group_background">#cccccc</color> <color name="folder_list_item_background">#ffffff</color>
<color name="folder_message_list_child_background">#ffffff</color> <color name="message_list_item_background">#ffffff</color>
<color name="folder_message_list_child_footer_background">#eeeeee</color> <color name="message_list_item_footer_background">#eeeeee</color>
</resources> </resources>

View File

@ -50,6 +50,8 @@
<string name="clear_pending_action">Clear pending actions (danger!)</string> <string name="clear_pending_action">Clear pending actions (danger!)</string>
<string name="accounts_action">Accounts</string> <string name="accounts_action">Accounts</string>
<string name="back_to_accounts_action"></string>
<string name="back_to_folder_list_action"></string>
<string name="read_action">Read</string> <string name="read_action">Read</string>
<string name="mark_as_read_action">Mark as read</string> <string name="mark_as_read_action">Mark as read</string>
<string name="send_alternate_action">Forward (alternate)</string> <string name="send_alternate_action">Forward (alternate)</string>
@ -75,6 +77,7 @@
<string name="reverse_sort_action">Reverse sort</string> <string name="reverse_sort_action">Reverse sort</string>
<string name="about_action">About</string> <string name="about_action">About</string>
<string name="prefs_title">Preferences</string>
<string name="accounts_context_menu_title">Account options</string> <string name="accounts_context_menu_title">Account options</string>
<string name="folder_context_menu_title">Folder options</string> <string name="folder_context_menu_title">Folder options</string>
@ -189,13 +192,13 @@ Welcome to K-9 Mail setup. K-9 is an open source email client for Android based
<string name="message_compose_downloading_attachments_toast">Some attachments were not downloaded. They will be downloaded automatically before this message is sent.</string> <string name="message_compose_downloading_attachments_toast">Some attachments were not downloaded. They will be downloaded automatically before this message is sent.</string>
<string name="message_compose_attachments_skipped_toast">Some attachments cannot be forwarded because they have not downloaded.</string> <string name="message_compose_attachments_skipped_toast">Some attachments cannot be forwarded because they have not downloaded.</string>
<string name="folder_message_list_to_fmt">To:<xliff:g id="counterParty">%s</xliff:g></string> <string name="message_list_to_fmt">To:<xliff:g id="counterParty">%s</xliff:g></string>
<string name="message_view_to_label">To:</string> <string name="message_view_to_label">To:</string>
<string name="message_view_attachment_view_action">Open</string> <string name="message_view_attachment_view_action">Open</string>
<string name="message_view_attachment_download_action">Save</string> <string name="message_view_attachment_download_action">Save</string>
<string name="message_view_prev_action">Prev</string> <string name="message_view_prev_action"></string>
<string name="message_view_next_action">Next</string> <string name="message_view_next_action"></string>
<string name="message_view_datetime_fmt">MMM dd yyyy hh:mm a</string> <string name="message_view_datetime_fmt">MMM dd yyyy hh:mm a</string>
<string name="message_view_status_attachment_saved">Attachment saved to SD card as <xliff:g id="filename">%s</xliff:g>.</string> <string name="message_view_status_attachment_saved">Attachment saved to SD card as <xliff:g id="filename">%s</xliff:g>.</string>
<string name="message_view_status_attachment_not_saved">Unable to save attachment to SD card.</string> <string name="message_view_status_attachment_not_saved">Unable to save attachment to SD card.</string>
@ -463,4 +466,8 @@ Welcome to K-9 Mail setup. K-9 is an open source email client for Android based
<string name="account_settings_signature__location_label">Signature position</string> <string name="account_settings_signature__location_label">Signature position</string>
<string name="account_settings_signature__location_before_quoted_text">Before quoted messages</string> <string name="account_settings_signature__location_before_quoted_text">Before quoted messages</string>
<string name="account_settings_signature__location_after_quoted_text">After quoted messages</string> <string name="account_settings_signature__location_after_quoted_text">After quoted messages</string>
<string name="setting_theme_dark">Dark</string>
<string name="setting_theme_light">Light</string>
<string name="display_preferences">Display Preferences</string>
<string name="settings_theme_label">Theme</string>
</resources> </resources>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/display_preferences" android:key="global_preferences">
<ListPreference
android:key="theme"
android:title="@string/settings_theme_label"
android:entries="@array/settings_theme_entries"
android:entryValues="@array/settings_theme_values"
android:dialogTitle="@string/settings_theme_label" />
</PreferenceCategory>
</PreferenceScreen>

View File

@ -223,10 +223,11 @@ public class Email extends Application {
super.onCreate(); super.onCreate();
app = this; app = this;
Preferences prefs = Preferences.getPreferences(this); Preferences prefs = Preferences.getPreferences(this);
DEBUG = prefs.geteEnableDebugLogging(); DEBUG = prefs.getEnableDebugLogging();
DEBUG_SENSITIVE = prefs.getEnableSensitiveLogging(); DEBUG_SENSITIVE = prefs.getEnableSensitiveLogging();
MessagingController.getInstance(this).resetVisibleLimits(prefs.getAccounts()); MessagingController.getInstance(this).resetVisibleLimits(prefs.getAccounts());
/* /*
* We have to give MimeMessage a temp directory because File.createTempFile(String, String) * We have to give MimeMessage a temp directory because File.createTempFile(String, String)
* doesn't work in Android and MimeMessage does not have access to a Context. * doesn't work in Android and MimeMessage does not have access to a Context.

View File

@ -0,0 +1,17 @@
package com.android.email;
import com.android.email.Preferences;
import android.app.Activity;
import android.os.Bundle;
public class K9Activity extends Activity {
@Override
public void onCreate(Bundle icicle) {
setTheme(Preferences.getPreferences(this).getTheme());
super.onCreate(icicle);
}
}

View File

@ -0,0 +1,17 @@
package com.android.email;
import com.android.email.Preferences;
import android.app.ListActivity;
import android.os.Bundle;
public class K9ListActivity extends ListActivity {
@Override
public void onCreate(Bundle icicle) {
setTheme(Preferences.getPreferences(this).getTheme());
super.onCreate(icicle);
}
}

View File

@ -0,0 +1,18 @@
package com.android.email;
import com.android.email.Preferences;
import android.preference.PreferenceActivity;
import android.os.Bundle;
public class K9PreferenceActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle icicle) {
setTheme(Preferences.getPreferences(this).getTheme());
super.onCreate(icicle);
}
}

View File

@ -1,6 +1,5 @@
package com.android.email; package com.android.email;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -33,7 +32,7 @@ import android.os.PowerManager.WakeLock;
import android.util.Config; import android.util.Config;
import android.util.Log; import android.util.Log;
import com.android.email.activity.FolderMessageList; import com.android.email.activity.FolderList;
import com.android.email.mail.Address; import com.android.email.mail.Address;
import com.android.email.mail.FetchProfile; import com.android.email.mail.FetchProfile;
import com.android.email.mail.Flag; import com.android.email.mail.Flag;
@ -87,18 +86,12 @@ public class MessagingController implements Runnable {
*/ */
private static final int MAX_SMALL_MESSAGE_SIZE = Store.FETCH_BODY_SANE_SUGGESTED_SIZE; private static final int MAX_SMALL_MESSAGE_SIZE = Store.FETCH_BODY_SANE_SUGGESTED_SIZE;
private static final String PENDING_COMMAND_MOVE_OR_COPY = private static final String PENDING_COMMAND_MOVE_OR_COPY = "com.android.email.MessagingController.moveOrCopy";
"com.android.email.MessagingController.moveOrCopy"; private static final String PENDING_COMMAND_EMPTY_TRASH = "com.android.email.MessagingController.emptyTrash";
private static final String PENDING_COMMAND_EMPTY_TRASH = private static final String PENDING_COMMAND_SET_FLAG = "com.android.email.MessagingController.setFlag";
"com.android.email.MessagingController.emptyTrash"; private static final String PENDING_COMMAND_APPEND = "com.android.email.MessagingController.append";
private static final String PENDING_COMMAND_SET_FLAG = private static final String PENDING_COMMAND_MARK_ALL_AS_READ = "com.android.email.MessagingController.markAllAsRead";
"com.android.email.MessagingController.setFlag"; private static final String PENDING_COMMAND_CLEAR_ALL_PENDING = "com.android.email.MessagingController.clearAllPending";
private static final String PENDING_COMMAND_APPEND =
"com.android.email.MessagingController.append";
private static final String PENDING_COMMAND_MARK_ALL_AS_READ =
"com.android.email.MessagingController.markAllAsRead";
private static final String PENDING_COMMAND_CLEAR_ALL_PENDING =
"com.android.email.MessagingController.clearAllPending";
private static MessagingController inst = null; private static MessagingController inst = null;
@ -125,26 +118,21 @@ public class MessagingController implements Runnable {
private int descendingToast; private int descendingToast;
private boolean defaultAscending; private boolean defaultAscending;
SORT_TYPE(int ascending, int descending, boolean ndefaultAscending) SORT_TYPE(int ascending, int descending, boolean ndefaultAscending) {
{
ascendingToast = ascending; ascendingToast = ascending;
descendingToast = descending; descendingToast = descending;
defaultAscending = ndefaultAscending; defaultAscending = ndefaultAscending;
} }
public int getToast(boolean ascending) public int getToast(boolean ascending) {
{ if (ascending) {
if (ascending)
{
return ascendingToast; return ascendingToast;
} }
else else {
{
return descendingToast; return descendingToast;
} }
} }
public boolean isDefaultAscending() public boolean isDefaultAscending() {
{
return defaultAscending; return defaultAscending;
} }
}; };
@ -162,26 +150,21 @@ public class MessagingController implements Runnable {
private ConcurrentHashMap<String, Long> expungedUid = new ConcurrentHashMap<String, Long>(); private ConcurrentHashMap<String, Long> expungedUid = new ConcurrentHashMap<String, Long>();
private String createMessageKey(Account account, String folder, Message message) private String createMessageKey(Account account, String folder, Message message) {
{
return createMessageKey(account, folder, message.getUid()); return createMessageKey(account, folder, message.getUid());
} }
private String createMessageKey(Account account, String folder, String uid) private String createMessageKey(Account account, String folder, String uid) {
{
return account.getUuid() + ":" + folder + ":" + uid; return account.getUuid() + ":" + folder + ":" + uid;
} }
private String createFolderKey(Account account, String folder) private String createFolderKey(Account account, String folder) {
{
return account.getUuid() + ":" + folder; return account.getUuid() + ":" + folder;
} }
private void suppressMessage(Account account, String folder, Message message) private void suppressMessage(Account account, String folder, Message message) {
{
if (account == null || folder == null || message == null) if (account == null || folder == null || message == null) {
{
return; return;
} }
String messKey = createMessageKey(account, folder, message); String messKey = createMessageKey(account, folder, message);
@ -189,19 +172,15 @@ public class MessagingController implements Runnable {
deletedUids.put(messKey, "true"); deletedUids.put(messKey, "true");
} }
private void unsuppressMessage(Account account, String folder, Message message) private void unsuppressMessage(Account account, String folder, Message message) {
{ if (account == null || folder == null || message == null) {
if (account == null || folder == null || message == null)
{
return; return;
} }
unsuppressMessage(account, folder, message.getUid()); unsuppressMessage(account, folder, message.getUid());
} }
private void unsuppressMessage(Account account, String folder, String uid) private void unsuppressMessage(Account account, String folder, String uid) {
{ if (account == null || folder == null || uid == null) {
if (account == null || folder == null || uid == null)
{
return; return;
} }
String messKey = createMessageKey(account, folder, uid); String messKey = createMessageKey(account, folder, uid);
@ -210,34 +189,27 @@ public class MessagingController implements Runnable {
} }
private boolean isMessageSuppressed(Account account, String folder, Message message) private boolean isMessageSuppressed(Account account, String folder, Message message) {
{ if (account == null || folder == null || message == null) {
if (account == null || folder == null || message == null)
{
return false; return false;
} }
String messKey = createMessageKey(account, folder, message); String messKey = createMessageKey(account, folder, message);
//Log.d(Email.LOG_TAG, "Checking suppression of message with key " + messKey); //Log.d(Email.LOG_TAG, "Checking suppression of message with key " + messKey);
if (deletedUids.containsKey(messKey)) if (deletedUids.containsKey(messKey)) {
{
//Log.d(Email.LOG_TAG, "Message with key " + messKey + " is suppressed"); //Log.d(Email.LOG_TAG, "Message with key " + messKey + " is suppressed");
return true; return true;
} }
Long expungedUidL = expungedUid.get(createFolderKey(account, folder)); Long expungedUidL = expungedUid.get(createFolderKey(account, folder));
if (expungedUidL != null) if (expungedUidL != null) {
{
long expungedUid = expungedUidL; long expungedUid = expungedUidL;
String messageUidS = message.getUid(); String messageUidS = message.getUid();
try try {
{
long messageUid = Long.parseLong(messageUidS); long messageUid = Long.parseLong(messageUidS);
if (messageUid <= expungedUid) if (messageUid <= expungedUid) {
{
return false; return false;
} }
} }
catch (NumberFormatException nfe) catch (NumberFormatException nfe) {
{
// Nothing to do // Nothing to do
} }
} }
@ -253,14 +225,11 @@ public class MessagingController implements Runnable {
mThread.start(); mThread.start();
} }
public void log(String logmess) public void log(String logmess) {
{
Log.d(Email.LOG_TAG, logmess); Log.d(Email.LOG_TAG, logmess);
if (Email.logFile != null) if (Email.logFile != null) {
{
FileOutputStream fos = null; FileOutputStream fos = null;
try try {
{
File logFile = new File(Email.logFile); File logFile = new File(Email.logFile);
fos = new FileOutputStream(logFile, true); fos = new FileOutputStream(logFile, true);
PrintStream ps = new PrintStream(fos); PrintStream ps = new PrintStream(fos);
@ -270,20 +239,15 @@ public class MessagingController implements Runnable {
fos.flush(); fos.flush();
fos.close(); fos.close();
} }
catch (Exception e) catch (Exception e) {
{
Log.e(Email.LOG_TAG, "Unable to log message '" + logmess + "'", e); Log.e(Email.LOG_TAG, "Unable to log message '" + logmess + "'", e);
} }
finally finally {
{ if (fos != null) {
if (fos != null) try {
{
try
{
fos.close(); fos.close();
} }
catch (Exception e) catch (Exception e) {
{
} }
} }
@ -314,17 +278,14 @@ public class MessagingController implements Runnable {
String commandDescription = null; String commandDescription = null;
try { try {
Command command = mCommands.poll(); Command command = mCommands.poll();
if (command == null) if (command == null) {
{
command = backCommands.poll(); command = backCommands.poll();
} }
if (command == null) if (command == null) {
{
command = mCommands.poll(1, TimeUnit.SECONDS); command = mCommands.poll(1, TimeUnit.SECONDS);
} }
if (command != null) if (command != null) {
{
commandDescription = command.description; commandDescription = command.description;
Log.d(Email.LOG_TAG, "Running background command '" + command.description + "'"); Log.d(Email.LOG_TAG, "Running background command '" + command.description + "'");
mBusy = true; mBusy = true;
@ -380,8 +341,7 @@ public class MessagingController implements Runnable {
mListeners.remove(listener); mListeners.remove(listener);
} }
public Set<MessagingListener> getListeners() public Set<MessagingListener> getListeners() {
{
return mListeners; return mListeners;
} }
@ -398,10 +358,7 @@ public class MessagingController implements Runnable {
* @param listener * @param listener
* @throws MessagingException * @throws MessagingException
*/ */
public void listFolders( public void listFolders( final Account account, boolean refreshRemote, MessagingListener listener) {
final Account account,
boolean refreshRemote,
MessagingListener listener) {
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.listFoldersStarted(account); l.listFoldersStarted(account);
} }
@ -419,8 +376,7 @@ public class MessagingController implements Runnable {
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.listFolders(account, localFolders); l.listFolders(account, localFolders);
} }
if (listener != null) if (listener != null) {
{
listener.listFolders(account, localFolders); listener.listFolders(account, localFolders);
} }
} }
@ -451,9 +407,7 @@ public class MessagingController implements Runnable {
Folder[] remoteFolders = store.getPersonalNamespaces(); Folder[] remoteFolders = store.getPersonalNamespaces();
LocalStore localStore = (LocalStore)Store.getInstance( LocalStore localStore = (LocalStore)Store.getInstance( account.getLocalStoreUri(), mApplication);
account.getLocalStoreUri(),
mApplication);
HashSet<String> remoteFolderNames = new HashSet<String>(); HashSet<String> remoteFolderNames = new HashSet<String>();
for (int i = 0, count = remoteFolders.length; i < count; i++) { for (int i = 0, count = remoteFolders.length; i < count; i++) {
LocalFolder localFolder = localStore.getFolder(remoteFolders[i].getName()); LocalFolder localFolder = localStore.getFolder(remoteFolders[i].getName());
@ -513,8 +467,7 @@ public class MessagingController implements Runnable {
* @param listener * @param listener
* @throws MessagingException * @throws MessagingException
*/ */
public void listLocalMessages(final Account account, final String folder, public void listLocalMessages(final Account account, final String folder, MessagingListener listener) {
MessagingListener listener) {
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.listLocalMessagesStarted(account, folder); l.listLocalMessagesStarted(account, folder);
} }
@ -523,18 +476,30 @@ public class MessagingController implements Runnable {
Store localStore = Store.getInstance(account.getLocalStoreUri(), mApplication); Store localStore = Store.getInstance(account.getLocalStoreUri(), mApplication);
Folder localFolder = localStore.getFolder(folder); Folder localFolder = localStore.getFolder(folder);
localFolder.open(OpenMode.READ_WRITE); localFolder.open(OpenMode.READ_WRITE);
Message[] localMessages = localFolder.getMessages(null); Message[] localMessages = localFolder.getMessages(
ArrayList<Message> messages = new ArrayList<Message>(); new MessageRetrievalListener() {
for (Message message : localMessages) { public void messageStarted(String message, int number, int ofTotal) {}
public void messageFinished(Message message, int number, int ofTotal) {
if (!message.isSet(Flag.DELETED) && if (!message.isSet(Flag.DELETED) && isMessageSuppressed(account, folder, message) == false) {
isMessageSuppressed(account, localFolder.getName(), message) == false) { //messages.add(message);
messages.add(message);
}
}
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.listLocalMessages(account, folder, messages.toArray(new Message[0])); l.listLocalMessagesAddMessage(account, folder, message);
} }
} else {
for (MessagingListener l : getListeners()) {
l.listLocalMessagesRemoveMessage(account, folder, message);
}
}
}
}
);
ArrayList<Message> messages = new ArrayList<Message>();
//for (Message message : localMessages) { }
//for (MessagingListener l : getListeners()) {
// l.listLocalMessages(account, folder, messages.toArray(new Message[0]));
//}
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.listLocalMessagesFinished(account, folder); l.listLocalMessagesFinished(account, folder);
} }
@ -549,12 +514,9 @@ public class MessagingController implements Runnable {
public void loadMoreMessages(Account account, String folder, MessagingListener listener) { public void loadMoreMessages(Account account, String folder, MessagingListener listener) {
try { try {
LocalStore localStore = (LocalStore) Store.getInstance( LocalStore localStore = (LocalStore) Store.getInstance( account.getLocalStoreUri(), mApplication);
account.getLocalStoreUri(),
mApplication);
LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder);
localFolder.setVisibleLimit(localFolder.getVisibleLimit() localFolder.setVisibleLimit(localFolder.getVisibleLimit() + account.getDisplayCount());
+ account.getDisplayCount());
synchronizeMailbox(account, folder, listener); synchronizeMailbox(account, folder, listener);
} }
catch (MessagingException me) { catch (MessagingException me) {
@ -585,8 +547,7 @@ public class MessagingController implements Runnable {
* @param folder * @param folder
* @param listener * @param listener
*/ */
public void synchronizeMailbox(final Account account, final String folder, public void synchronizeMailbox(final Account account, final String folder, MessagingListener listener) {
MessagingListener listener) {
put("synchronizeMailbox", listener, new Runnable() { put("synchronizeMailbox", listener, new Runnable() {
public void run() { public void run() {
synchronizeMailboxSynchronous(account, folder); synchronizeMailboxSynchronous(account, folder);
@ -628,12 +589,10 @@ public class MessagingController implements Runnable {
Log.v(Email.LOG_TAG, "SYNC: About to process pending commands for folder " + Log.v(Email.LOG_TAG, "SYNC: About to process pending commands for folder " +
account.getDescription() + ":" + folder); account.getDescription() + ":" + folder);
} }
try try {
{
processPendingCommandsSynchronous(account); processPendingCommandsSynchronous(account);
} }
catch (Exception e) catch (Exception e) {
{
addErrorMessage(account, e); addErrorMessage(account, e);
Log.e(Email.LOG_TAG, "Failure processing command, but allow message sync attempt", e); Log.e(Email.LOG_TAG, "Failure processing command, but allow message sync attempt", e);
@ -647,8 +606,7 @@ public class MessagingController implements Runnable {
if (Config.LOGV) { if (Config.LOGV) {
Log.v(Email.LOG_TAG, "SYNC: About to get local folder " + folder); Log.v(Email.LOG_TAG, "SYNC: About to get local folder " + folder);
} }
final LocalStore localStore = final LocalStore localStore = (LocalStore) Store.getInstance(account.getLocalStoreUri(), mApplication);
(LocalStore) Store.getInstance(account.getLocalStoreUri(), mApplication);
tLocalFolder = (LocalFolder) localStore.getFolder(folder); tLocalFolder = (LocalFolder) localStore.getFolder(folder);
final LocalFolder localFolder = tLocalFolder; final LocalFolder localFolder = tLocalFolder;
localFolder.open(OpenMode.READ_WRITE); localFolder.open(OpenMode.READ_WRITE);
@ -743,13 +701,11 @@ public class MessagingController implements Runnable {
int remoteEnd = remoteMessageCount; int remoteEnd = remoteMessageCount;
if (Config.LOGV) { if (Config.LOGV) {
Log.v(Email.LOG_TAG, "SYNC: About to get messages " + remoteStart + " through " Log.v(Email.LOG_TAG, "SYNC: About to get messages " + remoteStart + " through " + remoteEnd + " for folder " + folder);
+ remoteEnd + " for folder " + folder);
} }
remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteEnd, null); remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteEnd, null);
for (Message thisMess : remoteMessageArray) for (Message thisMess : remoteMessageArray) {
{
remoteMessages.add(thisMess); remoteMessages.add(thisMess);
remoteUidMap.put(thisMess.getUid(), thisMess); remoteUidMap.put(thisMess.getUid(), thisMess);
} }
@ -776,8 +732,7 @@ public class MessagingController implements Runnable {
} }
} }
} }
else if (remoteMessageCount < 0) else if (remoteMessageCount < 0) {
{
throw new Exception("Message count " + remoteMessageCount + " for folder " + folder); throw new Exception("Message count " + remoteMessageCount + " for folder " + folder);
} }
@ -832,20 +787,17 @@ public class MessagingController implements Runnable {
* (POP) may not be able to give us headers for * (POP) may not be able to give us headers for
* ENVELOPE, only size. * ENVELOPE, only size.
*/ */
if (isMessageSuppressed(account, folder, message) == false) if (isMessageSuppressed(account, folder, message) == false) {
{ Log.i(Email.LOG_TAG, "place 2 About to notify listeners that we got a new message "+ account + folder + message.getUid());
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.synchronizeMailboxNewMessage(account, folder, l.synchronizeMailboxNewMessage(account, folder, localFolder.getMessage(message.getUid()));
localFolder.getMessage(message.getUid()));
} }
} }
} }
} }
catch (Exception e) { catch (Exception e) {
Log.e(Email.LOG_TAG, Log.e(Email.LOG_TAG, "Error while storing downloaded message.", e);
"Error while storing downloaded message.",
e);
addErrorMessage(account, e); addErrorMessage(account, e);
} }
@ -879,15 +831,13 @@ public class MessagingController implements Runnable {
if (localMessage == null || localMessage.isSet(Flag.DELETED)) { if (localMessage == null || localMessage.isSet(Flag.DELETED)) {
continue; continue;
} }
for (Flag flag : new Flag[] { Flag.SEEN, Flag.FLAGGED, Flag.ANSWERED } ) for (Flag flag : new Flag[] { Flag.SEEN, Flag.FLAGGED, Flag.ANSWERED } ) {
{
if (remoteMessage.isSet(flag) != localMessage.isSet(flag)) { if (remoteMessage.isSet(flag) != localMessage.isSet(flag)) {
localMessage.setFlag(flag, remoteMessage.isSet(flag)); localMessage.setFlag(flag, remoteMessage.isSet(flag));
messageChanged = true; messageChanged = true;
} }
} }
if (messageChanged && isMessageSuppressed(account, folder, localMessage) == false) if (messageChanged && isMessageSuppressed(account, folder, localMessage) == false) {
{
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.synchronizeMailboxNewMessage(account, folder, localMessage); l.synchronizeMailboxNewMessage(account, folder, localMessage);
} }
@ -904,8 +854,7 @@ public class MessagingController implements Runnable {
*/ */
int remoteUnreadMessageCount = remoteFolder.getUnreadMessageCount(); int remoteUnreadMessageCount = remoteFolder.getUnreadMessageCount();
if (remoteUnreadMessageCount == -1) { if (remoteUnreadMessageCount == -1) {
localFolder.setUnreadMessageCount(localFolder.getUnreadMessageCount() localFolder.setUnreadMessageCount(localFolder.getUnreadMessageCount() + newMessages.size());
+ newMessages.size());
} }
else { else {
localFolder.setUnreadMessageCount(remoteUnreadMessageCount); localFolder.setUnreadMessageCount(remoteUnreadMessageCount);
@ -915,9 +864,7 @@ public class MessagingController implements Runnable {
* Remove any messages that are in the local store but no longer on the remote store. * Remove any messages that are in the local store but no longer on the remote store.
*/ */
for (Message localMessage : localMessages) { for (Message localMessage : localMessages) {
if (remoteUidMap.get(localMessage.getUid()) == null && if (remoteUidMap.get(localMessage.getUid()) == null && !localMessage.isSet(Flag.DELETED)) {
!localMessage.isSet(Flag.DELETED))
{
localMessage.setFlag(Flag.X_DESTROYED, true); localMessage.setFlag(Flag.X_DESTROYED, true);
// Log.d(Email.LOG_TAG, "Destroying message " + localMessage.getUid() + " which isn't in the most recent group on server"); // Log.d(Email.LOG_TAG, "Destroying message " + localMessage.getUid() + " which isn't in the most recent group on server");
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
@ -966,9 +913,7 @@ public class MessagingController implements Runnable {
public void messageFinished(Message message, int number, int ofTotal) { public void messageFinished(Message message, int number, int ofTotal) {
try { try {
// Store the updated message locally // Store the updated message locally
localFolder.appendMessages(new Message[] { localFolder.appendMessages(new Message[] { message });
message
});
Message localMessage = localFolder.getMessage(message.getUid()); Message localMessage = localFolder.getMessage(message.getUid());
@ -978,10 +923,7 @@ public class MessagingController implements Runnable {
{ {
// Update the listener with what we've found // Update the listener with what we've found
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.synchronizeMailboxNewMessage( l.synchronizeMailboxNewMessage( account, folder, localMessage);
account,
folder,
localMessage);
} }
} }
} }
@ -1009,8 +951,7 @@ public class MessagingController implements Runnable {
Log.v(Email.LOG_TAG, "SYNC: Fetching large messages for folder " + folder); Log.v(Email.LOG_TAG, "SYNC: Fetching large messages for folder " + folder);
} }
remoteFolder.fetch(largeMessages.toArray(new Message[largeMessages.size()]), remoteFolder.fetch(largeMessages.toArray(new Message[largeMessages.size()]), fp, null);
fp, null);
for (Message message : largeMessages) { for (Message message : largeMessages) {
if (message.getBody() == null) { if (message.getBody() == null) {
/* /*
@ -1029,9 +970,7 @@ public class MessagingController implements Runnable {
remoteFolder.fetch(new Message[] { message }, fp, null); remoteFolder.fetch(new Message[] { message }, fp, null);
// Store the updated message locally // Store the updated message locally
localFolder.appendMessages(new Message[] { localFolder.appendMessages(new Message[] { message });
message
});
Message localMessage = localFolder.getMessage(message.getUid()); Message localMessage = localFolder.getMessage(message.getUid());
@ -1071,9 +1010,7 @@ public class MessagingController implements Runnable {
remoteFolder.fetch(new Message[] { message }, fp, null); remoteFolder.fetch(new Message[] { message }, fp, null);
} }
// Store the updated message locally // Store the updated message locally
localFolder.appendMessages(new Message[] { localFolder.appendMessages(new Message[] { message });
message
});
Message localMessage = localFolder.getMessage(message.getUid()); Message localMessage = localFolder.getMessage(message.getUid());
@ -1081,14 +1018,12 @@ public class MessagingController implements Runnable {
// viewed. // viewed.
localMessage.setFlag(Flag.X_DOWNLOADED_PARTIAL, true); localMessage.setFlag(Flag.X_DOWNLOADED_PARTIAL, true);
} }
if (isMessageSuppressed(account, folder, message) == false)
{ if (isMessageSuppressed(account, folder, message) == false) {
Log.i(Email.LOG_TAG, "About to notify listeners that we got a new message "+ account + folder + message.getUid());
// Update the listener with what we've found // Update the listener with what we've found
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.synchronizeMailboxNewMessage( l.synchronizeMailboxNewMessage( account, folder, localFolder.getMessage(message.getUid()));
account,
folder,
localFolder.getMessage(message.getUid()));
} }
} }
}//for large messsages }//for large messsages
@ -1114,21 +1049,14 @@ public class MessagingController implements Runnable {
} }
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.synchronizeMailboxFinished( l.synchronizeMailboxFinished( account, folder, remoteMessageCount, newMessages.size());
account,
folder,
remoteMessageCount, newMessages.size());
} }
if (commandException != null) if (commandException != null) {
{
String rootMessage = getRootCauseMessage(commandException); String rootMessage = getRootCauseMessage(commandException);
localFolder.setStatus(rootMessage); localFolder.setStatus(rootMessage);
for (MessagingListener l : getListeners()) { for (MessagingListener l : getListeners()) {
l.synchronizeMailboxFailed( l.synchronizeMailboxFailed( account, folder, rootMessage);
account,
folder,
rootMessage);
} }
} }
@ -1742,7 +1670,7 @@ public class MessagingController implements Runnable {
final Flag flag, final Flag flag,
final boolean newState) { final boolean newState) {
// TODO: put this into the background, but right now that causes odd behavior // TODO: put this into the background, but right now that causes odd behavior
// because the FolderMessageList doesn't have its own cache of the flag states // because the MessageList doesn't have its own cache of the flag states
try { try {
Store localStore = Store.getInstance(account.getLocalStoreUri(), mApplication); Store localStore = Store.getInstance(account.getLocalStoreUri(), mApplication);
Folder localFolder = localStore.getFolder(folder); Folder localFolder = localStore.getFolder(folder);
@ -2336,7 +2264,8 @@ public class MessagingController implements Runnable {
Notification notif = new Notification(R.drawable.stat_notify_email_generic, Notification notif = new Notification(R.drawable.stat_notify_email_generic,
mApplication.getString(R.string.send_failure_subject), System.currentTimeMillis()); mApplication.getString(R.string.send_failure_subject), System.currentTimeMillis());
Intent i = FolderMessageList.actionHandleAccountIntent(mApplication, account, account.getErrorFolderName()); // JRV XXX TODO - do we want to notify MessageList too?
Intent i = FolderList.actionHandleAccountIntent(mApplication, account, account.getErrorFolderName());
PendingIntent pi = PendingIntent.getActivity(mApplication, 0, i, 0); PendingIntent pi = PendingIntent.getActivity(mApplication, 0, i, 0);
@ -2773,7 +2702,8 @@ public class MessagingController implements Runnable {
if (account.isShowOngoing()) { if (account.isShowOngoing()) {
Notification notif = new Notification(R.drawable.ic_menu_refresh, Notification notif = new Notification(R.drawable.ic_menu_refresh,
context.getString(R.string.notification_bg_send_ticker, account.getDescription()), System.currentTimeMillis()); context.getString(R.string.notification_bg_send_ticker, account.getDescription()), System.currentTimeMillis());
Intent intent = FolderMessageList.actionHandleAccountIntent(context, account, Email.INBOX); // JRV XXX TODO - do we want to notify MessageList too?
Intent intent = FolderList.actionHandleAccountIntent(context, account, Email.INBOX);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
notif.setLatestEventInfo(context, context.getString(R.string.notification_bg_send_title), notif.setLatestEventInfo(context, context.getString(R.string.notification_bg_send_title),
account.getDescription() , pi); account.getDescription() , pi);
@ -2891,7 +2821,8 @@ public class MessagingController implements Runnable {
Notification notif = new Notification(R.drawable.ic_menu_refresh, Notification notif = new Notification(R.drawable.ic_menu_refresh,
context.getString(R.string.notification_bg_sync_ticker, account.getDescription(), folder.getName()), context.getString(R.string.notification_bg_sync_ticker, account.getDescription(), folder.getName()),
System.currentTimeMillis()); System.currentTimeMillis());
Intent intent = FolderMessageList.actionHandleAccountIntent(context, account, Email.INBOX); // JRV XXX TODO - do we want to notify MessageList too?
Intent intent = FolderList.actionHandleAccountIntent(context, account, Email.INBOX);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
notif.setLatestEventInfo(context, context.getString(R.string.notification_bg_sync_title), account.getDescription() notif.setLatestEventInfo(context, context.getString(R.string.notification_bg_sync_title), account.getDescription()
+ context.getString(R.string.notification_bg_title_separator) + folder.getName(), pi); + context.getString(R.string.notification_bg_title_separator) + folder.getName(), pi);

View File

@ -45,6 +45,12 @@ public class MessagingListener {
public void listLocalMessages(Account account, String folder, Message[] messages) { public void listLocalMessages(Account account, String folder, Message[] messages) {
} }
public void listLocalMessagesAddMessage(Account account, String folder, Message message) {
}
public void listLocalMessagesRemoveMessage(Account account, String folder, Message message) {
}
public void listLocalMessagesFailed(Account account, String folder, String message) { public void listLocalMessagesFailed(Account account, String folder, String message) {
} }

View File

@ -105,10 +105,18 @@ public class Preferences {
getPreferences().edit().putBoolean("enableDebugLogging", value).commit(); getPreferences().edit().putBoolean("enableDebugLogging", value).commit();
} }
public boolean geteEnableDebugLogging() { public boolean getEnableDebugLogging() {
return getPreferences().getBoolean("enableDebugLogging", false); return getPreferences().getBoolean("enableDebugLogging", false);
} }
public void setTheme(int theme) {
getPreferences().edit().putInt("theme", theme).commit();
}
public int getTheme() {
return getPreferences().getInt("theme", android.R.style.Theme_Light);
}
public void setEnableSensitiveLogging(boolean value) { public void setEnableSensitiveLogging(boolean value) {
getPreferences().edit().putBoolean("enableSensitiveLogging", value).commit(); getPreferences().edit().putBoolean("enableSensitiveLogging", value).commit();
} }

View File

@ -164,19 +164,17 @@ public class Utility {
} }
/** /**
* Returns true if the specified date is within today. Returns false otherwise. * Returns true if the specified date is within 18 hours of "now". Returns false otherwise.
* @param date * @param date
* @return * @return
*/ */
public static boolean isDateToday(Date date) { public static boolean isDateToday(Date date) {
// TODO But Calendar is so slowwwwwww.... Date now = new Date();
Date today = new Date(); if (now.getTime() - 64800000 > date.getTime() || now.getTime() + 64800000 < date.getTime()) {
if (date.getYear() == today.getYear() && return false;
date.getMonth() == today.getMonth() && } else {
date.getDate() == today.getDate()) {
return true; return true;
} }
return false;
} }
/* /*

View File

@ -6,7 +6,7 @@ import java.util.concurrent.ConcurrentHashMap;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.ListActivity; import com.android.email.K9ListActivity;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -42,6 +42,7 @@ import com.android.email.MessagingController;
import com.android.email.MessagingListener; import com.android.email.MessagingListener;
import com.android.email.Preferences; import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
import com.android.email.activity.setup.Prefs;
import com.android.email.activity.setup.AccountSettings; import com.android.email.activity.setup.AccountSettings;
import com.android.email.activity.setup.AccountSetupBasics; import com.android.email.activity.setup.AccountSetupBasics;
import com.android.email.activity.setup.AccountSetupCheckSettings; import com.android.email.activity.setup.AccountSetupCheckSettings;
@ -51,7 +52,7 @@ import com.android.email.mail.Store;
import com.android.email.mail.store.LocalStore; import com.android.email.mail.store.LocalStore;
import com.android.email.mail.store.LocalStore.LocalFolder; import com.android.email.mail.store.LocalStore.LocalFolder;
public class Accounts extends ListActivity implements OnItemClickListener, OnClickListener { public class Accounts extends K9ListActivity implements OnItemClickListener, OnClickListener {
private static final int DIALOG_REMOVE_ACCOUNT = 1; private static final int DIALOG_REMOVE_ACCOUNT = 1;
private ConcurrentHashMap<String, Integer> unreadMessageCounts = new ConcurrentHashMap<String, Integer>(); private ConcurrentHashMap<String, Integer> unreadMessageCounts = new ConcurrentHashMap<String, Integer>();
@ -254,10 +255,27 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
private static String UNREAD_MESSAGE_COUNTS = "unreadMessageCounts"; private static String UNREAD_MESSAGE_COUNTS = "unreadMessageCounts";
private static String SELECTED_CONTEXT_ACCOUNT = "selectedContextAccount"; private static String SELECTED_CONTEXT_ACCOUNT = "selectedContextAccount";
private static final String EXTRA_STARTUP = "startup";
public static void actionLaunch(Context context) {
Intent intent = new Intent(context, Accounts.class);
intent.putExtra(EXTRA_STARTUP, true);
context.startActivity(intent);
}
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
Account[] accounts = Preferences.getPreferences(this).getAccounts();
Intent intent = getIntent();
boolean startup =(boolean)intent.getBooleanExtra(EXTRA_STARTUP, false);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_PROGRESS); requestWindowFeature(Window.FEATURE_PROGRESS);
@ -273,14 +291,16 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
mSelectedContextAccount = (Account) icicle.getSerializable("selectedContextAccount"); mSelectedContextAccount = (Account) icicle.getSerializable("selectedContextAccount");
} }
if (icicle != null) if (icicle != null) {
{ Map<String, Integer> oldUnreadMessageCounts = (Map<String, Integer>)icicle.get(UNREAD_MESSAGE_COUNTS);
Map<String, Integer> oldUnreadMessageCounts =
(Map<String, Integer>)icicle.get(UNREAD_MESSAGE_COUNTS);
if (oldUnreadMessageCounts != null) { if (oldUnreadMessageCounts != null) {
unreadMessageCounts.putAll(oldUnreadMessageCounts); unreadMessageCounts.putAll(oldUnreadMessageCounts);
} }
} }
if (startup && accounts.length == 1) {
intent.putExtra(EXTRA_STARTUP, false);
FolderList.actionHandleAccount(this, accounts[0], accounts[0].getAutoExpandFolderName());
}
} }
@Override @Override
@ -301,8 +321,7 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
} }
@Override @Override
public void onPause() public void onPause() {
{
super.onPause(); super.onPause();
MessagingController.getInstance(getApplication()).removeListener(mListener); MessagingController.getInstance(getApplication()).removeListener(mListener);
} }
@ -315,8 +334,7 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
mHandler.progress(Window.PROGRESS_START); mHandler.progress(Window.PROGRESS_START);
} }
for (Account account : accounts) for (Account account : accounts) {
{
MessagingController.getInstance(getApplication()).getAccountUnreadCount(Accounts.this, account, mListener); MessagingController.getInstance(getApplication()).getAccountUnreadCount(Accounts.this, account, mListener);
pendingWork.put(account, "true"); pendingWork.put(account, "true");
} }
@ -331,8 +349,12 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
AccountSettings.actionSettings(this, account); AccountSettings.actionSettings(this, account);
} }
private void onCheckMail(Account account) { private void onEditPrefs() {
Prefs.actionPrefs(this);
}
private void onCheckMail(Account account) {
MessagingController.getInstance(getApplication()).checkMail(this, account, true, true, null); MessagingController.getInstance(getApplication()).checkMail(this, account, true, true, null);
} }
@ -340,15 +362,13 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
MessagingController.getInstance(getApplication()).clearAllPending(account); MessagingController.getInstance(getApplication()).clearAllPending(account);
} }
private void onEmptyTrash(Account account) private void onEmptyTrash(Account account) {
{
MessagingController.getInstance(getApplication()).emptyTrash(account, null); MessagingController.getInstance(getApplication()).emptyTrash(account, null);
} }
private void onCompose() { private void onCompose() {
Account defaultAccount = Account defaultAccount = Preferences.getPreferences(this).getDefaultAccount();
Preferences.getPreferences(this).getDefaultAccount();
if (defaultAccount != null) { if (defaultAccount != null) {
MessageCompose.actionCompose(this, defaultAccount); MessageCompose.actionCompose(this, defaultAccount);
} }
@ -358,7 +378,7 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
} }
private void onOpenAccount(Account account) { private void onOpenAccount(Account account) {
FolderMessageList.actionHandleAccount(this, account); FolderList.actionHandleAccount(this, account);
} }
public void onClick(View view) { public void onClick(View view) {
@ -384,15 +404,12 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
private Dialog createRemoveAccountDialog() { private Dialog createRemoveAccountDialog() {
return new AlertDialog.Builder(this) return new AlertDialog.Builder(this)
.setTitle(R.string.account_delete_dlg_title) .setTitle(R.string.account_delete_dlg_title)
.setMessage(getString(R.string.account_delete_dlg_instructions_fmt, .setMessage(getString(R.string.account_delete_dlg_instructions_fmt, mSelectedContextAccount.getDescription()))
mSelectedContextAccount.getDescription()))
.setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) { public void onClick(DialogInterface dialog, int whichButton) {
dismissDialog(DIALOG_REMOVE_ACCOUNT); dismissDialog(DIALOG_REMOVE_ACCOUNT);
try { try {
((LocalStore)Store.getInstance( ((LocalStore)Store.getInstance( mSelectedContextAccount.getLocalStoreUri(), getApplication())).delete();
mSelectedContextAccount.getLocalStoreUri(),
getApplication())).delete();
} catch (Exception e) { } catch (Exception e) {
// Ignore // Ignore
} }
@ -413,6 +430,9 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo(); AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
Account account = (Account)getListView().getItemAtPosition(menuInfo.position); Account account = (Account)getListView().getItemAtPosition(menuInfo.position);
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.edit_prefs:
onEditPrefs();
break;
case R.id.delete_account: case R.id.delete_account:
onDeleteAccount(account); onDeleteAccount(account);
break; break;
@ -441,14 +461,12 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
return true; return true;
} }
private void onCompact(Account account) private void onCompact(Account account) {
{
mHandler.workingAccount(account, R.string.compacting_account); mHandler.workingAccount(account, R.string.compacting_account);
MessagingController.getInstance(getApplication()).compact(account, null); MessagingController.getInstance(getApplication()).compact(account, null);
} }
private void onClear(Account account) private void onClear(Account account) {
{
mHandler.workingAccount(account, R.string.clearing_account); mHandler.workingAccount(account, R.string.clearing_account);
MessagingController.getInstance(getApplication()).clear(account, null); MessagingController.getInstance(getApplication()).clear(account, null);
} }
@ -465,6 +483,9 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
case R.id.add_new_account: case R.id.add_new_account:
onAddNewAccount(); onAddNewAccount();
break; break;
case R.id.edit_prefs:
onEditPrefs();
break;
case R.id.check_mail: case R.id.check_mail:
onCheckMail(null); onCheckMail(null);
break; break;
@ -513,8 +534,7 @@ public class Accounts extends ListActivity implements OnItemClickListener, OnCli
private String getVersionNumber() { private String getVersionNumber() {
String version = "?"; String version = "?";
try { try {
PackageInfo pi = PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
getPackageManager().getPackageInfo(getPackageName(), 0);
version = pi.versionName; version = pi.versionName;
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
//Log.e(TAG, "Package name not found", e); //Log.e(TAG, "Package name not found", e);
@ -585,13 +605,11 @@ getPackageManager().getPackageInfo(getPackageName(), 0);
} }
Integer unreadMessageCount = unreadMessageCounts.get(account.getUuid()); Integer unreadMessageCount = unreadMessageCounts.get(account.getUuid());
if (unreadMessageCount != null) if (unreadMessageCount != null) {
{
holder.newMessageCount.setText(Integer.toString(unreadMessageCount)); holder.newMessageCount.setText(Integer.toString(unreadMessageCount));
holder.newMessageCount.setVisibility(unreadMessageCount > 0 ? View.VISIBLE : View.GONE); holder.newMessageCount.setVisibility(unreadMessageCount > 0 ? View.VISIBLE : View.GONE);
} }
else else {
{
//holder.newMessageCount.setText("-"); //holder.newMessageCount.setText("-");
holder.newMessageCount.setVisibility(View.GONE); holder.newMessageCount.setVisibility(View.GONE);
} }

View File

@ -5,7 +5,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import android.app.ListActivity; import com.android.email.K9ListActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -27,7 +27,7 @@ import com.android.email.R;
import com.android.email.mail.Folder; import com.android.email.mail.Folder;
import com.android.email.mail.MessagingException; import com.android.email.mail.MessagingException;
public class ChooseFolder extends ListActivity public class ChooseFolder extends K9ListActivity
{ {
String mFolder; String mFolder;
Account mAccount; Account mAccount;

View File

@ -1,7 +1,7 @@
package com.android.email.activity; package com.android.email.activity;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
@ -19,7 +19,7 @@ import com.android.email.R;
import java.lang.Integer; import java.lang.Integer;
public class Debug extends Activity implements OnCheckedChangeListener { public class Debug extends K9Activity implements OnCheckedChangeListener {
private TextView mVersionView; private TextView mVersionView;
private CheckBox mEnableDebugLoggingView; private CheckBox mEnableDebugLoggingView;
private CheckBox mEnableSensitiveLoggingView; private CheckBox mEnableSensitiveLoggingView;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -62,7 +62,7 @@ import com.android.email.mail.internet.TextBody;
import com.android.email.mail.store.LocalStore; import com.android.email.mail.store.LocalStore;
import com.android.email.mail.store.LocalStore.LocalAttachmentBody; import com.android.email.mail.store.LocalStore.LocalAttachmentBody;
public class MessageCompose extends Activity implements OnClickListener, OnFocusChangeListener { public class MessageCompose extends K9Activity implements OnClickListener, OnFocusChangeListener {
private static final String ACTION_REPLY = "com.android.email.intent.action.REPLY"; private static final String ACTION_REPLY = "com.android.email.intent.action.REPLY";
private static final String ACTION_REPLY_ALL = "com.android.email.intent.action.REPLY_ALL"; private static final String ACTION_REPLY_ALL = "com.android.email.intent.action.REPLY_ALL";
private static final String ACTION_FORWARD = "com.android.email.intent.action.FORWARD"; private static final String ACTION_FORWARD = "com.android.email.intent.action.FORWARD";
@ -314,8 +314,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
/* /*
* This data gets used in onCreate, so grab it here instead of onRestoreIntstanceState * This data gets used in onCreate, so grab it here instead of onRestoreIntstanceState
*/ */
mSourceMessageProcessed = mSourceMessageProcessed = savedInstanceState.getBoolean(STATE_KEY_SOURCE_MESSAGE_PROCED, false);
savedInstanceState.getBoolean(STATE_KEY_SOURCE_MESSAGE_PROCED, false);
} }
Intent intent = getIntent(); Intent intent = getIntent();
@ -372,13 +371,11 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
} }
String text = intent.getStringExtra(Intent.EXTRA_TEXT); String text = intent.getStringExtra(Intent.EXTRA_TEXT);
if (text != null) if (text != null) {
{
mMessageContentView.setText(text); mMessageContentView.setText(text);
} }
String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
if (subject != null) if (subject != null) {
{
mSubjectView.setText(subject); mSubjectView.setText(subject);
} }
@ -451,16 +448,14 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
} }
Log.d(Email.LOG_TAG, "action = " + action + ", mAccount = " + mAccount + ", mFolder = " + mFolder + ", mSourceMessageUid = " + mSourceMessageUid); Log.d(Email.LOG_TAG, "action = " + action + ", mAccount = " + mAccount + ", mFolder = " + mFolder + ", mSourceMessageUid = " + mSourceMessageUid);
if ((ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) && mAccount != null && mFolder != null && mSourceMessageUid != null) if ((ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) && mAccount != null && mFolder != null && mSourceMessageUid != null) {
{
Log.d(Email.LOG_TAG, "Setting message ANSWERED flag to true"); Log.d(Email.LOG_TAG, "Setting message ANSWERED flag to true");
// TODO: Really, we should wait until we send the message, but that would require saving the original // TODO: Really, we should wait until we send the message, but that would require saving the original
// message info along with a Draft copy, in case it is left in Drafts for a while before being sent // message info along with a Draft copy, in case it is left in Drafts for a while before being sent
MessagingController.getInstance(getApplication()).setMessageFlag(mAccount, mFolder, mSourceMessageUid, Flag.ANSWERED, true); MessagingController.getInstance(getApplication()).setMessageFlag(mAccount, mFolder, mSourceMessageUid, Flag.ANSWERED, true);
} }
if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action) || if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action) || ACTION_FORWARD.equals(action) || ACTION_EDIT_DRAFT.equals(action)) {
ACTION_FORWARD.equals(action) || ACTION_EDIT_DRAFT.equals(action)) {
/* /*
* If we need to load the message we add ourself as a message listener here * If we need to load the message we add ourself as a message listener here
* so we can kick it off. Normally we add in onResume but we don't * so we can kick it off. Normally we add in onResume but we don't
@ -468,14 +463,9 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
* There is no harm in adding twice. * There is no harm in adding twice.
*/ */
MessagingController.getInstance(getApplication()).addListener(mListener); MessagingController.getInstance(getApplication()).addListener(mListener);
MessagingController.getInstance(getApplication()).loadMessageForView( MessagingController.getInstance(getApplication()).loadMessageForView( mAccount, mFolder, mSourceMessageUid, null);
mAccount,
mFolder,
mSourceMessageUid,
null);
} }
if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action) || if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action) || ACTION_EDIT_DRAFT.equals(action)) {
ACTION_EDIT_DRAFT.equals(action)) {
//change focus to message body. //change focus to message body.
mMessageContentView.requestFocus(); mMessageContentView.requestFocus();
} }
@ -525,8 +515,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
outState.putParcelableArrayList(STATE_KEY_ATTACHMENTS, attachments); outState.putParcelableArrayList(STATE_KEY_ATTACHMENTS, attachments);
outState.putBoolean(STATE_KEY_CC_SHOWN, mCcView.getVisibility() == View.VISIBLE); outState.putBoolean(STATE_KEY_CC_SHOWN, mCcView.getVisibility() == View.VISIBLE);
outState.putBoolean(STATE_KEY_BCC_SHOWN, mBccView.getVisibility() == View.VISIBLE); outState.putBoolean(STATE_KEY_BCC_SHOWN, mBccView.getVisibility() == View.VISIBLE);
outState.putBoolean(STATE_KEY_QUOTED_TEXT_SHOWN, outState.putBoolean(STATE_KEY_QUOTED_TEXT_SHOWN, mQuotedTextBar.getVisibility() == View.VISIBLE);
mQuotedTextBar.getVisibility() == View.VISIBLE);
outState.putBoolean(STATE_KEY_SOURCE_MESSAGE_PROCED, mSourceMessageProcessed); outState.putBoolean(STATE_KEY_SOURCE_MESSAGE_PROCED, mSourceMessageProcessed);
outState.putString(STATE_KEY_DRAFT_UID, mDraftUid); outState.putString(STATE_KEY_DRAFT_UID, mDraftUid);
} }
@ -534,22 +523,17 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
@Override @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState); super.onRestoreInstanceState(savedInstanceState);
ArrayList<Parcelable> attachments = (ArrayList<Parcelable>) ArrayList<Parcelable> attachments = (ArrayList<Parcelable>) savedInstanceState.getParcelableArrayList(STATE_KEY_ATTACHMENTS);
savedInstanceState.getParcelableArrayList(STATE_KEY_ATTACHMENTS);
mAttachments.removeAllViews(); mAttachments.removeAllViews();
for (Parcelable p : attachments) { for (Parcelable p : attachments) {
Uri uri = (Uri) p; Uri uri = (Uri) p;
addAttachment(uri); addAttachment(uri);
} }
mCcView.setVisibility(savedInstanceState.getBoolean(STATE_KEY_CC_SHOWN) ? mCcView.setVisibility(savedInstanceState.getBoolean(STATE_KEY_CC_SHOWN) ? View.VISIBLE : View.GONE);
View.VISIBLE : View.GONE); mBccView.setVisibility(savedInstanceState.getBoolean(STATE_KEY_BCC_SHOWN) ? View.VISIBLE : View.GONE);
mBccView.setVisibility(savedInstanceState.getBoolean(STATE_KEY_BCC_SHOWN) ? mQuotedTextBar.setVisibility(savedInstanceState.getBoolean(STATE_KEY_QUOTED_TEXT_SHOWN) ? View.VISIBLE : View.GONE);
View.VISIBLE : View.GONE); mQuotedText.setVisibility(savedInstanceState.getBoolean(STATE_KEY_QUOTED_TEXT_SHOWN) ? View.VISIBLE : View.GONE);
mQuotedTextBar.setVisibility(savedInstanceState.getBoolean(STATE_KEY_QUOTED_TEXT_SHOWN) ?
View.VISIBLE : View.GONE);
mQuotedText.setVisibility(savedInstanceState.getBoolean(STATE_KEY_QUOTED_TEXT_SHOWN) ?
View.VISIBLE : View.GONE);
mDraftUid = savedInstanceState.getString(STATE_KEY_DRAFT_UID); mDraftUid = savedInstanceState.getString(STATE_KEY_DRAFT_UID);
mDraftNeedsSaving = false; mDraftNeedsSaving = false;
} }
@ -610,15 +594,12 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
String action = getIntent().getAction(); String action = getIntent().getAction();
if (mQuotedTextBar.getVisibility() == View.VISIBLE) { if (mQuotedTextBar.getVisibility() == View.VISIBLE) {
String quotedText = null; String quotedText = null;
Part part = MimeUtility.findFirstPartByMimeType(mSourceMessage, Part part = MimeUtility.findFirstPartByMimeType(mSourceMessage, "text/plain");
"text/plain");
if (part != null) { if (part != null) {
quotedText = MimeUtility.getTextFromPart(part); quotedText = MimeUtility.getTextFromPart(part);
} }
if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) { if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) {
text += String.format( text += String.format( getString(R.string.message_compose_reply_header_fmt), Address.toString(mSourceMessage.getFrom()));
getString(R.string.message_compose_reply_header_fmt),
Address.toString(mSourceMessage.getFrom()));
if (quotedText != null) { if (quotedText != null) {
text += quotedText.replaceAll("(?m)^", ">"); text += quotedText.replaceAll("(?m)^", ">");
} }
@ -628,10 +609,8 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
getString(R.string.message_compose_fwd_header_fmt), getString(R.string.message_compose_fwd_header_fmt),
mSourceMessage.getSubject(), mSourceMessage.getSubject(),
Address.toString(mSourceMessage.getFrom()), Address.toString(mSourceMessage.getFrom()),
Address.toString( Address.toString( mSourceMessage.getRecipients(RecipientType.TO)),
mSourceMessage.getRecipients(RecipientType.TO)), Address.toString( mSourceMessage.getRecipients(RecipientType.CC)));
Address.toString(
mSourceMessage.getRecipients(RecipientType.CC)));
if (quotedText != null) { if (quotedText != null) {
text += quotedText; text += quotedText;
} }
@ -661,15 +640,10 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) { for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
Attachment attachment = (Attachment) mAttachments.getChildAt(i).getTag(); Attachment attachment = (Attachment) mAttachments.getChildAt(i).getTag();
MimeBodyPart bp = new MimeBodyPart( MimeBodyPart bp = new MimeBodyPart( new LocalStore.LocalAttachmentBody(attachment.uri, getApplication()));
new LocalStore.LocalAttachmentBody(attachment.uri, getApplication())); bp.setHeader(MimeHeader.HEADER_CONTENT_TYPE, String.format("%s;\n name=\"%s\"", attachment.contentType, attachment.name));
bp.setHeader(MimeHeader.HEADER_CONTENT_TYPE, String.format("%s;\n name=\"%s\"",
attachment.contentType,
attachment.name));
bp.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64"); bp.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
bp.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, bp.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, String.format("attachment;\n filename=\"%s\"", attachment.name));
String.format("attachment;\n filename=\"%s\"",
attachment.name));
mp.addBodyPart(bp); mp.addBodyPart(bp);
} }
@ -740,16 +714,11 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
* TODO Is it possible for us to be editing a draft with a null source message? Don't * TODO Is it possible for us to be editing a draft with a null source message? Don't
* think so. Could probably remove below check. * think so. Could probably remove below check.
*/ */
if (ACTION_EDIT_DRAFT.equals(getIntent().getAction()) if (ACTION_EDIT_DRAFT.equals(getIntent().getAction()) && mSourceMessageUid != null) {
&& mSourceMessageUid != null) {
/* /*
* We're sending a previously saved draft, so delete the old draft first. * We're sending a previously saved draft, so delete the old draft first.
*/ */
MessagingController.getInstance(getApplication()).deleteMessage( MessagingController.getInstance(getApplication()).deleteMessage( mAccount, mFolder, mSourceMessage, null);
mAccount,
mFolder,
mSourceMessage,
null);
} }
MessagingController.getInstance(getApplication()).sendMessage(mAccount, message, null); MessagingController.getInstance(getApplication()).sendMessage(mAccount, message, null);
} }
@ -764,12 +733,9 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
} }
private void onSend() { private void onSend() {
if (getAddresses(mToView).length == 0 && if (getAddresses(mToView).length == 0 && getAddresses(mCcView).length == 0 && getAddresses(mBccView).length == 0) {
getAddresses(mCcView).length == 0 &&
getAddresses(mBccView).length == 0) {
mToView.setError(getString(R.string.message_compose_error_no_recipients)); mToView.setError(getString(R.string.message_compose_error_no_recipients));
Toast.makeText(this, getString(R.string.message_compose_error_no_recipients), Toast.makeText(this, getString(R.string.message_compose_error_no_recipients), Toast.LENGTH_LONG).show();
Toast.LENGTH_LONG).show();
return; return;
} }
sendOrSaveMessage(false); sendOrSaveMessage(false);
@ -780,11 +746,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
private void onDiscard() { private void onDiscard() {
if (mSourceMessageUid != null) { if (mSourceMessageUid != null) {
if (ACTION_EDIT_DRAFT.equals(getIntent().getAction()) && mSourceMessageUid != null) { if (ACTION_EDIT_DRAFT.equals(getIntent().getAction()) && mSourceMessageUid != null) {
MessagingController.getInstance(getApplication()).deleteMessage( MessagingController.getInstance(getApplication()).deleteMessage( mAccount, mFolder, mSourceMessage, null);
mAccount,
mFolder,
mSourceMessage,
null);
} }
} }
mHandler.sendEmptyMessage(MSG_DISCARDED_DRAFT); mHandler.sendEmptyMessage(MSG_DISCARDED_DRAFT);
@ -832,12 +794,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
attachment.uri = uri; attachment.uri = uri;
if (attachment.size == -1 || attachment.name == null) { if (attachment.size == -1 || attachment.name == null) {
Cursor metadataCursor = contentResolver.query( Cursor metadataCursor = contentResolver.query( uri, new String[]{ OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }, null, null, null);
uri,
new String[]{ OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE },
null,
null,
null);
if (metadataCursor != null) { if (metadataCursor != null) {
try { try {
if (metadataCursor.moveToFirst()) { if (metadataCursor.moveToFirst()) {
@ -858,10 +815,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
attachment.name = uri.getLastPathSegment(); attachment.name = uri.getLastPathSegment();
} }
View view = getLayoutInflater().inflate( View view = getLayoutInflater().inflate( R.layout.message_compose_attachment, mAttachments, false);
R.layout.message_compose_attachment,
mAttachments,
false);
TextView nameView = (TextView)view.findViewById(R.id.attachment_name); TextView nameView = (TextView)view.findViewById(R.id.attachment_name);
ImageButton delete = (ImageButton)view.findViewById(R.id.attachment_delete); ImageButton delete = (ImageButton)view.findViewById(R.id.attachment_delete);
nameView.setText(attachment.name); nameView.setText(attachment.name);
@ -971,8 +925,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
String action = getIntent().getAction(); String action = getIntent().getAction();
if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) { if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) {
try { try {
if (message.getSubject() != null && if (message.getSubject() != null && !message.getSubject().toLowerCase().startsWith("re:")) {
!message.getSubject().toLowerCase().startsWith("re:")) {
mSubjectView.setText("Re: " + message.getSubject()); mSubjectView.setText("Re: " + message.getSubject());
} }
else { else {
@ -1014,8 +967,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
if (text != null) { if (text != null) {
mQuotedTextBar.setVisibility(View.VISIBLE); mQuotedTextBar.setVisibility(View.VISIBLE);
mQuotedText.setVisibility(View.VISIBLE); mQuotedText.setVisibility(View.VISIBLE);
mQuotedText.loadDataWithBaseURL("email://", text, part.getMimeType(), mQuotedText.loadDataWithBaseURL("email://", text, part.getMimeType(), "utf-8", null);
"utf-8", null);
} }
} }
} }
@ -1028,8 +980,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
} }
else if (ACTION_FORWARD.equals(action)) { else if (ACTION_FORWARD.equals(action)) {
try { try {
if (message.getSubject() != null && if (message.getSubject() != null && !message.getSubject().toLowerCase().startsWith("fwd:")) {
!message.getSubject().toLowerCase().startsWith("fwd:")) {
mSubjectView.setText("Fwd: " + message.getSubject()); mSubjectView.setText("Fwd: " + message.getSubject());
} }
else { else {
@ -1045,8 +996,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
if (text != null) { if (text != null) {
mQuotedTextBar.setVisibility(View.VISIBLE); mQuotedTextBar.setVisibility(View.VISIBLE);
mQuotedText.setVisibility(View.VISIBLE); mQuotedText.setVisibility(View.VISIBLE);
mQuotedText.loadDataWithBaseURL("email://", text, part.getMimeType(), mQuotedText.loadDataWithBaseURL("email://", text, part.getMimeType(), "utf-8", null);
"utf-8", null);
} }
} }
if (!mSourceMessageProcessed) { if (!mSourceMessageProcessed) {
@ -1098,14 +1048,12 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
} }
@Override @Override
public void loadMessageForViewFinished(Account account, String folder, String uid, public void loadMessageForViewFinished(Account account, String folder, String uid, Message message) {
Message message) {
mHandler.sendEmptyMessage(MSG_PROGRESS_OFF); mHandler.sendEmptyMessage(MSG_PROGRESS_OFF);
} }
@Override @Override
public void loadMessageForViewBodyAvailable(Account account, String folder, String uid, public void loadMessageForViewBodyAvailable(Account account, String folder, String uid, final Message message) {
final Message message) {
mSourceMessage = message; mSourceMessage = message;
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
@ -1115,22 +1063,14 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
} }
@Override @Override
public void loadMessageForViewFailed(Account account, String folder, String uid, public void loadMessageForViewFailed(Account account, String folder, String uid, final String message) {
final String message) {
mHandler.sendEmptyMessage(MSG_PROGRESS_OFF); mHandler.sendEmptyMessage(MSG_PROGRESS_OFF);
// TODO show network error // TODO show network error
} }
@Override @Override
public void messageUidChanged( public void messageUidChanged( Account account, String folder, String oldUid, String newUid) {
Account account, if (account.equals(mAccount) && (folder.equals(mFolder) || (mFolder == null && folder.equals(mAccount.getDraftsFolderName())))) {
String folder,
String oldUid,
String newUid) {
if (account.equals(mAccount)
&& (folder.equals(mFolder)
|| (mFolder == null
&& folder.equals(mAccount.getDraftsFolderName())))) {
if (oldUid.equals(mDraftUid)) { if (oldUid.equals(mDraftUid)) {
mDraftUid = newUid; mDraftUid = newUid;
} }

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@ import java.util.Map;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -36,7 +36,9 @@ import android.view.View;
import android.view.Window; import android.view.Window;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.webkit.CacheManager; import android.webkit.CacheManager;
import android.webkit.CacheManager;
import android.webkit.UrlInterceptHandler; import android.webkit.UrlInterceptHandler;
// import android.webkit.PluginData; // XXX TODO reenable when we switch to sdk 1.5
import android.webkit.WebView; import android.webkit.WebView;
import android.webkit.CacheManager.CacheResult; import android.webkit.CacheManager.CacheResult;
import android.widget.Button; import android.widget.Button;
@ -67,7 +69,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class MessageView extends Activity public class MessageView extends K9Activity
implements UrlInterceptHandler, OnClickListener { implements UrlInterceptHandler, OnClickListener {
private static final String EXTRA_ACCOUNT = "com.android.email.MessageView_account"; private static final String EXTRA_ACCOUNT = "com.android.email.MessageView_account";
private static final String EXTRA_FOLDER = "com.android.email.MessageView_folder"; private static final String EXTRA_FOLDER = "com.android.email.MessageView_folder";
@ -85,6 +87,7 @@ public class MessageView extends Activity
private TextView mDateView; private TextView mDateView;
private TextView mToView; private TextView mToView;
private TextView mSubjectView; private TextView mSubjectView;
private int defaultSubjectColor;
private WebView mMessageContentView; private WebView mMessageContentView;
private LinearLayout mAttachments; private LinearLayout mAttachments;
private View mAttachmentIcon; private View mAttachmentIcon;
@ -108,6 +111,7 @@ public class MessageView extends Activity
private Menu optionsMenu = null; private Menu optionsMenu = null;
// public PluginData getPluginData(String x, Map<String,String> y) {return null;} // XXX TODO reenable when we switch to 1.5
private DateFormat getDateFormat() private DateFormat getDateFormat()
{ {
@ -145,9 +149,6 @@ public class MessageView extends Activity
private Listener mListener = new Listener(); private Listener mListener = new Listener();
private MessageViewHandler mHandler = new MessageViewHandler(); private MessageViewHandler mHandler = new MessageViewHandler();
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) { switch (keyCode) {
case KeyEvent.KEYCODE_DEL: { onDelete(); return true;} case KeyEvent.KEYCODE_DEL: { onDelete(); return true;}
@ -179,8 +180,6 @@ public class MessageView extends Activity
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
class MessageViewHandler extends Handler { class MessageViewHandler extends Handler {
private static final int MSG_PROGRESS = 2; private static final int MSG_PROGRESS = 2;
private static final int MSG_ADD_ATTACHMENT = 3; private static final int MSG_ADD_ATTACHMENT = 3;
@ -223,7 +222,7 @@ public class MessageView extends Activity
mSubjectView.setTextColor(0xff000000 | Email.FLAGGED_COLOR); mSubjectView.setTextColor(0xff000000 | Email.FLAGGED_COLOR);
} }
else { else {
mSubjectView.setTextColor(0xff000000); mSubjectView.setTextColor(0xff000000 | defaultSubjectColor );
} }
if ((msg.arg2 & FLAG_ANSWERED) != 0) { if ((msg.arg2 & FLAG_ANSWERED) != 0) {
Drawable answeredIcon = getResources().getDrawable( Drawable answeredIcon = getResources().getDrawable(
@ -342,13 +341,11 @@ public class MessageView extends Activity
public ImageView iconView; public ImageView iconView;
} }
public static void actionView(Context context, Account account, public static void actionView(Context context, Account account, String folder, String messageUid, ArrayList<String> folderUids) {
String folder, String messageUid, ArrayList<String> folderUids) {
actionView(context, account, folder, messageUid, folderUids, null); actionView(context, account, folder, messageUid, folderUids, null);
} }
public static void actionView(Context context, Account account, public static void actionView(Context context, Account account, String folder, String messageUid, ArrayList<String> folderUids, Bundle extras) {
String folder, String messageUid, ArrayList<String> folderUids, Bundle extras) {
Intent i = new Intent(context, MessageView.class); Intent i = new Intent(context, MessageView.class);
i.putExtra(EXTRA_ACCOUNT, account); i.putExtra(EXTRA_ACCOUNT, account);
i.putExtra(EXTRA_FOLDER, folder); i.putExtra(EXTRA_FOLDER, folder);
@ -364,12 +361,16 @@ public class MessageView extends Activity
super.onCreate(icicle); super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.message_view); setContentView(R.layout.message_view);
mFromView = (TextView)findViewById(R.id.from); mFromView = (TextView)findViewById(R.id.from);
mToView = (TextView)findViewById(R.id.to); mToView = (TextView)findViewById(R.id.to);
mSubjectView = (TextView)findViewById(R.id.subject); mSubjectView = (TextView)findViewById(R.id.subject);
defaultSubjectColor = mSubjectView.getCurrentTextColor();
mDateView = (TextView)findViewById(R.id.date); mDateView = (TextView)findViewById(R.id.date);
mMessageContentView = (WebView)findViewById(R.id.message_content); mMessageContentView = (WebView)findViewById(R.id.message_content);
//mMessageContentView.setWebViewClient(new MessageWebViewClient()); //mMessageContentView.setWebViewClient(new MessageWebViewClient());
@ -377,6 +378,7 @@ public class MessageView extends Activity
mAttachmentIcon = findViewById(R.id.attachment); mAttachmentIcon = findViewById(R.id.attachment);
mShowPicturesSection = findViewById(R.id.show_pictures_section); mShowPicturesSection = findViewById(R.id.show_pictures_section);
mMessageContentView.setVerticalScrollBarEnabled(false); mMessageContentView.setVerticalScrollBarEnabled(false);
mAttachments.setVisibility(View.GONE); mAttachments.setVisibility(View.GONE);
mAttachmentIcon.setVisibility(View.GONE); mAttachmentIcon.setVisibility(View.GONE);
@ -1075,8 +1077,8 @@ public class MessageView extends Activity
* TODO this should be smarter, change to regex for img, but consider how to * TODO this should be smarter, change to regex for img, but consider how to
* get background images and a million other things that HTML allows. * get background images and a million other things that HTML allows.
*/ */
mHandler.showShowPictures(text.contains("<img"));
mMessageContentView.loadDataWithBaseURL("email://", text, "text/html", "utf-8", null); mMessageContentView.loadDataWithBaseURL("email://", text, "text/html", "utf-8", null);
mHandler.showShowPictures(text.contains("<img"));
} }
else { else {
mMessageContentView.loadUrl("file:///android_asset/empty.html"); mMessageContentView.loadUrl("file:///android_asset/empty.html");

View File

@ -1,11 +1,10 @@
package com.android.email.activity; package com.android.email.activity;
import com.android.email.Account; import com.android.email.Account;
import com.android.email.Email; import com.android.email.Email;
import com.android.email.Preferences; import com.android.email.Preferences;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -14,23 +13,17 @@ import android.os.Bundle;
* the user should start with. * the user should start with.
* If no accounts are configured the user is taken to the Accounts Activity where they * If no accounts are configured the user is taken to the Accounts Activity where they
* can configure an account. * can configure an account.
* If a single account is configured the user is taken directly to the FolderMessageList for * If a single account is configured the user is taken directly to the MessageList for
* the INBOX of that account. * the INBOX of that account.
* If more than one account is configuref the user is takaen to the Accounts Activity so they * If more than one account is configuref the user is takaen to the Accounts Activity so they
* can select an account. * can select an account.
*/ */
public class Welcome extends Activity { public class Welcome extends K9Activity {
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
Account[] accounts = Preferences.getPreferences(this).getAccounts(); Accounts.actionLaunch(this);
if (accounts.length == 1) {
FolderMessageList.actionHandleAccount(this, accounts[0], Email.INBOX);
} else {
startActivity(new Intent(this, Accounts.class));
}
finish(); finish();
} }
} }

View File

@ -9,7 +9,7 @@ import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.Button;
import android.preference.PreferenceActivity; import com.android.email.K9PreferenceActivity;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
@ -24,7 +24,7 @@ import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
import com.android.email.activity.ChooseFolder; import com.android.email.activity.ChooseFolder;
public class AccountSettings extends PreferenceActivity { public class AccountSettings extends K9PreferenceActivity {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final int SELECT_AUTO_EXPAND_FOLDER = 1; private static final int SELECT_AUTO_EXPAND_FOLDER = 1;

View File

@ -4,7 +4,7 @@ package com.android.email.activity.setup;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -20,7 +20,7 @@ import com.android.email.R;
* passed in email address, password and makeDefault are then passed on to the * passed in email address, password and makeDefault are then passed on to the
* AccountSetupIncoming activity. * AccountSetupIncoming activity.
*/ */
public class AccountSetupAccountType extends Activity implements OnClickListener { public class AccountSetupAccountType extends K9Activity implements OnClickListener {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";

View File

@ -5,7 +5,7 @@ import java.io.Serializable;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import android.app.Activity; import com.android.email.K9Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
@ -41,7 +41,7 @@ import com.android.email.Utility;
* activity. If no settings are found the settings are handed off to the * activity. If no settings are found the settings are handed off to the
* AccountSetupAccountType activity. * AccountSetupAccountType activity.
*/ */
public class AccountSetupBasics extends Activity public class AccountSetupBasics extends K9Activity
implements OnClickListener, TextWatcher { implements OnClickListener, TextWatcher {
private final static String EXTRA_ACCOUNT = "com.android.email.AccountSetupBasics.account"; private final static String EXTRA_ACCOUNT = "com.android.email.AccountSetupBasics.account";
private final static int DIALOG_NOTE = 1; private final static int DIALOG_NOTE = 1;

View File

@ -19,8 +19,10 @@ import android.widget.Button;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.android.email.K9Activity;
import com.android.email.Account; import com.android.email.Account;
import com.android.email.Email; import com.android.email.Email;
import com.android.email.MessagingController;
import com.android.email.R; import com.android.email.R;
import com.android.email.mail.AuthenticationFailedException; import com.android.email.mail.AuthenticationFailedException;
import com.android.email.mail.MessagingException; import com.android.email.mail.MessagingException;
@ -36,7 +38,7 @@ import com.android.email.mail.store.TrustManagerFactory;
* XXX NOTE: The manifest for this app has it ignore config changes, because * XXX NOTE: The manifest for this app has it ignore config changes, because
* it doesn't correctly deal with restarting while its thread is running. * it doesn't correctly deal with restarting while its thread is running.
*/ */
public class AccountSetupCheckSettings extends Activity implements OnClickListener { public class AccountSetupCheckSettings extends K9Activity implements OnClickListener {
public static final int ACTIVITY_REQUEST_CODE = 1; public static final int ACTIVITY_REQUEST_CODE = 1;
@ -102,6 +104,17 @@ public class AccountSetupCheckSettings extends Activity implements OnClickListen
setMessage(R.string.account_setup_check_settings_check_incoming_msg); setMessage(R.string.account_setup_check_settings_check_incoming_msg);
store = Store.getInstance(mAccount.getStoreUri(), getApplication()); store = Store.getInstance(mAccount.getStoreUri(), getApplication());
store.checkSettings(); store.checkSettings();
new Thread() {
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
MessagingController.getInstance(getApplication()).listFolders(mAccount, true, null);
MessagingController.getInstance(getApplication()).synchronizeMailbox( mAccount, Email.INBOX , null);
}
}.start();
} }
if (mDestroyed) { if (mDestroyed) {
return; return;

View File

@ -1,6 +1,6 @@
package com.android.email.activity.setup; package com.android.email.activity.setup;
import android.app.Activity; import android.app.Activity;
import com.android.email.K9Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
@ -13,7 +13,7 @@ import com.android.email.Email;
import com.android.email.Preferences; import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
public class AccountSetupComposition extends Activity { public class AccountSetupComposition extends K9Activity {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";

View File

@ -3,8 +3,8 @@ package com.android.email.activity.setup;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import android.app.Activity; import android.app.Activity;
import com.android.email.K9Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@ -29,7 +29,7 @@ import com.android.email.R;
import com.android.email.Utility; import com.android.email.Utility;
import com.android.email.activity.ChooseFolder; import com.android.email.activity.ChooseFolder;
public class AccountSetupIncoming extends Activity implements OnClickListener { public class AccountSetupIncoming extends K9Activity implements OnClickListener {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";

View File

@ -1,7 +1,7 @@
package com.android.email.activity.setup; package com.android.email.activity.setup;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -19,9 +19,9 @@ import com.android.email.Email;
import com.android.email.Preferences; import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
import com.android.email.Utility; import com.android.email.Utility;
import com.android.email.activity.FolderMessageList; import com.android.email.activity.FolderList;
public class AccountSetupNames extends Activity implements OnClickListener { public class AccountSetupNames extends K9Activity implements OnClickListener {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private EditText mDescription; private EditText mDescription;
@ -89,7 +89,7 @@ public class AccountSetupNames extends Activity implements OnClickListener {
} }
mAccount.setName(mName.getText().toString()); mAccount.setName(mName.getText().toString());
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
FolderMessageList.actionHandleAccount(this, mAccount, Email.INBOX); FolderList.actionHandleAccount(this, mAccount, Email.INBOX);
finish(); finish();
} }

View File

@ -1,7 +1,7 @@
package com.android.email.activity.setup; package com.android.email.activity.setup;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -16,7 +16,7 @@ import com.android.email.Email;
import com.android.email.Preferences; import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
public class AccountSetupOptions extends Activity implements OnClickListener { public class AccountSetupOptions extends K9Activity implements OnClickListener {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";

View File

@ -4,7 +4,7 @@ package com.android.email.activity.setup;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import android.app.Activity; import com.android.email.K9Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -28,7 +28,7 @@ import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
import com.android.email.Utility; import com.android.email.Utility;
public class AccountSetupOutgoing extends Activity implements OnClickListener, public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
OnCheckedChangeListener { OnCheckedChangeListener {
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";

View File

@ -7,7 +7,7 @@ import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.preference.PreferenceActivity; import com.android.email.K9PreferenceActivity;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
@ -24,7 +24,7 @@ import com.android.email.mail.Store;
import com.android.email.mail.Folder.FolderClass; import com.android.email.mail.Folder.FolderClass;
import com.android.email.mail.store.LocalStore.LocalFolder; import com.android.email.mail.store.LocalStore.LocalFolder;
public class FolderSettings extends PreferenceActivity { public class FolderSettings extends K9PreferenceActivity {
private static final String EXTRA_FOLDER_NAME = "com.android.email.folderName"; private static final String EXTRA_FOLDER_NAME = "com.android.email.folderName";
private static final String EXTRA_ACCOUNT = "com.android.email.account"; private static final String EXTRA_ACCOUNT = "com.android.email.account";
@ -68,7 +68,7 @@ public class FolderSettings extends PreferenceActivity {
addPreferencesFromResource(R.xml.folder_settings_preferences); addPreferencesFromResource(R.xml.folder_settings_preferences);
Preference category = findPreference(PREFERENCE_TOP_CATERGORY); Preference category = findPreference(PREFERENCE_TOP_CATERGORY);
category.setTitle(getString(R.string.folder_settings_title)); category.setTitle(folderName);
mDisplayClass = (ListPreference) findPreference(PREFERENCE_DISPLAY_CLASS); mDisplayClass = (ListPreference) findPreference(PREFERENCE_DISPLAY_CLASS);
mDisplayClass.setValue(mFolder.getDisplayClass().name()); mDisplayClass.setValue(mFolder.getDisplayClass().name());

View File

@ -0,0 +1,79 @@
package com.android.email.activity.setup;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.preference.RingtonePreference;
import android.preference.Preference.OnPreferenceClickListener;
import com.android.email.K9PreferenceActivity;
import com.android.email.Account;
import com.android.email.Email;
import com.android.email.Preferences;
import com.android.email.R;
public class Prefs extends K9PreferenceActivity {
private static final String PREFERENCE_TOP_CATERGORY = "preferences";
private static final String PREFERENCE_THEME = "theme";
private ListPreference mTheme;
public static void actionPrefs(Context context) {
Intent i = new Intent(context, Prefs.class);
context.startActivity(i);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.global_preferences);
Preference category = findPreference(PREFERENCE_TOP_CATERGORY);
mTheme = (ListPreference) findPreference(PREFERENCE_THEME);
mTheme.setValue(String.valueOf(Preferences.getPreferences(this).getTheme() == android.R.style.Theme ? "dark" : "light"));
mTheme.setSummary(mTheme.getEntry());
mTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = mTheme.findIndexOfValue(summary);
mTheme.setSummary(mTheme.getEntries()[index]);
mTheme.setValue(summary);
return false;
}
});
}
@Override
public void onResume() {
super.onResume();
}
private void saveSettings() {
Preferences.getPreferences(this).setTheme(mTheme.getValue().equals("dark") ? android.R.style.Theme : android.R.style.Theme_Light);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
saveSettings();
}
return super.onKeyDown(keyCode, event);
}
}

View File

@ -94,11 +94,11 @@ public class Address {
public String toString() { public String toString() {
if (mPersonal != null) { if (mPersonal != null) {
if (mPersonal.matches(".*[\\(\\)<>@,;:\\\\\".\\[\\]].*")) { // if (mPersonal.matches(".*[\\(\\)<>@,;:\\\\\".\\[\\]].*")) {
return Utility.quoteString(mPersonal) + " <" + mAddress + ">"; return "\"" + mPersonal+ "\" " + " <" + mAddress + ">";
} else { // } else {
return mPersonal + " <" + mAddress + ">"; // return mPersonal + " <" + mAddress + ">";
} // }
} else { } else {
return mAddress; return mAddress;
} }
@ -161,22 +161,22 @@ public class Address {
int pairEndIndex = 0; int pairEndIndex = 0;
int addressEndIndex = 0; int addressEndIndex = 0;
while (pairStartIndex < length) { while (pairStartIndex < length) {
pairEndIndex = addressList.indexOf(',', pairStartIndex); pairEndIndex = addressList.indexOf(",\u0000", pairStartIndex);
if (pairEndIndex == -1) { if (pairEndIndex == -1) {
pairEndIndex = length; pairEndIndex = length;
} }
addressEndIndex = addressList.indexOf(';', pairStartIndex); addressEndIndex = addressList.indexOf(";\u0000", pairStartIndex);
String address = null; String address = null;
String personal = null; String personal = null;
if (addressEndIndex == -1 || addressEndIndex > pairEndIndex) { if (addressEndIndex == -1 || addressEndIndex > pairEndIndex) {
address = Utility.fastUrlDecode(addressList.substring(pairStartIndex, pairEndIndex)); address = addressList.substring(pairStartIndex, pairEndIndex);
} }
else { else {
address = Utility.fastUrlDecode(addressList.substring(pairStartIndex, addressEndIndex)); address = addressList.substring(pairStartIndex, addressEndIndex);
personal = Utility.fastUrlDecode(addressList.substring(addressEndIndex + 1, pairEndIndex)); personal =addressList.substring(addressEndIndex + 2, pairEndIndex);
} }
addresses.add(new Address(address, personal)); addresses.add(new Address(address, personal));
pairStartIndex = pairEndIndex + 1; pairStartIndex = pairEndIndex + 2;
} }
return addresses.toArray(new Address[] { }); return addresses.toArray(new Address[] { });
} }
@ -184,8 +184,8 @@ public class Address {
/** /**
* Packs an address list into a String that is very quick to read * Packs an address list into a String that is very quick to read
* and parse. Packed lists can be unpacked with unpackAddressList() * and parse. Packed lists can be unpacked with unpackAddressList()
* The packed list is a comma seperated list of: * The packed list is a "\u0000," seperated list of:
* URLENCODE(address)[;URLENCODE(personal)] * address\u0000;personal
* @param list * @param list
* @return * @return
*/ */
@ -196,18 +196,16 @@ public class Address {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
for (int i = 0, count = addresses.length; i < count; i++) { for (int i = 0, count = addresses.length; i < count; i++) {
Address address = addresses[i]; Address address = addresses[i];
try { sb.append(address.getAddress());
sb.append(URLEncoder.encode(address.getAddress(), "UTF-8")); String personal = address.getPersonal();
if (address.getPersonal() != null) { if (personal != null) {
sb.append(';'); sb.append(";\u0000");
sb.append(URLEncoder.encode(address.getPersonal(), "UTF-8")); // Escape quotes in the address part on the way in
personal.replaceAll("\"","\\\"");
sb.append(personal);
} }
if (i < count - 1) { if (i < count - 1) {
sb.append(','); sb.append(",\u0000");
}
}
catch (UnsupportedEncodingException uee) {
return null;
} }
} }
return sb.toString(); return sb.toString();

View File

@ -37,11 +37,17 @@ public class MimeMessage extends Message {
protected Address[] mBcc; protected Address[] mBcc;
protected Address[] mReplyTo; protected Address[] mReplyTo;
protected Date mSentDate; protected Date mSentDate;
protected SimpleDateFormat mDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); protected SimpleDateFormat mDateFormat;
protected Body mBody; protected Body mBody;
protected int mSize; protected int mSize;
public MimeMessage() { public MimeMessage() {
setGeneratedMessageId();
}
public void setGeneratedMessageId () {
/* /*
* Every new messages gets a Message-ID * Every new messages gets a Message-ID
*/ */
@ -107,10 +113,19 @@ public class MimeMessage extends Message {
} }
public void setSentDate(Date sentDate) throws MessagingException { public void setSentDate(Date sentDate) throws MessagingException {
if (mDateFormat == null) {
mDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
}
setHeader("Date", mDateFormat.format(sentDate)); setHeader("Date", mDateFormat.format(sentDate));
setInternalSentDate(sentDate);
}
public void setInternalSentDate(Date sentDate) throws MessagingException {
this.mSentDate = sentDate; this.mSentDate = sentDate;
} }
public String getContentType() throws MessagingException { public String getContentType() throws MessagingException {
String contentType = getFirstHeader(MimeHeader.HEADER_CONTENT_TYPE); String contentType = getFirstHeader(MimeHeader.HEADER_CONTENT_TYPE);
if (contentType == null) { if (contentType == null) {

View File

@ -65,7 +65,7 @@ public class LocalStore extends Store implements Serializable {
// If you are going to change the DB_VERSION, please also go into Email.java and local for the comment // If you are going to change the DB_VERSION, please also go into Email.java and local for the comment
// on LOCAL_UID_PREFIX and follow the instructions there. If you follow the instructions there, // on LOCAL_UID_PREFIX and follow the instructions there. If you follow the instructions there,
// please delete this comment. // please delete this comment.
private static final int DB_VERSION = 24; private static final int DB_VERSION = 25;
private static final Flag[] PERMANENT_FLAGS = { Flag.DELETED, Flag.X_DESTROYED, Flag.SEEN }; private static final Flag[] PERMANENT_FLAGS = { Flag.DELETED, Flag.X_DESTROYED, Flag.SEEN };
private String mPath; private String mPath;
@ -134,7 +134,8 @@ public class LocalStore extends Store implements Serializable {
+ "html_content TEXT, text_content TEXT, attachment_count INTEGER, internal_date INTEGER, message_id TEXT)"); + "html_content TEXT, text_content TEXT, attachment_count INTEGER, internal_date INTEGER, message_id TEXT)");
mDb.execSQL("CREATE INDEX IF NOT EXISTS msg_uid ON messages (uid, folder_id)"); mDb.execSQL("CREATE INDEX IF NOT EXISTS msg_uid ON messages (uid, folder_id)");
mDb.execSQL("CREATE INDEX IF NOT EXISTS msg_folder_id ON messages (folder_id)"); mDb.execSQL("DROP INDEX IF EXISTS msg_folder_id");
mDb.execSQL("CREATE INDEX IF NOT EXISTS msg_folder_id_date ON messages (folder_id,internal_date)");
mDb.execSQL("DROP TABLE IF EXISTS attachments"); mDb.execSQL("DROP TABLE IF EXISTS attachments");
mDb.execSQL("CREATE TABLE attachments (id INTEGER PRIMARY KEY, message_id INTEGER," mDb.execSQL("CREATE TABLE attachments (id INTEGER PRIMARY KEY, message_id INTEGER,"
+ "store_data TEXT, content_uri TEXT, size INTEGER, name TEXT," + "store_data TEXT, content_uri TEXT, size INTEGER, name TEXT,"
@ -882,14 +883,14 @@ public class LocalStore extends Store implements Serializable {
if (from.length > 0) { if (from.length > 0) {
message.setFrom(from[0]); message.setFrom(from[0]);
} }
message.setSentDate(new Date(cursor.getLong(2))); message.setInternalSentDate(new Date(cursor.getLong(2)));
message.setUid(cursor.getString(3)); message.setUid(cursor.getString(3));
String flagList = cursor.getString(4); String flagList = cursor.getString(4);
if (flagList != null && flagList.length() > 0) { if (flagList != null && flagList.length() > 0) {
String[] flags = flagList.split(","); String[] flags = flagList.split(",");
try { try {
for (String flag : flags) { for (String flag : flags) {
message.setFlagInternal(Flag.valueOf(flag.toUpperCase()), true); message.setFlagInternal(Flag.valueOf(flag), true);
} }
} catch (Exception e) { } catch (Exception e) {
} }
@ -901,7 +902,7 @@ public class LocalStore extends Store implements Serializable {
message.setReplyTo(Address.unpack(cursor.getString(9))); message.setReplyTo(Address.unpack(cursor.getString(9)));
message.mAttachmentCount = cursor.getInt(10); message.mAttachmentCount = cursor.getInt(10);
message.setInternalDate(new Date(cursor.getLong(11))); message.setInternalDate(new Date(cursor.getLong(11)));
message.setHeader("Message-ID", cursor.getString(12)); message.addHeader("Message-ID", cursor.getString(12));
} }
@Override @Override
@ -944,17 +945,25 @@ public class LocalStore extends Store implements Serializable {
ArrayList<Message> messages = new ArrayList<Message>(); ArrayList<Message> messages = new ArrayList<Message>();
Cursor cursor = null; Cursor cursor = null;
try { try {
// pull out messages most recent first, since that's what the default sort is
cursor = mDb.rawQuery( cursor = mDb.rawQuery(
"SELECT subject, sender_list, date, uid, flags, id, to_list, cc_list, " "SELECT subject, sender_list, date, uid, flags, id, to_list, cc_list, "
+ "bcc_list, reply_to_list, attachment_count, internal_date, message_id " + "bcc_list, reply_to_list, attachment_count, internal_date, message_id "
+ "FROM messages " + "WHERE folder_id = ?", new String[] { + "FROM messages " + "WHERE folder_id = ? ORDER BY date DESC"
, new String[] {
Long.toString(mFolderId) Long.toString(mFolderId)
}); });
int i = 0;
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
LocalMessage message = new LocalMessage(null, this); LocalMessage message = new LocalMessage(null, this);
populateMessageFromGetMessageCursor(message, cursor); populateMessageFromGetMessageCursor(message, cursor);
messages.add(message); messages.add(message);
if (listener != null) {
listener.messageFinished(message, i, -1);
}
i++;
} }
} }
finally { finally {
@ -1524,6 +1533,13 @@ public class LocalStore extends Store implements Serializable {
private long mId; private long mId;
private int mAttachmentCount; private int mAttachmentCount;
public LocalMessage() {
}
// We don't want to do this for local messages
@Override public void setGeneratedMessageId () {}
LocalMessage(String uid, Folder folder) throws MessagingException { LocalMessage(String uid, Folder folder) throws MessagingException {
this.mUid = uid; this.mUid = uid;
this.mFolder = folder; this.mFolder = folder;
@ -1537,6 +1553,33 @@ public class LocalStore extends Store implements Serializable {
super.parse(in); super.parse(in);
} }
public void setFrom(Address from) throws MessagingException {
if (from != null) {
addHeader("From", from.toString());
this.mFrom = new Address[] {
from
};
} else {
this.mFrom = null;
}
}
public void setRecipients(RecipientType type, Address[] addresses) throws MessagingException {
if (type == RecipientType.TO) {
addHeader("To", Address.toString(addresses));
this.mTo = addresses;
} else if (type == RecipientType.CC) {
addHeader("CC", Address.toString(addresses));
this.mCc = addresses;
} else if (type == RecipientType.BCC) {
addHeader("BCC", Address.toString(addresses));
this.mBcc = addresses;
} else {
throw new MessagingException("Unrecognized recipient type.");
}
}
public void setFlagInternal(Flag flag, boolean set) throws MessagingException { public void setFlagInternal(Flag flag, boolean set) throws MessagingException {
super.setFlag(flag, set); super.setFlag(flag, set);
} }

View File

@ -27,7 +27,7 @@ import com.android.email.MessagingListener;
import com.android.email.Preferences; import com.android.email.Preferences;
import com.android.email.R; import com.android.email.R;
import com.android.email.activity.Accounts; import com.android.email.activity.Accounts;
import com.android.email.activity.FolderMessageList; import com.android.email.activity.FolderList;
import com.android.email.mail.Folder; import com.android.email.mail.Folder;
import com.android.email.mail.MessagingException; import com.android.email.mail.MessagingException;
import com.android.email.mail.Store; import com.android.email.mail.Store;
@ -262,12 +262,15 @@ public class MailService extends Service {
notif.number = unreadMessageCount; notif.number = unreadMessageCount;
Intent i = FolderMessageList.actionHandleAccountIntent(context, thisAccount); Intent i = FolderList.actionHandleAccountIntent(context, thisAccount);
PendingIntent pi = PendingIntent.getActivity(context, 0, i, 0); PendingIntent pi = PendingIntent.getActivity(context, 0, i, 0);
notif.setLatestEventInfo(context, getString(R.string.notification_new_title), notice, pi); notif.setLatestEventInfo(context, getString(R.string.notification_new_title), notice, pi);
// JRV XXX TODO - Do we also need to notify the messagelist here?
String ringtone = thisAccount.getRingtone(); String ringtone = thisAccount.getRingtone();
notif.sound = TextUtils.isEmpty(ringtone) ? null : Uri.parse(ringtone); notif.sound = TextUtils.isEmpty(ringtone) ? null : Uri.parse(ringtone);

View File

@ -0,0 +1,6 @@
package com.fsck.k9beta;
import com.android.email.Email;
public class K9 extends Email {
}

6
tools/build-beta Executable file
View File

@ -0,0 +1,6 @@
perl -pi -e's|\@string/app_name|K9 BETA|' AndroidManifest.xml
perl -pi -e's/com(.)fsck(.)k9/com$1fsck$2k9beta/' build.xml AndroidManifest.xml
ant $@
perl -pi -e's/com(.)fsck(.)k9beta/com$1fsck$2k9/' build.xml AndroidManifest.xml
perl -pi -e's|K9 BETA|\@string/app_name|' AndroidManifest.xml
perl -pi -e's/K9-BETA/K9/' AndroidManifest.xml