/* * Copyright (C) 2016 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 android.car.cluster.renderer; import android.annotation.CallSuper; import android.annotation.MainThread; import android.annotation.SystemApi; import android.app.Service; import android.car.CarLibLog; import android.car.navigation.CarNavigationInstrumentCluster; import android.content.Intent; import android.graphics.Bitmap; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.util.Log; import android.util.Pair; import android.view.KeyEvent; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; /** * A service that used for interaction between Car Service and Instrument Cluster. Car Service may * provide internal navigation binder interface to Navigation App and all notifications will be * eventually land in the {@link NavigationRenderer} returned by {@link #getNavigationRenderer()}. * *
To extend this class, you must declare the service in your manifest file with * the {@code android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE} permission *
* <service android:name=".MyInstrumentClusterService" * android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"> * </service>*
Also, you will need to register this service in the following configuration file:
* {@code packages/services/Car/service/res/values/config.xml}
*
* @hide
*/
@SystemApi
public abstract class InstrumentClusterRenderingService extends Service {
private static final String TAG = CarLibLog.TAG_CLUSTER;
private RendererBinder mRendererBinder;
@Override
@CallSuper
public IBinder onBind(Intent intent) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "onBind, intent: " + intent);
}
if (mRendererBinder == null) {
mRendererBinder = new RendererBinder(getNavigationRenderer());
}
return mRendererBinder;
}
/** Returns {@link NavigationRenderer} or null if it's not supported. */
@MainThread
protected abstract NavigationRenderer getNavigationRenderer();
/** Called when key event that was addressed to instrument cluster display has been received. */
@MainThread
protected void onKeyEvent(KeyEvent keyEvent) {
}
@Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
writer.println("**" + getClass().getSimpleName() + "**");
writer.println("renderer binder: " + mRendererBinder);
if (mRendererBinder != null) {
writer.println("navigation renderer: " + mRendererBinder.mNavigationRenderer);
String owner = "none";
if (mRendererBinder.mNavContextOwner != null) {
owner = "[uid: " + mRendererBinder.mNavContextOwner.first
+ ", pid: " + mRendererBinder.mNavContextOwner.second + "]";
}
writer.println("navigation focus owner: " + owner);
}
}
private class RendererBinder extends IInstrumentCluster.Stub {
private final NavigationRenderer mNavigationRenderer;
private final UiHandler mUiHandler;
private volatile NavigationBinder mNavigationBinder;
private volatile Pair