Convert notification actions to a custom preference (#4652)

This commit is contained in:
XiangRongLin 2020-10-31 11:58:33 +01:00 committed by GitHub
parent 4eb8094fb8
commit 008eb5ba4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 136 deletions

View File

@ -0,0 +1,10 @@
package org.schabi.newpipe.settings
import android.os.Bundle
import org.schabi.newpipe.R
class NotificationSettingsFragment : BasePreferenceFragment() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.notification_settings)
}
}

View File

@ -1,10 +1,10 @@
package org.schabi.newpipe.settings; package org.schabi.newpipe.settings.custom;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.util.AttributeSet;
import android.preference.PreferenceManager;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -13,18 +13,16 @@ import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.Switch;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.TextViewCompat; import androidx.core.widget.TextViewCompat;
import androidx.fragment.app.Fragment; import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import java.util.List;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
import org.schabi.newpipe.player.MainPlayer; import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.NotificationConstants; import org.schabi.newpipe.player.NotificationConstants;
@ -32,56 +30,35 @@ import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.ThemeHelper;
import org.schabi.newpipe.views.FocusOverlayView; import org.schabi.newpipe.views.FocusOverlayView;
import java.util.List; public class NotificationActionsPreference extends Preference {
public NotificationActionsPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
setLayoutResource(R.layout.settings_notification);
}
public class NotificationSettingsFragment extends Fragment {
private Switch scaleSwitch;
private NotificationSlot[] notificationSlots; private NotificationSlot[] notificationSlots;
private SharedPreferences pref;
private List<Integer> compactSlots; private List<Integer> compactSlots;
private String scaleKey;
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// Lifecycle // Lifecycle
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
@Override @Override
public void onCreate(@Nullable final Bundle savedInstanceState) { public void onBindViewHolder(final PreferenceViewHolder holder) {
super.onCreate(savedInstanceState); super.onBindViewHolder(holder);
pref = PreferenceManager.getDefaultSharedPreferences(requireContext());
scaleKey = getString(R.string.scale_to_square_image_in_notifications_key); holder.itemView.setClickable(false);
setupActions(holder.itemView);
} }
@Override @Override
public View onCreateView(@NonNull final LayoutInflater inflater, public void onDetached() {
final ViewGroup container, super.onDetached();
@Nullable final Bundle savedInstanceState) {
return inflater.inflate(R.layout.settings_notification, container, false);
}
@Override
public void onViewCreated(@NonNull final View rootView,
@Nullable final Bundle savedInstanceState) {
super.onViewCreated(rootView, savedInstanceState);
setupScaleSwitch(rootView);
setupActions(rootView);
}
@Override
public void onResume() {
super.onResume();
ThemeHelper.setTitleToAppCompatActivity(getActivity(),
getString(R.string.settings_category_notification_title));
}
@Override
public void onPause() {
super.onPause();
saveChanges(); saveChanges();
requireContext().sendBroadcast(new Intent(MainPlayer.ACTION_RECREATE_NOTIFICATION)); getContext().sendBroadcast(new Intent(MainPlayer.ACTION_RECREATE_NOTIFICATION));
} }
@ -89,17 +66,10 @@ public class NotificationSettingsFragment extends Fragment {
// Setup // Setup
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
private void setupScaleSwitch(@NonNull final View view) {
scaleSwitch = view.findViewById(R.id.notificationScaleSwitch);
scaleSwitch.setChecked(pref.getBoolean(scaleKey, false));
view.findViewById(R.id.notificationScaleSwitchClickableArea)
.setOnClickListener(v -> scaleSwitch.toggle());
}
private void setupActions(@NonNull final View view) { private void setupActions(@NonNull final View view) {
compactSlots = compactSlots =
NotificationConstants.getCompactSlotsFromPreferences(requireContext(), pref, 5); NotificationConstants.getCompactSlotsFromPreferences(
getContext(), getSharedPreferences(), 5);
notificationSlots = new NotificationSlot[5]; notificationSlots = new NotificationSlot[5];
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
notificationSlots[i] = new NotificationSlot(i, view); notificationSlots[i] = new NotificationSlot(i, view);
@ -112,16 +82,15 @@ public class NotificationSettingsFragment extends Fragment {
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
private void saveChanges() { private void saveChanges() {
final SharedPreferences.Editor editor = pref.edit(); final SharedPreferences.Editor editor = getSharedPreferences().edit();
editor.putBoolean(scaleKey, scaleSwitch.isChecked());
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
editor.putInt(getString(NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]), editor.putInt(getContext().getString(NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]),
(i < compactSlots.size() ? compactSlots.get(i) : -1)); (i < compactSlots.size() ? compactSlots.get(i) : -1));
} }
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
editor.putInt(getString(NotificationConstants.SLOT_PREF_KEYS[i]), editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),
notificationSlots[i].selectedAction); notificationSlots[i].selectedAction);
} }
@ -183,7 +152,7 @@ public class NotificationSettingsFragment extends Fragment {
} else if (compactSlots.size() < 3) { } else if (compactSlots.size() < 3) {
compactSlots.add(i); compactSlots.add(i);
} else { } else {
Toast.makeText(requireContext(), Toast.makeText(getContext(),
R.string.notification_actions_at_most_three, R.string.notification_actions_at_most_three,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
return; return;
@ -196,7 +165,8 @@ public class NotificationSettingsFragment extends Fragment {
void setupSelectedAction(final View view) { void setupSelectedAction(final View view) {
icon = view.findViewById(R.id.notificationActionIcon); icon = view.findViewById(R.id.notificationActionIcon);
summary = view.findViewById(R.id.notificationActionSummary); summary = view.findViewById(R.id.notificationActionSummary);
selectedAction = pref.getInt(getString(NotificationConstants.SLOT_PREF_KEYS[i]), selectedAction = getSharedPreferences().getInt(
getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),
NotificationConstants.SLOT_DEFAULTS[i]); NotificationConstants.SLOT_DEFAULTS[i]);
updateInfo(); updateInfo();
} }
@ -205,20 +175,20 @@ public class NotificationSettingsFragment extends Fragment {
if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) { if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) {
icon.setImageDrawable(null); icon.setImageDrawable(null);
} else { } else {
icon.setImageDrawable(AppCompatResources.getDrawable(requireContext(), icon.setImageDrawable(AppCompatResources.getDrawable(getContext(),
NotificationConstants.ACTION_ICONS[selectedAction])); NotificationConstants.ACTION_ICONS[selectedAction]));
} }
summary.setText(NotificationConstants.getActionName(requireContext(), selectedAction)); summary.setText(NotificationConstants.getActionName(getContext(), selectedAction));
} }
void openActionChooserDialog() { void openActionChooserDialog() {
final LayoutInflater inflater = LayoutInflater.from(requireContext()); final LayoutInflater inflater = LayoutInflater.from(getContext());
final LinearLayout rootLayout = (LinearLayout) inflater.inflate( final LinearLayout rootLayout = (LinearLayout) inflater.inflate(
R.layout.single_choice_dialog_view, null, false); R.layout.single_choice_dialog_view, null, false);
final RadioGroup radioGroup = rootLayout.findViewById(android.R.id.list); final RadioGroup radioGroup = rootLayout.findViewById(android.R.id.list);
final AlertDialog alertDialog = new AlertDialog.Builder(requireContext()) final AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(SLOT_TITLES[i]) .setTitle(SLOT_TITLES[i])
.setView(radioGroup) .setView(radioGroup)
.setCancelable(true) .setCancelable(true)
@ -237,10 +207,10 @@ public class NotificationSettingsFragment extends Fragment {
// if present set action icon with correct color // if present set action icon with correct color
if (NotificationConstants.ACTION_ICONS[action] != 0) { if (NotificationConstants.ACTION_ICONS[action] != 0) {
Drawable drawable = AppCompatResources.getDrawable(requireContext(), Drawable drawable = AppCompatResources.getDrawable(getContext(),
NotificationConstants.ACTION_ICONS[action]); NotificationConstants.ACTION_ICONS[action]);
if (drawable != null) { if (drawable != null) {
final int color = ThemeHelper.resolveColorFromAttr(requireContext(), final int color = ThemeHelper.resolveColorFromAttr(getContext(),
android.R.attr.textColorPrimary); android.R.attr.textColorPrimary);
drawable = DrawableCompat.wrap(drawable).mutate(); drawable = DrawableCompat.wrap(drawable).mutate();
DrawableCompat.setTint(drawable, color); DrawableCompat.setTint(drawable, color);
@ -249,7 +219,7 @@ public class NotificationSettingsFragment extends Fragment {
} }
} }
radioButton.setText(NotificationConstants.getActionName(requireContext(), action)); radioButton.setText(NotificationConstants.getActionName(getContext(), action));
radioButton.setChecked(action == selectedAction); radioButton.setChecked(action == selectedAction);
radioButton.setId(id); radioButton.setId(id);
radioButton.setLayoutParams(new RadioGroup.LayoutParams( radioButton.setLayoutParams(new RadioGroup.LayoutParams(
@ -259,7 +229,7 @@ public class NotificationSettingsFragment extends Fragment {
} }
alertDialog.show(); alertDialog.show();
if (DeviceUtils.isTv(requireContext())) { if (DeviceUtils.isTv(getContext())) {
FocusOverlayView.setupFocusObserver(alertDialog); FocusOverlayView.setupFocusObserver(alertDialog);
} }
} }

View File

@ -1,78 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:paddingTop="16dp">
<Switch <TextView
android:id="@+id/notificationScaleSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:clickable="false"
android:focusable="false"
app:layout_constraintBottom_toBottomOf="@+id/textView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/textView" />
<TextView
android:id="@+id/textView" android:id="@+id/textView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/notification_scale_to_square_image_title"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="14sp"
app:layout_constraintEnd_toStartOf="@+id/notificationScaleSwitch"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/notification_scale_to_square_image_summary"
app:layout_constraintEnd_toStartOf="@+id/notificationScaleSwitch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<View
android:id="@+id/notificationScaleSwitchClickableArea"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="?android:selectableItemBackground"
android:clickable="true"
android:focusable="true"
app:layout_constraintBottom_toTopOf="@+id/divider"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginStart="32dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="32dp"
android:background="?android:attr/listDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
<TextView
android:id="@+id/textView4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:clickable="false" android:clickable="false"
android:focusable="false" android:focusable="false"
@ -81,7 +20,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider" /> app:layout_constraintTop_toTopOf="parent" />
<include <include
android:id="@+id/notificationAction0" android:id="@+id/notificationAction0"
@ -91,7 +30,7 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView4" /> app:layout_constraintTop_toBottomOf="@+id/textView" />
<include <include
android:id="@+id/notificationAction1" android:id="@+id/notificationAction1"
@ -130,4 +69,3 @@
app:layout_constraintTop_toBottomOf="@+id/notificationAction3" /> app:layout_constraintTop_toBottomOf="@+id/notificationAction3" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/settings_category_notification_title">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/scale_to_square_image_in_notifications_key"
android:summary="@string/notification_scale_to_square_image_summary"
android:title="@string/notification_scale_to_square_image_title"
app:iconSpaceReserved="false" />
<PreferenceCategory android:layout="@layout/settings_category_header_layout">
<org.schabi.newpipe.settings.custom.NotificationActionsPreference />
</PreferenceCategory>
</PreferenceScreen>