diff options
author | Dan Murphy <D.Murphy@motorola.com> | 2009-08-12 15:15:43 -0500 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2009-08-17 15:23:24 -0400 |
commit | c9f4eaf4388087f23aa97e55349850f0902a19d3 (patch) | |
tree | 2ee205d7cb4ef19df62cbb9e1afa568b63cd7d80 /services | |
parent | 56e7ba2928bce62283a62ad1c9d9f1ec7b54c24c (diff) | |
download | frameworks_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.java | 115 | ||||
-rw-r--r-- | services/java/com/android/server/SystemServer.java | 9 |
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) { |