blob: 669cce7b1c293f349d0027104bfd6e2ef944d724 [file] [log] [blame]
/*
* Copyright (C) 2021 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.car.settings.units;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.car.drivingstate.CarUxRestrictions;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.property.CarPropertyManager;
import android.content.Context;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.ListPreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.testutils.TestLifecycleOwner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class UnitsBasePreferenceControllerTest {
private static final int TEST_PROPERTY_ID = -1;
private static final Unit[] AVAILABLE_UNITS =
{UnitsMap.YEAR, UnitsMap.SECS, UnitsMap.NANO_SECS};
private static final Unit DEFAULT_UNIT = UnitsMap.YEAR;
private Context mContext = ApplicationProvider.getApplicationContext();
private LifecycleOwner mLifecycleOwner;
private ListPreference mPreference;
private UnitsBasePreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
@Mock
private FragmentController mFragmentController;
@Mock
private CarPropertyManager mCarPropertyManager;
@Mock
private CarPropertyValue mCarPropertyValue;
@Mock
private CarUnitsManager mCarUnitsManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mLifecycleOwner = new TestLifecycleOwner();
doNothing().when(mCarUnitsManager).registerCarServiceListener(any());
when(mCarUnitsManager.getUnitsSupportedByProperty(TEST_PROPERTY_ID))
.thenReturn(AVAILABLE_UNITS);
updateDefaultUnit(DEFAULT_UNIT);
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
mPreference = new ListPreference(mContext);
mPreferenceController = new TestUnitsBasePreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
mPreferenceController.onCreate(mLifecycleOwner);
}
@Test
public void onCreate_registersCarServiceListener() {
verify(mCarUnitsManager)
.registerCarServiceListener(mPreferenceController.mOnCarServiceListener);
}
@Test
public void onCreate_preferenceIsConditionallyUnavailable() {
assertThat(mPreferenceController.getAvailabilityStatus())
.isEqualTo(PreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void onCarServiceConnected_availableUnitsExist_preferenceIsAvailable() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
PreferenceController.AVAILABLE);
}
@Test
public void onCarServiceConnected_noAvailableUnits_preferenceIsConditionallyUnavailable() {
when(mCarUnitsManager.getUnitsSupportedByProperty(TEST_PROPERTY_ID))
.thenReturn(null);
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
assertThat(mPreferenceController.getAvailabilityStatus())
.isEqualTo(PreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void onCarServiceConnected_setsEntriesOfSupportedUnits() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
CharSequence[] expectedEntries = mPreferenceController.getEntriesOfSupportedUnits();
assertThat(mPreference.getEntries()).isEqualTo(expectedEntries);
}
@Test
public void onCarServiceConnected_setsSupportedUnitsIdsAsEntryValues() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
CharSequence[] expectedEntryValues = mPreferenceController.getIdsOfSupportedUnits();
assertThat(mPreference.getEntryValues()).isEqualTo(expectedEntryValues);
}
@Test
public void onCarServiceConnected_setsUnitBeingUsedAsPreferenceValue() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
String expectedValue = Integer.toString(DEFAULT_UNIT.getId());
assertThat(mPreference.getValue()).isEqualTo(expectedValue);
}
@Test
public void onPreferenceChanged_runsSetUnitUsedByPropertyWithNewUnit() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
mPreferenceController.handlePreferenceChanged(mPreference,
Integer.toString(UnitsMap.SECS.getId()));
assertThat(mCarUnitsManager.getUnitUsedByProperty(TEST_PROPERTY_ID))
.isEqualTo(UnitsMap.SECS);
}
@Test
public void onPropertyChanged_propertyStatusIsAvailable_setsNewUnitIdAsValue() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
Unit newUnit = UnitsMap.SECS;
when(mCarPropertyValue.getStatus()).thenReturn(CarPropertyValue.STATUS_AVAILABLE);
when(mCarPropertyValue.getValue()).thenReturn(newUnit.getId());
mPreferenceController.mCarPropertyEventCallback.onChangeEvent(mCarPropertyValue);
assertThat(mPreference.getValue()).isEqualTo(Integer.toString(newUnit.getId()));
}
@Test
public void onPropertyChanged_propertyStatusIsAvailable_setsNewUnitAbbreviationAsSummary() {
mPreferenceController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
Unit newUnit = UnitsMap.SECS;
when(mCarPropertyValue.getStatus()).thenReturn(CarPropertyValue.STATUS_AVAILABLE);
when(mCarPropertyValue.getValue()).thenReturn(newUnit.getId());
mPreferenceController.mCarPropertyEventCallback.onChangeEvent(mCarPropertyValue);
assertThat(mPreference.getSummary())
.isEqualTo(mContext.getString(newUnit.getAbbreviationResId()));
}
@Test
public void onDestroy_disconnectsCarUnitsManager() {
mPreferenceController.onDestroy(mLifecycleOwner);
verify(mCarUnitsManager).disconnect();
}
@Test
public void onDestroy_unregistersCarServiceListener() {
mPreferenceController.onDestroy(mLifecycleOwner);
verify(mCarUnitsManager).unregisterCarServiceListener();
}
private void updateDefaultUnit(Unit unit) {
when(mCarUnitsManager.getUnitUsedByProperty(TEST_PROPERTY_ID))
.thenReturn(unit);
}
private class TestUnitsBasePreferenceController extends UnitsBasePreferenceController {
private TestUnitsBasePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
protected int getPropertyId() {
return TEST_PROPERTY_ID;
}
@Override
protected Class<ListPreference> getPreferenceType() {
return ListPreference.class;
}
@Override
public boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
int unitId = Integer.parseInt((String) newValue);
Unit newUnit = UnitsMap.MAP.get(unitId);
if (newUnit != null) {
updateDefaultUnit(newUnit);
}
return super.handlePreferenceChanged(preference, newValue);
}
@Override
CarUnitsManager createCarUnitsManager() {
return mCarUnitsManager;
}
}
}