[2/3] Telephony: Proximity speaker
Patchset: add missing resolver
Patchset: put in category
Patchset: use dependency attribute in xml instead of
disabling preference in code
Patchset: use SwitchPreference instead of CheckBoxPreference
Patchset: for incall only, use summaryOff and summaryOn attributes
for the SwitchPreference to make the preference less
confusing to the user
Patchset: add time delay preference
Change-Id: I2d4a716d7f3c002cb3b4861452483997f82cbbfa
diff --git a/res/values/custom_config.xml b/res/values/custom_config.xml
new file mode 100644
index 0000000..26082a6
--- /dev/null
+++ b/res/values/custom_config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012-2015 SlimRoms 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.
+-->
+<resources>
+
+ <!-- Disable speaker proximity preference for problematic devices -->
+ <bool name="config_enabled_speakerprox" translatable="false">true</bool>
+
+</resources>
+
+
+
+
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
new file mode 100644
index 0000000..573ba23
--- /dev/null
+++ b/res/values/custom_strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012-2015 SlimRoms 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Proximity speaker -->
+ <string name="display_category_prox_auto_speaker_title">Proximity speaker settings</string>
+ <string name="prox_auto_speaker_title">Automatic proximity speaker</string>
+ <string name="prox_auto_speaker_summary">Enable speakerphone when the device is removed from your face</string>
+ <string name="prox_auto_speaker_delay_title">Proximity speaker delay</string>
+ <string name="prox_auto_speaker_delay_summary">Time delay before speaker is activated</string>
+ <string name="prox_auto_speaker_incall_only_title">Only while in call</string>
+ <string name="prox_auto_speaker_incall_only_summary_on">On outgoing calls, listener will only become active after the receiving party answers</string>
+ <string name="prox_auto_speaker_incall_only_summary_off">Listener will be active during all offhook call states (default)</string>
+
+</resources>
diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml
index 30d2851..9bf9079 100644
--- a/res/xml/call_feature_setting.xml
+++ b/res/xml/call_feature_setting.xml
@@ -150,4 +150,33 @@
android:targetClass="com.android.phone.ImsEditor" />
</PreferenceScreen>
+ <PreferenceCategory
+ android:key="category_prox_auto_speaker"
+ android:title="@string/display_category_prox_auto_speaker_title" >
+
+ <SwitchPreference
+ android:key="prox_auto_speaker"
+ android:title="@string/prox_auto_speaker_title"
+ android:summary="@string/prox_auto_speaker_summary"
+ android:persistent="false"
+ android:defaultValue="false" />
+
+ <SlimSeekBarPreference
+ android:key="prox_auto_speaker_delay"
+ android:title="@string/prox_auto_speaker_delay_title"
+ android:summary="@string/prox_auto_speaker_delay_summary"
+ android:persistent="false"
+ android:dependency="prox_auto_speaker" />
+
+ <SwitchPreference
+ android:key="prox_auto_speaker_incall_only"
+ android:title="@string/prox_auto_speaker_incall_only_title"
+ android:summaryOff="@string/prox_auto_speaker_incall_only_summary_off"
+ android:summaryOn="@string/prox_auto_speaker_incall_only_summary_on"
+ android:persistent="false"
+ android:defaultValue="false"
+ android:dependency="prox_auto_speaker" />
+
+ </PreferenceCategory>
+
</PreferenceScreen>
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index e7d8092..6438175 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -38,6 +38,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.os.PowerManager;
import android.os.UserHandle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
@@ -45,6 +46,8 @@
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
+import android.preference.SlimSeekBarPreference;
+import android.preference.SwitchPreference;
import android.provider.ContactsContract.CommonDataKinds;
import android.provider.Settings;
import android.telecom.PhoneAccountHandle;
@@ -177,6 +180,10 @@
private static final String BUTTON_TTY_KEY = "button_tty_mode_key";
private static final String BUTTON_HAC_KEY = "button_hac_key";
+ private static final String PROX_AUTO_SPEAKER = "prox_auto_speaker";
+ private static final String PROX_AUTO_SPEAKER_DELAY = "prox_auto_speaker_delay";
+ private static final String PROX_AUTO_SPEAKER_INCALL_ONLY = "prox_auto_speaker_incall_only";
+
private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
@@ -360,6 +367,10 @@
private SharedPreferences mPerProviderSavedVMNumbers;
+ private SwitchPreference mProxSpeaker;
+ private SlimSeekBarPreference mProxSpeakerDelay;
+ private SwitchPreference mProxSpeakerIncallOnly;
+
/**
* Results of reading forwarding settings
*/
@@ -473,6 +484,13 @@
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference == mSubMenuVoicemailSettings) {
return true;
+ } else if (preference == mProxSpeaker) {
+ Settings.System.putInt(getContentResolver(), Settings.System.PROXIMITY_AUTO_SPEAKER,
+ mProxSpeaker.isChecked() ? 1 : 0);
+ } else if (preference == mProxSpeakerIncallOnly) {
+ Settings.System.putInt(getContentResolver(),
+ Settings.System.PROXIMITY_AUTO_SPEAKER_INCALL_ONLY,
+ mProxSpeakerIncallOnly.isChecked() ? 1 : 0);
} else if (preference == mButtonDTMF) {
return true;
} else if (preference == mButtonTTY) {
@@ -588,6 +606,10 @@
mChangingVMorFwdDueToProviderChange = true;
saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
}
+ } else if (preference == mProxSpeakerDelay) {
+ int delay = Integer.valueOf((String) objValue);
+ Settings.System.putInt(getContentResolver(),
+ Settings.System.PROXIMITY_AUTO_SPEAKER_DELAY, delay);
}
// always let the preference setting proceed.
return true;
@@ -1604,6 +1626,17 @@
initVoiceMailProviders();
}
+ mProxSpeaker = (SwitchPreference) findPreference(PROX_AUTO_SPEAKER);
+ mProxSpeakerIncallOnly = (SwitchPreference) findPreference(PROX_AUTO_SPEAKER_INCALL_ONLY);
+ mProxSpeakerDelay = (SlimSeekBarPreference) findPreference(PROX_AUTO_SPEAKER_DELAY);
+ if (mProxSpeakerDelay != null) {
+ mProxSpeakerDelay.setDefault(100);
+ mProxSpeakerDelay.isMilliseconds(true);
+ mProxSpeakerDelay.setInterval(1);
+ mProxSpeakerDelay.minimumValue(100);
+ mProxSpeakerDelay.multiplyValue(100);
+ mProxSpeakerDelay.setOnPreferenceChangeListener(this);
+ }
if (mButtonDTMF != null) {
if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
@@ -1643,6 +1676,39 @@
}
}
+ final ContentResolver contentResolver = getContentResolver();
+
+ if (mProxSpeaker != null) {
+ PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
+ if (pm.isWakeLockLevelSupported(
+ PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)
+ && getResources().getBoolean(R.bool.config_enabled_speakerprox)) {
+ mProxSpeaker.setChecked(Settings.System.getInt(contentResolver,
+ Settings.System.PROXIMITY_AUTO_SPEAKER, 0) == 1);
+ if (mProxSpeakerIncallOnly != null) {
+ mProxSpeakerIncallOnly.setChecked(Settings.System.getInt(contentResolver,
+ Settings.System.PROXIMITY_AUTO_SPEAKER_INCALL_ONLY, 0) == 1);
+ }
+ if (mProxSpeakerDelay != null) {
+ final int proxDelay = Settings.System.getInt(getContentResolver(),
+ Settings.System.PROXIMITY_AUTO_SPEAKER_DELAY, 100);
+ // minimum 100 is 1 interval of the 100 multiplier
+ mProxSpeakerDelay.setInitValue((proxDelay / 100) - 1);
+ }
+ } else {
+ prefSet.removePreference(mProxSpeaker);
+ mProxSpeaker = null;
+ if (mProxSpeakerIncallOnly != null) {
+ prefSet.removePreference(mProxSpeakerIncallOnly);
+ mProxSpeakerIncallOnly = null;
+ }
+ if (mProxSpeakerDelay != null) {
+ prefSet.removePreference(mProxSpeakerDelay);
+ mProxSpeakerDelay = null;
+ }
+ }
+ }
+
if (!getResources().getBoolean(R.bool.world_phone) && (!isMsim)) {
Preference options = prefSet.findPreference(BUTTON_CDMA_OPTIONS);
if (options != null) {