Add option to grey out apps requiring anti-features.
This commit is contained in:
parent
fde227e889
commit
1f354a1b3f
@ -32,7 +32,9 @@ public class AppFilter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (app.antiFeatures != null && Preferences.get().filterAppsWithAntiFeatures()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,6 +234,16 @@ public class FDroidApp extends Application {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// If the user changes the preference to do with filtering anti-feature apps,
|
||||||
|
// it is easier to just notify a change in the app provider,
|
||||||
|
// so that the newly updated list will correctly filter relevant apps.
|
||||||
|
Preferences.get().registerAppsRequiringAntiFeaturesChangeListener(new Preferences.ChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onPreferenceChange() {
|
||||||
|
getContentResolver().notifyChange(AppProvider.getContentUri(), null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// This is added so that the bluetooth:// scheme we use for URLs the BluetoothDownloader
|
// This is added so that the bluetooth:// scheme we use for URLs the BluetoothDownloader
|
||||||
// understands is not treated as invalid by the java.net.URL class. The actual Handler does
|
// understands is not treated as invalid by the java.net.URL class. The actual Handler does
|
||||||
// nothing, but its presence is enough.
|
// nothing, but its presence is enough.
|
||||||
|
@ -49,6 +49,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
public static final String PREF_UPD_NOTIFY = "updateNotify";
|
public static final String PREF_UPD_NOTIFY = "updateNotify";
|
||||||
public static final String PREF_UPD_HISTORY = "updateHistoryDays";
|
public static final String PREF_UPD_HISTORY = "updateHistoryDays";
|
||||||
public static final String PREF_ROOTED = "rooted";
|
public static final String PREF_ROOTED = "rooted";
|
||||||
|
public static final String PREF_ANTI_FEATURE_APPS = "hideAntiFeatureApps";
|
||||||
public static final String PREF_INCOMP_VER = "incompatibleVersions";
|
public static final String PREF_INCOMP_VER = "incompatibleVersions";
|
||||||
public static final String PREF_THEME = "theme";
|
public static final String PREF_THEME = "theme";
|
||||||
public static final String PREF_IGN_TOUCH = "ignoreTouchscreen";
|
public static final String PREF_IGN_TOUCH = "ignoreTouchscreen";
|
||||||
@ -68,6 +69,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
public static final String PREF_POST_PRIVILEGED_INSTALL = "postPrivilegedInstall";
|
public static final String PREF_POST_PRIVILEGED_INSTALL = "postPrivilegedInstall";
|
||||||
|
|
||||||
private static final boolean DEFAULT_ROOTED = true;
|
private static final boolean DEFAULT_ROOTED = true;
|
||||||
|
private static final boolean DEFAULT_ANTI_FEATURE_APPS = false;
|
||||||
private static final int DEFAULT_UPD_HISTORY = 14;
|
private static final int DEFAULT_UPD_HISTORY = 14;
|
||||||
private static final boolean DEFAULT_PRIVILEGED_INSTALLER = true;
|
private static final boolean DEFAULT_PRIVILEGED_INSTALLER = true;
|
||||||
//private static final boolean DEFAULT_LOCAL_REPO_BONJOUR = true;
|
//private static final boolean DEFAULT_LOCAL_REPO_BONJOUR = true;
|
||||||
@ -92,10 +94,12 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean filterAppsRequiringRoot = DEFAULT_ROOTED;
|
private boolean filterAppsRequiringRoot = DEFAULT_ROOTED;
|
||||||
|
private boolean filterAppsWithAntiFeatures = DEFAULT_ANTI_FEATURE_APPS;
|
||||||
|
|
||||||
private final Map<String, Boolean> initialized = new HashMap<>();
|
private final Map<String, Boolean> initialized = new HashMap<>();
|
||||||
|
|
||||||
private final List<ChangeListener> filterAppsRequiringRootListeners = new ArrayList<>();
|
private final List<ChangeListener> filterAppsRequiringRootListeners = new ArrayList<>();
|
||||||
|
private final List<ChangeListener> filterAppsRequiringAntiFeaturesListeners = new ArrayList<>();
|
||||||
private final List<ChangeListener> updateHistoryListeners = new ArrayList<>();
|
private final List<ChangeListener> updateHistoryListeners = new ArrayList<>();
|
||||||
private final List<ChangeListener> localRepoNameListeners = new ArrayList<>();
|
private final List<ChangeListener> localRepoNameListeners = new ArrayList<>();
|
||||||
private final List<ChangeListener> localRepoHttpsListeners = new ArrayList<>();
|
private final List<ChangeListener> localRepoHttpsListeners = new ArrayList<>();
|
||||||
@ -300,6 +304,20 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
return filterAppsRequiringRoot;
|
return filterAppsRequiringRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is cached as it is called several times inside the AppListAdapter.
|
||||||
|
* Providing it here means the shared preferences file only needs to be
|
||||||
|
* read once, and we will keep our copy up to date by listening to changes
|
||||||
|
* in PREF_ANTI_FEATURE_APPS.
|
||||||
|
*/
|
||||||
|
public boolean filterAppsWithAntiFeatures() {
|
||||||
|
if (!isInitialized(PREF_ANTI_FEATURE_APPS)) {
|
||||||
|
initialize(PREF_ANTI_FEATURE_APPS);
|
||||||
|
filterAppsWithAntiFeatures = preferences.getBoolean(PREF_ANTI_FEATURE_APPS, DEFAULT_ANTI_FEATURE_APPS);
|
||||||
|
}
|
||||||
|
return filterAppsWithAntiFeatures;
|
||||||
|
}
|
||||||
|
|
||||||
public void registerAppsRequiringRootChangeListener(ChangeListener listener) {
|
public void registerAppsRequiringRootChangeListener(ChangeListener listener) {
|
||||||
filterAppsRequiringRootListeners.add(listener);
|
filterAppsRequiringRootListeners.add(listener);
|
||||||
}
|
}
|
||||||
@ -308,6 +326,14 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
filterAppsRequiringRootListeners.remove(listener);
|
filterAppsRequiringRootListeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void registerAppsRequiringAntiFeaturesChangeListener(ChangeListener listener) {
|
||||||
|
filterAppsRequiringAntiFeaturesListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregisterAppsRequiringAntiFeaturesChangeListener(ChangeListener listener) {
|
||||||
|
filterAppsRequiringAntiFeaturesListeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
public void registerUnstableUpdatesChangeListener(ChangeListener listener) {
|
public void registerUnstableUpdatesChangeListener(ChangeListener listener) {
|
||||||
unstableUpdatesListeners.add(listener);
|
unstableUpdatesListeners.add(listener);
|
||||||
}
|
}
|
||||||
@ -327,6 +353,11 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
listener.onPreferenceChange();
|
listener.onPreferenceChange();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PREF_ANTI_FEATURE_APPS:
|
||||||
|
for (ChangeListener listener : filterAppsRequiringAntiFeaturesListeners) {
|
||||||
|
listener.onPreferenceChange();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case PREF_UPD_HISTORY:
|
case PREF_UPD_HISTORY:
|
||||||
for (ChangeListener listener : updateHistoryListeners) {
|
for (ChangeListener listener : updateHistoryListeners) {
|
||||||
listener.onPreferenceChange();
|
listener.onPreferenceChange();
|
||||||
|
@ -51,13 +51,15 @@ public abstract class AppListFragment extends ListFragment implements
|
|||||||
AppMetadataTable.Cols.SuggestedApk.VERSION_NAME,
|
AppMetadataTable.Cols.SuggestedApk.VERSION_NAME,
|
||||||
AppMetadataTable.Cols.SUGGESTED_VERSION_CODE,
|
AppMetadataTable.Cols.SUGGESTED_VERSION_CODE,
|
||||||
AppMetadataTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root.
|
AppMetadataTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root.
|
||||||
|
AppMetadataTable.Cols.ANTI_FEATURES // Needed for filtering apps that require anti-features.
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String APP_SORT = AppMetadataTable.Cols.NAME;
|
private static final String APP_SORT = AppMetadataTable.Cols.NAME;
|
||||||
|
|
||||||
private AppListAdapter appAdapter;
|
private AppListAdapter appAdapter;
|
||||||
|
|
||||||
@Nullable private String searchQuery;
|
@Nullable
|
||||||
|
private String searchQuery;
|
||||||
|
|
||||||
protected abstract AppListAdapter getAppListAdapter();
|
protected abstract AppListAdapter getAppListAdapter();
|
||||||
|
|
||||||
@ -85,6 +87,7 @@ public abstract class AppListFragment extends ListFragment implements
|
|||||||
/**
|
/**
|
||||||
* Alerts the child class that the user is no longer performing a search.
|
* Alerts the child class that the user is no longer performing a search.
|
||||||
* This is triggered every time the search query is blank.
|
* This is triggered every time the search query is blank.
|
||||||
|
*
|
||||||
* @see AppListFragment#onSearch()
|
* @see AppListFragment#onSearch()
|
||||||
*/
|
*/
|
||||||
protected void onSearchStopped() {
|
protected void onSearchStopped() {
|
||||||
@ -166,7 +169,7 @@ public abstract class AppListFragment extends ListFragment implements
|
|||||||
Bundle bundle = ActivityOptionsCompat
|
Bundle bundle = ActivityOptionsCompat
|
||||||
.makeSceneTransitionAnimation(getActivity(),
|
.makeSceneTransitionAnimation(getActivity(),
|
||||||
iconTransitionPair)
|
iconTransitionPair)
|
||||||
.toBundle();
|
.toBundle();
|
||||||
startActivityForResult(intent, REQUEST_APPDETAILS, bundle);
|
startActivityForResult(intent, REQUEST_APPDETAILS, bundle);
|
||||||
} else {
|
} else {
|
||||||
startActivityForResult(intent, REQUEST_APPDETAILS);
|
startActivityForResult(intent, REQUEST_APPDETAILS);
|
||||||
@ -204,6 +207,7 @@ public abstract class AppListFragment extends ListFragment implements
|
|||||||
* Notifies the subclass via {@link AppListFragment#onSearch()} and {@link AppListFragment#onSearchStopped()}
|
* Notifies the subclass via {@link AppListFragment#onSearch()} and {@link AppListFragment#onSearchStopped()}
|
||||||
* about whether or not a search is taking place and changes empty message
|
* about whether or not a search is taking place and changes empty message
|
||||||
* appropriately.
|
* appropriately.
|
||||||
|
*
|
||||||
* @return True if a user is searching.
|
* @return True if a user is searching.
|
||||||
*/
|
*/
|
||||||
private boolean updateSearchStatus() {
|
private boolean updateSearchStatus() {
|
||||||
|
@ -33,6 +33,7 @@ public class PreferencesFragment extends PreferenceFragment
|
|||||||
Preferences.PREF_UPD_NOTIFY,
|
Preferences.PREF_UPD_NOTIFY,
|
||||||
Preferences.PREF_UPD_HISTORY,
|
Preferences.PREF_UPD_HISTORY,
|
||||||
Preferences.PREF_ROOTED,
|
Preferences.PREF_ROOTED,
|
||||||
|
Preferences.PREF_ANTI_FEATURE_APPS,
|
||||||
Preferences.PREF_INCOMP_VER,
|
Preferences.PREF_INCOMP_VER,
|
||||||
Preferences.PREF_THEME,
|
Preferences.PREF_THEME,
|
||||||
Preferences.PREF_IGN_TOUCH,
|
Preferences.PREF_IGN_TOUCH,
|
||||||
@ -123,6 +124,10 @@ public class PreferencesFragment extends PreferenceFragment
|
|||||||
checkSummary(key, R.string.rooted_on);
|
checkSummary(key, R.string.rooted_on);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Preferences.PREF_ANTI_FEATURE_APPS:
|
||||||
|
checkSummary(key, R.string.anti_feature_apps_on);
|
||||||
|
break;
|
||||||
|
|
||||||
case Preferences.PREF_IGN_TOUCH:
|
case Preferences.PREF_IGN_TOUCH:
|
||||||
checkSummary(key, R.string.ignoreTouch_on);
|
checkSummary(key, R.string.ignoreTouch_on);
|
||||||
break;
|
break;
|
||||||
|
@ -148,6 +148,8 @@
|
|||||||
<string name="show_incompat_versions_on">Show app versions incompatible with the device</string>
|
<string name="show_incompat_versions_on">Show app versions incompatible with the device</string>
|
||||||
<string name="rooted">Ignore root</string>
|
<string name="rooted">Ignore root</string>
|
||||||
<string name="rooted_on">Do not grey out apps requiring root privileges</string>
|
<string name="rooted_on">Do not grey out apps requiring root privileges</string>
|
||||||
|
<string name="anti_feature_apps">Grey out anti-feature apps</string>
|
||||||
|
<string name="anti_feature_apps_on">Grey out apps requiring anti-features</string>
|
||||||
<string name="ignoreTouch">Ignore touchscreen</string>
|
<string name="ignoreTouch">Ignore touchscreen</string>
|
||||||
<string name="ignoreTouch_on">Always include apps that require touchscreen</string>
|
<string name="ignoreTouch_on">Always include apps that require touchscreen</string>
|
||||||
|
|
||||||
|
@ -42,6 +42,9 @@
|
|||||||
<CheckBoxPreference android:title="@string/rooted"
|
<CheckBoxPreference android:title="@string/rooted"
|
||||||
android:defaultValue="true"
|
android:defaultValue="true"
|
||||||
android:key="rooted" />
|
android:key="rooted" />
|
||||||
|
<CheckBoxPreference android:title="@string/anti_feature_apps"
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="hideAntiFeatureApps" />
|
||||||
<CheckBoxPreference android:title="@string/ignoreTouch"
|
<CheckBoxPreference android:title="@string/ignoreTouch"
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="ignoreTouchscreen" />
|
android:key="ignoreTouchscreen" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user