summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--EmergencyGestureAction/AndroidManifest.xml6
-rw-r--r--EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionActivity.java6
-rw-r--r--EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionFragment.java3
-rw-r--r--EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionUtils.java10
-rw-r--r--EmergencyGestureAction/src/com/android/emergency/action/sensoryfeedback/EmergencyActionAlarmHelper.java4
-rw-r--r--EmergencyGestureAction/src/com/android/emergency/action/service/EmergencyActionForegroundService.java11
-rw-r--r--EmergencyGestureContentProvider/src/com/android/emergency/EmergencyGestureContentProvider.java33
-rw-r--r--src/com/android/emergency/preferences/EmergencyContactsPreference.java23
8 files changed, 81 insertions, 15 deletions
diff --git a/EmergencyGestureAction/AndroidManifest.xml b/EmergencyGestureAction/AndroidManifest.xml
index 0427a0cf..87b8a289 100644
--- a/EmergencyGestureAction/AndroidManifest.xml
+++ b/EmergencyGestureAction/AndroidManifest.xml
@@ -21,6 +21,7 @@
package="com.android.emergency">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
@@ -60,7 +61,10 @@
<service
android:name=".action.service.EmergencyActionForegroundService"
android:directBootAware="true"
- android:exported="false"/>
+ android:foregroundServiceType="specialUse"
+ android:exported="false">
+ <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="com.android.emergency" />
+ </service>
<receiver
android:name=".action.broadcast.EmergencyActionBroadcastReceiver"
diff --git a/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionActivity.java b/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionActivity.java
index 63c1fd1b..34a31b10 100644
--- a/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionActivity.java
+++ b/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionActivity.java
@@ -17,6 +17,7 @@
package com.android.emergency.action;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_SETTING_ON;
+import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_SETTING_OFF;
import android.annotation.Nullable;
import android.os.Bundle;
@@ -26,6 +27,7 @@ import android.util.Log;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
+import com.android.emergency.action.EmergencyActionUtils;
import com.android.emergency.R;
/**
@@ -40,7 +42,9 @@ public class EmergencyActionActivity extends FragmentActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.emergency_action_activity);
if (Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.EMERGENCY_GESTURE_ENABLED, EMERGENCY_SETTING_ON)
+ Settings.Secure.EMERGENCY_GESTURE_ENABLED,
+ EmergencyActionUtils.isDefaultEmergencyGestureEnabled(this) ?
+ EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF)
!= EMERGENCY_SETTING_ON) {
Log.w(TAG, "Emergency gesture is not enabled, exiting");
finish();
diff --git a/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionFragment.java b/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionFragment.java
index a5c53b97..c191ab26 100644
--- a/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionFragment.java
+++ b/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionFragment.java
@@ -23,7 +23,6 @@ import android.content.res.Configuration;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v4.app.Fragment;
-import android.telecom.TelecomManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
@@ -51,7 +50,6 @@ public class EmergencyActionFragment extends Fragment implements OnSlideComplete
private static final String STATE_MILLIS_LEFT = "STATE_MILLIS_LEFT";
private EmergencyActionAlarmHelper mEmergencyActionAlarmHelper;
- private TelecomManager mTelecomManager;
private CountDownTimer mCountDownTimer;
private EmergencyNumberUtils mEmergencyNumberUtils;
private long mCountDownMillisLeft;
@@ -65,7 +63,6 @@ public class EmergencyActionFragment extends Fragment implements OnSlideComplete
EmergencyActionForegroundService.stopService(context);
mEmergencyActionAlarmHelper = new EmergencyActionAlarmHelper(context);
mEmergencyNumberUtils = new EmergencyNumberUtils(context);
- mTelecomManager = context.getSystemService(TelecomManager.class);
}
@Override
diff --git a/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionUtils.java b/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionUtils.java
index 347bbcad..88ddcb16 100644
--- a/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionUtils.java
+++ b/EmergencyGestureAction/src/com/android/emergency/action/EmergencyActionUtils.java
@@ -39,4 +39,14 @@ public class EmergencyActionUtils {
context.getContentResolver().call(EMERGENCY_ACTION_AUTHORITY,
ACTION_START_EMERGENCY_CALL, null, null);
}
+
+ public static boolean isDefaultEmergencyGestureEnabled(Context context) {
+ return context.getResources().getBoolean(
+ com.android.internal.R.bool.config_defaultEmergencyGestureEnabled);
+ }
+
+ public static boolean isDefaultEmergencyGestureSoundEnabled(Context context) {
+ return context.getResources().getBoolean(
+ com.android.internal.R.bool.config_defaultEmergencyGestureSoundEnabled);
+ }
}
diff --git a/EmergencyGestureAction/src/com/android/emergency/action/sensoryfeedback/EmergencyActionAlarmHelper.java b/EmergencyGestureAction/src/com/android/emergency/action/sensoryfeedback/EmergencyActionAlarmHelper.java
index b2d6ff61..64043262 100644
--- a/EmergencyGestureAction/src/com/android/emergency/action/sensoryfeedback/EmergencyActionAlarmHelper.java
+++ b/EmergencyGestureAction/src/com/android/emergency/action/sensoryfeedback/EmergencyActionAlarmHelper.java
@@ -23,6 +23,7 @@ import android.media.MediaPlayer;
import android.provider.Settings;
import android.util.Log;
+import com.android.emergency.action.EmergencyActionUtils;
import com.android.emergency.R;
@@ -115,6 +116,7 @@ public class EmergencyActionAlarmHelper {
private boolean isPlayWarningSoundEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.EMERGENCY_GESTURE_SOUND_ENABLED, 0) != 0;
+ Settings.Secure.EMERGENCY_GESTURE_SOUND_ENABLED,
+ EmergencyActionUtils.isDefaultEmergencyGestureSoundEnabled(mContext) ? 1 : 0) != 0;
}
}
diff --git a/EmergencyGestureAction/src/com/android/emergency/action/service/EmergencyActionForegroundService.java b/EmergencyGestureAction/src/com/android/emergency/action/service/EmergencyActionForegroundService.java
index ee49528e..274d324d 100644
--- a/EmergencyGestureAction/src/com/android/emergency/action/service/EmergencyActionForegroundService.java
+++ b/EmergencyGestureAction/src/com/android/emergency/action/service/EmergencyActionForegroundService.java
@@ -16,6 +16,7 @@
package com.android.emergency.action.service;
+import static android.app.Notification.FOREGROUND_SERVICE_IMMEDIATE;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import android.app.AlarmManager;
@@ -93,7 +94,8 @@ public class EmergencyActionForegroundService extends Service {
return START_NOT_STICKY;
}
mNotificationManager.createNotificationChannel(buildNotificationChannel(this));
- Notification notification = intent.getParcelableExtra(SERVICE_EXTRA_NOTIFICATION);
+ Notification notification = intent.getParcelableExtra(SERVICE_EXTRA_NOTIFICATION,
+ Notification.class);
// Immediately show notification And now put the service in foreground mode
startForeground(COUNT_DOWN_NOTIFICATION_ID, notification);
@@ -136,6 +138,11 @@ public class EmergencyActionForegroundService extends Service {
/** End all work in this service and remove the foreground notification. */
public static void stopService(Context context) {
+ // Cancel previously scheduled eCall broadcast
+ AlarmManager alarmManager = context.getSystemService(AlarmManager.class);
+ alarmManager.cancel(
+ EmergencyActionBroadcastReceiver.newCallEmergencyPendingIntent(context));
+ // Stop service
context.stopService(new Intent(context, EmergencyActionForegroundService.class));
}
@@ -154,7 +161,6 @@ public class EmergencyActionForegroundService extends Service {
NotificationChannel channel = buildNotificationChannel(context);
EmergencyNumberUtils emergencyNumberUtils = new EmergencyNumberUtils(context);
long targetTimeMs = SystemClock.elapsedRealtime() + remainingTimeMs;
- // TODO(b/172075832): Make UI prettier
RemoteViews contentView =
new RemoteViews(context.getPackageName(),
R.layout.emergency_action_count_down_notification);
@@ -178,6 +184,7 @@ public class EmergencyActionForegroundService extends Service {
.setOnlyAlertOnce(true)
.setCategory(Notification.CATEGORY_ALARM)
.setCustomContentView(contentView)
+ .setForegroundServiceBehavior(FOREGROUND_SERVICE_IMMEDIATE)
.addAction(new Notification.Action.Builder(null, context.getText(R.string.cancel),
EmergencyActionBroadcastReceiver.newCancelCountdownPendingIntent(
context)).build())
diff --git a/EmergencyGestureContentProvider/src/com/android/emergency/EmergencyGestureContentProvider.java b/EmergencyGestureContentProvider/src/com/android/emergency/EmergencyGestureContentProvider.java
index 2f9ab80c..c3a13dd1 100644
--- a/EmergencyGestureContentProvider/src/com/android/emergency/EmergencyGestureContentProvider.java
+++ b/EmergencyGestureContentProvider/src/com/android/emergency/EmergencyGestureContentProvider.java
@@ -18,6 +18,7 @@ package com.android.emergency;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_GESTURE_CALL_NUMBER;
+import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_GESTURE_UI_SHOWING_VALUE;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_NUMBER_OVERRIDE_AUTHORITY;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_SETTING_OFF;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_SETTING_ON;
@@ -26,6 +27,7 @@ import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHO
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_GET_EMERGENCY_GESTURE_SOUND_ENABLED;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_GET_EMERGENCY_NUMBER_OVERRIDE;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_SET_EMERGENCY_GESTURE;
+import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_SET_EMERGENCY_GESTURE_UI_SHOWING;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_SET_EMERGENCY_NUMBER_OVERRIDE;
import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_SET_EMERGENCY_SOUND;
@@ -37,6 +39,7 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
+import android.os.SystemClock;
import android.provider.Settings;
import android.util.Log;
@@ -80,6 +83,20 @@ public class EmergencyGestureContentProvider extends ContentProvider {
Settings.Secure.putInt(getContext().getContentResolver(),
Settings.Secure.EMERGENCY_GESTURE_ENABLED, gestureSettingValue);
break;
+ case METHOD_NAME_SET_EMERGENCY_GESTURE_UI_SHOWING:
+ if (DEBUG) {
+ Log.d(TAG, METHOD_NAME_SET_EMERGENCY_GESTURE_UI_SHOWING);
+ }
+ long now = SystemClock.elapsedRealtime();
+ final int gestureUiShowingValue = extras.getInt(
+ EMERGENCY_GESTURE_UI_SHOWING_VALUE);
+ Settings.Secure.putInt(getContext().getContentResolver(),
+ Settings.Secure.EMERGENCY_GESTURE_UI_SHOWING, gestureUiShowingValue);
+ if (gestureUiShowingValue != 0) {
+ Settings.Secure.putLong(getContext().getContentResolver(),
+ Settings.Secure.EMERGENCY_GESTURE_UI_LAST_STARTED_MILLIS, now);
+ }
+ break;
case METHOD_NAME_SET_EMERGENCY_SOUND:
if (DEBUG) {
Log.d(TAG, METHOD_NAME_SET_EMERGENCY_SOUND);
@@ -95,7 +112,8 @@ public class EmergencyGestureContentProvider extends ContentProvider {
bundle.putInt(EMERGENCY_SETTING_VALUE,
Settings.Secure.getInt(getContext().getContentResolver(),
Settings.Secure.EMERGENCY_GESTURE_ENABLED,
- EMERGENCY_SETTING_ON));
+ isDefaultEmergencyGestureEnabled(getContext()) ?
+ EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF));
break;
case METHOD_NAME_GET_EMERGENCY_GESTURE_SOUND_ENABLED:
if (DEBUG) {
@@ -104,7 +122,8 @@ public class EmergencyGestureContentProvider extends ContentProvider {
bundle.putInt(EMERGENCY_SETTING_VALUE,
Settings.Secure.getInt(getContext().getContentResolver(),
Settings.Secure.EMERGENCY_GESTURE_SOUND_ENABLED,
- EMERGENCY_SETTING_OFF));
+ isDefaultEmergencyGestureSoundEnabled(getContext()) ?
+ EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF));
break;
}
return bundle;
@@ -140,4 +159,14 @@ public class EmergencyGestureContentProvider extends ContentProvider {
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
+
+ private boolean isDefaultEmergencyGestureEnabled(Context context) {
+ return context.getResources().getBoolean(
+ com.android.internal.R.bool.config_defaultEmergencyGestureEnabled);
+ }
+
+ private boolean isDefaultEmergencyGestureSoundEnabled(Context context) {
+ return context.getResources().getBoolean(
+ com.android.internal.R.bool.config_defaultEmergencyGestureSoundEnabled);
+ }
}
diff --git a/src/com/android/emergency/preferences/EmergencyContactsPreference.java b/src/com/android/emergency/preferences/EmergencyContactsPreference.java
index 4756c36c..b3b66311 100644
--- a/src/com/android/emergency/preferences/EmergencyContactsPreference.java
+++ b/src/com/android/emergency/preferences/EmergencyContactsPreference.java
@@ -20,6 +20,7 @@ import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.net.Uri;
import androidx.annotation.NonNull;
+import android.os.UserManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
@@ -280,7 +281,10 @@ public class EmergencyContactsPreference extends PreferenceCategory
@VisibleForTesting
void persistEmergencyContacts(List<Uri> emergencyContacts) {
- persistString(serialize(emergencyContacts));
+ // Avoid persisting emergency contacts in direct boot mode.
+ if (isUserUnlocked(getContext())) {
+ persistString(serialize(emergencyContacts));
+ }
}
private static List<Uri> deserializeAndFilter(String key, Context context,
@@ -299,11 +303,20 @@ public class EmergencyContactsPreference extends PreferenceCategory
// in shared preferences. This deals with emergency contacts being deleted from contacts:
// currently we have no way to being notified when this happens.
if (filteredEmergencyContacts.size() != emergencyContactsArray.length) {
- String emergencyContactStrings = serialize(filteredEmergencyContacts);
- SharedPreferences sharedPreferences =
- PreferenceManager.getDefaultSharedPreferences(context);
- sharedPreferences.edit().putString(key, emergencyContactStrings).commit();
+ // Avoid updating emergency contacts in direct boot mode.
+ if (isUserUnlocked(context)) {
+ String emergencyContactStrings = serialize(filteredEmergencyContacts);
+ SharedPreferences sharedPreferences =
+ PreferenceManager.getDefaultSharedPreferences(context);
+ sharedPreferences.edit().putString(key, emergencyContactStrings).commit();
+ }
}
return filteredEmergencyContacts;
}
+
+ private static boolean isUserUnlocked(Context context) {
+ UserManager userManager = context.getSystemService(UserManager.class);
+ return userManager != null && userManager.isUserUnlocked();
+ }
+
}