Check that modes can be deleted before adding delete menu option.
Migrates to using MenuProvider instead of onCreateOptionsMenu, since the previous approach is apparently now deprecated. Also wraps usages of requireActivity() so that we're sure the activity isn't null instead of potentially throwing an exception. Flag: android.app.modes_ui Bug: 346575126 Test: manually confirmed that manual DND is no longer deletable Change-Id: I872f6054061c019db9a72028cc90cbb123a1cdce
This commit is contained in:
@@ -24,7 +24,9 @@ import android.view.Menu;
|
|||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import androidx.activity.ComponentActivity;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.view.MenuProvider;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
@@ -39,6 +41,8 @@ public class ZenModeFragment extends ZenModeFragmentBase {
|
|||||||
// for mode deletion menu
|
// for mode deletion menu
|
||||||
private static final int DELETE_MODE = 1;
|
private static final int DELETE_MODE = 1;
|
||||||
|
|
||||||
|
private ModeMenuProvider mModeMenuProvider;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getPreferenceScreenResId() {
|
protected int getPreferenceScreenResId() {
|
||||||
return R.xml.modes_rule_settings;
|
return R.xml.modes_rule_settings;
|
||||||
@@ -85,11 +89,22 @@ public class ZenModeFragment extends ZenModeFragmentBase {
|
|||||||
|
|
||||||
// Set title for the entire screen
|
// Set title for the entire screen
|
||||||
ZenMode mode = getMode();
|
ZenMode mode = getMode();
|
||||||
if (mode != null) {
|
ComponentActivity activity = getActivity();
|
||||||
requireActivity().setTitle(mode.getName());
|
if (mode != null && activity != null) {
|
||||||
|
activity.setTitle(mode.getName());
|
||||||
|
mModeMenuProvider = new ModeMenuProvider(mode);
|
||||||
|
activity.addMenuProvider(mModeMenuProvider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop() {
|
||||||
|
if (getActivity() != null) {
|
||||||
|
getActivity().removeMenuProvider(mModeMenuProvider);
|
||||||
|
}
|
||||||
|
super.onStop();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDetach() {
|
public void onDetach() {
|
||||||
use(ManualDurationPreferenceController.class).unregisterSettingsObserver();
|
use(ManualDurationPreferenceController.class).unregisterSettingsObserver();
|
||||||
@@ -102,35 +117,6 @@ public class ZenModeFragment extends ZenModeFragmentBase {
|
|||||||
return SettingsEnums.NOTIFICATION_ZEN_MODE_AUTOMATION;
|
return SettingsEnums.NOTIFICATION_ZEN_MODE_AUTOMATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
menu.add(Menu.NONE, DELETE_MODE, Menu.NONE, R.string.zen_mode_menu_delete_mode);
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean onOptionsItemSelected(MenuItem item, @NonNull ZenMode zenMode) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case DELETE_MODE:
|
|
||||||
new AlertDialog.Builder(mContext)
|
|
||||||
.setTitle(mContext.getString(R.string.zen_mode_delete_mode_confirmation,
|
|
||||||
zenMode.getRule().getName()))
|
|
||||||
.setPositiveButton(R.string.zen_mode_schedule_delete,
|
|
||||||
(dialog, which) -> {
|
|
||||||
// start finishing before calling removeMode() so that we don't
|
|
||||||
// try to update this activity with a nonexistent mode when the
|
|
||||||
// zen mode config is updated
|
|
||||||
finish();
|
|
||||||
mBackend.removeMode(zenMode);
|
|
||||||
})
|
|
||||||
.setNegativeButton(R.string.cancel, null)
|
|
||||||
.show();
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateZenModeState() {
|
protected void updateZenModeState() {
|
||||||
// Because this fragment may be asked to finish by the delete menu but not be done doing
|
// Because this fragment may be asked to finish by the delete menu but not be done doing
|
||||||
@@ -140,4 +126,42 @@ public class ZenModeFragment extends ZenModeFragmentBase {
|
|||||||
}
|
}
|
||||||
super.updateZenModeState();
|
super.updateZenModeState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class ModeMenuProvider implements MenuProvider {
|
||||||
|
private ZenMode mZenMode;
|
||||||
|
ModeMenuProvider(ZenMode mode) {
|
||||||
|
mZenMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
|
||||||
|
if (mZenMode != null && mZenMode.canBeDeleted()) {
|
||||||
|
// Only deleteable modes should get a delete menu option.
|
||||||
|
menu.add(Menu.NONE, DELETE_MODE, Menu.NONE, R.string.zen_mode_menu_delete_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
|
||||||
|
if (mZenMode != null) {
|
||||||
|
if (menuItem.getItemId() == DELETE_MODE) {
|
||||||
|
new AlertDialog.Builder(mContext)
|
||||||
|
.setTitle(mContext.getString(R.string.zen_mode_delete_mode_confirmation,
|
||||||
|
mZenMode.getRule().getName()))
|
||||||
|
.setPositiveButton(R.string.zen_mode_schedule_delete,
|
||||||
|
(dialog, which) -> {
|
||||||
|
// start finishing before calling removeMode() so that we
|
||||||
|
// don't try to update this activity with a nonexistent mode
|
||||||
|
// when the zen mode config is updated
|
||||||
|
finish();
|
||||||
|
mBackend.removeMode(mZenMode);
|
||||||
|
})
|
||||||
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
.show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,6 @@ import static android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -117,18 +116,6 @@ abstract class ZenModeFragmentBase extends ZenModesFragmentBase {
|
|||||||
updateControllers();
|
updateControllers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public final boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
if (mZenMode != null) {
|
|
||||||
return onOptionsItemSelected(item, mZenMode);
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean onOptionsItemSelected(MenuItem item, @NonNull ZenMode zenMode) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateControllers() {
|
private void updateControllers() {
|
||||||
if (getPreferenceControllers() == null || mZenMode == null) {
|
if (getPreferenceControllers() == null || mZenMode == null) {
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user