Add flag to reset notification channel importance

Add a button in development option to unlock user previously changed
notification importance and allow NAS to change the importance

Test: make RunSettingsRoboTests
Change-Id: I55b5349d6a17a383888c59b9126832c2fb8c58a0
This commit is contained in:
Chloris Kuo
2020-10-22 07:27:43 -07:00
parent 6f5b308d54
commit f64ce9e5e4
6 changed files with 200 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/reset_importance_button"
style="@style/ActionPrimaryButton"
android:layout_marginStart="@dimen/screen_margin_sides"
android:text="@string/asst_importance_reset_title"
android:layout_gravity="start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

View File

@@ -8257,6 +8257,12 @@
<!-- Configure Notifications: setting summary [CHAR LIMIT=200] -->
<string name="asst_feedback_indicator_summary">Indicate adjustments made to notifications and show the option to provide feedback to the system</string>
<!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
<string name="asst_importance_reset_title">Reset notification importance</string>
<!-- Configure Notifications: setting summary [CHAR LIMIT=200] -->
<string name="asst_importance_reset_summary">Reset user changed importance settings and allow notification assistant to prioritize</string>
<!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
<string name="asst_capabilities_actions_replies_title">Suggested actions and replies</string>

View File

@@ -610,6 +610,13 @@
android:title="@string/asst_feedback_indicator_title"
settings:controller="com.android.settings.notification.AssistantFeedbackPreferenceController" />
<com.android.settingslib.widget.LayoutPreference
android:key="asst_importance_reset"
android:title="@string/asst_importance_reset_title"
android:selectable="false"
android:layout="@layout/reset_importance_button"
settings:controller="com.android.settings.notification.ImportanceResetPreferenceController" />
<Preference
android:key="inactive_apps"
android:title="@string/inactive_apps_title"

View File

@@ -0,0 +1,68 @@
/*
* 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.notification;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.widget.LayoutPreference;
public class ImportanceResetPreferenceController extends BasePreferenceController implements
View.OnClickListener {
public static final String KEY = "asst_importance_reset";
private static final String TAG = "ResetImportanceButton";
private NotificationBackend mBackend;
private Button mButton;
public ImportanceResetPreferenceController(Context context, String key) {
super(context, key);
mBackend = new NotificationBackend();
}
@Override
public String getPreferenceKey() {
return KEY;
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
mButton = ((LayoutPreference) preference)
.findViewById(R.id.reset_importance_button);
mButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mBackend.resetNotificationImportance();
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
}

View File

@@ -585,6 +585,14 @@ public class NotificationBackend {
sm.requestPinShortcut(shortcutInfo, null);
}
public void resetNotificationImportance() {
try {
sINM.unlockAllNotificationChannels();
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
}
/**
* NotificationsSentState contains how often an app sends notifications and how recently it sent
* one.

View File

@@ -0,0 +1,78 @@
/*
* 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.notification;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.view.View;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settingslib.widget.LayoutPreference;
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.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
public class ImportanceResetPreferenceControllerTest {
private static final String KEY = "asst_importance_reset";
private ImportanceResetPreferenceController mController;
@Mock
private PreferenceScreen mScreen;
private LayoutPreference mPreference;
private Context mContext;
@Mock
private NotificationBackend mBackend;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mPreference = new LayoutPreference(mContext, R.layout.reset_importance_button);
when(mScreen.findPreference(anyString())).thenReturn(mPreference);
mController = new ImportanceResetPreferenceController(mContext, KEY);
mController.displayPreference(mScreen);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
}
@Test
public void onClick_callReset() {
final View view = mPreference.findViewById(R.id.reset_importance_button);
mController.updateState(mPreference);
assertThat(view.getVisibility()).isEqualTo(View.VISIBLE);
view.performClick();
verify(mBackend, times(1)).resetNotificationImportance();
}
}