Skip to content

Commit 4177320

Browse files
sharadb-amazonpull[bot]
authored andcommitted
tv-casting-app: Support for pre-commissioned state to Discovered Video Player Nodes, new AppParams and Read Attribute APIs (#23303)
* tv-casting-app: Support to pass in the new AppParameters (includes rotatingDeviceId) * tv-casting-app: Adding Read API for ApplicationBasic cluster * tv-casting-app: Exposing pre commissioned state and toConnectableVideoPlayer API
1 parent bb1b12b commit 4177320

Some content is hidden

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

43 files changed

+1682
-217
lines changed

examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/CommissionerDiscoveryFragment.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ public String getCommissionerButtonText(DiscoveredNodeData commissioner) {
133133
? (aux.isEmpty() ? "" : " from ") + "Vendor ID: " + commissioner.getVendorId()
134134
: "";
135135
aux = aux.isEmpty() ? aux : "\n[" + aux + "]";
136-
return main + aux;
136+
137+
String preCommissioned = commissioner.isPreCommissioned() ? " (Pre-commissioned)" : "";
138+
return main + aux + preCommissioned;
137139
}
138140

139141
/** Interface for notifying the host. */

examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/CommissioningFragment.java

-129
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package com.chip.casting.app;
2+
3+
import android.os.Bundle;
4+
import android.util.Log;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.TextView;
9+
import androidx.annotation.Nullable;
10+
import androidx.fragment.app.Fragment;
11+
import com.chip.casting.ContentApp;
12+
import com.chip.casting.DiscoveredNodeData;
13+
import com.chip.casting.FailureCallback;
14+
import com.chip.casting.MatterCallbackHandler;
15+
import com.chip.casting.MatterError;
16+
import com.chip.casting.SuccessCallback;
17+
import com.chip.casting.TvCastingApp;
18+
import com.chip.casting.VideoPlayer;
19+
import com.chip.casting.util.GlobalCastingConstants;
20+
21+
/** A {@link Fragment} to get the TV Casting App commissioned / connected. */
22+
public class ConnectionFragment extends Fragment {
23+
private static final String TAG = ConnectionFragment.class.getSimpleName();
24+
25+
private final TvCastingApp tvCastingApp;
26+
private final DiscoveredNodeData selectedCommissioner;
27+
28+
private boolean verifyOrEstablishConnectionSuccess;
29+
private boolean openCommissioningWindowSuccess;
30+
private boolean sendUdcSuccess;
31+
32+
public ConnectionFragment(TvCastingApp tvCastingApp, DiscoveredNodeData selectedCommissioner) {
33+
this.tvCastingApp = tvCastingApp;
34+
this.selectedCommissioner = selectedCommissioner;
35+
}
36+
37+
/**
38+
* Use this factory method to create a new instance of this fragment using the provided
39+
* parameters.
40+
*
41+
* @return A new instance of fragment CommissioningFragment.
42+
*/
43+
public static ConnectionFragment newInstance(
44+
TvCastingApp tvCastingApp, DiscoveredNodeData selectedCommissioner) {
45+
return new ConnectionFragment(tvCastingApp, selectedCommissioner);
46+
}
47+
48+
@Override
49+
public void onCreate(Bundle savedInstanceState) {
50+
super.onCreate(savedInstanceState);
51+
}
52+
53+
@Override
54+
public View onCreateView(
55+
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
56+
Callback callback = (ConnectionFragment.Callback) this.getActivity();
57+
58+
SuccessCallback<VideoPlayer> onConnectionSuccess =
59+
new SuccessCallback<VideoPlayer>() {
60+
@Override
61+
public void handle(VideoPlayer videoPlayer) {
62+
Log.d(TAG, "handle() called on OnConnectionSuccess with " + videoPlayer);
63+
callback.handleCommissioningComplete();
64+
}
65+
};
66+
67+
FailureCallback onConnectionFailure =
68+
new FailureCallback() {
69+
@Override
70+
public void handle(MatterError matterError) {
71+
Log.d(TAG, "handle() called on OnConnectionFailure with " + matterError);
72+
}
73+
};
74+
75+
SuccessCallback<ContentApp> onNewOrUpdatedEndpoints =
76+
new SuccessCallback<ContentApp>() {
77+
@Override
78+
public void handle(ContentApp contentApp) {
79+
Log.d(TAG, "handle() called on OnNewOrUpdatedEndpoint with " + contentApp);
80+
}
81+
};
82+
83+
if (selectedCommissioner != null && selectedCommissioner.isPreCommissioned()) {
84+
VideoPlayer videoPlayer = selectedCommissioner.toConnectableVideoPlayer();
85+
Log.d(TAG, "Calling verifyOrEstablishConnectionSuccess with VideoPlayer: " + videoPlayer);
86+
this.verifyOrEstablishConnectionSuccess =
87+
tvCastingApp.verifyOrEstablishConnection(
88+
videoPlayer, onConnectionSuccess, onConnectionFailure, onNewOrUpdatedEndpoints);
89+
} else {
90+
Log.d(TAG, "Running commissioning");
91+
this.openCommissioningWindowSuccess =
92+
tvCastingApp.openBasicCommissioningWindow(
93+
GlobalCastingConstants.CommissioningWindowDurationSecs,
94+
new MatterCallbackHandler() {
95+
@Override
96+
public void handle(MatterError error) {
97+
Log.d(TAG, "handle() called on CommissioningComplete event with " + error);
98+
}
99+
},
100+
onConnectionSuccess,
101+
onConnectionFailure,
102+
onNewOrUpdatedEndpoints);
103+
104+
if (this.openCommissioningWindowSuccess) {
105+
if (selectedCommissioner != null && selectedCommissioner.getNumIPs() > 0) {
106+
String ipAddress = selectedCommissioner.getIpAddresses().get(0).getHostAddress();
107+
Log.d(
108+
TAG,
109+
"ConnectionFragment calling tvCastingApp.sendUserDirectedCommissioningRequest with IP: "
110+
+ ipAddress
111+
+ " port: "
112+
+ selectedCommissioner.getPort());
113+
114+
this.sendUdcSuccess = tvCastingApp.sendCommissioningRequest(selectedCommissioner);
115+
}
116+
}
117+
}
118+
119+
return inflater.inflate(R.layout.fragment_connection, container, false);
120+
}
121+
122+
@Override
123+
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
124+
super.onViewCreated(view, savedInstanceState);
125+
String commissioningWindowStatus = "";
126+
if (selectedCommissioner != null && selectedCommissioner.isPreCommissioned()) {
127+
commissioningWindowStatus = "Establishing connection with selected Video Player";
128+
} else {
129+
commissioningWindowStatus = "Failed to open commissioning window";
130+
if (this.openCommissioningWindowSuccess) {
131+
commissioningWindowStatus = "Commissioning window has been opened. Commission manually.";
132+
if (this.sendUdcSuccess) {
133+
commissioningWindowStatus =
134+
"Commissioning window has been opened. Commissioning requested from "
135+
+ selectedCommissioner.getDeviceName();
136+
}
137+
TextView onboardingPayloadView = getView().findViewById(R.id.onboardingPayload);
138+
onboardingPayloadView.setText(
139+
"Onboarding PIN: "
140+
+ GlobalCastingConstants.SetupPasscode
141+
+ "\nDiscriminator: "
142+
+ GlobalCastingConstants.Discriminator);
143+
}
144+
}
145+
146+
TextView commissioningWindowStatusView = getView().findViewById(R.id.commissioningWindowStatus);
147+
commissioningWindowStatusView.setText(commissioningWindowStatus);
148+
}
149+
150+
/** Interface for notifying the host. */
151+
public interface Callback {
152+
/** Notifies listener to trigger transition on completion of commissioning */
153+
void handleCommissioningComplete();
154+
}
155+
}

examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@
1515
import chip.platform.NsdManagerServiceResolver;
1616
import chip.platform.PreferencesConfigurationManager;
1717
import chip.platform.PreferencesKeyValueStoreManager;
18+
import com.chip.casting.AppParameters;
1819
import com.chip.casting.DACProviderStub;
1920
import com.chip.casting.DiscoveredNodeData;
2021
import com.chip.casting.TvCastingApp;
2122
import com.chip.casting.util.GlobalCastingConstants;
23+
import java.util.Random;
2224

2325
public class MainActivity extends AppCompatActivity
2426
implements CommissionerDiscoveryFragment.Callback,
25-
CommissioningFragment.Callback,
27+
ConnectionFragment.Callback,
2628
SelectClusterFragment.Callback {
2729

2830
private static final String TAG = MainActivity.class.getSimpleName();
@@ -46,7 +48,7 @@ protected void onCreate(Bundle savedInstanceState) {
4648

4749
@Override
4850
public void handleCommissioningButtonClicked(DiscoveredNodeData commissioner) {
49-
showFragment(CommissioningFragment.newInstance(tvCastingApp, commissioner));
51+
showFragment(ConnectionFragment.newInstance(tvCastingApp, commissioner));
5052
}
5153

5254
@Override
@@ -90,7 +92,12 @@ private void initJni() {
9092
chipAppServer = new ChipAppServer();
9193
chipAppServer.startApp();
9294

93-
tvCastingApp.init();
95+
AppParameters appParameters = new AppParameters();
96+
byte[] rotatingDeviceIdUniqueId =
97+
new byte[AppParameters.MIN_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH];
98+
new Random().nextBytes(rotatingDeviceIdUniqueId);
99+
appParameters.setRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueId);
100+
tvCastingApp.init(appParameters);
94101
}
95102

96103
private void showFragment(Fragment fragment, boolean showOnBack) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (c) 2022 Project CHIP Authors
3+
* All rights reserved.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
package com.chip.casting;
19+
20+
public class AppParameters {
21+
public static final int MIN_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH = 16;
22+
23+
private byte[] rotatingDeviceIdUniqueId;
24+
25+
public void setRotatingDeviceIdUniqueId(byte[] rotatingDeviceIdUniqueId) {
26+
this.rotatingDeviceIdUniqueId = rotatingDeviceIdUniqueId;
27+
}
28+
29+
public byte[] getRotatingDeviceIdUniqueId() {
30+
return rotatingDeviceIdUniqueId;
31+
}
32+
}

examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/DiscoveredNodeData.java

+14
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public class DiscoveredNodeData {
4747
private int numIPs;
4848
private List<InetAddress> ipAddresses;
4949

50+
private VideoPlayer connectableVideoPlayer;
51+
5052
public DiscoveredNodeData(NsdServiceInfo serviceInfo) {
5153
Map<String, byte[]> attributes = serviceInfo.getAttributes();
5254
this.deviceName = new String(attributes.get(KEY_DEVICE_NAME), StandardCharsets.UTF_8);
@@ -69,6 +71,18 @@ public DiscoveredNodeData(NsdServiceInfo serviceInfo) {
6971
this.numIPs = 1;
7072
}
7173

74+
void setConnectableVideoPlayer(VideoPlayer videoPlayer) {
75+
this.connectableVideoPlayer = videoPlayer;
76+
}
77+
78+
public boolean isPreCommissioned() {
79+
return connectableVideoPlayer != null;
80+
}
81+
82+
public VideoPlayer toConnectableVideoPlayer() {
83+
return connectableVideoPlayer;
84+
}
85+
7286
public String getHostName() {
7387
return hostName;
7488
}

0 commit comments

Comments
 (0)