4
4
import android .net .nsd .NsdManager ;
5
5
import android .net .wifi .WifiManager ;
6
6
import android .os .Bundle ;
7
+ import android .os .Handler ;
8
+ import android .os .Looper ;
7
9
import android .util .Log ;
8
10
import android .view .LayoutInflater ;
9
11
import android .view .View ;
10
12
import android .view .ViewGroup ;
11
13
import android .widget .Button ;
14
+ import android .widget .LinearLayout ;
12
15
import androidx .annotation .Nullable ;
16
+ import androidx .annotation .VisibleForTesting ;
13
17
import androidx .fragment .app .Fragment ;
14
- import com .chip .casting .dnssd . CommissionerDiscoveryListener ;
15
- import com .chip .casting .dnssd . DiscoveredNodeData ;
16
- import com .chip .casting .util . GlobalCastingConstants ;
17
- import java . util . concurrent . Executors ;
18
- import java . util . concurrent . TimeUnit ;
18
+ import com .chip .casting .DiscoveredNodeData ;
19
+ import com .chip .casting .FailureCallback ;
20
+ import com .chip .casting .MatterError ;
21
+ import com . chip . casting . SuccessCallback ;
22
+ import com . chip . casting . TvCastingApp ;
19
23
20
24
/** A {@link Fragment} to discover commissioners on the network */
21
25
public class CommissionerDiscoveryFragment extends Fragment {
22
26
private static final String TAG = CommissionerDiscoveryFragment .class .getSimpleName ();
27
+ private static final long DISCOVERY_DURATION_SECS = 10 ;
28
+ private final TvCastingApp tvCastingApp ;
23
29
24
- public CommissionerDiscoveryFragment () {}
30
+ public CommissionerDiscoveryFragment (TvCastingApp tvCastingApp ) {
31
+ this .tvCastingApp = tvCastingApp ;
32
+ }
25
33
26
34
/**
27
35
* Use this factory method to create a new instance of this fragment using the provided
28
36
* parameters.
29
37
*
30
38
* @return A new instance of fragment CommissionerDiscoveryFragment.
31
39
*/
32
- public static CommissionerDiscoveryFragment newInstance () {
33
- return new CommissionerDiscoveryFragment ();
40
+ public static CommissionerDiscoveryFragment newInstance (TvCastingApp tvCastingApp ) {
41
+ return new CommissionerDiscoveryFragment (tvCastingApp );
34
42
}
35
43
36
44
@ Override
37
45
public void onCreate (Bundle savedInstanceState ) {
38
46
super .onCreate (savedInstanceState );
39
- startCommissionerDiscovery ();
40
47
}
41
48
42
49
@ Override
@@ -49,47 +56,84 @@ public View onCreateView(
49
56
@ Override
50
57
public void onViewCreated (View view , @ Nullable Bundle savedInstanceState ) {
51
58
super .onViewCreated (view , savedInstanceState );
59
+
52
60
Button manualCommissioningButton = getView ().findViewById (R .id .manualCommissioningButton );
53
61
Callback callback = (Callback ) this .getActivity ();
54
- manualCommissioningButton . setOnClickListener (
62
+ View . OnClickListener manualCommissioningButtonOnClickListener =
55
63
new View .OnClickListener () {
56
64
@ Override
57
65
public void onClick (View v ) {
58
66
callback .handleCommissioningButtonClicked (null );
59
67
}
60
- });
61
- }
68
+ };
69
+ manualCommissioningButton .setOnClickListener (manualCommissioningButtonOnClickListener );
70
+
71
+ Context context = this .getContext ();
72
+ Context applicationContext = this .getContext ().getApplicationContext ();
73
+
74
+ SuccessCallback <DiscoveredNodeData > successCallback =
75
+ new SuccessCallback <DiscoveredNodeData >() {
76
+ @ Override
77
+ public void handle (DiscoveredNodeData discoveredNodeData ) {
78
+ Log .d (TAG , "Discovered a Video Player Commissioner: " + discoveredNodeData );
79
+ String buttonText = getCommissionerButtonText (discoveredNodeData );
62
80
63
- private void startCommissionerDiscovery () {
64
- Log .d (TAG , "CommissionerDiscoveryFragment.startCommissionerDiscovery called" );
65
- WifiManager wifi = (WifiManager ) this .getContext ().getSystemService (Context .WIFI_SERVICE );
66
- WifiManager .MulticastLock multicastLock = wifi .createMulticastLock ("multicastLock" );
67
- multicastLock .setReferenceCounted (true );
68
- multicastLock .acquire ();
81
+ if (!buttonText .isEmpty ()) {
82
+ Button commissionerButton = new Button (context );
83
+ commissionerButton .setText (buttonText );
84
+ CommissionerDiscoveryFragment .Callback callback =
85
+ (CommissionerDiscoveryFragment .Callback ) getActivity ();
86
+ commissionerButton .setOnClickListener (
87
+ new View .OnClickListener () {
88
+ @ Override
89
+ public void onClick (View v ) {
90
+ Log .d (
91
+ TAG ,
92
+ "CommissionerResolveListener.onServiceResolved.OnClickListener.onClick called for "
93
+ + discoveredNodeData );
94
+ callback .handleCommissioningButtonClicked (discoveredNodeData );
95
+ }
96
+ });
97
+ new Handler (Looper .getMainLooper ())
98
+ .post (
99
+ () ->
100
+ ((LinearLayout ) getActivity ().findViewById (R .id .castingCommissioners ))
101
+ .addView (commissionerButton ));
102
+ }
103
+ }
104
+ };
69
105
70
- CastingContext castingContext = new CastingContext (this .getActivity ());
71
- NsdManager .DiscoveryListener commissionerDiscoveryListener =
72
- new CommissionerDiscoveryListener (castingContext );
106
+ FailureCallback failureCallback =
107
+ new FailureCallback () {
108
+ @ Override
109
+ public void handle (MatterError matterError ) {
110
+ Log .e (TAG , "Error occurred during video player commissioner discovery: " + matterError );
111
+ }
112
+ };
73
113
74
- NsdManager nsdManager = castingContext .getNsdManager ();
75
- nsdManager .discoverServices (
76
- GlobalCastingConstants .CommissionerServiceType ,
77
- NsdManager .PROTOCOL_DNS_SD ,
78
- commissionerDiscoveryListener );
114
+ tvCastingApp .discoverVideoPlayerCommissioners (
115
+ (WifiManager ) context .getSystemService (Context .WIFI_SERVICE ),
116
+ (NsdManager ) applicationContext .getSystemService (Context .NSD_SERVICE ),
117
+ DISCOVERY_DURATION_SECS ,
118
+ successCallback ,
119
+ failureCallback );
120
+ }
79
121
80
- // Stop discovery after specified timeout
81
- Executors .newSingleThreadScheduledExecutor ()
82
- .schedule (
83
- new Runnable () {
84
- @ Override
85
- public void run () {
86
- nsdManager .stopServiceDiscovery (commissionerDiscoveryListener );
87
- multicastLock .release ();
88
- }
89
- },
90
- 10 ,
91
- TimeUnit .SECONDS );
92
- Log .d (TAG , "CommissionerDiscoveryFragment.startCommissionerDiscovery ended" );
122
+ @ VisibleForTesting
123
+ public String getCommissionerButtonText (DiscoveredNodeData commissioner ) {
124
+ String main = commissioner .getDeviceName () != null ? commissioner .getDeviceName () : "" ;
125
+ String aux =
126
+ "" + (commissioner .getProductId () > 0 ? "Product ID: " + commissioner .getProductId () : "" );
127
+ aux +=
128
+ commissioner .getDeviceType () > 0
129
+ ? (aux .isEmpty () ? "" : " " ) + "Device Type: " + commissioner .getDeviceType ()
130
+ : "" ;
131
+ aux +=
132
+ commissioner .getVendorId () > 0
133
+ ? (aux .isEmpty () ? "" : " from " ) + "Vendor ID: " + commissioner .getVendorId ()
134
+ : "" ;
135
+ aux = aux .isEmpty () ? aux : "\n [" + aux + "]" ;
136
+ return main + aux ;
93
137
}
94
138
95
139
/** Interface for notifying the host. */
0 commit comments