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:
parent
9ffe4c44ad
commit
909f677f91
@ -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>
|
||||||
|
@ -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
305
build-sdk-1.5.xml
Normal 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
2
build.properties
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
application-package=com.fsck.k9
|
||||||
|
|
11
default.properties
Normal file
11
default.properties
Normal 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
|
BIN
res/drawable/button_indicator_prev.png
Normal file
BIN
res/drawable/button_indicator_prev.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 934 B |
@ -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>
|
@ -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>
|
@ -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>
|
@ -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"
|
@ -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" />
|
||||||
|
@ -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"
|
||||||
|
@ -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"
|
||||||
|
28
res/layout/folder_list_header.xml
Normal file
28
res/layout/folder_list_header.xml
Normal 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>
|
@ -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"
|
28
res/layout/message_list_header.xml
Normal file
28
res/layout/message_list_header.xml
Normal 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>
|
@ -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>
|
@ -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"
|
@ -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" />
|
||||||
|
@ -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 -->
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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"
|
||||||
|
48
res/menu/folder_list_option.xml
Normal file
48
res/menu/folder_list_option.xml
Normal 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>
|
43
res/menu/message_list_context.xml
Normal file
43
res/menu/message_list_context.xml
Normal 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>
|
@ -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>
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
32
res/xml/global_preferences.xml
Normal file
32
res/xml/global_preferences.xml
Normal 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>
|
@ -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.
|
||||||
|
17
src/com/android/email/K9Activity.java
Normal file
17
src/com/android/email/K9Activity.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
17
src/com/android/email/K9ListActivity.java
Normal file
17
src/com/android/email/K9ListActivity.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
18
src/com/android/email/K9PreferenceActivity.java
Normal file
18
src/com/android/email/K9PreferenceActivity.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
1159
src/com/android/email/activity/FolderList.java
Normal file
1159
src/com/android/email/activity/FolderList.java
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||||
}
|
}
|
||||||
|
1723
src/com/android/email/activity/MessageList.java
Normal file
1723
src/com/android/email/activity/MessageList.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -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");
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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";
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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";
|
||||||
|
|
||||||
|
@ -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";
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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";
|
||||||
|
@ -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";
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
79
src/com/android/email/activity/setup/Prefs.java
Normal file
79
src/com/android/email/activity/setup/Prefs.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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();
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
6
src/com/fsck/k9beta/K9.java
Normal file
6
src/com/fsck/k9beta/K9.java
Normal 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
6
tools/build-beta
Executable 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
|
Loading…
Reference in New Issue
Block a user