Add items in Other Sound directly into Sound settings.

- In new IA, Other Sound no longer is a separate preference screen, but
individual preferences are put directly under SoundSettings.

- Add controllers for each other sounds preference.

- Remove Cast settings from Soundsettings in new IA.

Change-Id: I75d771674ffabfecbd66079bc86844b2ff098b71
Fix: 33944294
Test: make RunSettingsRoboTests
This commit is contained in:
Doris Ling
2017-01-11 15:57:02 -08:00
parent a0f1e5adb9
commit 3ca367757b
25 changed files with 2179 additions and 235 deletions

View File

@@ -6161,6 +6161,11 @@
<!-- Work Sound: Message for dialog shown when enabling sync with personal sounds. [CHAR LIMIT=none] --> <!-- Work Sound: Message for dialog shown when enabling sync with personal sounds. [CHAR LIMIT=none] -->
<string name="work_sync_dialog_message">Your current work profile sounds will be replaced with your personal profile sounds</string> <string name="work_sync_dialog_message">Your current work profile sounds will be replaced with your personal profile sounds</string>
<!-- Ringtones preference category: Title for the Ringotnes preference categories. [CHAR LIMIT=none] -->
<string name="ringtones_category_preference_title">Ringtones</string>
<!-- Other sounds and vibrations preference category: Title for the Other sounds and vibrations preference categories. [CHAR LIMIT=none] -->
<string name="other_sound_category_preference_title">Other sounds and vibrations</string>
<!-- Configure Notifications Settings title. [CHAR LIMIT=30] --> <!-- Configure Notifications Settings title. [CHAR LIMIT=30] -->
<string name="configure_notification_settings">Notification preferences</string> <string name="configure_notification_settings">Notification preferences</string>

View File

@@ -0,0 +1,152 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/sound_settings"
android:key="sound_settings"
settings:keywords="@string/keywords_sounds">
<!-- Media volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="media_volume"
android:icon="@*android:drawable/ic_audio_media"
android:title="@string/media_volume_option_title" />
<!-- Alarm volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="alarm_volume"
android:icon="@*android:drawable/ic_audio_alarm"
android:title="@string/alarm_volume_option_title" />
<!-- Ring volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="ring_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/ring_volume_option_title" />
<!-- Notification volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="notification_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/notification_volume_option_title" />
<!-- Also vibrate for calls -->
<SwitchPreference
android:key="vibrate_when_ringing"
android:title="@string/vibrate_when_ringing_title" />
<!-- Interruptions -->
<com.android.settingslib.RestrictedPreference
android:key="zen_mode"
android:title="@string/zen_mode_settings_title"
settings:useAdminDisabledSummary="true"
settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
android:fragment="com.android.settings.notification.ZenModeSettings" />
<PreferenceCategory
android:key="ringtones_preferecence_category"
android:title="@string/ringtones_category_preference_title" />
<!-- Phone ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="ringtone"
android:title="@string/ringtone_title"
android:dialogTitle="@string/ringtone_title"
android:summary="@string/ringtone_summary"
android:ringtoneType="ringtone" />
<!-- Default notification ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="notification_ringtone"
android:title="@string/notification_ringtone_title"
android:dialogTitle="@string/notification_ringtone_title"
android:summary="@string/ringtone_summary"
android:ringtoneType="notification" />
<!-- Default alarm ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="alarm_ringtone"
android:title="@string/alarm_ringtone_title"
android:dialogTitle="@string/alarm_ringtone_title"
android:summary="@string/ringtone_summary"
android:persistent="false"
android:ringtoneType="alarm" />
<!-- Other sounds -->
<PreferenceCategory
android:key="other_sound_preferecence_category"
android:title="@string/other_sound_category_preference_title" />
<!-- Dial pad tones -->
<SwitchPreference
android:key="dial_pad_tones"
android:title="@string/dial_pad_tones_title" />
<!-- Screen locking sounds -->
<SwitchPreference
android:key="screen_locking_sounds"
android:title="@string/screen_locking_sounds_title" />
<!-- Charging sounds -->
<SwitchPreference
android:key="charging_sounds"
android:title="@string/charging_sounds_title" />
<!-- Docking sounds -->
<SwitchPreference
android:key="docking_sounds"
android:title="@string/docking_sounds_title" />
<!-- Touch sounds -->
<SwitchPreference
android:key="touch_sounds"
android:title="@string/touch_sounds_title" />
<!-- Vibrate on touch -->
<SwitchPreference
android:key="vibrate_on_touch"
android:title="@string/vibrate_on_touch_title" />
<!-- Dock speaker plays -->
<DropDownPreference
android:key="dock_audio_media"
android:title="@string/dock_audio_media_title"
android:summary="%s" />
<!-- Boot sounds -->
<SwitchPreference
android:key="boot_sounds"
android:title="@string/boot_sounds_title" />
<!-- Emergency tone -->
<DropDownPreference
android:key="emergency_tone"
android:title="@string/emergency_tone_title"
android:summary="%s" />
<com.android.settingslib.RestrictedPreference
android:key="cell_broadcast_settings"
android:title="@string/cell_broadcast_settings"
settings:useAdminDisabledSummary="true">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.cellbroadcastreceiver"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings" />
</com.android.settingslib.RestrictedPreference>
</PreferenceScreen>

View File

@@ -0,0 +1,66 @@
/*
* Copyright (C) 2017 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.notification;
import android.content.Context;
import android.os.SystemProperties;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceController;
public class BootSoundPreferenceController extends PreferenceController {
// Boot Sounds needs to be a system property so it can be accessed during boot.
private static final String KEY_BOOT_SOUNDS = "boot_sounds";
@VisibleForTesting
static final String PROPERTY_BOOT_SOUNDS = "persist.sys.bootanim.play_sound";
public BootSoundPreferenceController(Context context) {
super(context);
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
if (isAvailable()) {
SwitchPreference preference = (SwitchPreference) screen.findPreference(KEY_BOOT_SOUNDS);
preference.setChecked(SystemProperties.getBoolean(PROPERTY_BOOT_SOUNDS, true));
}
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (KEY_BOOT_SOUNDS.equals(preference.getKey())) {
SwitchPreference switchPreference = (SwitchPreference) preference;
SystemProperties.set(PROPERTY_BOOT_SOUNDS, switchPreference.isChecked() ? "1" : "0");
}
return false;
}
@Override
public String getPreferenceKey() {
return KEY_BOOT_SOUNDS;
}
@Override
public boolean isAvailable() {
return mContext.getResources().getBoolean(com.android.settings.R.bool.has_boot_sounds);
}
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_GLOBAL;
import android.content.Context;
import android.provider.Settings.Global;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class ChargingSoundPreferenceController extends SettingPrefController {
private static final String KEY_CHARGING_SOUNDS = "charging_sounds";
public ChargingSoundPreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_GLOBAL, KEY_CHARGING_SOUNDS, Global.CHARGING_SOUNDS_ENABLED, DEFAULT_ON);
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
import android.content.Context;
import android.provider.Settings.System;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.core.lifecycle.Lifecycle;
public class DialPadTonePreferenceController extends SettingPrefController {
private static final String KEY_DIAL_PAD_TONES = "dial_pad_tones";
public DialPadTonePreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_SYSTEM, KEY_DIAL_PAD_TONES, System.DTMF_TONE_WHEN_DIALING, DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return Utils.isVoiceCapable(context);
}
};
}
}

View File

@@ -0,0 +1,64 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_GLOBAL;
import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings.Global;
import android.telephony.TelephonyManager;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class DockAudioMediaPreferenceController extends SettingPrefController {
private static final String KEY_DOCK_AUDIO_MEDIA = "dock_audio_media";
private static final int DOCK_AUDIO_MEDIA_DISABLED = 0;
private static final int DOCK_AUDIO_MEDIA_ENABLED = 1;
private static final int DEFAULT_DOCK_AUDIO_MEDIA = DOCK_AUDIO_MEDIA_DISABLED;
public DockAudioMediaPreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_GLOBAL, KEY_DOCK_AUDIO_MEDIA, Global.DOCK_AUDIO_MEDIA_ENABLED,
DEFAULT_DOCK_AUDIO_MEDIA, DOCK_AUDIO_MEDIA_DISABLED, DOCK_AUDIO_MEDIA_ENABLED) {
@Override
public boolean isApplicable(Context context) {
return context.getResources().getBoolean(
com.android.settings.R.bool.has_dock_settings);
}
@Override
protected String getCaption(Resources res, int value) {
switch(value) {
case DOCK_AUDIO_MEDIA_DISABLED:
return res.getString(
com.android.settings.R.string.dock_audio_media_disabled);
case DOCK_AUDIO_MEDIA_ENABLED:
return res.getString(
com.android.settings.R.string.dock_audio_media_enabled);
default:
throw new IllegalArgumentException();
}
}
};
}
}

View File

@@ -0,0 +1,43 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_GLOBAL;
import android.content.Context;
import android.provider.Settings.Global;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class DockingSoundPreferenceController extends SettingPrefController {
private static final String KEY_DOCKING_SOUNDS = "docking_sounds";
public DockingSoundPreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_GLOBAL, KEY_DOCKING_SOUNDS, Global.DOCK_SOUNDS_ENABLED, DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return context.getResources().getBoolean(R.bool.has_dock_settings);
}
};
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_GLOBAL;
import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings.Global;
import android.telephony.TelephonyManager;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class EmergencyTonePreferenceController extends SettingPrefController {
private static final String KEY_EMERGENCY_TONE = "emergency_tone";
private static final int EMERGENCY_TONE_SILENT = 0;
private static final int EMERGENCY_TONE_ALERT = 1;
private static final int EMERGENCY_TONE_VIBRATE = 2;
private static final int DEFAULT_EMERGENCY_TONE = EMERGENCY_TONE_SILENT;
public EmergencyTonePreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_GLOBAL, KEY_EMERGENCY_TONE, Global.EMERGENCY_TONE, DEFAULT_EMERGENCY_TONE,
EMERGENCY_TONE_ALERT, EMERGENCY_TONE_VIBRATE, EMERGENCY_TONE_SILENT) {
@Override
public boolean isApplicable(Context context) {
final TelephonyManager telephony =
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return telephony != null
&& telephony.getCurrentPhoneType() == TelephonyManager.PHONE_TYPE_CDMA;
}
@Override
protected String getCaption(Resources res, int value) {
switch(value) {
case EMERGENCY_TONE_SILENT:
return res.getString(R.string.emergency_tone_silent);
case EMERGENCY_TONE_ALERT:
return res.getString(R.string.emergency_tone_alert);
case EMERGENCY_TONE_VIBRATE:
return res.getString(R.string.emergency_tone_vibrate);
default:
throw new IllegalArgumentException();
}
}
};
}
}

View File

@@ -16,177 +16,26 @@
package com.android.settings.notification; package com.android.settings.notification;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemProperties;
import android.os.Vibrator;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.provider.Settings.Global;
import android.provider.Settings.System;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.telephony.TelephonyManager;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.core.PreferenceController;
import com.android.settings.Utils; import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import static com.android.settings.notification.SettingPref.TYPE_GLOBAL; /* This class has been deprecated Modifications to Other Sounds settings should be made in
import static com.android.settings.notification.SettingPref.TYPE_SYSTEM; {@link SoundSettings } instead. */
@Deprecated
public class OtherSoundSettings extends SettingsPreferenceFragment implements Indexable { public class OtherSoundSettings extends DashboardFragment {
private static final String TAG = "OtherSoundSettings"; private static final String TAG = "OtherSoundSettings";
private static final int DEFAULT_ON = 1;
private static final int EMERGENCY_TONE_SILENT = 0;
private static final int EMERGENCY_TONE_ALERT = 1;
private static final int EMERGENCY_TONE_VIBRATE = 2;
private static final int DEFAULT_EMERGENCY_TONE = EMERGENCY_TONE_SILENT;
private static final int DOCK_AUDIO_MEDIA_DISABLED = 0;
private static final int DOCK_AUDIO_MEDIA_ENABLED = 1;
private static final int DEFAULT_DOCK_AUDIO_MEDIA = DOCK_AUDIO_MEDIA_DISABLED;
private static final String KEY_DIAL_PAD_TONES = "dial_pad_tones";
private static final String KEY_SCREEN_LOCKING_SOUNDS = "screen_locking_sounds";
private static final String KEY_CHARGING_SOUNDS = "charging_sounds";
private static final String KEY_DOCKING_SOUNDS = "docking_sounds";
private static final String KEY_TOUCH_SOUNDS = "touch_sounds";
private static final String KEY_VIBRATE_ON_TOUCH = "vibrate_on_touch";
private static final String KEY_DOCK_AUDIO_MEDIA = "dock_audio_media";
private static final String KEY_EMERGENCY_TONE = "emergency_tone";
// Boot Sounds needs to be a system property so it can be accessed during boot.
private static final String KEY_BOOT_SOUNDS = "boot_sounds";
private static final String PROPERTY_BOOT_SOUNDS = "persist.sys.bootanim.play_sound";
private static final SettingPref PREF_DIAL_PAD_TONES = new SettingPref(
TYPE_SYSTEM, KEY_DIAL_PAD_TONES, System.DTMF_TONE_WHEN_DIALING, DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return Utils.isVoiceCapable(context);
}
};
private static final SettingPref PREF_SCREEN_LOCKING_SOUNDS = new SettingPref(
TYPE_SYSTEM, KEY_SCREEN_LOCKING_SOUNDS, System.LOCKSCREEN_SOUNDS_ENABLED, DEFAULT_ON);
private static final SettingPref PREF_CHARGING_SOUNDS = new SettingPref(
TYPE_GLOBAL, KEY_CHARGING_SOUNDS, Global.CHARGING_SOUNDS_ENABLED, DEFAULT_ON);
private static final SettingPref PREF_DOCKING_SOUNDS = new SettingPref(
TYPE_GLOBAL, KEY_DOCKING_SOUNDS, Global.DOCK_SOUNDS_ENABLED, DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return hasDockSettings(context);
}
};
private static final SettingPref PREF_TOUCH_SOUNDS = new SettingPref(
TYPE_SYSTEM, KEY_TOUCH_SOUNDS, System.SOUND_EFFECTS_ENABLED, DEFAULT_ON) {
@Override
protected boolean setSetting(final Context context, final int value) {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
final AudioManager am =
(AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (value != 0) {
am.loadSoundEffects();
} else {
am.unloadSoundEffects();
}
}
});
return super.setSetting(context, value);
}
};
private static final SettingPref PREF_VIBRATE_ON_TOUCH = new SettingPref(
TYPE_SYSTEM, KEY_VIBRATE_ON_TOUCH, System.HAPTIC_FEEDBACK_ENABLED, DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return hasHaptic(context);
}
};
private static final SettingPref PREF_DOCK_AUDIO_MEDIA = new SettingPref(
TYPE_GLOBAL, KEY_DOCK_AUDIO_MEDIA, Global.DOCK_AUDIO_MEDIA_ENABLED,
DEFAULT_DOCK_AUDIO_MEDIA, DOCK_AUDIO_MEDIA_DISABLED, DOCK_AUDIO_MEDIA_ENABLED) {
@Override
public boolean isApplicable(Context context) {
return hasDockSettings(context);
}
@Override
protected String getCaption(Resources res, int value) {
switch(value) {
case DOCK_AUDIO_MEDIA_DISABLED:
return res.getString(R.string.dock_audio_media_disabled);
case DOCK_AUDIO_MEDIA_ENABLED:
return res.getString(R.string.dock_audio_media_enabled);
default:
throw new IllegalArgumentException();
}
}
};
private static final SettingPref PREF_EMERGENCY_TONE = new SettingPref(
TYPE_GLOBAL, KEY_EMERGENCY_TONE, Global.EMERGENCY_TONE, DEFAULT_EMERGENCY_TONE,
EMERGENCY_TONE_ALERT, EMERGENCY_TONE_VIBRATE, EMERGENCY_TONE_SILENT) {
@Override
public boolean isApplicable(Context context) {
final int activePhoneType = TelephonyManager.getDefault().getCurrentPhoneType();
return activePhoneType == TelephonyManager.PHONE_TYPE_CDMA;
}
@Override
protected String getCaption(Resources res, int value) {
switch(value) {
case EMERGENCY_TONE_SILENT:
return res.getString(R.string.emergency_tone_silent);
case EMERGENCY_TONE_ALERT:
return res.getString(R.string.emergency_tone_alert);
case EMERGENCY_TONE_VIBRATE:
return res.getString(R.string.emergency_tone_vibrate);
default:
throw new IllegalArgumentException();
}
}
};
private static final SettingPref[] PREFS = {
PREF_DIAL_PAD_TONES,
PREF_SCREEN_LOCKING_SOUNDS,
PREF_CHARGING_SOUNDS,
PREF_DOCKING_SOUNDS,
PREF_TOUCH_SOUNDS,
PREF_VIBRATE_ON_TOUCH,
PREF_DOCK_AUDIO_MEDIA,
PREF_EMERGENCY_TONE,
};
private SwitchPreference mBootSounds;
private final SettingsObserver mSettingsObserver = new SettingsObserver();
private Context mContext;
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return MetricsEvent.NOTIFICATION_OTHER_SOUND; return MetricsEvent.NOTIFICATION_OTHER_SOUND;
@@ -198,84 +47,34 @@ public class OtherSoundSettings extends SettingsPreferenceFragment implements In
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) { protected String getCategoryKey() {
super.onCreate(savedInstanceState); return null;
addPreferencesFromResource(R.xml.other_sound_settings);
mContext = getActivity();
for (SettingPref pref : PREFS) {
pref.init(this);
}
if (mContext.getResources().getBoolean(R.bool.has_boot_sounds)) {
mBootSounds = (SwitchPreference) findPreference(KEY_BOOT_SOUNDS);
mBootSounds.setChecked(SystemProperties.getBoolean(PROPERTY_BOOT_SOUNDS, true));
} else {
removePreference(KEY_BOOT_SOUNDS);
}
} }
@Override @Override
public void onResume() { protected String getLogTag() {
super.onResume(); return TAG;
mSettingsObserver.register(true);
} }
@Override @Override
public void onPause() { protected int getPreferenceScreenResId() {
super.onPause(); return R.xml.other_sound_settings;
mSettingsObserver.register(false);
} }
@Override @Override
public boolean onPreferenceTreeClick(Preference preference) { protected List<PreferenceController> getPreferenceControllers(Context context) {
if (mBootSounds != null && preference == mBootSounds) { final List<PreferenceController> controllers = new ArrayList<>();
SystemProperties.set(PROPERTY_BOOT_SOUNDS, mBootSounds.isChecked() ? "1" : "0"); Lifecycle lifecycle = getLifecycle();
return false; controllers.add(new DialPadTonePreferenceController(context, this, lifecycle));
} else { controllers.add(new ScreenLockSoundPreferenceController(context, this, lifecycle));
return super.onPreferenceTreeClick(preference); controllers.add(new ChargingSoundPreferenceController(context, this, lifecycle));
} controllers.add(new DockingSoundPreferenceController(context, this, lifecycle));
} controllers.add(new TouchSoundPreferenceController(context, this, lifecycle));
controllers.add(new VibrateOnTouchPreferenceController(context, this, lifecycle));
private static boolean hasDockSettings(Context context) { controllers.add(new DockAudioMediaPreferenceController(context, this, lifecycle));
return context.getResources().getBoolean(R.bool.has_dock_settings); controllers.add(new BootSoundPreferenceController(context));
} controllers.add(new EmergencyTonePreferenceController(context, this, lifecycle));
return controllers;
private static boolean hasHaptic(Context context) {
final Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
return vibrator != null && vibrator.hasVibrator();
}
// === Callbacks ===
private final class SettingsObserver extends ContentObserver {
public SettingsObserver() {
super(new Handler());
}
public void register(boolean register) {
final ContentResolver cr = getContentResolver();
if (register) {
for (SettingPref pref : PREFS) {
cr.registerContentObserver(pref.getUri(), false, this);
}
} else {
cr.unregisterContentObserver(this);
}
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
for (SettingPref pref : PREFS) {
if (pref.getUri().equals(uri)) {
pref.update(mContext);
return;
}
}
}
} }
// === Indexing === // === Indexing ===
@@ -292,11 +91,23 @@ public class OtherSoundSettings extends SettingsPreferenceFragment implements In
public List<String> getNonIndexableKeys(Context context) { public List<String> getNonIndexableKeys(Context context) {
final ArrayList<String> rt = new ArrayList<String>(); final ArrayList<String> rt = new ArrayList<String>();
for (SettingPref pref : PREFS) { new DialPadTonePreferenceController(context, null /* SettingsPreferenceFragment */,
if (!pref.isApplicable(context)) { null /* Lifecycle */).updateNonIndexableKeys(rt);
rt.add(pref.getKey()); new ScreenLockSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
} null /* Lifecycle */).updateNonIndexableKeys(rt);
} new ChargingSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new DockingSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new TouchSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new VibrateOnTouchPreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new DockAudioMediaPreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new BootSoundPreferenceController(context).updateNonIndexableKeys(rt);
new EmergencyTonePreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
return rt; return rt;
} }
}; };

View File

@@ -0,0 +1,38 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
import android.content.Context;
import android.provider.Settings.System;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class ScreenLockSoundPreferenceController extends SettingPrefController {
private static final String KEY_SCREEN_LOCKING_SOUNDS = "screen_locking_sounds";
public ScreenLockSoundPreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_SYSTEM, KEY_SCREEN_LOCKING_SOUNDS, System.LOCKSCREEN_SOUNDS_ENABLED, DEFAULT_ON);
}
}

View File

@@ -0,0 +1,123 @@
/*
* Copyright (C) 2017 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.notification;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnPause;
import com.android.settings.core.lifecycle.events.OnResume;
import java.util.List;
public abstract class SettingPrefController extends PreferenceController implements
LifecycleObserver, OnResume, OnPause {
protected static final int DEFAULT_ON = 1;
private SettingsPreferenceFragment mParent;
protected SettingsObserver mSettingsObserver;
protected SettingPref mPreference;
public SettingPrefController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context);
mParent = parent;
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void displayPreference(PreferenceScreen screen) {
mPreference.init(mParent);
if (isAvailable()) {
mSettingsObserver = new SettingsObserver();
}
}
@Override
public String getPreferenceKey() {
return mPreference.getKey();
}
@Override
public boolean isAvailable() {
return mPreference.isApplicable(mContext);
}
@Override
public void updateNonIndexableKeys(List<String> keys) {
if (!mPreference.isApplicable(mContext)) {
keys.add(mPreference.getKey());
}
}
@Override
public void updateState(Preference preference) {
mPreference.update(mContext);
}
@Override
public void onResume() {
if (mSettingsObserver != null) {
mSettingsObserver.register(true /* register */);
}
}
@Override
public void onPause() {
if (mSettingsObserver != null) {
mSettingsObserver.register(false /* register */);
}
}
@VisibleForTesting
final class SettingsObserver extends ContentObserver {
public SettingsObserver() {
super(new Handler());
}
public void register(boolean register) {
final ContentResolver cr = mContext.getContentResolver();
if (register) {
cr.registerContentObserver(mPreference.getUri(), false, this);
} else {
cr.unregisterContentObserver(this);
}
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (mPreference.getUri().equals(uri)) {
mPreference.update(mContext);
}
}
}
}

View File

@@ -41,6 +41,7 @@ import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle; import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader; import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.drawer.CategoryKey; import com.android.settingslib.drawer.CategoryKey;
import java.text.NumberFormat; import java.text.NumberFormat;
@@ -113,14 +114,17 @@ public class SoundSettings extends DashboardFragment {
@Override @Override
protected int getPreferenceScreenResId() { protected int getPreferenceScreenResId() {
return R.xml.sound_settings; return mDashboardFeatureProvider.isEnabled()
? R.xml.ia_sound_settings : R.xml.sound_settings;
} }
@Override @Override
protected List<PreferenceController> getPreferenceControllers(Context context) { protected List<PreferenceController> getPreferenceControllers(Context context) {
final List<PreferenceController> controllers = new ArrayList<>(); final List<PreferenceController> controllers = new ArrayList<>();
Lifecycle lifecycle = getLifecycle(); Lifecycle lifecycle = getLifecycle();
if (!mDashboardFeatureProvider.isEnabled()) {
controllers.add(new CastPreferenceController(context)); controllers.add(new CastPreferenceController(context));
}
controllers.add(new ZenModePreferenceController(context)); controllers.add(new ZenModePreferenceController(context));
controllers.add(new EmergencyBroadcastPreferenceController(context)); controllers.add(new EmergencyBroadcastPreferenceController(context));
controllers.add(new VibrateWhenRingPreferenceController(context)); controllers.add(new VibrateWhenRingPreferenceController(context));
@@ -141,6 +145,19 @@ public class SoundSettings extends DashboardFragment {
mWorkSoundController = new WorkSoundPreferenceController(context, this, getLifecycle()); mWorkSoundController = new WorkSoundPreferenceController(context, this, getLifecycle());
controllers.add(mWorkSoundController); controllers.add(mWorkSoundController);
// === Other Sound Settings ===
if (mDashboardFeatureProvider.isEnabled()) {
controllers.add(new DialPadTonePreferenceController(context, this, lifecycle));
controllers.add(new ScreenLockSoundPreferenceController(context, this, lifecycle));
controllers.add(new ChargingSoundPreferenceController(context, this, lifecycle));
controllers.add(new DockingSoundPreferenceController(context, this, lifecycle));
controllers.add(new TouchSoundPreferenceController(context, this, lifecycle));
controllers.add(new VibrateOnTouchPreferenceController(context, this, lifecycle));
controllers.add(new DockAudioMediaPreferenceController(context, this, lifecycle));
controllers.add(new BootSoundPreferenceController(context));
controllers.add(new EmergencyTonePreferenceController(context, this, lifecycle));
}
return controllers; return controllers;
} }
@@ -297,10 +314,38 @@ public class SoundSettings extends DashboardFragment {
context, null /* Callback */, null /* Lifecycle */).updateNonIndexableKeys(rt); context, null /* Callback */, null /* Lifecycle */).updateNonIndexableKeys(rt);
new RingVolumePreferenceController( new RingVolumePreferenceController(
context, null /* Callback */, null /* Lifecycle */).updateNonIndexableKeys(rt); context, null /* Callback */, null /* Lifecycle */).updateNonIndexableKeys(rt);
new CastPreferenceController(context).updateNonIndexableKeys(rt);
new PhoneRingtonePreferenceController(context).updateNonIndexableKeys(rt); new PhoneRingtonePreferenceController(context).updateNonIndexableKeys(rt);
new VibrateWhenRingPreferenceController(context).updateNonIndexableKeys(rt); new VibrateWhenRingPreferenceController(context).updateNonIndexableKeys(rt);
new EmergencyBroadcastPreferenceController(context).updateNonIndexableKeys(rt); new EmergencyBroadcastPreferenceController(context).updateNonIndexableKeys(rt);
if (FeatureFactory.getFactory(context).getDashboardFeatureProvider(context)
.isEnabled()) {
new DialPadTonePreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new ScreenLockSoundPreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new ChargingSoundPreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new DockingSoundPreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new TouchSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new VibrateOnTouchPreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new DockAudioMediaPreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
new BootSoundPreferenceController(context).updateNonIndexableKeys(rt);
new EmergencyTonePreferenceController(context,
null /* SettingsPreferenceFragment */,
null /* Lifecycle */).updateNonIndexableKeys(rt);
} else {
new CastPreferenceController(context).updateNonIndexableKeys(rt);
}
return rt; return rt;
} }

View File

@@ -0,0 +1,56 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
import android.content.Context;
import android.media.AudioManager;
import android.os.AsyncTask;
import android.provider.Settings.System;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class TouchSoundPreferenceController extends SettingPrefController {
private static final String KEY_TOUCH_SOUNDS = "touch_sounds";
public TouchSoundPreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_SYSTEM, KEY_TOUCH_SOUNDS, System.SOUND_EFFECTS_ENABLED, DEFAULT_ON) {
@Override
protected boolean setSetting(final Context context, final int value) {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
final AudioManager am =
(AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (value != 0) {
am.loadSoundEffects();
} else {
am.unloadSoundEffects();
}
}
});
return super.setSetting(context, value);
}
};
}
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) 2017 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.notification;
import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
import android.content.Context;
import android.os.Vibrator;
import android.provider.Settings.System;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.lifecycle.Lifecycle;
public class VibrateOnTouchPreferenceController extends SettingPrefController {
private static final String KEY_VIBRATE_ON_TOUCH = "vibrate_on_touch";
public VibrateOnTouchPreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = new SettingPref(
TYPE_SYSTEM, KEY_VIBRATE_ON_TOUCH, System.HAPTIC_FEEDBACK_ENABLED, DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return hasHaptic(context);
}
};
}
private static boolean hasHaptic(Context context) {
final Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
return vibrator != null && vibrator.hasVibrator();
}
}

View File

@@ -0,0 +1,123 @@
/*
* Copyright (C) 2017 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.notification;
import android.content.Context;
import android.os.SystemProperties;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class BootSoundPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock
private PreferenceScreen mScreen;
@Mock
private SwitchPreference mPreference;
private BootSoundPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
SettingsShadowSystemProperties.clear();
when(mContext.getResources().getBoolean(com.android.settings.R.bool.has_boot_sounds))
.thenReturn(true);
mController = new BootSoundPreferenceController(mContext);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
}
@Test
public void isAvailable_hasBootSounds_shouldReturnTrue() {
when(mContext.getResources().getBoolean(
com.android.settings.R.bool.has_boot_sounds)).thenReturn(true);
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_noBootSounds_shouldReturnFale() {
when(mContext.getResources().getBoolean(
com.android.settings.R.bool.has_boot_sounds)).thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
@Config(shadows = {SettingsShadowSystemProperties.class})
@Test
public void displayPreference_bootSoundEnabled_shouldCheckedPreference() {
SettingsShadowSystemProperties.set(BootSoundPreferenceController.PROPERTY_BOOT_SOUNDS, "1");
mController.displayPreference(mScreen);
verify(mPreference).setChecked(true);
}
@Config(shadows = {SettingsShadowSystemProperties.class})
@Test
public void displayPreference_bootSoundDisabled_shouldUncheckedPreference() {
SettingsShadowSystemProperties.set(BootSoundPreferenceController.PROPERTY_BOOT_SOUNDS, "0");
mController.displayPreference(mScreen);
verify(mPreference).setChecked(false);
}
@Config(shadows = {SettingsShadowSystemProperties.class})
@Test
public void handlePreferenceTreeClick_preferenceChecked_shouldEnableBootSound() {
when(mPreference.isChecked()).thenReturn(true);
mController.handlePreferenceTreeClick(mPreference);
assertThat(SystemProperties.getBoolean(
BootSoundPreferenceController.PROPERTY_BOOT_SOUNDS, true)).isTrue();
}
@Config(shadows = {SettingsShadowSystemProperties.class})
@Test
public void handlePreferenceTreeClick_preferenceUnchecked_shouldDisableBootSound() {
when(mPreference.isChecked()).thenReturn(false);
mController.handlePreferenceTreeClick(mPreference);
assertThat(SystemProperties.getBoolean(
BootSoundPreferenceController.PROPERTY_BOOT_SOUNDS, true)).isFalse();
}
}

View File

@@ -0,0 +1,112 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.Global;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class ChargingSoundPreferenceControllerTest {
@Mock
private PreferenceScreen mScreen;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock
private Context mContext;
private ChargingSoundPreferenceController mController;
private SwitchPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
mPreference = new SwitchPreference(ShadowApplication.getInstance().getApplicationContext());
mController = new ChargingSoundPreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_isAlwaysTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void displayPreference_chargingSoundEnabled_shouldCheckedPreference() {
Global.putInt(mContentResolver, Global.CHARGING_SOUNDS_ENABLED, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void displayPreference_chargingSoundDisabled_shouldUncheckedPreference() {
Global.putInt(mContentResolver, Global.CHARGING_SOUNDS_ENABLED, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceChanged_preferenceChecked_shouldEnabledChargingSound() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, true);
assertThat(Global.getInt(mContentResolver, Global.CHARGING_SOUNDS_ENABLED, 1))
.isEqualTo(1);
}
@Test
public void onPreferenceChanged_preferenceUnchecked_shouldDisabledChargingSound() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, false);
assertThat(Global.getInt(mContentResolver, Global.CHARGING_SOUNDS_ENABLED, 1))
.isEqualTo(0);
}
}

View File

@@ -0,0 +1,123 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.System;
import android.telephony.TelephonyManager;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DialPadTonePreferenceControllerTest {
@Mock
private TelephonyManager mTelephonyManager;
@Mock
private PreferenceScreen mScreen;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock
private Context mContext;
private DialPadTonePreferenceController mController;
private SwitchPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
mPreference = new SwitchPreference(ShadowApplication.getInstance().getApplicationContext());
mController = new DialPadTonePreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_voiceCapable_shouldReturnTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_notVoiceCapable_shouldReturnFalse() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void displayPreference_dialToneEnabled_shouldCheckedPreference() {
System.putInt(mContentResolver, System.DTMF_TONE_WHEN_DIALING, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void displayPreference_dialToneDisabled_shouldUncheckedPreference() {
System.putInt(mContentResolver, System.DTMF_TONE_WHEN_DIALING, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceChanged_preferenceChecked_shouldEnabledDialTone() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, true);
assertThat(System.getInt(mContentResolver, System.DTMF_TONE_WHEN_DIALING, 1)).isEqualTo(1);
}
@Test
public void onPreferenceChanged_preferenceUnchecked_shouldDisabledDialTone() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, false);
assertThat(System.getInt(mContentResolver, System.DTMF_TONE_WHEN_DIALING, 1)).isEqualTo(0);
}
}

View File

@@ -0,0 +1,129 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.Global;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DockAudioMediaPreferenceControllerTest {
@Mock
private PreferenceScreen mScreen;
@Mock(answer = RETURNS_DEEP_STUBS)
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock(answer = RETURNS_DEEP_STUBS)
private Context mContext;
private DockAudioMediaPreferenceController mController;
private DropDownPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
final Context appContext = ShadowApplication.getInstance().getApplicationContext();
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
when(mActivity.getResources().getBoolean(com.android.settings.R.bool.has_dock_settings))
.thenReturn(true);
when(mActivity.getResources().getString(anyInt())).thenReturn("test string");
mPreference = new DropDownPreference(appContext);
mController = new DockAudioMediaPreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_hasDockSettings_shouldReturnTrue() {
when(mContext.getResources().getBoolean(com.android.settings.R.bool.has_dock_settings))
.thenReturn(true);
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_noDockSettings_shouldReturnFalse() {
when(mContext.getResources().getBoolean(com.android.settings.R.bool.has_dock_settings))
.thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void displayPreference_dockAudioDisabled_shouldSelectFirstItem() {
Global.putInt(mContentResolver, Global.DOCK_AUDIO_MEDIA_ENABLED, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.getValue()).isEqualTo("0");
}
@Test
public void displayPreference_dockAudioEnabled_shouldSelectSecondItem() {
Global.putInt(mContentResolver, Global.DOCK_AUDIO_MEDIA_ENABLED, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.getValue()).isEqualTo("1");
}
@Test
public void onPreferenceChanged_firstItemSelected_shouldDisableDockAudio() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, "0");
assertThat(Global.getInt(mContentResolver, Global.DOCK_AUDIO_MEDIA_ENABLED, 0))
.isEqualTo(0);
}
@Test
public void onPreferenceChanged_secondItemSelected_shouldEnableDockAudio() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, "1");
assertThat(Global.getInt(mContentResolver, Global.DOCK_AUDIO_MEDIA_ENABLED, 0))
.isEqualTo(1);
}
}

View File

@@ -0,0 +1,124 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.Global;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DockingSoundPreferenceControllerTest {
@Mock
private PreferenceScreen mScreen;
@Mock(answer = RETURNS_DEEP_STUBS)
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock(answer = RETURNS_DEEP_STUBS)
private Context mContext;
private DockingSoundPreferenceController mController;
private SwitchPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
mPreference = new SwitchPreference(ShadowApplication.getInstance().getApplicationContext());
when(mActivity.getResources().getBoolean(com.android.settings.R.bool.has_dock_settings))
.thenReturn(true);
mController = new DockingSoundPreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_hasDockSettings_shouldReturnTrue() {
when(mContext.getResources().getBoolean(com.android.settings.R.bool.has_dock_settings))
.thenReturn(true);
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_noDockSettings_shouldReturnFalse() {
when(mContext.getResources().getBoolean(com.android.settings.R.bool.has_dock_settings))
.thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void displayPreference_dockingSoundEnabled_shouldCheckedPreference() {
Global.putInt(mContentResolver, Global.DOCK_SOUNDS_ENABLED, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void displayPreference_dockingSoundDisabled_shouldUncheckedPreference() {
Global.putInt(mContentResolver, Global.DOCK_SOUNDS_ENABLED, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceChanged_preferenceChecked_shouldEnabledDockingSound() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, true);
assertThat(Global.getInt(mContentResolver, Global.DOCK_SOUNDS_ENABLED, 1)).isEqualTo(1);
}
@Test
public void onPreferenceChanged_preferenceUnchecked_shouldDisabledDockingSound() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, false);
assertThat(Global.getInt(mContentResolver, Global.DOCK_SOUNDS_ENABLED, 1)).isEqualTo(0);
}
}

View File

@@ -0,0 +1,143 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.Global;
import android.telephony.TelephonyManager;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class EmergencyTonePreferenceControllerTest {
@Mock
private TelephonyManager mTelephonyManager;
@Mock
private PreferenceScreen mScreen;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock
private Context mContext;
private EmergencyTonePreferenceController mController;
private DropDownPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
final Context appContext = ShadowApplication.getInstance().getApplicationContext();
when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
when(mTelephonyManager.getCurrentPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
when(mActivity.getResources()).thenReturn(appContext.getResources());
mPreference = new DropDownPreference(appContext);
mController = new EmergencyTonePreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_cdma_shouldReturnTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_notCdma_shouldReturnFalse() {
when(mTelephonyManager.getCurrentPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void displayPreference_emergencyToneOff_shouldSelectFirstItem() {
Global.putInt(mContentResolver, Global.EMERGENCY_TONE, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.getValue()).isEqualTo("0");
}
@Test
public void displayPreference_emergencyToneAlert_shouldSelectSecondItem() {
Global.putInt(mContentResolver, Global.EMERGENCY_TONE, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.getValue()).isEqualTo("1");
}
@Test
public void displayPreference_emergencyToneVibrate_shouldSelectThirdItem() {
Global.putInt(mContentResolver, Global.EMERGENCY_TONE, 2);
mController.displayPreference(mScreen);
assertThat(mPreference.getValue()).isEqualTo("2");
}
@Test
public void onPreferenceChanged_firstItemSelected_shouldSetEmergencyToneToOff() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, "0");
assertThat(Global.getInt(mContentResolver, Global.EMERGENCY_TONE, 0)).isEqualTo(0);
}
@Test
public void onPreferenceChanged_secondItemSelected_shouldSetEmergencyToneToAlert() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, "1");
assertThat(Global.getInt(mContentResolver, Global.EMERGENCY_TONE, 0)).isEqualTo(1);
}
@Test
public void onPreferenceChanged_thirdItemSelected_shouldSetEmergencyToneToVibrate() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, "2");
assertThat(Global.getInt(mContentResolver, Global.EMERGENCY_TONE, 0)).isEqualTo(2);
}
}

View File

@@ -0,0 +1,112 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.System;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class ScreenLockSoundPreferenceControllerTest {
@Mock
private PreferenceScreen mScreen;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock
private Context mContext;
private ScreenLockSoundPreferenceController mController;
private SwitchPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
mPreference = new SwitchPreference(ShadowApplication.getInstance().getApplicationContext());
mController = new ScreenLockSoundPreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_isAlwaysTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void displayPreference_lockScreenSoundEnabled_shouldCheckedPreference() {
System.putInt(mContentResolver, System.LOCKSCREEN_SOUNDS_ENABLED, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void displayPreference_lockScreenSoundDisabled_shouldUncheckedPreference() {
System.putInt(mContentResolver, System.LOCKSCREEN_SOUNDS_ENABLED, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceChanged_preferenceChecked_shouldEnabledLockScreenSound() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, true);
assertThat(System.getInt(mContentResolver, System.LOCKSCREEN_SOUNDS_ENABLED, 1))
.isEqualTo(1);
}
@Test
public void onPreferenceChanged_preferenceUnchecked_shouldDisabledLockScreenSound() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, false);
assertThat(System.getInt(mContentResolver, System.LOCKSCREEN_SOUNDS_ENABLED, 1))
.isEqualTo(0);
}
}

View File

@@ -0,0 +1,179 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings.Global;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.core.lifecycle.Lifecycle;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.android.settings.notification.SettingPref.TYPE_GLOBAL;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SettingPrefControllerTest {
@Mock
private PreferenceScreen mScreen;
@Mock
private OtherSoundSettings mSetting;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
private Context mContext;
private PreferenceControllerTestable mController;
private SettingPref mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(ShadowApplication.getInstance().getApplicationContext());
when(mContext.getContentResolver()).thenReturn(mContentResolver);
when(mSetting.getActivity()).thenReturn(mActivity);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
mController = new PreferenceControllerTestable(mContext, mSetting, null);
mPreference = mController.getPref();
}
@Test
public void displayPreference_shouldInitPreference() {
mController.displayPreference(mScreen);
verify(mPreference).init(mSetting);
}
@Test
public void isAvailable_shouldCallisApplicable() {
mController.isAvailable();
verify(mPreference).isApplicable(mContext);
}
@Test
public void getPreferenceKey_shouldReturnPrefKey() {
assertThat(mController.getPreferenceKey()).isEqualTo(mController.KEY_TEST);
}
@Test
public void updateState_shouldUpdatePreference() {
mController.updateState(null);
verify(mPreference).update(mContext);
}
@Test
public void onResume_shouldRegisterContentObserver() {
mController.displayPreference(mScreen);
mController.onResume();
verify(mContentResolver).registerContentObserver(
Global.getUriFor("Setting1"), false, mController.getObserver());
}
@Test
public void onPause_shouldUnregisterContentObserver() {
mController.displayPreference(mScreen);
mController.onPause();
verify(mContentResolver).unregisterContentObserver(mController.getObserver());
}
@Test
public void onContentChange_shouldUpdatePreference() {
mController.displayPreference(mScreen);
mController.onResume();
mController.getObserver().onChange(false, Global.getUriFor("Setting1"));
verify(mPreference).update(mContext);
}
@Test
public void updateNonIndexableKeys_applicable_shouldNotUpdate() {
final List<String> keys = new ArrayList<>();
mController.updateNonIndexableKeys(keys);
assertThat(keys).isEmpty();
}
@Test
public void updateNonIndexableKeys_notApplicable_shouldUpdate() {
mController.setApplicable(false);
final List<String> keys = new ArrayList<>();
mController.updateNonIndexableKeys(keys);
assertThat(keys).isNotEmpty();
}
private class PreferenceControllerTestable extends SettingPrefController {
private static final String KEY_TEST = "key1";
private boolean mApplicable = true;
public PreferenceControllerTestable(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
mPreference = spy(new SettingPref(
TYPE_GLOBAL, KEY_TEST, "Setting1", 1) {
@Override
public boolean isApplicable(Context context) {
return mApplicable;
}
});
}
SettingPref getPref() {
return mPreference;
}
PreferenceControllerTestable.SettingsObserver getObserver() {
return mSettingsObserver;
}
void setApplicable(boolean applicable) {
mApplicable = applicable;
}
}
}

View File

@@ -0,0 +1,116 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.media.AudioManager;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.System;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class TouchSoundPreferenceControllerTest {
@Mock
private AudioManager mAudioManager;
@Mock
private PreferenceScreen mScreen;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock
private Context mContext;
private TouchSoundPreferenceController mController;
private SwitchPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mActivity.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
mPreference = new SwitchPreference(ShadowApplication.getInstance().getApplicationContext());
mController = new TouchSoundPreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_isAlwaysTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void displayPreference_soundEffectEnabled_shouldCheckedPreference() {
System.putInt(mContentResolver, System.SOUND_EFFECTS_ENABLED, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void displayPreference_soundEffectDisabled_shouldUncheckedPreference() {
System.putInt(mContentResolver, System.SOUND_EFFECTS_ENABLED, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceChanged_preferenceChecked_shouldEnabledSoundEffect() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, true);
assertThat(System.getInt(mContentResolver, System.SOUND_EFFECTS_ENABLED, 1)).isEqualTo(1);
}
@Test
public void onPreferenceChanged_preferenceUnchecked_shouldDisabledSoundEffect() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, false);
assertThat(System.getInt(mContentResolver, System.SOUND_EFFECTS_ENABLED, 1)).isEqualTo(0);
}
}

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2017 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.notification;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Vibrator;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;
import android.provider.Settings.System;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class VibrateOnTouchPreferenceControllerTest {
@Mock
private PreferenceScreen mScreen;
@Mock
private Activity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private SoundSettings mSetting;
@Mock
private Context mContext;
@Mock
private Vibrator mVibrator;
private VibrateOnTouchPreferenceController mController;
private SwitchPreference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mActivity.getSystemService(Context.VIBRATOR_SERVICE)).thenReturn(mVibrator);
when(mContext.getSystemService(Context.VIBRATOR_SERVICE)).thenReturn(mVibrator);
when(mVibrator.hasVibrator()).thenReturn(true);
when(mSetting.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
mPreference = new SwitchPreference(ShadowApplication.getInstance().getApplicationContext());
mController = new VibrateOnTouchPreferenceController(mContext, mSetting, null);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
doReturn(mScreen).when(mSetting).getPreferenceScreen();
}
@Test
public void isAvailable_hasHaptic_shouldReturnTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_noHaptic_shouldReturnFalse() {
when(mVibrator.hasVibrator()).thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void displayPreference_hapticEnabled_shouldCheckedPreference() {
System.putInt(mContentResolver, System.HAPTIC_FEEDBACK_ENABLED, 1);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void displayPreference_hapticDisabled_shouldUncheckedPreference() {
System.putInt(mContentResolver, System.HAPTIC_FEEDBACK_ENABLED, 0);
mController.displayPreference(mScreen);
assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceChanged_preferenceChecked_shouldEnabledHaptic() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, true);
assertThat(System.getInt(mContentResolver, System.HAPTIC_FEEDBACK_ENABLED, 1)).isEqualTo(1);
}
@Test
public void onPreferenceChanged_preferenceUnchecked_shouldDisabledHaptic() {
mController.displayPreference(mScreen);
mPreference.getOnPreferenceChangeListener().onPreferenceChange(mPreference, false);
assertThat(System.getInt(mContentResolver, System.HAPTIC_FEEDBACK_ENABLED, 1)).isEqualTo(0);
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) 2017 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.testutils.shadow;
import android.os.SystemProperties;
import java.util.HashMap;
import java.util.Map;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowSystemProperties;
/**
* This class provides write capability to ShadowSystemProperties.
*/
@Implements(SystemProperties.class)
public class SettingsShadowSystemProperties extends ShadowSystemProperties {
private static final Map<String, String> sValues = new HashMap<>();
@Implementation
public static synchronized boolean getBoolean(String key, boolean def) {
if (sValues.containsKey(key)) {
String val = sValues.get(key);
return "y".equals(val) || "yes".equals(val) || "1".equals(val) || "true".equals(val)
|| "on".equals(val);
}
return ShadowSystemProperties.getBoolean(key, def);
}
public static synchronized void set(String key, String val) {
sValues.put(key, val);
}
public static synchronized void clear() {
sValues.clear();
}
}