1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.testing.testinput;
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.ComponentName;
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.ServiceConnection;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.IBinder;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.RemoteException;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.SystemClock;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.Log;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.ChannelInfo;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/**
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Connection for controlling the Test TV Input Service.
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * <p>Wrapped methods for calling {@link ITestInputControl} that waits for a binding and rethrows
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * {@link RemoteException} as {@link RuntimeException } are also included.
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class TestInputControlConnection implements ServiceConnection {
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TAG = "TestInputControlConn";
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final int BOUND_CHECK_INTERVAL_MS = 10;
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private ITestInputControl mControl;
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onServiceConnected(ComponentName name, IBinder service) {
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mControl = ITestInputControl.Stub.asInterface(service);
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onServiceDisconnected(ComponentName name) {
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Log.w(TAG, "TestInputControl service disconnected unexpectedly.");
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mControl = null;
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Is the service currently connected.
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public boolean isBound() {
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mControl != null;
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Update the state of the channel.
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     *
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * @param channel the channel to update.
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * @param data    the new state for the channel.
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void updateChannelState(ChannelInfo channel, ChannelStateData data) {
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        waitUntilBound();
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        try {
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mControl.updateChannelState(channel.originalNetworkId, data);
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        } catch (RemoteException e) {
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            throw new RuntimeException(e);
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Sleep until {@link #isBound()} is true;
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void waitUntilBound() {
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        while (!isBound()) {
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            SystemClock.sleep(BOUND_CHECK_INTERVAL_MS);
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
81