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.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.google.zxing:core:3.3.2' 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.netcipher:netcipher:2.0.0-alpha1'
implementation 'info.guardianproject.panic:panic:0.5' implementation 'info.guardianproject.panic:panic:0.5'
implementation 'commons-io:commons-io:2.5' implementation 'commons-io:commons-io:2.5'

View File

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

View File

@ -109,7 +109,8 @@ public class AppDetails2 extends AppCompatActivity
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
supportPostponeEnterTransition(); supportPostponeEnterTransition();
if (!reset(getPackageNameFromIntent(getIntent()))) { resetCurrentApp(getPackageNameFromIntent(getIntent()));
if (app == null) {
finish(); finish();
return; return;
} }
@ -187,27 +188,6 @@ public class AppDetails2 extends AppCompatActivity
return intent.getStringExtra(EXTRA_APPID); 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 * Some notifications (like "downloading" and "installed") are not shown
* for this app if it is open in app details. When closing, we need to * 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 * Reset the display and list contents. Used when entering the activity, and
* also when something has been installed/uninstalled. * also when something has been installed/uninstalled. An index update or
* Return true if the app was found, false otherwise. * 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) { private void resetCurrentApp(String packageName) {
if (TextUtils.isEmpty(packageName)) {
Utils.debugLog(TAG, "Getting application details for " + packageName); return;
App newApp = null;
if (!TextUtils.isEmpty(packageName)) {
newApp = AppProvider.Helper.findHighestPriorityMetadata(getContentResolver(), packageName);
} }
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() { private void onAppChanged() {
recyclerView.post(new Runnable() { recyclerView.post(new Runnable() {
@Override @Override
public void run() { public void run() {
if (!reset(app.packageName)) { resetCurrentApp(app.packageName);
if (app == null) {
AppDetails2.this.finish(); AppDetails2.this.finish();
return; 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 @Override
public void enableAndroidBeam() { public void enableAndroidBeam() {
NfcHelper.setAndroidBeam(this, app.packageName); 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); 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, // 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, // it is easier to just notify a change in the app provider,
// so that the newly updated list will correctly filter relevant apps. // 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_UPDATE_NOTIFICATION_ENABLED = "updateNotify";
public static final String PREF_THEME = "theme"; public static final String PREF_THEME = "theme";
public static final String PREF_SHOW_INCOMPAT_VERSIONS = "incompatibleVersions"; 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_SHOW_ANTI_FEATURE_APPS = "showAntiFeatureApps";
public static final String PREF_FORCE_TOUCH_APPS = "ignoreTouchscreen"; public static final String PREF_FORCE_TOUCH_APPS = "ignoreTouchscreen";
public static final String PREF_PROMPT_TO_SEND_CRASH_REPORTS = "promptToSendCrashReports"; 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, DateUtils.HOUR_IN_MILLIS,
}; };
private boolean showAppsRequiringRoot;
private boolean showAppsWithAntiFeatures; private boolean showAppsWithAntiFeatures;
private final Map<String, Boolean> initialized = new HashMap<>(); 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> showAppsRequiringAntiFeaturesListeners = 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<>();
@ -527,20 +524,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
return preferences.getBoolean(PREF_ALLOW_PUSH_REQUESTS, IGNORED_B); 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. * 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 * 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; return showAppsWithAntiFeatures;
} }
public void registerAppsRequiringRootChangeListener(ChangeListener listener) {
showAppsRequiringRootListeners.add(listener);
}
public void unregisterAppsRequiringRootChangeListener(ChangeListener listener) {
showAppsRequiringRootListeners.remove(listener);
}
public void registerAppsRequiringAntiFeaturesChangeListener(ChangeListener listener) { public void registerAppsRequiringAntiFeaturesChangeListener(ChangeListener listener) {
showAppsRequiringAntiFeaturesListeners.add(listener); showAppsRequiringAntiFeaturesListeners.add(listener);
} }
@ -590,11 +565,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
uninitialize(key); uninitialize(key);
switch (key) { switch (key) {
case PREF_SHOW_ROOT_APPS:
for (ChangeListener listener : showAppsRequiringRootListeners) {
listener.onPreferenceChange();
}
break;
case PREF_SHOW_ANTI_FEATURE_APPS: case PREF_SHOW_ANTI_FEATURE_APPS:
for (ChangeListener listener : showAppsRequiringAntiFeaturesListeners) { for (ChangeListener listener : showAppsRequiringAntiFeaturesListeners) {
listener.onPreferenceChange(); 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.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.io.filefilter.RegexFileFilter; import org.apache.commons.io.filefilter.RegexFileFilter;
import org.fdroid.fdroid.AppFilter;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
@ -1008,15 +1007,17 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
boolean canUpdate = hasUpdates(); boolean canUpdate = hasUpdates();
AppPrefs prefs = getPrefs(context); AppPrefs prefs = getPrefs(context);
boolean wantsUpdate = !prefs.ignoreAllUpdates && prefs.ignoreThisUpdate < suggestedVersionCode; 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 * @return if the given app should be filtered out based on the
* permission (set in the Settings page) * {@link Preferences#PREF_SHOW_ANTI_FEATURE_APPS Show Anti-Features Setting}
*/ */
public boolean isFiltered() { public boolean isDisabledByAntiFeatures() {
return new AppFilter().filter(this); return this.antiFeatures != null
&& this.antiFeatures.length > 0
&& !Preferences.get().showAppsWithAntiFeatures();
} }
@Nullable @Nullable

View File

@ -12,6 +12,7 @@ import android.support.annotation.Nullable;
import android.support.v4.app.JobIntentService; import android.support.v4.app.JobIntentService;
import android.util.Log; import android.util.Log;
import org.acra.ACRA; import org.acra.ACRA;
import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Schema.InstalledAppTable; import org.fdroid.fdroid.data.Schema.InstalledAppTable;
import rx.functions.Action1; 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 * 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} * from {@link android.content.BroadcastReceiver}s for {@link Intent#ACTION_PACKAGE_ADDED}
* and {@link Intent#ACTION_PACKAGE_REMOVED} * and {@link Intent#ACTION_PACKAGE_REMOVED}
* <p/> * <p>
* Since {@link android.content.ContentProvider#insert(Uri, ContentValues)} does not check * 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 * 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, * inserting duplicate versions of the same installed APK. On that note,
* {@link #insertAppIntoDb(Context, PackageInfo, String, String)} and * {@link #insertAppIntoDb(Context, PackageInfo, String, String)} and
* {@link #deleteAppFromDb(Context, String)} are both static methods to enable easy testing * {@link #deleteAppFromDb(Context, String)} are both static methods to enable easy testing
* of this stuff. * 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") @SuppressWarnings("LineLength")
public class InstalledAppProviderService extends JobIntentService { public class InstalledAppProviderService extends JobIntentService {
@ -221,11 +230,15 @@ public class InstalledAppProviderService extends JobIntentService {
protected void onHandleWork(@NonNull Intent intent) { protected void onHandleWork(@NonNull Intent intent) {
Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
AppUpdateStatusManager ausm = AppUpdateStatusManager.getInstance(this);
String packageName = intent.getData().getSchemeSpecificPart(); String packageName = intent.getData().getSchemeSpecificPart();
final String action = intent.getAction(); final String action = intent.getAction();
if (ACTION_INSERT.equals(action)) { if (ACTION_INSERT.equals(action)) {
PackageInfo packageInfo = getPackageInfo(intent, packageName); PackageInfo packageInfo = getPackageInfo(intent, packageName);
if (packageInfo != null) { if (packageInfo != null) {
for (AppUpdateStatusManager.AppUpdateStatus status : ausm.getByPackageName(packageName)) {
ausm.updateApk(status.getUniqueKey(), AppUpdateStatusManager.Status.Installed, null);
}
File apk = getPathToInstalledApk(packageInfo); File apk = getPathToInstalledApk(packageInfo);
if (apk == null) { if (apk == null) {
return; return;
@ -244,6 +257,9 @@ public class InstalledAppProviderService extends JobIntentService {
} }
} else if (ACTION_DELETE.equals(action)) { } else if (ACTION_DELETE.equals(action)) {
deleteAppFromDb(this, packageName); deleteAppFromDb(this, packageName);
for (AppUpdateStatusManager.AppUpdateStatus status : ausm.getByPackageName(packageName)) {
ausm.updateApk(status.getUniqueKey(), AppUpdateStatusManager.Status.InstallError, null);
}
} }
packageChangeNotifier.onNext(packageName); packageChangeNotifier.onNext(packageName);
} }

View File

@ -6,7 +6,6 @@ import android.app.Service;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.net.Uri; import android.net.Uri;
@ -52,6 +51,8 @@ import java.io.IOException;
* {@code {@link #stopSelf(int)}}, so {@code Intent}s are sometimes redelivered even * {@code {@link #stopSelf(int)}}, so {@code Intent}s are sometimes redelivered even
* though they are no longer valid. {@link #onStartCommand(Intent, int, int)} checks * 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}. * 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> * <p>
* The canonical URL for the APK file to download is also used as the unique ID to * 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 * represent the download itself throughout F-Droid. This follows the model
@ -95,7 +96,6 @@ public class InstallManagerService extends Service {
private LocalBroadcastManager localBroadcastManager; private LocalBroadcastManager localBroadcastManager;
private AppUpdateStatusManager appUpdateStatusManager; private AppUpdateStatusManager appUpdateStatusManager;
private BroadcastReceiver broadcastReceiver;
private boolean running = false; private boolean running = false;
/** /**
@ -111,21 +111,6 @@ public class InstallManagerService extends Service {
super.onCreate(); super.onCreate();
localBroadcastManager = LocalBroadcastManager.getInstance(this); localBroadcastManager = LocalBroadcastManager.getInstance(this);
appUpdateStatusManager = AppUpdateStatusManager.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; running = true;
pendingInstalls = getPendingInstalls(this); pendingInstalls = getPendingInstalls(this);
} }
@ -140,7 +125,6 @@ public class InstallManagerService extends Service {
@Override @Override
public void onDestroy() { public void onDestroy() {
running = false; running = false;
unregisterReceiver(broadcastReceiver);
super.onDestroy(); super.onDestroy();
} }
@ -489,25 +473,12 @@ public class InstallManagerService extends Service {
return pendingInstalls.contains(urlString); 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 * Mark a given APK as in the process of being installed, with
* the {@code urlString} of the download used as the unique ID, * the {@code urlString} of the download used as the unique ID,
* and the file hash used to verify that things are the same. * and the file hash used to verify that things are the same.
* *
* @see #isPendingInstall(String) * @see #isPendingInstall(String)
* @see #isPendingInstall(Context, String)
*/ */
public static void putPendingInstall(Context context, String urlString, String packageName) { public static void putPendingInstall(Context context, String urlString, String packageName) {
if (pendingInstalls == null) { 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.App;
import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.RepoProvider; 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.AppDiff;
import org.fdroid.fdroid.privileged.views.AppSecurityPermissions; import org.fdroid.fdroid.privileged.views.AppSecurityPermissions;
import org.fdroid.fdroid.views.main.MainActivity; import org.fdroid.fdroid.views.main.MainActivity;
@ -58,6 +57,8 @@ public class AppDetailsRecyclerViewAdapter
public interface AppDetailsRecyclerViewAdapterCallbacks { public interface AppDetailsRecyclerViewAdapterCallbacks {
boolean isAppDownloading();
void enableAndroidBeam(); void enableAndroidBeam();
void disableAndroidBeam(); void disableAndroidBeam();
@ -487,7 +488,7 @@ public class AppDetailsRecyclerViewAdapter
buttonSecondaryView.setOnClickListener(onUnInstallClickListener); buttonSecondaryView.setOnClickListener(onUnInstallClickListener);
buttonPrimaryView.setText(R.string.menu_install); buttonPrimaryView.setText(R.string.menu_install);
buttonPrimaryView.setVisibility(versions.size() > 0 ? View.VISIBLE : View.GONE); buttonPrimaryView.setVisibility(versions.size() > 0 ? View.VISIBLE : View.GONE);
if (InstallManagerService.isPendingInstall(context, app.packageName)) { if (callbacks.isAppDownloading()) {
buttonPrimaryView.setText(R.string.downloading); buttonPrimaryView.setText(R.string.downloading);
buttonPrimaryView.setEnabled(false); buttonPrimaryView.setEnabled(false);
buttonLayout.setVisibility(View.GONE); buttonLayout.setVisibility(View.GONE);

View File

@ -108,7 +108,12 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
installButton = (ImageView) itemView.findViewById(R.id.install); installButton = (ImageView) itemView.findViewById(R.id.install);
if (installButton != null) { 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) { if (Build.VERSION.SDK_INT >= 21) {
installButton.setOutlineProvider(new ViewOutlineProvider() { installButton.setOutlineProvider(new ViewOutlineProvider() {
@ -140,7 +145,14 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
secondaryButton = (Button) itemView.findViewById(R.id.secondary_button); secondaryButton = (Button) itemView.findViewById(R.id.secondary_button);
if (actionButton != null) { 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) { 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") @SuppressWarnings("FieldCanBeLocal")
private final View.OnClickListener onSecondaryButtonClicked = new View.OnClickListener() { private final View.OnClickListener onSecondaryButtonClicked = new View.OnClickListener() {
@Override @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. // When the button says "Run", then launch the app.
if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.Installed) { if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.Installed) {
Intent intent = activity.getPackageManager().getLaunchIntentForPackage(app.packageName); 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() + Utils.debugLog(TAG, "skip download, we have already downloaded " + currentStatus.apk.getUrl() +
" to " + apkFilePath); " 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 LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(activity);
final BroadcastReceiver receiver = new BroadcastReceiver() { final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override @Override

View File

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

View File

@ -28,6 +28,7 @@ package org.fdroid.fdroid.views.fragments;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.v14.preference.PreferenceFragment; import android.support.v14.preference.PreferenceFragment;
@ -65,7 +66,6 @@ public class PreferencesFragment extends PreferenceFragment
Preferences.PREF_OVER_DATA, Preferences.PREF_OVER_DATA,
Preferences.PREF_UPDATE_INTERVAL, Preferences.PREF_UPDATE_INTERVAL,
Preferences.PREF_UPDATE_NOTIFICATION_ENABLED, Preferences.PREF_UPDATE_NOTIFICATION_ENABLED,
Preferences.PREF_SHOW_ROOT_APPS,
Preferences.PREF_SHOW_ANTI_FEATURE_APPS, Preferences.PREF_SHOW_ANTI_FEATURE_APPS,
Preferences.PREF_SHOW_INCOMPAT_VERSIONS, Preferences.PREF_SHOW_INCOMPAT_VERSIONS,
Preferences.PREF_THEME, Preferences.PREF_THEME,
@ -157,11 +157,18 @@ public class PreferencesFragment extends PreferenceFragment
languagePref.setEntries(languages.getAllNames()); languagePref.setEntries(languages.getAllNames());
languagePref.setEntryValues(languages.getSupportedLocales()); 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) { private void checkSummary(String key, int resId) {
Preference pref = findPreference(key); Preference pref = findPreference(key);
pref.setSummary(resId); if (pref != null) {
pref.setSummary(resId);
}
} }
private void entrySummary(String key) { private void entrySummary(String key) {
@ -249,10 +256,6 @@ public class PreferencesFragment extends PreferenceFragment
checkSummary(key, R.string.show_incompat_versions_on); checkSummary(key, R.string.show_incompat_versions_on);
break; break;
case Preferences.PREF_SHOW_ROOT_APPS:
checkSummary(key, R.string.show_root_apps_on);
break;
case Preferences.PREF_SHOW_ANTI_FEATURE_APPS: case Preferences.PREF_SHOW_ANTI_FEATURE_APPS:
checkSummary(key, R.string.show_anti_feature_apps_on); checkSummary(key, R.string.show_anti_feature_apps_on);
break; 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. * {@link org.fdroid.fdroid.AppUpdateStatusManager.Status#UpdateAvailable} are not interesting here.
*/ */
private boolean shouldShowStatus(AppUpdateStatusManager.AppUpdateStatus status) { 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.Installed ||
status.status == AppUpdateStatusManager.Status.ReadyToInstall; 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; private UpdateableAppsHeader header;
@ -81,8 +81,22 @@ public class UpdateableAppsHeader extends AppUpdateData {
appsToUpdate = (TextView) itemView.findViewById(R.id.text_apps_to_update); appsToUpdate = (TextView) itemView.findViewById(R.id.text_apps_to_update);
toggleAppsToUpdate = (Button) itemView.findViewById(R.id.button_toggle_apps_to_update); toggleAppsToUpdate = (Button) itemView.findViewById(R.id.button_toggle_apps_to_update);
toggleAppsToUpdate.setOnClickListener(this); toggleAppsToUpdate.setOnClickListener(new View.OnClickListener() {
downloadAll.setOnClickListener(this); @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) { public void bindHeader(UpdateableAppsHeader header) {
@ -101,16 +115,6 @@ public class UpdateableAppsHeader extends AppUpdateData {
updateToggleButtonText(); 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() { private void updateToggleButtonText() {
if (header.adapter.canViewAllUpdateableApps()) { if (header.adapter.canViewAllUpdateableApps()) {
toggleAppsToUpdate.setText(R.string.updates__hide_updateable_apps); toggleAppsToUpdate.setText(R.string.updates__hide_updateable_apps);

View File

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

View File

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

View File

@ -499,7 +499,6 @@
<string name="menu_liberapay">Liberapay</string> <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_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> <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="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="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">Inclou aplicacions amb característiques indesitjades</string>
<string name="show_anti_feature_apps_on">Mostra aplicacions que requereixen 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> <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="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="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">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="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> <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="antidisabledalgorithmlist">Denne app har en svag sikkerhedssignatur</string>
<string name="antiknownvulnlist">Denne app indeholder en kendt sårbarhed</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> </resources>

View File

@ -522,8 +522,6 @@
<string name="panic_hide_warning_title">Wiederherstellungsmethode merken</string> <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="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_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_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> <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="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">Via fotilo ne havas memfokuson. Povas esti malfacile skani la kodon.</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">Inkluzivi aplikaĵojn kun fiebloj</string>
<string name="show_anti_feature_apps_on">Montri aplikaĵojn, kiuj enhavas nedeziratajn eblojn</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> <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_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_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="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">Incluir aplicaciones controvertidas</string>
<string name="show_anti_feature_apps_on">Listar aplicaciones que requieren características 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> <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="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="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">Sartu ezaugarri zalantzagarriak dituzten aplikazioak</string>
<string name="show_anti_feature_apps_on">Erakutsi ezaugarri zalantzagarriak behar 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> <string name="force_touch_apps">Sartu ukimen pantaila darabilten aplikazioak</string>

View File

@ -517,8 +517,6 @@
<string name="antidisabledalgorithmlist">این کاره یک امضای امنیتی ضعیف دارد</string> <string name="antidisabledalgorithmlist">این کاره یک امضای امنیتی ضعیف دارد</string>
<string name="antiknownvulnlist">این کاره یک آسیب‌پذیری امنیتی شناخته‌شده دارد</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">شامل کاره‌های ضدویژگی‌دار</string>
<string name="show_anti_feature_apps_on">نمایش کاره‌هایی که نیاز به ضدویژگی دارند</string> <string name="show_anti_feature_apps_on">نمایش کاره‌هایی که نیاز به ضدویژگی دارند</string>
<string name="force_touch_apps">شامل کاره‌های لمسی</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="antidisabledalgorithmlist">Tällä sovelluksella on heikko turvallisuusallekirjoitus</string>
<string name="antiknownvulnlist">Tämä sovellus sisältää tunnetun haavoittuvuuden</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">Sisällytä anti-ominaisuus -sovellukset</string>
<string name="show_anti_feature_apps_on">Näytä sovellukset, jotka vaativat anti-ominaisuuksia</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> <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="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="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_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_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> <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="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="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">Incluir aplicativos con anti-funcionalidades</string>
<string name="show_anti_feature_apps_on">Amosar aplicativos que requiren de 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> <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="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">כנראה שלמצלמה שלך אין מיקוד אוטומטי. סריקת הקוד עשויה להוות מכשול.</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">לכלול יישומונים שמכילים תכונות שליליות</string>
<string name="show_anti_feature_apps_on">הצגת יישומונים שדורשים תכונות שליליות</string> <string name="show_anti_feature_apps_on">הצגת יישומונים שדורשים תכונות שליליות</string>
<string name="force_touch_apps">לכלול יישומוני מסך מגע</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="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="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="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_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> <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="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="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">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="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> <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="repo_exists_add_mirror">Ini adalah salinan dari %1$s, tambahkan sebagai mirror?</string>
<string name="menu_liberapay">Liberapay</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">Termasuk apl anti-fitur</string>
<string name="show_anti_feature_apps_on">Tampilkan apl yg butuh 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> <string name="force_touch_apps">Termasuk apl layar sentuh</string>

View File

@ -561,8 +561,6 @@
<string name="menu_liberapay">Liberapay</string> <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="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">Hafa með forrit með ókostum</string>
<string name="show_anti_feature_apps_on">Birta forrit með óæskilegum eiginleikum</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> <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="repo_exists_add_mirror">Questa è una copia di %1$s, aggiungerla come mirror?</string>
<string name="menu_liberapay">Liberapay</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">Includi app con anti-caratteristiche</string>
<string name="show_anti_feature_apps_on">Mostra app che richiedono 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> <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_exists_and_enabled">%1$sはすでに設定済みで有効です。</string>
<string name="repo_delete_to_overwrite">競合する鍵でこのリポジトリを追加するためには、先に%1$sを削除してください。</string> <string name="repo_delete_to_overwrite">競合する鍵でこのリポジトリを追加するためには、先に%1$sを削除してください。</string>
<string name="repo_exists_add_mirror">これは%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">好ましくない機能の使用が必要なアプリ</string>
<string name="show_anti_feature_apps_on">好ましくない機能の使用を必要とするアプリを表示します</string> <string name="show_anti_feature_apps_on">好ましくない機能の使用を必要とするアプリを表示します</string>
<string name="force_touch_apps">タッチスクリーンの使用が必要なアプリ</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_exists_and_enabled">%1$s은(는) 이미 설정되어 있으며, 활성화됩니다.</string>
<string name="repo_delete_to_overwrite">이것과 충돌하는 키를 추가하려면 먼저 %1$s을(를) 삭제합니다.</string> <string name="repo_delete_to_overwrite">이것과 충돌하는 키를 추가하려면 먼저 %1$s을(를) 삭제합니다.</string>
<string name="repo_exists_add_mirror">이것은 %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">안티 기능 앱을 포함</string>
<string name="show_anti_feature_apps_on">안티 기능이 필요한 앱을 보여주기</string> <string name="show_anti_feature_apps_on">안티 기능이 필요한 앱을 보여주기</string>
<string name="force_touch_apps">터치스크린 앱을 포함</string> <string name="force_touch_apps">터치스크린 앱을 포함</string>

View File

@ -528,8 +528,6 @@
<string name="menu_liberapay">Liberapay</string> <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="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">Inkluder antifunksjons-programmer</string>
<string name="show_anti_feature_apps_on">Vis programmer som krever anti-funksjoner</string> <string name="show_anti_feature_apps_on">Vis programmer som krever anti-funksjoner</string>
<string name="force_touch_apps">Inkluder pekeskjermsprogrammer</string> <string name="force_touch_apps">Inkluder pekeskjermsprogrammer</string>

View File

@ -238,8 +238,6 @@
<string name="appcompatibility">Compatibiliteit van app</string> <string name="appcompatibility">Compatibiliteit van app</string>
<string name="show_incompat_versions">Incompatibele versies tonen</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_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">Apps met antifuncties tonen</string>
<string name="show_anti_feature_apps_on">Toont apps die antifuncties bevatten</string> <string name="show_anti_feature_apps_on">Toont apps die antifuncties bevatten</string>
<string name="force_touch_apps">Aanraakschermapps tonen</string> <string name="force_touch_apps">Aanraakschermapps tonen</string>

View File

@ -508,8 +508,6 @@
<string name="menu_liberapay">Liberapay</string> <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="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">Apps met antifuncties tonen</string>
<string name="show_anti_feature_apps_on">Toon apps die antifuncties bevatten</string> <string name="show_anti_feature_apps_on">Toon apps die antifuncties bevatten</string>
<string name="force_touch_apps">Aanraakschermapps tonen</string> <string name="force_touch_apps">Aanraakschermapps tonen</string>

View File

@ -538,8 +538,6 @@
<string name="menu_liberapay">Liberapay</string> <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="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">Uwzględnij (trochę) niefajne aplikacje</string>
<string name="show_anti_feature_apps_on">Pokaż aplikacje zawierające niepożądane funkcje</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> <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="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_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="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="show_anti_feature_apps">Incluir aplicativos antifraude</string>
<string name="force_touch_apps">Incluir aplicativos touchscreen</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> <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="repo_exists_add_mirror">Esta é uma cópia de %1$s, deseja adicionar como \'mirror\'?</string>
<string name="menu_liberapay">Liberapay</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">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="show_anti_feature_apps_on">Mostrar aplicações que necessitem de anti-funcionalidades</string>
<string name="force_touch_apps">Incluir aplicações \'touchscreen\'</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="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="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">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="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> <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="hide_on_long_search_press_summary">Длительное нажатие кнопки поиска скроет приложение</string>
<string name="warning_scaning_qr_code">Ваша камера не поддерживает автофокус. Сканирование кода может быть затруднено.</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_add_mirror">Добавить зеркало</string>
<string name="repo_exists_add_mirror">Это копия %1$s, добавить ее как зеркало?</string> <string name="repo_exists_add_mirror">Это копия %1$s, добавить ее как зеркало?</string>
<string name="show_anti_feature_apps">Включить приложения с сомнительным функционалом</string> <string name="show_anti_feature_apps">Включить приложения с сомнительным функционалом</string>

View File

@ -546,8 +546,6 @@
<string name="menu_liberapay">Liberapay</string> <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="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">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="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> <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="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_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="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="force_touch_apps">Vključi aplikacije, ki potrebujejo zaslone na dotik</string>
<string name="local_repo">Lokalni vir aplikacij</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="appcompatibility">Përshtatja e Aplikacioneve</string>
<string name="show_incompat_versions">Përfshije verzione jo përshtatshme</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_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">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="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> <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="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="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">Inkludera mot-funktionsappar</string>
<string name="show_anti_feature_apps_on">Vis appar som kräver mot-funktioner</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> <string name="force_touch_apps">Inkludera pekskärmsappar</string>

View File

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

View File

@ -521,8 +521,6 @@
<string name="menu_liberapay">Liberapay</string> <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="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">Karşıt-özellikli uygulamaları içer</string>
<string name="show_anti_feature_apps_on">Karşıt-özellikler gerektiren uygulamaları göster</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> <string name="force_touch_apps">Dokunmatik ekran uygulamalarını içer</string>

View File

@ -215,7 +215,6 @@
<string name="antifeatures">ئىقتىدار-قارشى</string> <string name="antifeatures">ئىقتىدار-قارشى</string>
<string name="expert_on">قوشۇمچە ئۇچۇرلانى كۆرسەت ۋە قوشۇمچە تەڭشەكلەرنى قوزغات</string> <string name="expert_on">قوشۇمچە ئۇچۇرلانى كۆرسەت ۋە قوشۇمچە تەڭشەكلەرنى قوزغات</string>
<string name="show_root_apps_on">يىلتىز ھۇقۇقىنى تەلەپ قىلىدىغان ئۇيغۇلىمىلارنى كۆرسەت</string>
<string name="show_anti_feature_apps">ئىقتىدار-چەكلەش ئۇيغۇلىمىلىرىنى ئۆز ئىچىگە ئالىدۇ</string> <string name="show_anti_feature_apps">ئىقتىدار-چەكلەش ئۇيغۇلىمىلىرىنى ئۆز ئىچىگە ئالىدۇ</string>
<string name="local_repo">يەرلىك ئامبار</string> <string name="local_repo">يەرلىك ئامبار</string>
<string name="deleting_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_enable">%1$s вже налаштовано, підтвердьте, що бажаєте наново увімкнути.</string>
<string name="repo_exists_and_enabled">%1$s вже налаштовано і увімкнуто.</string> <string name="repo_exists_and_enabled">%1$s вже налаштовано і увімкнуто.</string>
<string name="repo_delete_to_overwrite">Спершу видаліть %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="share_repository">Поділитися репозиторієм</string>
<string name="use_bluetooth">Використовувати Bluetooth</string> <string name="use_bluetooth">Використовувати Bluetooth</string>
<string name="swap_toast_hotspot_enabled">Точку доступу Wi-Fi увімкнуто</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="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="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">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="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> <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="hide_on_long_search_press_summary">长按搜索按钮将隐藏此应用</string>
<string name="warning_scaning_qr_code">您的相机似乎没有自动对焦。扫描二维码可能较为困难。</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">包括带有 anti-feature 的应用</string>
<string name="show_anti_feature_apps_on">显示需要 anti-feature 的应用程序</string> <string name="show_anti_feature_apps_on">显示需要 anti-feature 的应用程序</string>
<string name="repo_add_mirror">添加镜像</string> <string name="repo_add_mirror">添加镜像</string>

View File

@ -500,8 +500,6 @@
<string name="menu_liberapay">Liberapay</string> <string name="menu_liberapay">Liberapay</string>
<string name="warning_scaning_qr_code">您的相機似乎沒有自動對焦。掃描代碼可能會很困難。</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">包括反特徵應用程式</string>
<string name="show_anti_feature_apps_on">顯示需要反特徵的應用程式</string> <string name="show_anti_feature_apps_on">顯示需要反特徵的應用程式</string>
<string name="force_touch_apps">包括觸控式螢幕的應用程式</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="appcompatibility">App compatibility</string>
<string name="show_incompat_versions">Include incompatible versions</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_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">Include anti-feature apps</string>
<string name="show_anti_feature_apps_on">Show apps that require anti-features</string> <string name="show_anti_feature_apps_on">Show apps that require anti-features</string>
<string name="force_touch_apps">Include touchscreen apps</string> <string name="force_touch_apps">Include touchscreen apps</string>

View File

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

View File

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

View File

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