Skip to content

Commit ec9e7d3

Browse files
kasnderclaude
andcommitted
Migrate to Material 3 theme with settings improvements
- Migrate to Material 3 theme with MaterialSwitch and rocket thumbIcon - Fix action bar, tab, and FAB colors for M3 compatibility - Migrate settings to AndroidX Preferences with MaterialToolbar - Fix settings alignment by removing icon space reservation - Fix blank preferences in sub-screens by re-configuring on fragment resume - Reorganize settings: Options and Backup on main screen, Advanced as sub-screen - Center app title in main toolbar Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a3742f0 commit ec9e7d3

28 files changed

Lines changed: 438 additions & 251 deletions

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
android:configChanges="orientation|screenSize"
101101
android:exported="true"
102102
android:label="@string/menu_settings"
103+
android:theme="@style/AppThemeRed.NoActionBar"
103104
android:parentActivityName="eu.faircode.netguard.ActivityMain">
104105
<intent-filter>
105106
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />

app/src/main/java/eu/faircode/netguard/ActivityLog.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import androidx.appcompat.app.AlertDialog;
4444
import androidx.appcompat.app.AppCompatActivity;
4545
import androidx.appcompat.widget.SearchView;
46-
import androidx.appcompat.widget.SwitchCompat;
46+
import com.google.android.material.materialswitch.MaterialSwitch;
4747
import androidx.core.app.NavUtils;
4848
import androidx.preference.PreferenceManager;
4949

@@ -85,7 +85,7 @@ protected void onCreate(Bundle savedInstanceState) {
8585

8686
// Action bar
8787
View actionView = getLayoutInflater().inflate(R.layout.actionlog, null, false);
88-
SwitchCompat swEnabled = actionView.findViewById(R.id.swEnabled);
88+
MaterialSwitch swEnabled = actionView.findViewById(R.id.swEnabled);
8989

9090
getSupportActionBar().setDisplayShowCustomEnabled(true);
9191
getSupportActionBar().setCustomView(actionView);
@@ -277,7 +277,7 @@ public void onSharedPreferenceChanged(SharedPreferences prefs, String name) {
277277
tvDisabled.setVisibility(log ? View.GONE : View.VISIBLE);
278278

279279
// Check switch state
280-
SwitchCompat swEnabled = getSupportActionBar().getCustomView().findViewById(R.id.swEnabled);
280+
MaterialSwitch swEnabled = getSupportActionBar().getCustomView().findViewById(R.id.swEnabled);
281281
if (swEnabled.isChecked() != log)
282282
swEnabled.setChecked(log);
283283

app/src/main/java/eu/faircode/netguard/ActivityMain.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
import androidx.appcompat.app.AlertDialog;
6363
import androidx.appcompat.app.AppCompatActivity;
6464
import androidx.appcompat.widget.SearchView;
65-
import androidx.appcompat.widget.SwitchCompat;
65+
import com.google.android.material.materialswitch.MaterialSwitch;
6666
import androidx.core.app.ActivityCompat;
6767
import androidx.core.content.ContextCompat;
6868
import androidx.core.graphics.drawable.DrawableCompat;
@@ -109,7 +109,7 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
109109
private ImageView ivIcon;
110110
private TextView tvTitle;
111111
private ImageView ivQueue;
112-
private SwitchCompat swEnabled;
112+
private MaterialSwitch swEnabled;
113113
private ImageView ivMetered;
114114
private SwipeRefreshLayout swipeRefresh;
115115
private InsightsHeaderAdapter headerAdapter;
@@ -719,7 +719,7 @@ public void onSharedPreferenceChanged(SharedPreferences prefs, String name) {
719719
tvDisabled.setVisibility(enabled ? View.GONE : View.VISIBLE);
720720

721721
// Check switch state
722-
SwitchCompat swEnabled = getSupportActionBar().getCustomView().findViewById(R.id.swEnabled);
722+
MaterialSwitch swEnabled = getSupportActionBar().getCustomView().findViewById(R.id.swEnabled);
723723
if (swEnabled.isChecked() != enabled)
724724
swEnabled.setChecked(enabled);
725725

app/src/main/java/eu/faircode/netguard/ActivitySettings.java

Lines changed: 211 additions & 132 deletions
Large diffs are not rendered by default.

app/src/main/java/eu/faircode/netguard/AdapterRule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import android.widget.LinearLayout;
5252
import android.widget.ListView;
5353
import android.widget.RelativeLayout;
54-
import android.widget.Switch;
54+
import com.google.android.material.materialswitch.MaterialSwitch;
5555
import android.widget.TextView;
5656
import android.widget.Toast;
5757

@@ -142,7 +142,7 @@ public static class ViewHolder extends RecyclerView.ViewHolder {
142142
public ImageButton ibSettings;
143143
public ImageButton ibLaunch;
144144

145-
public Switch cbApply;
145+
public MaterialSwitch cbApply;
146146

147147
public LinearLayout llScreenWifi;
148148
public ImageView ivWifiLegend;

app/src/main/java/eu/faircode/netguard/FragmentSettings.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,51 @@
2121
package eu.faircode.netguard;
2222

2323
import android.os.Bundle;
24-
import android.preference.Preference;
25-
import android.preference.PreferenceFragment;
24+
25+
import androidx.preference.Preference;
26+
import androidx.preference.PreferenceFragmentCompat;
27+
import androidx.preference.PreferenceGroup;
28+
import androidx.preference.PreferenceScreen;
2629

2730
import net.kollnig.missioncontrol.R;
2831

29-
public class FragmentSettings extends PreferenceFragment {
32+
public class FragmentSettings extends PreferenceFragmentCompat
33+
implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
3034

3135
@Override
32-
public void onCreate(Bundle savedInstanceState) {
33-
super.onCreate(savedInstanceState);
34-
addPreferencesFromResource(R.xml.preferences);
36+
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
37+
setPreferencesFromResource(R.xml.preferences, rootKey);
38+
39+
setIconSpaceReservedRecursively(getPreferenceScreen(), false);
3540

3641
Preference doh = findPreference("doh_enabled");
3742
if (doh != null) {
3843
doh.setSummary(doh.getSummary() + " (" + getString(R.string.warning_beta) + ")");
3944
}
4045
}
46+
47+
private void setIconSpaceReservedRecursively(PreferenceGroup group, boolean reserved) {
48+
group.setIconSpaceReserved(reserved);
49+
for (int i = 0; i < group.getPreferenceCount(); i++) {
50+
Preference pref = group.getPreference(i);
51+
pref.setIconSpaceReserved(reserved);
52+
if (pref instanceof PreferenceGroup) {
53+
setIconSpaceReservedRecursively((PreferenceGroup) pref, reserved);
54+
}
55+
}
56+
}
57+
58+
@Override
59+
public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {
60+
FragmentSettings fragment = new FragmentSettings();
61+
Bundle args = new Bundle();
62+
args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey());
63+
fragment.setArguments(args);
64+
65+
requireActivity().getSupportFragmentManager().beginTransaction()
66+
.replace(R.id.settings_container, fragment)
67+
.addToBackStack(pref.getKey())
68+
.commit();
69+
return true;
70+
}
4171
}

app/src/main/java/eu/faircode/netguard/SwitchPreference.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,17 @@
2323
import android.content.Context;
2424
import android.util.AttributeSet;
2525

26+
import androidx.preference.SwitchPreferenceCompat;
27+
2628
// https://code.google.com/p/android/issues/detail?id=26194
2729

28-
public class SwitchPreference extends android.preference.SwitchPreference {
30+
public class SwitchPreference extends SwitchPreferenceCompat {
2931
public SwitchPreference(Context context) {
3032
this(context, null);
3133
}
3234

3335
public SwitchPreference(Context context, AttributeSet attrs) {
34-
this(context, attrs, android.R.attr.switchPreferenceStyle);
36+
this(context, attrs, androidx.preference.R.attr.switchPreferenceCompatStyle);
3537
}
3638

3739
public SwitchPreference(Context context, AttributeSet attrs, int defStyle) {

app/src/main/java/net/kollnig/missioncontrol/ActivityBlocklists.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import androidx.annotation.NonNull;
1616
import androidx.appcompat.app.AlertDialog;
1717
import androidx.appcompat.app.AppCompatActivity;
18-
import androidx.appcompat.widget.SwitchCompat;
18+
import com.google.android.material.materialswitch.MaterialSwitch;
1919
import androidx.recyclerview.widget.LinearLayoutManager;
2020
import androidx.recyclerview.widget.RecyclerView;
2121

@@ -184,7 +184,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
184184
TextView textUrl;
185185
TextView textLastUpdate;
186186
TextView textError;
187-
SwitchCompat switchEnabled;
187+
MaterialSwitch switchEnabled;
188188
ImageButton btnDelete;
189189

190190
public ViewHolder(View itemView) {

app/src/main/java/net/kollnig/missioncontrol/details/TrackersListAdapter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import android.widget.ArrayAdapter;
3535
import android.widget.ListView;
3636
import android.widget.ProgressBar;
37-
import android.widget.Switch;
37+
import com.google.android.material.materialswitch.MaterialSwitch;
3838
import android.widget.TextView;
3939
import android.widget.Toast;
4040

@@ -481,7 +481,7 @@ private TrackerCategory getItem(int position) {
481481
static class VHItem extends RecyclerView.ViewHolder {
482482
final TextView mTrackerCategoryName;
483483
final ListView mCompaniesList;
484-
final Switch mSwitchTracker;
484+
final MaterialSwitch mSwitchTracker;
485485
final TextView mBlockingTip;
486486
final TextView mUncertain;
487487

@@ -498,9 +498,9 @@ static class VHItem extends RecyclerView.ViewHolder {
498498
static class VHHeader extends RecyclerView.ViewHolder {
499499
final TextView mLibraryExplanation;
500500
final TextView mLibraryDisclaimer;
501-
final Switch mSwitchInternet;
502-
final Switch mSwitchVPN;
503-
final Switch mSwitchVpnExclude;
501+
final MaterialSwitch mSwitchInternet;
502+
final MaterialSwitch mSwitchVPN;
503+
final MaterialSwitch mSwitchVpnExclude;
504504
final View mTrackerProtectionRow;
505505
final View mTrackerProtectionDivider;
506506

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
2+
<item android:state_enabled="false"
3+
android:color="#E0E0E0"/>
4+
<item android:state_checked="true"
5+
android:color="#FFFFFF" />
6+
<item android:color="#F5F5F5" />
7+
</selector>

0 commit comments

Comments
 (0)