Loading AndroidManifest.xml +5 −11 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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"> Loading src/com/android/settings/wfd/WifiDisplaySettings.java +68 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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); } tests/robotests/src/com/android/settings/wfd/WifiDisplaySettingsTest.java 0 → 100644 +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); } } Loading
AndroidManifest.xml +5 −11 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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"> Loading
src/com/android/settings/wfd/WifiDisplaySettings.java +68 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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); }
tests/robotests/src/com/android/settings/wfd/WifiDisplaySettingsTest.java 0 → 100644 +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); } }