Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c863f01 authored by Koushik Dutta's avatar Koushik Dutta
Browse files

Add support for the new Remote Display APIs.

Remote display devices will now show up under wireless displays.

Change-Id: I1e73a208fe092a697c8294b743b0f1e2c0eabf42
parent b5c6f021
Loading
Loading
Loading
Loading
+112 −20
Original line number Diff line number Diff line
@@ -26,15 +26,16 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.hardware.display.DisplayManager;
import android.hardware.display.IRemoteDisplayAdapter;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplayStatus;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
@@ -68,6 +69,9 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {

    private boolean mWifiDisplayOnSetting;
    private WifiDisplayStatus mWifiDisplayStatus;
    private WifiDisplayStatus mRemoteDisplayStatus;

    private IRemoteDisplayAdapter mRemoteDisplayAdapter;

    private PreferenceGroup mPairedDevicesCategory;
    private ProgressCategory mAvailableDevicesCategory;
@@ -87,6 +91,7 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        super.onCreate(icicle);

        mDisplayManager = (DisplayManager)getActivity().getSystemService(Context.DISPLAY_SERVICE);
        mRemoteDisplayAdapter = mDisplayManager.getRemoteDisplayAdapter();

        addPreferencesFromResource(R.xml.wifi_display_settings);
        setHasOptionsMenu(true);
@@ -127,6 +132,14 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        super.onDestroyView();
    }

    private void scanRemoteDisplays() {
        try {
            mRemoteDisplayAdapter.scanRemoteDisplays();
        }
        catch (RemoteException e) {
        }
    }

    @Override
    public void onResume() {
        super.onResume();
@@ -134,13 +147,14 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        Context context = getActivity();
        IntentFilter filter = new IntentFilter();
        filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED);
        filter.addAction(DisplayManager.ACTION_REMOTE_DISPLAY_STATUS_CHANGED);
        context.registerReceiver(mReceiver, filter);

        getContentResolver().registerContentObserver(Settings.Secure.getUriFor(
                Settings.Global.WIFI_DISPLAY_ON), false, mSettingsObserver);

        mDisplayManager.scanWifiDisplays();

        scanRemoteDisplays();
        update();
    }

@@ -173,6 +187,9 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
                if (mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
                    mDisplayManager.scanWifiDisplays();
                }
                if (mRemoteDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
                    scanRemoteDisplays();
                }
                return true;
        }
        return super.onOptionsItemSelected(item);
@@ -185,10 +202,23 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
            WifiDisplayPreference p = (WifiDisplayPreference)preference;
            WifiDisplay display = p.getDisplay();

            if (display.equals(mWifiDisplayStatus.getActiveDisplay())) {
                showDisconnectDialog(display);
            boolean isActive = false;
            if (p.isRemoteDisplay()) {
                isActive = display.equals(mRemoteDisplayStatus.getActiveDisplay());
            } else {
                isActive = display.equals(mWifiDisplayStatus.getActiveDisplay());
            }

            if (isActive) {
                showDisconnectDialog(display, p.isRemoteDisplay());
            } else if (!p.isRemoteDisplay()) {
                mDisplayManager.connectWifiDisplay(display.getDeviceAddress());
            } else {
                try {
                    mRemoteDisplayAdapter.connectRemoteDisplay(display.getDeviceAddress());
                }
                catch (RemoteException e) {
                }
            }
        }
        else if (preference == mDisableHDCP) {
@@ -203,7 +233,11 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        mWifiDisplayOnSetting = Settings.Global.getInt(getContentResolver(),
                Settings.Global.WIFI_DISPLAY_ON, 0) != 0;
        mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();

        try {
            mRemoteDisplayStatus = mRemoteDisplayAdapter.getRemoteDisplayStatus();
        }
        catch (RemoteException e) {
        }
        applyState();
    }

@@ -219,6 +253,9 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
            final WifiDisplay[] pairedDisplays = mWifiDisplayStatus.getRememberedDisplays();
            final WifiDisplay[] availableDisplays = mWifiDisplayStatus.getAvailableDisplays();

            final WifiDisplay[] pairedRemoteDisplays = mRemoteDisplayStatus.getRememberedDisplays();
            final WifiDisplay[] availableRemoteDisplays = mRemoteDisplayStatus.getAvailableDisplays();

            mDisableHDCP = new CheckBoxPreference(getActivity().getApplicationContext());
            mDisableHDCP.setTitle(R.string.pref_wifi_disable_hdcp_title);
            mDisableHDCP.setSummary(R.string.pref_wifi_disable_hdcp_summary);
@@ -236,8 +273,16 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
            preferenceScreen.addPreference(mPairedDevicesCategory);

            for (WifiDisplay d : pairedDisplays) {
                mPairedDevicesCategory.addPreference(createWifiDisplayPreference(d, true));
                mPairedDevicesCategory.addPreference(createWifiDisplayPreference(d, true, false));
            }

            for (WifiDisplay d : pairedRemoteDisplays) {
                if (d.isHidden()) {
                    continue;
                }
                mPairedDevicesCategory.addPreference(createWifiDisplayPreference(d, true, true));
            }

            if (mPairedDevicesCategory.getPreferenceCount() == 0) {
                preferenceScreen.removePreference(mPairedDevicesCategory);
            }
@@ -254,10 +299,17 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {

            for (WifiDisplay d : availableDisplays) {
                if (!contains(pairedDisplays, d.getDeviceAddress())) {
                    mAvailableDevicesCategory.addPreference(createWifiDisplayPreference(d, false));
                    mAvailableDevicesCategory.addPreference(createWifiDisplayPreference(d, false, false));
                }
            }
            for (WifiDisplay d : availableRemoteDisplays) {
                if (!contains(pairedRemoteDisplays, d.getDeviceAddress())
                        && !(d.getDeviceName().startsWith("hidden:"))) {
                    mAvailableDevicesCategory.addPreference(createWifiDisplayPreference(d, false, true));
                }
            }
            if (mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) {
            if (mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING ||
                    mRemoteDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) {
                mAvailableDevicesCategory.setProgress(true);
            } else {
                mAvailableDevicesCategory.setProgress(false);
@@ -271,10 +323,16 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        getActivity().invalidateOptionsMenu();
    }

    private Preference createWifiDisplayPreference(final WifiDisplay d, boolean paired) {
        WifiDisplayPreference p = new WifiDisplayPreference(getActivity(), d);
        if (d.equals(mWifiDisplayStatus.getActiveDisplay())) {
            switch (mWifiDisplayStatus.getActiveDisplayState()) {
    private Preference createWifiDisplayPreference(final WifiDisplay d, boolean paired, boolean isRemote) {
        WifiDisplayPreference p = new WifiDisplayPreference(getActivity(), d, isRemote);
        WifiDisplayStatus displayStatus = null;
        if (isRemote) {
            displayStatus = mRemoteDisplayStatus;
        } else {
            displayStatus = mWifiDisplayStatus;
        }
        if (d.equals(displayStatus.getActiveDisplay())) {
            switch (displayStatus.getActiveDisplayState()) {
                case WifiDisplayStatus.DISPLAY_STATE_CONNECTED:
                    p.setSummary(R.string.wifi_display_status_connected);
                    break;
@@ -282,7 +340,7 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
                    p.setSummary(R.string.wifi_display_status_connecting);
                    break;
            }
        } else if (paired && contains(mWifiDisplayStatus.getAvailableDisplays(),
        } else if (paired && contains(displayStatus.getAvailableDisplays(),
                d.getDeviceAddress())) {
            p.setSummary(R.string.wifi_display_status_available);
        }
@@ -292,12 +350,18 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        return p;
    }

    private void showDisconnectDialog(final WifiDisplay display) {
    private void showDisconnectDialog(final WifiDisplay display, final boolean isRemoteDisplay) {
        DialogInterface.OnClickListener ok = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (display.equals(mWifiDisplayStatus.getActiveDisplay())) {
                if (!isRemoteDisplay && display.equals(mWifiDisplayStatus.getActiveDisplay())) {
                    mDisplayManager.disconnectWifiDisplay();
                } else if (isRemoteDisplay && display.equals(mRemoteDisplayStatus.getActiveDisplay())) {
                    try {
                        mRemoteDisplayAdapter.disconnectRemoteDisplay();
                    }
                    catch (RemoteException e) {
                    }
                }
            }
        };
@@ -313,7 +377,7 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        dialog.show();
    }

    private void showOptionsDialog(final WifiDisplay display) {
    private void showOptionsDialog(final WifiDisplay display, final boolean isRemoteDisplay) {
        View view = getActivity().getLayoutInflater().inflate(R.layout.wifi_display_options, null);
        final EditText nameEditText = (EditText)view.findViewById(R.id.name);
        nameEditText.setText(display.getFriendlyDisplayName());
@@ -325,13 +389,29 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
                if (name.isEmpty() || name.equals(display.getDeviceName())) {
                    name = null;
                }
                if (!isRemoteDisplay) {
                    mDisplayManager.renameWifiDisplay(display.getDeviceAddress(), name);
                } else {
                    try {
                        mRemoteDisplayAdapter.renameRemoteDisplay(display.getDeviceAddress(), name);
                    }
                    catch (RemoteException e) {
                    }
                }
            }
        };
        DialogInterface.OnClickListener forget = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (!isRemoteDisplay) {
                    mDisplayManager.forgetWifiDisplay(display.getDeviceAddress());
                } else {
                    try {
                        mRemoteDisplayAdapter.forgetRemoteDisplay(display.getDeviceAddress());
                    }
                    catch (RemoteException e) {
                    }
                }
            }
        };

@@ -373,6 +453,11 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
                        DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
                mWifiDisplayStatus = status;
                applyState();
            } else if (action.equals(DisplayManager.ACTION_REMOTE_DISPLAY_STATUS_CHANGED)) {
                WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra(
                        DisplayManager.EXTRA_REMOTE_DISPLAY_STATUS);
                mRemoteDisplayStatus = status;
                applyState();
            }
        }
    };
@@ -387,11 +472,14 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
    private final class WifiDisplayPreference extends Preference
            implements View.OnClickListener {
        private final WifiDisplay mDisplay;
        private final boolean mIsRemoteDisplay;

        public WifiDisplayPreference(Context context, WifiDisplay display) {
        public WifiDisplayPreference(Context context,
                WifiDisplay display, boolean isRemoteDisplay) {
            super(context);

            mDisplay = display;
            mIsRemoteDisplay = isRemoteDisplay;
            setTitle(display.getFriendlyDisplayName());
        }

@@ -399,6 +487,10 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
            return mDisplay;
        }

        public boolean isRemoteDisplay() {
            return mIsRemoteDisplay;
        }

        @Override
        protected void onBindView(View view) {
            super.onBindView(view);
@@ -418,7 +510,7 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {

        @Override
        public void onClick(View v) {
            showOptionsDialog(mDisplay);
            showOptionsDialog(mDisplay, mIsRemoteDisplay);
        }
    }
}