Skip to content

Commit 3330577

Browse files
xylophone21pull[bot]
authored andcommitted
Android java endpoint and fix memory errors (#13398)
* added endpoint support in Java * fix jni sign error * fix memory error in media input cluster on android * fix restyled-io and ci errors * fix memory issus in channel cluster * fix memory issus in content launcher cluster * fix memory issue in wake up on lan launcher cluster * fix media playback cluster issue in last PR * fix restyled-io and ci errors * fix CI issue
1 parent 54dd840 commit 3330577

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1076
-499
lines changed

examples/tv-app/android/App/app/src/main/java/com/tcl/chip/chiptvserver/service/MatterServant.java

+28-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import chip.platform.PreferencesConfigurationManager;
1111
import chip.platform.PreferencesKeyValueStoreManager;
1212
import com.tcl.chip.tvapp.ChannelManagerStub;
13+
import com.tcl.chip.tvapp.Clusters;
1314
import com.tcl.chip.tvapp.ContentLaunchManagerStub;
1415
import com.tcl.chip.tvapp.KeypadInputManagerStub;
1516
import com.tcl.chip.tvapp.LowPowerManagerStub;
@@ -33,14 +34,33 @@ public static MatterServant get() {
3334
}
3435

3536
public void init(@NonNull Context context) {
36-
TvApp tvApp = new TvApp();
37-
tvApp.setKeypadInputManager(new KeypadInputManagerStub());
38-
tvApp.setWakeOnLanManager(new WakeOnLanManagerStub());
39-
tvApp.setMediaInputManager(new MediaInputManagerStub());
40-
tvApp.setContentLaunchManager(new ContentLaunchManagerStub());
41-
tvApp.setLowPowerManager(new LowPowerManagerStub());
42-
tvApp.setMediaPlaybackManager(new MediaPlaybackManagerStub());
43-
tvApp.setChannelManager(new ChannelManagerStub());
37+
TvApp tvApp =
38+
new TvApp(
39+
(app, clusterId, endpoint) -> {
40+
switch (clusterId) {
41+
case Clusters.ClusterId_KeypadInput:
42+
app.setKeypadInputManager(endpoint, new KeypadInputManagerStub(endpoint));
43+
break;
44+
case Clusters.ClusterId_WakeOnLan:
45+
app.setWakeOnLanManager(endpoint, new WakeOnLanManagerStub(endpoint));
46+
break;
47+
case Clusters.ClusterId_MediaInput:
48+
app.setMediaInputManager(endpoint, new MediaInputManagerStub(endpoint));
49+
break;
50+
case Clusters.ClusterId_ContentLauncher:
51+
app.setContentLaunchManager(endpoint, new ContentLaunchManagerStub(endpoint));
52+
break;
53+
case Clusters.ClusterId_LowPower:
54+
app.setLowPowerManager(endpoint, new LowPowerManagerStub(endpoint));
55+
break;
56+
case Clusters.ClusterId_MediaPlayback:
57+
app.setMediaPlaybackManager(endpoint, new MediaPlaybackManagerStub(endpoint));
58+
break;
59+
case Clusters.ClusterId_Channel:
60+
app.setChannelManager(endpoint, new ChannelManagerStub(endpoint));
61+
break;
62+
}
63+
});
4464

4565
Context applicationContext = context.getApplicationContext();
4666
AndroidChipPlatform chipPlatform =

examples/tv-app/android/BUILD.gn

+3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ android_library("java") {
8787
"java/src/com/tcl/chip/tvapp/ChannelLineupInfo.java",
8888
"java/src/com/tcl/chip/tvapp/ChannelManager.java",
8989
"java/src/com/tcl/chip/tvapp/ChannelManagerStub.java",
90+
"java/src/com/tcl/chip/tvapp/Clusters.java",
9091
"java/src/com/tcl/chip/tvapp/ContentLaunchBrandingInformation.java",
9192
"java/src/com/tcl/chip/tvapp/ContentLaunchManager.java",
9293
"java/src/com/tcl/chip/tvapp/ContentLaunchManagerStub.java",
@@ -101,7 +102,9 @@ android_library("java") {
101102
"java/src/com/tcl/chip/tvapp/MediaInputManagerStub.java",
102103
"java/src/com/tcl/chip/tvapp/MediaPlaybackManager.java",
103104
"java/src/com/tcl/chip/tvapp/MediaPlaybackManagerStub.java",
105+
"java/src/com/tcl/chip/tvapp/MediaPlaybackPosition.java",
104106
"java/src/com/tcl/chip/tvapp/TvApp.java",
107+
"java/src/com/tcl/chip/tvapp/TvAppCallback.java",
105108
"java/src/com/tcl/chip/tvapp/WakeOnLanManager.java",
106109
"java/src/com/tcl/chip/tvapp/WakeOnLanManagerStub.java",
107110
]

examples/tv-app/android/java/ChannelManager.cpp

+70-44
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
*/
1717

1818
#include "ChannelManager.h"
19+
#include "TvApp-JNI.h"
20+
#include <app-common/zap-generated/ids/Clusters.h>
21+
#include <jni.h>
1922
#include <lib/core/CHIPSafeCasts.h>
2023
#include <lib/support/CHIPJNIError.h>
2124
#include <lib/support/JniReferences.h>
@@ -24,13 +27,31 @@
2427
using namespace chip;
2528
using namespace chip::app::Clusters::Channel;
2629

27-
namespace {
28-
static ChannelManager channelManager;
29-
} // namespace
30+
/** @brief Channel Cluster Init
31+
*
32+
* This function is called when a specific cluster is initialized. It gives the
33+
* application an opportunity to take care of cluster initialization procedures.
34+
* It is called exactly once for each endpoint where cluster is present.
35+
*
36+
* @param endpoint Ver.: always
37+
*
38+
*/
39+
void emberAfChannelClusterInitCallback(EndpointId endpoint)
40+
{
41+
ChipLogProgress(Zcl, "TV Android App: Channel::PostClusterInit");
42+
TvAppJNIMgr().PostClusterInit(chip::app::Clusters::Channel::Id, endpoint);
43+
}
3044

31-
std::list<chip::app::Clusters::Channel::Structs::ChannelInfo::Type> ChannelManager::HandleGetChannelList()
45+
void ChannelManager::NewManager(jint endpoint, jobject manager)
46+
{
47+
ChipLogProgress(Zcl, "TV Android App: Channel::SetDefaultDelegate");
48+
ChannelManager * mgr = new ChannelManager();
49+
mgr->InitializeWithObjects(manager);
50+
chip::app::Clusters::Channel::SetDefaultDelegate(static_cast<EndpointId>(endpoint), mgr);
51+
}
52+
53+
CHIP_ERROR ChannelManager::HandleGetChannelList(chip::app::AttributeValueEncoder & aEncoder)
3254
{
33-
std::list<Structs::ChannelInfo::Type> list;
3455
CHIP_ERROR err = CHIP_NO_ERROR;
3556
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
3657

@@ -39,9 +60,17 @@ std::list<chip::app::Clusters::Channel::Structs::ChannelInfo::Type> ChannelManag
3960
VerifyOrExit(mGetChannelListMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
4061
VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV);
4162

42-
{
63+
return aEncoder.EncodeList([this, env](const auto & encoder) -> CHIP_ERROR {
4364
jobjectArray channelInfoList = (jobjectArray) env->CallObjectMethod(mChannelManagerObject, mGetChannelListMethod);
44-
jint length = env->GetArrayLength(channelInfoList);
65+
if (env->ExceptionCheck())
66+
{
67+
ChipLogError(Zcl, "Java exception in ChannelManager::HandleGetChannelList");
68+
env->ExceptionDescribe();
69+
env->ExceptionClear();
70+
return CHIP_ERROR_INCORRECT_STATE;
71+
}
72+
73+
jint length = env->GetArrayLength(channelInfoList);
4574

4675
for (jint i = 0; i < length; i++)
4776
{
@@ -62,15 +91,15 @@ std::list<chip::app::Clusters::Channel::Structs::ChannelInfo::Type> ChannelManag
6291
if (jname != NULL)
6392
{
6493
JniUtfString name(env, jname);
65-
channelInfo.callSign = name.charSpan();
94+
channelInfo.name = name.charSpan();
6695
}
6796

6897
jfieldID getJaffiliateCallSignField = env->GetFieldID(channelClass, "affiliateCallSign", "Ljava/lang/String;");
6998
jstring jaffiliateCallSign = static_cast<jstring>(env->GetObjectField(channelObject, getJaffiliateCallSignField));
7099
if (jaffiliateCallSign != NULL)
71100
{
72101
JniUtfString affiliateCallSign(env, jaffiliateCallSign);
73-
channelInfo.callSign = affiliateCallSign.charSpan();
102+
channelInfo.affiliateCallSign = affiliateCallSign.charSpan();
74103
}
75104

76105
jfieldID majorNumField = env->GetFieldID(channelClass, "majorNumber", "I");
@@ -79,21 +108,24 @@ std::list<chip::app::Clusters::Channel::Structs::ChannelInfo::Type> ChannelManag
79108

80109
jfieldID minorNumField = env->GetFieldID(channelClass, "minorNumber", "I");
81110
jint jminorNum = env->GetIntField(channelObject, minorNumField);
82-
channelInfo.majorNumber = static_cast<uint16_t>(jminorNum);
83-
list.push_back(channelInfo);
111+
channelInfo.minorNumber = static_cast<uint16_t>(jminorNum);
112+
113+
ReturnErrorOnFailure(encoder.Encode(channelInfo));
84114
}
85-
}
115+
116+
return CHIP_NO_ERROR;
117+
});
86118

87119
exit:
88120
if (err != CHIP_NO_ERROR)
89121
{
90122
ChipLogError(Zcl, "ChannelManager::getChannelList status error: %s", err.AsString());
91123
}
92124

93-
return list;
125+
return err;
94126
}
95127

96-
chip::app::Clusters::Channel::Structs::LineupInfo::Type ChannelManager::HandleGetLineup()
128+
CHIP_ERROR ChannelManager::HandleGetLineup(chip::app::AttributeValueEncoder & aEncoder)
97129
{
98130
chip::app::Clusters::Channel::Structs::LineupInfo::Type lineupInfo;
99131
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -135,6 +167,8 @@ chip::app::Clusters::Channel::Structs::LineupInfo::Type ChannelManager::HandleGe
135167
jfieldID lineupInfoTypeFild = env->GetFieldID(channelLineupClazz, "lineupInfoTypeEnum", "I");
136168
jint jlineupInfoType = (env->GetIntField(channelLineupObject, lineupInfoTypeFild));
137169
lineupInfo.lineupInfoType = static_cast<app::Clusters::Channel::LineupInfoTypeEnum>(jlineupInfoType);
170+
171+
err = aEncoder.Encode(lineupInfo);
138172
}
139173

140174
exit:
@@ -143,10 +177,10 @@ chip::app::Clusters::Channel::Structs::LineupInfo::Type ChannelManager::HandleGe
143177
ChipLogError(Zcl, "ChannelManager::getChannelLineup status error: %s", err.AsString());
144178
}
145179

146-
return lineupInfo;
180+
return err;
147181
}
148182

149-
chip::app::Clusters::Channel::Structs::ChannelInfo::Type ChannelManager::HandleGetCurrentChannel()
183+
CHIP_ERROR ChannelManager::HandleGetCurrentChannel(chip::app::AttributeValueEncoder & aEncoder)
150184
{
151185
chip::app::Clusters::Channel::Structs::ChannelInfo::Type channelInfo;
152186
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -173,15 +207,15 @@ chip::app::Clusters::Channel::Structs::ChannelInfo::Type ChannelManager::HandleG
173207
if (jname != NULL)
174208
{
175209
JniUtfString name(env, jname);
176-
channelInfo.callSign = name.charSpan();
210+
channelInfo.name = name.charSpan();
177211
}
178212

179213
jfieldID getJaffiliateCallSignField = env->GetFieldID(channelClass, "affiliateCallSign", "Ljava/lang/String;");
180214
jstring jaffiliateCallSign = static_cast<jstring>(env->GetObjectField(channelInfoObject, getJaffiliateCallSignField));
181215
if (jaffiliateCallSign != NULL)
182216
{
183217
JniUtfString affiliateCallSign(env, jaffiliateCallSign);
184-
channelInfo.callSign = affiliateCallSign.charSpan();
218+
channelInfo.affiliateCallSign = affiliateCallSign.charSpan();
185219
}
186220

187221
jfieldID majorNumField = env->GetFieldID(channelClass, "majorNumber", "I");
@@ -190,7 +224,9 @@ chip::app::Clusters::Channel::Structs::ChannelInfo::Type ChannelManager::HandleG
190224

191225
jfieldID minorNumField = env->GetFieldID(channelClass, "minorNumber", "I");
192226
jint jminorNum = env->GetIntField(channelInfoObject, minorNumField);
193-
channelInfo.majorNumber = static_cast<uint16_t>(jminorNum);
227+
channelInfo.minorNumber = static_cast<uint16_t>(jminorNum);
228+
229+
err = aEncoder.Encode(channelInfo);
194230
}
195231

196232
exit:
@@ -199,10 +235,12 @@ chip::app::Clusters::Channel::Structs::ChannelInfo::Type ChannelManager::HandleG
199235
ChipLogError(Zcl, "ChannelManager::HandleGetCurrentChannel status error: %s", err.AsString());
200236
}
201237

202-
return channelInfo;
238+
return err;
203239
}
204240

205-
Commands::ChangeChannelResponse::Type ChannelManager::HandleChangeChannel(const chip::CharSpan & match)
241+
void ChannelManager::HandleChangeChannel(
242+
const chip::CharSpan & match,
243+
chip::app::CommandResponseHelper<chip::app::Clusters::Channel::Commands::ChangeChannelResponse::Type> & responser)
206244
{
207245
std::string name(match.data(), match.size());
208246
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
@@ -225,11 +263,15 @@ Commands::ChangeChannelResponse::Type ChannelManager::HandleChangeChannel(const
225263
ChipLogError(DeviceLayer, "Java exception in ChannelManager::HandleChangeChannel");
226264
env->ExceptionDescribe();
227265
env->ExceptionClear();
228-
return response;
266+
goto exit;
229267
}
230268

231269
jclass channelClass = env->GetObjectClass(channelObject);
232270

271+
jfieldID getErrorTypeField = env->GetFieldID(channelClass, "errorType", "I");
272+
jint jerrorType = env->GetIntField(channelObject, getErrorTypeField);
273+
response.errorType = static_cast<app::Clusters::Channel::ErrorTypeEnum>(jerrorType);
274+
233275
jfieldID getCallSignField = env->GetFieldID(channelClass, "callSign", "Ljava/lang/String;");
234276
jstring jcallSign = static_cast<jstring>(env->GetObjectField(channelObject, getCallSignField));
235277
if (jcallSign != NULL)
@@ -243,14 +285,14 @@ Commands::ChangeChannelResponse::Type ChannelManager::HandleChangeChannel(const
243285
if (jname != NULL)
244286
{
245287
JniUtfString junitname(env, jname);
246-
response.channelMatch.callSign = junitname.charSpan();
288+
response.channelMatch.name = junitname.charSpan();
247289
}
248290
jfieldID getJaffiliateCallSignField = env->GetFieldID(channelClass, "affiliateCallSign", "Ljava/lang/String;");
249291
jstring jaffiliateCallSign = static_cast<jstring>(env->GetObjectField(channelObject, getJaffiliateCallSignField));
250292
if (jaffiliateCallSign != NULL)
251293
{
252294
JniUtfString affiliateCallSign(env, jaffiliateCallSign);
253-
response.channelMatch.callSign = affiliateCallSign.charSpan();
295+
response.channelMatch.affiliateCallSign = affiliateCallSign.charSpan();
254296
}
255297

256298
jfieldID majorNumField = env->GetFieldID(channelClass, "majorNumber", "I");
@@ -259,12 +301,13 @@ Commands::ChangeChannelResponse::Type ChannelManager::HandleChangeChannel(const
259301

260302
jfieldID minorNumField = env->GetFieldID(channelClass, "minorNumber", "I");
261303
jint jminorNum = env->GetIntField(channelObject, minorNumField);
262-
response.channelMatch.majorNumber = static_cast<uint16_t>(jminorNum);
304+
response.channelMatch.minorNumber = static_cast<uint16_t>(jminorNum);
305+
306+
responser.Success(response);
263307
}
264308

265309
exit:
266-
267-
return response;
310+
return;
268311
}
269312

270313
bool ChannelManager::HandleChangeChannelByNumber(const uint16_t & majorNumber, const uint16_t & minorNumber)
@@ -372,20 +415,3 @@ void ChannelManager::InitializeWithObjects(jobject managerObject)
372415
env->ExceptionClear();
373416
}
374417
}
375-
376-
ChannelManager ChannelManager::sInstance;
377-
378-
/** @brief Channel Cluster Init
379-
*
380-
* This function is called when a specific cluster is initialized. It gives the
381-
* application an opportunity to take care of cluster initialization procedures.
382-
* It is called exactly once for each endpoint where cluster is present.
383-
*
384-
* @param endpoint Ver.: always
385-
*
386-
*/
387-
void emberAfChannelClusterInitCallback(EndpointId endpoint)
388-
{
389-
ChipLogProgress(Zcl, "TV Android App: Channel::SetDefaultDelegate");
390-
chip::app::Clusters::Channel::SetDefaultDelegate(endpoint, &channelManager);
391-
}

examples/tv-app/android/java/ChannelManager.h

+7-12
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@
2323
class ChannelManager : public chip::app::Clusters::Channel::Delegate
2424
{
2525
public:
26+
static void NewManager(jint endpoint, jobject manager);
2627
void InitializeWithObjects(jobject managerObject);
2728

28-
std::list<chip::app::Clusters::Channel::Structs::ChannelInfo::Type> HandleGetChannelList() override;
29-
chip::app::Clusters::Channel::Structs::LineupInfo::Type HandleGetLineup() override;
30-
chip::app::Clusters::Channel::Structs::ChannelInfo::Type HandleGetCurrentChannel() override;
29+
virtual CHIP_ERROR HandleGetChannelList(chip::app::AttributeValueEncoder & aEncoder) override;
30+
virtual CHIP_ERROR HandleGetLineup(chip::app::AttributeValueEncoder & aEncoder) override;
31+
virtual CHIP_ERROR HandleGetCurrentChannel(chip::app::AttributeValueEncoder & aEncoder) override;
3132

32-
chip::app::Clusters::Channel::Commands::ChangeChannelResponse::Type HandleChangeChannel(const chip::CharSpan & match) override;
33+
virtual void HandleChangeChannel(
34+
const chip::CharSpan & match,
35+
chip::app::CommandResponseHelper<chip::app::Clusters::Channel::Commands::ChangeChannelResponse::Type> & responser) override;
3336
bool HandleChangeChannelByNumber(const uint16_t & majorNumber, const uint16_t & minorNumber) override;
3437
bool HandleSkipChannel(const uint16_t & count) override;
3538

3639
private:
37-
friend ChannelManager & ChannelMgr();
38-
39-
static ChannelManager sInstance;
4040
jobject mChannelManagerObject = nullptr;
4141
jmethodID mGetChannelListMethod = nullptr;
4242
jmethodID mGetLineupMethod = nullptr;
@@ -46,8 +46,3 @@ class ChannelManager : public chip::app::Clusters::Channel::Delegate
4646
jmethodID mChangeChannelByNumberMethod = nullptr;
4747
jmethodID mSkipChannelMethod = nullptr;
4848
};
49-
50-
inline class ChannelManager & ChannelMgr()
51-
{
52-
return ChannelManager::sInstance;
53-
}

0 commit comments

Comments
 (0)