1package eu.siacs.conversations.services;
2
3import android.Manifest;
4import android.content.Context;
5import android.content.Intent;
6import android.content.pm.PackageManager;
7
8import com.google.common.collect.Iterables;
9
10import eu.siacs.conversations.BuildConfig;
11
12import java.util.Arrays;
13
14public abstract class AbstractQuickConversationsService {
15
16 public static final String SMS_RETRIEVED_ACTION =
17 "com.google.android.gms.auth.api.phone.SMS_RETRIEVED";
18
19 private static Boolean declaredReadContacts = null;
20
21 protected final XmppConnectionService service;
22
23 public AbstractQuickConversationsService(XmppConnectionService service) {
24 this.service = service;
25 }
26
27 public abstract void considerSync();
28
29 public static boolean isQuicksy() {
30 return "quicksy".equals(BuildConfig.FLAVOR_mode);
31 }
32
33 public static boolean isConversations() {
34 return "conversations".equals(BuildConfig.FLAVOR_mode);
35 }
36
37 public static boolean isPlayStoreFlavor() {
38 return "playstore".equals(BuildConfig.FLAVOR_distribution);
39 }
40
41 public static boolean isContactListIntegration(final Context context) {
42 if ("quicksy".equals(BuildConfig.FLAVOR_mode)) {
43 return true;
44 }
45 final var readContacts = AbstractQuickConversationsService.declaredReadContacts;
46 if (readContacts != null) {
47 return Boolean.TRUE.equals(readContacts);
48 }
49 AbstractQuickConversationsService.declaredReadContacts = hasDeclaredReadContacts(context);
50 return AbstractQuickConversationsService.declaredReadContacts;
51 }
52
53 private static boolean hasDeclaredReadContacts(final Context context) {
54 final String[] permissions;
55 try {
56 permissions =
57 context.getPackageManager()
58 .getPackageInfo(
59 context.getPackageName(), PackageManager.GET_PERMISSIONS)
60 .requestedPermissions;
61 } catch (final PackageManager.NameNotFoundException e) {
62 return false;
63 }
64 return Iterables.any(
65 Arrays.asList(permissions), p -> p.equals(Manifest.permission.READ_CONTACTS));
66 }
67
68 public static boolean isQuicksyPlayStore() {
69 return isQuicksy() && isPlayStoreFlavor();
70 }
71
72 public abstract void signalAccountStateChange();
73
74 public abstract boolean isSynchronizing();
75
76 public abstract void considerSyncBackground(boolean force);
77
78 public abstract void handleSmsReceived(Intent intent);
79}