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

Commit 5561543a authored by Fan Zhang's avatar Fan Zhang
Browse files

Add summary provider for Cast Setting (WifiDisplaySettings)

Change-Id: Ieaf413e3d698a9cbcb0560bfa65f380675677a74
Fix: 34976128
Test: make RunSettingsRoboTests
parent 99f0b444
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -2129,6 +2129,11 @@
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter android:priority="6">
                <action android:name="com.android.settings.action.SETTINGS"/>
            </intent-filter>
            <meta-data android:name="com.android.settings.category"
                       android:value="com.android.settings.category.ia.device" />
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.wfd.WifiDisplaySettings" />
        </activity>
@@ -3282,17 +3287,6 @@
                       android:value="com.android.settings.applications.ProcessStatsSummary" />
        </activity-alias>

        <activity-alias android:name="CastDashboardAlias"
                        android:targetActivity="Settings$WifiDisplaySettingsActivity">
            <intent-filter android:priority="6">
                <action android:name="com.android.settings.action.SETTINGS"/>
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                       android:value="com.android.settings.wfd.WifiDisplaySettings" />
            <meta-data android:name="com.android.settings.category"
                       android:value="com.android.settings.category.ia.device" />
        </activity-alias>

        <activity-alias android:name="PrintDashboardAlias"
                        android:targetActivity="Settings$PrintSettingsActivity">
            <intent-filter android:priority="2">
+68 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import com.android.internal.app.MediaRouteDialogPresenter;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.dashboard.SummaryLoader;

/**
 * The Settings screen for WifiDisplay configuration and connection management.
@@ -744,4 +745,71 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
            return true;
        }
    }

    private static class SummaryProvider implements SummaryLoader.SummaryProvider {

        private final Context mContext;
        private final SummaryLoader mSummaryLoader;
        private final MediaRouter mRouter;
        private final MediaRouter.Callback mRouterCallback = new MediaRouter.SimpleCallback() {
            @Override
            public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
                updateSummary();
            }

            @Override
            public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
                updateSummary();
            }

            @Override
            public void onRouteAdded(MediaRouter router, RouteInfo info) {
                updateSummary();
            }

            @Override
            public void onRouteRemoved(MediaRouter router, RouteInfo info) {
                updateSummary();
            }

            @Override
            public void onRouteChanged(MediaRouter router, RouteInfo info) {
                updateSummary();
            }
        };

        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
            mContext = context;
            mSummaryLoader = summaryLoader;
            mRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
        }

        @Override
        public void setListening(boolean listening) {
            if (listening) {
                mRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, mRouterCallback);
                updateSummary();
            } else {
                mRouter.removeCallback(mRouterCallback);
            }
        }

        private void updateSummary() {
            String summary = mContext.getString(R.string.disconnected);

            final int routeCount = mRouter.getRouteCount();
            for (int i = 0; i < routeCount; i++) {
                final MediaRouter.RouteInfo route = mRouter.getRouteAt(i);
                if (route.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY)
                        && route.isSelected() && !route.isConnecting()) {
                    summary = mContext.getString(R.string.wifi_display_status_connected);
                    break;
                }
            }
            mSummaryLoader.setSummary(this, summary);
        }
    }

    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
            = (activity, summaryLoader) -> new SummaryProvider(activity, summaryLoader);
}
+85 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.wfd;

import android.app.Activity;
import android.content.Context;
import android.media.MediaRouter;

import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.SummaryLoader;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class WifiDisplaySettingsTest {

    @Mock
    private Activity mActivity;
    @Mock
    private SummaryLoader mSummaryLoader;
    @Mock
    private MediaRouter mMediaRouter;

    private SummaryLoader.SummaryProvider mSummaryProvider;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        when(mActivity.getSystemService(Context.MEDIA_ROUTER_SERVICE))
                .thenReturn(mMediaRouter);

        mSummaryProvider = WifiDisplaySettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(
                mActivity, mSummaryLoader);
    }

    @Test
    public void listenToSummary_disconnected_shouldProvideDisconnectedSummary() {
        mSummaryProvider.setListening(true);

        verify(mActivity).getString(R.string.disconnected);
        verify(mActivity, never()).getString(R.string.wifi_display_status_connected);
    }

    @Test
    public void listenToSummary_connected_shouldProvideConnectedSummary() {
        final MediaRouter.RouteInfo route = mock(MediaRouter.RouteInfo.class);
        when(mMediaRouter.getRouteCount()).thenReturn(1);
        when(mMediaRouter.getRouteAt(0)).thenReturn(route);
        when(route.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY)).thenReturn(true);
        when(route.isSelected()).thenReturn(true);
        when(route.isConnecting()).thenReturn(false);

        mSummaryProvider.setListening(true);

        verify(mActivity).getString(R.string.wifi_display_status_connected);
    }

}