|  |  |  | /*global $, Whisper, Backbone, textsecure, extension*/ | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * vim: ts=4:sw=4:expandtab | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This script should only be included in background.html
 | 
					
						
							|  |  |  | (function () { | 
					
						
							|  |  |  |     'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     window.Whisper = window.Whisper || {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var conversations = new Whisper.ConversationCollection(); | 
					
						
							|  |  |  |     var inboxCollection = new (Backbone.Collection.extend({ | 
					
						
							|  |  |  |         initialize: function() { | 
					
						
							|  |  |  |             this.on('change:timestamp change:name change:number', this.sort); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             this.listenTo(conversations, 'add change:active_at', this.addActive); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             this.on('add remove change:unreadCount', | 
					
						
							|  |  |  |                 _.debounce(this.updateUnreadCount.bind(this), 1000) | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         comparator: function(m1, m2) { | 
					
						
							|  |  |  |             var timestamp1 = m1.get('timestamp'); | 
					
						
							|  |  |  |             var timestamp2 = m2.get('timestamp'); | 
					
						
							|  |  |  |             if (timestamp1 && timestamp2) { | 
					
						
							|  |  |  |                 return timestamp2 - timestamp1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (timestamp1) { | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (timestamp2) { | 
					
						
							|  |  |  |                 return 1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             var title1 = m1.getTitle().toLowerCase(); | 
					
						
							|  |  |  |             var title2 = m2.getTitle().toLowerCase(); | 
					
						
							|  |  |  |             if (title1 ===  title2) { | 
					
						
							|  |  |  |                 return 0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (title1 < title2) { | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (title1 > title2) { | 
					
						
							|  |  |  |                 return 1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         addActive: function(model) { | 
					
						
							|  |  |  |             if (model.get('active_at')) { | 
					
						
							|  |  |  |                 this.add(model); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 this.remove(model); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         updateUnreadCount: function() { | 
					
						
							|  |  |  |             var newUnreadCount = _.reduce( | 
					
						
							|  |  |  |                 this.map(function(m) { return m.get('unreadCount'); }), | 
					
						
							|  |  |  |                 function(item, memo) { | 
					
						
							|  |  |  |                     return item + memo; | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 0 | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             storage.put("unreadCount", newUnreadCount); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             setUnreadCount(newUnreadCount); | 
					
						
							|  |  |  |             if (newUnreadCount === 0) { | 
					
						
							|  |  |  |                 window.clearAttention(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }))(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     window.getInboxCollection = function() { | 
					
						
							|  |  |  |         return inboxCollection; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     window.ConversationController = { | 
					
						
							|  |  |  |         get: function(id) { | 
					
						
							|  |  |  |             return conversations.get(id); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         add: function(attrs) { | 
					
						
							|  |  |  |             return conversations.add(attrs, {merge: true}); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         create: function(attrs) { | 
					
						
							|  |  |  |             if (typeof attrs !== 'object') { | 
					
						
							|  |  |  |                 throw new Error('ConversationController.create requires an object, got', attrs); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             var conversation = conversations.add(attrs, {merge: true}); | 
					
						
							|  |  |  |             return conversation; | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         findOrCreatePrivateById: function(id) { | 
					
						
							|  |  |  |             var conversation = conversations.add({ id: id, type: 'private' }); | 
					
						
							|  |  |  |             return new Promise(function(resolve, reject) { | 
					
						
							|  |  |  |                 conversation.fetch().then(function() { | 
					
						
							|  |  |  |                     resolve(conversation); | 
					
						
							|  |  |  |                 }).fail(function() { | 
					
						
							|  |  |  |                     var saved = conversation.save(); // false or indexedDBRequest
 | 
					
						
							|  |  |  |                     if (saved) { | 
					
						
							|  |  |  |                         saved.then(function() { | 
					
						
							|  |  |  |                             resolve(conversation); | 
					
						
							|  |  |  |                         }).fail(reject); | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         reject(); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         updateInbox: function() { | 
					
						
							|  |  |  |             return conversations.fetchActive(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | })(); |