Skip to content

Commit

Permalink
add JNI channel to dispatch device event (#18837)
Browse files Browse the repository at this point in the history
* add device event to JNI channel

* restyled

* format changes

* one more restyled
  • Loading branch information
nicelyjust authored May 27, 2022
1 parent e023667 commit 700d92e
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import com.tcl.chip.tvapp.Clusters;
import com.tcl.chip.tvapp.ContentLaunchManagerStub;
import com.tcl.chip.tvapp.DACProviderStub;
import com.tcl.chip.tvapp.DeviceEventProvider;
import com.tcl.chip.tvapp.KeypadInputManagerStub;
import com.tcl.chip.tvapp.LevelManagerStub;
import com.tcl.chip.tvapp.LowPowerManagerStub;
Expand Down Expand Up @@ -113,6 +114,13 @@ public void init(@NonNull Context context) {
});
mTvApp.setDACProvider(new DACProviderStub());

mTvApp.setChipDeviceEventProvider(
new DeviceEventProvider() {
@Override
public void onCommissioningComplete() {
Log.d("lz", "onCommissioningComplete: ");
}
});
Context applicationContext = context.getApplicationContext();
AndroidChipPlatform chipPlatform =
new AndroidChipPlatform(
Expand Down
3 changes: 3 additions & 0 deletions examples/tv-app/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ shared_library("jni") {
"java/ContentAppCommandDelegate.h",
"java/ContentLauncherManager.cpp",
"java/ContentLauncherManager.h",
"java/DeviceCallbacks.cpp",
"java/DeviceCallbacks.h",
"java/JNIDACProvider.cpp",
"java/JNIDACProvider.h",
"java/KeypadInputManager.cpp",
Expand Down Expand Up @@ -110,6 +112,7 @@ android_library("java") {
"java/src/com/tcl/chip/tvapp/ContentLaunchSearchParameter.java",
"java/src/com/tcl/chip/tvapp/DACProvider.java",
"java/src/com/tcl/chip/tvapp/DACProviderStub.java",
"java/src/com/tcl/chip/tvapp/DeviceEventProvider.java",
"java/src/com/tcl/chip/tvapp/KeypadInputManager.java",
"java/src/com/tcl/chip/tvapp/KeypadInputManagerStub.java",
"java/src/com/tcl/chip/tvapp/LevelManager.java",
Expand Down
107 changes: 107 additions & 0 deletions examples/tv-app/android/java/DeviceCallbacks.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
*
* Copyright (c) 2022 Project CHIP Authors
* All rights reserved.
*
* 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.
*/

/**
* @file DeviceCallbacks.cpp
*
* Implements all the callbacks to the application from the CHIP Stack
*
**/
#include "DeviceCallbacks.h"

#include <app-common/zap-generated/attribute-id.h>
#include <app-common/zap-generated/cluster-id.h>
#include <app/CommandHandler.h>
#include <app/server/Dnssd.h>
#include <app/util/af.h>
#include <app/util/basic-types.h>
#include <app/util/util.h>
#include <jni.h>
#include <lib/dnssd/Advertiser.h>
#include <lib/support/JniReferences.h>

using namespace ::chip;
using namespace ::chip::Inet;
using namespace ::chip::System;
using namespace ::chip::DeviceLayer;
using namespace ::chip::Logging;
namespace {
void OnPlatformEventWrapper(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg)
{
DeviceCallbacks * commissionMgr = reinterpret_cast<DeviceCallbacks *>(arg);
commissionMgr->OnPlatformEvent(event);
}
} // namespace
void DeviceCallbacks::NewManager(jobject manager)
{
ChipLogProgress(AppServer, "TV Android App: set ChipDeviceEvent delegate");
DeviceCallbacks * mgr = new DeviceCallbacks();
PlatformMgr().AddEventHandler(OnPlatformEventWrapper, reinterpret_cast<intptr_t>(mgr));
mgr->InitializeWithObjects(manager);
}

void DeviceCallbacks::InitializeWithObjects(jobject provider)
{
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != nullptr, ChipLogError(AppServer, "Failed to GetEnvForCurrentThread for DeviceEventProvider"));

mProvider = env->NewGlobalRef(provider);
VerifyOrReturn(mProvider != nullptr, ChipLogError(AppServer, "Failed to NewGlobalRef DeviceEventProvider"));
jclass deviceEventProviderCls = env->GetObjectClass(mProvider);
VerifyOrReturn(deviceEventProviderCls != nullptr, ChipLogError(AppServer, "Failed to get KeypadInputManager Java class"));

mCommissioningCompleteMethod = env->GetMethodID(deviceEventProviderCls, "onCommissioningComplete", "()V");
if (mCommissioningCompleteMethod == nullptr)
{
ChipLogError(AppServer, "Failed to access DeviceEventProvider 'onCommissioningComplete' method");
env->ExceptionClear();
}
}

void DeviceCallbacks::OnPlatformEvent(const ChipDeviceEvent * event)
{
switch (event->Type)
{
case DeviceEventType::kCommissioningComplete:
OnCommissioningComplete(event);
break;
case DeviceEventType::kSessionEstablished:
OnSessionEstablished(event);
break;
}
}

void DeviceCallbacks::OnSessionEstablished(const ChipDeviceEvent * event)
{
if (event->SessionEstablished.IsCommissioner)
{
ChipLogProgress(AppServer, "Commissioner detected!");
}
}
void DeviceCallbacks::OnCommissioningComplete(const ChipDeviceEvent * event)
{
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for DeviceEventProvider"));
env->CallVoidMethod(mProvider, mCommissioningCompleteMethod);
if (env->ExceptionCheck())
{
ChipLogError(AppServer, "Java exception in DeviceEventProvider::onCommissioningComplete");
env->ExceptionDescribe();
env->ExceptionClear();
}
}
35 changes: 35 additions & 0 deletions examples/tv-app/android/java/DeviceCallbacks.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* 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.
*/
#pragma once

#include "lib/support/logging/CHIPLogging.h"
#include <jni.h>

class DeviceCallbacks
{

public:
static void NewManager(jobject manager);
void OnPlatformEvent(const chip::DeviceLayer::ChipDeviceEvent * event);
void InitializeWithObjects(jobject manager);

private:
jobject mProvider = nullptr;
jmethodID mCommissioningCompleteMethod = nullptr;
void OnSessionEstablished(const chip::DeviceLayer::ChipDeviceEvent * event);
void OnCommissioningComplete(const chip::DeviceLayer::ChipDeviceEvent * event);
};
6 changes: 6 additions & 0 deletions examples/tv-app/android/java/TVApp-JNI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "AppImpl.h"
#include "ChannelManager.h"
#include "ContentLauncherManager.h"
#include "DeviceCallbacks.h"
#include "JNIDACProvider.h"
#include "KeypadInputManager.h"
#include "LevelManager.h"
Expand Down Expand Up @@ -177,6 +178,11 @@ JNI_METHOD(jboolean, setCurrentLevel)(JNIEnv *, jobject, jint endpoint, jboolean
return LevelManager::SetLevel(endpoint, value);
}

JNI_METHOD(void, setChipDeviceEventProvider)(JNIEnv *, jobject, jobject provider)
{
DeviceCallbacks::NewManager(provider);
}

JNI_METHOD(jint, addContentApp)
(JNIEnv *, jobject, jstring vendorName, jint vendorId, jstring appName, jint productId, jstring appVersion, jobject manager)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (c) 2022 Project CHIP Authors
* All rights reserved.
*
* 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 com.tcl.chip.tvapp;

public interface DeviceEventProvider {
void onCommissioningComplete();
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ private void postClusterInit(int clusterId, int endpoint) {

public native void setDACProvider(DACProvider provider);

public native void setChipDeviceEventProvider(DeviceEventProvider provider);

public native int addContentApp(
String vendorName,
int vendorId,
Expand Down

0 comments on commit 700d92e

Please sign in to comment.