5353import java .util .ArrayList ;
5454import java .util .Enumeration ;
5555
56+ import libcore .util .Objects ;
57+
5658/**
5759 * Manages all of the various asynchronous interactions with the {@link WifiP2pManager}
5860 * on behalf of {@link WifiDisplayAdapter}.
@@ -140,6 +142,13 @@ final class WifiDisplayController implements DumpUtils.Dump {
140142 // True if the remote submix is enabled.
141143 private boolean mRemoteSubmixOn ;
142144
145+ // The information we have most recently told WifiDisplayAdapter about.
146+ private WifiDisplay mAdvertisedDisplay ;
147+ private Surface mAdvertisedDisplaySurface ;
148+ private int mAdvertisedDisplayWidth ;
149+ private int mAdvertisedDisplayHeight ;
150+ private int mAdvertisedDisplayFlags ;
151+
143152 public WifiDisplayController (Context context , Handler handler , Listener listener ) {
144153 mContext = context ;
145154 mHandler = handler ;
@@ -193,6 +202,11 @@ public void dump(PrintWriter pw) {
193202 pw .println ("mRemoteDisplayInterface=" + mRemoteDisplayInterface );
194203 pw .println ("mRemoteDisplayConnected=" + mRemoteDisplayConnected );
195204 pw .println ("mRemoteSubmixOn=" + mRemoteSubmixOn );
205+ pw .println ("mAdvertisedDisplay=" + mAdvertisedDisplay );
206+ pw .println ("mAdvertisedDisplaySurface=" + mAdvertisedDisplaySurface );
207+ pw .println ("mAdvertisedDisplayWidth=" + mAdvertisedDisplayWidth );
208+ pw .println ("mAdvertisedDisplayHeight=" + mAdvertisedDisplayHeight );
209+ pw .println ("mAdvertisedDisplayFlags=" + mAdvertisedDisplayFlags );
196210
197211 pw .println ("mAvailableWifiDisplayPeers: size=" + mAvailableWifiDisplayPeers .size ());
198212 for (WifiP2pDevice device : mAvailableWifiDisplayPeers ) {
@@ -439,13 +453,7 @@ private void updateConnection() {
439453 mHandler .removeCallbacks (mRtspTimeout );
440454
441455 setRemoteSubmixOn (false );
442-
443- mHandler .post (new Runnable () {
444- @ Override
445- public void run () {
446- mListener .onDisplayDisconnected ();
447- }
448- });
456+ unadvertiseDisplay ();
449457
450458 // continue to next step
451459 }
@@ -454,6 +462,8 @@ public void run() {
454462 if (mConnectedDevice != null && mConnectedDevice != mDesiredDevice ) {
455463 Slog .i (TAG , "Disconnecting from Wifi display: " + mConnectedDevice .deviceName );
456464
465+ unadvertiseDisplay ();
466+
457467 final WifiP2pDevice oldDevice = mConnectedDevice ;
458468 mWifiP2pManager .removeGroup (mWifiP2pChannel , new ActionListener () {
459469 @ Override
@@ -484,6 +494,7 @@ private void next() {
484494 if (mConnectingDevice != null && mConnectingDevice != mDesiredDevice ) {
485495 Slog .i (TAG , "Canceling connection to Wifi display: " + mConnectingDevice .deviceName );
486496
497+ unadvertiseDisplay ();
487498 mHandler .removeCallbacks (mConnectionTimeout );
488499
489500 final WifiP2pDevice oldDevice = mConnectingDevice ;
@@ -513,6 +524,7 @@ private void next() {
513524
514525 // Step 4. If we wanted to disconnect, then mission accomplished.
515526 if (mDesiredDevice == null ) {
527+ unadvertiseDisplay ();
516528 return ; // done
517529 }
518530
@@ -526,13 +538,8 @@ private void next() {
526538 // Helps with STA & P2P concurrency
527539 config .groupOwnerIntent = WifiP2pConfig .MAX_GROUP_OWNER_INTENT ;
528540
529- final WifiDisplay display = createWifiDisplay (mConnectingDevice );
530- mHandler .post (new Runnable () {
531- @ Override
532- public void run () {
533- mListener .onDisplayConnecting (display );
534- }
535- });
541+ WifiDisplay display = createWifiDisplay (mConnectingDevice );
542+ advertiseDisplay (display , null , 0 , 0 , 0 );
536543
537544 final WifiP2pDevice newDevice = mDesiredDevice ;
538545 mWifiP2pManager .connect (mWifiP2pChannel , config , new ActionListener () {
@@ -551,13 +558,6 @@ public void onFailure(int reason) {
551558 if (mConnectingDevice == newDevice ) {
552559 Slog .i (TAG , "Failed to initiate connection to Wifi display: "
553560 + newDevice .deviceName + ", reason=" + reason );
554- mHandler .post (new Runnable () {
555- @ Override
556- public void run () {
557- mListener .onDisplayDisconnected ();
558- }
559- });
560-
561561 mConnectingDevice = null ;
562562 handleConnectionFailure (false );
563563 }
@@ -588,22 +588,16 @@ public void run() {
588588
589589 mRemoteDisplay = RemoteDisplay .listen (iface , new RemoteDisplay .Listener () {
590590 @ Override
591- public void onDisplayConnected (final Surface surface ,
592- final int width , final int height , final int flags ) {
591+ public void onDisplayConnected (Surface surface ,
592+ int width , int height , int flags ) {
593593 if (mConnectedDevice == oldDevice && !mRemoteDisplayConnected ) {
594594 Slog .i (TAG , "Opened RTSP connection with Wifi display: "
595595 + mConnectedDevice .deviceName );
596596 mRemoteDisplayConnected = true ;
597597 mHandler .removeCallbacks (mRtspTimeout );
598598
599599 final WifiDisplay display = createWifiDisplay (mConnectedDevice );
600- mHandler .post (new Runnable () {
601- @ Override
602- public void run () {
603- mListener .onDisplayConnected (display ,
604- surface , width , height , flags );
605- }
606- });
600+ advertiseDisplay (display , surface , width , height , flags );
607601 }
608602 }
609603
@@ -728,13 +722,6 @@ public void run() {
728722 private void handleConnectionFailure (boolean timeoutOccurred ) {
729723 Slog .i (TAG , "Wifi display connection failed!" );
730724
731- mHandler .post (new Runnable () {
732- @ Override
733- public void run () {
734- mListener .onDisplayConnectionFailed ();
735- }
736- });
737-
738725 if (mDesiredDevice != null ) {
739726 if (mConnectionRetriesLeft > 0 ) {
740727 final WifiP2pDevice oldDevice = mDesiredDevice ;
@@ -755,6 +742,48 @@ public void run() {
755742 }
756743 }
757744
745+ private void advertiseDisplay (final WifiDisplay display ,
746+ final Surface surface , final int width , final int height , final int flags ) {
747+ if (!Objects .equal (mAdvertisedDisplay , display )
748+ || mAdvertisedDisplaySurface != surface
749+ || mAdvertisedDisplayWidth != width
750+ || mAdvertisedDisplayHeight != height
751+ || mAdvertisedDisplayFlags != flags ) {
752+ final WifiDisplay oldDisplay = mAdvertisedDisplay ;
753+ final Surface oldSurface = mAdvertisedDisplaySurface ;
754+
755+ mAdvertisedDisplay = display ;
756+ mAdvertisedDisplaySurface = surface ;
757+ mAdvertisedDisplayWidth = width ;
758+ mAdvertisedDisplayHeight = height ;
759+ mAdvertisedDisplayFlags = flags ;
760+
761+ mHandler .post (new Runnable () {
762+ @ Override
763+ public void run () {
764+ if (oldSurface != null && surface != oldSurface ) {
765+ mListener .onDisplayDisconnected ();
766+ } else if (oldDisplay != null && !Objects .equal (display , oldDisplay )) {
767+ mListener .onDisplayConnectionFailed ();
768+ }
769+
770+ if (display != null ) {
771+ if (!Objects .equal (display , oldDisplay )) {
772+ mListener .onDisplayConnecting (display );
773+ }
774+ if (surface != null && surface != oldSurface ) {
775+ mListener .onDisplayConnected (display , surface , width , height , flags );
776+ }
777+ }
778+ }
779+ });
780+ }
781+ }
782+
783+ private void unadvertiseDisplay () {
784+ advertiseDisplay (null , null , 0 , 0 , 0 );
785+ }
786+
758787 private static Inet4Address getInterfaceAddress (WifiP2pGroup info ) {
759788 NetworkInterface iface ;
760789 try {
0 commit comments