blob: 9d050f9c369d976e2f790a8d7172160c9631867a [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
John Spurlockad494bc2014-07-19 15:56:19 -040027import java.io.FileDescriptor;
28import java.io.PrintWriter;
29
John Spurlock3346a802014-05-20 16:25:37 -040030/*
31 * Copyright (C) 2014 The Android Open Source Project
32 *
33 * Licensed under the Apache License, Version 2.0 (the "License");
34 * you may not use this file except in compliance with the License.
35 * You may obtain a copy of the License at
36 *
37 * http://www.apache.org/licenses/LICENSE-2.0
38 *
39 * Unless required by applicable law or agreed to in writing, software
40 * distributed under the License is distributed on an "AS IS" BASIS,
41 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
42 * See the License for the specific language governing permissions and
43 * limitations under the License.
44 */
45
46public class VolumeUI extends SystemUI {
47 private static final String TAG = "VolumeUI";
48 private static final String SETTING = "systemui_volume_controller"; // for testing
49 private static final Uri SETTING_URI = Settings.Global.getUriFor(SETTING);
50 private static final int DEFAULT = 1; // enabled by default
51
John Spurlock86005342014-05-23 11:58:00 -040052 private final Handler mHandler = new Handler();
John Spurlock1dad2722014-07-11 11:07:53 -040053
John Spurlock3346a802014-05-20 16:25:37 -040054 private AudioManager mAudioManager;
RoboErik19c95182014-06-23 15:38:48 -070055 private MediaSessionManager mMediaSessionManager;
John Spurlock3346a802014-05-20 16:25:37 -040056 private VolumeController mVolumeController;
RoboErik19c95182014-06-23 15:38:48 -070057 private RemoteVolumeController mRemoteVolumeController;
58
RoboErik19c95182014-06-23 15:38:48 -070059 private VolumePanel mPanel;
John Spurlock1dad2722014-07-11 11:07:53 -040060 private int mDismissDelay;
John Spurlock3346a802014-05-20 16:25:37 -040061
62 @Override
63 public void start() {
64 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
RoboErik19c95182014-06-23 15:38:48 -070065 mMediaSessionManager = (MediaSessionManager) mContext
66 .getSystemService(Context.MEDIA_SESSION_SERVICE);
67 initPanel();
68 mVolumeController = new VolumeController();
69 mRemoteVolumeController = new RemoteVolumeController();
John Spurlock86005342014-05-23 11:58:00 -040070 putComponent(VolumeComponent.class, mVolumeController);
John Spurlock3346a802014-05-20 16:25:37 -040071 updateController();
72 mContext.getContentResolver().registerContentObserver(SETTING_URI, false, mObserver);
73 }
74
John Spurlockad494bc2014-07-19 15:56:19 -040075 @Override
76 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
77 if (mPanel != null) {
78 mPanel.dump(fd, pw, args);
79 }
80 }
81
John Spurlock3346a802014-05-20 16:25:37 -040082 private void updateController() {
83 if (Settings.Global.getInt(mContext.getContentResolver(), SETTING, DEFAULT) != 0) {
John Spurlock3346a802014-05-20 16:25:37 -040084 Log.d(TAG, "Registering volume controller");
85 mAudioManager.setVolumeController(mVolumeController);
RoboErik19c95182014-06-23 15:38:48 -070086 mMediaSessionManager.setRemoteVolumeController(mRemoteVolumeController);
John Spurlock3346a802014-05-20 16:25:37 -040087 } else {
88 Log.d(TAG, "Unregistering volume controller");
89 mAudioManager.setVolumeController(null);
RoboErik19c95182014-06-23 15:38:48 -070090 mMediaSessionManager.setRemoteVolumeController(null);
John Spurlock3346a802014-05-20 16:25:37 -040091 }
92 }
93
RoboErik19c95182014-06-23 15:38:48 -070094 private void initPanel() {
John Spurlock1dad2722014-07-11 11:07:53 -040095 mDismissDelay = mContext.getResources().getInteger(R.integer.volume_panel_dismiss_delay);
John Spurlockeb2727b2014-07-19 23:11:36 -040096 mPanel = new VolumePanel(mContext, new ZenModeControllerImpl(mContext, mHandler));
John Spurlockae641c92014-06-30 18:11:40 -040097 mPanel.setCallback(new VolumePanel.Callback() {
RoboErik19c95182014-06-23 15:38:48 -070098 @Override
John Spurlockae641c92014-06-30 18:11:40 -040099 public void onZenSettings() {
RoboErik19c95182014-06-23 15:38:48 -0700100 mHandler.removeCallbacks(mStartZenSettings);
John Spurlockae641c92014-06-30 18:11:40 -0400101 mHandler.post(mStartZenSettings);
RoboErik19c95182014-06-23 15:38:48 -0700102 }
103
104 @Override
105 public void onInteraction() {
John Spurlockae641c92014-06-30 18:11:40 -0400106 final KeyguardViewMediator kvm = getComponent(KeyguardViewMediator.class);
107 if (kvm != null) {
108 kvm.userActivity();
109 }
RoboErik19c95182014-06-23 15:38:48 -0700110 }
John Spurlock33f4e042014-07-11 13:10:58 -0400111
112 @Override
113 public void onVisible(boolean visible) {
114 if (mAudioManager != null && mVolumeController != null) {
115 mAudioManager.notifyVolumeControllerVisible(mVolumeController, visible);
116 }
117 }
RoboErik19c95182014-06-23 15:38:48 -0700118 });
RoboErik19c95182014-06-23 15:38:48 -0700119 }
120
John Spurlock86005342014-05-23 11:58:00 -0400121 private final ContentObserver mObserver = new ContentObserver(mHandler) {
John Spurlock3346a802014-05-20 16:25:37 -0400122 public void onChange(boolean selfChange, Uri uri) {
123 if (SETTING_URI.equals(uri)) {
124 updateController();
125 }
126 }
127 };
128
RoboErik19c95182014-06-23 15:38:48 -0700129 private final Runnable mStartZenSettings = new Runnable() {
130 @Override
131 public void run() {
John Spurlock1dad2722014-07-11 11:07:53 -0400132 AsyncTask.execute(new Runnable() {
133 @Override
134 public void run() {
135 try {
136 // Dismiss the lock screen when Settings starts.
137 ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
138 } catch (RemoteException e) {
139 }
140 final Intent intent = ZenModePanel.ZEN_SETTINGS;
141 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
142 mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
John Spurlockc86f5732014-07-18 11:45:05 -0400143
144 // dismiss shade if showing
145 mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
John Spurlock1dad2722014-07-11 11:07:53 -0400146 }
147 });
John Spurlockad494bc2014-07-19 15:56:19 -0400148 mPanel.postDismiss(mDismissDelay);
RoboErik19c95182014-06-23 15:38:48 -0700149 }
150 };
151
John Spurlock3346a802014-05-20 16:25:37 -0400152 /** For now, simply host an unmodified base volume panel in this process. */
John Spurlock86005342014-05-23 11:58:00 -0400153 private final class VolumeController extends IVolumeController.Stub implements VolumeComponent {
John Spurlock3346a802014-05-20 16:25:37 -0400154
155 @Override
156 public void displaySafeVolumeWarning(int flags) throws RemoteException {
157 mPanel.postDisplaySafeVolumeWarning(flags);
158 }
159
160 @Override
161 public void volumeChanged(int streamType, int flags)
162 throws RemoteException {
163 mPanel.postVolumeChanged(streamType, flags);
164 }
165
166 @Override
167 public void masterVolumeChanged(int flags) throws RemoteException {
168 mPanel.postMasterVolumeChanged(flags);
169 }
170
171 @Override
172 public void masterMuteChanged(int flags) throws RemoteException {
173 mPanel.postMasterMuteChanged(flags);
174 }
175
176 @Override
177 public void setLayoutDirection(int layoutDirection)
178 throws RemoteException {
John Spurlock86005342014-05-23 11:58:00 -0400179 mPanel.postLayoutDirection(layoutDirection);
John Spurlock3346a802014-05-20 16:25:37 -0400180 }
181
182 @Override
183 public void dismiss() throws RemoteException {
John Spurlock1dad2722014-07-11 11:07:53 -0400184 mPanel.postDismiss(0);
John Spurlock3346a802014-05-20 16:25:37 -0400185 }
John Spurlock86005342014-05-23 11:58:00 -0400186
187 @Override
188 public ZenModeController getZenController() {
John Spurlockad494bc2014-07-19 15:56:19 -0400189 return mPanel.getZenController();
John Spurlock86005342014-05-23 11:58:00 -0400190 }
John Spurlock3346a802014-05-20 16:25:37 -0400191 }
RoboErik19c95182014-06-23 15:38:48 -0700192
193 private final class RemoteVolumeController extends IRemoteVolumeController.Stub {
194
195 @Override
196 public void remoteVolumeChanged(ISessionController binder, int flags)
197 throws RemoteException {
RoboErik8b4bffc2014-07-10 13:48:01 -0700198 MediaController controller = new MediaController(binder);
RoboErik19c95182014-06-23 15:38:48 -0700199 mPanel.postRemoteVolumeChanged(controller, flags);
200 }
201
202 @Override
203 public void updateRemoteController(ISessionController session) throws RemoteException {
204 mPanel.postRemoteSliderVisibility(session != null);
205 // TODO stash default session in case the slider can be opened other
206 // than by remoteVolumeChanged.
207 }
208 }
John Spurlock3346a802014-05-20 16:25:37 -0400209}