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}