/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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; import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_SETTING_VALUE; import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.METHOD_NAME_GET_EMERGENCY_GESTURE_ENABLED; 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; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; 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; /** * Content provider that gets/sets emergency number override for emergency gesture. */ public class EmergencyGestureContentProvider extends ContentProvider { private static final String TAG = "EmergencyNumberContentP"; private static final boolean DEBUG = true; private static final String SHARED_PREFERENCES_NAME = "local_emergency_number_override_shared_pref"; @Override public Bundle call(String authority, String method, String arg, Bundle extras) { Log.d(TAG, "calling pid/uid" + Binder.getCallingPid() + "/" + Binder.getCallingUid()); final Bundle bundle = new Bundle(); final SharedPreferences preferences = getContext().getSharedPreferences( SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); switch (method) { case METHOD_NAME_GET_EMERGENCY_NUMBER_OVERRIDE: if (DEBUG) { Log.d(TAG, METHOD_NAME_GET_EMERGENCY_NUMBER_OVERRIDE); } bundle.putString(EMERGENCY_GESTURE_CALL_NUMBER, preferences.getString(EMERGENCY_GESTURE_CALL_NUMBER, null)); break; case METHOD_NAME_SET_EMERGENCY_NUMBER_OVERRIDE: if (DEBUG) { Log.d(TAG, METHOD_NAME_SET_EMERGENCY_NUMBER_OVERRIDE); } final String inputNumber = extras.getString(EMERGENCY_GESTURE_CALL_NUMBER); preferences.edit().putString(EMERGENCY_GESTURE_CALL_NUMBER, inputNumber).apply(); getContext().getContentResolver().notifyChange(EMERGENCY_NUMBER_OVERRIDE_AUTHORITY, null); break; case METHOD_NAME_SET_EMERGENCY_GESTURE: if (DEBUG) { Log.d(TAG, METHOD_NAME_SET_EMERGENCY_GESTURE); } final int gestureSettingValue = extras.getInt(EMERGENCY_SETTING_VALUE); 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); } final int soundSettingValue = extras.getInt(EMERGENCY_SETTING_VALUE); Settings.Secure.putInt(getContext().getContentResolver(), Settings.Secure.EMERGENCY_GESTURE_SOUND_ENABLED, soundSettingValue); break; case METHOD_NAME_GET_EMERGENCY_GESTURE_ENABLED: if (DEBUG) { Log.d(TAG, METHOD_NAME_GET_EMERGENCY_GESTURE_ENABLED); } bundle.putInt(EMERGENCY_SETTING_VALUE, Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.EMERGENCY_GESTURE_ENABLED, isDefaultEmergencyGestureEnabled(getContext()) ? EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF)); break; case METHOD_NAME_GET_EMERGENCY_GESTURE_SOUND_ENABLED: if (DEBUG) { Log.d(TAG, METHOD_NAME_GET_EMERGENCY_GESTURE_SOUND_ENABLED); } bundle.putInt(EMERGENCY_SETTING_VALUE, Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.EMERGENCY_GESTURE_SOUND_ENABLED, isDefaultEmergencyGestureSoundEnabled(getContext()) ? EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF)); break; } return bundle; } @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { throw new UnsupportedOperationException(); } @Override public String getType(Uri uri) { throw new UnsupportedOperationException(); } @Override public Uri insert(Uri uri, ContentValues values) { throw new UnsupportedOperationException(); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } @Override 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); } }