/* * Copyright (C) 2015 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.systemui.volume; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.media.AudioManager; import android.media.VolumePolicy; import android.os.Bundle; import android.os.Handler; import android.view.WindowManager.LayoutParams; import com.android.settingslib.applications.InterestingConfigChanges; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.Dependency; import com.android.systemui.SystemUI; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.plugins.VolumeDialog; import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.statusbar.policy.ExtensionController; import com.android.systemui.statusbar.policy.ExtensionController.Extension; import com.android.systemui.tuner.TunerService; import java.io.FileDescriptor; import java.io.PrintWriter; /** * Implementation of VolumeComponent backed by the new volume dialog. */ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tunable, VolumeDialogControllerImpl.UserActivityListener{ public static final String VOLUME_DOWN_SILENT = "sysui_volume_down_silent"; public static final String VOLUME_UP_SILENT = "sysui_volume_up_silent"; public static final String VOLUME_SILENT_DO_NOT_DISTURB = "sysui_do_not_disturb"; public static final boolean DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT = true; public static final boolean DEFAULT_VOLUME_UP_TO_EXIT_SILENT = true; public static final boolean DEFAULT_DO_NOT_DISTURB_WHEN_SILENT = true; private final SystemUI mSysui; private final Context mContext; private final VolumeDialogControllerImpl mController; private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_LOCALE | ActivityInfo.CONFIG_ASSETS_PATHS); private final Extension mExtension; private VolumeDialog mDialog; private VolumePolicy mVolumePolicy = new VolumePolicy( DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT, // volumeDownToEnterSilent DEFAULT_VOLUME_UP_TO_EXIT_SILENT, // volumeUpToExitSilent DEFAULT_DO_NOT_DISTURB_WHEN_SILENT, // doNotDisturbWhenSilent 400 // vibrateToSilentDebounce ); public VolumeDialogComponent(SystemUI sysui, Context context, Handler handler) { mSysui = sysui; mContext = context; mController = (VolumeDialogControllerImpl) Dependency.get(VolumeDialogController.class); mController.setUserActivityListener(this); // Allow plugins to reference the VolumeDialogController. Dependency.get(PluginDependencyProvider.class) .allowPluginDependency(VolumeDialogController.class); mExtension = Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class) .withPlugin(VolumeDialog.class) .withDefault(this::createDefault) .withCallback(dialog -> { if (mDialog != null) { mDialog.destroy(); } mDialog = dialog; mDialog.init(LayoutParams.TYPE_VOLUME_OVERLAY, mVolumeDialogCallback); }).build(); applyConfiguration(); Dependency.get(TunerService.class).addTunable(this, VOLUME_DOWN_SILENT, VOLUME_UP_SILENT, VOLUME_SILENT_DO_NOT_DISTURB); } private VolumeDialog createDefault() { VolumeDialogImpl impl = new VolumeDialogImpl(mContext); impl.setStreamImportant(AudioManager.STREAM_ALARM, true); impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false); impl.setAutomute(true); impl.setSilentMode(false); return impl; } @Override public void onTuningChanged(String key, String newValue) { if (VOLUME_DOWN_SILENT.equals(key)) { final boolean volumeDownToEnterSilent = newValue != null ? Integer.parseInt(newValue) != 0 : DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT; setVolumePolicy(volumeDownToEnterSilent, mVolumePolicy.volumeUpToExitSilent, mVolumePolicy.doNotDisturbWhenSilent, mVolumePolicy.vibrateToSilentDebounce); } else if (VOLUME_UP_SILENT.equals(key)) { final boolean volumeUpToExitSilent = newValue != null ? Integer.parseInt(newValue) != 0 : DEFAULT_VOLUME_UP_TO_EXIT_SILENT; setVolumePolicy(mVolumePolicy.volumeDownToEnterSilent, volumeUpToExitSilent, mVolumePolicy.doNotDisturbWhenSilent, mVolumePolicy.vibrateToSilentDebounce); } else if (VOLUME_SILENT_DO_NOT_DISTURB.equals(key)) { final boolean doNotDisturbWhenSilent = newValue != null ? Integer.parseInt(newValue) != 0 : DEFAULT_DO_NOT_DISTURB_WHEN_SILENT; setVolumePolicy(mVolumePolicy.volumeDownToEnterSilent, mVolumePolicy.volumeUpToExitSilent, doNotDisturbWhenSilent, mVolumePolicy.vibrateToSilentDebounce); } } private void setVolumePolicy(boolean volumeDownToEnterSilent, boolean volumeUpToExitSilent, boolean doNotDisturbWhenSilent, int vibrateToSilentDebounce) { mVolumePolicy = new VolumePolicy(volumeDownToEnterSilent, volumeUpToExitSilent, doNotDisturbWhenSilent, vibrateToSilentDebounce); mController.setVolumePolicy(mVolumePolicy); } @Override public void onUserActivity() { final KeyguardViewMediator kvm = mSysui.getComponent(KeyguardViewMediator.class); if (kvm != null) { kvm.userActivity(); } } private void applyConfiguration() { mController.setVolumePolicy(mVolumePolicy); mController.showDndTile(true); } @Override public void onConfigurationChanged(Configuration newConfig) { if (mConfigChanges.applyNewConfig(mContext.getResources())) { mExtension.reload(); } } @Override public void dismissNow() { mController.dismiss(); } @Override public void dispatchDemoCommand(String command, Bundle args) { // noop } @Override public void register() { mController.register(); DndTile.setCombinedIcon(mContext, true); } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { } private void startSettings(Intent intent) { Dependency.get(ActivityStarter.class).startActivity(intent, true /* onlyProvisioned */, true /* dismissShade */); } private final VolumeDialogImpl.Callback mVolumeDialogCallback = new VolumeDialogImpl.Callback() { @Override public void onZenSettingsClicked() { startSettings(ZenModePanel.ZEN_SETTINGS); } @Override public void onZenPrioritySettingsClicked() { startSettings(ZenModePanel.ZEN_PRIORITY_SETTINGS); } }; }