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() {
 | 
				
			||||||
@ -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