summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/HeadsetObserver.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/HeadsetObserver.java')
-rw-r--r--services/java/com/android/server/HeadsetObserver.java123
1 files changed, 123 insertions, 0 deletions
diff --git a/services/java/com/android/server/HeadsetObserver.java b/services/java/com/android/server/HeadsetObserver.java
new file mode 100644
index 000000000000..9f7701d609d8
--- /dev/null
+++ b/services/java/com/android/server/HeadsetObserver.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2008 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.server;
+
+import android.app.ActivityManagerNative;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UEventObserver;
+import android.util.Log;
+import android.media.AudioManager;
+
+import java.io.FileReader;
+import java.io.FileNotFoundException;
+
+/**
+ * <p>HeadsetObserver monitors for a wired headset.
+ */
+class HeadsetObserver extends UEventObserver {
+ private static final String TAG = HeadsetObserver.class.getSimpleName();
+
+ private static final String HEADSET_UEVENT_MATCH = "DEVPATH=/class/switch/h2w";
+ private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";
+ private static final String HEADSET_NAME_PATH = "/sys/class/switch/h2w/name";
+
+ private Context mContext;
+
+ private int mHeadsetState;
+ private String mHeadsetName;
+
+ public HeadsetObserver(Context context) {
+ mContext = context;
+
+ startObserving(HEADSET_UEVENT_MATCH);
+
+ init(); // set initial status
+ }
+
+ @Override
+ public void onUEvent(UEventObserver.UEvent event) {
+ Log.v(TAG, "Headset UEVENT: " + event.toString());
+
+ try {
+ update(event.get("SWITCH_NAME"), Integer.parseInt(event.get("SWITCH_STATE")));
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "Could not parse switch state from event " + event);
+ }
+ }
+
+ private final void init() {
+ char[] buffer = new char[1024];
+
+ String newName = mHeadsetName;
+ int newState = mHeadsetState;
+ try {
+ FileReader file = new FileReader(HEADSET_STATE_PATH);
+ int len = file.read(buffer, 0, 1024);
+ newState = Integer.valueOf((new String(buffer, 0, len)).trim());
+
+ file = new FileReader(HEADSET_NAME_PATH);
+ len = file.read(buffer, 0, 1024);
+ newName = new String(buffer, 0, len).trim();
+
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "This kernel does not have wired headset support");
+ } catch (Exception e) {
+ Log.e(TAG, "" , e);
+ }
+
+ update(newName, newState);
+ }
+
+ private synchronized final void update(String newName, int newState) {
+ if (newName != mHeadsetName || newState != mHeadsetState) {
+ mHeadsetName = newName;
+ mHeadsetState = newState;
+ AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+
+ if (mHeadsetState == 1) {
+ audioManager.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_HEADSET,
+ AudioManager.ROUTE_ALL);
+ audioManager.setRouting(AudioManager.MODE_RINGTONE,
+ AudioManager.ROUTE_HEADSET | AudioManager.ROUTE_SPEAKER,
+ AudioManager.ROUTE_ALL);
+ audioManager.setRouting(AudioManager.MODE_IN_CALL, AudioManager.ROUTE_HEADSET,
+ AudioManager.ROUTE_ALL);
+ } else {
+ audioManager.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER,
+ AudioManager.ROUTE_ALL);
+ audioManager.setRouting(AudioManager.MODE_RINGTONE, AudioManager.ROUTE_SPEAKER,
+ AudioManager.ROUTE_ALL);
+ audioManager.setRouting(AudioManager.MODE_IN_CALL, AudioManager.ROUTE_EARPIECE,
+ AudioManager.ROUTE_ALL);
+ }
+ sendIntent();
+ }
+ }
+
+ private synchronized final void sendIntent() {
+ // Pack up the values and broadcast them to everyone
+ Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+
+ intent.putExtra("state", mHeadsetState);
+ intent.putExtra("name", mHeadsetName);
+
+ // TODO: Should we require a permission?
+ ActivityManagerNative.broadcastStickyIntent(intent, null);
+ }
+}