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

Commit 3eb6d6b2 authored by Nergi Rahardi's avatar Nergi Rahardi Committed by Android (Google) Code Review
Browse files

Merge changes I86fee02e,I81f4696f into main

* changes:
  Exit resolution settings page when display is disconnected
  Cleanup ResolutionPreferenceFragmentTest
parents fca74cdc 9523510a
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -163,9 +163,7 @@ public class ResolutionPreferenceFragment extends SettingsPreferenceFragmentBase
        }
        var display = mInjector.getDisplay(getDisplayIdArg());
        if (display == null) {
            screen.removeAll();
            mTopOptionsPreference = null;
            mMoreOptionsPreference = null;
            finishFragment();
            return;
        }
        mResolutionPreferences.clear();
+55 −32
Original line number Diff line number Diff line
@@ -18,13 +18,14 @@ package com.android.settings.connecteddevice.display

import android.content.Context
import android.content.res.Resources
import android.view.Display.INVALID_DISPLAY
import android.view.View
import android.widget.TextView
import androidx.fragment.app.testing.EmptyFragmentActivity
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceScreen
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.connecteddevice.display.ResolutionPreferenceFragment.DISPLAY_MODE_LIMIT_OVERRIDE_PROP
import com.android.settings.connecteddevice.display.ResolutionPreferenceFragment.EXTERNAL_DISPLAY_RESOLUTION_SETTINGS_RESOURCE
@@ -32,29 +33,31 @@ import com.android.settings.connecteddevice.display.ResolutionPreferenceFragment
import com.android.settings.connecteddevice.display.ResolutionPreferenceFragment.TOP_OPTIONS_KEY
import com.android.settingslib.widget.SelectorWithWidgetPreference
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`

/** Unit tests for [ResolutionPreferenceFragment]. */
@RunWith(AndroidJUnit4::class)
class ResolutionPreferenceFragmentTest : ExternalDisplayTestBase() {

    private lateinit var fragment: ResolutionPreferenceFragment
    @Mock private lateinit var mockedMetricsLogger: MetricsLogger
    @get:Rule
    val activityScenario: ActivityScenarioRule<EmptyFragmentActivity> =
        ActivityScenarioRule(EmptyFragmentActivity::class.java)

    private var preferenceIdFromResource: Int = 0
    private var displayId: Int = INVALID_DISPLAY
    private lateinit var fragment: TestableResolutionPreferenceFragment
    private val metricsLogger: MetricsLogger = mock(MetricsLogger::class.java)

    @Test
    @UiThreadTest
    fun testCreateAndStart() {
        initFragment()
    fun testCreateAndStart_invalidDisplay() {
        initFragment(/* displayId= */ -1)
        mHandler.flush()
        assertThat(preferenceIdFromResource)
        assertThat(fragment.preferenceIdFromResource)
            .isEqualTo(EXTERNAL_DISPLAY_RESOLUTION_SETTINGS_RESOURCE)
        var pref = mPreferenceScreen.findPreference<Preference>(TOP_OPTIONS_KEY)
        assertThat(pref).isNull()
@@ -62,18 +65,6 @@ class ResolutionPreferenceFragmentTest : ExternalDisplayTestBase() {
        assertThat(pref).isNull()
    }

    @Test
    @UiThreadTest
    fun testCreateAndStartDefaultDisplayNotAllowed() {
        displayId = 0
        initFragment()
        mHandler.flush()
        var pref = mPreferenceScreen.findPreference<Preference>(TOP_OPTIONS_KEY)
        assertThat(pref).isNull()
        pref = mPreferenceScreen.findPreference(MORE_OPTIONS_KEY)
        assertThat(pref).isNull()
    }

    @Test
    @UiThreadTest
    fun testModePreferences_modeLimitFlagIsOn_noOverride() {
@@ -120,8 +111,8 @@ class ResolutionPreferenceFragmentTest : ExternalDisplayTestBase() {
    @UiThreadTest
    fun testModeChange() {
        val display = mDisplays[0]
        displayId = display.id
        initFragment()
        val displayId = display.id
        initFragment(displayId)
        mHandler.flush()
        val topPref = mPreferenceScreen.findPreference<PreferenceCategory>(TOP_OPTIONS_KEY)
        assertThat(topPref).isNotNull()
@@ -131,9 +122,24 @@ class ResolutionPreferenceFragmentTest : ExternalDisplayTestBase() {
        verify(mMockedInjector).setUserPreferredDisplayMode(displayId, mode)
    }

    @Test
    @UiThreadTest
    fun testDisplayRemoved_activityIsFinishing() {
        val displayId = mDisplays[0].id
        initFragment(displayId)
        mHandler.flush()

        `when`(mMockedInjector.getDisplay(displayId)).thenReturn(null)
        mListener.update(displayId)
        mHandler.flush()

        activityScenario.scenario.onActivity { activity: EmptyFragmentActivity ->
            assertThat(activity.isFinishing).isTrue()
        }
    }

    private fun runTestModePreferences(): Pair<PreferenceCategory, PreferenceCategory> {
        displayId = 1
        initFragment()
        initFragment(mDisplays[0].id)
        mHandler.flush()
        val topPref = mPreferenceScreen.findPreference<PreferenceCategory>(TOP_OPTIONS_KEY)
        assertThat(topPref).isNotNull()
@@ -142,22 +148,39 @@ class ResolutionPreferenceFragmentTest : ExternalDisplayTestBase() {
        return Pair(topPref!!, morePref!!)
    }

    private fun initFragment() {
    private fun initFragment(displayId: Int) {
        if (::fragment.isInitialized) {
            return
        }
        fragment = TestableResolutionPreferenceFragment()
        fragment =
            TestableResolutionPreferenceFragment(
                displayId,
                mPreferenceScreen,
                mContext,
                mMockedInjector,
                metricsLogger,
            )
        activityScenario.scenario.onActivity { activity: EmptyFragmentActivity ->
            activity.supportFragmentManager.beginTransaction().add(fragment, "tag").commitNow()
        }
        fragment.onCreateCallback(null)
        fragment.onActivityCreatedCallback(null)
        fragment.onStartCallback()
    }

    private inner class TestableResolutionPreferenceFragment :
        ResolutionPreferenceFragment(mMockedInjector) {
    class TestableResolutionPreferenceFragment(
        private val displayId: Int,
        private val preferenceScreen: PreferenceScreen,
        context: Context,
        injector: ConnectedDisplayInjector,
        logger: MetricsLogger,
    ) : ResolutionPreferenceFragment(injector) {
        private val mockRootView: View
        private val emptyView: TextView
        private val mockResources: Resources = mock(Resources::class.java)
        private val logger: MetricsLogger
        var preferenceIdFromResource: Int = -1
            private set

        init {
            doReturn(61)
@@ -173,13 +196,13 @@ class ResolutionPreferenceFragmentTest : ExternalDisplayTestBase() {
                .`when`(mockResources)
                .getBoolean(com.android.internal.R.bool.config_refreshRateSynchronizationEnabled)
            mockRootView = mock(View::class.java)
            emptyView = TextView(mContext)
            emptyView = TextView(context)
            doReturn(emptyView).`when`(mockRootView).findViewById<View>(android.R.id.empty)
            logger = mockedMetricsLogger
            this.logger = logger
        }

        override fun getPreferenceScreen(): PreferenceScreen {
            return super@ResolutionPreferenceFragmentTest.mPreferenceScreen
            return preferenceScreen
        }

        override fun getView(): View {