diff --git a/src/com/android/settings/wifi/ConnectedWifiEntryPreference.java b/src/com/android/settings/wifi/ConnectedWifiEntryPreference.java new file mode 100644 index 00000000000..f79499a37b8 --- /dev/null +++ b/src/com/android/settings/wifi/ConnectedWifiEntryPreference.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2020 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.wifi; + +import android.content.Context; +import android.view.View; + +import androidx.fragment.app.Fragment; +import androidx.preference.PreferenceViewHolder; + +import com.android.settingslib.R; +import com.android.settingslib.wifi.LongPressWifiEntryPreference; +import com.android.wifitrackerlib.WifiEntry; + +/** + * An AP preference for the currently connected AP. + */ +public class ConnectedWifiEntryPreference extends LongPressWifiEntryPreference implements + View.OnClickListener { + + private OnGearClickListener mOnGearClickListener; + + public ConnectedWifiEntryPreference(Context context, WifiEntry wifiEntry, Fragment fragment) { + super(context, wifiEntry, fragment); + setWidgetLayoutResource(R.layout.preference_widget_gear_optional_background); + } + + @Override + public void refresh() { + super.refresh(); + + if (getWifiEntry().canSignIn()) { + setSummary(R.string.wifi_tap_to_sign_in); + } + } + + /** + * Set gear icon click callback listener. + */ + public void setOnGearClickListener(OnGearClickListener l) { + mOnGearClickListener = l; + notifyChanged(); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + final View gear = holder.findViewById(R.id.settings_button); + gear.setOnClickListener(this); + + final boolean canSignIn = getWifiEntry().canSignIn(); + holder.findViewById(R.id.settings_button_no_background).setVisibility( + canSignIn ? View.INVISIBLE : View.VISIBLE); + gear.setVisibility(canSignIn ? View.VISIBLE : View.INVISIBLE); + holder.findViewById(R.id.two_target_divider).setVisibility( + canSignIn ? View.VISIBLE : View.INVISIBLE); + } + + @Override + public void onClick(View v) { + if (v.getId() == R.id.settings_button) { + if (mOnGearClickListener != null) { + mOnGearClickListener.onGearClick(this); + } + } + } + + /** + * Gear Icon click callback interface. + */ + public interface OnGearClickListener { + /** + * The callback triggered when gear icon is clicked. + */ + void onGearClick(ConnectedWifiEntryPreference p); + } + +} diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java index f88a4df9d0a..5152569b546 100644 --- a/src/com/android/settings/wifi/WifiSettings2.java +++ b/src/com/android/settings/wifi/WifiSettings2.java @@ -711,8 +711,8 @@ public class WifiSettings2 extends RestrictedSettingsFragment mConnectedWifiEntryPreferenceCategory.findPreference(connectedEntry.getKey()); if (connectedPref == null || connectedPref.getWifiEntry() != connectedEntry) { mConnectedWifiEntryPreferenceCategory.removeAll(); - final LongPressWifiEntryPreference pref = - createLongPressWifiEntryPreference(connectedEntry); + final ConnectedWifiEntryPreference pref = + new ConnectedWifiEntryPreference(getPrefContext(), connectedEntry, this); pref.setKey(connectedEntry.getKey()); pref.refresh(); mConnectedWifiEntryPreferenceCategory.addPreference(pref); @@ -724,6 +724,9 @@ public class WifiSettings2 extends RestrictedSettingsFragment } return true; }); + pref.setOnGearClickListener(preference -> { + launchNetworkDetailsFragment(pref); + }); } } else { mConnectedWifiEntryPreferenceCategory.removeAll(); diff --git a/tests/robotests/src/com/android/settings/wifi/ConnectedWifiEntryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/ConnectedWifiEntryPreferenceTest.java new file mode 100644 index 00000000000..401fdcff6e7 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/ConnectedWifiEntryPreferenceTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 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.wifi; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.view.View; + +import com.android.settings.R; +import com.android.wifitrackerlib.WifiEntry; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class ConnectedWifiEntryPreferenceTest { + + @Mock + private WifiEntry mWifiEntry; + @Mock + private View mView; + @Mock + private ConnectedWifiEntryPreference.OnGearClickListener mOnGearClickListener; + private Context mContext; + private ConnectedWifiEntryPreference mConnectedWifiEntryPreference; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = RuntimeEnvironment.application; + mConnectedWifiEntryPreference = new ConnectedWifiEntryPreference(mContext, mWifiEntry, + null /* fragment */); + mConnectedWifiEntryPreference.setOnGearClickListener(mOnGearClickListener); + } + + @Test + public void testOnClick_gearClicked_listenerInvoked() { + when(mView.getId()).thenReturn(R.id.settings_button); + + mConnectedWifiEntryPreference.onClick(mView); + + verify(mOnGearClickListener).onGearClick(mConnectedWifiEntryPreference); + } + + @Test + public void testOnClick_gearNotClicked_listenerNotInvoked() { + mConnectedWifiEntryPreference.onClick(mView); + + verify(mOnGearClickListener, never()).onGearClick(mConnectedWifiEntryPreference); + } + + @Test + public void testWidgetLayoutPreference() { + assertThat(mConnectedWifiEntryPreference.getWidgetLayoutResource()) + .isEqualTo(R.layout.preference_widget_gear_optional_background); + } +}