Shelter/app/src/main/java/net/typeblog/shelter/ui/SettingsFragment.java
Peter Cai 562463aede
SettingsFragment: add Patreon link
though I don't know if anyone would donate :)

and I'm not sure if this conforms to Google Play guidelines either.
Sources indicate that just linking to Patreon is fine but I am not sure.
2019-01-30 20:03:42 +08:00

171 lines
7.3 KiB
Java

package net.typeblog.shelter.ui;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.Settings;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.CheckBoxPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import net.typeblog.shelter.R;
import net.typeblog.shelter.services.IShelterService;
import net.typeblog.shelter.util.SettingsManager;
import net.typeblog.shelter.util.Utility;
import mobi.upod.timedurationpicker.TimeDurationPicker;
import mobi.upod.timedurationpicker.TimeDurationPickerDialogFragment;
import mobi.upod.timedurationpicker.TimeDurationUtil;
public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {
private static final String SETTINGS_VERSION = "settings_version";
private static final String SETTINGS_SOURCE_CODE = "settings_source_code";
private static final String SETTINGS_BUG_REPORT = "settings_bug_report";
private static final String SETTINGS_PATREON = "settings_patreon";
private static final String SETTINGS_CROSS_PROFILE_FILE_CHOOSER = "settings_cross_profile_file_chooser";
private static final String SETTINGS_CAMERA_PROXY = "settings_camera_proxy";
private static final String SETTINGS_AUTO_FREEZE_SERVICE = "settings_auto_freeze_service";
private static final String SETTINGS_AUTO_FREEZE_DELAY = "settings_auto_freeze_delay";
private static final String SETTINGS_SKIP_FOREGROUND = "settings_dont_freeze_foreground";
private SettingsManager mManager = SettingsManager.getInstance();
private IShelterService mServiceWork = null;
private CheckBoxPreference mPrefCrossProfileFileChooser = null;
private CheckBoxPreference mPrefCameraProxy = null;
private CheckBoxPreference mPrefAutoFreezeService = null;
private CheckBoxPreference mPrefSkipForeground = null;
private Preference mPrefAutoFreezeDelay = null;
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences_settings);
mServiceWork = IShelterService.Stub.asInterface(
((Bundle) getActivity().getIntent().getParcelableExtra("extras")).getBinder("profile_service"));
// Set the displayed version
try {
findPreference(SETTINGS_VERSION).setSummary(
getContext().getPackageManager().getPackageInfo(
getContext().getPackageName(), 0).versionName);
} catch (PackageManager.NameNotFoundException e) {
// WTF?
}
// Open source code url on click
findPreference(SETTINGS_SOURCE_CODE)
.setOnPreferenceClickListener(this::openSummaryUrl);
findPreference(SETTINGS_BUG_REPORT)
.setOnPreferenceClickListener(this::openSummaryUrl);
findPreference(SETTINGS_PATREON)
.setOnPreferenceClickListener(this::openSummaryUrl);
// === Interactions ===
mPrefCrossProfileFileChooser = (CheckBoxPreference) findPreference(SETTINGS_CROSS_PROFILE_FILE_CHOOSER);
mPrefCrossProfileFileChooser.setChecked(mManager.getCrossProfileFileChooserEnabled());
mPrefCrossProfileFileChooser.setOnPreferenceChangeListener(this);
mPrefCameraProxy = (CheckBoxPreference) findPreference(SETTINGS_CAMERA_PROXY);
mPrefCameraProxy.setChecked(mManager.getCameraProxyEnabled());
mPrefCameraProxy.setOnPreferenceChangeListener(this);
// === Services ===
mPrefAutoFreezeService = (CheckBoxPreference) findPreference(SETTINGS_AUTO_FREEZE_SERVICE);
mPrefAutoFreezeService.setChecked(mManager.getAutoFreezeServiceEnabled());
mPrefAutoFreezeService.setOnPreferenceChangeListener(this);
mPrefAutoFreezeDelay = findPreference(SETTINGS_AUTO_FREEZE_DELAY);
mPrefAutoFreezeDelay.setOnPreferenceClickListener(this::openAutoFreezeDelayPicker);
updateAutoFreezeDelay();
mPrefSkipForeground = (CheckBoxPreference) findPreference(SETTINGS_SKIP_FOREGROUND);
mPrefSkipForeground.setChecked(mManager.getSkipForegroundEnabled());
mPrefSkipForeground.setOnPreferenceChangeListener(this);
}
@Override
public void onResume() {
super.onResume();
// Update all preferences that may change when returning
// i.e. preferences that open another dialog for picking
updateAutoFreezeDelay();
}
private void updateAutoFreezeDelay() {
mPrefAutoFreezeDelay.setSummary(TimeDurationUtil.formatMinutesSeconds(
((long) mManager.getAutoFreezeDelay()) * 1000
));
}
private boolean openSummaryUrl(Preference pref) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(pref.getSummary().toString()));
startActivity(intent);
return true;
}
private boolean openAutoFreezeDelayPicker(Preference pref) {
new AutoFreezeDelayPickerFragment().show(getActivity().getFragmentManager(), "dialog");
return true;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newState) {
if (preference == mPrefCrossProfileFileChooser) {
mManager.setCrossProfileFileChooserEnabled((boolean) newState);
return true;
} else if (preference == mPrefCameraProxy) {
mManager.setCameraProxyEnabled(((boolean) newState));
return true;
} else if (preference == mPrefAutoFreezeService) {
mManager.setAutoFreezeServiceEnabled((boolean) newState);
return true;
} else if (preference == mPrefSkipForeground) {
boolean enabled = (boolean) newState;
boolean hasPermission = false;
try {
hasPermission = mServiceWork.hasUsageStatsPermission() && Utility.checkUsageStatsPermission(getContext());
} catch (RemoteException e) {
}
if (!enabled || hasPermission) {
mManager.setSkipForegroundEnabled(enabled);
return true;
} else {
new AlertDialog.Builder(getContext())
.setMessage(R.string.request_usage_stats)
.setPositiveButton(android.R.string.ok,
(dialog, which) -> startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)))
.setNegativeButton(android.R.string.cancel,
(dialog, which) -> dialog.dismiss())
.show();
return false;
}
} else {
return false;
}
}
public static class AutoFreezeDelayPickerFragment extends TimeDurationPickerDialogFragment {
@Override
protected long getInitialDuration() {
return ((long) SettingsManager.getInstance().getAutoFreezeDelay()) * 1000;
}
@Override
protected int setTimeUnits() {
return TimeDurationPicker.MM_SS;
}
@Override
public void onDurationSet(TimeDurationPicker view, long duration) {
long seconds = duration / 1000;
if (seconds >= Integer.MAX_VALUE) return;
SettingsManager.getInstance().setAutoFreezeDelay((int) seconds);
}
}
}