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 Original line Diff line number Diff line
@@ -26,15 +26,16 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager;
import android.hardware.display.IRemoteDisplayAdapter;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplayStatus;
import android.hardware.display.WifiDisplayStatus;
import android.net.Uri;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.preference.CheckBoxPreference;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.PreferenceScreen;
@@ -68,6 +69,9 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {


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

    private IRemoteDisplayAdapter mRemoteDisplayAdapter;


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


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


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


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

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


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


        mDisplayManager.scanWifiDisplays();
        mDisplayManager.scanWifiDisplays();

        scanRemoteDisplays();
        update();
        update();
    }
    }


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


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

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

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


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


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

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


            for (WifiDisplay d : pairedDisplays) {
            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) {
            if (mPairedDevicesCategory.getPreferenceCount() == 0) {
                preferenceScreen.removePreference(mPairedDevicesCategory);
                preferenceScreen.removePreference(mPairedDevicesCategory);
            }
            }
@@ -254,10 +299,17 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {


            for (WifiDisplay d : availableDisplays) {
            for (WifiDisplay d : availableDisplays) {
                if (!contains(pairedDisplays, d.getDeviceAddress())) {
                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);
                mAvailableDevicesCategory.setProgress(true);
            } else {
            } else {
                mAvailableDevicesCategory.setProgress(false);
                mAvailableDevicesCategory.setProgress(false);
@@ -271,10 +323,16 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
        getActivity().invalidateOptionsMenu();
        getActivity().invalidateOptionsMenu();
    }
    }


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


    private void showDisconnectDialog(final WifiDisplay display) {
    private void showDisconnectDialog(final WifiDisplay display, final boolean isRemoteDisplay) {
        DialogInterface.OnClickListener ok = new DialogInterface.OnClickListener() {
        DialogInterface.OnClickListener ok = new DialogInterface.OnClickListener() {
            @Override
            @Override
            public void onClick(DialogInterface dialog, int which) {
            public void onClick(DialogInterface dialog, int which) {
                if (display.equals(mWifiDisplayStatus.getActiveDisplay())) {
                if (!isRemoteDisplay && display.equals(mWifiDisplayStatus.getActiveDisplay())) {
                    mDisplayManager.disconnectWifiDisplay();
                    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();
        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);
        View view = getActivity().getLayoutInflater().inflate(R.layout.wifi_display_options, null);
        final EditText nameEditText = (EditText)view.findViewById(R.id.name);
        final EditText nameEditText = (EditText)view.findViewById(R.id.name);
        nameEditText.setText(display.getFriendlyDisplayName());
        nameEditText.setText(display.getFriendlyDisplayName());
@@ -325,13 +389,29 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
                if (name.isEmpty() || name.equals(display.getDeviceName())) {
                if (name.isEmpty() || name.equals(display.getDeviceName())) {
                    name = null;
                    name = null;
                }
                }
                if (!isRemoteDisplay) {
                    mDisplayManager.renameWifiDisplay(display.getDeviceAddress(), name);
                    mDisplayManager.renameWifiDisplay(display.getDeviceAddress(), name);
                } else {
                    try {
                        mRemoteDisplayAdapter.renameRemoteDisplay(display.getDeviceAddress(), name);
                    }
                    catch (RemoteException e) {
                    }
                }
            }
            }
        };
        };
        DialogInterface.OnClickListener forget = new DialogInterface.OnClickListener() {
        DialogInterface.OnClickListener forget = new DialogInterface.OnClickListener() {
            @Override
            @Override
            public void onClick(DialogInterface dialog, int which) {
            public void onClick(DialogInterface dialog, int which) {
                if (!isRemoteDisplay) {
                    mDisplayManager.forgetWifiDisplay(display.getDeviceAddress());
                    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);
                        DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
                mWifiDisplayStatus = status;
                mWifiDisplayStatus = status;
                applyState();
                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
    private final class WifiDisplayPreference extends Preference
            implements View.OnClickListener {
            implements View.OnClickListener {
        private final WifiDisplay mDisplay;
        private final WifiDisplay mDisplay;
        private final boolean mIsRemoteDisplay;


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


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


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


        public boolean isRemoteDisplay() {
            return mIsRemoteDisplay;
        }

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


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