The latest framework change made it very easy to do this.
We no longer need to implement Checkable by ourselves.
Change-Id: I9264b157b6600659597ca8d525a4288d7bb9c470
Create a custom view containing the bottons below MVF
(delete, move, reply, etc) and let MVF own this.
These buttons used to be owned by the XL activity itself, because
the UI for these commands will most likely be totally different
from the tablet UI, so the fragment having them looked wrong.
However, this made it harder to make changes suggested by the latest
mock, such as "put reply/forward in the message header".
I think the buttons are semantically part of the message view anyway,
so the fragment owning UI for these commands is probably the way to go.
(And let's worry about the phone UI later.)
Reason for the use of a custom view is that it will make it easier
to make non-trivial UI changes, e.g. "combine reply, reply-all and
forward and make it dropdown."
Also removed obsolete TODOs from MessageListXL.
Change-Id: Ibf93f4c70fe07bdbbe33d2adb6bbd2b96812830d
* Load MIME data for these messages and parse, looking for a body either
in HTML or plain text or both
* If the MIME data had been trunctated and we can't find text, mark the
message as partially loaded and load the body text as we did before
(i.e. get the plain text body); this should be a rare case
TODO: Consider what is testable in the new EmailSyncAdapter code
Change-Id: I00a3066a373a0596431335593de356a4dda7f036
if available, instead of email addresses.
Also make sure the change to the display name will be reflected to
the UI.
Bug 2149083
Bug 3002398
Change-Id: I4aa4ffcec3a81688b3fb11182aacd546c310f117
* Assign "enable exchange parser logging" from Eas.PARSER_LOG instead
of from EAS.USER_LOG.
* Reorder setup to assign listeners last; This avoids unnecessary calls
to Email.updateLoggingFlags() during setup.
Note: The bug exists as far back as eclair, but the fix will need to be
made in a different file in earlier versions (pre DebugFragment)
Bug: 3003813
Change-Id: I5d8f66747a86139dd593ac16ea421ab1e33b8795
- Resetting the new message count is now correctly done on a BG thread.
- Added special content provider URI to reset the count.
(/resetNewMessageCount)
- This URI only supports update, which will notify only account
cursors.
- Fixed a problem that an insert with MAILBOX_ID/MESSAGE_ID/ACCOUNT_ID
triggers two notifications.
- This CL changes how we use notification URIs, but unfortunately
no tests for this part. It turned out MockContentResolver doesn't
support the notification mechanism, which made it very hard
to write tests.
Bug 2911646
Change-Id: I35b30a7e6bf2d57510486c7ed19b9f263d8c9b58
Drafts/Trash are not syncable on EAS, but let's kick the callbacks
as the UI is expecting them.
Bug 2989403
Change-Id: I4feac1f0e5471995c14260be6d12329659385e23
Update settings to use to PreferenceActivity APIs to retain its
current state across instances. Removes
inheritance of Header (to work well with new framework impl that
retains these across instances), avoid resetting the current header
after a state change (we want to keep showing whatever the user
last viewed), put the dialog on the back stack (so it will get
removed if the back stack is cleared).
Change-Id: Ie35b1c0eb9b06277165f2b9cadb0e2999bb8af47
When selecting a different mailbox, start/stop the refresh button animation
as necessary.
Bug 2997302
Change-Id: If29d7ec37348d527698685503b7b4fbf0ed0c35f
* Remove AccountSetupCheckSettings and related resources
* Remove all handling of EDIT flow in setup activities
Change-Id: I7b87d87978533b52b9c974d006920749389418d8
* AccountCheckSettingsFragment now supports AutoDiscover
* Clean up callbacks for account check & autodiscover errors
* AccountSetupExchange now supports rotation
* Remove dead code in SetupData & AccountSetupBasics
TODO next CL: Remove all edit flows from setup activities
TODO next CL: Remove old CheckSettings activity
Change-Id: I3c9884856ca6e70226374fdb28400bfb3588387e
* Activities modified to use new check-settings fragment:
* AccountSetupBasics (auto-setup for imap/pop)
* AccountSetupIncoming
* AccountSetupOutgoing
Next CL: Same work for exchange, and terminate old CheckSettings activity.
Change-Id: If5c5bfe331161b2429f7d7a4bd13290932f03c47
- Two-pane now respects the auto-advance setting.
- Added another TODO for one-pane.
- Removed unused method.
Change-Id: If2cfb8cc1de04c48cd2f6075bc01bef830425662
My previous CL broke some tests.
- make sure to set 0 to unreadCount when adding a new row
- when updating messageCount in the tests, directly manipulate
the DB. (the provider no longer allows this)
Change-Id: Ib569349707007badf4f23600fbca37110c78fa6d
- Don't allow manual modification of unreadCount/messageCount
(We used to check only unreadCount in update().)
- Do the integrity check at the very first in update().
I think the old place was really problematic because we opened
the database in a few lines above and kept it in a local variable.
Change-Id: I2bf5de4e4e45b40c11b951dd2255f8193c26f1aa
We found a case where messages in outbox have flagLoaded=FLAG_LOADED_UNLOADED,
where it should be FLAG_LOADED_COMPLETE. Haven't found the root problem, but
remove the flagLoaded test to mitigate the problem.
Also moved the buildMailboxIdSelection call to a worker thread.
(this method issues some queries.)
Bug 2984285
Change-Id: I2a5be300fb3da703698512262cc38bea75d0f7ba
- Removed the place holder setting
- Added "auto-advance" setting, which has "newer",
"older" (original behavior, default) and "message list"
- Strings were copied from Gmail
This CL has preference change only (i.e. the setting isn't used yet).
The actual implementation will come later.
Change-Id: I9f90a723c67e066fdc536a73490101817a127933
- Added "quick contact badge" to MessageView
- Removed PresenceUpdater, and added new implementation based
on Loader, which is much simpler.
- Changed some text color, so they're visible now.
Bug 2988625
Change-Id: I688a3217178ee8fd0b7245c0ab36a633687ea525
* android.security is hidden. Use java.security.MessageDigest instead.
* Remove android-common from makefile (we no longer use it)
* Add LOCAL_SDK_VERSION to makefile and comment it out
Change-Id: I7f9a021387d5c4e47ade1adb0bb75bec82ba0dd8
Some of these broke in 8bcb572ccf
which changed the [Next] button to an ActionBar menu item.
However, the entirety of AccountSettingsXLTests needed to be disabled
because the PreferenceActivity is very different on phone or XL sized
devices, and the tests infrastructure will need to be refactored to deal
with that (on another day.)
Change-Id: I9adbfc9b8da6179e4c4e82d29bb872ee05619a41
* All setup activities given UI makeover:
* Remove legacy themes from manifest - exposes default holo theme
* Remove bottom row button(s)
* Replace with action bar button(s)
* No change to workflow or activity/fragment organization
Change-Id: I07ce11a0a2b4b767b5ac111d466e68400fe0f30b
Added Email.DEBUG_THREAD_CHECK. If true, EmailProvider warns if certain
methods are called on the UI thread.
Change-Id: I6db9e45f2e449a31850c223fc9eec0fb9a575cb1
* Existing code reloads long POP/IMAP messages at every sync
* If the server is POP3, or the IMAP message is unread, this
will lead to redundant notifications of new message arrival
* The fix avoids repeated message reload
Bug: 2892705
Change-Id: I8dc22966282655c8645362d672a083a1c37f554c
* Create new retained fragment + asynctask as the worker
* Stateless dialog fragments for everything else (progress & errors)
* Used for account settings, incoming & outgoing, only so far
TODO: Support for account setup workflow
TODO: Support for autodiscover workflow
TODO: Remove old checker activity when complete
Change-Id: I1fdafa1a51c53b934e59ea4af7d3e0ac24a3da17
The extra overloads for setStandardNavigationMode are going away to
simplify the API. setTitle/setSubtitle should be used to change title
content in standard nav mode.
Change-Id: I29baa1ea5572a01ed9bc1d99f5c8a6e35dd02a1a
* Add 'snippet' column in Message table and handle upgrades to the
new schema
* Generate a snippet from either HTML or plain-text message body,
removing tags, extraneous whitespace, and other superfluous text
along the way. Store the snippet in the Message table
* Clean up MessagesAdapter to use the pre-existing list projection
and constants
* Write unit tests for snippet creation
* The UI in this CL is always single-line, ellipsized
TODO: Handle two-line subject if portrait and XL
Change-Id: I84a2cbe10957975942edad6eb1255a726924a78a
* UI is still temporary
* In this version, we check if the selected messages can be moved *after*
you click "Move", rather than disabling the button beforehand.
Change-Id: Ief2864d2a513001847844963b2b0cb6b714e8667
* From account settings, switch to incoming/outgoing/eas fragments
* Show "Next" button in actionbar (may be dup'd in single-pane view)
* Common base class for in/out/eas fragments
* Depends on PreferenceActivity.startPreferenceFragment(), new API
* If the user clicks an account header while editing server settings,
present a dialog before discarding the changes that haven't been
checked yet.
* Confirm working (if a bit ungainly in appearance) on phone screen
Change-Id: I03591b9a8ffd11fe26fc6f58a5698740e61d0090
If the cursor is empty, hide the list and let the framework show
the rotating icon. (Don't set an empty cursor, which makes the list just
blank.)
We do this for only MailboxList because we know we'll get mailboxes
soon enough. We can't do this on MessageList because there may be really
no messages even if we wait.
Bug 2927973
Change-Id: Ic0346d2d90d03489072eb95a123281f60cda44dd
* Now the message shown/gone callbacks are called directly by
MessageViewFragment, rather than MessageListXLFragmentManager.
* The buttons are enabled/disabled per messages, so it even works
properly when you move around in All Starred. (if you ever star
trashed messages.)
* Fixed one-pane as well.
Bug 2968810
Change-Id: Ie6de1dc7ea0bd18c40c091a6685629c26ffb7110
* Turns out that we weren't handling one of the cases for YEARLY
RRULE; that in which the date is specified as a day of week plus
week of month
* Also, we weren't always sending the INTERVAL properly in a few
cases
* Fix these issues and add a unit test that confirms the fixes
* Also removed an unused argument in recurrenceParser in
CalendarSyncAdapter
Bug: 2718948
Change-Id: If9146d484218e7d6bd9f5c2305d0e6a216aeed49
Because "move" and "delete" are asynchronous operations, Message.mMailboxKey
can change any time. We can't use stored values.
(Fortunately it was used at only one place, and this was actually unused.)
Change-Id: Idc1300a00122fe0e6372b0374cddc98aa54a47fc
* Finish implementation of AccountSettingsXL.actionSettings()
* Point account manager entry point at it now
* Remove old AccountSettings activity
* Move AccountSettingsTests over to AccountSettingsXLTests and minor
cleanups so it works in fragmentized activity.
Change-Id: I5f979a3a9a29dcbbe5a63833b184e6c0313652d5
* Preserve the scroll position in the following transitions
MessageList -> MessageView -> [back] -> MessageList
MessageList -> MessageView -> [screen rotation] -> [back] -> MessageList
two-pane -> compose -> [discard, etc] -> two-pane
two-pane -> switch to other app, and switch back -> two-pane
* Don't always refresh on onResume. Do it only when requested.
This supresses unnecessary refresh when coming back from other full-screen
activities, e.g. MessageCompose.
* Also updated the comments on the back handling.
Bug 2769052
Change-Id: Id83dc3e778c35860d634c68ecac0c7a07cc4057e
* Now it'll refresh mailbox list (left pane) as well.
(With the minimal interval of 30 seconds)
* Always refresh inbox.
(also with the minimal interval of 10 seconds)
* Also make sure the "auto-refresh" won't refresh
non-refreshable mailboxes. (drafts, etc)
Bug 2929889
Bug 2930018
Change-Id: I09452d40aad6008a721cfbc3f491617224d7048f
* Add DebugFragment and incorporate it into AccountSettingsXL
* Tap "Email preferences" 10 times in a row to enable debug settings.
(Or type D E B U G works as well.)
* Point broadcast receiver (*#*#EMAIL#*#*) to AccountSettingsXL
* Remove old debug launchers in AccountFolderList
* Remove old Debug activity
Change-Id: Ib289c42878a07c23f815654ce4570c1399aa49de
There were two cases where MailboxFinder responded to updateMailboxListCallback
when it shoulnd't.
- Callbacks for non-target accounts
- Callbacks arrived after the operation is finished
Make sure these callbacks are properly ignored.
Also, make sure startLookup() can't be called more than once.
Change-Id: I823c11ab5f96df4eb84594c08d3325d12319f708
* EAS can send both "simple password" and a non-zero number of
required complex characters; we're supposed to ignore the
complex character requirement in this case
* Force complex characters to zero if password is "simple"
* Update constructor test to check the fix
Bug: 2903349
Change-Id: I3d42bd3c8f3667d8f3027da9e91e0dd18722d9bf
Batch edit (toggle star, toggle un/read) used to work like this:
- Update DB
- Cursors get content change event
- But the list won't update immediately, because ThrottlingCursorLoader
postpones refresh.
- The list will update a few seconds later.
It wasn't really a good UX, so refresh the list right after the db change.
Change-Id: If483b305cf448ec4c73e65498044fd52cc144773
The UI changes a bit - there is no separator
between the local contacts and directories.
Will bring the separator back if asked, but
most likely simply as a thick line.
Change-Id: Idfc990deff41b30d63bd8289731694e3d9a00fb6
It's basically a partial revert of I3cb6c45c, with some clean-ups.
Also removed mHandler, which was unused.
Bug 2949762
Change-Id: Ib4e673c5829b99ba45fec449bffb62df84555a01
Merge commit '99df4d53b620fae871fd45aaf9b8f110cb4d4288'
* commit '99df4d53b620fae871fd45aaf9b8f110cb4d4288':
Block oversize attachments from being sent
* We were zero'ing the server id BEFORE the move, rather than
afterward; this is fixed in the current CL
Change-Id: I4a5f2b2de5794a110a8f657c80dfeac4955b5909
Merge commit '126c9216b13d915b24a057b5b50bb8ea9826ba7e' into gingerbread
* commit '126c9216b13d915b24a057b5b50bb8ea9826ba7e':
Block oversize attachments from being sent
* Now notification kicks Welcome, which knows which
activity to use.
* Extracted cancelNewMessageNotification
* Also fixed 2909215. There'll be only one XL activity on the app stack.
Bug 2945369
Bug 2909215
Change-Id: I2a7fec0d48a7618375cae55138ca51fefc70ff6e
- Don't show combined boxes when there's only one account.
- Show special mailboxes (e.g. drafts) right after inbox
and before regular mailboxes.
Bug 2941270
Change-Id: I03ba356f5f2367f0478133acc1f2e35d182d359c
* Clean up Controller.deleteMessage to work with new EmailContent
utility methods, and move out of the UI thread
* Add unit test for Controller.moveMessage
Change-Id: Ic49e2ecc7ef2252dd4d51f4c3b313b936fda78b6
- Changed the default theme to Light.Holo
- MessageCompose now has ActionBar.
- Removed unnecessary MessageCompose menu items.
- Also removed "Add Account" menu from MessageListXL.
(Use the + button on account settings)
- Fixed "calender response section invisible" bug.
Bug 2926517
Change-Id: Id27632ec82dad158f43b0903dbc2cb219188400d
* Attachments that come in with a file:// URI do not support the complete
set of OpenableColumns columns. To handle this better:
1. Obtain the openable values in two separate queries, in case one or
the other is supported (but not both).
2. If the size is not reported but it is a file:// URI, attempt to
measure it directly.
3. If the size cannot be obtained, do not upload the attachment
Bug: 2948965
Change-Id: Ic5160d39efd65eaca40ceba0dd93c3b035d2871e
* Use the standard resources for it
I've been putting this off because it's a UI issue and we don't know
the final look, but the current look is really hard to read.
* Also, don't use the dropdown, if there's only one account set up.
Bug 2883791
Bug 2950461
Change-Id: I0af2e98b2650fcbc83c8f7228505afa334bea209
* We can't run the AccountManager functionality of account backup
and restore in the unit tests, because IsolatedContext doesn't
mock the AccountManager; this leads to various NPE's when the
test is run
* These problems started, by the way, when we added POP/IMAP
account integration with AccountManager
* Since the AccountManager side of account backup/restore isn't
tested, we'll skip that part of the process when running unit
tests
Bug: 2873546
Change-Id: I94673913e66722ac70f3c49c51465122e98bf3d9
* Use ListView's CHOICE_MODE_SINGLE mode to select list item.
* Added a view that implements Checkable to change background
for selected item.
Change-Id: Id55999b3d024ad1852e2b8c6436cd22ef255cf95
isEasAccount now uses getProtocol(), so it works even if the hostauth
hasn't been restored yet.
Bug 2929896
Change-Id: Iee902c18ef59680d8a7d4622230489ec7946f38c
* Add ControllerService to Controller and call this from
AttachmentDownloadService to handle attachment loading
(It's a redo of I3a6c2a40. Submitting for mlbank, who had a trouble
with repo.)
Change-Id: I7c90761ec4e213d6dc331fc894c7b77e84ad43a6
They're needed for unit tests.
I was hoping this would solve some of the unit test issues, but it didn't look
like so. But still they're nice to have.
Change-Id: Ibf6ae78055560d27aac5934d567a17084de99d84
* Changed our queue from a TreeMap to a TreeSet that uses an easily
testable comparator
* Remove the ugly bit twiddling priority computation
* Test DownloadSet (the logic behind queue ordering, addition,
removal, query, etc.)
Change-Id: Ia8427900b8f39a243a5407349775802d0a4fad4f
* Add account is a large (+) in the action bar
* Remove account is a new item at the bottom of the settings fragment
Note: Add account works, remove account just toasts for now.
Change-Id: I5b3b8ab8c7d328cb78d103c47b9eca866466f9df
* Create AttachmentDownloadService to manage all attachment downloads
1) User requested
2) Required for email forwarding
3) Opportunistic downloads to enhance offline use
* New attachment related UI (pending UX approval, of course)
1) MessageView (attachment actions, progress bar, etc.)
2) MessageCompose (attachments for forwarded messages)
3) Associated toasts, notifications, etc.
TODO:
* Unit tests
* Cache Management (separate CL)
Change-Id: I7864a5fb1c3f4f2be68d98341a971edc6cbacfe1
- Now Welcome takes an EXTRA_DEBUG_PANE_MODE to force the
one-pane/two-pane mode.
Use this to open one-pane.
adb shell am start -a android.intent.action.MAIN \
-n com.google.android.email/com.android.email.activity.Welcome \
-e DEBUG_PANE_MODE 1
Use this to open two-pane.
adb shell am start -a android.intent.action.MAIN \
-n com.google.android.email/com.android.email.activity.Welcome \
-e DEBUG_PANE_MODE 2
Change-Id: I6e96f80f53f4488152935502c19d3dd8e0788150
* Connect to it from all call sites
* Remove 1-pane and 2-pane icons
* Leave a few more breadcrumbs for launching into specific account
* Update the long TODO list in AccountSettingsXL
Change-Id: I502eda9a622518e8d4a23d46989340ad400cdd34
Fixed the bug where callbacks for sendPendingMessagesForAllAccounts
are called on a worker threaed.
Change-Id: I28f1424cf67e15abf37c09b68050d1385f9ac3ee
It works for regular outboxes. Unfortunately it doesn't for
Combined Outbox, due to a bug in RefreshManager, which I'll fix
in a separate CL. (The fix might be rather large.)
Change-Id: Ib904e2c672801debe3dd64e4bb0a464564d098da
* Create AccountSettingsXL
* Build headers dynamically based on accounts
* Launch account settings per-account
* Temporary launch point from menu in AccountFolderList
TODO: Fragment flip to incoming/outgoing/checksettings not implemented yet
TODO: Use more recent updates to PreferenceActivity
TODO: Finish plumbing into account settings fragment
TODO: Something more real for app settings
Change-Id: I6f4c5bb8cf691f25517c25950ef2049084335ce3
Added RefreshManager, which is responsible for getting refresh requests
from UI and keeping track of what is being refreshed.
Conceptually it's a part of Controller, but extracted for easier testing.
- Now sendPendingMessagesForAllAccounts() is owned by RefreshManager
rather than Controller.
- Also updateMailboxRefreshTime/mailboxRequiresRefresh have been moved
in from the Email class.
- Now MessagingException implements a method to return an error message
for the UI.
The refresh button on 2-pane doesn't work as intended yet, because the
spec is a bit too complicated (as described in the TODO in
MessageListXLFragmentManager.onRefhres()).
This change touches many file mostly because it cleans up a lot
of code duplication.
Change-Id: I058ab745ccff10f6e574f6ec4569c84ac4a3e10e
Implemented
- The bottom buttons for MessageViwe
Delete, Mark unread, Reply, Reply all, Forward.
- Buttons for exchange invitation
View in Calender, "Yes", "No", "Maybe"
- Other MessageView events
onUrlInMessageClicked()
(Most other methods will probably be deprecated)
- Removed obsolete MailboxListFragment.Callback.onRefresh()
Fixes bug 2926517 minus "the background color of respond buttons
being black" part.
Change-Id: Ie58cbc9fde95a3e67d96846450f77ab58b175a55
- Use the class attribute instead of android:name in fragment tags.
- Use FragmentManager rather than openFragmentTransaction.
(There's a change on the PreferenceHeader tag too, but seems like we're
not using it.)
Bug 2922220
Change-Id: If604a97ac73b9ad7d84e453d36beb84bf31ff98f
doInBackground() returned a string[] when error, but onPostExecute() expects
null.
Also added isCancelled() check, just in case.
Bug 2918930
Change-Id: Ie87ff2e2e5b7c3fd77a062944759d03f8f09d3d9
Some tests create mock controllers. They register themselves to
MessagingController when instantiated, but never unregister.
Added a cleanup method, and call it for each instance.
(I was hoping it would spped up unit tests, but it didn't. Still
it's a nice thing to do.)
Change-Id: Ia90f0380aef388d22f7cfcf6e9203e05444b3285
Merge commit 'a30631da1cae25be3f75137133297e30cef2db9c' into gingerbread
* commit 'a30631da1cae25be3f75137133297e30cef2db9c':
Clear password related policies in PolicySet when p/w not required
- Now MessageListFragment uses loaders to load data.
- Now that we use Loader's auto-requery with throttling,
removed the throttling timer from MessagesAdapter.
- Simplified footer mode. (now only "no footer" or "load more")
- Removed saving/restoring list state code.
These method don't really look like working, or at least
not always working. Now that UI's lifecycle is changing,
we'd better redo it from scratch.
- Removed MessageListUnitTests.
It only has tests for onSaveInstanceState/restore of the fragment,
which I virtually disabled.
And minor clean-ups
- Moved the code to save/restore selected state from the fragment
to Adapter.
Bug 2911766
Bug 2897500
Change-Id: I16c7aefecc5409c57fc5fc8c59b5c80d9b7fc164
Don't use restartLoader(). Use initLoader() with stopLoader() when necessary.
This allows us to make use of LoaderManager's "retaining" feature.
i.e. We won't have to requery when the screen orientation changes.
Also, don't start loading in onStart(). Fragment manager seems to kick
exisiting loaders after onStart(), so you'll end up getting onLoadFinished()
twice.
(Looks like I got unluck with this--there was no strong reason to start loading
in onStart rather than onResume, but I think we can leave other fragments as-is
as long as they don't use loaders.)
Seems to be working.
Change-Id: Ib4f72098bd0fcbfce284ae6e16055d20ee410cf3
Apparently IMAP servers may return multiple SEARCH responses for a
single SEARCH command, and we need to handle all of them.
Before the IMAP rework there was 3 methods that issued the SEARCH command.
Two of them ware doing it right, but the other wasn't, which was what
I copied from, unfortunately!
In case you're wondering, originally the test for this method was done through
upper methods, e.g. getMessage().
Bug 2911647
Change-Id: Ia50072944d5b01c1e59541c3a966067b13910cc4
* Apps trying to open attachments using AttachmentProvider were
seeing SecurityExceptions due to the fact that internal calls
from AttachmentProvider to EmailProvider didn't have their
calling identity saved/restored.
* Updated provider calls so that these calls use the Email
process' identity.
Bug: 2908737
Change-Id: Ifb71ad834530c6232728e1aad31439991f8ed379
There's something weird going on when you add an Exchange account
and we try to look up the inbox. Add log for investigation.
- Log class name
- Log normal path (MAILBOX_FOUND) as well if debug is enabled.
(Other paths are always logged. These paths shouldn't be used often,
so I think it's okay.)
Change-Id: Iff5a28a1240896f8e2b991b891cbc696e7901f06
- mConnection.destroyResponses() should be protected with
if (mConnection != null).
When we get an IOException, we close the connection and null it out in
ioExceptionHandler(). So mConnection can be null at any point after
where ioExceptionHandler() first appears.
- ioExceptionHandler should close its parent ImapFolder only if the argument
connection is mConnection.
Methods like exists() may pass an ImapConnection which is not mConnection
to ioExceptionHandler. In which case we don't have to close the ImapFolder.
Bug 2898211
Change-Id: I8f9f45d91f596bb8da1a1575593e652d66deb643
Fix for crashes caused by an incomplete account
which typically a crashed unit test leaves behind.
- "Delete account" now works for incomplete accounts
- AccountBackupRestore won't crash.
Change-Id: Ie235aa15cf9b970fd184c60f14406aa7353c6f00
- Implemented "account settings".
- Added "add account" menu. It's not clear how to get to the screen at
this point, so just added a menu item for this for testing.
Change-Id: I78cfa54f2533917cc742b6ec027c2a0624cf0c1a
- After adding an account, and when a shortcut to an account is clicked,
launch Welcome instead of MessageList.
- Then welcome launches the appropriate activity.
(MessageList or MessageListXL)
- Welcome no longer launches AccountFolderList, which will be gone
according to the current plan.
Always going through Welcome makes sure that the account backup/restore
and the reconciler will always get kicked.
Change-Id: Ia57027eba16e98c5d8854e8d3c1d8773bcfbf1e5
It's related to the use of Activity.manageQuery().
This may be a regression in the framework, but it's annoying enough and
causing a problem with testing, let's just not use managedQuery().
Bug 2901309.
Change-Id: I8ae5b6ffe17979a094d5a23d49f42e8de04ed4f0
This is phase 1, which simply replaces the phone UX with a fragment-based
equivalent. A subsequent CL will convert it to a large-format multi-pane
version.
Also fix a latent bug in the signatures of the Incoming & Outgoing
settings, both in the reflection code and in the proguard flags.
Change-Id: I86e857af8b9573c0d6070bb21053ce65bb7fe8a0
- Don't swallow exception information.
- If the file exists but can't read, try to remove it.
- Don't use createNewFile. Just overwrite.
Bug 2898372
Change-Id: I7c0802f751a020c546aa07fa932b41ead31a8dc8
Unfortunately software-keyboard is disabled on master for some reason,
so we can't use the R key hack any longer...
Change-Id: Ide73e11742e5de70fec45009eee20a1a74fcbfd1
It's the int version of getFirstRowLong.
Because getFirstRowLong returns a Long as opposed to a long, and the return
value can be null, it's a pain to cast to Integer. So added this variant.
Change-Id: I2a3190e49db480e6d594be4b1fcef9a71e56cb2f
- Fixed account selector default account look-up
- Renamed MessageListFragment.onRestoreInstanceState
to loadState.
(Activity.onRestoreInstanceState is called after onStart,
but this one is called in onCreate, so it wasn't a good
idea to use the same name.)
- Changed mailbox cursur requery timeout to 3 seconds
- Added some TODOs.
Change-Id: Ia2242cd9f74936d24756b800eacd126958eed330
This is a {@link CursorLoader} variant that takes {@code timeoutSecond}
in the constructor.
When it detects changes in the underlying data, it'll wait until the timeout
before doing a requery.
We use this to throttle # of queries. We don't want to issue a query every
time something changes in the DB while we're syncing.
Change-Id: I098366bce923c3242c42964bc166493610ee0f6f
* In a recent change, we mistakenly removed the logic for handling
too-long inactivity timeouts; we should just fall back to the maximum
since this is stricter than what we're being asked to enforce
* Restore this logic and update the unit test
* The regression was caused by change Ida5663a9, to wit:
Backport: Handle "Allow non-provisionable devices" properly
Bug: 2886746
Change-Id: I99cf9a37441b80477cc1c2c7ec2a78f8a14a83da
- Remove AsyncTasks, and use CursorLoader to load data.
- Get message counts for the drafts/trash mailboxes directly from
the db column.
- Remove obsolete code from MailboxesAdapter.
Change-Id: I93c72977c19b60581e1169ba9bd429912ba3e68f
- Use trrigers to keep them up-to-date.
- Batch-update them upon upgrade.
- Motivation:
On the mailbox list, we show the number of messages in trash/drafts.
We currently do this with count(*) on the fly, which is okay
because MailboxList is really shown right now.
However, on the 2 pane, it's always shown and constantly refreshed,
so the use of count(*) can be a huge penalty.
It also make the code significantly simpler.
Change-Id: I26efa238d5183df43420a65925876248ef6c6cb6
Break MessageViewFragment up into two fragments, MessageViewFragment, which
is used to show regular messages, and MessageFileViewFragment, which shows
EML messages. (And their base class, MessageViewFragmentBase.)
MessageViewFragmentBase's javadoc has a class diagram.
MessageViewFragment is actually named MessageViewFragment2 at this point
so that GIT correctly finds out the rename from MessageViewFragment to
MessageViewFragmentBase. I'll rename it back in a following CL.
Also added very basic unit tests for MessageView and MessageFileView.
At this point, they just make sure the activities really open and show
messages without exceptions.
I feel like the current naming schema for the activities/fragments is
kinda confusing. Let me know if you come up with better names.
Change-Id: Iff948f4b68cfdb7c1e68f225927b0ce58d34766b
Merge commit '05b0bb56254d9ed924dff4c09ad227eec611a695' into gingerbread
* commit '05b0bb56254d9ed924dff4c09ad227eec611a695':
Release held mailboxes after policy refresh
This new class MailboxFinder is responsible for looking for a mailbox
by an account id and a mailbox type.
If a mailbox is not found on the first try, it'll tell Controller
to refresh the mailbox list, and try again later.
This will be used by MessageListXL.
Change-Id: I4adc3db025fb271c254aa2b58b3b753281dc7398
Also
- Renamed MessageListXLFragmentManager.setStart to onStart. (was typo)
- Fixed flag handling bug in MailboxListFragment
- Fixed the R key handling code. (The first R key was always ignored,
because the default requested orientation was neither landscape or
portrait.)
Change-Id: I0e14ce9f4fc5be973f7c0091f88fd4551a4329fa
- Added unit tests
- I see the "open a cursor, move to the first row, read a column" pattern over
and over. Added a utility method for this. (Let's try not to bloat the
binary by copying code around!)
- Added helper classes for database related tests
- Removed code dup
Change-Id: I380959215cc1661b252158f0f6e35369b499cdf8
MessageView for regular messages and MessageFileView for EML files.
I'll break down MessageViewFragment too.
Change-Id: Iae66f33d8fb5de58084ab4aef31588e9743c5a18
I always thought our Activities are way too fat, meaning we've put too many
things into activities without any structure.
The major problems with this are:
- They have too many fields, which are not final and not even orthogonal.
This makes them very hard to understand/maintain. Changing one tiny bit
can always cause unanticipated side-effects.
- Very hard, or almost impossible to test.
I really think we should break them into independent and self-contained
subcomponents which can be tested separately.
Introducing MessageListXLStateManager, which manages the current account,
mailbox and message, and show/hide/update fragments accordingly
for MessageListXL.
With this class, MessageListXL will be able to switch accounts/mailboxes/
messages by just calling the methods such as selectAccount(), without
worrying about when to show/hide what fragment and how to initialize them.
(In other words, MessageListXLStateManager encapsulates the two-pane screen
transition. It's not intended to be reused for the phone UI.)
I didn't make it a nested class in MessageListXL, because nested classes can't
have real private members (private member are accessible from outer classes and
even brother classes!!), and I wanted it to be really self-contained anyway.
Change-Id: I1c121e99e30f12cc118e1c35abc9b30f49939a4a
* When a sync fails due to a provisioning error (on initial sync
or after policies are refreshed on the server), sync mailboxes go
into a "hold" state until the security error is resolved. Meanwhile,
the account mailbox handles provisioning. If this is NOT successful,
we put a hold on the account and go through the UI steps of setting
up security on the device. When this is done, we release the hold on
the account, which releases the hold on the mailboxes.
* If provisioning IS successful, however, a refresh of the existing
settings would be an example, we do NOT release the adapters, and
this is the bug we're seeing.
* This CL simply causes any held mailboxes in a successfully provisioned
to be released from the hold
Bug: 2865623
Change-Id: I59e780e9bd4ea908182b786dfd0e5851f5bf5f3b
- Added parameter check to openXxx methods.
- Clear the list before (re-)load the data, to make ListFragment show the
"Loading..." animation.
- Moved a few lines around in MailboxListFragment.
Change-Id: I48d9759e118976bf9f8cce10069e2b9b5c253342
- Broke down bindActivityInfo into setCallback and openMailboxes()
- openMailboxes() can be called multiple times against the same instance.
(We won't have to re-create the left pane on XL screen)
- Added EmptyCallback to avoid null checks
- Renamed a callback method
Change-Id: I3848a6f6da7f1782dcc9566967f8618ed79a878e
There are two major, interrelated parts to this CL:
1) Clean up the activities to reduce the use of Intents to pass
information between activities; instead, we use a common
SetupData structure that automatically saved/restored as necessary
during the setup flow. A fair amount of code and inconsistent
use of Bundle extras has been eliminated in the process.
* Create SetupData structure, setters/getters, and initialization
methods to simplify the preservation of state during setup flow
* Remove all state/flow extras from Intents; Intents now only
specify the Activity to be started, which should greatly simplify
the transition to Fragments.
* Remove all state/flow fields from Activities
* Modify existing setup activity unit tests and confirm tests pass
2) Create AccountManager accounts for POP/IMAP email accounts to
provide consistency in user experience. Also, internal flows are
now identical as between account types.
* Move account reconciliation from SyncManager to MailService, so
that reconciliation is consistent between email and exchange
accounts; move unit tests as appropriate
* Add a "Sync Email" setting for POP/IMAP/EAS
* Change MailService to respect the "Sync Email" setting in
Settings -> Accounts & sync
* Create PopImapSyncAdapterService to handle manual POP/IMAP sync as
requested by SyncManager; add EmailSyncAdapterService to perform
the same function for EAS
* Use new PopImapAuthenticatorService to add AccountManager accounts
for POP/IMAP accounts; setup appropriate stanzas in AndroidManifest
and add related xml files
* Update AccountSettings to use SetupData
Miscellaneous other changes:
* Only allow valid port numbers in incoming/outgoing setup
Bug: 1712475
Change-Id: Ibdac52fb2c5578b86bf3992ddb1acd10f162391a
How to launch:
- Kick "Email 2 Pane" in the app drawer.
Major known issues:
- When you launches "Email 2 Pane", it starts directly; the logic in Welcom
won't be executed.
- There's no UI to add accounts. Use the old UI.
- There's no way to select non-default accounts.
- The on-screen buttons except for older/newer don't work.
- No contex menus work.
Change-Id: I38374acafafbae62e46f84294a7677e54686cfc2
This version is hybrid of the old design and what Andy's suggested.
- MessageViewFragment is responsible to show a single message at a time.
- Call MVF.openMessage() to tell it to open another message.
No need to re-create a new MVF to do this.
- MessageView manages the message list, and handles "move-to-newer/older"
buttons.
Reason for not re-creating a fragment when opening another message is:
- Re-using the same fragment doesn't make it as complecated/ugly as I
was initially afraid.
It's basically cancelling all running tasks, re-initializee some views,
and load a message.
- We don't have to run MVF.onCreate() over and over again when moving through
messages.
We may change the strategy later, but I think it's suffice for now.
(Changing this might affect how the back key works, so let's revisit it
when the fragment manager supports back.)
Basically this CL is all about internal changes.
No UI should have changed except for:
- Moved "Move to newer/older" buttons to the bottom.
Also fixes:
Bug: 2849129
Change-Id: I00c05069231afded9d98d3d52dd9a7925ebdee9d
ListFragment shows the "Loading..." animation for us until setListAdapter is
first called. In order to make use of it, setListAdapter should be called
only when the underlying data is ready.
Change-Id: Iac903b1f10ad7ed4be04446ddb2d2172e84bfe16
* Backport from master branch
* Send policy key of "0" when validating; this gets us the policies
even if "Allow..." is enabled (currently, we simply don't see the
policies)
* If we don't support all of the policies, send back the response
code indicating support for partial support. If we get a positive
response back, then we're good to go - the server allows devices
with partial support. Otherwise, we fail as we always have - with
the toast indicating that the device doesn't support required
policies
* Remove PolicySet.isSupported() and ensure proper field ranges
within the constructor
* Update tests as appropriate
Bug: 2759782
Change-Id: Ida5663a9b35c75ecc61a5f442be0bd60b433cb73
* Add this to processSourceMessage in the reply/forward cases
* Add unit tests for reply and forward case
Bug: 2734321
Change-Id: I6be8383fe5f217a4bda8e669cb69f439bc8e96b6
* During refactor of referenced change, a critical line of code
got lost; it's replaced in this CL
Change-Id: Ib6f405cdfa120f5cb5c879ab0f7df52d54970cb7
* Handle status 5 for Ping command (heartbeat of out range)
* Write unit test for heartbeat reset
Bug: 2834195
Change-Id: Ic7952a4b296cf15c6ba895d6579fe7956b171e5b
Introducing MessageOrderManager which maintains a message list for
MessageView. It's used to tell if there is newer/older messages
in a mailbox, and the id of them.
Also, slightly related to this, moved mWaitForLoadMessageId to
ControllerResults where it should belong.
Change-Id: I84e32180c7e84a317f2204bb10ad7245ec022dca
- These tests will probably not make sense with the upcoming UI change.
- Moved testAttachmentWritePermissions to UtilityUnitTests.
It's a test for createUniqueFile, which is now owned by Utility.
- Removed Long.MIN_VALUE hack from MessageView.
New tests should have something better.
Change-Id: I9a09e5e8080a165b010607d1fa3112bcaaab4f90
* Created MockProvider that can be used for testing the results of
ContentProviderOperation's for Calendar/Contacts (we can't use these
within our mock contexts because we can't instantiate the provider
classes within the Email package)
* Wrote some unit tests for MockProvider
* Use MockProvider to test addEvent, in particular how a user's attendee
status is stored, depending on whether the event is new or updated
Change-Id: I97f02d125eb7347726261e12ce70aadc539be1d4
* We need to include the intro text (--Original Message--, etc.) to
SmartForwards, and somehow this got in a past updat
* Add unit test for forwarding
* Fix unit test for reply so that it works localized
Bug: 2477988
Bug: 2685784
Change-Id: I8d92f00d37a434840ec3eb237f3901cd5dc7ad09
* We inadvertently broke this with a recent update that uses Uri
encoding for ItemId and CollectionId in SmartForward/Reply commands.
We need to allow colon (:) however for EAS 2.5; otherwise, sends
fail with HTTP 500
* Update unit test
Bug: 2821684
Change-Id: Ia6bdd2169513d1c13a8174dd599477a35df950f2
* The meaning of a busy status of "Busy" is uncertain; it could mean
"Accepted" or "Tentative", depending on whether the event was
created via OWA/Outlook or EAS
* We have interpreted it as "Accepted", which prevents the user from
actually accepting the event (as a state change is required for us
to send updates to the server/organizer)
* This CL changes the behavior such that a newly arriving event with
a "Busy" status is shown as "No response" in the Calendar, thereby
allowing the user to pick from any of the three possible options.
Bug: 2811859
Change-Id: Ie2c375278b79b47dedac02472dfe6e4cf1182b65
For EML,
- No menu
- No older/newer buttons
- No star
- No bottom buttons.
I've started to feel like the two UIs (one for regular messages and the
other for EML files) shouldn't be handled by one class; we probably
should separate them into two different classes. I'll see if I can
do that after fragmentize it.
Bug 2804147
Change-Id: I5ae162af546bfc21af27352c642d6b2a1e16cf0f
- Removed dead code/dead comment.
- Moved static utility methods to Utility.
- Renamed some methods.
- Changed the timing to call super methods.
Also:
- Internationalized formatSize()
- Added unit tests for createUniqueFile() and formatSize()
- createUniqueFile now uses File.createNewFile() instead of exists().
Change-Id: Ibc30e15b029ed5088954bd6fc9032e25dddf176e
* The code assumed that all accounts used the scheduler in MailService
whereas only those using MessagingController do so (i.e. EAS does
not)
* Change setupSyncReportsLocked to set the syncInterval for accounts
that don't use MessagingController to Account.CHECK_INTERVAL_NEVER
* Add unit test for the changed code
Change-Id: I74a3dae21d9ec16f9903bdf2a1c28092ae89cc50
Dial *#*#36245#*#* on the dialer to activate the debug screen.
"36245" = "email"
It's useful when
- There's no keyboard.
- There's no account set up yet.
(You can do it by entering the special username/password on new account
screen, but that's a bit of a pain.)
It's also easier to tell to people.
Also, removed "sensitive logging", which should never be used.
Change-Id: Id692f8b216f2d85abe1880c452d2067f170dac83
When connecting to an IMAP, POP3, or SMTP server using SSL, perform
an explicit test of the certificate's host name against the server's
host name. Refuse connection if they do not match.
Bug: 2807409
Change-Id: Ib223170f1a5d57323a88037ad30fec15c6bbce20
* During the fix of a previous late-Froyo issue, a change was made that
appeared superficially correct, but was semantically incorrect. This
changed the sense of the test for whether a reply email was required
and caused the referenced bug.
* The trivial fix is to replace the test with the (older) proper one
Bug: 2764551
Change-Id: I7c72366252cf0607aee31ee0d76aca96a7d5fc2b
Note: This does not appear in UX wireframes, this activity is going
away eventually, but it's a good testbed for ActionBar to be tried out.
Open issues:
1. Waiting for progress indicator support, using unattractive hack
2. Subtitle doesn't seem to work so putting account name in title
(which is the wrong font size for phone portrait mode).
Change-Id: Iee3cac7d4f30ea210bd8f3838b69ed12cd498375
* We need to encode the itemId and collectionId for SmartForward and
SmartReply
* Add unit test for the fix
* Small change + test to EasSyncService usage of URI encoding to use
a non-deprecated method
Bug: 2787725
Change-Id: I428b308b56cc359b8cdd9e42bc3f42c65b6797dc
Displays actionbar properly, and the two buttons work.
Submitting with one open issue:
1. The indeterminate progress indicator is not directly supported in the
ActionBar. We're waiting for a UI call or framework support. Until
then there is a placeholder using an incorrect icon to show progress.
Change-Id: Iaf1546931376cc5b540820cd0fc020ebd176dabf
* Use the new Account.getProtocol() method to determine whether an
Account "isMessagingController" (i.e. uses the legacy controller)
* Cache the result of this test, so that it's only done once per
Account
* Add unit test
Change-Id: I6a0ec789a84bdf30b55156e6337a627fb4e81a08
* The setup flow is changed such that the user is asked to activate
device administration before leaving the setup flow, rather than
having to wait for the notification to appear, etc.
* Accounts requiring security are created in a security hold state
to prevent initial sync until device administration is active
Change-Id: I7e33cf98466370ae27414b99018f7aee71e9e237
* We weren't sending the proper protocol version to GAL search, which
causes errors when using 12.1
* The simple fix is to send the agreed upon protocol version, instead
of the default (which is 2.5)
* Replace parsing of protocol version with lookup
Bug: 2793588
Change-Id: Ib2a255d8467004ce985d2d688b37066e1e09d78a
- Long-press an item to go into the selection mode.
- In the selection mode, tap items to toggle selected/non-selected.
This also means:
- No checkboxes any more.
- No context menu any more.
Color scheme hasn't been updated yet, so it looks a bit ugly for now.
Change-Id: I3cb6c45c1dc5461a234c9e9ab9e038c90a9fe8b2
* Minimum complex characters
* Password history (i.e. disallow re-use of past n passwords)
* Password expiration
* Password expiration is NOT yet supported in the framework; there
is a TODO in this CL and a trivial change will be needed when
support arrives; for now, we report this as unsupported
* The two implemented policies are testable
Change-Id: I477adbc000577c57d1ab1788378c97a60018c10c
* Add intent filter for application/eml and message/rfc822 mime types,
launching MessageView with a Uri
* Modify loadMessageTask to handle the Uri by parsing the attachment's
input stream with Pop3Message.parse(), and then creating an
EmailProvider message in a special Mailbox created to hold
"attachment" messages
* Delete all "attachment" messages after the parent message is closed
* Add unit tests
Change-Id: I20276ee006b9f05b889f3c808d3dc407cde26d49
- Now open, reply, reply-to, forward are handled by activity.
- Renamed onDelete. (I was thinking about renaming more methods, but I ditched
the idea because the current ones aren't that bad.)
Change-Id: Ie88e8cc3c6bd598199cfd9f4cd61d51e8b7023b7
* Introduce AccountFolderListFragment and its layout
* Extract all list-related UI into it
* Fix leaking cursor in AccountsAdapter and add unit test
Change-Id: Ica566847d97927b736f515d434c6691c82343290
- Introduced EmptyCallback to avoid the flood of null checks.
- Fixed some TODOs in MessageListFragment.
- Notably, sendPendingMessages() is now handled by the fragment itself,
rather than by the activity.
- Moved two DB accesss from the UI thread to a worker thread.
- Replaced the 'mailboxid < 0' check with isMagicMailbox(), which is more
explicit and easier to understand.
- Renamed some methods in preparation of moving to the activity.
Change-Id: Ie730c2c561050bbfa83a38252fcf09d59238f7ea
* Send policy key of "0" when validating; this gets us the policies
even if "Allow..." is enabled (currently, we simply don't see the
policies)
* If we don't support all of the policies, send back the response
code indicating support for partial support. If we get a positive
response back, then we're good to go - the server allows devices
with partial support. Otherwise, we fail as we always have - with
the toast indicating that the device doesn't support required
policies
* Remove PolicySet.isSupported() and ensure proper field ranges
within the constructor
* Update tests as appropriate
Bug: 2759782
Change-Id: I5f354a0e2d81844aff75d8a8a6de3b97f0020c1f
- Extracted MessageListFragment out of the MessageList activity.
- This is basically pure extraction, with the following conceptual change.
- Now the MessageList activity doesn't know the mailbox id or
the account id. If it needs these ids, it needs to ask the fragment.
- MessageListFragment.LoadMessagesTask tries to determine the account ID
if it's unknown.
Most code in MessageListFragment is directly copied from MessageList
with minimal changes (e.g. pass mActivity instead of 'this' as a Context).
There's a few cleaning up oppotunities. I'll work on them later in a separate
CL.
Change-Id: Ie004cc49b429f2cd8f9de73df5abb94f3054ea0a
One thing that bothers me regarding the new ImapStore is that there is no
tests to verify if the way how getImapId() uses a vendor policy hasn't changed.
This part is hard to test with a real vendor policy, and it can easily be
overlooked even if it's broken.
This CL offers ImapStoreUnitTests a way to test the interaction between
getImapId() and a vendor policy.
Also fixed a bug in VendorPolicyLoaderTest where it assumed the test apk
package name is "com.android.email.tests", but it may actually be
"com.google.android.email.tests" now. (Broken since the test makefile
used inherit-package.)
Change-Id: I8feb616ea28cb5cae5b4fba57e363771014ac599
Merge commit '7a358316ae1c52fadf7ce8470fc5d257d1a71eaa' into gingerbread
* commit '7a358316ae1c52fadf7ce8470fc5d257d1a71eaa':
Work around problem w/ large CalendarProvider2 transactions
* We're seeing binder transaction failures when we try to send more than around
1500 CPO's to CalendarProvider2 in a batch (the limit is related to memory
usage in binder transactions)
* When an event has A attendees and E exceptions in an event, we currently must
create A*E CPO's; this number can become very large and cause a binder failure
* The result of a failure is looping behavior, resulting in failed sync and very
much reduced battery life
* The workaround here is to redact all non-organizer and non-user attendees from
exceptions once we reach half of the maximum number of CPO's. This has been
determined empirically and is set to 500 CPO's in this CL
* We also reduce our sync "window" to 4 calendar/contact items per sync command
to help limit the potential size of our batch
* For later releases, we should reconsider this and see if something that is more
of a "fix", rather than a workaround, can be implemented
Bug: 2760514
Change-Id: I06ca1a1ae88c772342a9e46b5997c41678e95144
* We're seeing binder transaction failures when we try to send more than around
1500 CPO's to CalendarProvider2 in a batch (the limit is related to memory
usage in binder transactions)
* When an event has A attendees and E exceptions in an event, we currently must
create A*E CPO's; this number can become very large and cause a binder failure
* The result of a failure is looping behavior, resulting in failed sync and very
much reduced battery life
* The workaround here is to redact all non-organizer and non-user attendees from
exceptions once we reach half of the maximum number of CPO's. This has been
determined empirically and is set to 500 CPO's in this CL
* We also reduce our sync "window" to 4 calendar/contact items per sync command
to help limit the potential size of our batch
* For later releases, we should reconsider this and see if something that is more
of a "fix", rather than a workaround, can be implemented
Bug: 2760514
Change-Id: I2941b392ae1058a9ead8a79f0ac73f4eb345917d
- Controller.Result is now a class rather than an interface,
so subclasses don't have to implement empty methods.
- Replaced Threads with AsyncTasks, which is more light weighted
because it uses pooled threads.
- Removed the Result argument from Controller's methods.
These argumetns weren't used, except in serviceCheckMail.
Regarding serviceCheckMail, the new code behave differenly from the old code.
If there's already listeners registered when it's colled, they wouldn't get
called in the old code, but they will in the new code.
But I think this difference is okay because that's how it works for
POP/IMAP accounts.
Change-Id: I37a857ce7c089c1a411cb7f1fcfcb72c9f5fd2a6
* Moves all list-related implementation to new MailboxListFragment
* One item that remains to be done is to remove the dependency on the
activity for handling context menu (longpress) in the list.
Change-Id: I7b5769d9d81fb685cf480de3d3e18b4e1c078f2d
- Removed Handler.
- Refactored FindMailboxTask so it only does DB access on a worker thread.
(Moved the actual task out of doInBackground)
- Removed unused imports, which I forgot when I extracted the adapter.
Change-Id: Ib76ce2ab7901dd39d2ed51d8a61d7be9df55b337
AccountFolderList, MessageCompose and MailboxList.
Also,
- ControllerResultUiThreadWrapper now takes a Handler instead of an Activity.
So that it can be used from a Service as well.
- ControllerResultUiThreadWrapper.getWrappee() to get the wrapped object.
We'll eventually need this.
- I'll work on MessageList too, but the might be relatively
large, so I'll do that in a separate CL
Change-Id: I281d88d5af1834248ec3f7463f0df3f5635149be
- This is to make sure we're not touching any ImapResponse that's
already been destroyed.
- I didn't add "is it already destroyed?" check to them
(except for ImapTempFileLiteral), because it can be costly.
Just let NPE be thrown.
Change-Id: Idc7b88c4844727922841cbad8a106bf781181d45
Unfortunately it's hard to write tests for this change, but at least
all tests pass with Idc7b88c4.
Change-Id: If0335a848dfcc23aecea22c21b2cce73dac7ff6f
- Replace string literals in ImapStore with constants.
- Simplifies ImapStore.en/decodeFolderName
- Mix cases in the test data to test for case-insensitivity
Change-Id: I88424357227bcf78528df5e6a1c4ba45d54cc65b
- Merged all three BroadcastReceivers into one.
(Changed class name because old ones may have been disabled.)
- Use IntentService to perform the tasks in a worker thread.
Note the new receiver will never be disabled. We always need to start
exchange.SyncManager.
Bug 2722155
Bug 2416929
Change-Id: I8241880fc1ee38d85dcdca7e1d46fc2f6b2d375b
Part 1: MessageView
- It's an attempt to get rid of Handlers from Activities, and
reduce the amount of code that runs run a BG thread in them.
- Introduced ResultUiThreadWrapper, which wraps another Controller.Result
and make callbacks get called on the UI thread.
- It'll make the logic in ControllerResults cleaner and more straightforward.
- ResultUiThreadWrapper isn't too memory efficient because it allocates a
Runnable even if the wrappee's target method is empty.
However these callbacks don't get called often, and optimizing it would
make code more complicated, so I don't think it's worth optimizing.
- Now we can assume all the methods in activities except
AsyncTask.doInBackground runs on the UI thread, with some special exceptions
like MediaScannerNotifier.
In my previous abandoned change, I named methods that can run on BG threads
'*OnUiThread', but now there's no need to do that.
This also means we can minimize the use of synchronizations.
Change-Id: Ia6d9d2a266ebf5a4b23d712e9eaea3272adbd2a6
- Almost completely re-wrote ImapResponseParser layer
- We no longer use simple ArrayList and String to represent
imap response. We have classes for that. (Type safe!)
These classes are also NPE-free.
(which isn't necessarily a good thing, though)
- A lot of clean-ups and fixes in ImapStore.
- More tests for ImapStore.
Now ImapResponseParser moved to com.android.email.mail.store.imap.parser,
but inside, it's 99% new code.
This CL introduces many new classes, but most of them are small classes
to represent the IMAP response.
Problems that this CL fixes includes:
- Special characters in OK response
- Handling BYE response
- Case sensitivity
- ClassCast/ArrayIndexOutOfBound/NumberFormatException
- Handling NIL/literals at any position
Bug 2480227
Bug 2244049
Bug 2138981
Bug 1351896
Bug 2591435
Bug 2173061
Bug 2370627
Bug 2524881
Bug 2525902
Bug 2538076
Change-Id: I7116f57fba079b8a5ef8d5439a9b3d9a9af8e6ed
* Extract AccountAdapter from AccountFolderList
* Use callback instead of hardcoded launch of MailboxList
* Unit tests
Change-Id: Icafce1ef73a99fb61985c649620440656f9b51a3
* To avoid having to use a mock deviceId with FolderSync in validation, we now
simply use the real deviceId with the correct SyncKey ("0" for a new account,
or the actual sync key if the account already exists)
* Rework utility code that finds existing accounts
* Write unit test for findExistingAccount
Bug: 2589243
Change-Id: Ia532b2e209aec3aa01ca06617b4da78c3d986b32
* Support required protocol changes
* Handle new security policies based on current device capabilities
Change-Id: Id1d629d41d957911344e6c503d28418f5e7e1386
Merge commit '77e2161559467ac94ffdbaa2d51716354741ae17' into kraken
* commit '77e2161559467ac94ffdbaa2d51716354741ae17':
Handle case of null organizerEmail in changed event
Merge commit '8c742a4c65e1ff2618e1005803edb65a42994fb6' into froyo-plus-aosp
* commit '8c742a4c65e1ff2618e1005803edb65a42994fb6':
Handle case of null organizerEmail in changed event
* A recent change assumed that organizerEmail couldn't be null while
an event was being added. However, there is an unusual case in
which it CAN be null, and this CL handles that case
* Regression caused by: SHA 7f448dcd47
Bug: 2719254
Change-Id: Idb8fc79c898bcd2e53fcc8b3e42d0ba67ba762fa
Merge commit '17c8b3388c1aceb5a4886f7d783e1db1913d9d05' into kraken
* commit '17c8b3388c1aceb5a4886f7d783e1db1913d9d05':
Remember to store modified organizerEmail
Merge commit 'b6a08f68d7c49835fffed0719e99c13b50fa525c' into froyo-plus-aosp
* commit 'b6a08f68d7c49835fffed0719e99c13b50fa525c':
Remember to store modified organizerEmail
Merge commit 'd3951041f613008dcbd3cd4b3ddebdad5ccab806' into kraken
* commit 'd3951041f613008dcbd3cd4b3ddebdad5ccab806':
Limit the number of attendees in a synced event
Merge commit '7f448dcd470ac509a85368a84f5a55c346ae7e70' into froyo-plus-aosp
* commit '7f448dcd470ac509a85368a84f5a55c346ae7e70':
Limit the number of attendees in a synced event
* If there are over 50 attendees in an event, we only store the
organizer as an attendee (the rest are redacted) and we set
the hasAttendeeData flag to 0
* If the user is the organizer, we reset the owner of the event
to a bogus address, which causes the UI to prevent edits to
the event (we can't upload without losing all of the attendee
information on the server). We also prevent the event from ever
being uploaded (belt & suspenders)
* If the user is an attendee, we allow changes to be uploaded
(this would be attendee status and free/busy), but the list of
attendees on the server is removed.
* We also mark events with redacted attendees, even though we don't
use that information currently. In a future version, however,
we could use this to indicate the redacted state to the user.
Bug: 2709816
Change-Id: I2b44af59c598cedf906af12bf9b4eaf7484b9d20
Merge commit '4c8adbc4aa81308e57ae129e9587ec50483af6a8' into kraken
* commit '4c8adbc4aa81308e57ae129e9587ec50483af6a8':
Fix bugs related to TZ handling for all-day events
Merge commit '027a6ddfaa7228854cb3c4238434f87fc69078b6' into froyo-plus-aosp
* commit '027a6ddfaa7228854cb3c4238434f87fc69078b6':
Fix bugs related to TZ handling for all-day events
* In bug 2703075, all-day events from time zones at GMT or later
appear a day early; this is because the time was calculated from
the GMT date/time of the event rather than the local date/time of
the event; this CL correctly changes this to use local date/time
* In bug 2707966, device-edited all-day events disappear in Outlook
and OWA after upsync; this is due to the fact that we store all-day
events in UTC on device, whereas we need to upload all-day events
using the original (local) time zone. In this CL, we save away
the original time zone and use it on upsync
* In our decoding of Exchange time zone information, we default to
local time when we can't find a time zone that matches the bias
and DST information; we should really default to a time zone with
the same bias, if one exists; we do that in this CL.
* Add/modify unit tests
Bug: 2703075
Change-Id: Id80c481ecc0eae980b2e91dae7f105f924cfca28
Merge commit '5c0f3b332f6104d6526d546a470cf7eb9978de47' into kraken
* commit '5c0f3b332f6104d6526d546a470cf7eb9978de47':
Fix problem w/ sync of large calendars (never syncs)
Merge commit '6bd7a167249727f4b7d4d4cfe713be421f400e51' into froyo-plus-aosp
* commit '6bd7a167249727f4b7d4d4cfe713be421f400e51':
Fix problem w/ sync of large calendars (never syncs)
* While working w/ Microsoft on this issue, we determined that Windows
Mobile 6.0 does not suffer from this issue; when we compared our
logs with those from the WM client, we noticed a difference in the
commands being sent to the server on initial sync (we send some extra
options whereas WM doesnot)
* As an experiment, I removed these options from the initial
sync, and this change solved the problem with a persistently unsyncable
account (time to receive: 60-70 seconds vs. > 240 seconds).
* The fix is to remove all "options" from the initial sync for a given
collection (i.e. with SyncKey=0)
* Note that Microsoft's documentation does not generally address the issue
of what should/should not be sent in an initial sync command
Bug: 2569162
Change-Id: Ib20ea56fb380ee8c9a01b139f7fa98b7ff505e7a
* While working w/ Microsoft on this issue, we determined that Windows
Mobile 6.0 does not suffer from this issue; when we compared our
logs with those from the WM client, we noticed a difference in the
commands being sent to the server on initial sync (we send some extra
options whereas WM doesnot)
* As an experiment, I removed these options from the initial
sync, and this change solved the problem with a persistently unsyncable
account (time to receive: 60-70 seconds vs. > 240 seconds).
* The fix is to remove all "options" from the initial sync for a given
collection (i.e. with SyncKey=0)
* Note that Microsoft's documentation does not generally address the issue
of what should/should not be sent in an initial sync command
Bug: 2569162
Change-Id: I69642cc0097296956029485abb85ac750303c865
We have singletons that store a Context passed to getInstance().
The problem is that when we call them, we casually pass any Context at hand.
If it's an activity (which is often the case), it'll never be GCed.
This CL make them store the application context insteaed.
Change-Id: I1abcc2c08d3f8201416d6c14720f041693823b4e
- A few new tests in ImapStoreUnitTests.
- Added TODOs to ImapStoreUnitTests (for mainly NO response handling)
- Renamed ImapStore.releaseConnection to poolConnection.
- Fixed a bug in getConnection where it'd return a closed connection.
- Now getConnection() hanles BYE response for NOOP correctly and treat the
connection as closed.
Change-Id: I48e5b89049338f7d4f1ac77cd7ac7243945a9575
* Microsoft has documented cases in which the server can continue to
send MoreAvailable=true even when no new data is received. This
can cause looping behavior, which we stop when we recognize it.
* This workaround, however, can prevent the situation from resolving
itself, and lead to delayed sync (up to a few hours has been noticed)
* In this limited CL, we allow the sync to loop up to a maximum number
of times before stopping it forcibly.
Bug: 2685984
Change-Id: I85981b85b71c4e7d53e69da2520543e8ef04c889
* Microsoft has documented cases in which the server can continue to
send MoreAvailable=true even when no new data is received. This
can cause looping behavior, which we stop when we recognize it.
* This workaround, however, can prevent the situation from resolving
itself, and lead to delayed sync (up to a few hours has been noticed)
* In this limited CL, we allow the sync to loop up to a maximum number
of times before stopping it forcibly.
Bug: 2685984
Change-Id: I2913b7e3438f6180c3c440508fab892176a06540
- Also, fixed a potential crash in getMessages().
It could happen when a client is gettign a message list while
another client is removing messages.
Change-Id: I04b1de6bc384cffb7a5286bcec0a349a3d62a623