diff options
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(); + } + } |