blob: e4f58703b27092909d722e1272fc471f4bbba9c5 [file] [log] [blame]
John Spurlock3346a802014-05-20 16:25:37 -04001package com.android.systemui.volume;
2
John Spurlockae641c92014-06-30 18:11:40 -04003import android.app.ActivityManagerNative;
John Spurlock3346a802014-05-20 16:25:37 -04004import android.content.Context;
John Spurlock86005342014-05-23 11:58:00 -04005import android.content.Intent;
John Spurlock3346a802014-05-20 16:25:37 -04006import android.database.ContentObserver;
7import android.media.AudioManager;
RoboErik19c95182014-06-23 15:38:48 -07008import android.media.IRemoteVolumeController;
John Spurlock3346a802014-05-20 16:25:37 -04009import android.media.IVolumeController;
RoboErik19c95182014-06-23 15:38:48 -070010import android.media.session.ISessionController;
11import android.media.session.MediaController;
12import android.media.session.MediaSessionManager;
John Spurlock3346a802014-05-20 16:25:37 -040013import android.net.Uri;
John Spurlock1dad2722014-07-11 11:07:53 -040014import android.os.AsyncTask;
John Spurlock3346a802014-05-20 16:25:37 -040015import android.os.Handler;
16import android.os.RemoteException;
John Spurlock86005342014-05-23 11:58:00 -040017import android.os.UserHandle;
John Spurlock3346a802014-05-20 16:25:37 -040018import android.provider.Settings;
19import android.util.Log;
20
John Spurlock1dad2722014-07-11 11:07:53 -040021import com.android.systemui.R;
John Spurlock3346a802014-05-20 16:25:37 -040022import com.android.systemui.SystemUI;
John Spurlockae641c92014-06-30 18:11:40 -040023import com.android.systemui.keyguard.KeyguardViewMediator;
John Spurlock86005342014-05-23 11:58:00 -040024import com.android.systemui.statusbar.policy.ZenModeController;
25import com.android.systemui.statusbar.policy.ZenModeControllerImpl;
John Spurlock3346a802014-05-20 16:25:37 -040026
27/*
28 * Copyright (C) 2014 The Android Open Source Project
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 */
42
43public class VolumeUI extends SystemUI {
44 private static final String TAG = "VolumeUI";
45 private static final String SETTING = "systemui_volume_controller"; // for testing
46 private static final Uri SETTING_URI = Settings.Global.getUriFor(SETTING);
47 private static final int DEFAULT = 1; // enabled by default
48
John Spurlock86005342014-05-23 11:58:00 -040049 private final Handler mHandler = new Handler();
John Spurlock1dad2722014-07-11 11:07:53 -040050
John Spurlock3346a802014-05-20 16:25:37 -040051 private AudioManager mAudioManager;
RoboErik19c95182014-06-23 15:38:48 -070052 private MediaSessionManager mMediaSessionManager;
John Spurlock3346a802014-05-20 16:25:37 -040053 private VolumeController mVolumeController;
RoboErik19c95182014-06-23 15:38:48 -070054 private RemoteVolumeController mRemoteVolumeController;
55
56 private VolumePanel mDialogPanel;
57 private VolumePanel mPanel;
John Spurlock1dad2722014-07-11 11:07:53 -040058 private int mDismissDelay;
John Spurlock3346a802014-05-20 16:25:37 -040059
60 @Override
61 public void start() {
62 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
RoboErik19c95182014-06-23 15:38:48 -070063 mMediaSessionManager = (MediaSessionManager) mContext
64 .getSystemService(Context.MEDIA_SESSION_SERVICE);
65 initPanel();
66 mVolumeController = new VolumeController();
67 mRemoteVolumeController = new RemoteVolumeController();
John Spurlock86005342014-05-23 11:58:00 -040068 putComponent(VolumeComponent.class, mVolumeController);
John Spurlock3346a802014-05-20 16:25:37 -040069 updateController();
70 mContext.getContentResolver().registerContentObserver(SETTING_URI, false, mObserver);
71 }
72
73 private void updateController() {
74 if (Settings.Global.getInt(mContext.getContentResolver(), SETTING, DEFAULT) != 0) {
John Spurlock3346a802014-05-20 16:25:37 -040075 Log.d(TAG, "Registering volume controller");
76 mAudioManager.setVolumeController(mVolumeController);
RoboErik19c95182014-06-23 15:38:48 -070077 mMediaSessionManager.setRemoteVolumeController(mRemoteVolumeController);
John Spurlock3346a802014-05-20 16:25:37 -040078 } else {
79 Log.d(TAG, "Unregistering volume controller");
80 mAudioManager.setVolumeController(null);
RoboErik19c95182014-06-23 15:38:48 -070081 mMediaSessionManager.setRemoteVolumeController(null);
John Spurlock3346a802014-05-20 16:25:37 -040082 }
83 }
84
RoboErik19c95182014-06-23 15:38:48 -070085 private void initPanel() {
John Spurlock1dad2722014-07-11 11:07:53 -040086 mDismissDelay = mContext.getResources().getInteger(R.integer.volume_panel_dismiss_delay);
RoboErik19c95182014-06-23 15:38:48 -070087 mPanel = new VolumePanel(mContext, null, new ZenModeControllerImpl(mContext, mHandler));
John Spurlockae641c92014-06-30 18:11:40 -040088 mPanel.setCallback(new VolumePanel.Callback() {
RoboErik19c95182014-06-23 15:38:48 -070089 @Override
John Spurlockae641c92014-06-30 18:11:40 -040090 public void onZenSettings() {
RoboErik19c95182014-06-23 15:38:48 -070091 mHandler.removeCallbacks(mStartZenSettings);
John Spurlockae641c92014-06-30 18:11:40 -040092 mHandler.post(mStartZenSettings);
RoboErik19c95182014-06-23 15:38:48 -070093 }
94
95 @Override
96 public void onInteraction() {
John Spurlockae641c92014-06-30 18:11:40 -040097 final KeyguardViewMediator kvm = getComponent(KeyguardViewMediator.class);
98 if (kvm != null) {
99 kvm.userActivity();
100 }
RoboErik19c95182014-06-23 15:38:48 -0700101 }
102 });
103 mDialogPanel = mPanel;
104 }
105
John Spurlock86005342014-05-23 11:58:00 -0400106 private final ContentObserver mObserver = new ContentObserver(mHandler) {
John Spurlock3346a802014-05-20 16:25:37 -0400107 public void onChange(boolean selfChange, Uri uri) {
108 if (SETTING_URI.equals(uri)) {
109 updateController();
110 }
111 }
112 };
113
RoboErik19c95182014-06-23 15:38:48 -0700114 private final Runnable mStartZenSettings = new Runnable() {
115 @Override
116 public void run() {
John Spurlock1dad2722014-07-11 11:07:53 -0400117 AsyncTask.execute(new Runnable() {
118 @Override
119 public void run() {
120 try {
121 // Dismiss the lock screen when Settings starts.
122 ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
123 } catch (RemoteException e) {
124 }
125 final Intent intent = ZenModePanel.ZEN_SETTINGS;
126 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
127 mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
128 }
129 });
130 mDialogPanel.postDismiss(mDismissDelay);
RoboErik19c95182014-06-23 15:38:48 -0700131 }
132 };
133
John Spurlock3346a802014-05-20 16:25:37 -0400134 /** For now, simply host an unmodified base volume panel in this process. */
John Spurlock86005342014-05-23 11:58:00 -0400135 private final class VolumeController extends IVolumeController.Stub implements VolumeComponent {
John Spurlock3346a802014-05-20 16:25:37 -0400136
137 @Override
138 public void displaySafeVolumeWarning(int flags) throws RemoteException {
139 mPanel.postDisplaySafeVolumeWarning(flags);
140 }
141
142 @Override
143 public void volumeChanged(int streamType, int flags)
144 throws RemoteException {
145 mPanel.postVolumeChanged(streamType, flags);
146 }
147
148 @Override
149 public void masterVolumeChanged(int flags) throws RemoteException {
150 mPanel.postMasterVolumeChanged(flags);
151 }
152
153 @Override
154 public void masterMuteChanged(int flags) throws RemoteException {
155 mPanel.postMasterMuteChanged(flags);
156 }
157
158 @Override
159 public void setLayoutDirection(int layoutDirection)
160 throws RemoteException {
John Spurlock86005342014-05-23 11:58:00 -0400161 mPanel.postLayoutDirection(layoutDirection);
John Spurlock3346a802014-05-20 16:25:37 -0400162 }
163
164 @Override
165 public void dismiss() throws RemoteException {
John Spurlock1dad2722014-07-11 11:07:53 -0400166 mPanel.postDismiss(0);
John Spurlock3346a802014-05-20 16:25:37 -0400167 }
John Spurlock86005342014-05-23 11:58:00 -0400168
169 @Override
170 public ZenModeController getZenController() {
171 return mDialogPanel.getZenController();
172 }
173
174 @Override
175 public void setVolumePanel(VolumePanel panel) {
176 mPanel = panel == null ? mDialogPanel : panel;
177 }
John Spurlock3346a802014-05-20 16:25:37 -0400178 }
RoboErik19c95182014-06-23 15:38:48 -0700179
180 private final class RemoteVolumeController extends IRemoteVolumeController.Stub {
181
182 @Override
183 public void remoteVolumeChanged(ISessionController binder, int flags)
184 throws RemoteException {
185 MediaController controller = MediaController.fromBinder(binder);
186 mPanel.postRemoteVolumeChanged(controller, flags);
187 }
188
189 @Override
190 public void updateRemoteController(ISessionController session) throws RemoteException {
191 mPanel.postRemoteSliderVisibility(session != null);
192 // TODO stash default session in case the slider can be opened other
193 // than by remoteVolumeChanged.
194 }
195 }
John Spurlock3346a802014-05-20 16:25:37 -0400196}