Ignore:
Timestamp:
09/06/10 14:45:51 (17 months ago)
Author:
octorian
Message:

Moved screen update batch logic into AbstractScreenProvider

Location:
trunk/LogicMail/src/org/logicprobe/LogicMail
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractIncomingMailClient.java

    r656 r702  
    141141        return false; 
    142142    } 
    143      
    144     public int getFolderMessageUpdateFrequency() { 
    145         return 10; 
    146     } 
    147143} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailClient.java

    r656 r702  
    301301     
    302302    /** 
    303      * Gets the frequency with which folder message updates should be passed 
    304      * to higher levels of the application.  This value should be a best guess 
    305      * based on how long it takes to receive and parse incoming folder message 
    306      * data. 
    307      *  
    308      * @return Recommended folder message update frequency 
    309      */ 
    310     int getFolderMessageUpdateFrequency(); 
    311      
    312     /** 
    313303     * Get a particular message from the selected folder. 
    314304     * <p> 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailConnectionHandler.java

    r656 r702  
    303303 
    304304    private static class GetFolderMessageCallback implements FolderMessageCallback { 
    305         private int maxCount; 
    306305        private int type; 
    307306        private FolderTreeItem folder; 
     
    309308        private Object tag; 
    310309        private Object param; 
    311         private FolderMessage[] folderMessages; 
    312         private int count; 
    313  
    314         public GetFolderMessageCallback(int maxCount, int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object tag) { 
    315             this(maxCount, type, folder, listener, null, tag); 
    316         } 
    317  
    318         public GetFolderMessageCallback(int maxCount, int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object param, Object tag) { 
    319             this.maxCount = maxCount; 
     310 
     311        public GetFolderMessageCallback(int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object tag) { 
     312            this(type, folder, listener, null, tag); 
     313        } 
     314 
     315        public GetFolderMessageCallback(int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object param, Object tag) { 
    320316            this.type = type; 
    321317            this.folder = folder; 
     
    323319            this.param = param; 
    324320            this.tag = tag; 
    325             this.count = 0; 
    326321        } 
    327322 
    328323        public void folderMessageUpdate(FolderMessage folderMessage) { 
    329             FolderMessage[] resultMessages = null; 
    330             synchronized(this) { 
     324            if(listener != null) { 
    331325                if(folderMessage != null) { 
    332                     if(count == 0) { 
    333                         folderMessages = new FolderMessage[maxCount]; 
    334                     } 
    335                     folderMessages[count++] = folderMessage; 
    336                 } 
    337  
    338                 if(count == maxCount) { 
    339                     resultMessages = folderMessages; 
    340                     folderMessages = null; 
    341                     count = 0; 
    342                 } 
    343                 else if(folderMessage == null) { 
    344                     resultMessages = new FolderMessage[count]; 
    345                     for(int i=0; i<count; i++) { 
    346                         resultMessages[i] = folderMessages[i]; 
    347                     } 
    348                     folderMessages = null; 
    349                     count = 0; 
    350                 } 
    351             } 
    352  
    353             if(listener != null) { 
    354                 if(resultMessages != null) { 
    355326                    if(param == null) { 
    356                         listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages }, tag); 
     327                        listener.mailConnectionRequestComplete(type, new Object[] { folder, new FolderMessage[] { folderMessage } }, tag); 
    357328                    } 
    358329                    else { 
    359                         listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param }, tag); 
    360                     } 
    361                 } 
    362  
    363                 // If this is the last update of the sequence, make sure we notify 
    364                 // the listener with a null array so it knows we are done. 
    365                 if(folderMessage == null) { 
     330                        listener.mailConnectionRequestComplete(type, new Object[] { folder, new FolderMessage[] { folderMessage }, param }, tag); 
     331                    } 
     332                } 
     333                else { 
     334                    // If this is the last update of the sequence, make sure we 
     335                    // notify the listener with a null array so it knows we are done. 
    366336                    if(param == null) { 
    367337                        listener.mailConnectionRequestComplete(type, new Object[] { folder, null }, tag); 
     
    383353                firstIndex, lastIndex, 
    384354                new GetFolderMessageCallback( 
    385                         incomingClient.getFolderMessageUpdateFrequency(), 
    386355                        REQUEST_FOLDER_MESSAGES_RANGE, 
    387356                        folder, 
     
    398367                messageTokens, 
    399368                new GetFolderMessageCallback( 
    400                         incomingClient.getFolderMessageUpdateFrequency(), 
    401369                        REQUEST_FOLDER_MESSAGES_SET, 
    402370                        folder, 
     
    413381                flagsOnly, 
    414382                new GetFolderMessageCallback( 
    415                         incomingClient.getFolderMessageUpdateFrequency(), 
    416383                        REQUEST_FOLDER_MESSAGES_RECENT, 
    417384                        folder, 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/imap/ImapClient.java

    r698 r702  
    853853 
    854854    /* (non-Javadoc) 
    855      * @see org.logicprobe.LogicMail.mail.IncomingMailClient#getFolderMessageUpdateFrequency() 
    856      */ 
    857     public int getFolderMessageUpdateFrequency() { 
    858         return 5; 
    859     } 
    860      
    861     /* (non-Javadoc) 
    862855     * @see org.logicprobe.LogicMail.mail.IncomingMailClient#getMessage(org.logicprobe.LogicMail.mail.MessageToken, org.logicprobe.LogicMail.mail.MailProgressHandler) 
    863856     */ 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/pop/PopClient.java

    r698 r702  
    396396 
    397397    /* (non-Javadoc) 
    398      * @see org.logicprobe.LogicMail.mail.IncomingMailClient#getFolderMessageUpdateFrequency() 
    399      */ 
    400     public int getFolderMessageUpdateFrequency() { 
    401         return 2; 
    402     } 
    403      
    404     /* (non-Javadoc) 
    405398     * @see org.logicprobe.LogicMail.mail.IncomingMailClient#getMessage(org.logicprobe.LogicMail.mail.MessageToken, org.logicprobe.LogicMail.mail.MailProgressHandler) 
    406399     */ 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/MailboxNode.java

    r701 r702  
    10711071     
    10721072    private class RefreshMessagesThread extends Thread implements MessageNodeCallback { 
    1073         private Vector messagesToAdd = new Vector(); 
    1074          
    10751073        public RefreshMessagesThread() { 
    10761074             
     
    10811079            try { 
    10821080                MailFileManager.getInstance().readMessageNodes(MailboxNode.this, this); 
    1083                 addLoadedMessages(); 
    10841081                 
    10851082                // If the server fetch completed before the cache load, then 
     
    11291126                    } 
    11301127                } 
    1131                 messagesToAdd.addElement(messageNode); 
    1132                 if(messagesToAdd.size() == 4) { 
    1133                     addLoadedMessages(); 
    1134                 } 
    1135             } 
    1136         } 
    1137          
    1138         private void addLoadedMessages() { 
    1139             int size = messagesToAdd.size(); 
    1140             if(size == 0) { return; } 
    1141              
    1142             MessageNode[] messageArray = new MessageNode[size]; 
    1143             messagesToAdd.copyInto(messageArray); 
    1144             messagesToAdd.removeAllElements(); 
    1145             MailboxNode.this.addMessages(messageArray); 
     1128                MailboxNode.this.addMessage(messageNode); 
     1129            } 
    11461130        } 
    11471131    } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/ui/AbstractScreenProvider.java

    r671 r702  
    3131package org.logicprobe.LogicMail.ui; 
    3232 
     33import java.util.Vector; 
     34 
    3335import net.rim.device.api.i18n.ResourceBundle; 
    3436 
     
    3638 
    3739import net.rim.device.api.ui.Screen; 
     40import net.rim.device.api.ui.UiApplication; 
    3841import net.rim.device.api.ui.component.Menu; 
    3942 
     
    4750    protected Screen screen; 
    4851        private StandardScreen standardScreen; 
     52    private final Object invokeLock = new Object(); 
     53        private Vector invokeItems = new Vector(); 
     54        private boolean invokeInProgress = false; 
    4955         
    5056        /* (non-Javadoc) 
     
    153159        public void shortcutAction(ShortcutItem item) { 
    154160        } 
     161         
     162        /** 
     163         * Puts the runnable object within this screen's UI event queue, so that it 
     164         * is run on the application's UI event queue.  This intermediate queue is 
     165         * necessary to prevent the event thread from filling up with items in 
     166         * cases where the screen experiences a lot of updates. 
     167         * 
     168         * @param runnable the runnable object 
     169         */ 
     170        public void invokeLater(Runnable runnable) { 
     171            synchronized(invokeLock) { 
     172                invokeItems.addElement(runnable); 
     173                if(!invokeInProgress) { 
     174                    invokeInProgress = true; 
     175                    UiApplication.getUiApplication().invokeLater(invokeLaterRunnable); 
     176                } 
     177            } 
     178        } 
     179         
     180        private final Runnable invokeLaterRunnable = new Runnable() { 
     181        public void run() { 
     182            Vector currentInvokeItems; 
     183            synchronized(invokeLock) { 
     184                currentInvokeItems = invokeItems; 
     185                invokeItems = new Vector(); 
     186            } 
     187            int size = currentInvokeItems.size(); 
     188            for(int i=0; i<size; i++) { 
     189                Runnable runnable = (Runnable)currentInvokeItems.elementAt(i); 
     190                runnable.run(); 
     191            } 
     192            synchronized(invokeLock) { 
     193                invokeInProgress = false; 
     194            } 
     195        } 
     196        }; 
    155197} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/ui/CompositionScreen.java

    r701 r702  
    4848import net.rim.device.api.ui.MenuItem; 
    4949import net.rim.device.api.ui.Screen; 
    50 import net.rim.device.api.ui.UiApplication; 
    5150import net.rim.device.api.ui.component.AutoTextEditField; 
    5251import net.rim.device.api.ui.component.Dialog; 
     
    223222 
    224223            // Schedule the UI update 
    225             UiApplication.getUiApplication().invokeLater(new EventObjectRunnable(e) { 
     224            invokeLater(new EventObjectRunnable(e) { 
    226225                public void run() { 
    227226                    MessageNode messageNode = (MessageNode)getEvent().getSource(); 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/ui/MailHomeScreen.java

    r701 r702  
    408408    } 
    409409 
    410     public void populateMailTree(MailHomeTreeNode rootNode) { 
    411         synchronized(UiApplication.getEventLock()) { 
    412             // Clear any existing nodes 
    413             treeField.deleteAll(); 
    414             nodeIdMap.clear(); 
    415  
    416             // Freshly populate the tree 
    417             int firstNode = -1; 
    418             MailHomeTreeNode[] nodes = rootNode.children; 
    419             if(nodes != null) { 
    420                 for(int i = nodes.length - 1; i >= 0; --i) { 
    421                     int id = treeField.addChildNode(0, nodes[i]); 
    422                     nodeIdMap.put(nodes[i], id); 
    423                     if(i == 0) { firstNode = id; } 
    424                     populateMailTreeChildren(id, nodes[i]); 
    425                 } 
    426             } 
    427             if(firstNode != -1) { 
    428                 treeField.setCurrentNode(firstNode); 
    429             } 
    430         } 
     410    public void populateMailTree(final MailHomeTreeNode rootNode) { 
     411        UiApplication.getUiApplication().invokeAndWait(new Runnable() { 
     412            public void run() { 
     413                // Clear any existing nodes 
     414                treeField.deleteAll(); 
     415                nodeIdMap.clear(); 
     416 
     417                // Freshly populate the tree 
     418                int firstNode = -1; 
     419                MailHomeTreeNode[] nodes = rootNode.children; 
     420                if(nodes != null) { 
     421                    for(int i = nodes.length - 1; i >= 0; --i) { 
     422                        int id = treeField.addChildNode(0, nodes[i]); 
     423                        nodeIdMap.put(nodes[i], id); 
     424                        if(i == 0) { firstNode = id; } 
     425                        populateMailTreeChildren(id, nodes[i]); 
     426                    } 
     427                } 
     428                if(firstNode != -1) { 
     429                    treeField.setCurrentNode(firstNode); 
     430                } 
     431            } 
     432        }); 
    431433    } 
    432434 
     
    444446        final int nodeId = nodeIdMap.get(node); 
    445447        if(nodeId != -1) { 
    446             UiApplication.getUiApplication().invokeLater(new Runnable() { 
     448            invokeLater(new Runnable() { 
    447449                public void run() { 
    448450                    treeField.invalidateNode(nodeId); 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/ui/MailboxScreen.java

    r701 r702  
    4747import net.rim.device.api.ui.component.Menu; 
    4848import net.rim.device.api.ui.container.VerticalFieldManager; 
    49 import net.rim.device.api.ui.UiApplication; 
    5049import net.rim.device.api.util.Comparator; 
    5150import net.rim.device.api.util.DateTimeUtilities; 
     
    121120            if((e.getGlobalChange() & GlobalConfig.CHANGE_TYPE_OTHER) != 0) { 
    122121                if(globalConfig.getDispOrder() != displayOrder) { 
    123                     UiApplication.getUiApplication().invokeLater(new EventObjectRunnable(e) { 
     122                    invokeLater(new EventObjectRunnable(e) { 
    124123                        public void run() { 
    125124                            displayOrder = !displayOrder; 
     
    129128                } 
    130129                if(globalConfig.getHideDeletedMsg() != hideDeleted) { 
    131                     UiApplication.getUiApplication().invokeLater(new EventObjectRunnable(e) { 
     130                    invokeLater(new EventObjectRunnable(e) { 
    132131                        public void run() { 
    133132                            hideDeleted = !hideDeleted; 
     
    143142    private MailboxNodeListener mailboxNodeListener = new MailboxNodeListener() { 
    144143                public void mailboxStatusChanged(MailboxNodeEvent e) { 
    145                         UiApplication.getUiApplication().invokeLater(new EventObjectRunnable(e) { 
     144                        invokeLater(new EventObjectRunnable(e) { 
    146145                                public void run() { 
    147146                                        mailboxNode_MailboxStatusChanged((MailboxNodeEvent)getEvent()); 
     
    154153    private MessageNodeListener messageNodeListener = new MessageNodeListener() { 
    155154                public void messageStatusChanged(MessageNodeEvent e) { 
    156                         UiApplication.getUiApplication().invokeLater(new EventObjectRunnable(e) { 
     155                        invokeLater(new EventObjectRunnable(e) { 
    157156                                public void run() { 
    158157                                        messageNode_MessageStatusChanged((MessageNodeEvent)getEvent()); 
Note: See TracChangeset for help on using the changeset viewer.