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}