diff --git a/res/drawable/ic_gray_scale_24dp.xml b/res/drawable/ic_gray_scale_24dp.xml new file mode 100644 index 00000000000..3fda134ade7 --- /dev/null +++ b/res/drawable/ic_gray_scale_24dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/res/values/config.xml b/res/values/config.xml index e6ada66a442..805469a63e5 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -356,4 +356,7 @@ content://com.google.android.gms.nearby.fastpair/device_status_list_item + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 0d6eaeb2527..2e1f4c7171e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9275,6 +9275,12 @@ Screen tinted amber + + Greyscale + + + Display only in grey color + %1$d diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java index c741b98c359..66f6c81e984 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java @@ -162,6 +162,7 @@ public class ConditionManager { mCardControllers.add(new RingerVibrateConditionController(mAppContext, this /* manager */)); mCardControllers.add(new RingerMutedConditionController(mAppContext, this /* manager */)); mCardControllers.add(new WorkModeConditionController(mAppContext, this /* manager */)); + mCardControllers.add(new GrayscaleConditionController(mAppContext, this /* manager */)); } /** diff --git a/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionController.java new file mode 100644 index 00000000000..664707def69 --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionController.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2019 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.homepage.contextualcards.conditional; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.content.Intent; +import android.hardware.display.ColorDisplayManager; +import android.util.Log; + +import com.android.settings.R; +import com.android.settings.homepage.contextualcards.ContextualCard; + +import java.net.URISyntaxException; +import java.util.Objects; + +public class GrayscaleConditionController implements ConditionalCardController { + static final int ID = Objects.hash("GrayscaleConditionController"); + + private static final String TAG = "GrayscaleCondition"; + + private final Context mAppContext; + private final ConditionManager mConditionManager; + private final ColorDisplayManager mColorDisplayManager; + + private Intent mIntent; + + public GrayscaleConditionController(Context appContext, ConditionManager conditionManager) { + mAppContext = appContext; + mConditionManager = conditionManager; + mColorDisplayManager = mAppContext.getSystemService(ColorDisplayManager.class); + } + + @Override + public long getId() { + return ID; + } + + @Override + public boolean isDisplayable() { + try { + mIntent = Intent.parseUri( + mAppContext.getString(R.string.config_grayscale_settings_intent), + Intent.URI_INTENT_SCHEME); + } catch (URISyntaxException e) { + Log.w(TAG, "Failure parsing grayscale settings intent, skipping", e); + return false; + } + return mColorDisplayManager.isSaturationActivated(); + } + + @Override + public void onPrimaryClick(Context context) { + mAppContext.startActivity(mIntent); + } + + @Override + public void onActionClick() { + // Turn off grayscale + mColorDisplayManager.setSaturationLevel(100 /* staturationLevel */); + mConditionManager.onConditionChanged(); + } + + @Override + public ContextualCard buildContextualCard() { + return new ConditionalContextualCard.Builder() + .setConditionId(ID) + .setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_GRAYSCALE_MODE) + .setActionText(mAppContext.getText(R.string.condition_turn_off)) + .setName(mAppContext.getPackageName() + "/" + mAppContext.getText( + R.string.condition_grayscale_title)) + .setTitleText(mAppContext.getText(R.string.condition_grayscale_title).toString()) + .setSummaryText( + mAppContext.getText(R.string.condition_grayscale_summary).toString()) + .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_gray_scale_24dp)) + .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) + .build(); + } + + @Override + public void startMonitoringStateChange() { + + } + + @Override + public void stopMonitoringStateChange() { + + } +} diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 776a4d0902f..1fe4bbeecf0 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -91,4 +91,7 @@ test@test.test + + + intent:#Intent;action=test.test;end diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionControllerTest.java new file mode 100644 index 00000000000..8c24735c77a --- /dev/null +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionControllerTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2019 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.homepage.contextualcards.conditional; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.hardware.display.ColorDisplayManager; + +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; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +public class GrayscaleConditionControllerTest { + + @Mock + private ConditionManager mConditionManager; + + private ColorDisplayManager mColorDisplayManager; + private Context mContext; + private GrayscaleConditionController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + mColorDisplayManager = spy(mContext.getSystemService(ColorDisplayManager.class)); + doReturn(mColorDisplayManager).when(mContext).getSystemService(ColorDisplayManager.class); + mController = new GrayscaleConditionController(mContext, mConditionManager); + } + + @Test + public void isDisplayable_noIntent_shouldReturnFalse() { + assertThat(mController.isDisplayable()).isFalse(); + } + + @Test + @Config(qualifiers = "mcc999") + public void isDisplayable_validIntentAndGrayscaleOn_shouldReturnTrue() { + doReturn(true).when(mColorDisplayManager).isSaturationActivated(); + + assertThat(mController.isDisplayable()).isTrue(); + } + + @Test + @Config(qualifiers = "mcc999") + public void isDisplayable_validIntentAndGrayscaleOff_shouldReturnFalse() { + doReturn(false).when(mColorDisplayManager).isSaturationActivated(); + + assertThat(mController.isDisplayable()).isFalse(); + } + + @Test + public void onActionClick_shouldRefreshCondition() { + mController.onActionClick(); + + verify(mConditionManager).onConditionChanged(); + } +}