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

Fixes Issue 254

Provide for only showing folders that are subscribed on the server
(IMAP only)

Also:
Change default for Notification behavior to the old way.  Make going
to the search for unread messages off by default.

Fix up some hiding of labels, etc. on the incoming server settings.

Check for message suppression in search results.
This commit is contained in:
Daniel Applebaum 2010-05-30 16:56:50 +00:00
parent 1a66072910
commit dedfd026be
10 changed files with 108 additions and 33 deletions

View File

@ -66,6 +66,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<TextView <TextView
android:id="@+id/account_auth_type_label"
android:text="@string/account_setup_incoming_authtype_label" android:text="@string/account_setup_incoming_authtype_label"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_width="fill_parent"
@ -132,6 +134,12 @@
android:inputType="number" android:inputType="number"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<CheckBox
android:id="@+id/subscribed_folders_only"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/account_setup_incoming_subscribed_folders_only_label"
/>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -183,6 +191,7 @@
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/compression_label"
android:text="@string/account_setup_incoming_compression_label" android:text="@string/account_setup_incoming_compression_label"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_width="fill_parent"

View File

@ -364,6 +364,7 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
<string name="account_setup_incoming_imap_folder_trash">Trash folder name</string> <string name="account_setup_incoming_imap_folder_trash">Trash folder name</string>
<string name="account_setup_incoming_imap_folder_outbox">Outbox folder name</string> <string name="account_setup_incoming_imap_folder_outbox">Outbox folder name</string>
<string name="account_setup_incoming_subscribed_folders_only_label">Show only subscribed folders</string>
<string name="account_setup_auto_expand_folder">Auto-expand folder</string> <string name="account_setup_auto_expand_folder">Auto-expand folder</string>
<string name="account_setup_incoming_webdav_path_prefix_label">WebDAV (Exchange) path</string> <string name="account_setup_incoming_webdav_path_prefix_label">WebDAV (Exchange) path</string>

View File

@ -90,6 +90,7 @@ public class Account implements BaseAccount
private boolean goToUnreadMessageSearch; private boolean goToUnreadMessageSearch;
private Map<String, Boolean> compressionMap = new ConcurrentHashMap<String, Boolean>(); private Map<String, Boolean> compressionMap = new ConcurrentHashMap<String, Boolean>();
private Searchable searchableFolders; private Searchable searchableFolders;
private boolean subscribedFoldersOnly;
// Tracks if we have sent a notification for this account for // Tracks if we have sent a notification for this account for
// current set of fetched messages // current set of fetched messages
private boolean mRingNotified; private boolean mRingNotified;
@ -140,6 +141,7 @@ public class Account implements BaseAccount
mChipColor = (new Random()).nextInt(0xffffff) + 0xff000000; mChipColor = (new Random()).nextInt(0xffffff) + 0xff000000;
mLedColor = mChipColor; mLedColor = mChipColor;
goToUnreadMessageSearch = false; goToUnreadMessageSearch = false;
subscribedFoldersOnly = false;
searchableFolders = Searchable.ALL; searchableFolders = Searchable.ALL;
@ -200,7 +202,9 @@ public class Account implements BaseAccount
mMaxPushFolders = preferences.getPreferences().getInt(mUuid + ".maxPushFolders", 10); mMaxPushFolders = preferences.getPreferences().getInt(mUuid + ".maxPushFolders", 10);
goToUnreadMessageSearch = preferences.getPreferences().getBoolean(mUuid + ".goToUnreadMessageSearch", goToUnreadMessageSearch = preferences.getPreferences().getBoolean(mUuid + ".goToUnreadMessageSearch",
true); false);
subscribedFoldersOnly = preferences.getPreferences().getBoolean(mUuid + ".subscribedFoldersOnly",
false);
for (String type : networkTypes) for (String type : networkTypes)
{ {
Boolean useCompression = preferences.getPreferences().getBoolean(mUuid + ".useCompression." + type, Boolean useCompression = preferences.getPreferences().getBoolean(mUuid + ".useCompression." + type,
@ -370,6 +374,7 @@ public class Account implements BaseAccount
editor.remove(mUuid + ".chipColor"); editor.remove(mUuid + ".chipColor");
editor.remove(mUuid + ".ledColor"); editor.remove(mUuid + ".ledColor");
editor.remove(mUuid + ".goToUnreadMessageSearch"); editor.remove(mUuid + ".goToUnreadMessageSearch");
editor.remove(mUuid + ".subscribedFoldersOnly");
for (String type : networkTypes) for (String type : networkTypes)
{ {
editor.remove(mUuid + ".useCompression." + type); editor.remove(mUuid + ".useCompression." + type);
@ -453,6 +458,7 @@ public class Account implements BaseAccount
editor.putInt(mUuid + ".chipColor", mChipColor); editor.putInt(mUuid + ".chipColor", mChipColor);
editor.putInt(mUuid + ".ledColor", mLedColor); editor.putInt(mUuid + ".ledColor", mLedColor);
editor.putBoolean(mUuid + ".goToUnreadMessageSearch", goToUnreadMessageSearch); editor.putBoolean(mUuid + ".goToUnreadMessageSearch", goToUnreadMessageSearch);
editor.putBoolean(mUuid + ".subscribedFoldersOnly", subscribedFoldersOnly);
for (String type : networkTypes) for (String type : networkTypes)
{ {
@ -484,7 +490,7 @@ public class Account implements BaseAccount
Account.FolderMode aMode = getFolderDisplayMode(); Account.FolderMode aMode = getFolderDisplayMode();
Preferences prefs = Preferences.getPreferences(context); Preferences prefs = Preferences.getPreferences(context);
long folderLoadStart = System.currentTimeMillis(); long folderLoadStart = System.currentTimeMillis();
List<? extends Folder> folders = localStore.getPersonalNamespaces(); List<? extends Folder> folders = localStore.getPersonalNamespaces(false);
long folderLoadEnd = System.currentTimeMillis(); long folderLoadEnd = System.currentTimeMillis();
long folderEvalStart = folderLoadEnd; long folderEvalStart = folderLoadEnd;
for (Folder folder : folders) for (Folder folder : folders)
@ -1202,4 +1208,14 @@ public class Account implements BaseAccount
{ {
this.goToUnreadMessageSearch = goToUnreadMessageSearch; this.goToUnreadMessageSearch = goToUnreadMessageSearch;
} }
public boolean subscribedFoldersOnly()
{
return subscribedFoldersOnly;
}
public void setSubscribedFoldersOnly(boolean subscribedFoldersOnly)
{
this.subscribedFoldersOnly = subscribedFoldersOnly;
}
} }

View File

@ -89,6 +89,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
private CheckBox pushPollOnConnect; private CheckBox pushPollOnConnect;
private Spinner idleRefreshPeriod; private Spinner idleRefreshPeriod;
private Spinner folderPushLimit; private Spinner folderPushLimit;
private CheckBox subscribedFoldersOnly;
public static void actionIncomingSettings(Activity context, Account account, boolean makeDefault) public static void actionIncomingSettings(Activity context, Account account, boolean makeDefault)
{ {
@ -133,6 +134,8 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
compressionOther = (CheckBox)findViewById(R.id.compression_other); compressionOther = (CheckBox)findViewById(R.id.compression_other);
saveAllHeaders = (CheckBox)findViewById(R.id.save_all_headers); saveAllHeaders = (CheckBox)findViewById(R.id.save_all_headers);
pushPollOnConnect = (CheckBox)findViewById(R.id.push_poll_on_connect); pushPollOnConnect = (CheckBox)findViewById(R.id.push_poll_on_connect);
subscribedFoldersOnly = (CheckBox)findViewById(R.id.subscribed_folders_only);
idleRefreshPeriod = (Spinner)findViewById(R.id.idle_refresh_period); idleRefreshPeriod = (Spinner)findViewById(R.id.idle_refresh_period);
folderPushLimit = (Spinner)findViewById(R.id.folder_push_limit); folderPushLimit = (Spinner)findViewById(R.id.folder_push_limit);
@ -296,8 +299,10 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
findViewById(R.id.imap_folder_setup_section).setVisibility(View.GONE); findViewById(R.id.imap_folder_setup_section).setVisibility(View.GONE);
findViewById(R.id.webdav_path_prefix_section).setVisibility(View.GONE); findViewById(R.id.webdav_path_prefix_section).setVisibility(View.GONE);
findViewById(R.id.webdav_path_debug_section).setVisibility(View.GONE); findViewById(R.id.webdav_path_debug_section).setVisibility(View.GONE);
findViewById(R.id.account_auth_type_label).setVisibility(View.GONE);
findViewById(R.id.account_auth_type).setVisibility(View.GONE); findViewById(R.id.account_auth_type).setVisibility(View.GONE);
findViewById(R.id.compression_section).setVisibility(View.GONE); findViewById(R.id.compression_section).setVisibility(View.GONE);
findViewById(R.id.compression_label).setVisibility(View.GONE);
findViewById(R.id.push_poll_on_connect_section).setVisibility(View.GONE); findViewById(R.id.push_poll_on_connect_section).setVisibility(View.GONE);
findViewById(R.id.idle_refresh_period_label).setVisibility(View.GONE); findViewById(R.id.idle_refresh_period_label).setVisibility(View.GONE);
findViewById(R.id.idle_refresh_period).setVisibility(View.GONE); findViewById(R.id.idle_refresh_period).setVisibility(View.GONE);
@ -335,13 +340,16 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
/** Hide the unnecessary fields */ /** Hide the unnecessary fields */
findViewById(R.id.imap_path_prefix_section).setVisibility(View.GONE); findViewById(R.id.imap_path_prefix_section).setVisibility(View.GONE);
findViewById(R.id.account_auth_type_label).setVisibility(View.GONE);
findViewById(R.id.account_auth_type).setVisibility(View.GONE); findViewById(R.id.account_auth_type).setVisibility(View.GONE);
findViewById(R.id.compression_section).setVisibility(View.GONE); findViewById(R.id.compression_section).setVisibility(View.GONE);
findViewById(R.id.compression_label).setVisibility(View.GONE);
findViewById(R.id.push_poll_on_connect_section).setVisibility(View.GONE); findViewById(R.id.push_poll_on_connect_section).setVisibility(View.GONE);
findViewById(R.id.idle_refresh_period_label).setVisibility(View.GONE); findViewById(R.id.idle_refresh_period_label).setVisibility(View.GONE);
findViewById(R.id.idle_refresh_period).setVisibility(View.GONE); findViewById(R.id.idle_refresh_period).setVisibility(View.GONE);
findViewById(R.id.account_setup_push_limit_label).setVisibility(View.GONE); findViewById(R.id.account_setup_push_limit_label).setVisibility(View.GONE);
findViewById(R.id.folder_push_limit).setVisibility(View.GONE); findViewById(R.id.folder_push_limit).setVisibility(View.GONE);
subscribedFoldersOnly.setVisibility(View.GONE);
if (uri.getPath() != null && uri.getPath().length() > 0) if (uri.getPath() != null && uri.getPath().length() > 0)
{ {
String[] pathParts = uri.getPath().split("\\|"); String[] pathParts = uri.getPath().split("\\|");
@ -408,6 +416,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
saveAllHeaders.setChecked(mAccount.isSaveAllHeaders()); saveAllHeaders.setChecked(mAccount.isSaveAllHeaders());
pushPollOnConnect.setChecked(mAccount.isPushPollOnConnect()); pushPollOnConnect.setChecked(mAccount.isPushPollOnConnect());
subscribedFoldersOnly.setChecked(mAccount.subscribedFoldersOnly());
SpinnerHelper.initSpinner(this, idleRefreshPeriod, R.array.idle_refresh_period_entries, SpinnerHelper.initSpinner(this, idleRefreshPeriod, R.array.idle_refresh_period_entries,
R.array.idle_refresh_period_values, String.valueOf(mAccount.getIdleRefreshMinutes())); R.array.idle_refresh_period_values, String.valueOf(mAccount.getIdleRefreshMinutes()));
@ -564,6 +573,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
mAccount.setCompression(Account.TYPE_OTHER, compressionOther.isChecked()); mAccount.setCompression(Account.TYPE_OTHER, compressionOther.isChecked());
mAccount.setSaveAllHeaders(saveAllHeaders.isChecked()); mAccount.setSaveAllHeaders(saveAllHeaders.isChecked());
mAccount.setPushPollOnConnect(pushPollOnConnect.isChecked()); mAccount.setPushPollOnConnect(pushPollOnConnect.isChecked());
mAccount.setSubscribedFoldersOnly(subscribedFoldersOnly.isChecked());
String idleRefreshPeriodValue = SpinnerHelper.getSpinnerValue(idleRefreshPeriod); String idleRefreshPeriodValue = SpinnerHelper.getSpinnerValue(idleRefreshPeriod);
try try
{ {

View File

@ -421,7 +421,7 @@ public class MessagingController implements Runnable
try try
{ {
Store localStore = account.getLocalStore(); Store localStore = account.getLocalStore();
localFolders = localStore.getPersonalNamespaces(); localFolders = localStore.getPersonalNamespaces(false);
Folder[] folderArray = localFolders.toArray(new Folder[0]); Folder[] folderArray = localFolders.toArray(new Folder[0]);
@ -489,7 +489,7 @@ public class MessagingController implements Runnable
{ {
Store store = account.getRemoteStore(); Store store = account.getRemoteStore();
List<? extends Folder> remoteFolders = store.getPersonalNamespaces(); List<? extends Folder> remoteFolders = store.getPersonalNamespaces(false);
LocalStore localStore = account.getLocalStore(); LocalStore localStore = account.getLocalStore();
HashSet<String> remoteFolderNames = new HashSet<String>(); HashSet<String> remoteFolderNames = new HashSet<String>();
@ -503,7 +503,7 @@ public class MessagingController implements Runnable
remoteFolderNames.add(remoteFolders.get(i).getName()); remoteFolderNames.add(remoteFolders.get(i).getName());
} }
localFolders = localStore.getPersonalNamespaces(); localFolders = localStore.getPersonalNamespaces(false);
/* /*
* Clear out any folders that are no longer on the remote store. * Clear out any folders that are no longer on the remote store.
@ -526,7 +526,7 @@ public class MessagingController implements Runnable
} }
} }
localFolders = localStore.getPersonalNamespaces(); localFolders = localStore.getPersonalNamespaces(false);
Folder[] folderArray = localFolders.toArray(new Folder[0]); Folder[] folderArray = localFolders.toArray(new Folder[0]);
for (MessagingListener l : getListeners()) for (MessagingListener l : getListeners())
@ -810,7 +810,7 @@ public class MessagingController implements Runnable
try try
{ {
LocalStore store = account.getLocalStore(); LocalStore store = account.getLocalStore();
List<? extends Folder> folders = store.getPersonalNamespaces(); List<? extends Folder> folders = store.getPersonalNamespaces(false);
Set<String> folderNameSet = null; Set<String> folderNameSet = null;
if (folderNames != null) if (folderNames != null)
{ {
@ -879,14 +879,17 @@ public class MessagingController implements Runnable
public void messageStarted(String message, int number, int ofTotal) {} public void messageStarted(String message, int number, int ofTotal) {}
public void messageFinished(Message message, int number, int ofTotal) public void messageFinished(Message message, int number, int ofTotal)
{ {
List<Message> messages = new ArrayList<Message>(); if (isMessageSuppressed(message.getFolder().getAccount(), message.getFolder().getName(), message) == false)
messages.add(message);
stats.unreadMessageCount += (message.isSet(Flag.SEEN) == false) ? 1 : 0;
stats.flaggedMessageCount += (message.isSet(Flag.FLAGGED)) ? 1 : 0;
if (listener != null)
{ {
listener.listLocalMessagesAddMessages(account, null, messages); List<Message> messages = new ArrayList<Message>();
messages.add(message);
stats.unreadMessageCount += (message.isSet(Flag.SEEN) == false) ? 1 : 0;
stats.flaggedMessageCount += (message.isSet(Flag.FLAGGED)) ? 1 : 0;
if (listener != null)
{
listener.listLocalMessagesAddMessages(account, null, messages);
}
} }
} }
@ -4195,7 +4198,7 @@ public class MessagingController implements Runnable
Account.FolderMode aSyncMode = account.getFolderSyncMode(); Account.FolderMode aSyncMode = account.getFolderSyncMode();
Store localStore = account.getLocalStore(); Store localStore = account.getLocalStore();
for (final Folder folder : localStore.getPersonalNamespaces()) for (final Folder folder : localStore.getPersonalNamespaces(false))
{ {
folder.open(Folder.OpenMode.READ_WRITE); folder.open(Folder.OpenMode.READ_WRITE);
@ -4764,7 +4767,7 @@ public class MessagingController implements Runnable
List<String> names = new ArrayList<String>(); List<String> names = new ArrayList<String>();
Store localStore = account.getLocalStore(); Store localStore = account.getLocalStore();
for (final Folder folder : localStore.getPersonalNamespaces()) for (final Folder folder : localStore.getPersonalNamespaces(false))
{ {
if (folder.getName().equals(account.getErrorFolderName()) if (folder.getName().equals(account.getErrorFolderName())
|| folder.getName().equals(account.getOutboxFolderName())) || folder.getName().equals(account.getOutboxFolderName()))

View File

@ -116,7 +116,7 @@ public abstract class Store
public abstract Folder getFolder(String name) throws MessagingException; public abstract Folder getFolder(String name) throws MessagingException;
public abstract List<? extends Folder> getPersonalNamespaces() throws MessagingException; public abstract List<? extends Folder> getPersonalNamespaces(boolean forceListAll) throws MessagingException;
public abstract void checkSettings() throws MessagingException; public abstract void checkSettings() throws MessagingException;

View File

@ -251,20 +251,65 @@ public class ImapStore extends Store
} }
@Override @Override
public List<? extends Folder> getPersonalNamespaces() throws MessagingException public List<? extends Folder> getPersonalNamespaces(boolean forceListAll) throws MessagingException
{ {
ImapConnection connection = getConnection(); ImapConnection connection = getConnection();
try try
{ {
List<? extends Folder> allFolders = listFolders(connection, false);
if (forceListAll || mAccount.subscribedFoldersOnly() == false)
{
return allFolders;
}
else
{
List<Folder> resultFolders = new LinkedList<Folder>();
HashSet<String> subscribedFolderNames = new HashSet<String>();
List<? extends Folder> subscribedFolders = listFolders(connection, true);
for (Folder subscribedFolder : subscribedFolders)
{
subscribedFolderNames.add(subscribedFolder.getName());
}
for (Folder folder : allFolders)
{
if (subscribedFolderNames.contains(folder.getName()))
{
resultFolders.add(folder);
}
}
return resultFolders;
}
}
catch (IOException ioe)
{
connection.close();
throw new MessagingException("Unable to get folder list.", ioe);
}
catch (MessagingException me)
{
connection.close();
throw new MessagingException("Unable to get folder list.", me);
}
finally
{
releaseConnection(connection);
}
}
private List<? extends Folder> listFolders(ImapConnection connection, boolean LSUB) throws IOException, MessagingException
{
String commandResponse = LSUB ? "LSUB" : "LIST";
LinkedList<Folder> folders = new LinkedList<Folder>(); LinkedList<Folder> folders = new LinkedList<Folder>();
List<ImapResponse> responses = List<ImapResponse> responses =
connection.executeSimpleCommand(String.format("LIST \"\" \"%s*\"", connection.executeSimpleCommand(String.format(commandResponse + " \"\" \"%s*\"",
getCombinedPrefix())); getCombinedPrefix()));
for (ImapResponse response : responses) for (ImapResponse response : responses)
{ {
if (ImapResponseParser.equalsIgnoreCase(response.get(0), "LIST")) if (ImapResponseParser.equalsIgnoreCase(response.get(0), commandResponse))
{ {
boolean includeFolder = true; boolean includeFolder = true;
String folder = decodeFolderName(response.getString(3)); String folder = decodeFolderName(response.getString(3));
@ -312,16 +357,7 @@ public class ImapStore extends Store
} }
folders.add(getFolder("INBOX")); folders.add(getFolder("INBOX"));
return folders; return folders;
}
catch (IOException ioe)
{
connection.close();
throw new MessagingException("Unable to get folder list.", ioe);
}
finally
{
releaseConnection(connection);
}
} }
@Override @Override

View File

@ -373,7 +373,7 @@ public class LocalStore extends Store implements Serializable
// TODO this takes about 260-300ms, seems slow. // TODO this takes about 260-300ms, seems slow.
@Override @Override
public List<? extends Folder> getPersonalNamespaces() throws MessagingException public List<? extends Folder> getPersonalNamespaces(boolean forceListAll) throws MessagingException
{ {
LinkedList<LocalFolder> folders = new LinkedList<LocalFolder>(); LinkedList<LocalFolder> folders = new LinkedList<LocalFolder>();
Cursor cursor = null; Cursor cursor = null;

View File

@ -159,7 +159,7 @@ public class Pop3Store extends Store
} }
@Override @Override
public List<? extends Folder> getPersonalNamespaces() throws MessagingException public List<? extends Folder> getPersonalNamespaces(boolean forceListAll) throws MessagingException
{ {
List<Folder> folders = new LinkedList<Folder>(); List<Folder> folders = new LinkedList<Folder>();
folders.add(getFolder("INBOX")); folders.add(getFolder("INBOX"));

View File

@ -263,7 +263,7 @@ public class WebDavStore extends Store
} }
@Override @Override
public List<? extends Folder> getPersonalNamespaces() throws MessagingException public List<? extends Folder> getPersonalNamespaces(boolean forceListAll) throws MessagingException
{ {
LinkedList<Folder> folderList = new LinkedList<Folder>(); LinkedList<Folder> folderList = new LinkedList<Folder>();
HashMap<String, String> headers = new HashMap<String, String>(); HashMap<String, String> headers = new HashMap<String, String>();