Device.java

 1package eu.siacs.conversations.android;
 2
 3import android.app.KeyguardManager;
 4import android.app.NotificationManager;
 5import android.content.Context;
 6import android.media.AudioManager;
 7import android.os.Build;
 8import android.os.PowerManager;
 9import android.util.Log;
10import eu.siacs.conversations.Config;
11
12public class Device {
13
14    private final Context context;
15
16    public Device(final Context context) {
17        this.context = context;
18    }
19
20    public boolean isScreenLocked() {
21        final var keyguardManager = context.getSystemService(KeyguardManager.class);
22        final var powerManager = context.getSystemService(PowerManager.class);
23        final var locked = keyguardManager != null && keyguardManager.isKeyguardLocked();
24        final boolean interactive;
25        try {
26            interactive = powerManager != null && powerManager.isInteractive();
27        } catch (final Exception e) {
28            return false;
29        }
30        return locked || !interactive;
31    }
32
33    public boolean isPhoneSilenced(final boolean vibrateIsSilent) {
34        final var notificationManager = context.getSystemService(NotificationManager.class);
35        final int filter =
36                notificationManager == null
37                        ? NotificationManager.INTERRUPTION_FILTER_UNKNOWN
38                        : notificationManager.getCurrentInterruptionFilter();
39        final boolean notificationDnd = filter >= NotificationManager.INTERRUPTION_FILTER_PRIORITY;
40        final var audioManager = context.getSystemService(AudioManager.class);
41        final int ringerMode =
42                audioManager == null
43                        ? AudioManager.RINGER_MODE_NORMAL
44                        : audioManager.getRingerMode();
45        try {
46            if (vibrateIsSilent) {
47                return notificationDnd || ringerMode != AudioManager.RINGER_MODE_NORMAL;
48            } else {
49                return notificationDnd || ringerMode == AudioManager.RINGER_MODE_SILENT;
50            }
51        } catch (final Throwable throwable) {
52            Log.d(Config.LOGTAG, "platform bug in isPhoneSilenced", throwable);
53            return notificationDnd;
54        }
55    }
56
57    public boolean isPhysicalDevice() {
58        return !isEmulator();
59    }
60
61    private static boolean isEmulator() {
62        return (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
63                || Build.FINGERPRINT.startsWith("generic")
64                || Build.FINGERPRINT.startsWith("unknown")
65                || Build.HARDWARE.contains("goldfish")
66                || Build.HARDWARE.contains("ranchu")
67                || Build.MODEL.contains("google_sdk")
68                || Build.MODEL.contains("Emulator")
69                || Build.MODEL.contains("Android SDK built for x86")
70                || Build.MANUFACTURER.contains("Genymotion")
71                || Build.PRODUCT.contains("sdk_google")
72                || Build.PRODUCT.contains("google_sdk")
73                || Build.PRODUCT.contains("sdk")
74                || Build.PRODUCT.contains("sdk_x86")
75                || Build.PRODUCT.contains("sdk_gphone64_arm64")
76                || Build.PRODUCT.contains("vbox86p")
77                || Build.PRODUCT.contains("emulator")
78                || Build.PRODUCT.contains("simulator");
79    }
80}