pass a TpContact object to Source
This is based on a patch from Morten Mjelva.
This commit is contained in:
parent
69d3aad080
commit
e97c15e01e
@ -4,6 +4,7 @@ const DBus = imports.dbus;
|
|||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Tp = imports.gi.TelepathyGLib;
|
const Tp = imports.gi.TelepathyGLib;
|
||||||
@ -34,6 +35,10 @@ const NotificationDirection = {
|
|||||||
RECEIVED: 'chat-received'
|
RECEIVED: 'chat-received'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let contactFeatures = [Tp.ContactFeature.ALIAS,
|
||||||
|
Tp.ContactFeature.AVATAR_DATA,
|
||||||
|
Tp.ContactFeature.PRESENCE];
|
||||||
|
|
||||||
// This is GNOME Shell's implementation of the Telepathy 'Client'
|
// This is GNOME Shell's implementation of the Telepathy 'Client'
|
||||||
// interface. Specifically, the shell is a Telepathy 'Observer', which
|
// interface. Specifically, the shell is a Telepathy 'Observer', which
|
||||||
// lets us see messages even if they belong to another app (eg,
|
// lets us see messages even if they belong to another app (eg,
|
||||||
@ -97,6 +102,25 @@ Client.prototype = {
|
|||||||
delete this._sources[connPath + ':' + targetHandle];
|
delete this._sources[connPath + ':' + targetHandle];
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
/* Request a TpContact */
|
||||||
|
Shell.get_tp_contacts(conn, 1, [targetHandle],
|
||||||
|
contactFeatures.length, contactFeatures,
|
||||||
|
Lang.bind(this, function (connection, contacts, failed) {
|
||||||
|
if (contacts.length < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* We got the TpContact */
|
||||||
|
if (this._sources[connPath + ':' + targetHandle])
|
||||||
|
return;
|
||||||
|
|
||||||
|
let source = new Source(account, conn, chan, contacts[0]);
|
||||||
|
|
||||||
|
this._sources[connPath + ':' + targetHandle] = source;
|
||||||
|
source.connect('destroy', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
delete this._sources[connPath + ':' + targetHandle];
|
||||||
|
}));
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow dbus method to return
|
// Allow dbus method to return
|
||||||
@ -372,38 +396,26 @@ ContactManager.prototype = {
|
|||||||
Signals.addSignalMethods(ContactManager.prototype);
|
Signals.addSignalMethods(ContactManager.prototype);
|
||||||
|
|
||||||
|
|
||||||
function Source(account, conn, channel) {
|
function Source(account, conn, channel, contact) {
|
||||||
this._init(account, conn, channel);
|
this._init(account, conn, channel, contact);
|
||||||
}
|
}
|
||||||
|
|
||||||
Source.prototype = {
|
Source.prototype = {
|
||||||
__proto__: MessageTray.Source.prototype,
|
__proto__: MessageTray.Source.prototype,
|
||||||
|
|
||||||
_init: function(account, conn, channel) {
|
_init: function(account, conn, channel, contact) {
|
||||||
// FIXME: use chan.get_handle()
|
MessageTray.Source.prototype._init.call(this, channel.get_identifier());
|
||||||
let props = channel.borrow_immutable_properties();
|
|
||||||
this._targetHandle = props[Tp.PROP_CHANNEL_TARGET_HANDLE];
|
|
||||||
this._targetHandleType = props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE];
|
|
||||||
this._targetId = channel.get_identifier();
|
|
||||||
|
|
||||||
MessageTray.Source.prototype._init.call(this, this._targetId);
|
|
||||||
|
|
||||||
this.isChat = true;
|
this.isChat = true;
|
||||||
|
|
||||||
this._account = account;
|
this._account = account;
|
||||||
|
this._contact = contact;
|
||||||
|
|
||||||
this._conn = conn;
|
this._conn = conn;
|
||||||
this._channel = channel;
|
this._channel = channel;
|
||||||
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
|
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
|
||||||
|
|
||||||
if (this._targetHandleType == Tp.HandleType.CONTACT) {
|
this._updateAlias();
|
||||||
let aliasing = new Telepathy.ConnectionAliasing(DBus.session, conn.get_bus_name(), conn.get_object_path());
|
|
||||||
aliasing.RequestAliasesRemote([this._targetHandle], Lang.bind(this,
|
|
||||||
function (aliases, err) {
|
|
||||||
if (aliases && aliases.length)
|
|
||||||
this.title = aliases[0];
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._notification = new Notification(this);
|
this._notification = new Notification(this);
|
||||||
this._notification.setUrgency(MessageTray.Urgency.HIGH);
|
this._notification.setUrgency(MessageTray.Urgency.HIGH);
|
||||||
@ -419,6 +431,12 @@ Source.prototype = {
|
|||||||
this._channelText.ListPendingMessagesRemote(false, Lang.bind(this, this._gotPendingMessages));
|
this._channelText.ListPendingMessagesRemote(false, Lang.bind(this, this._gotPendingMessages));
|
||||||
|
|
||||||
this._setSummaryIcon(this.createNotificationIcon());
|
this._setSummaryIcon(this.createNotificationIcon());
|
||||||
|
|
||||||
|
this._notifyAliasId = this._contact.connect('notify::alias', Lang.bind(this, this._updateAlias));
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateAlias: function() {
|
||||||
|
this.title = this._contact.get_alias();
|
||||||
},
|
},
|
||||||
|
|
||||||
createNotificationIcon: function() {
|
createNotificationIcon: function() {
|
||||||
@ -448,6 +466,8 @@ Source.prototype = {
|
|||||||
this._channel.disconnect(this._closedId);
|
this._channel.disconnect(this._closedId);
|
||||||
this._channelText.disconnect(this._receivedId);
|
this._channelText.disconnect(this._receivedId);
|
||||||
this._channelText.disconnect(this._sentId);
|
this._channelText.disconnect(this._sentId);
|
||||||
|
|
||||||
|
this._contact.disconnect(this._notifyAliasId);
|
||||||
this.destroy();
|
this.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user