blob: 9fa1c3f738239d4eacfd2d3e877da66a7e2bae3f [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 android.hardware;
18
19import android.content.Context;
20import android.os.RemoteException;
21import android.os.ServiceManager;
22import android.util.Log;
23
24/**
25 * Class that operates consumer infrared on the device.
26 *
27 * <p>
28 * To obtain an instance of the system infrared transmitter, call
Alex Ray1e679442013-09-11 14:34:25 -070029 * {@link android.content.Context#getSystemService(java.lang.String)
30 * Context.getSystemService()} with
31 * {@link android.content.Context#CONSUMER_IR_SERVICE} as the argument.
Erik Gilling51e95df2013-06-26 11:06:51 -070032 * </p>
33 */
34public final class ConsumerIrManager {
35 private static final String TAG = "ConsumerIr";
36
37 private final String mPackageName;
38 private final IConsumerIrService mService;
39
40 /**
41 * @hide to prevent subclassing from outside of the framework
42 */
43 public ConsumerIrManager(Context context) {
44 mPackageName = context.getPackageName();
45 mService = IConsumerIrService.Stub.asInterface(
46 ServiceManager.getService(Context.CONSUMER_IR_SERVICE));
47 }
48
49 /**
50 * Check whether the device has an infrared emitter.
51 *
52 * @return true if the device has an infrared emitter, else false.
53 */
54 public boolean hasIrEmitter() {
55 if (mService == null) {
56 Log.w(TAG, "no consumer ir service.");
57 return false;
58 }
59
60 try {
61 return mService.hasIrEmitter();
62 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -070063 throw e.rethrowFromSystemServer();
Erik Gilling51e95df2013-06-26 11:06:51 -070064 }
Erik Gilling51e95df2013-06-26 11:06:51 -070065 }
66
67 /**
Martin Storsjo991c1002014-01-24 11:57:59 +020068 * Transmit an infrared pattern
Erik Gilling51e95df2013-06-26 11:06:51 -070069 * <p>
70 * This method is synchronous; when it returns the pattern has
71 * been transmitted. Only patterns shorter than 2 seconds will
72 * be transmitted.
73 * </p>
74 *
75 * @param carrierFrequency The IR carrier frequency in Hertz.
76 * @param pattern The alternating on/off pattern in microseconds to transmit.
77 */
78 public void transmit(int carrierFrequency, int[] pattern) {
79 if (mService == null) {
80 Log.w(TAG, "failed to transmit; no consumer ir service.");
81 return;
82 }
83
84 try {
85 mService.transmit(mPackageName, carrierFrequency, pattern);
86 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -070087 throw e.rethrowFromSystemServer();
Erik Gilling51e95df2013-06-26 11:06:51 -070088 }
89 }
90
91 /**
92 * Represents a range of carrier frequencies (inclusive) on which the
93 * infrared transmitter can transmit
94 */
95 public final class CarrierFrequencyRange {
96 private final int mMinFrequency;
97 private final int mMaxFrequency;
98
99 /**
100 * Create a segment of a carrier frequency range.
101 *
102 * @param min The minimum transmittable frequency in this range segment.
103 * @param max The maximum transmittable frequency in this range segment.
104 */
105 public CarrierFrequencyRange(int min, int max) {
106 mMinFrequency = min;
107 mMaxFrequency = max;
108 }
109
110 /**
111 * Get the minimum (inclusive) frequency in this range segment.
112 */
113 public int getMinFrequency() {
114 return mMinFrequency;
115 }
116
117 /**
118 * Get the maximum (inclusive) frequency in this range segment.
119 */
120 public int getMaxFrequency() {
121 return mMaxFrequency;
122 }
123 };
124
125 /**
126 * Query the infrared transmitter's supported carrier frequencies
127 *
Alex Ray1e679442013-09-11 14:34:25 -0700128 * @return an array of
129 * {@link android.hardware.ConsumerIrManager.CarrierFrequencyRange}
130 * objects representing the ranges that the transmitter can support, or
131 * null if there was an error communicating with the Consumer IR Service.
Erik Gilling51e95df2013-06-26 11:06:51 -0700132 */
133 public CarrierFrequencyRange[] getCarrierFrequencies() {
134 if (mService == null) {
135 Log.w(TAG, "no consumer ir service.");
136 return null;
137 }
138
139 try {
140 int[] freqs = mService.getCarrierFrequencies();
141 if (freqs.length % 2 != 0) {
142 Log.w(TAG, "consumer ir service returned an uneven number of frequencies.");
143 return null;
144 }
145 CarrierFrequencyRange[] range = new CarrierFrequencyRange[freqs.length / 2];
146
147 for (int i = 0; i < freqs.length; i += 2) {
148 range[i / 2] = new CarrierFrequencyRange(freqs[i], freqs[i+1]);
149 }
150 return range;
151 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700152 throw e.rethrowFromSystemServer();
Erik Gilling51e95df2013-06-26 11:06:51 -0700153 }
Erik Gilling51e95df2013-06-26 11:06:51 -0700154 }
Erik Gilling51e95df2013-06-26 11:06:51 -0700155}