ContactChooserTargetService.java

 1package eu.siacs.conversations.services;
 2
 3import android.annotation.TargetApi;
 4import android.content.ComponentName;
 5import android.content.Context;
 6import android.content.Intent;
 7import android.content.IntentFilter;
 8import android.content.ServiceConnection;
 9import android.graphics.drawable.Icon;
10import android.os.Build;
11import android.os.Bundle;
12import android.os.IBinder;
13import android.service.chooser.ChooserTarget;
14import android.service.chooser.ChooserTargetService;
15import android.support.v4.content.ContextCompat;
16
17import java.util.ArrayList;
18import java.util.List;
19
20import eu.siacs.conversations.entities.Conversation;
21import eu.siacs.conversations.ui.ConversationsActivity;
22import eu.siacs.conversations.ui.ShareWithActivity;
23
24@TargetApi(Build.VERSION_CODES.M)
25public class ContactChooserTargetService extends ChooserTargetService implements ServiceConnection {
26
27	private final Object lock = new Object();
28
29	private XmppConnectionService mXmppConnectionService;
30
31	private final int MAX_TARGETS = 5;
32
33	@Override
34	public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
35		Intent intent = new Intent(this, XmppConnectionService.class);
36		intent.setAction("contact_chooser");
37		bindService(intent, this, Context.BIND_AUTO_CREATE);
38		ArrayList<ChooserTarget> chooserTargets = new ArrayList<>();
39		try {
40			waitForService();
41			final ArrayList<Conversation> conversations = new ArrayList<>();
42			if (!mXmppConnectionService.areMessagesInitialized()) {
43				return chooserTargets;
44			}
45			mXmppConnectionService.populateWithOrderedConversations(conversations, false);
46			final ComponentName componentName = new ComponentName(this, ConversationsActivity.class);
47			final int pixel = AvatarService.getSystemUiAvatarSize(this);
48			for(Conversation conversation : conversations) {
49				if (conversation.sentMessagesCount() == 0) {
50					continue;
51				}
52				final String name = conversation.getName().toString();
53				final Icon icon = Icon.createWithBitmap(mXmppConnectionService.getAvatarService().get(conversation, pixel));
54				final float score = 1 - (1.0f / MAX_TARGETS) * chooserTargets.size();
55				final Bundle extras = new Bundle();
56				extras.putString(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid());
57				chooserTargets.add(new ChooserTarget(name, icon, score, componentName, extras));
58				if (chooserTargets.size() >= MAX_TARGETS) {
59					break;
60				}
61			}
62		} catch (InterruptedException e) {
63		}
64		unbindService(this);
65		return chooserTargets;
66	}
67
68	@Override
69	public void onServiceConnected(ComponentName name, IBinder service) {
70		XmppConnectionService.XmppConnectionBinder binder = (XmppConnectionService.XmppConnectionBinder) service;
71		mXmppConnectionService = binder.getService();
72		synchronized (this.lock) {
73			lock.notifyAll();
74		}
75	}
76
77	@Override
78	public void onServiceDisconnected(ComponentName name) {
79		mXmppConnectionService = null;
80	}
81
82	private void waitForService() throws InterruptedException {
83		if (mXmppConnectionService == null) {
84			synchronized (this.lock) {
85				lock.wait();
86			}
87		}
88	}
89}