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}