Merge branch 'finalize-1.3' into 'master'

Finalize 1.3

Closes #1438, #1533, and #1527

See merge request fdroid/fdroidclient!721
This commit is contained in:
Hans-Christoph Steiner 2018-07-31 11:11:12 +00:00
commit 6c6e3ad82d
58 changed files with 127 additions and 290 deletions

View File

@ -139,7 +139,6 @@ dependencies {
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.google.zxing:core:3.3.2'
implementation 'eu.chainfire:libsuperuser:1.0.0.201602271131'
implementation 'info.guardianproject.netcipher:netcipher:2.0.0-alpha1'
implementation 'info.guardianproject.panic:panic:0.5'
implementation 'commons-io:commons-io:2.5'

View File

@ -76,15 +76,12 @@
android:entryValues="@array/themeValues"/>
</android.support.v7.preference.PreferenceCategory>
<android.support.v7.preference.PreferenceCategory android:title="@string/appcompatibility">
<android.support.v7.preference.PreferenceCategory android:title="@string/appcompatibility"
android:key="pref_category_appcompatibility">
<SwitchPreference
android:title="@string/show_incompat_versions"
android:defaultValue="false"
android:key="incompatibleVersions"/>
<SwitchPreference
android:title="@string/show_root_apps"
android:defaultValue="true"
android:key="rooted"/>
<SwitchPreference
android:title="@string/show_anti_feature_apps"
android:defaultValue="false"

View File

@ -109,7 +109,8 @@ public class AppDetails2 extends AppCompatActivity
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
supportPostponeEnterTransition();
if (!reset(getPackageNameFromIntent(getIntent()))) {
resetCurrentApp(getPackageNameFromIntent(getIntent()));
if (app == null) {
finish();
return;
}
@ -187,27 +188,6 @@ public class AppDetails2 extends AppCompatActivity
return intent.getStringExtra(EXTRA_APPID);
}
/**
* If passed null, this will show a message to the user ("Could not find app ..." or something
* like that) and then finish the activity.
*/
private void setApp(App newApp) {
if (newApp == null) {
Toast.makeText(this, R.string.no_such_app, Toast.LENGTH_LONG).show();
finish();
return;
}
app = newApp;
// Remove all "installed" statuses for this app, since we are now viewing it.
AppUpdateStatusManager ausm = AppUpdateStatusManager.getInstance(this);
for (AppUpdateStatusManager.AppUpdateStatus status : ausm.getByPackageName(app.packageName)) {
if (status.status == AppUpdateStatusManager.Status.Installed) {
ausm.removeApk(status.getUniqueKey());
}
}
}
/**
* Some notifications (like "downloading" and "installed") are not shown
* for this app if it is open in app details. When closing, we need to
@ -673,27 +653,40 @@ public class AppDetails2 extends AppCompatActivity
/**
* Reset the display and list contents. Used when entering the activity, and
* also when something has been installed/uninstalled.
* Return true if the app was found, false otherwise.
* also when something has been installed/uninstalled. An index update or
* other external factors might have changed since {@code app} was set
* before. This also removes all pending installs with
* {@link AppUpdateStatusManager.Status#Installed Installed}
* status for this {@code packageName}, to prevent any lingering open ones from
* messing up any action that the user might take. They sometimes might not get
* removed while F-Droid was in the background.
* <p>
* Shows a {@link Toast} if no {@link App} was found matching {@code packageName}.
*/
private boolean reset(String packageName) {
Utils.debugLog(TAG, "Getting application details for " + packageName);
App newApp = null;
if (!TextUtils.isEmpty(packageName)) {
newApp = AppProvider.Helper.findHighestPriorityMetadata(getContentResolver(), packageName);
private void resetCurrentApp(String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
app = AppProvider.Helper.findHighestPriorityMetadata(getContentResolver(), packageName);
setApp(newApp);
return this.app != null;
//
AppUpdateStatusManager ausm = AppUpdateStatusManager.getInstance(this);
for (AppUpdateStatusManager.AppUpdateStatus status : ausm.getByPackageName(packageName)) {
if (status.status == AppUpdateStatusManager.Status.Installed) {
ausm.removeApk(status.getUniqueKey());
}
}
if (app == null) {
Toast.makeText(this, R.string.no_such_app, Toast.LENGTH_LONG).show();
}
}
private void onAppChanged() {
recyclerView.post(new Runnable() {
@Override
public void run() {
if (!reset(app.packageName)) {
resetCurrentApp(app.packageName);
if (app == null) {
AppDetails2.this.finish();
return;
}
@ -705,6 +698,13 @@ public class AppDetails2 extends AppCompatActivity
});
}
@Override
public boolean isAppDownloading() {
return currentStatus != null &&
(currentStatus.status == AppUpdateStatusManager.Status.PendingInstall
|| currentStatus.status == AppUpdateStatusManager.Status.Downloading);
}
@Override
public void enableAndroidBeam() {
NfcHelper.setAndroidBeam(this, app.packageName);

View File

@ -1,41 +0,0 @@
/*
* Copyright (C) 2010-12 Ciaran Gultnieks, ciaran@ciarang.com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.fdroid.fdroid;
import org.fdroid.fdroid.data.App;
public class AppFilter {
// Return true if the given app should be filtered out based on user
// preferences, and false otherwise.
public boolean filter(App app) {
if (app.requirements != null && !Preferences.get().showAppsRequiringRoot()) {
for (String requirement : app.requirements) {
if ("root".equals(requirement)) {
return true;
}
}
}
if (app.antiFeatures != null && app.antiFeatures.length > 0 && !Preferences.get().showAppsWithAntiFeatures()) { // NOPMD NOCHECKSTYLE LineLength
return true;
}
return false;
}
}

View File

@ -373,16 +373,6 @@ public class FDroidApp extends Application {
InstalledAppProviderService.compareToPackageManager(this);
// If the user changes the preference to do with filtering rooted 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.registerAppsRequiringRootChangeListener(new Preferences.ChangeListener() {
@Override
public void onPreferenceChange() {
getContentResolver().notifyChange(AppProvider.getContentUri(), null);
}
});
// 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.

View File

@ -81,7 +81,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
public static final String PREF_UPDATE_NOTIFICATION_ENABLED = "updateNotify";
public static final String PREF_THEME = "theme";
public static final String PREF_SHOW_INCOMPAT_VERSIONS = "incompatibleVersions";
public static final String PREF_SHOW_ROOT_APPS = "rooted";
public static final String PREF_SHOW_ANTI_FEATURE_APPS = "showAntiFeatureApps";
public static final String PREF_FORCE_TOUCH_APPS = "ignoreTouchscreen";
public static final String PREF_PROMPT_TO_SEND_CRASH_REPORTS = "promptToSendCrashReports";
@ -155,12 +154,10 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
DateUtils.HOUR_IN_MILLIS,
};
private boolean showAppsRequiringRoot;
private boolean showAppsWithAntiFeatures;
private final Map<String, Boolean> initialized = new HashMap<>();
private final List<ChangeListener> showAppsRequiringRootListeners = new ArrayList<>();
private final List<ChangeListener> showAppsRequiringAntiFeaturesListeners = new ArrayList<>();
private final List<ChangeListener> localRepoNameListeners = new ArrayList<>();
private final List<ChangeListener> localRepoHttpsListeners = new ArrayList<>();
@ -527,20 +524,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
return preferences.getBoolean(PREF_ALLOW_PUSH_REQUESTS, IGNORED_B);
}
/**
* This is cached as it is called several times inside app list adapters.
* 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_SHOW_ROOT_APPS.
*/
public boolean showAppsRequiringRoot() {
if (!isInitialized(PREF_SHOW_ROOT_APPS)) {
initialize(PREF_SHOW_ROOT_APPS);
showAppsRequiringRoot = preferences.getBoolean(PREF_SHOW_ROOT_APPS, IGNORED_B);
}
return showAppsRequiringRoot;
}
/**
* This is cached as it is called several times inside app list adapters.
* Providing it here means the shared preferences file only needs to be
@ -560,14 +543,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
return showAppsWithAntiFeatures;
}
public void registerAppsRequiringRootChangeListener(ChangeListener listener) {
showAppsRequiringRootListeners.add(listener);
}
public void unregisterAppsRequiringRootChangeListener(ChangeListener listener) {
showAppsRequiringRootListeners.remove(listener);
}
public void registerAppsRequiringAntiFeaturesChangeListener(ChangeListener listener) {
showAppsRequiringAntiFeaturesListeners.add(listener);
}
@ -590,11 +565,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
uninitialize(key);
switch (key) {
case PREF_SHOW_ROOT_APPS:
for (ChangeListener listener : showAppsRequiringRootListeners) {
listener.onPreferenceChange();
}
break;
case PREF_SHOW_ANTI_FEATURE_APPS:
for (ChangeListener listener : showAppsRequiringAntiFeaturesListeners) {
listener.onPreferenceChange();

View File

@ -23,7 +23,6 @@ import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.io.filefilter.RegexFileFilter;
import org.fdroid.fdroid.AppFilter;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
@ -1008,15 +1007,17 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
boolean canUpdate = hasUpdates();
AppPrefs prefs = getPrefs(context);
boolean wantsUpdate = !prefs.ignoreAllUpdates && prefs.ignoreThisUpdate < suggestedVersionCode;
return canUpdate && wantsUpdate && !isFiltered();
return canUpdate && wantsUpdate && !isDisabledByAntiFeatures();
}
/**
* Whether the app is filtered or not based on AntiFeatures and root
* permission (set in the Settings page)
* @return if the given app should be filtered out based on the
* {@link Preferences#PREF_SHOW_ANTI_FEATURE_APPS Show Anti-Features Setting}
*/
public boolean isFiltered() {
return new AppFilter().filter(this);
public boolean isDisabledByAntiFeatures() {
return this.antiFeatures != null
&& this.antiFeatures.length > 0
&& !Preferences.get().showAppsWithAntiFeatures();
}
@Nullable

View File

@ -12,6 +12,7 @@ import android.support.annotation.Nullable;
import android.support.v4.app.JobIntentService;
import android.util.Log;
import org.acra.ACRA;
import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
import rx.functions.Action1;
@ -31,13 +32,21 @@ import java.util.concurrent.TimeUnit;
* versus what Android says is installed, or processing {@link Intent}s that come
* from {@link android.content.BroadcastReceiver}s for {@link Intent#ACTION_PACKAGE_ADDED}
* and {@link Intent#ACTION_PACKAGE_REMOVED}
* <p/>
* <p>
* Since {@link android.content.ContentProvider#insert(Uri, ContentValues)} does not check
* for duplicate records, it is entirely the job of this service to ensure that it is not
* inserting duplicate versions of the same installed APK. On that note,
* {@link #insertAppIntoDb(Context, PackageInfo, String, String)} and
* {@link #deleteAppFromDb(Context, String)} are both static methods to enable easy testing
* of this stuff.
* <p>
* This also updates the {@link AppUpdateStatusManager.Status status} of any
* package installs that are still in progress. Most importantly, this
* provides the final {@link AppUpdateStatusManager.Status#Installed status update}
* to mark the end of the installation process. It also errors out installation
* processes where some outside factor uninstalled the package while the F-Droid
* process was underway, e.g. uninstalling via {@code adb}, updates via Google
* Play, Yalp, etc.
*/
@SuppressWarnings("LineLength")
public class InstalledAppProviderService extends JobIntentService {
@ -221,11 +230,15 @@ public class InstalledAppProviderService extends JobIntentService {
protected void onHandleWork(@NonNull Intent intent) {
Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
AppUpdateStatusManager ausm = AppUpdateStatusManager.getInstance(this);
String packageName = intent.getData().getSchemeSpecificPart();
final String action = intent.getAction();
if (ACTION_INSERT.equals(action)) {
PackageInfo packageInfo = getPackageInfo(intent, packageName);
if (packageInfo != null) {
for (AppUpdateStatusManager.AppUpdateStatus status : ausm.getByPackageName(packageName)) {
ausm.updateApk(status.getUniqueKey(), AppUpdateStatusManager.Status.Installed, null);
}
File apk = getPathToInstalledApk(packageInfo);
if (apk == null) {
return;
@ -244,6 +257,9 @@ public class InstalledAppProviderService extends JobIntentService {
}
} else if (ACTION_DELETE.equals(action)) {
deleteAppFromDb(this, packageName);
for (AppUpdateStatusManager.AppUpdateStatus status : ausm.getByPackageName(packageName)) {
ausm.updateApk(status.getUniqueKey(), AppUpdateStatusManager.Status.InstallError, null);
}
}
packageChangeNotifier.onNext(packageName);
}

View File

@ -6,7 +6,6 @@ import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.net.Uri;
@ -52,6 +51,8 @@ import java.io.IOException;
* {@code {@link #stopSelf(int)}}, so {@code Intent}s are sometimes redelivered even
* though they are no longer valid. {@link #onStartCommand(Intent, int, int)} checks
* first that the incoming {@code Intent} is not an invalid, redelivered {@code Intent}.
* {@link #isPendingInstall(String)} and other checks are used to check whether to
* process the redelivered {@code Intent} or not.
* <p>
* The canonical URL for the APK file to download is also used as the unique ID to
* represent the download itself throughout F-Droid. This follows the model
@ -95,7 +96,6 @@ public class InstallManagerService extends Service {
private LocalBroadcastManager localBroadcastManager;
private AppUpdateStatusManager appUpdateStatusManager;
private BroadcastReceiver broadcastReceiver;
private boolean running = false;
/**
@ -111,21 +111,6 @@ public class InstallManagerService extends Service {
super.onCreate();
localBroadcastManager = LocalBroadcastManager.getInstance(this);
appUpdateStatusManager = AppUpdateStatusManager.getInstance(this);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getData() == null) return;
String packageName = intent.getData().getSchemeSpecificPart();
for (AppUpdateStatusManager.AppUpdateStatus status : appUpdateStatusManager.getByPackageName(packageName)) {
appUpdateStatusManager.updateApk(status.getUniqueKey(), AppUpdateStatusManager.Status.Installed, null);
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addDataScheme("package");
registerReceiver(broadcastReceiver, intentFilter);
running = true;
pendingInstalls = getPendingInstalls(this);
}
@ -140,7 +125,6 @@ public class InstallManagerService extends Service {
@Override
public void onDestroy() {
running = false;
unregisterReceiver(broadcastReceiver);
super.onDestroy();
}
@ -489,25 +473,12 @@ public class InstallManagerService extends Service {
return pendingInstalls.contains(urlString);
}
/**
* Look up by {@code packageName} whether it is a Pending Install.
*
* @see #isPendingInstall(String)
*/
public static boolean isPendingInstall(Context context, String packageName) {
if (pendingInstalls == null) {
pendingInstalls = getPendingInstalls(context);
}
return pendingInstalls.getAll().values().contains(packageName);
}
/**
* Mark a given APK as in the process of being installed, with
* the {@code urlString} of the download used as the unique ID,
* and the file hash used to verify that things are the same.
*
* @see #isPendingInstall(String)
* @see #isPendingInstall(Context, String)
*/
public static void putPendingInstall(Context context, String urlString, String packageName) {
if (pendingInstalls == null) {

View File

@ -43,7 +43,6 @@ import org.fdroid.fdroid.data.ApkProvider;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.installer.InstallManagerService;
import org.fdroid.fdroid.privileged.views.AppDiff;
import org.fdroid.fdroid.privileged.views.AppSecurityPermissions;
import org.fdroid.fdroid.views.main.MainActivity;
@ -58,6 +57,8 @@ public class AppDetailsRecyclerViewAdapter
public interface AppDetailsRecyclerViewAdapterCallbacks {
boolean isAppDownloading();
void enableAndroidBeam();
void disableAndroidBeam();
@ -487,7 +488,7 @@ public class AppDetailsRecyclerViewAdapter
buttonSecondaryView.setOnClickListener(onUnInstallClickListener);
buttonPrimaryView.setText(R.string.menu_install);
buttonPrimaryView.setVisibility(versions.size() > 0 ? View.VISIBLE : View.GONE);
if (InstallManagerService.isPendingInstall(context, app.packageName)) {
if (callbacks.isAppDownloading()) {
buttonPrimaryView.setText(R.string.downloading);
buttonPrimaryView.setEnabled(false);
buttonLayout.setVisibility(View.GONE);

View File

@ -108,7 +108,12 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
installButton = (ImageView) itemView.findViewById(R.id.install);
if (installButton != null) {
installButton.setOnClickListener(onActionClicked);
installButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onActionButtonPressed(currentApp);
}
});
if (Build.VERSION.SDK_INT >= 21) {
installButton.setOutlineProvider(new ViewOutlineProvider() {
@ -140,7 +145,14 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
secondaryButton = (Button) itemView.findViewById(R.id.secondary_button);
if (actionButton != null) {
actionButton.setOnClickListener(onActionClicked);
actionButton.setEnabled(true);
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionButton.setEnabled(false);
onActionButtonPressed(currentApp);
}
});
}
if (secondaryButton != null) {
@ -439,18 +451,6 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
}
};
@SuppressWarnings("FieldCanBeLocal")
private final View.OnClickListener onActionClicked = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentApp == null) {
return;
}
onActionButtonPressed(currentApp);
}
};
@SuppressWarnings("FieldCanBeLocal")
private final View.OnClickListener onSecondaryButtonClicked = new View.OnClickListener() {
@Override
@ -463,7 +463,11 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
}
};
protected void onActionButtonPressed(@NonNull App app) {
protected void onActionButtonPressed(App app) {
if (app == null) {
return;
}
// When the button says "Run", then launch the app.
if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.Installed) {
Intent intent = activity.getPackageManager().getLaunchIntentForPackage(app.packageName);
@ -484,9 +488,6 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
Utils.debugLog(TAG, "skip download, we have already downloaded " + currentStatus.apk.getUrl() +
" to " + apkFilePath);
// TODO: This seems like a bit of a hack. Is there a better way to do this by changing
// the Installer API so that we can ask it to install without having to get it to fire
// off an intent which we then listen for and action?
final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(activity);
final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override

View File

@ -4,7 +4,6 @@ import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.App;
@ -12,9 +11,11 @@ import org.fdroid.fdroid.data.App;
/**
* Used for search results or for category lists.
* Shows an inline download button, and also (if appropriate):
* * Whether the app is incompatible.
* * Version that app can be upgraded to.
* * Installed version.
* <ul>
* <li>Whether the app is incompatible
* <li>Version that app can be upgraded to
* <li>Installed version
* </ul>
*/
public class StandardAppListItemController extends AppListItemController {
public StandardAppListItemController(Activity activity, View itemView) {
@ -35,6 +36,8 @@ public class StandardAppListItemController extends AppListItemController {
private CharSequence getStatusText(@NonNull App app) {
if (!app.compatible) {
return activity.getString(R.string.app_incompatible);
} else if (app.isDisabledByAntiFeatures()) {
return activity.getString(R.string.antifeatures);
} else if (app.isInstalled(activity.getApplicationContext())) {
if (app.canAndWantToUpdate(activity)) {
return activity.getString(R.string.app_version_x_available, app.getSuggestedVersionName());
@ -48,7 +51,7 @@ public class StandardAppListItemController extends AppListItemController {
private boolean shouldShowInstall(@NonNull App app) {
boolean installable = app.canAndWantToUpdate(activity) || !app.isInstalled(activity.getApplicationContext());
boolean shouldAllow = app.compatible && !app.isFiltered();
boolean shouldAllow = app.compatible && !app.isDisabledByAntiFeatures();
return installable && shouldAllow;
}

View File

@ -28,6 +28,7 @@ package org.fdroid.fdroid.views.fragments;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v14.preference.PreferenceFragment;
@ -65,7 +66,6 @@ public class PreferencesFragment extends PreferenceFragment
Preferences.PREF_OVER_DATA,
Preferences.PREF_UPDATE_INTERVAL,
Preferences.PREF_UPDATE_NOTIFICATION_ENABLED,
Preferences.PREF_SHOW_ROOT_APPS,
Preferences.PREF_SHOW_ANTI_FEATURE_APPS,
Preferences.PREF_SHOW_INCOMPAT_VERSIONS,
Preferences.PREF_THEME,
@ -157,11 +157,18 @@ public class PreferencesFragment extends PreferenceFragment
languagePref.setEntries(languages.getAllNames());
languagePref.setEntryValues(languages.getSupportedLocales());
}
if (getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
PreferenceCategory category = (PreferenceCategory) findPreference("pref_category_appcompatibility");
category.removePreference(findPreference(Preferences.PREF_FORCE_TOUCH_APPS));
}
}
private void checkSummary(String key, int resId) {
Preference pref = findPreference(key);
pref.setSummary(resId);
if (pref != null) {
pref.setSummary(resId);
}
}
private void entrySummary(String key) {
@ -249,10 +256,6 @@ public class PreferencesFragment extends PreferenceFragment
checkSummary(key, R.string.show_incompat_versions_on);
break;
case Preferences.PREF_SHOW_ROOT_APPS:
checkSummary(key, R.string.show_root_apps_on);
break;
case Preferences.PREF_SHOW_ANTI_FEATURE_APPS:
checkSummary(key, R.string.show_anti_feature_apps_on);
break;

View File

@ -99,7 +99,9 @@ public class UpdatesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
* {@link org.fdroid.fdroid.AppUpdateStatusManager.Status#UpdateAvailable} are not interesting here.
*/
private boolean shouldShowStatus(AppUpdateStatusManager.AppUpdateStatus status) {
return status.status == AppUpdateStatusManager.Status.Downloading ||
return status.status == AppUpdateStatusManager.Status.PendingInstall ||
status.status == AppUpdateStatusManager.Status.Downloading ||
status.status == AppUpdateStatusManager.Status.Installing ||
status.status == AppUpdateStatusManager.Status.Installed ||
status.status == AppUpdateStatusManager.Status.ReadyToInstall;
}

View File

@ -64,7 +64,7 @@ public class UpdateableAppsHeader extends AppUpdateData {
}
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public static class ViewHolder extends RecyclerView.ViewHolder {
private UpdateableAppsHeader header;
@ -81,8 +81,22 @@ public class UpdateableAppsHeader extends AppUpdateData {
appsToUpdate = (TextView) itemView.findViewById(R.id.text_apps_to_update);
toggleAppsToUpdate = (Button) itemView.findViewById(R.id.button_toggle_apps_to_update);
toggleAppsToUpdate.setOnClickListener(this);
downloadAll.setOnClickListener(this);
toggleAppsToUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
header.adapter.toggleAllUpdateableApps();
updateToggleButtonText();
}
});
downloadAll.setVisibility(View.VISIBLE);
downloadAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
downloadAll.setVisibility(View.GONE);
UpdateService.autoDownloadUpdates(header.activity);
}
});
}
public void bindHeader(UpdateableAppsHeader header) {
@ -101,16 +115,6 @@ public class UpdateableAppsHeader extends AppUpdateData {
updateToggleButtonText();
}
@Override
public void onClick(View v) {
if (v == toggleAppsToUpdate) {
header.adapter.toggleAllUpdateableApps();
updateToggleButtonText();
} else if (v == downloadAll) {
UpdateService.autoDownloadUpdates(header.activity);
}
}
private void updateToggleButtonText() {
if (header.adapter.canViewAllUpdateableApps()) {
toggleAppsToUpdate.setText(R.string.updates__hide_updateable_apps);

View File

@ -502,8 +502,6 @@
<string name="repo_add_mirror">إضافة مستودع مِرآة</string>
<string name="sort_search">ترتيب حسب</string>
<string name="show_root_apps">إضافة التطبيقات التي تحتاج إلى التصريحات الجذرية</string>
<string name="show_root_apps_on">إظهار التطبيقات التي تتطلّب التصريحات الجذرية</string>
<string name="force_touch_apps">إضافة التطبيقات التي تتطلّب لمس الشاشة</string>
<string name="hide_on_long_search_press_title">الإخفاء عن طريق زر البحث</string>
<string name="hide_on_long_search_press_summary">الضغط المُطوّل على زر البحث يُمكّن مِن إخفاء التطبيق</string>

View File

@ -562,8 +562,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Ваша камеры не падтрымлівае аўтафокус. Сканаванне кода можа быць абцяжаранае.</string>
<string name="show_root_apps">Паказваць root-прыкладанні</string>
<string name="show_root_apps_on">Паказваць прыкладанні, які патрабуюць root-прывілей</string>
<string name="force_touch_apps">Паказваць прыкладанні для сэнсарнага экрана</string>
<string name="force_touch_apps_on">Паказваць прыкладанні, якія патрабуюць сэнсарны экран незалежна ад наяўнасці апаратнай падтрымкі</string>

View File

@ -499,7 +499,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="show_root_apps_on">Mostra aplicacions que requereixen privilegis d\'administrador</string>
<string name="panic_hide_warning_title">Recorda com restaurar-ho</string>
<string name="panic_hide_warning_message">En una situació de pànic, això esborrarà %1$s del menú. Només es podrà restaurar escrivint \"%2$d\" a la falsa aplicació %3$s.</string>
@ -516,7 +515,6 @@
<string name="antidisabledalgorithmlist">La signatura de seguretat de l\'aplicació és feble</string>
<string name="antiknownvulnlist">Aquesta aplicació té un problema de seguretat conegut</string>
<string name="show_root_apps">Inclou aplicacions amb accés d\'administrador</string>
<string name="show_anti_feature_apps">Inclou aplicacions amb característiques indesitjades</string>
<string name="show_anti_feature_apps_on">Mostra aplicacions que requereixen característiques indesitjades</string>
<string name="force_touch_apps">Inclou aplicacions per pantalla tàctil</string>

View File

@ -537,8 +537,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Vypadá to, že váš fotoaparát nemá automatické zaostřování. Oskenování kódu může být obtížné.</string>
<string name="show_root_apps">Zahrnout aplikace vyžadující root přístup</string>
<string name="show_root_apps_on">Zobrazit aplikace které vyžadují práva root</string>
<string name="show_anti_feature_apps">Zahrnout aplikace s funkcemi které nejsou v zájmu uživatele</string>
<string name="show_anti_feature_apps_on">Zobrazit aplikace které vyžadují funkce které nejsou v zájmu uživatele</string>
<string name="force_touch_apps">Zahrnout aplikace pro dotykovou obrazovku</string>

View File

@ -491,6 +491,4 @@
<string name="antidisabledalgorithmlist">Denne app har en svag sikkerhedssignatur</string>
<string name="antiknownvulnlist">Denne app indeholder en kendt sårbarhed</string>
<string name="show_root_apps">Inkluder root-apps</string>
<string name="show_root_apps_on">Vis apps som kræver root-rettigheder</string>
</resources>

View File

@ -522,8 +522,6 @@
<string name="panic_hide_warning_title">Wiederherstellungsmethode merken</string>
<string name="warning_scaning_qr_code">Ihre Kamera scheint keinen Autofokus zu haben. Es könnte schwierig sein, den Code zu scannen.</string>
<string name="show_root_apps">Root-Apps einbeziehen</string>
<string name="show_root_apps_on">Apps anzeigen, die Root-Berechtigungen benötigen</string>
<string name="repo_add_mirror">Mirror hinzufügen</string>
<string name="repo_exists_add_fingerprint">%1$s ist bereits eingerichtet, dies fügt neue Schlüsselinformationen hinzu.</string>
<string name="repo_exists_enable">%1$s ist bereits eingestellt, bestätigen Sie, dass Sie erneut aktivieren möchten.</string>

View File

@ -515,8 +515,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Via fotilo ne havas memfokuson. Povas esti malfacile skani la kodon.</string>
<string name="show_root_apps">Inkluzivi ĉefuzantajn aplikaĵojn</string>
<string name="show_root_apps_on">Montri aplikaĵojn, kiuj postulas ĉefuzantan aliron (root)</string>
<string name="show_anti_feature_apps">Inkluzivi aplikaĵojn kun fiebloj</string>
<string name="show_anti_feature_apps_on">Montri aplikaĵojn, kiuj enhavas nedeziratajn eblojn</string>
<string name="force_touch_apps">Inkluzivi tuŝekranajn aplikaĵojn</string>

View File

@ -536,8 +536,6 @@
<string name="repo_exists_and_enabled">%1$s ya está configurado y habilitado.</string>
<string name="repo_delete_to_overwrite">Primero borra %1$s para agregar este ya que hay un conflicto de claves.</string>
<string name="repo_exists_add_mirror">Esto es una copia de %1$s, ¿agregarlo como réplica?</string>
<string name="show_root_apps">Incluir aplicaciones con acceso de administrador</string>
<string name="show_root_apps_on">Listar aplicaciones que requieren privilegios de administrador</string>
<string name="show_anti_feature_apps">Incluir aplicaciones controvertidas</string>
<string name="show_anti_feature_apps_on">Listar aplicaciones que requieren características controvertidas</string>
<string name="force_touch_apps">Incluir aplicaciones de pantalla táctil</string>

View File

@ -547,8 +547,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Zure kamerak ez du fokatze automatikorako gaitasunik. Kodea eskaneatzea zaila izan daiteke.</string>
<string name="show_root_apps">Sartu root aplikazioak</string>
<string name="show_root_apps_on">Erakutsi root baimenak behar dituzten aplikazioak</string>
<string name="show_anti_feature_apps">Sartu ezaugarri zalantzagarriak dituzten aplikazioak</string>
<string name="show_anti_feature_apps_on">Erakutsi ezaugarri zalantzagarriak behar dituzten aplikazioak</string>
<string name="force_touch_apps">Sartu ukimen pantaila darabilten aplikazioak</string>

View File

@ -517,8 +517,6 @@
<string name="antidisabledalgorithmlist">این کاره یک امضای امنیتی ضعیف دارد</string>
<string name="antiknownvulnlist">این کاره یک آسیب‌پذیری امنیتی شناخته‌شده دارد</string>
<string name="show_root_apps">شامل کاره‌های ریشه‌ای</string>
<string name="show_root_apps_on">نمایش کاره‌هایی که نیاز به دسترسی ریشه دارند</string>
<string name="show_anti_feature_apps">شامل کاره‌های ضدویژگی‌دار</string>
<string name="show_anti_feature_apps_on">نمایش کاره‌هایی که نیاز به ضدویژگی دارند</string>
<string name="force_touch_apps">شامل کاره‌های لمسی</string>

View File

@ -480,8 +480,6 @@
<string name="antidisabledalgorithmlist">Tällä sovelluksella on heikko turvallisuusallekirjoitus</string>
<string name="antiknownvulnlist">Tämä sovellus sisältää tunnetun haavoittuvuuden</string>
<string name="show_root_apps">Sisällytä root-sovellukset</string>
<string name="show_root_apps_on">Näytä sovellukset, jotka vaativat root-oikeudet</string>
<string name="show_anti_feature_apps">Sisällytä anti-ominaisuus -sovellukset</string>
<string name="show_anti_feature_apps_on">Näytä sovellukset, jotka vaativat anti-ominaisuuksia</string>
<string name="force_touch_apps">Sisällytä kosketusnäyttösovellukset</string>

View File

@ -526,8 +526,6 @@
<string name="hide_on_long_search_press_summary">Appuyer longtemps sur le bouton de recherche masquera l\'application</string>
<string name="warning_scaning_qr_code">Votre appareil-photo na pas de mise au point automatique. Il sera peut-être difficile de scanner le code.</string>
<string name="show_root_apps">Inclure les applications root</string>
<string name="show_root_apps_on">Afficher les applications nécessitant les privilèges root</string>
<string name="repo_add_mirror">Ajouter un miroir</string>
<string name="repo_delete_to_overwrite">Veuillez d\'abord supprimer %1$s pour pouvoir l\'ajouter avec la clé en conflit.</string>
<string name="repo_exists_add_mirror">Il s\'agit d\'une copie de %1$s, l\'ajouter comme miroir ?</string>

View File

@ -538,8 +538,6 @@
<string name="antidisabledalgorithmlist">Este aplicativo ten unha sinatura de seguridade feble</string>
<string name="antiknownvulnlist">Esta aplicación contén unha vulnerabilidade de seguridade coñecida</string>
<string name="show_root_apps">Incluir aplicativos con permiso de administrador</string>
<string name="show_root_apps_on">Amosar aplicativos que requiren privilexios de administrador</string>
<string name="show_anti_feature_apps">Incluir aplicativos con anti-funcionalidades</string>
<string name="show_anti_feature_apps_on">Amosar aplicativos que requiren de anti-funcionalidades</string>
<string name="force_touch_apps">Incluir aplicativos de pantalla táctil</string>

View File

@ -532,8 +532,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">כנראה שלמצלמה שלך אין מיקוד אוטומטי. סריקת הקוד עשויה להוות מכשול.</string>
<string name="show_root_apps">לכלול גירסאות שדורשות גישת על</string>
<string name="show_root_apps_on">הצגת יישומונים שדורשים גישת על למכשיר</string>
<string name="show_anti_feature_apps">לכלול יישומונים שמכילים תכונות שליליות</string>
<string name="show_anti_feature_apps_on">הצגת יישומונים שדורשים תכונות שליליות</string>
<string name="force_touch_apps">לכלול יישומוני מסך מגע</string>

View File

@ -473,7 +473,6 @@
<string name="antidisabledalgorithmlist">Ennek az alkalmazásnak gyönge a biztonsági aláírása</string>
<string name="antiknownvulnlist">Ez az alkalmazás ismert biztonsági rést tartalmaz</string>
<string name="show_root_apps">Root jogot igénylő alkalmazások belefoglalása</string>
<string name="over_data">Adatkapcsolaton keresztül</string>
<string name="repo_exists_add_fingerprint">A(z) %1$s már be lett állítva, ez új kulcsinformációkat fog hozzáadni.</string>
<string name="repo_exists_enable">A(z) %1$s már be lett állítva, erősítse meg, hogy újra engedélyezni akarja.</string>
@ -481,7 +480,6 @@
<string name="repo_delete_to_overwrite">Először törölje a(z) %1$s alkalmazást, hogy hozzáadhassa egy ütköző kulccsal.</string>
<string name="menu_liberapay">Liberapay</string>
<string name="show_root_apps_on">Azon alkalmazások megjelenítése, melyekhez root jogosultság szükséges</string>
<string name="show_anti_feature_apps">Előnytelen funkciókkal rendelkező alkalmazások belefoglalása</string>
<string name="show_anti_feature_apps_on">Azon alkalmazások megjelenítése, melyek előnytelen funkciókkal rendelkeznek</string>
<string name="force_touch_apps">Érintőképernyős alkalmazások belefoglalása</string>

View File

@ -514,8 +514,6 @@
<string name="repo_exists_add_mirror">Ini adalah salinan dari %1$s, tambahkan sebagai mirror?</string>
<string name="menu_liberapay">Liberapay</string>
<string name="show_root_apps">Termasuk apl root</string>
<string name="show_root_apps_on">Tampilkan apl yg butuh akses root</string>
<string name="show_anti_feature_apps">Termasuk apl anti-fitur</string>
<string name="show_anti_feature_apps_on">Tampilkan apl yg butuh anti-fitur</string>
<string name="force_touch_apps">Termasuk apl layar sentuh</string>

View File

@ -561,8 +561,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Það lítur út eins og myndavélin þín sé ekki með sjálfvirkan fókus. Það gæti orðið vandkvæðum bundið að skanna kóðann.</string>
<string name="show_root_apps">Hafa með rótaraðgangsforrit</string>
<string name="show_root_apps_on">Birta forrit sem þurfa rótaraðgang</string>
<string name="show_anti_feature_apps">Hafa með forrit með ókostum</string>
<string name="show_anti_feature_apps_on">Birta forrit með óæskilegum eiginleikum</string>
<string name="force_touch_apps">Hafa með forrit sem þurfa snertiskjá</string>

View File

@ -532,8 +532,6 @@
<string name="repo_exists_add_mirror">Questa è una copia di %1$s, aggiungerla come mirror?</string>
<string name="menu_liberapay">Liberapay</string>
<string name="show_root_apps">Includi app di root</string>
<string name="show_root_apps_on">Mostra le app che richiedono privilegi di root</string>
<string name="show_anti_feature_apps">Includi app con anti-caratteristiche</string>
<string name="show_anti_feature_apps_on">Mostra app che richiedono anti-caratteristiche</string>
<string name="force_touch_apps">Includi app tattili</string>

View File

@ -489,8 +489,6 @@
<string name="repo_exists_and_enabled">%1$sはすでに設定済みで有効です。</string>
<string name="repo_delete_to_overwrite">競合する鍵でこのリポジトリを追加するためには、先に%1$sを削除してください。</string>
<string name="repo_exists_add_mirror">これは%1$sの複製です。ミラーとして追加しますか</string>
<string name="show_root_apps">root権限の使用が必要なアプリ</string>
<string name="show_root_apps_on">root権限の使用を必要とするアプリを表示します</string>
<string name="show_anti_feature_apps">好ましくない機能の使用が必要なアプリ</string>
<string name="show_anti_feature_apps_on">好ましくない機能の使用を必要とするアプリを表示します</string>
<string name="force_touch_apps">タッチスクリーンの使用が必要なアプリ</string>

View File

@ -479,8 +479,6 @@
<string name="repo_exists_and_enabled">%1$s은(는) 이미 설정되어 있으며, 활성화됩니다.</string>
<string name="repo_delete_to_overwrite">이것과 충돌하는 키를 추가하려면 먼저 %1$s을(를) 삭제합니다.</string>
<string name="repo_exists_add_mirror">이것은 %1$s의 복사본입니다, 그것을 미러로 추가하시겠습니까?</string>
<string name="show_root_apps">루트 앱을 포함</string>
<string name="show_root_apps_on">루트 권한이 필요한 앱을 보여주기</string>
<string name="show_anti_feature_apps">안티 기능 앱을 포함</string>
<string name="show_anti_feature_apps_on">안티 기능이 필요한 앱을 보여주기</string>
<string name="force_touch_apps">터치스크린 앱을 포함</string>

View File

@ -528,8 +528,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Kameraet ditt mangler autofokus. Det kan vise seg vanskelig å skanne koden.</string>
<string name="show_root_apps">Inkluder root-programmer</string>
<string name="show_root_apps_on">Vis programmer som krever root-tilgang</string>
<string name="show_anti_feature_apps">Inkluder antifunksjons-programmer</string>
<string name="show_anti_feature_apps_on">Vis programmer som krever anti-funksjoner</string>
<string name="force_touch_apps">Inkluder pekeskjermsprogrammer</string>

View File

@ -238,8 +238,6 @@
<string name="appcompatibility">Compatibiliteit van app</string>
<string name="show_incompat_versions">Incompatibele versies tonen</string>
<string name="show_incompat_versions_on">Toont app-versies die niet compatibel zijn met uw apparaat</string>
<string name="show_root_apps">Root-apps tonen</string>
<string name="show_root_apps_on">Toont apps die root-privileges vereisen</string>
<string name="show_anti_feature_apps">Apps met antifuncties tonen</string>
<string name="show_anti_feature_apps_on">Toont apps die antifuncties bevatten</string>
<string name="force_touch_apps">Aanraakschermapps tonen</string>

View File

@ -508,8 +508,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Je camera lijkt niet over autofocus te beschikken. Het scannen van de code kan moeilijk zijn.</string>
<string name="show_root_apps">Root-apps tonen</string>
<string name="show_root_apps_on">Toon apps die root-privileges vereisen</string>
<string name="show_anti_feature_apps">Apps met antifuncties tonen</string>
<string name="show_anti_feature_apps_on">Toon apps die antifuncties bevatten</string>
<string name="force_touch_apps">Aanraakschermapps tonen</string>

View File

@ -538,8 +538,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Twój aparat nie posiada autofokusu. Mogą wystąpić trudności ze zeskanowaniem kodu.</string>
<string name="show_root_apps">Uwzględnij aplikacje roota</string>
<string name="show_root_apps_on">Pokaż aplikacje wymagające do działania uprawnień roota</string>
<string name="show_anti_feature_apps">Uwzględnij (trochę) niefajne aplikacje</string>
<string name="show_anti_feature_apps_on">Pokaż aplikacje zawierające niepożądane funkcje</string>
<string name="force_touch_apps">Uwzględnij aplikacje dotykowe</string>

View File

@ -543,8 +543,6 @@
<string name="warning_scaning_qr_code">Sua câmera não parece ter focagem automática. Pode ser difícil escanear o código.</string>
<string name="repo_add_mirror">Adicionar mirror</string>
<string name="repo_exists_add_mirror">Esta é uma copia de %1$s, adicionar ele como um mirror?</string>
<string name="show_root_apps">Incluir aplicativos root</string>
<string name="show_root_apps_on">Mostrar aplicativos que requerem privilégios root</string>
<string name="show_anti_feature_apps">Incluir aplicativos antifraude</string>
<string name="force_touch_apps">Incluir aplicativos touchscreen</string>
<string name="force_touch_apps_on">Mostrar aplicativos touchscreen independente do suporte de hardware</string>

View File

@ -545,8 +545,6 @@
<string name="repo_exists_add_mirror">Esta é uma cópia de %1$s, deseja adicionar como \'mirror\'?</string>
<string name="menu_liberapay">Liberapay</string>
<string name="show_root_apps">Incluir aplicações \'root\'</string>
<string name="show_root_apps_on">Mostrar aplicações que necessitam de acesso \'root\'</string>
<string name="show_anti_feature_apps">Incluir aplicações com anti-funcionalidades</string>
<string name="show_anti_feature_apps_on">Mostrar aplicações que necessitem de anti-funcionalidades</string>
<string name="force_touch_apps">Incluir aplicações \'touchscreen\'</string>

View File

@ -499,8 +499,6 @@
<string name="warning_scaning_qr_code">Camera foto a dispozitivului nu pare să suporte focalizare automată. Ar putea fi dificil să se scaneze codul.</string>
<string name="menu_liberapay">Liberapay</string>
<string name="show_root_apps">Include root</string>
<string name="show_root_apps_on">Se listează și aplicațiile ce necesită acces de tip administrator (root)</string>
<string name="show_anti_feature_apps">Include caracteristici periculoase</string>
<string name="show_anti_feature_apps_on">Se listează și aplicațiile ce prezintă caracteristici periculoase (ex. urmărire)</string>
<string name="force_touch_apps">Include ecran tactil</string>

View File

@ -526,8 +526,6 @@
<string name="hide_on_long_search_press_summary">Длительное нажатие кнопки поиска скроет приложение</string>
<string name="warning_scaning_qr_code">Ваша камера не поддерживает автофокус. Сканирование кода может быть затруднено.</string>
<string name="show_root_apps">Включить root-приложения</string>
<string name="show_root_apps_on">Показать приложения, требующие привилегий root</string>
<string name="repo_add_mirror">Добавить зеркало</string>
<string name="repo_exists_add_mirror">Это копия %1$s, добавить ее как зеркало?</string>
<string name="show_anti_feature_apps">Включить приложения с сомнительным функционалом</string>

View File

@ -546,8 +546,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Paret chi sa fotocàmera tua non tèngiat su focus automàticu. Diat pòdere èssere difìtzile a iscansire su còdighe.</string>
<string name="show_root_apps">Inclue sas aplicatziones \"root\"</string>
<string name="show_root_apps_on">Ammustra sas aplicatziones chi tenent bisòngiu de sos privilègios de root</string>
<string name="show_anti_feature_apps">Inclue sas aplicatziones cun anti-funtzionalidades</string>
<string name="show_anti_feature_apps_on">Ammustra sas aplicatziones chi tenent bisòngiu de anti-funtzionalidades</string>
<string name="force_touch_apps">Inclue sas aplicatziones chi impreant s\'ischermu tàtile</string>

View File

@ -232,8 +232,6 @@
<string name="expert_on">Pokaži dodatne informacije in omogoči dodatne nastavitve</string>
<string name="show_incompat_versions_on">Pokaži verzije aplikacij, ki so nekompatibilne z napravo</string>
<string name="show_root_apps">Vključi root aplikacije</string>
<string name="show_root_apps_on">Prikaži aplikacije, ki zahtevajo root dostop</string>
<string name="show_anti_feature_apps">Vključi aplikcije z proti-lastnostmi</string>
<string name="force_touch_apps">Vključi aplikacije, ki potrebujejo zaslone na dotik</string>
<string name="local_repo">Lokalni vir aplikacij</string>

View File

@ -243,8 +243,6 @@
<string name="appcompatibility">Përshtatja e Aplikacioneve</string>
<string name="show_incompat_versions">Përfshije verzione jo përshtatshme</string>
<string name="show_incompat_versions_on">Shfaqe verzione të aplikacioneve që janë nuk përshtaten me pajisjen tuaj</string>
<string name="show_root_apps">Përfshije aplikacionet rrënjë</string>
<string name="show_root_apps_on">Shfaqe aplikacionet që kërkojnë privilegjet rrënjë</string>
<string name="show_anti_feature_apps">Përfshije aplikacionet kundër-veçori</string>
<string name="show_anti_feature_apps_on">Shfaqe aplikacione që kërkojnë kundër-veçori</string>
<string name="force_touch_apps">Përfshije aplikacionet me gjurmë gishtore</string>

View File

@ -518,8 +518,6 @@
<string name="antidisabledalgorithmlist">Denna app har en svag säkerhetssignatur</string>
<string name="antiknownvulnlist">Denna app innehåller en känd säkerhetsårbarhet</string>
<string name="show_root_apps">Inkludera root-appar</string>
<string name="show_root_apps_on">Visa appar som kräver root-privilegier</string>
<string name="show_anti_feature_apps">Inkludera mot-funktionsappar</string>
<string name="show_anti_feature_apps_on">Vis appar som kräver mot-funktioner</string>
<string name="force_touch_apps">Inkludera pekskärmsappar</string>

View File

@ -202,8 +202,6 @@
<string name="appcompatibility">అనువర్తన అనుకూలత</string>
<string name="show_incompat_versions">సరిపడలేని వెర్షన్లను చేర్చండి</string>
<string name="show_root_apps">రూట్ అనువర్తనాలను చేర్చండి</string>
<string name="show_root_apps_on">రూట్ అధికారాలు అవసరమయ్యే అనువర్తనాలను చూపించు</string>
<string name="force_touch_apps">టచ్స్క్రీన్ అనువర్తనాలను చేర్చండి</string>
<string name="local_repo">స్థానిక రెపో</string>
<string name="local_repo_running">F- Droid మారడానికి సిద్ధంగా ఉంది</string>

View File

@ -521,8 +521,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Kameranızın kendiliğinden odaklanması yok gibi görünüyor. Kodu taramak zor olabilir.</string>
<string name="show_root_apps">Kök uygulamalarını içer</string>
<string name="show_root_apps_on">Kök yetkileri gerektiren uygulamaları göster</string>
<string name="show_anti_feature_apps">Karşıt-özellikli uygulamaları içer</string>
<string name="show_anti_feature_apps_on">Karşıt-özellikler gerektiren uygulamaları göster</string>
<string name="force_touch_apps">Dokunmatik ekran uygulamalarını içer</string>

View File

@ -215,7 +215,6 @@
<string name="antifeatures">ئىقتىدار-قارشى</string>
<string name="expert_on">قوشۇمچە ئۇچۇرلانى كۆرسەت ۋە قوشۇمچە تەڭشەكلەرنى قوزغات</string>
<string name="show_root_apps_on">يىلتىز ھۇقۇقىنى تەلەپ قىلىدىغان ئۇيغۇلىمىلارنى كۆرسەت</string>
<string name="show_anti_feature_apps">ئىقتىدار-چەكلەش ئۇيغۇلىمىلىرىنى ئۆز ئىچىگە ئالىدۇ</string>
<string name="local_repo">يەرلىك ئامبار</string>
<string name="deleting_repo">ھازىرقى ئامبار ئۆچۈرۈلىۋاتىدۇ…</string>

View File

@ -541,8 +541,6 @@
<string name="repo_exists_enable">%1$s вже налаштовано, підтвердьте, що бажаєте наново увімкнути.</string>
<string name="repo_exists_and_enabled">%1$s вже налаштовано і увімкнуто.</string>
<string name="repo_delete_to_overwrite">Спершу видаліть %1$s, аби додати його з конфліктним ключем.</string>
<string name="show_root_apps">Увімкнути root додатки</string>
<string name="show_root_apps_on">Показати додатки, які потребують root привілеїв</string>
<string name="share_repository">Поділитися репозиторієм</string>
<string name="use_bluetooth">Використовувати Bluetooth</string>
<string name="swap_toast_hotspot_enabled">Точку доступу Wi-Fi увімкнуто</string>

View File

@ -493,8 +493,6 @@
<string name="antidisabledalgorithmlist">Ứng dụng này có chữ kí bảo mật yếu</string>
<string name="antiknownvulnlist">Ứng dụng này có lỗ hổng bảo mật đã bị phát hiện</string>
<string name="show_root_apps">Hiện ứng dụng root</string>
<string name="show_root_apps_on">Hiện các ứng dụng cần quyền root</string>
<string name="show_anti_feature_apps">Hiện ứng dụng có tính năng không mong muốn</string>
<string name="show_anti_feature_apps_on">Hiện các ứng dụng có một số tính năng không mong muốn</string>
<string name="force_touch_apps">Hiện ứng dụng cảm ứng</string>

View File

@ -478,8 +478,6 @@
<string name="hide_on_long_search_press_summary">长按搜索按钮将隐藏此应用</string>
<string name="warning_scaning_qr_code">您的相机似乎没有自动对焦。扫描二维码可能较为困难。</string>
<string name="show_root_apps">包括需 root 的应用</string>
<string name="show_root_apps_on">显示需要 root 权限的应用程序</string>
<string name="show_anti_feature_apps">包括带有 anti-feature 的应用</string>
<string name="show_anti_feature_apps_on">显示需要 anti-feature 的应用程序</string>
<string name="repo_add_mirror">添加镜像</string>

View File

@ -500,8 +500,6 @@
<string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">您的相機似乎沒有自動對焦。掃描代碼可能會很困難。</string>
<string name="show_root_apps">包括 root 應用程式</string>
<string name="show_root_apps_on">顯示需要 root 授權的應用程式</string>
<string name="show_anti_feature_apps">包括反特徵應用程式</string>
<string name="show_anti_feature_apps_on">顯示需要反特徵的應用程式</string>
<string name="force_touch_apps">包括觸控式螢幕的應用程式</string>

View File

@ -236,8 +236,6 @@ This often occurs with apps installed via Google Play or other sources, if they
<string name="appcompatibility">App compatibility</string>
<string name="show_incompat_versions">Include incompatible versions</string>
<string name="show_incompat_versions_on">Show app versions that are incompatible with the device</string>
<string name="show_root_apps">Include root apps</string>
<string name="show_root_apps_on">Show apps that require root privileges</string>
<string name="show_anti_feature_apps">Include anti-feature apps</string>
<string name="show_anti_feature_apps_on">Show apps that require anti-features</string>
<string name="force_touch_apps">Include touchscreen apps</string>

View File

@ -76,15 +76,12 @@
android:entryValues="@array/themeValues"/>
</android.support.v7.preference.PreferenceCategory>
<android.support.v7.preference.PreferenceCategory android:title="@string/appcompatibility">
<android.support.v7.preference.PreferenceCategory android:title="@string/appcompatibility"
android:key="pref_category_appcompatibility">
<SwitchPreference
android:title="@string/show_incompat_versions"
android:defaultValue="false"
android:key="incompatibleVersions"/>
<SwitchPreference
android:title="@string/show_root_apps"
android:defaultValue="true"
android:key="rooted"/>
<SwitchPreference
android:title="@string/show_anti_feature_apps"
android:defaultValue="false"

View File

@ -118,8 +118,6 @@ public class PreferencesTest {
preferences.showAppsWithAntiFeatures());
assertEquals(defaults.getBoolean(Preferences.PREF_SHOW_INCOMPAT_VERSIONS, false),
preferences.showIncompatibleVersions());
assertEquals(defaults.getBoolean(Preferences.PREF_SHOW_ROOT_APPS, false),
preferences.showAppsRequiringRoot());
assertEquals(defaults.getBoolean(Preferences.PREF_UPDATE_NOTIFICATION_ENABLED, false),
preferences.isUpdateNotificationEnabled());

View File

@ -101,6 +101,10 @@ public class AppDetailsAdapterTest extends FDroidProviderTest {
}
private final AppDetailsRecyclerViewAdapter.AppDetailsRecyclerViewAdapterCallbacks dummyCallbacks = new AppDetailsRecyclerViewAdapter.AppDetailsRecyclerViewAdapterCallbacks() { // NOCHECKSTYLE LineLength
@Override
public boolean isAppDownloading() {
return false;
}
@Override
public void enableAndroidBeam() {