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}