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.ShareWithActivity;
22
23@TargetApi(Build.VERSION_CODES.M)
24public class ContactChooserTargetService extends ChooserTargetService implements ServiceConnection {
25
26 private final Object lock = new Object();
27
28 private XmppConnectionService mXmppConnectionService;
29
30 private final int MAX_TARGETS = 5;
31
32 @Override
33 public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
34 Intent intent = new Intent(this, XmppConnectionService.class);
35 intent.setAction("contact_chooser");
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}