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:
		
						commit
						6c6e3ad82d
					
				| @ -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' | ||||||
|  | |||||||
| @ -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" | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| @ -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. | ||||||
|  | |||||||
| @ -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(); | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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) { | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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,12 +157,19 @@ 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); | ||||||
|  |         if (pref != null) { | ||||||
|             pref.setSummary(resId); |             pref.setSummary(resId); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     private void entrySummary(String key) { |     private void entrySummary(String key) { | ||||||
|         ListPreference pref = (ListPreference) findPreference(key); |         ListPreference pref = (ListPreference) findPreference(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; | ||||||
|  | |||||||
| @ -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; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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 n’a 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 n’a 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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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" | ||||||
|  | |||||||
| @ -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()); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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() { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Hans-Christoph Steiner
						Hans-Christoph Steiner