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