/* * Copyright (C) 2019 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.settings.sound; import android.app.settings.SettingsEnums; import android.content.Context; import android.graphics.drawable.Drawable; import android.provider.Settings; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.widget.CandidateInfo; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Fragment for changing vibrate for calls options. */ public class VibrateForCallsPreferenceFragment extends RadioButtonPickerFragment { private static final String TAG = "VibrateForCallsPreferenceFragment"; @VisibleForTesting static final String KEY_NEVER_VIBRATE = "never_vibrate"; @VisibleForTesting static final String KEY_ALWAYS_VIBRATE = "always_vibrate"; @VisibleForTesting static final String KEY_RAMPING_RINGER = "ramping_ringer"; private static final int ON = 1; private static final int OFF = 0; private final Map mCandidates; public VibrateForCallsPreferenceFragment() { mCandidates = new ArrayMap<>(); } @Override public void onAttach(Context context) { super.onAttach(context); loadCandidates(context); } private void loadCandidates(Context context) { mCandidates.put(KEY_NEVER_VIBRATE, new VibrateForCallsCandidateInfo( KEY_NEVER_VIBRATE, R.string.vibrate_when_ringing_option_never_vibrate)); mCandidates.put(KEY_ALWAYS_VIBRATE, new VibrateForCallsCandidateInfo( KEY_ALWAYS_VIBRATE, R.string.vibrate_when_ringing_option_always_vibrate)); mCandidates.put(KEY_RAMPING_RINGER, new VibrateForCallsCandidateInfo( KEY_RAMPING_RINGER, R.string.vibrate_when_ringing_option_ramping_ringer)); } private void updateSettings(VibrateForCallsCandidateInfo candidate) { final String key = candidate.getKey(); if (TextUtils.equals(key, KEY_ALWAYS_VIBRATE)) { Settings.System.putInt( getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, ON); Settings.Global.putInt( getContext().getContentResolver(), Settings.Global.APPLY_RAMPING_RINGER, OFF); } else if (TextUtils.equals(key, KEY_RAMPING_RINGER)) { Settings.System.putInt( getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, OFF); Settings.Global.putInt( getContext().getContentResolver(), Settings.Global.APPLY_RAMPING_RINGER, ON); } else { Settings.System.putInt( getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, OFF); Settings.Global.putInt( getContext().getContentResolver(), Settings.Global.APPLY_RAMPING_RINGER, OFF); } } @Override protected List getCandidates() { final List candidates = new ArrayList<>(); candidates.add(mCandidates.get(KEY_NEVER_VIBRATE)); candidates.add(mCandidates.get(KEY_ALWAYS_VIBRATE)); candidates.add(mCandidates.get(KEY_RAMPING_RINGER)); return candidates; } @Override protected String getDefaultKey() { if (Settings.Global.getInt( getContext().getContentResolver(), Settings.Global.APPLY_RAMPING_RINGER, OFF) == ON) { return KEY_RAMPING_RINGER; } else if (Settings.System.getInt( getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, OFF) == ON) { return KEY_ALWAYS_VIBRATE; } else { return KEY_NEVER_VIBRATE; } } @Override protected boolean setDefaultKey(String key) { final VibrateForCallsCandidateInfo candidate = mCandidates.get(key); if (candidate == null) { Log.e(TAG, "Unknown vibrate for calls candidate (key = " + key + ")!"); return false; } updateSettings(candidate); return true; } @Override protected int getPreferenceScreenResId() { return R.xml.vibrate_for_calls_settings; } @Override public int getMetricsCategory() { return SettingsEnums.VIBRATE_FOR_CALLS; } @VisibleForTesting class VibrateForCallsCandidateInfo extends CandidateInfo { private final String mKey; private final int mLabelId; VibrateForCallsCandidateInfo(String key, int labelId) { super(true /* enabled */); mKey = key; mLabelId = labelId; } @Override public CharSequence loadLabel() { return getContext().getString(mLabelId); } @Override public Drawable loadIcon() { return null; } @Override public String getKey() { return mKey; } } }