VolumeZen: SystemUI now hosts the volume dialog.
- Allow SystemUI to set the volume controller interface using
a new binder call to audio service.
- Remove VolumePanel's dependency on AudioService.
- Host the base VolumePanel in the SystemUI process.
Change-Id: I095d5a1a579d42b68d0f81abb4087bd0c754b876
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
new file mode 100644
index 0000000..9bd75b7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
@@ -0,0 +1,125 @@
+package com.android.systemui.volume;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.media.AudioManager;
+import android.media.IVolumeController;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.util.Log;
+
+import com.android.systemui.SystemUI;
+
+/*
+ * Copyright (C) 2014 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.
+ */
+
+public class VolumeUI extends SystemUI {
+ private static final String TAG = "VolumeUI";
+ private static final String SETTING = "systemui_volume_controller"; // for testing
+ private static final Uri SETTING_URI = Settings.Global.getUriFor(SETTING);
+ private static final int DEFAULT = 1; // enabled by default
+
+ private AudioManager mAudioManager;
+ private VolumeController mVolumeController;
+
+ @Override
+ public void start() {
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ updateController();
+ mContext.getContentResolver().registerContentObserver(SETTING_URI, false, mObserver);
+ }
+
+ private void updateController() {
+ if (Settings.Global.getInt(mContext.getContentResolver(), SETTING, DEFAULT) != 0) {
+ if (mVolumeController == null) {
+ mVolumeController = new VolumeController(mContext);
+ }
+ Log.d(TAG, "Registering volume controller");
+ mAudioManager.setVolumeController(mVolumeController);
+ } else {
+ Log.d(TAG, "Unregistering volume controller");
+ mAudioManager.setVolumeController(null);
+ }
+ }
+
+ private final ContentObserver mObserver = new ContentObserver(new Handler()) {
+ public void onChange(boolean selfChange, Uri uri) {
+ if (SETTING_URI.equals(uri)) {
+ updateController();
+ }
+ }
+ };
+
+ /** For now, simply host an unmodified base volume panel in this process. */
+ private final class VolumeController extends IVolumeController.Stub {
+ private final VolumePanel mPanel;
+
+ public VolumeController(Context context) {
+ mPanel = new VolumePanel(context);
+ }
+
+ @Override
+ public void hasNewRemotePlaybackInfo() throws RemoteException {
+ mPanel.postHasNewRemotePlaybackInfo();
+ }
+
+ @Override
+ public void remoteVolumeChanged(int streamType, int flags)
+ throws RemoteException {
+ mPanel.postRemoteVolumeChanged(streamType, flags);
+ }
+
+ @Override
+ public void remoteSliderVisibility(boolean visible)
+ throws RemoteException {
+ mPanel.postRemoteSliderVisibility(visible);
+ }
+
+ @Override
+ public void displaySafeVolumeWarning(int flags) throws RemoteException {
+ mPanel.postDisplaySafeVolumeWarning(flags);
+ }
+
+ @Override
+ public void volumeChanged(int streamType, int flags)
+ throws RemoteException {
+ mPanel.postVolumeChanged(streamType, flags);
+ }
+
+ @Override
+ public void masterVolumeChanged(int flags) throws RemoteException {
+ mPanel.postMasterVolumeChanged(flags);
+ }
+
+ @Override
+ public void masterMuteChanged(int flags) throws RemoteException {
+ mPanel.postMasterMuteChanged(flags);
+ }
+
+ @Override
+ public void setLayoutDirection(int layoutDirection)
+ throws RemoteException {
+ mPanel.setLayoutDirection(layoutDirection);
+ }
+
+ @Override
+ public void dismiss() throws RemoteException {
+ mPanel.postDismiss();
+ }
+ }
+}