blob: 04a3b88345b7f571a7f6fe9011b544a5e193ca1d [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 Spurlock7e6809a2014-08-06 16:03:14 -04006import android.content.res.Configuration;
John Spurlock3346a802014-05-20 16:25:37 -04007import android.database.ContentObserver;
8import android.media.AudioManager;
RoboErik19c95182014-06-23 15:38:48 -07009import android.media.IRemoteVolumeController;
John Spurlock3346a802014-05-20 16:25:37 -040010import android.media.IVolumeController;
RoboErik19c95182014-06-23 15:38:48 -070011import android.media.session.ISessionController;
12import android.media.session.MediaController;
13import android.media.session.MediaSessionManager;
John Spurlock3346a802014-05-20 16:25:37 -040014import android.net.Uri;
John Spurlock1dad2722014-07-11 11:07:53 -040015import android.os.AsyncTask;
John Spurlock3346a802014-05-20 16:25:37 -040016import android.os.Handler;
17import android.os.RemoteException;
John Spurlock86005342014-05-23 11:58:00 -040018import android.os.UserHandle;
John Spurlock3346a802014-05-20 16:25:37 -040019import android.provider.Settings;
20import android.util.Log;
21
John Spurlock1dad2722014-07-11 11:07:53 -040022import com.android.systemui.R;
John Spurlock3346a802014-05-20 16:25:37 -040023import com.android.systemui.SystemUI;
John Spurlockae641c92014-06-30 18:11:40 -040024import com.android.systemui.keyguard.KeyguardViewMediator;
John Spurlock86005342014-05-23 11:58:00 -040025import com.android.systemui.statusbar.policy.ZenModeController;
26import com.android.systemui.statusbar.policy.ZenModeControllerImpl;
John Spurlock3346a802014-05-20 16:25:37 -040027
John Spurlockad494bc2014-07-19 15:56:19 -040028import java.io.FileDescriptor;
29import java.io.PrintWriter;
30
John Spurlock3346a802014-05-20 16:25:37 -040031/*
32 * Copyright (C) 2014 The Android Open Source Project
33 *
34 * Licensed under the Apache License, Version 2.0 (the "License");
35 * you may not use this file except in compliance with the License.
36 * You may obtain a copy of the License at
37 *
38 * http://www.apache.org/licenses/LICENSE-2.0
39 *
40 * Unless required by applicable law or agreed to in writing, software
41 * distributed under the License is distributed on an "AS IS" BASIS,
42 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
43 * See the License for the specific language governing permissions and
44 * limitations under the License.
45 */
46
47public class VolumeUI extends SystemUI {
48 private static final String TAG = "VolumeUI";
49 private static final String SETTING = "systemui_volume_controller"; // for testing
50 private static final Uri SETTING_URI = Settings.Global.getUriFor(SETTING);
51 private static final int DEFAULT = 1; // enabled by default
52
John Spurlock86005342014-05-23 11:58:00 -040053 private final Handler mHandler = new Handler();
John Spurlock1dad2722014-07-11 11:07:53 -040054
John Spurlock3346a802014-05-20 16:25:37 -040055 private AudioManager mAudioManager;
RoboErik19c95182014-06-23 15:38:48 -070056 private MediaSessionManager mMediaSessionManager;
John Spurlock3346a802014-05-20 16:25:37 -040057 private VolumeController mVolumeController;
RoboErik19c95182014-06-23 15:38:48 -070058 private RemoteVolumeController mRemoteVolumeController;
59
RoboErik19c95182014-06-23 15:38:48 -070060 private VolumePanel mPanel;
John Spurlock1dad2722014-07-11 11:07:53 -040061 private int mDismissDelay;
John Spurlock3346a802014-05-20 16:25:37 -040062
63 @Override
64 public void start() {
65 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
RoboErik19c95182014-06-23 15:38:48 -070066 mMediaSessionManager = (MediaSessionManager) mContext
67 .getSystemService(Context.MEDIA_SESSION_SERVICE);
68 initPanel();
69 mVolumeController = new VolumeController();
70 mRemoteVolumeController = new RemoteVolumeController();
John Spurlock86005342014-05-23 11:58:00 -040071 putComponent(VolumeComponent.class, mVolumeController);
John Spurlock3346a802014-05-20 16:25:37 -040072 updateController();
73 mContext.getContentResolver().registerContentObserver(SETTING_URI, false, mObserver);
74 }
75
John Spurlockad494bc2014-07-19 15:56:19 -040076 @Override
John Spurlock7e6809a2014-08-06 16:03:14 -040077 protected void onConfigurationChanged(Configuration newConfig) {
78 super.onConfigurationChanged(newConfig);
79 if (mPanel != null) {
80 mPanel.onConfigurationChanged(newConfig);
81 }
82 }
83
84 @Override
John Spurlockad494bc2014-07-19 15:56:19 -040085 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
86 if (mPanel != null) {
87 mPanel.dump(fd, pw, args);
88 }
89 }
90
John Spurlock3346a802014-05-20 16:25:37 -040091 private void updateController() {
92 if (Settings.Global.getInt(mContext.getContentResolver(), SETTING, DEFAULT) != 0) {
John Spurlock3346a802014-05-20 16:25:37 -040093 Log.d(TAG, "Registering volume controller");
94 mAudioManager.setVolumeController(mVolumeController);
RoboErik19c95182014-06-23 15:38:48 -070095 mMediaSessionManager.setRemoteVolumeController(mRemoteVolumeController);
John Spurlock3346a802014-05-20 16:25:37 -040096 } else {
97 Log.d(TAG, "Unregistering volume controller");
98 mAudioManager.setVolumeController(null);
RoboErik19c95182014-06-23 15:38:48 -070099 mMediaSessionManager.setRemoteVolumeController(null);
John Spurlock3346a802014-05-20 16:25:37 -0400100 }
101 }
102
RoboErik19c95182014-06-23 15:38:48 -0700103 private void initPanel() {
John Spurlock1dad2722014-07-11 11:07:53 -0400104 mDismissDelay = mContext.getResources().getInteger(R.integer.volume_panel_dismiss_delay);
John Spurlockeb2727b2014-07-19 23:11:36 -0400105 mPanel = new VolumePanel(mContext, new ZenModeControllerImpl(mContext, mHandler));
John Spurlockae641c92014-06-30 18:11:40 -0400106 mPanel.setCallback(new VolumePanel.Callback() {
RoboErik19c95182014-06-23 15:38:48 -0700107 @Override
John Spurlockae641c92014-06-30 18:11:40 -0400108 public void onZenSettings() {
RoboErik19c95182014-06-23 15:38:48 -0700109 mHandler.removeCallbacks(mStartZenSettings);
John Spurlockae641c92014-06-30 18:11:40 -0400110 mHandler.post(mStartZenSettings);
RoboErik19c95182014-06-23 15:38:48 -0700111 }
112
113 @Override
114 public void onInteraction() {
John Spurlockae641c92014-06-30 18:11:40 -0400115 final KeyguardViewMediator kvm = getComponent(KeyguardViewMediator.class);
116 if (kvm != null) {
117 kvm.userActivity();
118 }
RoboErik19c95182014-06-23 15:38:48 -0700119 }
John Spurlock33f4e042014-07-11 13:10:58 -0400120
121 @Override
122 public void onVisible(boolean visible) {
123 if (mAudioManager != null && mVolumeController != null) {
124 mAudioManager.notifyVolumeControllerVisible(mVolumeController, visible);
125 }
126 }
RoboErik19c95182014-06-23 15:38:48 -0700127 });
RoboErik19c95182014-06-23 15:38:48 -0700128 }
129
John Spurlock86005342014-05-23 11:58:00 -0400130 private final ContentObserver mObserver = new ContentObserver(mHandler) {
John Spurlock3346a802014-05-20 16:25:37 -0400131 public void onChange(boolean selfChange, Uri uri) {
132 if (SETTING_URI.equals(uri)) {
133 updateController();
134 }
135 }
136 };
137
RoboErik19c95182014-06-23 15:38:48 -0700138 private final Runnable mStartZenSettings = new Runnable() {
139 @Override
140 public void run() {
John Spurlock1dad2722014-07-11 11:07:53 -0400141 AsyncTask.execute(new Runnable() {
142 @Override
143 public void run() {
144 try {
145 // Dismiss the lock screen when Settings starts.
146 ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
147 } catch (RemoteException e) {
148 }
149 final Intent intent = ZenModePanel.ZEN_SETTINGS;
150 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
151 mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
John Spurlockc86f5732014-07-18 11:45:05 -0400152
153 // dismiss shade if showing
154 mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
John Spurlock1dad2722014-07-11 11:07:53 -0400155 }
156 });
John Spurlockad494bc2014-07-19 15:56:19 -0400157 mPanel.postDismiss(mDismissDelay);
RoboErik19c95182014-06-23 15:38:48 -0700158 }
159 };
160
John Spurlock3346a802014-05-20 16:25:37 -0400161 /** For now, simply host an unmodified base volume panel in this process. */
John Spurlock86005342014-05-23 11:58:00 -0400162 private final class VolumeController extends IVolumeController.Stub implements VolumeComponent {
John Spurlock3346a802014-05-20 16:25:37 -0400163
164 @Override
165 public void displaySafeVolumeWarning(int flags) throws RemoteException {
166 mPanel.postDisplaySafeVolumeWarning(flags);
167 }
168
169 @Override
170 public void volumeChanged(int streamType, int flags)
171 throws RemoteException {
172 mPanel.postVolumeChanged(streamType, flags);
173 }
174
175 @Override
176 public void masterVolumeChanged(int flags) throws RemoteException {
177 mPanel.postMasterVolumeChanged(flags);
178 }
179
180 @Override
181 public void masterMuteChanged(int flags) throws RemoteException {
182 mPanel.postMasterMuteChanged(flags);
183 }
184
185 @Override
186 public void setLayoutDirection(int layoutDirection)
187 throws RemoteException {
John Spurlock86005342014-05-23 11:58:00 -0400188 mPanel.postLayoutDirection(layoutDirection);
John Spurlock3346a802014-05-20 16:25:37 -0400189 }
190
191 @Override
192 public void dismiss() throws RemoteException {
John Spurlock1dad2722014-07-11 11:07:53 -0400193 mPanel.postDismiss(0);
John Spurlock3346a802014-05-20 16:25:37 -0400194 }
John Spurlock86005342014-05-23 11:58:00 -0400195
196 @Override
197 public ZenModeController getZenController() {
John Spurlockad494bc2014-07-19 15:56:19 -0400198 return mPanel.getZenController();
John Spurlock86005342014-05-23 11:58:00 -0400199 }
John Spurlock3346a802014-05-20 16:25:37 -0400200 }
RoboErik19c95182014-06-23 15:38:48 -0700201
202 private final class RemoteVolumeController extends IRemoteVolumeController.Stub {
203
204 @Override
205 public void remoteVolumeChanged(ISessionController binder, int flags)
206 throws RemoteException {
RoboErik031149c2014-07-25 16:00:52 -0700207 MediaController controller = new MediaController(mContext, binder);
RoboErik19c95182014-06-23 15:38:48 -0700208 mPanel.postRemoteVolumeChanged(controller, flags);
209 }
210
211 @Override
212 public void updateRemoteController(ISessionController session) throws RemoteException {
213 mPanel.postRemoteSliderVisibility(session != null);
214 // TODO stash default session in case the slider can be opened other
215 // than by remoteVolumeChanged.
216 }
217 }
John Spurlock3346a802014-05-20 16:25:37 -0400218}