1 /*
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 
17 package android.hardware;
18 
19 import android.content.Context;
20 import android.os.RemoteException;
21 import android.os.ServiceManager;
22 import 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
29  * {@link android.content.Context#getSystemService(java.lang.String)
30  * Context.getSystemService()} with
31  * {@link android.content.Context#CONSUMER_IR_SERVICE} as the argument.
32  * </p>
33  */
34 public 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      */
ConsumerIrManager(Context context)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      */
hasIrEmitter()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) {
63         }
64         return false;
65     }
66 
67     /**
68      * Transmit an infrared pattern
69      * <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      */
transmit(int carrierFrequency, int[] pattern)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) {
87             Log.w(TAG, "failed to transmit.", e);
88         }
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          */
CarrierFrequencyRange(int min, int max)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          */
getMinFrequency()113         public int getMinFrequency() {
114             return mMinFrequency;
115         }
116 
117         /**
118          * Get the maximum (inclusive) frequency in this range segment.
119          */
getMaxFrequency()120         public int getMaxFrequency() {
121             return mMaxFrequency;
122         }
123     };
124 
125     /**
126      * Query the infrared transmitter's supported carrier frequencies
127      *
128      * @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.
132      */
getCarrierFrequencies()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) {
152         }
153         return null;
154     }
155 
156 }
157