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:
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user