diff options
Diffstat (limited to 'services/java/com/android/server/display/WifiDisplayAdapter.java')
-rw-r--r-- | services/java/com/android/server/display/WifiDisplayAdapter.java | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/services/java/com/android/server/display/WifiDisplayAdapter.java b/services/java/com/android/server/display/WifiDisplayAdapter.java index b655b3a..4c80cf5 100644 --- a/services/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/java/com/android/server/display/WifiDisplayAdapter.java @@ -45,6 +45,8 @@ import android.view.SurfaceControl; import java.io.PrintWriter; import java.util.Arrays; +import java.util.List; +import java.util.ArrayList; import libcore.util.Objects; @@ -88,6 +90,7 @@ final class WifiDisplayAdapter extends DisplayAdapter { private int mScanState; private int mActiveDisplayState; private WifiDisplay mActiveDisplay; + private WifiDisplay[] mDisplays = WifiDisplay.EMPTY_ARRAY; private WifiDisplay[] mAvailableDisplays = WifiDisplay.EMPTY_ARRAY; private WifiDisplay[] mRememberedDisplays = WifiDisplay.EMPTY_ARRAY; @@ -116,6 +119,7 @@ final class WifiDisplayAdapter extends DisplayAdapter { pw.println("mScanState=" + mScanState); pw.println("mActiveDisplayState=" + mActiveDisplayState); pw.println("mActiveDisplay=" + mActiveDisplay); + pw.println("mDisplays=" + Arrays.toString(mDisplays)); pw.println("mAvailableDisplays=" + Arrays.toString(mAvailableDisplays)); pw.println("mRememberedDisplays=" + Arrays.toString(mRememberedDisplays)); pw.println("mPendingStatusChangeBroadcast=" + mPendingStatusChangeBroadcast); @@ -229,7 +233,8 @@ final class WifiDisplayAdapter extends DisplayAdapter { WifiDisplay display = mPersistentDataStore.getRememberedWifiDisplay(address); if (display != null && !Objects.equal(display.getDeviceAlias(), alias)) { - display = new WifiDisplay(address, display.getDeviceName(), alias); + display = new WifiDisplay(address, display.getDeviceName(), alias, + false, false, false); if (mPersistentDataStore.rememberWifiDisplay(display)) { mPersistentDataStore.saveIfNeeded(); updateRememberedDisplaysLocked(); @@ -262,7 +267,7 @@ final class WifiDisplayAdapter extends DisplayAdapter { if (mCurrentStatus == null) { mCurrentStatus = new WifiDisplayStatus( mFeatureState, mScanState, mActiveDisplayState, - mActiveDisplay, mAvailableDisplays, mRememberedDisplays); + mActiveDisplay, mDisplays); } if (DEBUG) { @@ -271,10 +276,36 @@ final class WifiDisplayAdapter extends DisplayAdapter { return mCurrentStatus; } + private void updateDisplaysLocked() { + List<WifiDisplay> displays = new ArrayList<WifiDisplay>( + mAvailableDisplays.length + mRememberedDisplays.length); + boolean[] remembered = new boolean[mAvailableDisplays.length]; + for (WifiDisplay d : mRememberedDisplays) { + boolean available = false; + for (int i = 0; i < mAvailableDisplays.length; i++) { + if (d.equals(mAvailableDisplays[i])) { + remembered[i] = available = true; + break; + } + } + if (!available) { + displays.add(new WifiDisplay(d.getDeviceAddress(), d.getDeviceName(), + d.getDeviceAlias(), false, false, true)); + } + } + for (int i = 0; i < mAvailableDisplays.length; i++) { + WifiDisplay d = mAvailableDisplays[i]; + displays.add(new WifiDisplay(d.getDeviceAddress(), d.getDeviceName(), + d.getDeviceAlias(), true, d.canConnect(), remembered[i])); + } + mDisplays = displays.toArray(WifiDisplay.EMPTY_ARRAY); + } + private void updateRememberedDisplaysLocked() { mRememberedDisplays = mPersistentDataStore.getRememberedWifiDisplays(); mActiveDisplay = mPersistentDataStore.applyWifiDisplayAlias(mActiveDisplay); mAvailableDisplays = mPersistentDataStore.applyWifiDisplayAliases(mAvailableDisplays); + updateDisplaysLocked(); } private void fixRememberedDisplayNamesFromAvailableDisplaysLocked() { @@ -487,11 +518,18 @@ final class WifiDisplayAdapter extends DisplayAdapter { availableDisplays = mPersistentDataStore.applyWifiDisplayAliases( availableDisplays); - if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING - || !Arrays.equals(mAvailableDisplays, availableDisplays)) { + // check if any of the available displays changed canConnect status + boolean changed = !Arrays.equals(mAvailableDisplays, availableDisplays); + for (int i = 0; !changed && i<availableDisplays.length; i++) { + changed = availableDisplays[i].canConnect() + != mAvailableDisplays[i].canConnect(); + } + + if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING || changed) { mScanState = WifiDisplayStatus.SCAN_STATE_NOT_SCANNING; mAvailableDisplays = availableDisplays; fixRememberedDisplayNamesFromAvailableDisplaysLocked(); + updateDisplaysLocked(); scheduleStatusChangedBroadcastLocked(); } } |