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(int i = 0; i < Math.min(conversations.size(),MAX_TARGETS); ++i) {
48				final Conversation conversation = conversations.get(i);
49				final String name = conversation.getName().toString();
50				final Icon icon = Icon.createWithBitmap(mXmppConnectionService.getAvatarService().get(conversation, pixel));
51				final float score = 1 - (1.0f / MAX_TARGETS) * i;
52				final Bundle extras = new Bundle();
53				extras.putString("uuid", conversation.getUuid());
54				chooserTargets.add(new ChooserTarget(name, icon, score, componentName, extras));
55			}
56		} catch (InterruptedException e) {
57		}
58		unbindService(this);
59		return chooserTargets;
60	}
61
62	@Override
63	public void onServiceConnected(ComponentName name, IBinder service) {
64		XmppConnectionService.XmppConnectionBinder binder = (XmppConnectionService.XmppConnectionBinder) service;
65		mXmppConnectionService = binder.getService();
66		synchronized (this.lock) {
67			lock.notifyAll();
68		}
69	}
70
71	@Override
72	public void onServiceDisconnected(ComponentName name) {
73		mXmppConnectionService = null;
74	}
75
76	private void waitForService() throws InterruptedException {
77		if (mXmppConnectionService == null) {
78			synchronized (this.lock) {
79				lock.wait();
80			}
81		}
82	}
83}