Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31f97c17 authored by Hongguang Chen's avatar Hongguang Chen Committed by Automerger Merge Worker
Browse files

Merge "Extend JNI for TVMessages" into udc-dev am: 548abaa0

parents 2cae69d2 548abaa0
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.tv;
import android.hardware.tv.input.V1_0.Constants;
import android.media.tv.TvInputHardwareInfo;
import android.media.tv.TvStreamConfig;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.MessageQueue;
@@ -45,12 +46,15 @@ final class TvInputHal implements Handler.Callback {
            Constants.EVENT_STREAM_CONFIGURATIONS_CHANGED;
    public static final int EVENT_FIRST_FRAME_CAPTURED = 4;

    public static final int EVENT_TV_MESSAGE = 5;

    public interface Callback {
        void onDeviceAvailable(TvInputHardwareInfo info, TvStreamConfig[] configs);
        void onDeviceUnavailable(int deviceId);
        void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs,
                int cableConnectionStatus);
        void onFirstFrameCaptured(int deviceId, int streamId);
        void onTvMessage(int deviceId, int type, Bundle data);
    }

    private native long nativeOpen(MessageQueue queue);
@@ -171,6 +175,10 @@ final class TvInputHal implements Handler.Callback {
                mHandler.obtainMessage(EVENT_STREAM_CONFIGURATION_CHANGED, deviceId, streamId));
    }

    private void tvMessageReceivedFromNative(int deviceId, int type, Bundle data) {
        mHandler.obtainMessage(EVENT_TV_MESSAGE, deviceId, type, data).sendToTarget();
    }

    // Handler.Callback implementation

    @Override
@@ -221,6 +229,13 @@ final class TvInputHal implements Handler.Callback {
                break;
            }

            case EVENT_TV_MESSAGE: {
                int deviceId = msg.arg1;
                int type = msg.arg2;
                Bundle data = (Bundle) msg.obj;
                mCallback.onTvMessage(deviceId, type, data);
            }

            default:
                Slog.e(TAG, "Unknown event: " + msg);
                return false;
+24 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.media.tv.TvInputService.PriorityHintUseCaseType;
import android.media.tv.TvStreamConfig;
import android.media.tv.tunerresourcemanager.ResourceClientProfile;
import android.media.tv.tunerresourcemanager.TunerResourceManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -59,6 +60,7 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.Surface;

import com.android.internal.os.SomeArgs;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.SystemService;
@@ -264,6 +266,17 @@ class TvInputHardwareManager implements TvInputHal.Callback {
        }
    }

    @Override
    public void onTvMessage(int deviceId, int type, Bundle data) {
        synchronized (mLock) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = mHardwareInputIdMap.get(deviceId);
            args.arg2 = data;
            mHandler.obtainMessage(ListenerHandler.TV_MESSAGE_RECEIVED, type, 0, args)
                    .sendToTarget();
        }
    }

    public List<TvInputHardwareInfo> getHardwareList() {
        synchronized (mLock) {
            return Collections.unmodifiableList(mHardwareList);
@@ -1224,6 +1237,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
        void onHdmiDeviceAdded(HdmiDeviceInfo device);
        void onHdmiDeviceRemoved(HdmiDeviceInfo device);
        void onHdmiDeviceUpdated(String inputId, HdmiDeviceInfo device);
        void onTvMessage(String inputId, int type, Bundle data);
    }

    private class ListenerHandler extends Handler {
@@ -1234,6 +1248,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
        private static final int HDMI_DEVICE_REMOVED = 5;
        private static final int HDMI_DEVICE_UPDATED = 6;
        private static final int TVINPUT_INFO_ADDED = 7;
        private static final int TV_MESSAGE_RECEIVED = 8;

        @Override
        public final void handleMessage(Message msg) {
@@ -1303,6 +1318,15 @@ class TvInputHardwareManager implements TvInputHal.Callback {
                    }
                    break;
                }
                case TV_MESSAGE_RECEIVED: {
                    SomeArgs args = (SomeArgs) msg.obj;
                    String inputId = (String) args.arg1;
                    Bundle data = (Bundle) args.arg2;
                    int type = msg.arg1;
                    mListener.onTvMessage(inputId, type, data);
                    args.recycle();
                    break;
                }
                default: {
                    Slog.w(TAG, "Unhandled message: " + msg);
                    break;
+22 −0
Original line number Diff line number Diff line
@@ -4146,6 +4146,28 @@ public final class TvInputManagerService extends SystemService {
                }
            }
        }

        @Override
        public void onTvMessage(String inputId, int type, Bundle data) {
            synchronized (mLock) {
                UserState userState = getOrCreateUserStateLocked(mCurrentUserId);
                TvInputState inputState = userState.inputMap.get(inputId);
                ServiceState serviceState = userState.serviceStateMap.get(inputState.info
                        .getComponent());
                for (IBinder token : serviceState.sessionTokens) {
                    try {
                        SessionState sessionState = getSessionStateLocked(token,
                                Binder.getCallingUid(), mCurrentUserId);
                        if (!sessionState.isRecordingSession
                                && sessionState.hardwareSessionToken != null) {
                            sessionState.session.notifyTvMessage(type, data);
                        }
                    } catch (RemoteException e) {
                        Slog.e(TAG, "error in onTvMessage", e);
                    }
                }
            }
        }
    }

    private static class SessionNotFoundException extends IllegalArgumentException {
+2 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ cc_defaults {
        "libchrome",
        "libcutils",
        "libcrypto",
        "libfmq",
        "liblog",
        "libgraphicsenv",
        "libgralloctypes",
@@ -157,6 +158,7 @@ cc_defaults {
        "android.hardware.broadcastradio@1.0",
        "android.hardware.broadcastradio@1.1",
        "android.hardware.contexthub@1.0",
        "android.hardware.common.fmq-V1-ndk",
        "android.hardware.gnss-V3-cpp",
        "android.hardware.gnss@1.0",
        "android.hardware.gnss@1.1",
+13 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include "tvinput/JTvInputHal.h"

gBundleClassInfoType gBundleClassInfo;
gTvInputHalClassInfoType gTvInputHalClassInfo;
gTvStreamConfigClassInfoType gTvStreamConfigClassInfo;
gTvStreamConfigBuilderClassInfoType gTvStreamConfigBuilderClassInfo;
@@ -133,10 +134,22 @@ int register_android_server_tv_TvInputHal(JNIEnv* env) {
    GET_METHOD_ID(
            gTvInputHalClassInfo.firstFrameCaptured, clazz,
            "firstFrameCapturedFromNative", "(II)V");
    GET_METHOD_ID(gTvInputHalClassInfo.tvMessageReceived, clazz, "tvMessageReceivedFromNative",
                  "(IILandroid/os/Bundle;)V");

    FIND_CLASS(gTvStreamConfigClassInfo.clazz, "android/media/tv/TvStreamConfig");
    gTvStreamConfigClassInfo.clazz = jclass(env->NewGlobalRef(gTvStreamConfigClassInfo.clazz));

    FIND_CLASS(gBundleClassInfo.clazz, "android/os/Bundle");
    gBundleClassInfo.clazz = jclass(env->NewGlobalRef(gBundleClassInfo.clazz));
    GET_METHOD_ID(gBundleClassInfo.constructor, gBundleClassInfo.clazz, "<init>", "()V");
    GET_METHOD_ID(gBundleClassInfo.putByteArray, gBundleClassInfo.clazz, "putByteArray",
                  "(Ljava/lang/String;[B)V");
    GET_METHOD_ID(gBundleClassInfo.putString, gBundleClassInfo.clazz, "putString",
                  "(Ljava/lang/String;Ljava/lang/String;)V");
    GET_METHOD_ID(gBundleClassInfo.putInt, gBundleClassInfo.clazz, "putInt",
                  "(Ljava/lang/String;I)V");

    FIND_CLASS(gTvStreamConfigBuilderClassInfo.clazz, "android/media/tv/TvStreamConfig$Builder");
    gTvStreamConfigBuilderClassInfo.clazz =
            jclass(env->NewGlobalRef(gTvStreamConfigBuilderClassInfo.clazz));
Loading