diff --git a/js/background.js b/js/background.js index c0bd1173..08beed05 100644 --- a/js/background.js +++ b/js/background.js @@ -123,22 +123,26 @@ name: contactDetails.name, id: contactDetails.number, avatar: contactDetails.avatar, - type: 'private' + type: 'private', + active_at: Date.now() }).save(); } function onGroupReceived(ev) { var groupDetails = ev.groupDetails; - var conversation = ConversationController.create({ + var attributes = { id: groupDetails.id, name: groupDetails.name, members: groupDetails.members, avatar: groupDetails.avatar, type: 'group', - }); - if (!groupDetails.active) { - conversation.set({left: true}); + }; + if (groupDetails.active) { + attributes.active_at = Date.now(); + } else { + attributes.left = true; } + var conversation = ConversationController.create(attributes); conversation.save(); } diff --git a/js/conversation_controller.js b/js/conversation_controller.js index 71be1ceb..510d9e5c 100644 --- a/js/conversation_controller.js +++ b/js/conversation_controller.js @@ -17,8 +17,29 @@ this.listenTo(conversations, 'add change:active_at', this.addActive); }, - comparator: function(model) { - return -model.get('timestamp'); + 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')) { diff --git a/js/database.js b/js/database.js index 5833b608..29e8a053 100644 --- a/js/database.js +++ b/js/database.js @@ -144,6 +144,41 @@ conversations.createIndex('unread', ['conversationId', 'unread'], { unique: false }); next(); } + }, + { + version: "9.0", + migrate: function(transaction, next) { + console.log('migration 9.0'); + window.addEventListener('storage_ready', function() { + console.log('marking contacts and groups active'); + var all = new Whisper.ConversationCollection(); + var myNumber = textsecure.storage.user.getNumber(); + all.fetch().then(function() { + var inactive = all.filter(function(model) { + return !model.get('active_at') && model.id !== myNumber; + }); + inactive.sort(function(m1, m2) { + 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; + } + }); + inactive.forEach(function(model) { + if (model.isPrivate() || !model.get('left')) { + model.save({ active_at: 1 }); + } + }); + }); + }); + next(); + } } ]; }()); diff --git a/js/views/conversation_list_view.js b/js/views/conversation_list_view.js index 1692cf0c..e594f152 100644 --- a/js/views/conversation_list_view.js +++ b/js/views/conversation_list_view.js @@ -14,7 +14,8 @@ if (conversation.get('active_at')) { $el.prependTo(this.el); } else { - $el.remove(); + var index = getInboxCollection().indexOf(conversation); + $el.insertBefore(this.$('.conversation-list-item')[index+1]); } } } diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index 4883d982..b4e81b10 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -95,16 +95,6 @@ this.listenTo(this.searchView, 'open', this.openConversation.bind(this, null)); - if (inboxCollection.length === 0) { - this.searchView.showAllContacts = true; - this.searchView.reset(); - this.listenToOnce(inboxCollection, 'add', function(model) { - this.searchView.showAllContacts = false; - this.searchView.reset(); - model.trigger('opened'); - }.bind(this)); - } - new SocketView().render().$el.appendTo(this.$('.socket-status')); extension.windows.onClosed(function() {