summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorDan Murphy <D.Murphy@motorola.com>2009-08-12 15:15:43 -0500
committerMike Lockwood <lockwood@android.com>2009-08-17 15:23:24 -0400
commitc9f4eaf4388087f23aa97e55349850f0902a19d3 (patch)
tree2ee205d7cb4ef19df62cbb9e1afa568b63cd7d80 /services
parent56e7ba2928bce62283a62ad1c9d9f1ec7b54c24c (diff)
downloadframeworks_base-c9f4eaf4388087f23aa97e55349850f0902a19d3.zip
frameworks_base-c9f4eaf4388087f23aa97e55349850f0902a19d3.tar.gz
frameworks_base-c9f4eaf4388087f23aa97e55349850f0902a19d3.tar.bz2
Dock changes:Docking station intents
Docking station intents for dock switch driver. Add DockObserver and updated Intent.java and systemserver.jave Signed-off-by: Dan Murphy <D.Murphy@motorola.com> modified: core/java/android/content/Intent.java new file: services/java/com/android/server/DockObserver.java modified: services/java/com/android/server/SystemServer.java Docking station updates Add constants for the dock Signed-off-by: Dan Murphy <D.Murphy@motorola.com> Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/DockObserver.java115
-rw-r--r--services/java/com/android/server/SystemServer.java9
2 files changed, 124 insertions, 0 deletions
diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java
new file mode 100644
index 0000000..68ff416
--- /dev/null
+++ b/services/java/com/android/server/DockObserver.java
@@ -0,0 +1,115 @@
+/*
+ * 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.Handler;
+import android.os.Message;
+import android.os.UEventObserver;
+import android.util.Log;
+
+import java.io.FileReader;
+import java.io.FileNotFoundException;
+
+/**
+ * <p>DockObserver monitors for a docking station.
+ */
+class DockObserver extends UEventObserver {
+ private static final String TAG = DockObserver.class.getSimpleName();
+ private static final boolean LOG = false;
+
+ private static final String DOCK_UEVENT_MATCH = "DEVPATH=/devices/virtual/switch/dock";
+ private static final String DOCK_STATE_PATH = "/sys/class/switch/dock/state";
+
+ private int mDockState;
+ private boolean mPendingIntent;
+
+ private final Context mContext;
+
+ public DockObserver(Context context) {
+ mContext = context;
+
+ startObserving(DOCK_UEVENT_MATCH);
+
+ init(); // set initial status
+ }
+
+ @Override
+ public void onUEvent(UEventObserver.UEvent event) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Dock UEVENT: " + event.toString());
+ }
+
+ try {
+ update(Integer.parseInt(event.get("SWITCH_STATE")));
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "Could not parse switch state from event " + event);
+ }
+ }
+
+ private synchronized final void init() {
+ char[] buffer = new char[1024];
+
+ int newState = mDockState;
+ try {
+ FileReader file = new FileReader(DOCK_STATE_PATH);
+ int len = file.read(buffer, 0, 1024);
+ newState = Integer.valueOf((new String(buffer, 0, len)).trim());
+
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "This kernel does not have dock station support");
+ } catch (Exception e) {
+ Log.e(TAG, "" , e);
+ }
+
+ update(newState);
+ }
+
+ private synchronized final void update(int newState) {
+ if (newState != mDockState) {
+ mDockState = newState;
+
+ mPendingIntent = true;
+ mHandler.sendEmptyMessage(0);
+ }
+ }
+
+ private synchronized final void sendIntent() {
+ // Pack up the values and broadcast them to everyone
+ Intent intent = new Intent(Intent.ACTION_DOCK_EVENT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Intent.EXTRA_DOCK_STATE, mDockState);
+
+ // TODO: Should we require a permission?
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Broadcasting dock state " + mDockState);
+ }
+ ActivityManagerNative.broadcastStickyIntent(intent, null);
+ }
+
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (mPendingIntent) {
+ sendIntent();
+ mPendingIntent = false;
+ }
+ }
+ };
+}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 38bf63a..ce476eb 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -92,6 +92,7 @@ class ServerThread extends Thread {
BluetoothDeviceService bluetooth = null;
BluetoothA2dpService bluetoothA2dp = null;
HeadsetObserver headset = null;
+ DockObserver dock = null;
// Critical services...
try {
@@ -326,6 +327,14 @@ class ServerThread extends Thread {
}
try {
+ Log.i(TAG, "Starting DockObserver");
+ // Listen for dock station changes
+ dock = new DockObserver(context);
+ } catch (Throwable e) {
+ Log.e(TAG, "Failure starting DockObserver", e);
+ }
+
+ try {
Log.i(TAG, "Starting Backup Service");
ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context));
} catch (Throwable e) {