NAS Setting Migration

Change NAS setting to a toggle setting and move the settings to
Notifications/General

Bug: 173106358
Test: tested manually on device, make RunSettingsRoboTests
Change-Id: I1ba1214511dceea6faf5fb39692d920e761b33d8
This commit is contained in:
Chloris Kuo
2021-03-19 07:00:45 -07:00
parent 473fffa318
commit 2c955bbae2
11 changed files with 315 additions and 75 deletions

View File

@@ -22,6 +22,7 @@ import android.app.Activity;
import android.app.Application;
import android.app.settings.SettingsEnums;
import android.app.usage.IUsageStatsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -62,6 +63,7 @@ public class ConfigureNotificationSettings extends DashboardFragment implements
private static final int REQUEST_CODE = 200;
private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
private static final String KEY_ADVANCED_CATEGORY = "configure_notifications_advanced";
private static final String KEY_NAS = "notification_assistant";
private RingtonePreference mRequestPreference;
@@ -116,6 +118,8 @@ public class ConfigureNotificationSettings extends DashboardFragment implements
}
});
controllers.add(new NotificationAssistantPreferenceController(context,
new NotificationBackend(), host, KEY_NAS));
if (FeatureFlagUtils.isEnabled(context, FeatureFlags.SILKY_HOME)) {
controllers.add(new EmergencyBroadcastPreferenceController(context,
@@ -199,4 +203,14 @@ public class ConfigureNotificationSettings extends DashboardFragment implements
return keys;
}
};
// Dialogs only have access to the parent fragment, not the controller, so pass the information
// along to keep business logic out of this file
protected void enableNAS(ComponentName cn) {
final PreferenceScreen screen = getPreferenceScreen();
NotificationAssistantPreferenceController napc =
use(NotificationAssistantPreferenceController.class);
napc.setNotificationAssistantGranted(cn);
napc.updateState(screen.findPreference(napc.getPreferenceKey()));
}
}

View File

@@ -0,0 +1,71 @@
/*
* 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.settings.notification;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
public class NotificationAssistantDialogFragment extends InstrumentedDialogFragment
implements DialogInterface.OnClickListener {
static final String KEY_COMPONENT = "c";
public static NotificationAssistantDialogFragment newInstance(Fragment target,
ComponentName cn) {
final NotificationAssistantDialogFragment dialogFragment =
new NotificationAssistantDialogFragment();
final Bundle args = new Bundle();
args.putString(KEY_COMPONENT, cn.flattenToString());
dialogFragment.setArguments(args);
dialogFragment.setTargetFragment(target, 0);
return dialogFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final String summary = getResources()
.getString(R.string.notification_assistant_security_warning_summary);
return new AlertDialog.Builder(getContext())
.setMessage(summary)
.setCancelable(true)
.setPositiveButton(R.string.okay, this)
.create();
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DEFAULT_NOTIFICATION_ASSISTANT;
}
@Override
public void onClick(DialogInterface dialog, int which) {
final Bundle args = getArguments();
final ComponentName cn = ComponentName.unflattenFromString(args
.getString(KEY_COMPONENT));
ConfigureNotificationSettings parent = (ConfigureNotificationSettings) getTargetFragment();
parent.enableNAS(cn);
}
}

View File

@@ -18,44 +18,72 @@ package com.android.settings.notification;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.provider.Settings;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.widget.CandidateInfo;
import androidx.fragment.app.Fragment;
import com.android.settings.core.TogglePreferenceController;
import com.google.common.annotations.VisibleForTesting;
public class NotificationAssistantPreferenceController extends BasePreferenceController {
public class NotificationAssistantPreferenceController extends TogglePreferenceController {
private static final String TAG = "NASPreferenceController";
private static final int AVAILABLE = 1;
private Fragment mFragment;
private int mUserId = UserHandle.myUserId();
@VisibleForTesting
protected NotificationBackend mNotificationBackend;
private PackageManager mPackageManager;
public NotificationAssistantPreferenceController(Context context, String preferenceKey) {
public NotificationAssistantPreferenceController(Context context, NotificationBackend backend,
Fragment fragment, String preferenceKey) {
super(context, preferenceKey);
mNotificationBackend = new NotificationBackend();
mPackageManager = mContext.getPackageManager();
mNotificationBackend = backend;
mFragment = fragment;
}
@Override
public int getAvailabilityStatus() {
return BasePreferenceController.AVAILABLE;
return AVAILABLE;
}
@Override
public CharSequence getSummary() {
CandidateInfo appSelected = new NotificationAssistantPicker.CandidateNone(mContext);
ComponentName assistant = mNotificationBackend.getAllowedNotificationAssistant();
if (assistant != null) {
appSelected = createCandidateInfo(assistant);
}
return appSelected.loadLabel();
public boolean isChecked() {
ComponentName acn = mNotificationBackend.getAllowedNotificationAssistant();
ComponentName dcn = mNotificationBackend.getDefaultNotificationAssistant();
return (acn != null && acn.equals(dcn));
}
@VisibleForTesting
protected CandidateInfo createCandidateInfo(ComponentName cn) {
return new DefaultAppInfo(mContext, mPackageManager, UserHandle.myUserId(), cn);
@Override
public boolean setChecked(boolean isChecked) {
ComponentName cn = isChecked
? mNotificationBackend.getDefaultNotificationAssistant() : null;
if (isChecked) {
if (mFragment == null) {
throw new IllegalStateException("No fragment to start activity");
}
showDialog(cn);
return false;
} else {
setNotificationAssistantGranted(null);
return true;
}
}
}
protected void setNotificationAssistantGranted(ComponentName cn) {
if (Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.NAS_SETTINGS_UPDATED, 0, mUserId) == 0) {
Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.NAS_SETTINGS_UPDATED, 1, mUserId);
mNotificationBackend.resetDefaultNotificationAssistant(cn != null);
}
mNotificationBackend.setNotificationAssistantGranted(cn);
}
protected void showDialog(ComponentName cn) {
NotificationAssistantDialogFragment dialogFragment =
NotificationAssistantDialogFragment.newInstance(mFragment, cn);
dialogFragment.show(mFragment.getFragmentManager(), TAG);
}
}

View File

@@ -19,7 +19,6 @@ import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_CACHED;
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC;
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED;
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LAUNCHER;
import android.app.INotificationManager;
@@ -50,7 +49,6 @@ import android.service.notification.NotificationListenerFilter;
import android.text.format.DateUtils;
import android.util.IconDrawableFactory;
import android.util.Log;
import android.util.Slog;
import androidx.annotation.VisibleForTesting;
@@ -563,6 +561,23 @@ public class NotificationBackend {
}
}
public ComponentName getDefaultNotificationAssistant() {
try {
return sINM.getDefaultNotificationAssistant();
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return null;
}
}
public void resetDefaultNotificationAssistant(boolean loadFromConfig) {
try {
sINM.resetDefaultNotificationAssistant(loadFromConfig);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
}
public boolean setNotificationAssistantGranted(ComponentName cn) {
try {
sINM.setNotificationAssistantAccessGranted(cn, true);