blob: 07f2a413259d50f6ba210c680373f6eb200cf6ff [file] [log] [blame]
Erik Gilling51e95df2013-06-26 11:06:51 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server;
18
19import android.content.BroadcastReceiver;
20import android.content.Context;
21import android.content.Intent;
22import android.content.IntentFilter;
23import android.content.pm.PackageManager;
24import android.database.ContentObserver;
25import android.hardware.input.InputManager;
26import android.hardware.IConsumerIrService;
27import android.os.Handler;
28import android.os.PowerManager;
29import android.os.Process;
30import android.os.RemoteException;
31import android.os.IBinder;
32import android.os.Binder;
33import android.os.ServiceManager;
34import android.os.SystemClock;
35import android.os.UserHandle;
36import android.os.WorkSource;
37import android.provider.Settings;
38import android.provider.Settings.SettingNotFoundException;
39import android.util.Slog;
40import android.view.InputDevice;
41
42import java.util.ArrayList;
43import java.util.LinkedList;
44import java.util.ListIterator;
45
46public class ConsumerIrService extends IConsumerIrService.Stub {
47 private static final String TAG = "ConsumerIrService";
48
49 private static final int MAX_XMIT_TIME = 2000000; /* in microseconds */
50
51 private static native int halOpen();
52 private static native int halTransmit(int halObject, int carrierFrequency, int[] pattern);
53 private static native int[] halGetCarrierFrequencies(int halObject);
54
55 private final Context mContext;
56 private final PowerManager.WakeLock mWakeLock;
57 private final int mHal;
58 private final Object mHalLock = new Object();
59
60 ConsumerIrService(Context context) {
61 mContext = context;
62 PowerManager pm = (PowerManager)context.getSystemService(
63 Context.POWER_SERVICE);
64 mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
65 mWakeLock.setReferenceCounted(true);
66
67 mHal = halOpen();
68 if (mHal == 0) {
69 Slog.w(TAG, "No IR HAL loaded");
70 }
71 }
72
73 @Override
74 public boolean hasIrEmitter() {
75 return mHal != 0;
76 }
77
78 private void throwIfNoIrEmitter() {
79 if (mHal == 0) {
80 throw new UnsupportedOperationException("IR emitter not available");
81 }
82 }
83
84
85 @Override
86 public void transmit(String packageName, int carrierFrequency, int[] pattern) {
87 if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.TRANSMIT_IR)
88 != PackageManager.PERMISSION_GRANTED) {
89 throw new SecurityException("Requires TRANSMIT_IR permission");
90 }
91
92 long totalXmitTime = 0;
93
94 for (int slice : pattern) {
95 if (slice <= 0) {
96 throw new IllegalArgumentException("Non-positive IR slice");
97 }
98 totalXmitTime += slice;
99 }
100
101 if (totalXmitTime > MAX_XMIT_TIME ) {
102 throw new IllegalArgumentException("IR pattern too long");
103 }
104
105 throwIfNoIrEmitter();
106
107 // Right now there is no mechanism to ensure fair queing of IR requests
108 synchronized (mHalLock) {
109 int err = halTransmit(mHal, carrierFrequency, pattern);
110
111 if (err < 0) {
112 Slog.e(TAG, "Error transmitting: " + err);
113 }
114 }
115 }
116
117 @Override
118 public int[] getCarrierFrequencies() {
119 if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.TRANSMIT_IR)
120 != PackageManager.PERMISSION_GRANTED) {
121 throw new SecurityException("Requires TRANSMIT_IR permission");
122 }
123
124 throwIfNoIrEmitter();
125
126 synchronized(mHalLock) {
127 return halGetCarrierFrequencies(mHal);
128 }
129 }
130}