diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a9d100ba0..c36cac993 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -126,16 +126,6 @@
android:resource="@xml/install_history_file_provider" />
-
-
-
-
-
-
-
-
-
-
-
- * Copyright (C) 2013 Stefan Völkel, bd@bc-bd.org
- * Copyright (C) 2015 Nico Alt, nicoalt@posteo.org
- *
- * 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 android.app.Activity;
-import android.app.PendingIntent;
-import android.bluetooth.BluetoothAdapter;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.database.ContentObserver;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.ListFragment;
-import android.support.v4.app.NavUtils;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v4.view.MenuItemCompat;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
-import android.text.Html;
-import android.text.Layout;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.text.method.LinkMovementMethod;
-import android.text.style.ClickableSpan;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.nostra13.universalimageloader.core.DisplayImageOptions;
-import com.nostra13.universalimageloader.core.ImageLoader;
-import com.nostra13.universalimageloader.core.assist.ImageScaleType;
-
-import org.fdroid.fdroid.data.Apk;
-import org.fdroid.fdroid.data.ApkProvider;
-import org.fdroid.fdroid.data.App;
-import org.fdroid.fdroid.data.AppPrefs;
-import org.fdroid.fdroid.data.AppPrefsProvider;
-import org.fdroid.fdroid.data.AppProvider;
-import org.fdroid.fdroid.data.InstalledApp;
-import org.fdroid.fdroid.data.InstalledAppProvider;
-import org.fdroid.fdroid.data.RepoProvider;
-import org.fdroid.fdroid.data.Schema;
-import org.fdroid.fdroid.installer.InstallManagerService;
-import org.fdroid.fdroid.installer.Installer;
-import org.fdroid.fdroid.installer.InstallerFactory;
-import org.fdroid.fdroid.installer.InstallerService;
-import org.fdroid.fdroid.net.Downloader;
-import org.fdroid.fdroid.net.DownloaderService;
-import org.fdroid.fdroid.privileged.views.AppDiff;
-import org.fdroid.fdroid.privileged.views.AppSecurityPermissions;
-
-import java.util.List;
-
-public class AppDetails extends AppCompatActivity {
-
- private static final String TAG = "AppDetails";
-
- private static final int REQUEST_ENABLE_BLUETOOTH = 2;
- private static final int REQUEST_PERMISSION_DIALOG = 3;
- private static final int REQUEST_UNINSTALL_DIALOG = 4;
-
- public static final String EXTRA_FROM = "from";
- public static final String EXTRA_HINT_SEARCHING = "searching";
-
- private FDroidApp fdroidApp;
- private ApkListAdapter adapter;
-
- /**
- * Check if {@code packageName} is currently visible to the user.
- */
- public static boolean isAppVisible(String packageName) {
- return packageName != null && packageName.equals(visiblePackageName);
- }
-
- private static String visiblePackageName;
-
- private static class ViewHolder {
- TextView version;
- TextView status;
- TextView repository;
- TextView size;
- TextView api;
- TextView incompatibleReasons;
- TextView buildtype;
- TextView added;
- TextView nativecode;
- }
-
- // observer to update view when package has been installed/deleted
- private AppObserver myAppObserver;
-
- class AppObserver extends ContentObserver {
-
- AppObserver(Handler handler) {
- super(handler);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- onChange(selfChange, null);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- onAppChanged();
- }
-
- }
-
- class ApkListAdapter extends ArrayAdapter {
-
- private final LayoutInflater inflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
-
- ApkListAdapter(Context context, App app) {
- super(context, 0);
- final List apks = ApkProvider.Helper.findByPackageName(context, app.packageName);
- for (final Apk apk : apks) {
- if (apk.compatible || Preferences.get().showIncompatibleVersions()) {
- add(apk);
- }
- }
- }
-
- private String getInstalledStatus(final Apk apk) {
- // Definitely not installed.
- if (apk.versionCode != app.installedVersionCode) {
- return getString(R.string.app_not_installed);
- }
- // Definitely installed this version.
- if (apk.sig != null && apk.sig.equals(app.installedSig)) {
- return getString(R.string.app_installed);
- }
- // Installed the same version, but from someplace else.
- final String installerPkgName;
- try {
- installerPkgName = packageManager.getInstallerPackageName(app.packageName);
- } catch (IllegalArgumentException e) {
- Log.w(TAG, "Application " + app.packageName + " is not installed anymore");
- return getString(R.string.app_not_installed);
- }
- if (TextUtils.isEmpty(installerPkgName)) {
- return getString(R.string.app_inst_unknown_source);
- }
- final String installerLabel = InstalledAppProvider
- .getApplicationLabel(context, installerPkgName);
- return getString(R.string.app_inst_known_source, installerLabel);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
-
- java.text.DateFormat df = DateFormat.getDateFormat(context);
- final Apk apk = getItem(position);
- ViewHolder holder;
-
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.apklistitem, parent, false);
-
- holder = new ViewHolder();
- holder.version = (TextView) convertView.findViewById(R.id.version);
- holder.status = (TextView) convertView.findViewById(R.id.status);
- holder.repository = (TextView) convertView.findViewById(R.id.repository);
- holder.size = (TextView) convertView.findViewById(R.id.size);
- holder.api = (TextView) convertView.findViewById(R.id.api);
- holder.incompatibleReasons = (TextView) convertView.findViewById(R.id.incompatible_reasons);
- holder.buildtype = (TextView) convertView.findViewById(R.id.buildtype);
- holder.added = (TextView) convertView.findViewById(R.id.added);
- holder.nativecode = (TextView) convertView.findViewById(R.id.nativecode);
-
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
-
- holder.version.setText(getString(R.string.version)
- + " " + apk.versionName
- + (apk.versionCode == app.suggestedVersionCode ? " ☆" : ""));
-
- holder.status.setText(getInstalledStatus(apk));
-
- holder.repository.setText(getString(R.string.repo_provider,
- RepoProvider.Helper.findById(getContext(), apk.repoId).getName()));
-
- if (apk.size > 0) {
- holder.size.setText(Utils.getFriendlySize(apk.size));
- holder.size.setVisibility(View.VISIBLE);
- } else {
- holder.size.setVisibility(View.GONE);
- }
-
- if (!Preferences.get().expertMode()) {
- holder.api.setVisibility(View.GONE);
- } else if (apk.minSdkVersion > 0 && apk.maxSdkVersion < Apk.SDK_VERSION_MAX_VALUE) {
- holder.api.setText(getString(R.string.minsdk_up_to_maxsdk,
- Utils.getAndroidVersionName(apk.minSdkVersion),
- Utils.getAndroidVersionName(apk.maxSdkVersion)));
- holder.api.setVisibility(View.VISIBLE);
- } else if (apk.minSdkVersion > 0) {
- holder.api.setText(getString(R.string.minsdk_or_later,
- Utils.getAndroidVersionName(apk.minSdkVersion)));
- holder.api.setVisibility(View.VISIBLE);
- } else if (apk.maxSdkVersion > 0) {
- holder.api.setText(getString(R.string.up_to_maxsdk,
- Utils.getAndroidVersionName(apk.maxSdkVersion)));
- holder.api.setVisibility(View.VISIBLE);
- }
-
- if (apk.srcname != null) {
- holder.buildtype.setText("source");
- } else {
- holder.buildtype.setText("bin");
- }
-
- if (apk.added != null) {
- holder.added.setText(getString(R.string.added_on,
- df.format(apk.added)));
- holder.added.setVisibility(View.VISIBLE);
- } else {
- holder.added.setVisibility(View.GONE);
- }
-
- if (Preferences.get().expertMode() && apk.nativecode != null) {
- holder.nativecode.setText(TextUtils.join(" ", apk.nativecode));
- holder.nativecode.setVisibility(View.VISIBLE);
- } else {
- holder.nativecode.setVisibility(View.GONE);
- }
-
- if (apk.incompatibleReasons != null) {
- holder.incompatibleReasons.setText(
- getResources().getString(
- R.string.requires_features,
- TextUtils.join(", ", apk.incompatibleReasons)));
- holder.incompatibleReasons.setVisibility(View.VISIBLE);
- } else {
- holder.incompatibleReasons.setVisibility(View.GONE);
- }
-
- // Disable it all if it isn't compatible...
- final View[] views = {
- convertView,
- holder.version,
- holder.status,
- holder.repository,
- holder.size,
- holder.api,
- holder.buildtype,
- holder.added,
- holder.nativecode,
- };
-
- for (final View v : views) {
- v.setEnabled(apk.compatible);
- }
-
- return convertView;
- }
- }
-
- private static final int INSTALL = Menu.FIRST;
- private static final int UNINSTALL = Menu.FIRST + 1;
- private static final int IGNOREALL = Menu.FIRST + 2;
- private static final int IGNORETHIS = Menu.FIRST + 3;
- private static final int LAUNCH = Menu.FIRST + 4;
- private static final int SHARE = Menu.FIRST + 5;
- private static final int SEND_VIA_BLUETOOTH = Menu.FIRST + 6;
-
- private App app;
- private PackageManager packageManager;
- private String activeDownloadUrlString;
- private LocalBroadcastManager localBroadcastManager;
-
- private AppPrefs startingPrefs;
-
- private final Context context = this;
-
- private AppDetailsHeaderFragment headerFragment;
-
- /**
- * Stores relevant data that we want to keep track of when destroying the activity
- * with the expectation of it being recreated straight away (e.g. after an
- * orientation change). One of the major things is that we want the download thread
- * to stay active, but for it not to trigger any UI stuff (e.g. progress bar)
- * between the activity being destroyed and recreated.
- */
- private static class ConfigurationChangeHelper {
-
- public final String urlString;
- public final App app;
-
- ConfigurationChangeHelper(String urlString, App app) {
- this.urlString = urlString;
- this.app = app;
- }
- }
-
- /**
- * Attempt to extract the packageName from the intent which launched this activity.
- * @return May return null, if we couldn't find the packageName. This should
- * never happen as AppDetails is only to be called by the FDroid activity
- * and not externally.
- */
- private String getPackageNameFromIntent(Intent intent) {
- if (!intent.hasExtra(AppDetails2.EXTRA_APPID)) {
- Log.e(TAG, "No package name found in the intent!");
- return null;
- }
-
- return intent.getStringExtra(AppDetails2.EXTRA_APPID);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- fdroidApp = (FDroidApp) getApplication();
- fdroidApp.applyTheme(this);
-
- super.onCreate(savedInstanceState);
-
- // Must be called *after* super.onCreate(), as that is where the action bar
- // compat implementation is assigned in the ActionBarActivity base class.
- supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-
- Intent intent = getIntent();
- if (intent.hasExtra(EXTRA_FROM)) {
- setTitle(intent.getStringExtra(EXTRA_FROM));
- }
-
- packageManager = getPackageManager();
-
- // Get the preferences we're going to use in this Activity...
- ConfigurationChangeHelper previousData = (ConfigurationChangeHelper) getLastCustomNonConfigurationInstance();
- if (previousData != null) {
- Utils.debugLog(TAG, "Recreating view after configuration change.");
- activeDownloadUrlString = previousData.urlString;
- if (activeDownloadUrlString != null) {
- Utils.debugLog(TAG, "Download was in progress before the configuration change, so we will start to listen to its events again.");
- }
- app = previousData.app;
- setApp(app);
- } else {
- if (!reset(getPackageNameFromIntent(intent))) {
- finish();
- return;
- }
- }
-
- // Set up the list...
- adapter = new ApkListAdapter(this, app);
-
- // Wait until all other intialization before doing this, because it will create the
- // fragments, which rely on data from the activity that is set earlier in this method.
- setContentView(R.layout.app_details);
-
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
-
- // Check for the presence of a view which only exists in the landscape view.
- // This seems to be the preferred way to interrogate the view, rather than
- // to check the orientation. I guess this is because views can be dynamically
- // chosen based on more than just orientation (e.g. large screen sizes).
- View onlyInLandscape = findViewById(R.id.app_summary_container);
-
- AppDetailsListFragment listFragment =
- (AppDetailsListFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_app_list);
- if (onlyInLandscape == null) {
- listFragment.setupSummaryHeader();
- } else {
- listFragment.removeSummaryHeader();
- }
-
- localBroadcastManager = LocalBroadcastManager.getInstance(this);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- // register observer to know when install status changes
- myAppObserver = new AppObserver(new Handler());
- getContentResolver().registerContentObserver(
- AppProvider.getHighestPriorityMetadataUri(app.packageName),
- true,
- myAppObserver);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- updateNotificationsForApp();
- }
-
- @Override
- protected void onResumeFragments() {
- // Must be called before super.onResumeFragments(), as the fragments depend on the active
- // url being correctly set in order to know whether or not to show the download progress bar.
- calcActiveDownloadUrlString(app.packageName);
-
- super.onResumeFragments();
-
- headerFragment = (AppDetailsHeaderFragment) getSupportFragmentManager().findFragmentById(R.id.header);
- refreshApkList();
- supportInvalidateOptionsMenu();
- if (DownloaderService.isQueuedOrActive(activeDownloadUrlString)) {
- registerDownloaderReceiver();
- }
- visiblePackageName = app.packageName;
- }
-
- /**
- * Remove progress listener, suppress progress bar, set downloadHandler to null.
- */
- private void cleanUpFinishedDownload() {
- activeDownloadUrlString = null;
- if (headerFragment != null) {
- headerFragment.removeProgress();
- }
- unregisterDownloaderReceiver();
- }
-
- protected void onStop() {
- super.onStop();
- visiblePackageName = null;
- getContentResolver().unregisterContentObserver(myAppObserver);
-
- // When leaving the app details, make sure to refresh app status for this app, since
- // we might want to show notifications for it now.
- updateNotificationsForApp();
- }
-
- /**
- * Some notifications (like "downloading" and "installed") are not shown for this app if it is open in app details.
- * When closing, we need to refresh the notifications, so they are displayed again.
- */
- private void updateNotificationsForApp() {
- if (app != null) {
- AppUpdateStatusManager appUpdateStatusManager = AppUpdateStatusManager.getInstance(this);
- for (AppUpdateStatusManager.AppUpdateStatus status : appUpdateStatusManager.getByPackageName(app.packageName)) {
- if (status.status == AppUpdateStatusManager.Status.Installed) {
- appUpdateStatusManager.removeApk(status.getUniqueKey());
- } else {
- appUpdateStatusManager.refreshApk(status.getUniqueKey());
- }
- }
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- // save the active URL for this app in case we come back
- getPreferences(MODE_PRIVATE)
- .edit()
- .putString(getPackageNameFromIntent(getIntent()), activeDownloadUrlString)
- .apply();
- if (app != null && !app.getPrefs(this).equals(startingPrefs)) {
- Utils.debugLog(TAG, "Updating 'ignore updates', as it has changed since we started the activity...");
- AppPrefsProvider.Helper.update(this, app, app.getPrefs(this));
- }
- unregisterDownloaderReceiver();
- }
-
- private void unregisterDownloaderReceiver() {
- if (localBroadcastManager == null) {
- return;
- }
- localBroadcastManager.unregisterReceiver(downloadReceiver);
- }
-
- private void registerDownloaderReceiver() {
- if (activeDownloadUrlString != null) { // if a download is active
- String url = activeDownloadUrlString;
- localBroadcastManager.registerReceiver(downloadReceiver,
- DownloaderService.getIntentFilter(url));
- }
- }
-
- private final BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case Downloader.ACTION_STARTED:
- if (headerFragment != null) {
- headerFragment.startProgress();
- }
- break;
- case Downloader.ACTION_PROGRESS:
- if (headerFragment != null) {
- headerFragment.updateProgress(intent.getIntExtra(Downloader.EXTRA_BYTES_READ, -1),
- intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, -1));
- }
- break;
- case Downloader.ACTION_COMPLETE:
- // Starts the install process one the download is complete.
- cleanUpFinishedDownload();
- localBroadcastManager.registerReceiver(installReceiver,
- Installer.getInstallIntentFilter(intent.getData()));
- break;
- case Downloader.ACTION_INTERRUPTED:
- if (intent.hasExtra(Downloader.EXTRA_ERROR_MESSAGE)) {
- String msg = intent.getStringExtra(Downloader.EXTRA_ERROR_MESSAGE)
- + " " + intent.getDataString();
- Toast.makeText(context, R.string.download_error, Toast.LENGTH_SHORT).show();
- Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
- } else { // user canceled
- Toast.makeText(context, R.string.details_notinstalled, Toast.LENGTH_LONG).show();
- }
- cleanUpFinishedDownload();
- break;
- default:
- throw new RuntimeException("intent action not handled!");
- }
- }
- };
-
- private final BroadcastReceiver installReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case Installer.ACTION_INSTALL_STARTED:
- headerFragment.startProgress(false);
- headerFragment.showIndeterminateProgress(getString(R.string.installing));
- break;
- case Installer.ACTION_INSTALL_COMPLETE:
- headerFragment.removeProgress();
-
- localBroadcastManager.unregisterReceiver(this);
- break;
- case Installer.ACTION_INSTALL_INTERRUPTED:
- headerFragment.removeProgress();
- onAppChanged();
-
- String errorMessage =
- intent.getStringExtra(Installer.EXTRA_ERROR_MESSAGE);
-
- if (!TextUtils.isEmpty(errorMessage) && !isFinishing()) {
- Log.e(TAG, "install aborted with errorMessage: " + errorMessage);
-
- String title = String.format(
- getString(R.string.install_error_notify_title),
- app.name);
-
- AlertDialog.Builder alertBuilder = new AlertDialog.Builder(AppDetails.this);
- alertBuilder.setTitle(title);
- alertBuilder.setMessage(errorMessage);
- alertBuilder.setNeutralButton(android.R.string.ok, null);
- alertBuilder.create().show();
- }
-
- localBroadcastManager.unregisterReceiver(this);
- break;
- case Installer.ACTION_INSTALL_USER_INTERACTION:
- PendingIntent installPendingIntent =
- intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI);
-
- try {
- installPendingIntent.send();
- } catch (PendingIntent.CanceledException e) {
- Log.e(TAG, "PI canceled", e);
- }
-
- break;
- default:
- throw new RuntimeException("intent action not handled!");
- }
- }
- };
-
- private final BroadcastReceiver uninstallReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case Installer.ACTION_UNINSTALL_STARTED:
- headerFragment.startProgress(false);
- headerFragment.showIndeterminateProgress(getString(R.string.uninstalling));
- break;
- case Installer.ACTION_UNINSTALL_COMPLETE:
- headerFragment.removeProgress();
- onAppChanged();
-
- localBroadcastManager.unregisterReceiver(this);
- break;
- case Installer.ACTION_UNINSTALL_INTERRUPTED:
- headerFragment.removeProgress();
-
- String errorMessage =
- intent.getStringExtra(Installer.EXTRA_ERROR_MESSAGE);
-
- if (!TextUtils.isEmpty(errorMessage)) {
- Log.e(TAG, "uninstall aborted with errorMessage: " + errorMessage);
-
- AlertDialog.Builder alertBuilder = new AlertDialog.Builder(AppDetails.this);
- alertBuilder.setTitle(R.string.uninstall_error_notify_title);
- alertBuilder.setMessage(errorMessage);
- alertBuilder.setNeutralButton(android.R.string.ok, null);
- alertBuilder.create().show();
- }
-
- localBroadcastManager.unregisterReceiver(this);
- break;
- case Installer.ACTION_UNINSTALL_USER_INTERACTION:
- PendingIntent uninstallPendingIntent =
- intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI);
-
- try {
- uninstallPendingIntent.send();
- } catch (PendingIntent.CanceledException e) {
- Log.e(TAG, "PI canceled", e);
- }
-
- break;
- default:
- throw new RuntimeException("intent action not handled!");
- }
- }
- };
-
- private void onAppChanged() {
- if (!reset(app.packageName)) {
- this.finish();
- return;
- }
-
- refreshApkList();
- refreshHeader();
- supportInvalidateOptionsMenu();
- }
-
- @Override
- public Object onRetainCustomNonConfigurationInstance() {
- return new ConfigurationChangeHelper(activeDownloadUrlString, app);
- }
-
- @Override
- protected void onDestroy() {
- unregisterDownloaderReceiver();
- super.onDestroy();
- }
-
- // Reset the display and list contents. Used when entering the activity, and
- // also when something has been installed/uninstalled.
- // Return true if the app was found, false otherwise.
- private boolean reset(String packageName) {
-
- Utils.debugLog(TAG, "Getting application details for " + packageName);
- App newApp = null;
-
- calcActiveDownloadUrlString(packageName);
-
- if (!TextUtils.isEmpty(packageName)) {
- newApp = AppProvider.Helper.findHighestPriorityMetadata(getContentResolver(), packageName);
- }
-
- setApp(newApp);
-
- return this.app != null;
- }
-
- private void calcActiveDownloadUrlString(String packageName) {
- String urlString = getPreferences(MODE_PRIVATE).getString(packageName, null);
- if (DownloaderService.isQueuedOrActive(urlString)) {
- activeDownloadUrlString = urlString;
- } else {
- // this URL is no longer active, remove it
- getPreferences(MODE_PRIVATE).edit().remove(packageName).apply();
- }
- }
-
- /**
- * 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;
-
- startingPrefs = app.getPrefs(this).createClone();
- }
-
- private void refreshApkList() {
- adapter.notifyDataSetChanged();
- }
-
- private void refreshHeader() {
- if (headerFragment != null) {
- headerFragment.updateViews();
- }
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- menu.clear();
- if (app == null) {
- return true;
- }
-
- if (packageManager.getLaunchIntentForPackage(app.packageName) != null && app.canAndWantToUpdate(this)) {
- MenuItemCompat.setShowAsAction(menu.add(
- Menu.NONE, LAUNCH, 1, R.string.menu_launch)
- .setIcon(R.drawable.ic_play_arrow_white),
- MenuItemCompat.SHOW_AS_ACTION_IF_ROOM |
- MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
- }
-
- if (app.isInstalled()) {
- MenuItemCompat.setShowAsAction(menu.add(
- Menu.NONE, UNINSTALL, 1, R.string.menu_uninstall)
- .setIcon(R.drawable.ic_delete_white),
- MenuItemCompat.SHOW_AS_ACTION_IF_ROOM |
- MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
- }
-
- MenuItemCompat.setShowAsAction(menu.add(
- Menu.NONE, SHARE, 1, R.string.menu_share)
- .setIcon(R.drawable.ic_share_white),
- MenuItemCompat.SHOW_AS_ACTION_IF_ROOM |
- MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
-
- menu.add(Menu.NONE, IGNOREALL, 2, R.string.menu_ignore_all)
- .setIcon(R.drawable.ic_do_not_disturb_white)
- .setCheckable(true)
- .setChecked(app.getPrefs(context).ignoreAllUpdates);
-
- if (app.hasUpdates()) {
- menu.add(Menu.NONE, IGNORETHIS, 2, R.string.menu_ignore_this)
- .setIcon(R.drawable.ic_do_not_disturb_white)
- .setCheckable(true)
- .setChecked(app.getPrefs(context).ignoreThisUpdate >= app.suggestedVersionCode);
- }
-
- // Ignore on devices without Bluetooth
- if (app.isInstalled() && fdroidApp.bluetoothAdapter != null) {
- menu.add(Menu.NONE, SEND_VIA_BLUETOOTH, 3, R.string.send_via_bluetooth)
- .setIcon(R.drawable.ic_bluetooth_white);
- }
- return true;
- }
-
- private void tryOpenUri(String s) {
- Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(s));
- if (intent.resolveActivity(packageManager) == null) {
- Toast.makeText(this,
- getString(R.string.no_handler_app, intent.getDataString()),
- Toast.LENGTH_LONG).show();
- return;
- }
- startActivity(intent);
- }
-
- private static final class SafeLinkMovementMethod extends LinkMovementMethod {
-
- private static SafeLinkMovementMethod instance;
-
- private final Context ctx;
-
- private SafeLinkMovementMethod(Context ctx) {
- this.ctx = ctx;
- }
-
- public static SafeLinkMovementMethod getInstance(Context ctx) {
- if (instance == null) {
- instance = new SafeLinkMovementMethod(ctx);
- }
- return instance;
- }
-
- private static CharSequence getLink(TextView widget, Spannable buffer,
- MotionEvent event) {
- int x = (int) event.getX();
- int y = (int) event.getY();
- x -= widget.getTotalPaddingLeft();
- y -= widget.getTotalPaddingTop();
- x += widget.getScrollX();
- y += widget.getScrollY();
-
- Layout layout = widget.getLayout();
- final int line = layout.getLineForVertical(y);
- final int off = layout.getOffsetForHorizontal(line, x);
- final ClickableSpan[] links = buffer.getSpans(off, off, ClickableSpan.class);
-
- if (links.length > 0) {
- final ClickableSpan link = links[0];
- final Spanned s = (Spanned) widget.getText();
- return s.subSequence(s.getSpanStart(link), s.getSpanEnd(link));
- }
- return "null";
- }
-
- @Override
- public boolean onTouchEvent(@NonNull TextView widget, @NonNull Spannable buffer,
- @NonNull MotionEvent event) {
- try {
- return super.onTouchEvent(widget, buffer, event);
- } catch (ActivityNotFoundException ex) {
- Selection.removeSelection(buffer);
- final CharSequence link = getLink(widget, buffer, event);
- Toast.makeText(ctx,
- ctx.getString(R.string.no_handler_app, link),
- Toast.LENGTH_LONG).show();
- return true;
- }
- }
-
- }
-
- private void navigateUp() {
- NavUtils.navigateUpFromSameTask(this);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
-
- switch (item.getItemId()) {
-
- case android.R.id.home:
- if (getIntent().hasExtra(EXTRA_HINT_SEARCHING)) {
- finish();
- } else {
- navigateUp();
- }
- return true;
-
- case LAUNCH:
- launchApk(app.packageName);
- return true;
-
- case SHARE:
- shareApp(app);
- return true;
-
- case INSTALL:
- // Note that this handles updating as well as installing.
- if (app.suggestedVersionCode > 0) {
- final Apk apkToInstall = ApkProvider.Helper.findApkFromAnyRepo(this, app.packageName, app.suggestedVersionCode);
- install(apkToInstall);
- }
- return true;
-
- case UNINSTALL:
- uninstallApk();
- return true;
-
- case IGNOREALL:
- app.getPrefs(this).ignoreAllUpdates ^= true;
- item.setChecked(app.getPrefs(this).ignoreAllUpdates);
- return true;
-
- case IGNORETHIS:
- if (app.getPrefs(this).ignoreThisUpdate >= app.suggestedVersionCode) {
- app.getPrefs(this).ignoreThisUpdate = 0;
- } else {
- app.getPrefs(this).ignoreThisUpdate = app.suggestedVersionCode;
- }
- item.setChecked(app.getPrefs(this).ignoreThisUpdate > 0);
- return true;
-
- case SEND_VIA_BLUETOOTH:
- /*
- * If Bluetooth has not been enabled/turned on, then
- * enabling device discoverability will automatically enable Bluetooth
- */
- Intent discoverBt = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
- discoverBt.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 121);
- startActivityForResult(discoverBt, REQUEST_ENABLE_BLUETOOTH);
- // if this is successful, the Bluetooth transfer is started
- return true;
-
- }
- return super.onOptionsItemSelected(item);
- }
-
- // Install the version of this app denoted by 'app.curApk'.
- private void install(final Apk apk) {
- if (isFinishing()) {
- return;
- }
-
- if (!apk.compatible) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(R.string.installIncompatible);
- builder.setPositiveButton(R.string.yes,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int whichButton) {
- initiateInstall(apk);
- }
- });
- builder.setNegativeButton(R.string.no,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int whichButton) {
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- return;
- }
- if (app.installedSig != null && apk.sig != null
- && !apk.sig.equals(app.installedSig)) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(R.string.SignatureMismatch).setPositiveButton(
- R.string.ok,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- return;
- }
- initiateInstall(apk);
- }
-
- private void initiateInstall(Apk apk) {
- Installer installer = InstallerFactory.create(this, apk);
- Intent intent = installer.getPermissionScreen();
- if (intent != null) {
- // permission screen required
- Utils.debugLog(TAG, "permission screen required");
- startActivityForResult(intent, REQUEST_PERMISSION_DIALOG);
- return;
- }
-
- startInstall(apk);
- }
-
- private void startInstall(Apk apk) {
- activeDownloadUrlString = apk.getUrl();
- registerDownloaderReceiver();
- InstallManagerService.queue(this, app, apk);
- }
-
- /**
- * Attempts to find the installed {@link Apk} from the database. If not found, will lookup the
- * {@link InstalledAppProvider} to find the details of the installed app and use that to
- * instantiate an {@link Apk} to be returned.
- *
- * Cases where an {@link Apk} will not be found in the database and for which we fall back to
- * the {@link InstalledAppProvider} include:
- * + System apps which are provided by a repository, but for which the version code bundled
- * with the system is not included in the repository.
- * + Regular apps from a repository, where the installed version is old enough that it is no
- * longer available in the repository.
- *
- * @throws IllegalStateException If neither the {@link PackageManager} or the
- * {@link InstalledAppProvider} can't find a reference to the installed apk.
- */
- @NonNull
- private Apk getInstalledApk() {
- try {
- PackageInfo pi = packageManager.getPackageInfo(app.packageName, 0);
-
- Apk apk = ApkProvider.Helper.findApkFromAnyRepo(this, pi.packageName, pi.versionCode);
- if (apk == null) {
- InstalledApp installedApp = InstalledAppProvider.Helper.findByPackageName(context, pi.packageName);
- if (installedApp == null) {
- throw new IllegalStateException("No installed app found when trying to uninstall");
- }
-
- apk = new Apk(installedApp);
- }
- return apk;
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- throw new IllegalStateException("Couldn't find app while installing");
- }
- }
-
- /**
- * Queue for uninstall based on the instance variable {@link #app}.
- */
- private void uninstallApk() {
- if (app.installedApk == null) {
- // TODO ideally, app would be refreshed immediately after install, then this
- // workaround would be unnecessary
- app.installedApk = getInstalledApk();
- }
-
- Installer installer = InstallerFactory.create(this, app.installedApk);
- Intent intent = installer.getUninstallScreen();
- if (intent != null) {
- // uninstall screen required
- Utils.debugLog(TAG, "screen screen required");
- startActivityForResult(intent, REQUEST_UNINSTALL_DIALOG);
- return;
- }
-
- startUninstall();
- }
-
- private void startUninstall() {
- localBroadcastManager.registerReceiver(uninstallReceiver,
- Installer.getUninstallIntentFilter(app.packageName));
- InstallerService.uninstall(context, app.installedApk);
- }
-
- private void launchApk(String packageName) {
- Intent intent = packageManager.getLaunchIntentForPackage(packageName);
- startActivity(intent);
- }
-
- private void shareApp(App app) {
- Intent shareIntent = new Intent(Intent.ACTION_SEND);
- shareIntent.setType("text/plain");
-
- shareIntent.putExtra(Intent.EXTRA_SUBJECT, app.name);
- shareIntent.putExtra(Intent.EXTRA_TEXT, app.name + " (" + app.summary + ") - https://f-droid.org/app/" + app.packageName);
-
- startActivity(Intent.createChooser(shareIntent, getString(R.string.menu_share)));
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_ENABLE_BLUETOOTH:
- fdroidApp.sendViaBluetooth(this, resultCode, app.packageName);
- break;
- case REQUEST_PERMISSION_DIALOG:
- if (resultCode == Activity.RESULT_OK) {
- Uri uri = data.getData();
- Apk apk = ApkProvider.Helper.findByUri(this, uri, Schema.ApkTable.Cols.ALL);
- startInstall(apk);
- }
- break;
- case REQUEST_UNINSTALL_DIALOG:
- if (resultCode == Activity.RESULT_OK) {
- startUninstall();
- }
- break;
- }
- }
-
- private App getApp() {
- return app;
- }
-
- private ApkListAdapter getApks() {
- return adapter;
- }
-
- public static class AppDetailsSummaryFragment extends Fragment {
-
- final Preferences prefs;
- private AppDetails appDetails;
- private static final int MAX_LINES = 5;
- private static boolean viewAllDescription;
- private static LinearLayout llViewMoreDescription;
- private static LinearLayout llViewMorePermissions;
- private final View.OnClickListener expanderPermissions = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final View permissionListView = llViewMorePermissions.findViewById(R.id.permission_list);
- final TextView permissionHeader = (TextView) llViewMorePermissions.findViewById(R.id.permissions);
-
- if (permissionListView.getVisibility() == View.GONE) {
- permissionListView.setVisibility(View.VISIBLE);
- permissionHeader.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(getActivity(), R.drawable.ic_lock_24dp_grey600), null, ContextCompat.getDrawable(getActivity(), R.drawable.ic_expand_less_grey600), null);
- } else {
- permissionListView.setVisibility(View.GONE);
- permissionHeader.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(getActivity(), R.drawable.ic_lock_24dp_grey600), null, ContextCompat.getDrawable(getActivity(), R.drawable.ic_expand_more_grey600), null);
- }
- }
- };
- private ViewGroup layoutLinks;
-
- public AppDetailsSummaryFragment() {
- prefs = Preferences.get();
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- appDetails = (AppDetails) activity;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
- View summaryView = inflater.inflate(R.layout.app_details_summary, container, false);
- setupView(summaryView);
- return summaryView;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- updateViews(getView());
- }
-
- // The HTML formatter adds "\n\n" at the end of every paragraph. This
- // is desired between paragraphs, but not at the end of the whole
- // string as it adds unwanted spacing at the end of the TextView.
- // Remove all trailing newlines.
- // Use this function instead of a trim() as that would require
- // converting to String and thus losing formatting (e.g. bold).
- private static CharSequence trimNewlines(CharSequence s) {
- if (s == null || s.length() < 1) {
- return s;
- }
- int i;
- for (i = s.length() - 1; i >= 0; i--) {
- if (s.charAt(i) != '\n') {
- break;
- }
- }
- if (i == s.length() - 1) {
- return s;
- }
- return s.subSequence(0, i + 1);
- }
-
- private ViewGroup layoutLinksContent;
- private final View.OnClickListener expanderLinks = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
-
- TextView linksHeader = (TextView) layoutLinks.findViewById(R.id.information);
-
- if (layoutLinksContent.getVisibility() == View.GONE) {
- layoutLinksContent.setVisibility(View.VISIBLE);
- linksHeader.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(getActivity(), R.drawable.ic_website), null, ContextCompat.getDrawable(getActivity(), R.drawable.ic_expand_less_grey600), null);
- } else {
- layoutLinksContent.setVisibility(View.GONE);
- linksHeader.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(getActivity(), R.drawable.ic_website), null, ContextCompat.getDrawable(getActivity(), R.drawable.ic_expand_more_grey600), null);
- }
- }
- };
-
- private final View.OnClickListener onClickListener = new View.OnClickListener() {
- public void onClick(View v) {
- String url = null;
- App app = appDetails.getApp();
- switch (v.getId()) {
- case R.id.website:
- url = app.webSite;
- break;
- case R.id.email:
- final String subject = Uri.encode(getString(R.string.app_details_subject, app.name));
- url = "mailto:" + app.authorEmail + "?subject=" + subject;
- break;
- case R.id.source:
- url = app.sourceCode;
- break;
- case R.id.issues:
- url = app.issueTracker;
- break;
- case R.id.changelog:
- url = app.changelog;
- break;
- case R.id.donate:
- url = app.donate;
- break;
- case R.id.bitcoin:
- url = app.getBitcoinUri();
- break;
- case R.id.litecoin:
- url = app.getLitecoinUri();
- break;
- case R.id.flattr:
- url = app.getFlattrUri();
- break;
- }
- if (url != null) {
- ((AppDetails) getActivity()).tryOpenUri(url);
- }
- }
- };
-
- private final View.OnClickListener expanderDescription = new View.OnClickListener() {
- public void onClick(View v) {
- final TextView description = (TextView) llViewMoreDescription.findViewById(R.id.description);
- final TextView viewMorePermissions = (TextView) llViewMoreDescription.findViewById(R.id.view_more_description);
- if (viewAllDescription) {
- description.setMaxLines(Integer.MAX_VALUE);
- viewMorePermissions.setText(getString(R.string.less));
- } else {
- description.setMaxLines(MAX_LINES);
- if (Build.VERSION.SDK_INT > 10) {
- // ellipsizing doesn't work properly here on 2.X
- description.setEllipsize(TextUtils.TruncateAt.MARQUEE);
- }
- viewMorePermissions.setText(R.string.more);
- }
- viewAllDescription ^= true;
- }
- };
-
- private void setupView(final View view) {
- App app = appDetails.getApp();
- // Expandable description
- final TextView description = (TextView) view.findViewById(R.id.description);
- final Spanned desc = Html.fromHtml(app.description, null, new Utils.HtmlTagHandler());
- description.setMovementMethod(SafeLinkMovementMethod.getInstance(getActivity()));
- description.setText(trimNewlines(desc));
- final View viewMoreDescription = view.findViewById(R.id.view_more_description);
- description.post(new Runnable() {
- @Override
- public void run() {
- // If description has more than five lines
- if (description.getLineCount() > MAX_LINES) {
- description.setMaxLines(MAX_LINES);
- if (Build.VERSION.SDK_INT > 10) {
- // ellipsizing doesn't work properly here on 2.X
- description.setEllipsize(TextUtils.TruncateAt.MARQUEE);
- }
- description.setOnClickListener(expanderDescription);
- viewAllDescription = true;
-
- llViewMoreDescription = (LinearLayout) view.findViewById(R.id.ll_description);
- llViewMoreDescription.setOnClickListener(expanderDescription);
-
- viewMoreDescription.setOnClickListener(expanderDescription);
- } else {
- viewMoreDescription.setVisibility(View.GONE);
- }
- }
- });
-
- // App ID
- final TextView packageNameView = (TextView) view.findViewById(R.id.package_name);
- if (prefs.expertMode()) {
- packageNameView.setText(app.packageName);
- } else {
- packageNameView.setVisibility(View.GONE);
- }
-
- // Summary
- final TextView summaryView = (TextView) view.findViewById(R.id.summary);
- summaryView.setText(app.summary);
-
- layoutLinks = (ViewGroup) view.findViewById(R.id.ll_information);
- layoutLinksContent = (ViewGroup) layoutLinks.findViewById(R.id.ll_information_content);
-
- final TextView linksHeader = (TextView) view.findViewById(R.id.information);
- linksHeader.setOnClickListener(expanderLinks);
-
- // Website button
- View tv = view.findViewById(R.id.website);
- if (!TextUtils.isEmpty(app.webSite)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Email button
- tv = view.findViewById(R.id.email);
- if (!TextUtils.isEmpty(app.authorEmail)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Source button
- tv = view.findViewById(R.id.source);
- if (!TextUtils.isEmpty(app.sourceCode)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Issues button
- tv = view.findViewById(R.id.issues);
- if (!TextUtils.isEmpty(app.issueTracker)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Changelog button
- tv = view.findViewById(R.id.changelog);
- if (!TextUtils.isEmpty(app.changelog)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Donate button
- tv = view.findViewById(R.id.donate);
- if (!TextUtils.isEmpty(app.donate)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Bitcoin
- tv = view.findViewById(R.id.bitcoin);
- if (!TextUtils.isEmpty(app.bitcoin)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Litecoin
- tv = view.findViewById(R.id.litecoin);
- if (!TextUtils.isEmpty(app.litecoin)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- // Flattr
- tv = view.findViewById(R.id.flattr);
- if (!TextUtils.isEmpty(app.flattrID)) {
- tv.setOnClickListener(onClickListener);
- } else {
- tv.setVisibility(View.GONE);
- }
-
- Apk curApk = null;
- for (int i = 0; i < appDetails.getApks().getCount(); i++) {
- final Apk apk = appDetails.getApks().getItem(i);
- if (apk.versionCode == app.suggestedVersionCode) {
- curApk = apk;
- break;
- }
- }
-
- // Expandable permissions
- llViewMorePermissions = (LinearLayout) view.findViewById(R.id.ll_permissions);
- final TextView permissionHeader = (TextView) view.findViewById(R.id.permissions);
-
- final boolean curApkCompatible = curApk != null && curApk.compatible;
- if (!appDetails.getApks().isEmpty() && (curApkCompatible || prefs.showIncompatibleVersions())) {
- // build and set the string once
- buildPermissionInfo();
- permissionHeader.setOnClickListener(expanderPermissions);
-
- } else {
- permissionHeader.setVisibility(View.GONE);
- }
-
- // Anti features
- final TextView antiFeaturesView = (TextView) view.findViewById(R.id.antifeatures);
- if (app.antiFeatures != null) {
- StringBuilder sb = new StringBuilder();
- for (String af : app.antiFeatures) {
- String afdesc = descAntiFeature(af);
- sb.append("\t• ").append(afdesc).append('\n');
- }
- if (sb.length() > 0) {
- sb.setLength(sb.length() - 1);
- antiFeaturesView.setText(sb.toString());
- } else {
- antiFeaturesView.setVisibility(View.GONE);
- }
- } else {
- antiFeaturesView.setVisibility(View.GONE);
- }
-
- updateViews(view);
- }
-
- private void buildPermissionInfo() {
- AppDiff appDiff = new AppDiff(appDetails.getPackageManager(), appDetails.getApks().getItem(0));
- AppSecurityPermissions perms = new AppSecurityPermissions(appDetails, appDiff.pkgInfo);
-
- final ViewGroup permList = (ViewGroup) llViewMorePermissions.findViewById(R.id.permission_list);
- permList.addView(perms.getPermissionsView(AppSecurityPermissions.WHICH_ALL));
- }
-
- private String descAntiFeature(String af) {
- switch (af) {
- case "Ads":
- return getString(R.string.antiadslist);
- case "Tracking":
- return getString(R.string.antitracklist);
- case "NonFreeNet":
- return getString(R.string.antinonfreenetlist);
- case "NonFreeAdd":
- return getString(R.string.antinonfreeadlist);
- case "NonFreeDep":
- return getString(R.string.antinonfreedeplist);
- case "UpstreamNonFree":
- return getString(R.string.antiupstreamnonfreelist);
- case "NonFreeAssets":
- return getString(R.string.antinonfreeassetslist);
- default:
- return af;
- }
- }
-
- public void updateViews(View view) {
- if (view == null) {
- Log.e(TAG, "AppDetailsSummaryFragment.updateViews(): view == null. Oops.");
- return;
- }
-
- App app = appDetails.getApp();
- TextView signatureView = (TextView) view.findViewById(R.id.signature);
- if (prefs.expertMode() && !TextUtils.isEmpty(app.installedSig)) {
- signatureView.setVisibility(View.VISIBLE);
- signatureView.setText("Signed: " + app.installedSig);
- } else {
- signatureView.setVisibility(View.GONE);
- }
- }
- }
-
- public static class AppDetailsHeaderFragment extends Fragment implements View.OnClickListener {
-
- private AppDetails appDetails;
- private Button btMain;
- private ProgressBar progressBar;
- private TextView progressSize;
- private TextView progressPercent;
- private ImageButton cancelButton;
- final DisplayImageOptions displayImageOptions;
- public static boolean installed;
- public static boolean updateWanted;
-
- public AppDetailsHeaderFragment() {
- displayImageOptions = new DisplayImageOptions.Builder()
- .cacheInMemory(true)
- .cacheOnDisk(true)
- .imageScaleType(ImageScaleType.NONE)
- .showImageOnLoading(R.drawable.ic_repo_app_default)
- .showImageForEmptyUri(R.drawable.ic_repo_app_default)
- .bitmapConfig(Bitmap.Config.RGB_565)
- .build();
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.app_details_header, container, false);
- setupView(view);
- return view;
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- appDetails = (AppDetails) activity;
- }
-
- private void setupView(View view) {
- App app = appDetails.getApp();
-
- // Set the icon...
- ImageView iv = (ImageView) view.findViewById(R.id.icon);
- ImageLoader.getInstance().displayImage(app.iconUrlLarge, iv,
- displayImageOptions);
-
- // Set the title
- TextView tv = (TextView) view.findViewById(R.id.title);
- tv.setText(app.name);
-
- btMain = (Button) view.findViewById(R.id.btn_main);
- progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
- progressSize = (TextView) view.findViewById(R.id.progress_size);
- progressPercent = (TextView) view.findViewById(R.id.progress_percentage);
- cancelButton = (ImageButton) view.findViewById(R.id.cancel);
- progressBar.setIndeterminate(false);
- cancelButton.setOnClickListener(this);
-
- updateViews(view);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- updateViews();
- restoreProgressBarOnResume();
- }
-
- /**
- * After resuming the fragment, decide whether or not we need to show the progress bar.
- * Also, put an appropriate message depending on whether or not the download is active or
- * just queued.
- *
- * NOTE: this can't be done in the `updateViews` method as it currently stands. The reason
- * is because that method gets called all the time, for all sorts of reasons. The progress
- * bar is updated with actual progress values in response to async broadcasts. If we always
- * tried to force the progress bar in `updateViews`, it would override the values that were
- * set by the async progress broadcasts.
- */
- private void restoreProgressBarOnResume() {
- if (appDetails.activeDownloadUrlString != null) {
- // We don't actually know what the current progress is, so this will show an indeterminate
- // progress bar until the first progress/complete event we receive.
- if (DownloaderService.isQueuedOrActive(appDetails.activeDownloadUrlString)) {
- showIndeterminateProgress(getString(R.string.download_pending));
- } else {
- showIndeterminateProgress("");
- }
- }
- }
-
- /**
- * Displays empty, indeterminate progress bar and related views.
- */
- public void startProgress() {
- startProgress(true);
- }
-
- public void startProgress(boolean allowCancel) {
- cancelButton.setVisibility(allowCancel ? View.VISIBLE : View.GONE);
- if (isAdded()) {
- showIndeterminateProgress(getString(R.string.download_pending));
- updateViews();
- }
- }
-
- private void showIndeterminateProgress(String message) {
- setProgressVisible(true);
- progressBar.setIndeterminate(true);
- progressSize.setText(message);
- progressPercent.setText("");
- }
-
- /**
- * Updates progress bar and captions to new values (in bytes).
- */
- public void updateProgress(long bytesDownloaded, long totalBytes) {
- if (bytesDownloaded < 0 || totalBytes == 0) {
- // Avoid division by zero and other weird values
- return;
- }
-
- if (totalBytes == -1) {
- setProgressVisible(true);
- progressBar.setIndeterminate(true);
- progressSize.setText(Utils.getFriendlySize(bytesDownloaded));
- progressPercent.setText("");
- } else {
- long percent = bytesDownloaded * 100 / totalBytes;
- setProgressVisible(true);
- progressBar.setIndeterminate(false);
- progressBar.setProgress((int) percent);
- progressBar.setMax(100);
- progressSize.setText(Utils.getFriendlySize(bytesDownloaded) + " / " + Utils.getFriendlySize(totalBytes));
- progressPercent.setText(Long.toString(percent) + " %");
- }
- }
-
- /**
- * Shows or hides progress bar and related views.
- */
- private void setProgressVisible(boolean visible) {
- int state = visible ? View.VISIBLE : View.GONE;
- progressBar.setVisibility(state);
- progressSize.setVisibility(state);
- progressPercent.setVisibility(state);
- }
-
- /**
- * Removes progress bar and related views, invokes {@link #updateViews()}.
- */
- public void removeProgress() {
- setProgressVisible(false);
- cancelButton.setVisibility(View.GONE);
- updateViews();
- }
-
- /**
- * Cancels download and hides progress bar.
- */
- @Override
- public void onClick(View view) {
- AppDetails appDetails = (AppDetails) getActivity();
- if (appDetails == null || appDetails.activeDownloadUrlString == null) {
- return;
- }
-
- InstallManagerService.cancel(getContext(), appDetails.activeDownloadUrlString);
- }
-
- public void updateViews() {
- updateViews(getView());
- }
-
- public void updateViews(View view) {
- if (view == null) {
- Log.e(TAG, "AppDetailsHeaderFragment.updateViews(): view == null. Oops.");
- return;
- }
- App app = appDetails.getApp();
- TextView statusView = (TextView) view.findViewById(R.id.status);
- btMain.setVisibility(View.VISIBLE);
-
- if (appDetails.activeDownloadUrlString != null) {
- btMain.setText(R.string.downloading);
- btMain.setEnabled(false);
- } else if (!app.isInstalled() && app.suggestedVersionCode > 0 &&
- appDetails.adapter.getCount() > 0) {
- // Check count > 0 due to incompatible apps resulting in an empty list.
- // If App isn't installed
- installed = false;
- statusView.setText(R.string.details_notinstalled);
- NfcHelper.disableAndroidBeam(appDetails);
- // Set Install button and hide second button
- btMain.setText(R.string.menu_install);
- btMain.setOnClickListener(onClickListener);
- btMain.setEnabled(true);
- } else if (app.isInstalled()) {
- // If App is installed
- installed = true;
- statusView.setText(getString(R.string.details_installed, app.installedVersionName));
- NfcHelper.setAndroidBeam(appDetails, app.packageName);
- if (app.canAndWantToUpdate(appDetails)) {
- updateWanted = true;
- btMain.setText(R.string.menu_upgrade);
- } else {
- updateWanted = false;
- if (appDetails.packageManager.getLaunchIntentForPackage(app.packageName) != null) {
- btMain.setText(R.string.menu_launch);
- } else {
- btMain.setText(R.string.menu_uninstall);
- }
- }
- btMain.setOnClickListener(onClickListener);
- btMain.setEnabled(true);
- }
- TextView author = (TextView) view.findViewById(R.id.author);
- if (!TextUtils.isEmpty(app.authorName)) {
- author.setText(getString(R.string.by_author) + " " + app.authorName);
- author.setVisibility(View.VISIBLE);
- }
- TextView currentVersion = (TextView) view.findViewById(R.id.current_version);
- if (!appDetails.getApks().isEmpty()) {
- currentVersion.setText(appDetails.getApks().getItem(0).versionName + " (" + app.license + ")");
- } else {
- currentVersion.setVisibility(View.GONE);
- btMain.setVisibility(View.GONE);
- }
-
- }
-
- private final View.OnClickListener onClickListener = new View.OnClickListener() {
- public void onClick(View v) {
- App app = appDetails.getApp();
- AppDetails activity = (AppDetails) getActivity();
- if (updateWanted && app.suggestedVersionCode > 0) {
- Apk apkToInstall = ApkProvider.Helper.findApkFromAnyRepo(activity, app.packageName, app.suggestedVersionCode);
- activity.install(apkToInstall);
- return;
- }
- if (installed) {
- // If installed
- if (activity.packageManager.getLaunchIntentForPackage(app.packageName) != null) {
- // If "launchable", launch
- activity.launchApk(app.packageName);
- } else {
- activity.uninstallApk();
- }
- } else if (app.suggestedVersionCode > 0) {
- // If not installed, install
- btMain.setEnabled(false);
- btMain.setText(R.string.system_install_installing);
- final Apk apkToInstall = ApkProvider.Helper.findApkFromAnyRepo(activity, app.packageName, app.suggestedVersionCode);
- activity.install(apkToInstall);
- }
- }
- };
- }
-
- public static class AppDetailsListFragment extends ListFragment {
-
- private static final String SUMMARY_TAG = "summary";
-
- private AppDetails appDetails;
- private AppDetailsSummaryFragment summaryFragment;
-
- private FrameLayout headerView;
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- appDetails = (AppDetails) activity;
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- // A bit of a hack, but we can't add the header view in setupSummaryHeader(),
- // due to the fact it needs to happen before setListAdapter(). Also, seeing
- // as we may never add a summary header (i.e. in landscape), this is probably
- // the last opportunity to set the list adapter. As such, we use the headerView
- // as a mechanism to optionally allow adding a header in the future.
- if (headerView == null) {
- headerView = new FrameLayout(getActivity());
- headerView.setId(R.id.appDetailsSummaryHeader);
- } else {
- Fragment summaryFragment = getChildFragmentManager().findFragmentByTag(SUMMARY_TAG);
- if (summaryFragment != null) {
- getChildFragmentManager().beginTransaction().remove(summaryFragment).commit();
- }
- }
-
- setListAdapter(null);
- getListView().addHeaderView(headerView);
- setListAdapter(appDetails.getApks());
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- App app = appDetails.getApp();
- final Apk apk = appDetails.getApks().getItem(position - l.getHeaderViewsCount());
- if (app.installedVersionCode == apk.versionCode) {
- appDetails.uninstallApk();
- } else if (app.installedVersionCode > apk.versionCode) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setMessage(R.string.installDowngrade);
- builder.setPositiveButton(R.string.yes,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int whichButton) {
- appDetails.install(apk);
- }
- });
- builder.setNegativeButton(R.string.no,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int whichButton) {
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- } else {
- appDetails.install(apk);
- }
- }
-
- public void removeSummaryHeader() {
- Fragment summary = getChildFragmentManager().findFragmentByTag(SUMMARY_TAG);
- if (summary != null) {
- getChildFragmentManager().beginTransaction().remove(summary).commit();
- headerView.removeAllViews();
- headerView.setVisibility(View.GONE);
- summaryFragment = null;
- }
- }
-
- public void setupSummaryHeader() {
- Fragment fragment = getChildFragmentManager().findFragmentByTag(SUMMARY_TAG);
- if (fragment != null) {
- summaryFragment = (AppDetailsSummaryFragment) fragment;
- } else {
- summaryFragment = new AppDetailsSummaryFragment();
- }
- getChildFragmentManager().beginTransaction().replace(headerView.getId(), summaryFragment, SUMMARY_TAG).commit();
- headerView.setVisibility(View.VISIBLE);
- }
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java
index 4917be1c1..cf242b497 100644
--- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java
+++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java
@@ -1,3 +1,24 @@
+/*
+ * Copyright (C) 2010-12 Ciaran Gultnieks, ciaran@ciarang.com
+ * Copyright (C) 2013-15 Daniel Martí
+ * Copyright (C) 2013 Stefan Völkel, bd@bc-bd.org
+ * Copyright (C) 2015 Nico Alt, nicoalt@posteo.org
+ *
+ * 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 android.app.Activity;
diff --git a/app/src/main/java/org/fdroid/fdroid/FDroid.java b/app/src/main/java/org/fdroid/fdroid/FDroid.java
deleted file mode 100644
index 5aff91827..000000000
--- a/app/src/main/java/org/fdroid/fdroid/FDroid.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * Copyright (C) 2010-12 Ciaran Gultnieks, ciaran@ciarang.com
- * Copyright (C) 2009 Roberto Jacinto, roberto.jacinto@caixamagica.pt
- *
- * 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 android.app.NotificationManager;
-import android.app.SearchManager;
-import android.bluetooth.BluetoothAdapter;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.view.MenuItemCompat;
-import android.support.v4.view.ViewPager;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.SearchView;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import org.fdroid.fdroid.compat.TabManager;
-import org.fdroid.fdroid.compat.UriCompat;
-import org.fdroid.fdroid.data.AppProvider;
-import org.fdroid.fdroid.data.NewRepoConfig;
-import org.fdroid.fdroid.views.AppListFragmentPagerAdapter;
-import org.fdroid.fdroid.views.ManageReposActivity;
-import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
-
-public class FDroid extends AppCompatActivity implements SearchView.OnQueryTextListener {
-
- private static final String TAG = "FDroid";
-
- private static final int REQUEST_PREFS = 1;
- private static final int REQUEST_ENABLE_BLUETOOTH = 2;
- private static final int REQUEST_SWAP = 3;
-
- public static final String EXTRA_TAB_UPDATE = "extraTab";
-
- private static final String ACTION_ADD_REPO = "org.fdroid.fdroid.FDroid.ACTION_ADD_REPO";
-
- private static final String ADD_REPO_INTENT_HANDLED = "addRepoIntentHandled";
-
- private FDroidApp fdroidApp;
-
- private SearchView searchView;
-
- private ViewPager viewPager;
-
- @Nullable
- private TabManager tabManager;
-
- private AppListFragmentPagerAdapter adapter;
-
- @Nullable
- private MenuItem searchMenuItem;
-
- @Nullable
- private String pendingSearchQuery;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- fdroidApp = (FDroidApp) getApplication();
- fdroidApp.applyTheme(this);
-
- super.onCreate(savedInstanceState);
- setContentView(R.layout.fdroid);
- createViews();
-
- getTabManager().createTabs();
-
- // Start a search by just typing
- setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
- Intent intent = getIntent();
- handleSearchOrAppViewIntent(intent);
-
- if (intent.hasExtra(EXTRA_TAB_UPDATE)) {
- boolean showUpdateTab = intent.getBooleanExtra(EXTRA_TAB_UPDATE, false);
- if (showUpdateTab) {
- getTabManager().selectTab(2);
- }
- }
-
- Uri uri = AppProvider.getContentUri();
- getContentResolver().registerContentObserver(uri, true, new AppObserver());
-
- // Re-enable once it can be disabled via a setting
- // See https://gitlab.com/fdroid/fdroidclient/issues/435
- //
- // if (UpdateService.isNetworkAvailableForUpdate(this)) {
- // UpdateService.updateNow(this);
- // }
- }
-
- private void performSearch(String query) {
- if (searchMenuItem == null) {
- // Store this for later when we do actually have a search menu ready to use.
- pendingSearchQuery = query;
- return;
- }
-
- SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
- MenuItemCompat.expandActionView(searchMenuItem);
- searchView.setQuery(query, true);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- FDroidApp.checkStartTor(this);
- // AppDetails and RepoDetailsActivity set different NFC actions, so reset here
- NfcHelper.setAndroidBeam(this, getApplication().getPackageName());
- checkForAddRepoIntent(getIntent());
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- handleSearchOrAppViewIntent(intent);
-
- // This is called here as well as onResume(), because onNewIntent() is not called the first
- // time the activity is created. An alternative option to make sure that the add repo intent
- // is always handled is to call setIntent(intent) here. However, after this good read:
- // http://stackoverflow.com/a/7749347 it seems that adding a repo is not really more
- // important than the original intent which caused the activity to start (even though it
- // could technically have been an add repo intent itself).
- // The end result is that this method will be called twice for one add repo intent. Once
- // here and once in onResume(). However, the method deals with this by ensuring it only
- // handles the same intent once.
- checkForAddRepoIntent(intent);
- }
-
- private void handleSearchOrAppViewIntent(Intent intent) {
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- String query = intent.getStringExtra(SearchManager.QUERY);
- performSearch(query);
- return;
- }
-
- final Uri data = intent.getData();
- if (data == null) {
- return;
- }
-
- final String scheme = data.getScheme();
- final String path = data.getPath();
- String packageName = null;
- String query = null;
- if (data.isHierarchical()) {
- final String host = data.getHost();
- if (host == null) {
- return;
- }
- switch (host) {
- case "f-droid.org":
- if (path.startsWith("/repository/browse")) {
- // http://f-droid.org/repository/browse?fdfilter=search+query
- query = UriCompat.getQueryParameter(data, "fdfilter");
-
- // http://f-droid.org/repository/browse?fdid=packageName
- packageName = UriCompat.getQueryParameter(data, "fdid");
- } else if (path.startsWith("/app")) {
- // http://f-droid.org/app/packageName
- packageName = data.getLastPathSegment();
- if ("app".equals(packageName)) {
- packageName = null;
- }
- }
- break;
- case "details":
- // market://details?id=app.id
- packageName = UriCompat.getQueryParameter(data, "id");
- break;
- case "search":
- // market://search?q=query
- query = UriCompat.getQueryParameter(data, "q");
- break;
- case "play.google.com":
- if (path.startsWith("/store/apps/details")) {
- // http://play.google.com/store/apps/details?id=app.id
- packageName = UriCompat.getQueryParameter(data, "id");
- } else if (path.startsWith("/store/search")) {
- // http://play.google.com/store/search?q=foo
- query = UriCompat.getQueryParameter(data, "q");
- }
- break;
- case "apps":
- case "amazon.com":
- case "www.amazon.com":
- // amzn://apps/android?p=app.id
- // http://amazon.com/gp/mas/dl/android?s=app.id
- packageName = UriCompat.getQueryParameter(data, "p");
- query = UriCompat.getQueryParameter(data, "s");
- break;
- }
- } else if ("fdroid.app".equals(scheme)) {
- // fdroid.app:app.id
- packageName = data.getSchemeSpecificPart();
- } else if ("fdroid.search".equals(scheme)) {
- // fdroid.search:query
- query = data.getSchemeSpecificPart();
- }
-
- if (!TextUtils.isEmpty(query)) {
- // an old format for querying via packageName
- if (query.startsWith("pname:")) {
- packageName = query.split(":")[1];
- }
-
- // sometimes, search URLs include pub: or other things before the query string
- if (query.contains(":")) {
- query = query.split(":")[1];
- }
- }
-
- if (!TextUtils.isEmpty(packageName)) {
- Utils.debugLog(TAG, "FDroid launched via app link for '" + packageName + "'");
- Intent intentToInvoke = new Intent(this, AppDetails2.class);
- intentToInvoke.putExtra(AppDetails2.EXTRA_APPID, packageName);
- startActivity(intentToInvoke);
- finish();
- } else if (!TextUtils.isEmpty(query)) {
- Utils.debugLog(TAG, "FDroid launched via search link for '" + query + "'");
- performSearch(query);
- }
- }
-
- private void checkForAddRepoIntent(Intent intent) {
- // Don't handle the intent after coming back to this view (e.g. after hitting the back button)
- // http://stackoverflow.com/a/14820849
- if (!intent.hasExtra(ADD_REPO_INTENT_HANDLED)) {
- intent.putExtra(ADD_REPO_INTENT_HANDLED, true);
- NewRepoConfig parser = new NewRepoConfig(this, intent);
- if (parser.isValidRepo()) {
- if (parser.isFromSwap()) {
- Intent confirmIntent = new Intent(this, SwapWorkflowActivity.class);
- confirmIntent.putExtra(SwapWorkflowActivity.EXTRA_CONFIRM, true);
- confirmIntent.setData(intent.getData());
- startActivityForResult(confirmIntent, REQUEST_SWAP);
- } else {
- startActivity(new Intent(ACTION_ADD_REPO, intent.getData(), this, ManageReposActivity.class));
- }
- } else if (parser.getErrorMessage() != null) {
- Toast.makeText(this, parser.getErrorMessage(), Toast.LENGTH_LONG).show();
- }
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- getTabManager().onConfigurationChanged(newConfig);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- if (fdroidApp.bluetoothAdapter == null) {
- // ignore on devices without Bluetooth
- MenuItem btItem = menu.findItem(R.id.action_bluetooth_apk);
- btItem.setVisible(false);
- }
-
- SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- searchMenuItem = menu.findItem(R.id.action_search);
- searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
- searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
- // LayoutParams.MATCH_PARENT does not work, use a big value instead
- searchView.setMaxWidth(1000000);
- searchView.setOnQueryTextListener(this);
-
- // If we were asked to execute a search before getting around to building the options
- // menu, then we should deal with that now that the options menu is all sorted out.
- if (pendingSearchQuery != null) {
- performSearch(pendingSearchQuery);
- pendingSearchQuery = null;
- }
-
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
-
- switch (item.getItemId()) {
-
- case R.id.action_update_repo:
- UpdateService.updateNow(this);
- return true;
-
- case R.id.action_manage_repos:
- startActivity(new Intent(this, ManageReposActivity.class));
- return true;
-
- case R.id.action_settings:
- Intent prefs = new Intent(getBaseContext(), PreferencesActivity.class);
- startActivityForResult(prefs, REQUEST_PREFS);
- return true;
-
- case R.id.action_swap:
- startActivity(new Intent(this, SwapWorkflowActivity.class));
- return true;
-
- case R.id.action_bluetooth_apk:
- /*
- * If Bluetooth has not been enabled/turned on, then enabling
- * device discoverability will automatically enable Bluetooth
- */
- Intent discoverBt = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
- discoverBt.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 121);
- startActivityForResult(discoverBt, REQUEST_ENABLE_BLUETOOTH);
- // if this is successful, the Bluetooth transfer is started
- return true;
-
- case R.id.action_about:
- View view = LayoutInflater.from(this).inflate(R.layout.about, null);
-
- String versionName = Utils.getVersionName(this);
- if (versionName != null) {
- ((TextView) view.findViewById(R.id.version)).setText(versionName);
- }
-
- AlertDialog alrt = new AlertDialog.Builder(this).setView(view).create();
- alrt.setTitle(R.string.about_title);
- alrt.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.ok),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int whichButton) {
- }
- });
- alrt.show();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-
- switch (requestCode) {
- case REQUEST_PREFS:
- // The automatic update settings may have changed, so reschedule (or
- // unschedule) the service accordingly. It's cheap, so no need to
- // check if the particular setting has actually been changed.
- UpdateService.schedule(getBaseContext());
-
- if ((resultCode & PreferencesActivity.RESULT_RESTART) != 0) {
- ((FDroidApp) getApplication()).reloadTheme();
- final Intent intent = getIntent();
- overridePendingTransition(0, 0);
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
- finish();
- overridePendingTransition(0, 0);
- startActivity(intent);
- }
- break;
- case REQUEST_ENABLE_BLUETOOTH:
- fdroidApp.sendViaBluetooth(this, resultCode, "org.fdroid.fdroid");
- break;
- }
- }
-
- private void createViews() {
- viewPager = (ViewPager) findViewById(R.id.main_pager);
- adapter = new AppListFragmentPagerAdapter(this);
- viewPager.setAdapter(adapter);
- viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
- @Override
- public void onPageSelected(int position) {
- getTabManager().selectTab(position);
- }
- });
- }
-
- @NonNull
- private TabManager getTabManager() {
- if (tabManager == null) {
- tabManager = new TabManager(this, viewPager);
- }
- return tabManager;
- }
-
- private void refreshUpdateTabLabel() {
- getTabManager().refreshTabLabel(TabManager.INDEX_CAN_UPDATE);
- getTabManager().refreshTabLabel(TabManager.INDEX_INSTALLED);
- }
-
- public void removeNotification(int id) {
- NotificationManager nMgr = (NotificationManager) getBaseContext()
- .getSystemService(Context.NOTIFICATION_SERVICE);
- nMgr.cancel(id);
- }
-
- @Override
- public boolean onQueryTextSubmit(String query) {
- searchView.clearFocus();
- return true;
- }
-
- @Override
- public boolean onQueryTextChange(String newText) {
- adapter.updateSearchQuery(newText);
- return true;
- }
-
- private class AppObserver extends ContentObserver {
-
- AppObserver() {
- super(null);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- FDroid.this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- refreshUpdateTabLabel();
- }
- });
- }
-
- @Override
- public void onChange(boolean selfChange) {
- onChange(selfChange, null);
- }
-
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java
index 79ac07f55..0da1f339c 100644
--- a/app/src/main/java/org/fdroid/fdroid/Preferences.java
+++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java
@@ -312,7 +312,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
}
/**
- * This is cached as it is called several times inside the AppListAdapter.
+ * 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_ROOTED.
@@ -326,7 +326,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
}
/**
- * This is cached as it is called several times inside the AppListAdapter.
+ * 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_HIDE_ANTI_FEATURE_APPS.
diff --git a/app/src/main/java/org/fdroid/fdroid/PreferencesActivity.java b/app/src/main/java/org/fdroid/fdroid/PreferencesActivity.java
deleted file mode 100644
index 82a1559c1..000000000
--- a/app/src/main/java/org/fdroid/fdroid/PreferencesActivity.java
+++ /dev/null
@@ -1,74 +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 android.os.Build;
-import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.NavUtils;
-import android.support.v7.app.AppCompatActivity;
-import android.view.MenuItem;
-import android.widget.LinearLayout;
-
-import org.fdroid.fdroid.views.fragments.PreferencesFragment;
-
-public class PreferencesActivity extends AppCompatActivity {
-
- public static final int RESULT_RESTART = 4;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- ((FDroidApp) getApplication()).applyTheme(this);
- super.onCreate(savedInstanceState);
-
- FragmentManager fm = getSupportFragmentManager();
- if (fm.findFragmentById(android.R.id.content) == null) {
- // Need to set a dummy view (which will get overridden by the fragment manager
- // below) so that we can call setContentView(). This is a work around for
- // a (bug?) thing in 3.0, 3.1 which requires setContentView to be invoked before
- // the actionbar is played with:
- // http://blog.perpetumdesign.com/2011/08/strange-case-of-dr-action-and-mr-bar.html
- if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT <= 13) {
- setContentView(new LinearLayout(this));
- }
-
- PreferencesFragment preferencesFragment = new PreferencesFragment();
- fm.beginTransaction()
- .add(android.R.id.content, preferencesFragment)
- .commit();
- }
-
- // Actionbar cannot be accessed until after setContentView (on 3.0 and 3.1 devices)
- // see: http://blog.perpetumdesign.com/2011/08/strange-case-of-dr-action-and-mr-bar.html
- // for reason why.
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- NavUtils.navigateUpFromSameTask(this);
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/compat/ArrayAdapterCompat.java b/app/src/main/java/org/fdroid/fdroid/compat/ArrayAdapterCompat.java
deleted file mode 100644
index befe7974e..000000000
--- a/app/src/main/java/org/fdroid/fdroid/compat/ArrayAdapterCompat.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.fdroid.fdroid.compat;
-
-import android.annotation.TargetApi;
-import android.os.Build;
-import android.widget.ArrayAdapter;
-
-import java.util.List;
-
-public class ArrayAdapterCompat {
-
- @TargetApi(11)
- public static void addAll(ArrayAdapter adapter, List list) {
- if (Build.VERSION.SDK_INT >= 11) {
- adapter.addAll(list);
- } else {
- for (T category : list) {
- adapter.add(category);
- }
- }
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/compat/TabManager.java b/app/src/main/java/org/fdroid/fdroid/compat/TabManager.java
deleted file mode 100644
index dc467c951..000000000
--- a/app/src/main/java/org/fdroid/fdroid/compat/TabManager.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.fdroid.fdroid.compat;
-
-import android.content.res.Configuration;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.view.ViewPager;
-import android.support.v7.app.ActionBar;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Spinner;
-
-import org.fdroid.fdroid.FDroid;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TabManager {
-
- public static final int INDEX_AVAILABLE = 0;
- public static final int INDEX_INSTALLED = 1;
- public static final int INDEX_CAN_UPDATE = 2;
- public static final int INDEX_COUNT = 3;
-
- private final ViewPager pager;
- private final FDroid parent;
- private final ActionBar actionBar;
- private Spinner actionBarSpinner;
-
- // Used to make sure we only search for the action bar spinner once
- // in each orientation.
- private boolean dirtyConfig = true;
-
- public TabManager(FDroid parent, ViewPager pager) {
- actionBar = parent.getSupportActionBar();
- this.parent = parent;
- this.pager = pager;
- }
-
- private CharSequence getLabel(int index) {
- return pager.getAdapter().getPageTitle(index);
- }
-
- private void removeNotification(int id) {
- parent.removeNotification(id);
- }
-
- public void createTabs() {
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- for (int i = 0; i < pager.getAdapter().getCount(); i++) {
- CharSequence label = pager.getAdapter().getPageTitle(i);
- actionBar.addTab(
- actionBar.newTab()
- .setText(label)
- .setTabListener(new ActionBar.TabListener() {
- @Override
- public void onTabSelected(ActionBar.Tab tab,
- FragmentTransaction ft) {
- int pos = tab.getPosition();
- pager.setCurrentItem(pos);
- if (pos == INDEX_CAN_UPDATE) {
- removeNotification(1);
- }
- }
-
- @Override
- public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
- }
-
- @Override
- public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
- }
- })
- );
- }
- }
-
- public void selectTab(int index) {
- actionBar.setSelectedNavigationItem(index);
- Spinner actionBarSpinner = getActionBarSpinner();
- if (actionBarSpinner != null) {
- actionBarSpinner.setSelection(index);
- }
- if (index == INDEX_CAN_UPDATE) {
- removeNotification(1);
- }
- }
-
- public void refreshTabLabel(int index) {
- CharSequence text = getLabel(index);
- actionBar.getTabAt(index).setText(text);
- }
-
- public void onConfigurationChanged(Configuration newConfig) {
- dirtyConfig = true;
- }
-
- /**
- * Traversing the view hierarchy is a non-trivial task, and takes between 0 and 3
- * milliseconds on my SGS i9000 (Android 4.2).
- * As such, we lazily try to identify the spinner, and only search once per
- * orientation change. Once we've found it, we stop looking.
- */
- private Spinner getActionBarSpinner() {
- if (actionBarSpinner == null && dirtyConfig) {
- dirtyConfig = false;
- actionBarSpinner = findActionBarSpinner();
- }
- return actionBarSpinner;
- }
-
- /**
- * Dodgey hack to fix issue 231, based on the solution at
- * http://stackoverflow.com/a/13353493
- * Turns out that there is a bug in Android where the Spinner in the action
- * bar (which represents the tabs if there is not enough space) is not
- * updated when we call setSelectedNavigationItem(), and they don't expose
- * the spinner via the API. So we go on a merry hunt for all spinners in
- * our view, and find the first one with an id of -1.
- *
- * This is because the view hierarchy dictates that the action bar comes
- * before everything below it when traversing children, and also our spinner
- * on the first view (for the app categories) has an id, whereas the
- * actionbar one doesn't. If that changes in future releases of android,
- * then we will need to update the findListNavigationSpinner() method.
- */
- private Spinner findActionBarSpinner() {
- View rootView = parent.findViewById(android.R.id.content).getRootView();
- List spinners = traverseViewChildren((ViewGroup) rootView);
- return findListNavigationSpinner(spinners);
- }
-
- private Spinner findListNavigationSpinner(List spinners) {
- Spinner spinner = null;
- if (spinners.size() > 0) {
- Spinner first = spinners.get(0);
- if (first.getId() == -1) {
- spinner = first;
- }
- }
- return spinner;
- }
-
- private List traverseViewChildren(ViewGroup parent) {
- List spinners = new ArrayList<>();
- for (int i = 0; i < parent.getChildCount(); i++) {
- View child = parent.getChildAt(i);
- if (child instanceof Spinner) {
- spinners.add((Spinner) child);
- } else if (child instanceof ViewGroup) {
- spinners.addAll(traverseViewChildren((ViewGroup) child));
- }
- }
- return spinners;
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java
index df1474543..d79405c79 100644
--- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java
+++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java
@@ -53,20 +53,6 @@ public class AppProvider extends FDroidProvider {
private Helper() { }
- public static int count(Context context, Uri uri) {
- final String[] projection = {Cols._COUNT};
- Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
- int count = 0;
- if (cursor != null) {
- if (cursor.getCount() == 1) {
- cursor.moveToFirst();
- count = cursor.getInt(0);
- }
- cursor.close();
- }
- return count;
- }
-
public static List all(ContentResolver resolver) {
return all(resolver, Cols.ALL);
}
@@ -367,8 +353,6 @@ public class AppProvider extends FDroidProvider {
private static final String PATH_INSTALLED = "installed";
private static final String PATH_CAN_UPDATE = "canUpdate";
private static final String PATH_SEARCH = "search";
- private static final String PATH_SEARCH_INSTALLED = "searchInstalled";
- private static final String PATH_SEARCH_CAN_UPDATE = "searchCanUpdate";
private static final String PATH_SEARCH_REPO = "searchRepo";
protected static final String PATH_APPS = "apps";
protected static final String PATH_SPECIFIC_APP = "app";
@@ -389,9 +373,7 @@ public class AppProvider extends FDroidProvider {
private static final int CALC_SUGGESTED_APKS = CATEGORY + 1;
private static final int REPO = CALC_SUGGESTED_APKS + 1;
private static final int SEARCH_REPO = REPO + 1;
- private static final int SEARCH_INSTALLED = SEARCH_REPO + 1;
- private static final int SEARCH_CAN_UPDATE = SEARCH_INSTALLED + 1;
- private static final int HIGHEST_PRIORITY = SEARCH_CAN_UPDATE + 1;
+ private static final int HIGHEST_PRIORITY = SEARCH_REPO + 1;
private static final int CALC_PREFERRED_METADATA = HIGHEST_PRIORITY + 1;
private static final int TOP_FROM_CATEGORY = CALC_PREFERRED_METADATA + 1;
@@ -402,8 +384,6 @@ public class AppProvider extends FDroidProvider {
MATCHER.addURI(getAuthority(), PATH_CATEGORY + "/*", CATEGORY);
MATCHER.addURI(getAuthority(), PATH_SEARCH + "/*/*", SEARCH_TEXT_AND_CATEGORIES);
MATCHER.addURI(getAuthority(), PATH_SEARCH + "/*", SEARCH_TEXT);
- MATCHER.addURI(getAuthority(), PATH_SEARCH_INSTALLED + "/*", SEARCH_INSTALLED);
- MATCHER.addURI(getAuthority(), PATH_SEARCH_CAN_UPDATE + "/*", SEARCH_CAN_UPDATE);
MATCHER.addURI(getAuthority(), PATH_SEARCH_REPO + "/*/*", SEARCH_REPO);
MATCHER.addURI(getAuthority(), PATH_REPO + "/#", REPO);
MATCHER.addURI(getAuthority(), PATH_CAN_UPDATE, CAN_UPDATE);
@@ -456,10 +436,6 @@ public class AppProvider extends FDroidProvider {
.build();
}
- public static Uri getContentUri(App app) {
- return getContentUri(app.packageName);
- }
-
/**
* @see AppProvider.Helper#findSpecificApp(ContentResolver, String, long, String[]) for details
* of why you should usually prefer {@link AppProvider#getHighestPriorityMetadataUri(String)} to
@@ -481,10 +457,6 @@ public class AppProvider extends FDroidProvider {
.build();
}
- public static Uri getContentUri(String packageName) {
- return Uri.withAppendedPath(getContentUri(), packageName);
- }
-
public static Uri getSearchUri(String query, @Nullable String category) {
if (TextUtils.isEmpty(query) && TextUtils.isEmpty(category)) {
// Return all the things for an empty search.
@@ -504,22 +476,6 @@ public class AppProvider extends FDroidProvider {
return builder.build();
}
- public static Uri getSearchInstalledUri(String query) {
- return getContentUri()
- .buildUpon()
- .appendPath(PATH_SEARCH_INSTALLED)
- .appendPath(query)
- .build();
- }
-
- public static Uri getSearchCanUpdateUri(String query) {
- return getContentUri()
- .buildUpon()
- .appendPath(PATH_SEARCH_CAN_UPDATE)
- .appendPath(query)
- .build();
- }
-
public static Uri getSearchUri(Repo repo, String query) {
return getContentUri().buildUpon()
.appendPath(PATH_SEARCH_REPO)
@@ -761,16 +717,6 @@ public class AppProvider extends FDroidProvider {
includeSwap = false;
break;
- case SEARCH_INSTALLED:
- selection = querySearch(uri.getLastPathSegment()).add(queryInstalled());
- includeSwap = false;
- break;
-
- case SEARCH_CAN_UPDATE:
- selection = querySearch(uri.getLastPathSegment()).add(queryCanUpdate());
- includeSwap = false;
- break;
-
case SEARCH_REPO:
selection = selection
.add(querySearch(pathSegments.get(2)))
diff --git a/app/src/main/java/org/fdroid/fdroid/data/CategoryProvider.java b/app/src/main/java/org/fdroid/fdroid/data/CategoryProvider.java
index 59836d8b2..c68440abf 100644
--- a/app/src/main/java/org/fdroid/fdroid/data/CategoryProvider.java
+++ b/app/src/main/java/org/fdroid/fdroid/data/CategoryProvider.java
@@ -1,6 +1,5 @@
package org.fdroid.fdroid.data;
-import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
@@ -8,17 +7,12 @@ import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
-import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.Schema.CatJoinTable;
import org.fdroid.fdroid.data.Schema.CategoryTable;
import org.fdroid.fdroid.data.Schema.AppMetadataTable;
import org.fdroid.fdroid.data.Schema.PackageTable;
import org.fdroid.fdroid.data.Schema.CategoryTable.Cols;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
public class CategoryProvider extends FDroidProvider {
public static final class Helper {
@@ -53,47 +47,6 @@ public class CategoryProvider extends FDroidProvider {
cursor.close();
}
}
-
- public static String getCategoryAll(Context context) {
- return context.getString(R.string.category_All);
- }
-
- public static String getCategoryWhatsNew(Context context) {
- return context.getString(R.string.category_Whats_New);
- }
-
- public static String getCategoryRecentlyUpdated(Context context) {
- return context.getString(R.string.category_Recently_Updated);
- }
-
- public static List categories(Context context) {
- final ContentResolver resolver = context.getContentResolver();
- final Uri uri = CategoryProvider.getAllCategories();
- final String[] projection = {Cols.NAME};
- final Cursor cursor = resolver.query(uri, projection, null, null, null);
- List categories = new ArrayList<>(30);
- if (cursor != null) {
- if (cursor.getCount() > 0) {
- cursor.moveToFirst();
- while (!cursor.isAfterLast()) {
- final String name = cursor.getString(0);
- categories.add(name);
- cursor.moveToNext();
- }
- }
- cursor.close();
- }
- Collections.sort(categories);
-
- // Populate the category list with the real categories, and the
- // locally generated meta-categories for "What's New", "Recently
- // Updated" and "All"...
- categories.add(0, getCategoryAll(context));
- categories.add(0, getCategoryRecentlyUpdated(context));
- categories.add(0, getCategoryWhatsNew(context));
-
- return categories;
- }
}
private class Query extends QueryBuilder {
diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/views/AppSecurityPermissions.java b/app/src/main/java/org/fdroid/fdroid/privileged/views/AppSecurityPermissions.java
index 74176e9f4..06d703b63 100644
--- a/app/src/main/java/org/fdroid/fdroid/privileged/views/AppSecurityPermissions.java
+++ b/app/src/main/java/org/fdroid/fdroid/privileged/views/AppSecurityPermissions.java
@@ -415,7 +415,7 @@ public class AppSecurityPermissions {
|| ((pInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0);
// Dangerous and normal permissions are always shown to the user
- // this is matches the permission list in AppDetails
+ // this is matches the permission list in AppDetails2
if (isNormal || isDangerous) {
return true;
}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppListAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppListAdapter.java
deleted file mode 100644
index 98cfac28c..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/AppListAdapter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package org.fdroid.fdroid.views;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.support.v4.widget.CursorAdapter;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.nostra13.universalimageloader.core.DisplayImageOptions;
-import com.nostra13.universalimageloader.core.ImageLoader;
-
-import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.Utils;
-import org.fdroid.fdroid.data.App;
-
-public abstract class AppListAdapter extends CursorAdapter {
-
- private LayoutInflater inflater;
- private DisplayImageOptions displayImageOptions;
- private String upgradeFromTo;
-
- @SuppressWarnings("deprecation")
- public AppListAdapter(Context context, Cursor c) {
- super(context, c);
- init(context);
- }
-
- @Override
- public boolean isEmpty() {
- return mDataValid && super.isEmpty();
- }
-
- public AppListAdapter(Context context, Cursor c, boolean autoRequery) {
- super(context, c, autoRequery);
- init(context);
- }
-
- public AppListAdapter(Context context, Cursor c, int flags) {
- super(context, c, flags);
- init(context);
- }
-
- private void init(Context context) {
- inflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- displayImageOptions = Utils.getImageLoadingOptions().build();
- upgradeFromTo = context.getResources().getString(R.string.upgrade_from_to);
- }
-
- protected abstract boolean showStatusUpdate();
-
- protected abstract boolean showStatusInstalled();
-
- private static class ViewHolder {
- TextView name;
- TextView summary;
- TextView status;
- TextView license;
- ImageView icon;
- }
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- View view = inflater.inflate(R.layout.applistitem, parent, false);
-
- ViewHolder holder = new ViewHolder();
- holder.name = (TextView) view.findViewById(R.id.name);
- holder.summary = (TextView) view.findViewById(R.id.summary);
- holder.status = (TextView) view.findViewById(R.id.status);
- holder.license = (TextView) view.findViewById(R.id.license);
- holder.icon = (ImageView) view.findViewById(R.id.icon);
- view.setTag(holder);
-
- setupView(view, cursor, holder);
-
- return view;
- }
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- ViewHolder holder = (ViewHolder) view.getTag();
- setupView(view, cursor, holder);
- }
-
- private void setupView(View view, Cursor cursor, ViewHolder holder) {
- final App app = new App(cursor);
-
- holder.name.setText(app.name);
- holder.summary.setText(app.summary);
-
- ImageLoader.getInstance().displayImage(app.iconUrl, holder.icon,
- displayImageOptions);
-
- holder.status.setText(getVersionInfo(app));
- holder.license.setText(app.license);
-
- // Disable it all if it isn't compatible...
- final View[] views = {
- view,
- holder.status,
- holder.summary,
- holder.license,
- holder.name,
- };
-
- for (View v : views) {
- v.setEnabled(app.compatible && !app.isFiltered());
- }
- }
-
- private String getVersionInfo(App app) {
-
- if (app.suggestedVersionCode <= 0) {
- return null;
- }
-
- if (!app.isInstalled()) {
- return app.getSuggestedVersionName();
- }
-
- final String installedVersionString = app.installedVersionName;
-
- if (app.canAndWantToUpdate(mContext) && showStatusUpdate()) {
- return String.format(upgradeFromTo,
- installedVersionString, app.getSuggestedVersionName());
- }
-
- if (app.installedVersionCode > 0 && showStatusInstalled()) {
- return installedVersionString + " ✔";
- }
-
- return installedVersionString;
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java
deleted file mode 100644
index 59d1d4ec4..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.fdroid.fdroid.views;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentPagerAdapter;
-import android.view.ViewGroup;
-
-import org.fdroid.fdroid.FDroid;
-import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.compat.TabManager;
-import org.fdroid.fdroid.data.AppProvider;
-import org.fdroid.fdroid.views.fragments.AppListFragment;
-import org.fdroid.fdroid.views.fragments.AvailableAppsFragment;
-import org.fdroid.fdroid.views.fragments.CanUpdateAppsFragment;
-import org.fdroid.fdroid.views.fragments.InstalledAppsFragment;
-
-/**
- * Used by the FDroid activity in conjunction with its ViewPager to support
- * swiping of tabs for both old devices (< 3.0) and new devices.
- *
- * See http://stackoverflow.com/a/15261142 for how to obtain references
- * to fragments in order to update them in response to search queries.
- */
-public class AppListFragmentPagerAdapter extends FragmentPagerAdapter {
-
- @NonNull private final FDroid parent;
- @Nullable private String searchQuery;
-
- private final AppListFragment[] registeredFragments = new AppListFragment[TabManager.INDEX_COUNT];
-
- public AppListFragmentPagerAdapter(@NonNull FDroid parent) {
- super(parent.getSupportFragmentManager());
- this.parent = parent;
- }
-
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- AppListFragment fragment = (AppListFragment) super.instantiateItem(container, position);
- fragment.updateSearchQuery(searchQuery);
- registeredFragments[position] = fragment;
- return fragment;
- }
-
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- registeredFragments[position] = null;
- super.destroyItem(container, position, object);
- }
-
- private String getInstalledTabTitle() {
- int installedCount = AppProvider.Helper.count(parent, AppProvider.getInstalledUri());
- return parent.getString(R.string.tab_installed_apps_count, installedCount);
- }
-
- private String getUpdateTabTitle() {
- int updateCount = AppProvider.Helper.count(parent, AppProvider.getCanUpdateUri());
- return parent.getString(R.string.tab_updates_count, updateCount);
- }
-
- /**
- * Changing the search query is quite an expensive operation, so this does some rudimentary
- * checking to see if the two queries are meaningfully different. At present, it trims the
- * strings and does a case insensitive comparison.
- */
- private boolean isSearchQuerySame(String newQuery) {
- String oldValueTrimmed = searchQuery == null ? "" : searchQuery.trim();
- String newValueTrimmed = newQuery == null ? "" : newQuery.trim();
- return oldValueTrimmed.equalsIgnoreCase(newValueTrimmed);
- }
-
- public void updateSearchQuery(@Nullable String query) {
- if (isSearchQuerySame(query)) {
- return;
- }
-
- searchQuery = query;
- for (AppListFragment fragment : registeredFragments) {
- if (fragment != null) {
- fragment.updateSearchQuery(query);
- }
- }
- }
-
- @Override
- public Fragment getItem(int i) {
- switch (i) {
- case TabManager.INDEX_AVAILABLE:
- return new AvailableAppsFragment();
- case TabManager.INDEX_INSTALLED:
- return new InstalledAppsFragment();
- default:
- return new CanUpdateAppsFragment();
- }
- }
-
- @Override
- public int getCount() {
- return TabManager.INDEX_COUNT;
- }
-
- @Override
- public String getPageTitle(int i) {
- switch (i) {
- case TabManager.INDEX_AVAILABLE:
- return parent.getString(R.string.tab_available_apps);
- case TabManager.INDEX_INSTALLED:
- return getInstalledTabTitle();
- case TabManager.INDEX_CAN_UPDATE:
- return getUpdateTabTitle();
- default:
- return "";
- }
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/AvailableAppListAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AvailableAppListAdapter.java
deleted file mode 100644
index e39f67ee1..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/AvailableAppListAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.fdroid.fdroid.views;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.os.Build;
-
-public class AvailableAppListAdapter extends AppListAdapter {
-
- public static AvailableAppListAdapter create(Context context, Cursor cursor, int flags) {
- if (Build.VERSION.SDK_INT >= 11) {
- return new AvailableAppListAdapter(context, cursor, flags);
- }
- return new AvailableAppListAdapter(context, cursor);
- }
-
- private AvailableAppListAdapter(Context context, Cursor c) {
- super(context, c);
- }
-
- public AvailableAppListAdapter(Context context, Cursor c, boolean autoRequery) {
- super(context, c, autoRequery);
- }
-
- private AvailableAppListAdapter(Context context, Cursor c, int flags) {
- super(context, c, flags);
- }
-
- @Override
- protected boolean showStatusUpdate() {
- return true;
- }
-
- @Override
- protected boolean showStatusInstalled() {
- return true;
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java
deleted file mode 100644
index 9578370aa..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.fdroid.fdroid.views;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.os.Build;
-
-public class CanUpdateAppListAdapter extends AppListAdapter {
-
- public static CanUpdateAppListAdapter create(Context context, Cursor cursor, int flags) {
- if (Build.VERSION.SDK_INT >= 11) {
- return new CanUpdateAppListAdapter(context, cursor, flags);
- }
- return new CanUpdateAppListAdapter(context, cursor);
- }
-
- private CanUpdateAppListAdapter(Context context, Cursor c) {
- super(context, c);
- }
-
- public CanUpdateAppListAdapter(Context context, Cursor c, boolean autoRequery) {
- super(context, c, autoRequery);
- }
-
- private CanUpdateAppListAdapter(Context context, Cursor c, int flags) {
- super(context, c, flags);
- }
-
- @Override
- protected boolean showStatusUpdate() {
- return true;
- }
-
- @Override
- protected boolean showStatusInstalled() {
- return false;
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/InstalledAppListAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/InstalledAppListAdapter.java
deleted file mode 100644
index 4c97ecc9e..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/InstalledAppListAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.fdroid.fdroid.views;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.os.Build;
-
-public class InstalledAppListAdapter extends AppListAdapter {
-
- public static InstalledAppListAdapter create(Context context, Cursor cursor, int flags) {
- if (Build.VERSION.SDK_INT >= 11) {
- return new InstalledAppListAdapter(context, cursor, flags);
- }
- return new InstalledAppListAdapter(context, cursor);
- }
-
- private InstalledAppListAdapter(Context context, Cursor c) {
- super(context, c);
- }
-
- public InstalledAppListAdapter(Context context, Cursor c, boolean autoRequery) {
- super(context, c, autoRequery);
- }
-
- private InstalledAppListAdapter(Context context, Cursor c, int flags) {
- super(context, c, flags);
- }
-
- @Override
- protected boolean showStatusUpdate() {
- return true;
- }
-
- @Override
- protected boolean showStatusInstalled() {
- return false;
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java b/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java
index dcc435adb..4a58aeac2 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/RepoDetailsActivity.java
@@ -147,7 +147,7 @@ public class RepoDetailsActivity extends ActionBarActivity {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver,
new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
- // FDroid.java and AppDetails set different NFC actions, so reset here
+ // FDroid.java and AppDetails2 set different NFC actions, so reset here
setNfc();
processIntent(getIntent());
}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java
deleted file mode 100644
index d156933a3..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package org.fdroid.fdroid.views.fragments;
-
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.app.ListFragment;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.support.v4.util.Pair;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.TextView;
-
-import org.fdroid.fdroid.AppDetails;
-import org.fdroid.fdroid.AppDetails2;
-import org.fdroid.fdroid.Preferences;
-import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.UpdateService;
-import org.fdroid.fdroid.Utils;
-import org.fdroid.fdroid.data.App;
-import org.fdroid.fdroid.data.Schema.AppMetadataTable;
-import org.fdroid.fdroid.views.AppListAdapter;
-
-public abstract class AppListFragment extends ListFragment implements
- AdapterView.OnItemClickListener,
- AdapterView.OnItemLongClickListener,
- Preferences.ChangeListener,
- LoaderManager.LoaderCallbacks {
-
- private static final String TAG = "AppListFragment";
-
- private static final int REQUEST_APPDETAILS = 0;
-
- private static final String[] APP_PROJECTION = {
- AppMetadataTable.Cols._ID, // Required for cursor loader to work.
- AppMetadataTable.Cols.Package.PACKAGE_NAME,
- AppMetadataTable.Cols.NAME,
- AppMetadataTable.Cols.SUMMARY,
- AppMetadataTable.Cols.IS_COMPATIBLE,
- AppMetadataTable.Cols.LICENSE,
- AppMetadataTable.Cols.ICON,
- AppMetadataTable.Cols.ICON_URL,
- AppMetadataTable.Cols.InstalledApp.VERSION_CODE,
- AppMetadataTable.Cols.InstalledApp.VERSION_NAME,
- AppMetadataTable.Cols.SuggestedApk.VERSION_NAME,
- AppMetadataTable.Cols.SUGGESTED_VERSION_CODE,
- AppMetadataTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root.
- AppMetadataTable.Cols.ANTI_FEATURES, // Needed for filtering apps that require anti-features.
- };
-
- private static final String APP_SORT = AppMetadataTable.Cols.NAME;
-
- private AppListAdapter appAdapter;
-
- @Nullable private String searchQuery;
-
- protected abstract AppListAdapter getAppListAdapter();
-
- protected abstract String getFromTitle();
-
- protected abstract Uri getDataUri();
-
- protected abstract Uri getDataUri(String query);
-
- protected abstract int getEmptyMessage();
-
- protected abstract int getNoSearchResultsMessage();
-
- /**
- * Subclasses can choose to do different things based on when a user begins searching.
- * For example, the "Available" tab chooses to hide its category spinner to make it clear
- * that it is searching all apps, not the current category.
- * NOTE: This will get called multiple times, every time the user changes the
- * search query.
- */
- void onSearch() {
- // Do nothing by default.
- }
-
- /**
- * Alerts the child class that the user is no longer performing a search.
- * This is triggered every time the search query is blank.
- *
- * @see AppListFragment#onSearch()
- */
- protected void onSearchStopped() {
- // Do nothing by default.
- }
-
- /**
- * Utility function to set empty view text which should be different
- * depending on whether search is active or not.
- */
- private void setEmptyText(int resId) {
- ((TextView) getListView().getEmptyView()).setText(resId);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- // Can't do this in the onCreate view, because "onCreateView" which
- // returns the list view is "called between onCreate and
- // onActivityCreated" according to the docs.
- getListView().setOnItemClickListener(this);
- getListView().setOnItemLongClickListener(this);
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- //Starts a new or restarts an existing Loader in this manager
- getLoaderManager().initLoader(0, null, this);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- appAdapter = getAppListAdapter();
-
- if (appAdapter.getCount() == 0) {
- updateEmptyRepos();
- }
-
- setListAdapter(appAdapter);
- }
-
- /**
- * The first time the app is run, we will have an empty app list.
- * If this is the case, we will attempt to update with the default repo.
- * However, if we have tried this at least once, then don't try to do
- * it automatically again, because the repos or internet connection may
- * be bad.
- */
- private boolean updateEmptyRepos() {
- Preferences prefs = Preferences.get();
- if (!prefs.hasTriedEmptyUpdate()) {
- Utils.debugLog(TAG, "Empty app list, and we haven't done an update yet. Forcing repo update.");
- prefs.setTriedEmptyUpdate(true);
- UpdateService.updateNow(getActivity());
- return true;
- }
- Utils.debugLog(TAG, "Empty app list, but it looks like we've had an update previously. Will not force repo update.");
- return false;
- }
-
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- showItemDetails(view, position, false);
- }
-
- @Override
- public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
- showItemDetails(view, position, true);
- return true;
- }
-
- private void showItemDetails(View view, int position, boolean useNewDetailsActivity) {
- // Cursor is null in the swap list when touching the first item.
- Cursor cursor = (Cursor) getListView().getItemAtPosition(position);
- if (cursor != null) {
- final App app = new App(cursor);
- Intent intent = getAppDetailsIntent(useNewDetailsActivity);
- intent.putExtra(AppDetails2.EXTRA_APPID, app.packageName);
- intent.putExtra(AppDetails.EXTRA_FROM, getFromTitle());
- if (Build.VERSION.SDK_INT >= 21) {
- Pair iconTransitionPair = Pair.create(view.findViewById(R.id.icon),
- getString(R.string.transition_app_item_icon));
- Bundle bundle = ActivityOptionsCompat
- .makeSceneTransitionAnimation(getActivity(),
- iconTransitionPair)
- .toBundle();
- startActivityForResult(intent, REQUEST_APPDETAILS, bundle);
- } else {
- startActivityForResult(intent, REQUEST_APPDETAILS);
- }
- }
- }
-
- private Intent getAppDetailsIntent(boolean useNewDetailsActivity) {
- return new Intent(getActivity(), useNewDetailsActivity ? AppDetails2.class : AppDetails.class);
- }
-
- @Override
- public void onPreferenceChange() {
- getAppListAdapter().notifyDataSetChanged();
- }
-
- @Override
- public void onLoadFinished(Loader loader, Cursor data) {
- appAdapter.swapCursor(data);
- }
-
- @Override
- public void onLoaderReset(Loader loader) {
- appAdapter.swapCursor(null);
- }
-
- @Override
- public Loader onCreateLoader(int id, Bundle args) {
- Uri uri = updateSearchStatus() ? getDataUri(searchQuery) : getDataUri();
- return new CursorLoader(
- getActivity(), uri, APP_PROJECTION, null, null, APP_SORT);
- }
-
- /**
- * Notifies the subclass via {@link AppListFragment#onSearch()} and {@link AppListFragment#onSearchStopped()}
- * about whether or not a search is taking place and changes empty message
- * appropriately.
- *
- * @return True if a user is searching.
- */
- private boolean updateSearchStatus() {
- if (TextUtils.isEmpty(searchQuery)) {
- onSearchStopped();
- setEmptyText(getEmptyMessage());
- return false;
- }
- onSearch();
- setEmptyText(getNoSearchResultsMessage());
- return true;
- }
-
- public void updateSearchQuery(@Nullable String query) {
- if (!TextUtils.equals(query, searchQuery)) {
- searchQuery = query;
- if (isAdded()) {
- getLoaderManager().restartLoader(0, null, this);
- }
- }
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java
deleted file mode 100644
index ce495b2e8..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package org.fdroid.fdroid.views.fragments;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.support.annotation.Nullable;
-import android.support.v4.app.LoaderManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.Spinner;
-
-import org.fdroid.fdroid.Preferences;
-import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.Utils;
-import org.fdroid.fdroid.compat.ArrayAdapterCompat;
-import org.fdroid.fdroid.compat.CursorAdapterCompat;
-import org.fdroid.fdroid.data.AppProvider;
-import org.fdroid.fdroid.data.CategoryProvider;
-import org.fdroid.fdroid.views.AppListAdapter;
-import org.fdroid.fdroid.views.AvailableAppListAdapter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class AvailableAppsFragment extends AppListFragment implements
- LoaderManager.LoaderCallbacks {
-
- private static final String TAG = "AvailableAppsFragment";
-
- private static final String PREFERENCES_FILE = "CategorySpinnerPosition";
- private static final String CATEGORY_KEY = "Selection";
- private static String defaultCategory;
-
- private List categories;
-
- @Nullable
- private View categoryWrapper;
-
- @Nullable
- private Spinner categorySpinner;
- private String currentCategory;
- private AppListAdapter adapter;
-
- @Override
- protected String getFromTitle() {
- return getString(R.string.tab_available_apps);
- }
-
- @Override
- protected AppListAdapter getAppListAdapter() {
- if (adapter == null) {
- final AppListAdapter a = AvailableAppListAdapter.create(getActivity(), null, CursorAdapterCompat.FLAG_AUTO_REQUERY);
- Preferences.get().registerUpdateHistoryListener(new Preferences.ChangeListener() {
- @Override
- public void onPreferenceChange() {
- a.notifyDataSetChanged();
- }
- });
- adapter = a;
- }
- return adapter;
- }
-
- private class CategoryObserver extends ContentObserver {
-
- private final ArrayAdapter adapter;
-
- CategoryObserver(ArrayAdapter adapter) {
- // Using Looper.getMainLooper() ensures that the onChange method is run on the main thread.
- super(new Handler(Looper.getMainLooper()));
- this.adapter = adapter;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- final Activity activity = getActivity();
- if (!isAdded() || adapter == null || activity == null) {
- return;
- }
-
- // Because onChange is always invoked on the main thread (see constructor), we want to
- // run the database query on a background thread. Afterwards, the UI is updated
- // on a foreground thread.
- new AsyncTask>() {
- @Override
- protected List doInBackground(Void... params) {
- return CategoryProvider.Helper.categories(activity);
- }
-
- @Override
- protected void onPostExecute(List loadedCategories) {
- adapter.clear();
- categories = loadedCategories;
- ArrayAdapterCompat.addAll(adapter, translateCategories(activity, loadedCategories));
- }
- }.execute();
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- onChange(selfChange);
- }
- }
-
- /**
- * Attempt to translate category names with fallback to default name if no translation available
- */
- private static List translateCategories(Context context, List categories) {
- List translatedCategories = new ArrayList<>(categories.size());
- Resources res = context.getResources();
- String pkgName = context.getPackageName();
- for (String category : categories) {
- String resId = category.replace(" & ", "_").replace(" ", "_").replace("'", "");
- int id = res.getIdentifier("category_" + resId, "string", pkgName);
- translatedCategories.add(id == 0 ? category : context.getString(id));
- }
- return translatedCategories;
- }
-
- private Spinner setupCategorySpinner(Spinner spinner) {
-
- categorySpinner = spinner;
- categorySpinner.setId(R.id.category_spinner);
-
- categories = CategoryProvider.Helper.categories(getActivity());
-
- ArrayAdapter adapter = new ArrayAdapter<>(
- getActivity(), android.R.layout.simple_spinner_item, translateCategories(getActivity(), categories));
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- categorySpinner.setAdapter(adapter);
-
- getActivity().getContentResolver().registerContentObserver(
- AppProvider.getContentUri(), false, new CategoryObserver(adapter));
-
- categorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView> parent, View view, int pos, long id) {
- getListView().setSelection(0);
- setCurrentCategory(categories.get(pos));
- }
-
- @Override
- public void onNothingSelected(AdapterView> parent) {
- setCurrentCategory(null);
- }
- });
- return categorySpinner;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.available_app_list, container, false);
-
- categoryWrapper = view.findViewById(R.id.category_wrapper);
- setupCategorySpinner((Spinner) view.findViewById(R.id.category_spinner));
- defaultCategory = CategoryProvider.Helper.getCategoryWhatsNew(getActivity());
-
- return view;
- }
-
- @Override
- protected Uri getDataUri() {
- if (currentCategory == null || currentCategory.equals(CategoryProvider.Helper.getCategoryAll(getActivity()))) {
- return AppProvider.getContentUri();
- }
- if (currentCategory.equals(CategoryProvider.Helper.getCategoryRecentlyUpdated(getActivity()))) {
- return AppProvider.getRecentlyUpdatedUri();
- }
- if (currentCategory.equals(CategoryProvider.Helper.getCategoryWhatsNew(getActivity()))) {
- // Removed this feature in the new UI. this fragment will be gone soon so not implementing it again.
- // return AppProvider.getNewlyAddedUri();
- return AppProvider.getRecentlyUpdatedUri();
- }
- return AppProvider.getCategoryUri(currentCategory);
- }
-
- @Override
- protected Uri getDataUri(String query) {
- return AppProvider.getSearchUri(query, null);
- }
-
- @Override
- protected int getEmptyMessage() {
- return R.string.empty_available_app_list;
- }
-
- @Override
- protected int getNoSearchResultsMessage() {
- return R.string.empty_search_available_app_list;
- }
-
- private void setCurrentCategory(String category) {
- currentCategory = category;
- Utils.debugLog(TAG, "Category '" + currentCategory + "' selected.");
- getLoaderManager().restartLoader(0, null, this);
- }
-
- @Override
- public void onResume() {
- /* restore the saved Category Spinner position */
- Activity activity = getActivity();
- SharedPreferences p = activity.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE);
- currentCategory = p.getString(CATEGORY_KEY, defaultCategory);
-
- if (categorySpinner != null) {
- for (int i = 0; i < categorySpinner.getCount(); i++) {
- if (currentCategory.equals(categorySpinner.getItemAtPosition(i).toString())) {
- categorySpinner.setSelection(i);
- break;
- }
- }
- }
-
- setCurrentCategory(currentCategory);
- super.onResume();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- /* store the Category Spinner position for when we come back */
- SharedPreferences p = getActivity().getSharedPreferences(PREFERENCES_FILE,
- Context.MODE_PRIVATE);
- SharedPreferences.Editor e = p.edit();
- e.putString(CATEGORY_KEY, currentCategory);
- e.apply();
- }
-
- @Override
- protected void onSearch() {
- if (categoryWrapper != null) {
- categoryWrapper.setVisibility(View.GONE);
- }
- }
-
- @Override
- protected void onSearchStopped() {
- if (categoryWrapper != null) {
- categoryWrapper.setVisibility(View.VISIBLE);
- }
- }
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java
deleted file mode 100644
index 80d5ff11d..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.fdroid.fdroid.views.fragments;
-
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.compat.CursorAdapterCompat;
-import org.fdroid.fdroid.data.AppProvider;
-import org.fdroid.fdroid.views.AppListAdapter;
-import org.fdroid.fdroid.views.CanUpdateAppListAdapter;
-
-public class CanUpdateAppsFragment extends AppListFragment {
-
- @Override
- protected AppListAdapter getAppListAdapter() {
- return CanUpdateAppListAdapter.create(getActivity(), null, CursorAdapterCompat.FLAG_AUTO_REQUERY);
- }
-
- @Override
- protected String getFromTitle() {
- return getString(R.string.tab_updates);
- }
-
- @Override
- protected Uri getDataUri() {
- return AppProvider.getCanUpdateUri();
- }
-
- @Override
- protected Uri getDataUri(String query) {
- return AppProvider.getSearchCanUpdateUri(query);
- }
-
- @Override
- protected int getEmptyMessage() {
- return R.string.empty_can_update_app_list;
- }
-
- @Override
- protected int getNoSearchResultsMessage() {
- return R.string.empty_search_can_update_app_list;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- return inflater.inflate(R.layout.can_update_app_list, container, false);
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java
deleted file mode 100644
index 928629e43..000000000
--- a/app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.fdroid.fdroid.views.fragments;
-
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.compat.CursorAdapterCompat;
-import org.fdroid.fdroid.data.AppProvider;
-import org.fdroid.fdroid.views.AppListAdapter;
-import org.fdroid.fdroid.views.InstalledAppListAdapter;
-
-public class InstalledAppsFragment extends AppListFragment {
-
- @Override
- protected AppListAdapter getAppListAdapter() {
- return InstalledAppListAdapter.create(getActivity(), null, CursorAdapterCompat.FLAG_AUTO_REQUERY);
- }
-
- @Override
- protected String getFromTitle() {
- return getString(R.string.tab_installed_apps);
- }
-
- @Override
- protected Uri getDataUri() {
- return AppProvider.getInstalledUri();
- }
-
- @Override
- protected Uri getDataUri(String query) {
- return AppProvider.getSearchInstalledUri(query);
- }
-
- @Override
- protected int getEmptyMessage() {
- return R.string.empty_installed_app_list;
- }
-
- @Override
- protected int getNoSearchResultsMessage() {
- return R.string.empty_search_installed_app_list;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- return inflater.inflate(R.layout.installed_app_list, container, false);
- }
-
-}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java
index c190ac645..14b4b7d51 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java
@@ -17,7 +17,6 @@ import org.fdroid.fdroid.AppDetails2;
import org.fdroid.fdroid.CleanCacheService;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
-import org.fdroid.fdroid.PreferencesActivity;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.installer.InstallHistoryService;
@@ -83,8 +82,6 @@ public class PreferencesFragment extends PreferenceFragment
private void updateSummary(String key, boolean changing) {
- int result = 0;
-
switch (key) {
case Preferences.PREF_UPD_INTERVAL:
ListPreference listPref = (ListPreference) findPreference(
@@ -114,10 +111,7 @@ public class PreferencesFragment extends PreferenceFragment
case Preferences.PREF_THEME:
entrySummary(key);
- if (changing) {
- result |= PreferencesActivity.RESULT_RESTART;
- getActivity().setResult(result);
- }
+ // TODO: Ask MainActivity to restart itself.
break;
case Preferences.PREF_INCOMP_VER:
@@ -147,10 +141,8 @@ public class PreferencesFragment extends PreferenceFragment
case Preferences.PREF_LANGUAGE:
entrySummary(key);
if (changing) {
- result |= PreferencesActivity.RESULT_RESTART;
- Activity activity = getActivity();
- activity.setResult(result);
- ((FDroidApp) activity.getApplication()).updateLanguage();
+ // TODO: Ask MainActivity to restart itself.
+ ((FDroidApp) getActivity().getApplication()).updateLanguage();
}
break;
diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
index 571125aee..1461fc582 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
@@ -147,7 +147,7 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationB
setSelectedMenuInNav();
}
- // AppDetails 2 and RepoDetailsActivity set different NFC actions, so reset here
+ // AppDetails2 and RepoDetailsActivity set different NFC actions, so reset here
NfcHelper.setAndroidBeam(this, getApplication().getPackageName());
checkForAddRepoIntent(getIntent());
}
diff --git a/app/src/main/res/drawable-hdpi/ic_bitcoin.png b/app/src/main/res/drawable-hdpi/ic_bitcoin.png
deleted file mode 100644
index a4869252d..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_bitcoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_clear.png b/app/src/main/res/drawable-hdpi/ic_clear.png
deleted file mode 100644
index 1a9cd75a0..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_clear.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_flattr.png b/app/src/main/res/drawable-hdpi/ic_flattr.png
deleted file mode 100644
index e114f192c..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_flattr.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_help_white.png b/app/src/main/res/drawable-hdpi/ic_help_white.png
deleted file mode 100644
index 5664f9532..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_help_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_litecoin.png b/app/src/main/res/drawable-hdpi/ic_litecoin.png
deleted file mode 100644
index 7996d4e41..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_litecoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_play_arrow_white.png b/app/src/main/res/drawable-hdpi/ic_play_arrow_white.png
deleted file mode 100644
index 57c9fa546..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_play_arrow_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_settings_white.png b/app/src/main/res/drawable-hdpi/ic_settings_white.png
deleted file mode 100644
index 97ded33b5..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_settings_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_stat_notify_updates.png b/app/src/main/res/drawable-hdpi/ic_stat_notify_updates.png
deleted file mode 100644
index f39e443f6..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_stat_notify_updates.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_toc_white.png b/app/src/main/res/drawable-hdpi/ic_toc_white.png
deleted file mode 100644
index bb3adfa89..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_toc_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-ldpi/ic_stat_notify_updates.png b/app/src/main/res/drawable-ldpi/ic_stat_notify_updates.png
deleted file mode 100644
index c0f2718bd..000000000
Binary files a/app/src/main/res/drawable-ldpi/ic_stat_notify_updates.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/feature_placeholder.png b/app/src/main/res/drawable-mdpi/feature_placeholder.png
deleted file mode 100644
index 861559285..000000000
Binary files a/app/src/main/res/drawable-mdpi/feature_placeholder.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_bitcoin.png b/app/src/main/res/drawable-mdpi/ic_bitcoin.png
deleted file mode 100644
index 132166d9d..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_bitcoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_clear.png b/app/src/main/res/drawable-mdpi/ic_clear.png
deleted file mode 100644
index 40a1a84e3..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_clear.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_flattr.png b/app/src/main/res/drawable-mdpi/ic_flattr.png
deleted file mode 100644
index 850d5b949..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_flattr.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_help_white.png b/app/src/main/res/drawable-mdpi/ic_help_white.png
deleted file mode 100644
index db699622b..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_help_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_litecoin.png b/app/src/main/res/drawable-mdpi/ic_litecoin.png
deleted file mode 100644
index 4af36b5ce..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_litecoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_play_arrow_white.png b/app/src/main/res/drawable-mdpi/ic_play_arrow_white.png
deleted file mode 100644
index c61e948bb..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_play_arrow_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_settings_white.png b/app/src/main/res/drawable-mdpi/ic_settings_white.png
deleted file mode 100644
index 8909c3553..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_settings_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_stat_notify_updates.png b/app/src/main/res/drawable-mdpi/ic_stat_notify_updates.png
deleted file mode 100644
index def295299..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_stat_notify_updates.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_toc_white.png b/app/src/main/res/drawable-mdpi/ic_toc_white.png
deleted file mode 100644
index 2a386add0..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_toc_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_bitcoin.png b/app/src/main/res/drawable-xhdpi/ic_bitcoin.png
deleted file mode 100644
index 85144b97c..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_bitcoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_clear.png b/app/src/main/res/drawable-xhdpi/ic_clear.png
deleted file mode 100644
index 6bc437298..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_clear.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_flattr.png b/app/src/main/res/drawable-xhdpi/ic_flattr.png
deleted file mode 100644
index 7bca27f5a..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_flattr.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_help_white.png b/app/src/main/res/drawable-xhdpi/ic_help_white.png
deleted file mode 100644
index 2d11cf47a..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_help_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_litecoin.png b/app/src/main/res/drawable-xhdpi/ic_litecoin.png
deleted file mode 100644
index d4ac66e35..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_litecoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_play_arrow_white.png b/app/src/main/res/drawable-xhdpi/ic_play_arrow_white.png
deleted file mode 100644
index a3c80e73d..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_play_arrow_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_white.png b/app/src/main/res/drawable-xhdpi/ic_settings_white.png
deleted file mode 100644
index 5caedc8e5..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_settings_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_stat_notify_updates.png b/app/src/main/res/drawable-xhdpi/ic_stat_notify_updates.png
deleted file mode 100644
index 1dcf07911..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_stat_notify_updates.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_toc_white.png b/app/src/main/res/drawable-xhdpi/ic_toc_white.png
deleted file mode 100644
index 7563e739c..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_toc_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_bitcoin.png b/app/src/main/res/drawable-xxhdpi/ic_bitcoin.png
deleted file mode 100644
index 688fe1e10..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_bitcoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_clear.png b/app/src/main/res/drawable-xxhdpi/ic_clear.png
deleted file mode 100644
index 51b4401ca..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_clear.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_flattr.png b/app/src/main/res/drawable-xxhdpi/ic_flattr.png
deleted file mode 100644
index 0005048c1..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_flattr.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_help_white.png b/app/src/main/res/drawable-xxhdpi/ic_help_white.png
deleted file mode 100644
index d49181785..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_help_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_litecoin.png b/app/src/main/res/drawable-xxhdpi/ic_litecoin.png
deleted file mode 100644
index 41351fd1a..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_litecoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white.png b/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white.png
deleted file mode 100644
index 547ef30aa..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_white.png b/app/src/main/res/drawable-xxhdpi/ic_settings_white.png
deleted file mode 100644
index eabb0a2ba..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_settings_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_stat_notify_updates.png b/app/src/main/res/drawable-xxhdpi/ic_stat_notify_updates.png
deleted file mode 100644
index 11c7c3e72..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_stat_notify_updates.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_toc_white.png b/app/src/main/res/drawable-xxhdpi/ic_toc_white.png
deleted file mode 100644
index 108a026a9..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_toc_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bitcoin.png b/app/src/main/res/drawable-xxxhdpi/ic_bitcoin.png
deleted file mode 100644
index b443f9e5f..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_bitcoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_clear.png b/app/src/main/res/drawable-xxxhdpi/ic_clear.png
deleted file mode 100644
index df42feecb..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_clear.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_flattr.png b/app/src/main/res/drawable-xxxhdpi/ic_flattr.png
deleted file mode 100644
index 41fc3c830..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_flattr.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_help_white.png b/app/src/main/res/drawable-xxxhdpi/ic_help_white.png
deleted file mode 100644
index 8eb7241da..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_help_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_litecoin.png b/app/src/main/res/drawable-xxxhdpi/ic_litecoin.png
deleted file mode 100644
index f28268c89..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_litecoin.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white.png b/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white.png
deleted file mode 100644
index be5c062b5..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_white.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_white.png
deleted file mode 100644
index 507c5edd4..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_settings_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_stat_notify_updates.png b/app/src/main/res/drawable-xxxhdpi/ic_stat_notify_updates.png
deleted file mode 100644
index a8457c9d0..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_stat_notify_updates.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_toc_white.png b/app/src/main/res/drawable-xxxhdpi/ic_toc_white.png
deleted file mode 100644
index 0ec6e3895..000000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_toc_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable/badge_background.xml b/app/src/main/res/drawable/badge_background.xml
deleted file mode 100644
index b72685b11..000000000
--- a/app/src/main/res/drawable/badge_background.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- -
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/category_chip_background.xml b/app/src/main/res/drawable/category_chip_background.xml
deleted file mode 100644
index fd4ed2ac8..000000000
--- a/app/src/main/res/drawable/category_chip_background.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/download_button.xml b/app/src/main/res/drawable/download_button.xml
deleted file mode 100644
index 4faebbd9f..000000000
--- a/app/src/main/res/drawable/download_button.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_cancel_black_24dp.xml b/app/src/main/res/drawable/ic_cancel_black_24dp.xml
deleted file mode 100644
index 7d2b57eb2..000000000
--- a/app/src/main/res/drawable/ic_cancel_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_download_button.xml b/app/src/main/res/drawable/ic_download_button.xml
deleted file mode 100644
index 562b5f20e..000000000
--- a/app/src/main/res/drawable/ic_download_button.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/layout-land/app_details.xml b/app/src/main/res/layout-land/app_details.xml
deleted file mode 100644
index 56eed3dd8..000000000
--- a/app/src/main/res/layout-land/app_details.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout-v21/app_details_header.xml b/app/src/main/res/layout-v21/app_details_header.xml
deleted file mode 100644
index 447d9dcf1..000000000
--- a/app/src/main/res/layout-v21/app_details_header.xml
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout-v21/applistitem.xml b/app/src/main/res/layout-v21/applistitem.xml
deleted file mode 100644
index 9f45beab6..000000000
--- a/app/src/main/res/layout-v21/applistitem.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/app_details.xml b/app/src/main/res/layout/app_details.xml
deleted file mode 100644
index 6042ddffb..000000000
--- a/app/src/main/res/layout/app_details.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/app_details2.xml b/app/src/main/res/layout/app_details2.xml
index 4e7316d0a..b435f3089 100644
--- a/app/src/main/res/layout/app_details2.xml
+++ b/app/src/main/res/layout/app_details2.xml
@@ -31,7 +31,6 @@
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
- tools:src="@drawable/feature_placeholder"
app:layout_collapseMode="parallax" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/app_details_summary.xml b/app/src/main/res/layout/app_details_summary.xml
deleted file mode 100644
index 6044c330d..000000000
--- a/app/src/main/res/layout/app_details_summary.xml
+++ /dev/null
@@ -1,233 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/applistitem.xml b/app/src/main/res/layout/applistitem.xml
deleted file mode 100644
index aed8e85e0..000000000
--- a/app/src/main/res/layout/applistitem.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/available_app_list.xml b/app/src/main/res/layout/available_app_list.xml
deleted file mode 100644
index e1b35d157..000000000
--- a/app/src/main/res/layout/available_app_list.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/can_update_app_list.xml b/app/src/main/res/layout/can_update_app_list.xml
deleted file mode 100644
index fa7557058..000000000
--- a/app/src/main/res/layout/can_update_app_list.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fdroid.xml b/app/src/main/res/layout/fdroid.xml
deleted file mode 100644
index d7d866c02..000000000
--- a/app/src/main/res/layout/fdroid.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/installed_app_list.xml b/app/src/main/res/layout/installed_app_list.xml
deleted file mode 100644
index 869380928..000000000
--- a/app/src/main/res/layout/installed_app_list.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
deleted file mode 100644
index f988659dd..000000000
--- a/app/src/main/res/menu/main.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
index 37eedd2b4..56fb2d7ec 100644
--- a/app/src/main/res/values-af/strings.xml
+++ b/app/src/main/res/values-af/strings.xml
@@ -75,11 +75,6 @@
Kanselleer
Oorskryf
- Beskikbaar
- Geinstalleer
- Opdaterings
- Geinstalleer (%d)
- Opdaterings (%d)
F-Droid opdaterings beskikbaar
Geen Bluetooth stuur metode gevind, kies een!
Kies Bluetooth stuur metode
@@ -226,13 +221,9 @@ Jy moet
Taal
Stelsel nalaat waarde
- Program simbooltjie
Wi-Fi
Hotspot
- Alle
- Wat\'s nuut
- Onlangs opgedateer
Konnektiwiteit
Ontwikkeling
Speletjies
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index b162d7bc9..ee0a80456 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -20,8 +20,6 @@
إلغاء
تمكين
إضافة مفتاح
- متواجد
- التحديثات
اختيار البلوتوث كطريقة إرسال
إرسال بواسطة البلوتوث
عنوان المستودع
@@ -38,8 +36,6 @@
تجاهل هذا التحديث
الشفرة المصدرية
التبرع
- الكل
- ما الجديد
مستودع محلي
يتم حذف المستودع الحالي…
التالي
@@ -53,7 +49,6 @@
الإسم
غير معروف
حذف المستودع؟
- أيقونة التطبيق
التطوير
الألعاب
الإنترنت
@@ -116,9 +111,6 @@
إلى الخلف
استبدال
- تم التثبيت
- تم التثبيت (%d)
- تحديثات (%d)
تحديثات اف-درويد متوفرة
+%1$d المزيد…
لا توجد طريقة إرسال بلوتوث، فضلاً إختر واحدة !
@@ -230,7 +222,6 @@
شبكة لاسلكية (واي-فاي)
نقاط الإنترنت
- تم تحديثه مؤخرا
الاتصال
الرسومات
نقود
diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml
index d3b1d9d31..a8a495ced 100644
--- a/app/src/main/res/values-ast/strings.xml
+++ b/app/src/main/res/values-ast/strings.xml
@@ -43,8 +43,6 @@
Habilitar
Amestar clave
Sobrescribir
- Disponible
- Anovamientos
Anovamientos de F-Droid disponibles
Nun s\'alcontró dal métodu d\'unviu pente Bluetooth, ¡escueyi ún!
Escueyi\'l métodu d\'unvu pente Bluetooth
@@ -92,9 +90,6 @@
Nun escurez les aplicaciones que rican privilexos root
Inorar pantalla táutil
Inclúi siempres aplicaciones que rican pantalla táutil
- Too
- Qué hai nuevo
- Anovao apocayá
Repositoriu llocal
F-Doid ta tresnáu pa intercambiar
Toca pa ver los detalles y permitir a otros intercambiar les tos aplicaciones.
@@ -148,7 +143,6 @@ rehabilitar esti repositoriu pa instalar aplicaciones dende elli.
De %1$s fasta %2$s
¡El to preséu nun ta na mesma rede Wi-Fi que\'l repositoriu llocal que tas acabante d\'amestar! Tenta de xunite a esta rede: %s
Rique: %1$s
- Iconu d\'aplicación
Desendolcu
Xuegos
Internet
@@ -211,7 +205,6 @@ rehabilitar esti repositoriu pa instalar aplicaciones dende elli.
Enllaces
Atrás
- Instaláu
+%1$d más…
Buelga incorreuta
Esto nun ye una URL válida.
@@ -317,8 +310,6 @@ L\'aplicación nun rique accesu especial dalu.
Camudar contraseña
Nome d\'usuariu baleru, nun se camudaron les credenciales
- Instalaes (%d)
- Anovamientos (%d)
Llicencia
Guardando detalles d\'aplicaciones
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index f5abfab44..37f725313 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -81,11 +81,6 @@
Дадаць ключ
Перазапісаць
- Даступна
- Усталяваныя
- Абнаўленні
- Усталявана (%d)
- Абнаўленні (%d)
Даступны абнаўленні F-Droid
Не знойдзена метада адпраўкі праз Bluetooth, абярыце адзін!
Абраць метад адпраўкі праз Bluetooth
@@ -235,13 +230,9 @@
Мова
Агаданая сістэмная
- Значка праграмы
Wi-Fi
Кропка доступу
- Усе
- Што новага
- Нядаўна абноўленыя
Сувязь
Распрацоўка
Гульні
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index b4ebb534d..a0219cf59 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -40,8 +40,6 @@
Добавяне
Отказ
Добавете ключ
- Налични
- Обновявания
Налични актуализации от F-Droid
Не е намерен Bluetooth метод за изпращане, изберете един!
Изберете Bluetooth метод за изпращане
@@ -84,9 +82,6 @@
Приложенията изискващи Root няма да бъдат изобразявани в сиво
Игнорирай сензорния екран
Приложенията изискващи сензорен екран ще бъдат показвани винаги
- Всички
- Какво ново
- Обновени наскоро
Локално хранилище
Изтриване на хранилището…
Добавяне на %s към хранилището…
@@ -122,7 +117,6 @@
%1$s до %2$s
Вашето устройство не е в една и съща Wi-Fi мрежа с локалното хранилище, което добавихте! Опитайте да се свържете към тази мрежа: %s
Изисква: %1$s
- Икона на приложението
Разработване
Игри
Интернет
@@ -178,7 +172,6 @@
Сваляне…
Изходен код
- Инсталирани
+ още %1$d…
Актуализиране на хранилищата
Инсталирането се провали поради неизвестна грешка
@@ -291,8 +284,6 @@
Включване
Презаписване
- Инсталирани (%d)
- Актуализации (%d)
Хранилище: %s
Изпращане на имейл на създателя
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 401ad6ad7..4fe6b9252 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -42,8 +42,6 @@
Permès
Afegeix clau
Sobreescriu
- Disponible
- Actualitzacions
Hi ha actualitzacions disponibles de l\'F-Droid
Trieu un mètode d\'enviament per Bluetooth!
Envia per Bluetooth
@@ -90,9 +88,6 @@
No marquis en gris aplicacions que requereixen privilegis d\'administrador
Ignora la pantalla tàctil
Inclou sempre aplicacions que requereixin pantalla tàctil
- Tot
- Novetats
- S\'ha actualitzat fa poc
Dipòsit local
F-Droid està a punt per a l\'intercanvi
Toqueu per veure més detalls i permetre l\'intercanvi d\'aplicacions.
@@ -150,7 +145,6 @@ tornar a habilitar el dipòsit per instal·lar aplicacions d\'aquest.
%1$s fins a %2$s
El dipòsit local que acabeu d\'afegir i el vostre dispositiu no són a la mateixa Wi-Fi. Proveu amb aquesta xarxa: %s
Requereix: %1$s
- Icona de l\'aplicació
Desenvolupament
Jocs
Internet
@@ -195,7 +189,6 @@ tornar a habilitar el dipòsit per instal·lar aplicacions d\'aquest.
Desinstal·la
Actualitzacions inestables
- Instal·lades
Bitcoin
Litecoin
Flattr
@@ -322,8 +315,6 @@ es perdran. L\'aplicació no requereix cap accés especial.
Llicència
- (%d) instal·lat
- Actualitzacions (%d)
Desant els detalls de l\'aplicació
Cap coincidència amb les aplicacions instal·lades.
Cap coincidència amb les aplicacions disponibles.
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 3a6d7dc17..957ea00f9 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -39,8 +39,6 @@
Povolit
Přidat klíč
Přepsat
- Dostupné
- Aktualizace
Dostupné aktualizace F-Droid
Poslat přes bluetooth
Adresa repositáře
@@ -74,9 +72,6 @@
Nezašedávat aplikace vyžadující root oprávnění
Ignorovat dotykovou obrazovku
Vždy zahrnovat aplikace vyžadující dotykovou obrazovku
- Vše
- Novinky
- Nedávno aktualizované
Místní repozitář
F-Droid je připraven k výměně
Dotykem zobraz detaily a umožni ostatním si přetáhnout tvé aplikace.
@@ -118,7 +113,6 @@ Pro zobrazení nabízených aplikací je nutné ho nejprve aktualizovat.
%s nebo novější
Vyžaduje: %1$s
- Ikona aplikace
Vývoj
Hry
Internet
@@ -180,7 +174,6 @@ Pro instalaci aplikací z tohoto repozitáře ho bude nejprve třeba znovu povol
Více
Méně
- Nainstalováno
Špatný fingerprint
Nastavení
Bitcoin
@@ -209,8 +202,6 @@ Pro instalaci aplikací z tohoto repozitáře ho bude nejprve třeba znovu povol
Licence
- Nainstalováno (%d)
- Aktualizace (%d)
Tento přístroj není na stejné wifi síti jako právě přidaný místní repozitář! Zkuste se připojit k této síti: %s
Jazyk
Systémové výchozí
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 3082002c7..c6e1aac0f 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -70,11 +70,6 @@
Tilføj Nøgle
Overskriv
- Tilgængelig
- Installeret
- Opdateringer
- Installeret (%d)
- Opdateringer (%d)
F-Droid Opdateringer Tilgængelige
+%1$d flere…
Ingen Bluetooth afsendelsesmetode fundet, vælg en!
@@ -201,13 +196,9 @@ Du skal aktivere det for at se de programmer det har.
Sprog
Systemstandard
- Programikon
Wi-Fi
Hotspot
- Alle
- Hvad er Nyt
- Nyligt Opdateret
Tilslutningsmuligheder
Udvikling
Spil
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 1a2bb6395..8939d54b7 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -43,8 +43,6 @@
Aktivieren
Schlüssel hinzufügen
Überschreiben
- Verfügbar
- Aktualisierungen
F-Droid: Aktualisierungen verfügbar
Keine Bluetooth-Sendemethode gefunden, bitte eine auswählen!
Bluetooth-Sendemethode auswählen
@@ -92,9 +90,6 @@
Apps nicht ausgrauen, wenn sie Root-Rechte verlangen
Touchscreen ignorieren
Apps anzeigen, die einen Touchscreen benötigen
- Alle
- Was gibt es Neues
- Kürzlich aktualisiert
Lokale Paketquelle
F-Droid ist zum Tausch bereit
Berühren, um die Details anzusehen und anderen einen App-Tausch mit Ihnen zu ermöglichen.
@@ -128,8 +123,8 @@
Beschreibung
Letzte Aktualisierung
Name
- Die Liste der Anwendungen konnte nicht überprüft werden.
-Sie sollten bei Anwendungen vorsichtig sein,
+ Die Liste der Anwendungen konnte nicht überprüft werden.
+Sie sollten bei Anwendungen vorsichtig sein,
wenn sie aus nicht signierten Quellen heruntergeladen wurden.
Diese Paketquelle wurde noch nicht benutzt.
Um darin bereitgestellte Anwendungen anzuzeigen, muss sie aktiviert werden.
@@ -152,7 +147,6 @@ um Anwendungen daraus installieren zu können.
%1$s bis zu %2$s
Dieses Gerät befindet sich nicht im selben WLAN, wie die eben hinzugefügte Paketquelle! Versuchen Sie sich mit dem folgenden Netzwerk zu verbinden: %s
Erfordert: %1$s
- App-Symbol
Entwicklung
Spiele
Internet
@@ -198,7 +192,6 @@ um Anwendungen daraus installieren zu können.
Instabile Aktualisierungen
Aktualisierungen für instabile Version vorschlagen
- Installiert
Änderungen
Verbindung
Sport & Gesundheit
@@ -318,8 +311,6 @@ Bitte eine andere Kategorie wählen oder die Paketquellen aktualisieren.Lizenz
- Installiert (%d)
- Aktualisierung (%d)
Anwendungsdetails werden gespeichert
Keine passenden Anwendungen zum Aktualisieren.
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 3d910a241..d2e1a5de8 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -35,8 +35,6 @@
Ενεργοποίηση
Προσθήκη κλειδιού
Αντικατάσταση
- Διαθέσιμα
- Ενημερώσεις
Υπάρχουν ενημερώσεις του F-Droid
Καμία μέθοδος αποστολής με Bluetooth δεν βρέθηκε, επιλέξετε μία!
Επιλέξτε τη μέθοδο αποστολής με Bluetooth
@@ -83,9 +81,6 @@
Να μη γκριζάρονται εφαρμογές που απαιτούν δικαιώματα υπερχρήστη
Αγνόηση οθόνης αφής
Πάντα να περιλαμβάνονται εφαρμογές που απαιτούν οθόνη αφής
- Όλα
- Τι νέο υπάρχει
- Πρόσφατα Ενημερωμένες
Λήψη
%2$s / %3$s (%4$d%%) από
%1$s
@@ -139,7 +134,6 @@
Λιγότερα
Πίσω
- Εγκατεστημένο
+%1$d περισσότερα…
Αποστολή μέσω Bluetooth
@@ -192,7 +186,6 @@
Γλώσσα
Προεπιλογή συστήματος
- Εικονίδιο εφαρμογής
Wi-Fi
Σημείο πρόσβασης
@@ -340,8 +333,6 @@
Κενό όνομα χρήστη, τα διαπιστευτήρια δεν άλλαξαν
Εκδόσεις
- Εγκαταστημένο (%d)
- Ενημερώσεις (%d)
Αποθετήριο: %s
Ηλ. ταχυδρομείο δημιουργού
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index cbbdd9d82..c4b907962 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -26,8 +26,6 @@
Aldoni
Nuligi
Anstataŭigi
- Disponeblaj
- Ĝisdatigeblaj
F-Droidaj ĝisdatigoj disponeblaj
Sendi per Bludento
Deponeja adreso
@@ -66,9 +64,6 @@
Ne grizigi aplikaĵojn, kiuj postulas ĉefuzantajn privilegiojn
Ignori tuŝekranon
Ĉiam inkluzivi aplikaĵojn, kiuj postulas tuŝekranon
- Ĉiuj
- Novaj
- Ĵus ĝisdatigitaj
Loka deponejo
Forigado de la deponejo…
Aldonado de %s al la deponejo…
@@ -91,7 +86,6 @@
Ĝis %s
De %1$s ĝis %2$s
Postulas: %1$s
- Aplikaĵ-emblemo
Programado
Ludoj
Interreto
@@ -146,9 +140,6 @@
Reen
Aktivigi
Aldoni ŝlosilon
- Instalitaj
- Instalitaj (%d)
- Ĝisdatigoj (%d)
ankoraŭ +%1$d…
Neniu Bludenta metodo de sendo trovita, elektu iun!
Elektu Bludentan metodon de sendo
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index d563e8986..734358bad 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -43,8 +43,6 @@
Habilitar
Agregar clave
Sobrescribir
- Disponible
- Actualizaciones
Actualizaciones de F-Droid disponibles
No se encontró método de envío Bluetooth, ¡elige uno!
Elegir el método de envío Bluetooth
@@ -92,9 +90,6 @@
No marcar en gris las aplicaciones que requieren permisos de «root»
Ignorar pantalla táctil
Siempre incluir aplicaciones que requieran pantalla táctil
- Todas
- Novedades
- Recientemente actualizados
Repo local
F-Droid está preparado para intercambiar
Tocar para ver los detalles y permitir a otros intercambiar aplicaciones.
@@ -149,7 +144,6 @@ Para ver las aplicaciones que ofrece tienes que activarlo.
De %1$s a %2$s
¡Tu dispositivo no está en la misma Wi-Fi que el repo que acabas de añadir! Intenta unirte a esta red: %s
Requiere: %1$s
- Icono de la aplicación
Desarrollo
Juegos
Internet
@@ -282,7 +276,6 @@ No requiere ningún acceso especial.
Oscuro
Actualizaciones inestables
Sugerir actualizaciones a versiones inestables
- Instalado
La instalación de la extensión de F-Droid con permisos de sistema ha fallado. El método de instalación no está soportado por todas las versiones de Android, así que, por favor, consulta el sistema de gestión de incidencias de F-Droid para más información.
¿Quieres instalar una actualización
de esta aplicación fija? Los datos no se perderán.
@@ -319,8 +312,6 @@ No requiere ningún acceso especial.
Cambiar contraseña
Nombre de usuario vacío, las credenciales no se han cambiado
- Instalado (%d)
- Actualizaciones (%d)
Licencia
Guardando los detalles de la aplicación
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index db97687ce..ba109dca4 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -73,11 +73,6 @@
Lisa võti
Kirjuta üle
- Saadaval
- Paigaldatud
- Värskendused
- Paigaldatud (%d)
- Värskendused (%d)
F-Droid: värskendused saadaval
+%1$d veel…
Bluetoothiga saatmisviise ei leitud. Valige üks!
@@ -141,7 +136,6 @@
Lähtekood
Viga värskendamisel: %s
Viimane värskendus
- Viimati värskendatud
%s värskendamiseks koputa
Kas sa soovid paigaldada värskenduse sellele sisse ehitatud rakendusele? Sinu olemasolevad andmed jäävad ales. Värskendatud rakendus saab ligipääsu:
Kas sa soovid paigaldada värskenduse sellele rakendusele? Su olemasolevad andmed jäävad alles. Selleks ei ole vaja erilist ligipääsu.
@@ -221,12 +215,9 @@
Keel
Süsteemi vaikesäte
- Rakenduse ikoon
WiFi
Tööpunkt
- Kõik
- Mis on uut
Ühenduvus
Arendus
Mängud
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 58e1bd8b4..0d88cfa58 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -29,8 +29,6 @@
Gaitu
Gehitu gakoa
Gainidatzi
- Eskuragarri
- Eguneraketak
F-Droid eguneraketak eskuragarri
Biltegiaren helbidea
Eguneratu biltegiak
@@ -59,9 +57,6 @@
Bertsio bateraezinak
Ezikusi Root
Ezikusi egin ukipen-pantailari
- Guztia
- Berritasunak
- Azkenaldian eguneratua
%1$s(e)ra
\nkonektatzen
Ez da baimenik erabiltzen.
@@ -116,7 +111,6 @@
Zure tokiko biltegiak iragarritako izenburua: %s
Erabili zifratu gabeko HTTPS:// konexioa tokiko biltegiarentzat
- Instalatuta
Biltegi hau ezarrita dago jada, honek gako informazio berria gehituko du.
Biltegi hau ezarrita dago jada, berretsi berrezarri nahi duzula.
Sarrera biltegia ezarrita eta gaituta dago jada.
@@ -207,7 +201,6 @@ instalatu ahal izateko gaitu egin beharko duzu.
Hizkuntza
Sistemaren lehenetsia
- Aplikazioaren ikonoa
Wi-Fi
Wi-Fi gunea
@@ -335,8 +328,6 @@ Ez du baimen berezirik behar.
Lizentzia
- Instalatuta (%d)
- Eguneraketak (%d)
Biltegia: %s
Bidali e-posta egileari
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 97406bfaa..ef6d5663f 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -27,7 +27,6 @@
فعّال کردن
افزودن کلید
جانویسی
- بهروز رسانیها
بهروزرسانیهای افدروید موجودند
هیچ روش ارسال با بلوتوثی پیدا نشد، یکی را برگزینید!
گزینش روش ارسال بلوتوث
@@ -56,7 +55,6 @@
سازگاری برنامه
نادیده گرفتن ریشه
نادیده گرفتن صفحهلمسی
- همه
در حال بارگیری\n%2$s / %3$s (%4$d%%) از\n%1$s
درحال اتّصال به\n%1$s
اجازهای استفاده نشده است.
@@ -110,10 +108,6 @@
کمتر
بازگشت
- موجود
- نصب شده
- نصب شده (%d)
- بهروز رسانیها (%d)
+%1$d بیشتر…
ارسال با بلوتوث
@@ -181,12 +175,9 @@
زبان
پیشگزیدهٔ سامانه
- نقشک کاره
وایفای
نقطهٔ داغ
- تازهها
- بهروز رسانیهای اخیر
اتّصال
توسعه
بازی
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 2a092b69a..b30a0d1ef 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -42,8 +42,6 @@
Ota käyttöön
Lisää avain
Korvaa
- Saatavilla
- Päivityksiä
F-Droid: Päivityksiä saatavilla
Bluetooth -lähetystapaa ei löytynyt, valitse yksi!
Valitse Bluetooth -lähetystapa
@@ -80,9 +78,6 @@
Yhteensopimattomat versiot
Ohita root
Älä välitä kosketusnäytöstä
- Kaikki
- Mikä on uutta
- Viimeksi päivitetyt
Paikallinen sovelluslähde
F-Droid on valmis vaihtamaan
Kosketa nähdäksesi tiedot ja salliaksesi toisten vaihtaa sovelluksiasi.
@@ -111,7 +106,6 @@
Sovelluslähteen poistaminen tarkoittaa, että sieltä olevat sovellukset eivät ole enää saatavissa F-Droidin kautta. Huomautus: Kaikki aikaisemmin asentamasi sovellukset säilyvät laitteellasi.
%1$s poistettu käytöstä. Sinun pitää ottaa tämä sovelluslähde uudelleen käyttöön asentaaksesi sieltä sovelluksia.
Edellyttää: %1$s
- Sovelluskuvake
Kehittäminen
Pelit
Internet
@@ -178,9 +172,6 @@
Lisää
Vähemmän
- Asennettu
- Asennettu (%d)
- Päivitykset (%d)
+%1$d lisää…
Lataa päivitykset automaattisesti
Lataa päivitykset taustalla
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 5fd5002b7..8f892c73e 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -43,8 +43,6 @@
Activer
Ajouter une clé
Écraser
- Disponibles
- Mises à jour
Des mises à jour F-Droid sont disponibles
Aucune méthode d\'envoi Bluetooth n\'a été trouvée, choisissez-en une !
Choisir une méthode d\'envoi Bluetooth
@@ -92,9 +90,6 @@
Ne pas griser les applis nécessitant les privilèges root
Ignorer l\'écran tactile
Toujours inclure les applis nécessitant un écran tactile
- Toutes
- Nouveautés
- Mises à jour récentes
Dépôt local
F-Droid est prêt à l\'échange
Appuyez pour voir les détails et autoriser d\'autres à échanger vos applis.
@@ -150,7 +145,6 @@ réactiver ce dépôt pour installer les applis qu\'il contient.
De %1$s à %2$s
Votre appareil n\'est pas sur le même réseau Wi-Fi que le dépôt local que vous venez d\'ajouter ! Essayez de rejoindre ce réseau : %s
Nécessite : %1$s
- Icône de l\'appli
Développement
Jeux
Internet
@@ -183,7 +177,6 @@ réactiver ce dépôt pour installer les applis qu\'il contient.
Liens
Retour
- Installées
Mauvaise empreinte
Ceci n\'est pas une URL valide.
Liste des changements
@@ -323,8 +316,6 @@ perdues. Elle ne requiert aucune autorisation particulière.
Modifier le mot de passe
Nom d\'utilisateur vide, aucune modification effectuée
- Installées (%d)
- Mises à jour (%d)
Licence
Enregistrement des détails d\'applications
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index e8adef054..0f5a2c888 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -25,8 +25,6 @@
Engadir un novo repositorio
Engadir
Cancelar
- Dispoñíbel
- Actualizacións
Actualizacións de F-Droid dispoñíbeis
Enderezo do repositorio
Actualizar repositorios
@@ -59,9 +57,6 @@
Versións incompatíbeis
Ignorar Root
Ignorar a pantalla táctil
- Todos
- Qué novidades hai
- Actualizado recentemente
Descargando
%2$s / %3$s (%4$d%%) desde
%1$s
@@ -98,7 +93,6 @@
Engadir chave
Sobreescribir
- Instalado
+%1$d máis…
Non se atopou ningún método de transmisión Bluetooth, escolla un!
Escolla o método de transmisión Bluetooth
@@ -159,7 +153,6 @@
Ciencia e educación
Lectura
Teléfono e SMS
- Icona do aplicativo
Wi-Fi
Conectividade
Desenvolvemento
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 01d438602..bf5bfe9f4 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -52,8 +52,6 @@
הוסף מפתח
שכתב
- זמינות
- עדכונים
עדכוני F-Droid זמינים
+%1$d עוד…
לא נמצאה שיטת שליחה של Bluetooth, בחר אחת!
@@ -110,10 +108,6 @@
התעלם ממסך מגע
תמיד הכלל אפליקציות אשר מצריכות מסך מגע
- הכל
- מה חדש
- עודכנו לאחרונה
-
מאגר מקומי
F-Droid הינו מוכן להחליף
גע כדי לצפות בפרטים ולהתיר לאחרים להחליף עם האפליקציות שלך.
@@ -160,8 +154,6 @@
שפה
שגרתית של מערכת
- סמל אפליקציה
-
פיתוח
משחקים
אינטרנט
@@ -264,7 +256,6 @@
עדכונים לא יציבים
הצע עדכונים לגרסאות לא יציבות
קוד מקור
- מותקנות
גע כדי להחליף
הֶחְלֵף בקרבת מקום
אינך יכול למצוא את מי שאתה מחפש?
@@ -328,8 +319,6 @@
שנה סיסמה
רשיון
- מותקנות (%d)
- עדכונים (%d)
כעת שומר פרטי אפליקציה
נקה שם משתמש, פרטי התחברות לא שונו
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index be431ba09..0fa10558b 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -61,11 +61,6 @@
कुंजी जोड़े
ऊपर लिखना
- उपलब्ध
- स्थापित
- अपडेट
- स्थापित (%d)
- अपडेट (%d)
रोशन
अंधेरा
रात्रि
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 8c0061383..73c62e2d6 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -73,11 +73,6 @@
Dodaj ključ
Prepiši
- Dostupno
- Instalirano
- Ažuriranja
- Instalirano (%d)
- Ažuriranja (%d)
Ažuriranja za F-Droid dostupna
+%1$d više…
Nije pronađena metoda slanja preko Bluetootha, odaberite jednu!
@@ -218,13 +213,9 @@ ponovno omogućiti repozitorij kako bi instalirali aplikacije iz njega.
Jezik
Zadani jezik sustava
- Ikona aplikacije
Wi-Fi
Hotspot
- Sve
- Novo
- Nedavno ažurirano
Povezivanje
Razvoj
Igre
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 1cfffa6e3..c5160c4e7 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -33,8 +33,6 @@
Engedélyez
Kulcs hozzáadás
Felülírás
- Elérhető
- Frissítések
F-Droid frissítés érhető el
Repo cím
Ujjlenyomat (opcionális)
@@ -77,9 +75,6 @@
Nem szürkíti ki a root jogot igénylő alkalmazásokat
Érintőképernyő ignorálása
Mindig tartalmazza az érintőképernyőt igénylő alkalmazásokat
- Összes
- Újdonságok
- Legutóbb frissítve
Letöltés\n%2$s / %3$s (%4$d%%), forrás:\n%1$s
Kapcsolódás ehhez:\n%1$s
Nincsenek engedélyei.
@@ -121,9 +116,6 @@ Engedélyeznie kell, hogy megtekinthesse az általa kínált appokat.
Kevesebb
Vissza
- Telepítve
- Telepítve (%d)
- Frissítések (%d)
+%1$d további…
Küldés Bluetooth-on
@@ -170,7 +162,6 @@ Engedélyeznie kell, hogy megtekinthesse az általa kínált appokat.
Nyelv
Rendszer-alapértelmezés
- Appikon
Wi-Fi
Kapcsolódás
Fejlesztés
diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml
index 0bfad2344..aaa8f9d9c 100644
--- a/app/src/main/res/values-hy/strings.xml
+++ b/app/src/main/res/values-hy/strings.xml
@@ -50,11 +50,6 @@
Ավելացնել բանալի
Մաքրել որոնումը
- Հասանելի
- Տեղադրված
- Թարմացումներ
- Տեղադրված (%d)
- Թարմացումներ (%d)
F-Droidի թարմացումներ են հասանելի
Մասին
Որոնել
@@ -86,9 +81,6 @@
Լեզու
Համակարգի լռելյայնը
- Ամենը
- Նորերից
- Վերջին թարմացվածները
Կապ
Խաղեր
Ցանց
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 379010712..4033046d2 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -60,9 +60,6 @@
Tambah Kunci
Timpa
- Tersedia
- Terpasang
- Pembaruan
Tersedia Pembaruan F-Droid
Metode pengiriman Bluetooth tidak ditemukan, pilih salah satu!
Pilih metode pengiriman Bluetooth
@@ -191,8 +188,6 @@ apl yang sebelumnya dipasang dari repositori ini akan tetap ada di perangkat And
Lisensi
- Terpasang (%d)
- Pembaruan (%d)
F--Droid siap untuk ditukar
Ekstensi Istimewa
Repositori: %s
@@ -220,13 +215,9 @@ butuh untuk mengaktifkan ulang repo ini untuk memasang apl darinya.
Bahasa
Baku Sistem
- Ikon apl
Wifi
Hotspot
- Semua
- Apa yang Baru
- Baru saja diPerbarui
Konektifitas
Pengembangan
Permainan
@@ -485,6 +476,6 @@ hilang. Aplikasi yang diperbarui akan mendapatkan akses ke:
Anti-fitur
- Diperbarui %1$s hari yang lalu
-
+
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index b568e884a..20c05093a 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -61,11 +61,6 @@
Bæta við lykli
Skrifa yfir
- Tiltækt
- Uppsett
- Uppfærslur
- Uppsett (%d)
- Uppfærslur (%d)
Uppfærslur á F-Droid eru tiltækar
+%1$d fleiri…
Engin aðferð til sendingar með Bluetooth fannst, veldu eina!
@@ -171,13 +166,9 @@
Tungumál
Sjálfgefið í kerfinu
- Forritstákn
Þráðlaust Wi-Fi net
Tengipunktur (hotspot)
- Allt
- Nýtt á döfinni
- Nýlega uppfært
Tengingar
Þróun
Leikir
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index fe4a226c7..80cfa1219 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -41,8 +41,6 @@
Attiva
Aggiungi chiave
Sovrascrivi
- Disponibile
- Aggiornamenti
Aggiornamenti per F-Droid disponibili
Non è possibile inviare via Bluetooth, scegliere un altro metodo!
Scegli invio mediante Bluetooth
@@ -90,9 +88,6 @@
Non disabilitare le applicazioni che richiedono privilegi di root
Ignora il touchscreen
Includi sempre le applicazioni che necessitano del touchscreen
- Tutte
- Novità
- Aggiornate di recente
Repo locale
F-Droid è pronto per lo scambio
Tocca per vedere i dettagli e permettere agli altri di ricevere le tue app.
@@ -149,7 +144,6 @@ abilitare nuovamente questo repository per installare le app contenute.
da %1$s fino a %2$s
Il tuo dispositivo non è nella stessa rete Wi-Fi del repo locale che hai aggiunto! Prova a collegarti a questa rete: %s
Richiede: %1$s
- Icona dell\'app
Sviluppo
Giochi
Internet
@@ -182,7 +176,6 @@ abilitare nuovamente questo repository per installare le app contenute.
Indietro
Meno
- Installate
Impronta digitale non corrispondente
Questo non è un URL valido.
Impostazioni
@@ -255,8 +248,6 @@ non saranno rimossi. L\'app dopo l\'aggiornamento avrà accesso a:
Licenza
Collegamenti
- Installate (%d)
- Aggiornamenti (%d)
Changelog
Litecoin
Flattr
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 1c1653a92..530b4158a 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -43,8 +43,6 @@
有効
鍵を追加
上書き
- 入手可能
- 更新
F-Droidの更新があります
Bluetoothの送信方法がありません、選択してください!
Bluetoothの送信方法を選択してください
@@ -92,9 +90,6 @@
管理者権限を要求するアプリケーションを表示します。
タッチスクリーンを無視
タッチスクリーンを要求するアプリケーションをのみ表示します。
- 全て
- 新着
- 最近の更新
ローカルリポジトリ
F-Droidは交換の準備ができました
タッチすると詳細を表示し、アプリケーションの交換ができるようになります。
@@ -149,7 +144,6 @@
%1$s から %2$s
あなたの端末は追加したローカル・リポジトリと同じWi-Fi上にありません。このネットワークに参加してみてください: %s
必須: %1$s
- アプリアイコン
開発
ゲーム
インターネット
@@ -285,7 +279,6 @@
非安定版への更新
非安定版への更新を提案します
- インストール済
ダウンロードできませんでした
Bitcoin
@@ -314,8 +307,6 @@
パスワードを変更
ユーザー名が空です。資格情報は変更されていません
- インストール済 (%d)
- 更新 (%d)
ライセンス
アプリケーションの詳細を保存中
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 116523830..df1a4f566 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -43,8 +43,6 @@
사용
키 추가
덮어쓰기
- 사용 가능
- 업데이트
F-Droid 업데이트를 사용할 수 있습니다.
블루투스 전송 방법을 찾을 수 없습니다. 선택하세요!
블루투스 전송 방법 선택
@@ -92,9 +90,6 @@
루트 권한을 요구하는 앱을 비활성화 하지 않기
터치스크린 무시
터치스크린을 요구하는 앱을 항상 포함
- 전체
- 새로운 기능
- 최근 업데이트
로컬 저장소
F-Droid는 교환할 준비가 되었습니다
자세한 정보를 보고, 타인이 당신과 앱을 교환할 수 있도록 하려면 여기를 누르세요.
@@ -144,7 +139,6 @@
%1$s 최대 %2$s
현재 이 기기는 당신이 추가한 로컬 저장소와 같은 Wi-Fi 네트워크상에 있지 않습니다! 이 네트워크로 접속을 시도해보세요: %s
다음이 필요함: %1$s
- 앱 아이콘
개발
게임
인터넷
@@ -189,9 +183,6 @@
접기
뒤로
- 설치됨
- 설치됨 (%d)
- 업데이트 (%d)
+%1$d 이상…
올바르지 않은 핑거프린트
올바른 URL이 아닙니다.
diff --git a/app/src/main/res/values-ldrtl/donottranslate.xml b/app/src/main/res/values-ldrtl/donottranslate.xml
deleted file mode 100644
index cfde9ea15..000000000
--- a/app/src/main/res/values-ldrtl/donottranslate.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
- %1$s ← %2$s
-
-
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index db5271564..0cd07d606 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -27,8 +27,6 @@
Įjungti
Pridėti raktą
Perrašyti
- Prieinamos programos
- Atnaujinimai
Siųsti per Bluetooth
Saugyklos adresas
Atnaujinti saugyklas
@@ -51,9 +49,6 @@
Nesuderintos versijos
Rodyti programų laidas, netinkamas šiam įrenginiui
Administratoriaus privilegijos
- Rodyti visas
- Naujienos
- Neseniai atnaujinta
Šalinama pasirinkta saugykla…
Toliau
Jungiamasi prie
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index eda01cbc3..275f59c92 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -38,8 +38,6 @@
Ieslēgt
Pievienot atslēgu
Pārrakstīt
- Pieejams
- Atjauninājumi
Nav Bluetooth aktivitāšu, izvēlies vienu!
Izvēlies Bluesūtīšanas metodi
Bluesūtīt
@@ -74,7 +72,6 @@
Pirmkods
Licence
- Atjauninājumi (%d)
Iestatījumi
Autora Epasts
Issues
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index 603041a05..3d15535b4 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -69,11 +69,6 @@
ကီးထည့္မည္
ထပ္ေရးမည္
- ရရွိႏိုင္ေသာ
- သြင္းထားခဲ့သည္
- အသစ္မြမး္မံမႈမ်ား
- သြင္းထားခဲ့သည္ (%d)
- အသစ္မြမ္းမံမႈမ်ား (%d)
F-Droid အသစ္မြမ္းမံမႈရရွိႏိုင္သည္
+%1$d ေနာက္ထပ္..
ဘလူးသုဒ့္ႏွင့္ပို႔ရန္နည္းလမ္းရွာမေတြ႕ပါ။ တစ္ခုေရြးပါ!
@@ -185,13 +180,9 @@
ဘာသာစကား
စနစ္မူလအတိုင္း
- App အိုင္ကြန္း
ဝိုင္ဖိုင္
ေဟာ့ဒ့္စေပါ့ဒ္
- အားလံုး
- ဘာေတြအသစ္ပါသလဲ
- မၾကာေသးခင္က အသစ္မြမ္းမံခဲ့ေသာ
ခ်ိတ္ဆက္မႈ
ေရးသားမႈ
ဂိမ္းမ်ား
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index b01dd7835..8fbe0d281 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -43,8 +43,6 @@
Skru på
Legg til nøkkel
Overskriv
- Tilgjengelig
- Oppdateringer
F-Droid: Oppdateringer tilgjengelig
Ingen forsendelsesmåte for Blåtann funnet, velg en!
Velg forsendelsesmåte for Blåtann
@@ -92,9 +90,6 @@
Skyggelegg alle app-er som krever superbruker-tilgang
Ignorer pekeskjerm
Alltid inkluder app-er som krever pekeskjerm
- Alt
- Det som er nytt
- Nylig oppdatert
Lokal pakkebrønn
Sirkulering av programmer kan begynne
Trykk for å se detaljer og for å tillate andre å sirkulere de programmene du har.
@@ -148,7 +143,6 @@ skru på denne pakkebrønnen igjen for å installere programmer fra den.%1$s opptil %2$s
Din enhet er ikke på det samme lokale Wi-Fi-nettet som pakkebrønnen du nettopp la til! Prøv å koble til dette nettverket: %s
Krever: %1$s
- Miniatyrbilde for program
Utvikling
Spill
Internett
@@ -182,7 +176,6 @@ skru på denne pakkebrønnen igjen for å installere programmer fra den.Lenker
Tilbake
- Installert
+%1$d mer…
Feil i fingeravtrykk
Dette er ikke en gyldig nettadresse.
@@ -318,8 +311,6 @@ gå tapt. Det krever ingen spesiell tilgang.
Lisens
Identifikasjon påkrevet
- Installert (%d)
- Oppdateringer (%d)
Lagrer programdetaljer
Samsvarer ikke med noen installerte programmer.
Samsvarer ikke med noen tilgjengelige programmer.
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 8a55a6ff4..344e7e220 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -43,8 +43,6 @@
Inschakelen
Sleutel toevoegen
Overschrijven
- Beschikbaar
- Updates
F-Droid-updates beschikbaar
Geen Bluetooth-verzendmethode gevonden, kies er een!
Kies Bluetooth-verzendmethode
@@ -92,9 +90,6 @@
Verberg apps die root-permissies vereisen niet
Negeer aanraakscherm
Reken apps die een aanraakscreen vereisen altijd mee
- Alles
- Wat is nieuw
- Recentelijk vernieuwd
Collectie gedeelde apps
F-Droid is klaar om apps te delen
Raak aan om details te bekijken en anderen gedeelde apps van jou te laten downloaden.
@@ -150,7 +145,6 @@ Je moet deze bron weer inschakelen indien je er apps van wil installeren.%1$s tot en met %2$s
Je apparaat zit niet op hetzelfde Wi-Fi-netwerk als de lokale bron die je zojuist hebt toegevoegd! Probeer om netwerk %s bij te treden
Benodigd: %1$s
- App-pictogram
Ontwikkeling
Spellen
Internet
@@ -289,7 +283,6 @@ Het heeft geen speciale toegang nodig.
Meer
Minder
- Geïnstalleerd
Bitcoin
Litecoin
Flattr
@@ -323,8 +316,6 @@ worden gedownload
Wachtwoord wijzigen
Licentie
- Geïnstalleerd (%d)
- Updates (%d)
Applicatiedetails opslaan
Authenticatie vereist
Lege gebruikersnaam, referenties niet gewijzigd
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 475a4a152..35ba6fcb9 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -32,8 +32,6 @@
Włącz
Dodaj klucz
Nadpisz
- Dostępne
- Aktualizacje
Uaktualnienie F-Droid jest dostępne
Wyślij przez Bluetooth
Adres repozytorium
@@ -68,9 +66,6 @@
Nie przyciemniaj aplikacji wymagających uprawnień roota
Ignoruj ekran dotykowy
Zawsze uwzględniaj aplikacje, które wymagają ekranu dotykowego
- Wszystkie
- Co nowego
- Ostatnio zaktualizowane
Repozytorium lokalne
F-Droid gotowy do wymiany
Dotknij, aby sprawdzić szczegóły i umożliwić wymianę aplikacji.
@@ -110,7 +105,6 @@ Uwaga: Wszystkie poprzednio zainstalowane aplikacje zostaną na urządzeniu.Wsparcie do %s
%1$s aż do %2$s
Wymaga: %1$s
- Ikona aplikacji
Tworzenie
Gry
Internet
@@ -276,7 +270,6 @@ Uwaga: Wszystkie poprzednio zainstalowane aplikacje zostaną na urządzeniu.Ciemny
Wersje niestabilne
Sugeruj aktualizacje do niestabilnych wersji
- Zainstalowane
Bitcon
Litecoin
Flattr
@@ -308,8 +301,6 @@ Uwaga: Wszystkie poprzednio zainstalowane aplikacje zostaną na urządzeniu.Licencja
- Zainstalowane (%d)
- Aktualizacje (%d)
Zapisywanie danych aplikacji
od
E-mail do autora
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 9785ed288..4d000980d 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -43,8 +43,6 @@
Ativar
Adicionar chave
Sobrescrever
- Disponível
- Atualizações
Atualizações do F-Droid disponíveis
Nenhum método de envio por Bluetooth foi encontrado, escolha um!
Escolher o método de envio Bluetooth
@@ -92,9 +90,6 @@
Não marcar de cinza os aplicativos que requerem privilégios de root
Ignorar tela sensível ao toque
Sempre incluir aplicativos que requerem tela sensível a toque
- Todos
- O que há de novo
- Recentemente atualizado
Repositório local
O F-Droid está pronto para permutar
Toque para ver detalhes e permitir que outros permutem seus aplicativos.
@@ -152,7 +147,6 @@ reativar este repositório para instalar aplicativos a partir dele.
De %1$s até %2$s
O seu dispositivo não está no mesma rede Wi-Fi do repositório local que você acabou de adicionar! Tente conectar-se a esta rede: %s
Requer: %1$s
- Ícone do aplicativo
Desenvolvimento
Jogos
Internet
@@ -292,7 +286,6 @@ serão perdidos. Ele não exige nenhum acesso especial.
Escuro
Atualizações instáveis
Sugerir atualizações para versões instáveis
- Instalado
Bitcoin
Litecoin
Flattr
@@ -323,8 +316,6 @@ serão perdidos. Ele não exige nenhum acesso especial.
Licença
- Instalado (%d)
- Atualizações (%d)
Salvando detalhes dos aplicativos
Nenhum aplicativo correspondente instalado.
Nenhum aplicativo correspondente disponível.
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index cb98498d8..59bbec563 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -60,9 +60,6 @@
Adicionar chave
Substituir
- Disponíveis
- Instaladas
- Atualizações
Atualizações F-Droid disponíveis
+%1$d…
Nenhum método de envio Bluetooth encontrado. Escolha um!
@@ -193,13 +190,9 @@ Tem que ativar o repositório para poder instalar aplicações.
Idioma
Definições do sistema
- Ícone da aplicação
Wi-Fi
Hotspot
- Todas
- Novidades
- Atualizadas recentemente
Conectividade
Desenvolvimento
Jogos
@@ -337,8 +330,6 @@ A aplicação atualizada não requer qualquer acesso especial.
Licença
- Instaladas (%d)
- Atualizações (%d)
A guardar detalhes das aplicações
Nenhuma aplicação instalada coincidente.
Nenhuma aplicação disponível coincidente.
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 4b082ab91..aa39e009c 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -20,8 +20,6 @@
Adauga
Anuleaza
Activeaza
- Disponibil
- Actualizari
Despre
Cauta
Porneste
@@ -35,9 +33,6 @@
Setari expert
Ignora aplicatiile ce necesita root
Include mereu aplicatii ce necesita touchscreen
- Toate
- Ce este nou
- Actualizat recent
Temă
Număr de aplicaţii
Ultima actualizare
@@ -91,9 +86,6 @@
Adauga cheie
Suprascrie
- Instalat
- Instalat (%d)
- Actualizari (%d)
Actualizari disponibile in F-Droid
+%1$d mai mult…
Nu a fost gasita o metoda Bluetooth de a trimite, alegeti una!
@@ -198,7 +190,6 @@
Codul sursa originar nu este in totalitatea lui software liber
Nesemnat
Amprenta cheii de semnatura (SHA-256)
- Iconita aplicatie
Conectivitate
Finante
Securitate
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index e26220762..44a8ed571 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -43,8 +43,6 @@
Включить
Добавить ключ
Перезаписать
- Доступно
- Обновления
Доступны обновления для F-Droid
Методы отправки по Bluetooth не найдены, выберите какой-либо!
Выберите метод отправки по Bluetooth
@@ -92,9 +90,6 @@
Не выделять серым цветом приложения, требующие привилегии суперпользователя
Сенсорный экран
Всегда включать приложения, требующие сенсорный экран
- Все
- Новинки
- Недавно обновлённые
Локальный репозиторий
F-Droid готов для обмена
Удаление текущего репозитория…
@@ -142,7 +137,6 @@
%1$s до %2$s
Данное устройство не находится в той же сети Wi-Fi, что и локальный репозиторий, который вы только что добавили! Попробуйте присоединиться к этой сети: %s
Требуется: %1$s
- Иконка приложения
Разработка
Игры
Интернет
@@ -187,7 +181,6 @@
Время
F-Droid
- Установлено
Обновление репозиториев
Обработка %2$s / %3$s (%4$d%%) из %1$s
Установка не удалась из-за неизвестной ошибки
@@ -224,8 +217,6 @@
\n%2$s от
\n%1$s
Сохранен F-Droid репозиторий %1$s.
- Установлено (%d)
- Обновления (%d)
Лицензия
Сохранение информации о приложениях
diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml
index de6652635..290a68ad9 100644
--- a/app/src/main/res/values-sc/strings.xml
+++ b/app/src/main/res/values-sc/strings.xml
@@ -43,8 +43,6 @@
Abìlita
Annanghe crae
Subraiscrie
- Disponìbiles
- Agiornamentos
Agiornamentos pro F-Droid disponìbiles
Perunu mètodu de imbiu Bluetooth agatadu, issèberane unu!
Issèbera su mètodu de imbiu Bluetooth
@@ -92,9 +90,6 @@
Non disabilitare sas aplicatziones chi tenet bisòngiu de sos permissos de root
Ignora touchscreen
Include semper sas aplicatziones chi tenet bisòngiu de su touchscreen
- Totu
- Novidades
- Agiornadas dae pagu
Depòsitu locale
F-Droid est prontu pro imbiare cun swap
Toca pro bìere sas minujas e permìtere a àteros de retzire sas aplicatziones tuas.
@@ -152,7 +147,6 @@ Depes
dae %1$s finas a %2$s
Su dispositivu tuo no est in sa matessi retza Wi-Fi de su depòsitu locale chi as annantu como! Proa a intrare in custa retza: %s
Netzessitat de: %1$s
- Icona de s\'aplicatzione
Isvilupu
Giogos
Ìnternet
@@ -205,7 +199,6 @@ Depes
Disinstalla s’estensione cun permissos de sistema
Aberi s’ischermada de sas minujas de s’estensione \"F-Droid cun permissos de sistema\" pro l’agiornare/disinstallare
Còdighe mitza
- Installadas
Imprenta/arrastu isballiada
Connetividade
Gràfica
@@ -321,8 +314,6 @@ Depes
Modìfica sa crae
Nùmene impreadore bòidu, credentziales non cambiadas
- Installadas (%d)
- Agiornamentos (%d)
Litzèntzia
Sarbende sas minujas de sas aplicatziones
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index d95e2e8e2..b03a139f1 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -43,8 +43,6 @@
Zapnúť
Pridať kľúč
Prepísať
- Dostupné
- Aktualizácie
Dostupné aktualizácie F-Droidu
Poslať cez Bluetooth
Adresa repozitára
@@ -89,9 +87,6 @@
Nezašediť aplikácie vyžadujúce práva root
Ignorovať dotykovú obrazovku
Vždy zahrnúť aplikácie vyžadujúce dotykovú obrazovku
- Všetky
- Čo je nové
- Nedávno aktualizované
Miestne repo
F-Droid je pripravený na výmenu
Ťuknite pre zobrazenie detailov a umožnite ostatným vymieňať vaše aplikácie.
@@ -149,7 +144,6 @@ znovu povoliť tento repozitár pre inštaláciu aplikácií z neho.
%1$s do %2$s
Vaše zariadenie nie je na rovnakej Wi-Fi ako miestny repozitár, čo ste práve pridali! Skúste sa pripojiť na túto sieť: %s
Vyžaduje: %1$s
- Ikona aplikácie
Vývoj
Hry
Internet
@@ -184,7 +178,6 @@ znovu povoliť tento repozitár pre inštaláciu aplikácií z neho.
Linky
Späť
- Nainštalované
+%1$d viac…
Posielanie cez Bluetooth zlyhalo, zvoľte inú metódu!
Vyberte posielanie cez Bluetooth
@@ -282,8 +275,6 @@ znovu povoliť tento repozitár pre inštaláciu aplikácií z neho.
Viac
Menej
- Nainštalované (%d)
- Aktualizované (%d)
Nastavenia
Poslať e-mail autorovi
Táto aplikácia obsahuje proprietárne časti
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index a35dd2207..b2ec972f0 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -16,8 +16,6 @@
Dodaj novo skladišče
Dodaj
Prekliči
- Na razpolago
- Posodobitve
Naslov skladišča
Upravljanje s skladišči
O programu
diff --git a/app/src/main/res/values-sn/strings.xml b/app/src/main/res/values-sn/strings.xml
index 75bcb0706..c3a23320e 100644
--- a/app/src/main/res/values-sn/strings.xml
+++ b/app/src/main/res/values-sn/strings.xml
@@ -68,11 +68,6 @@
Wedzera svumbunuro
Nyorera pamusoro
- Zviripo
- Zvakavakirirwa
- Zvekunatsa
- Zvavakirirwa (%d)
- Zvekunatsa (%d)
Zvekunatsa F-Droid zviripo
zvimwe +%1$d …
Hapana mutowo wekutumira neBluetooth wawanikwa, sarudza imwe chete!
@@ -231,13 +226,9 @@ kubvumidza pfimbi iyi zvakare kuti uvakirire kubva kwairi.
Mutauro
Sistemu ine hurongwa hwakarepo
- Icon yeApp
Wi-Fi
Hotspot
- Zvose
- Ndezvipi zvitsva
- Zvanatswa manje
Mahakiro
Tsvitsa
Mitambo
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index dff23c6ec..c14e0c215 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -30,7 +30,6 @@
Aktivizo
Mbishkruaj
- Përditësime
Nuk u gjet ndonjë mënyrë dërgimi me Bluetooth, zgjidhni një!
Zgjidhni mënyrën e dërgimit me Bluetooth
Dërgo me Bluetooth
@@ -70,7 +69,6 @@
Wi-Fi
Hotspot
- Të përditësuar së fundmi
Lojra
Internet
Lexim
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 4de990bd4..a3e1a952c 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -42,8 +42,6 @@
Омогући
Додај кључ
Пребриши
- Доступне
- Надоградње
Доступне су надоградње на Ф-дроиду
Нема начина за слања блутутом, одредите један!
Одредите начин слања блутутом
@@ -91,9 +89,6 @@
Не посивљуј приказ апликација које захтевају корени приступ
Занемари услов додирног екрана
Увек укључи апликације које захтевају додирни екран
- Све
- Нове
- Недавно надограђене
Локална ризница
Ф-дроид је спреман за размену
Додирните за приказ детаља и да дозволите другима да размењују ваше апликације.
@@ -150,7 +145,6 @@
Од %1$s до %2$s
Ваш уређај није на истој бежичној мрежи са локалном ризницом коју сте управо додали! Придружите се овој мрежи: %s
Захтева: %1$s
- Икона програма
Развој
Игре
Интернет
@@ -185,7 +179,6 @@
Везе
Назад
- Инсталиране
+још %1$d…
Лош отисак
Ово није исправна адреса.
@@ -308,8 +301,6 @@
Измени лозинку
Корисничко име је празно, пуномоћја нису измењена
- Инсталиране (%d)
- Надоградње (%d)
Лиценца
Уписујем детаље апликација
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 663bb208d..f32f0eb37 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -43,8 +43,6 @@
Aktivera
Lägg till en nyckel
Skriv över
- Tillgängliga
- Uppdateringar
Uppdateringar för F-Droid tillgängliga
Ingen metod för att kunna skicka med Bluetooth kunde hittas, välj en!
Välj en sändningsmetod för Bluetooth
@@ -92,9 +90,6 @@
Gråtona inte appar som kräver root-behörigheter
Ignorera pekskärm
Inkludera alltid appar som kräver pekskärm
- Alla
- Nyheter
- Nyss uppdaterade
Lokalt filförråd
F-Droid är redo att utbyta
Tryck för att se detaljer och tillåta andra att utbyta appar med dig.
@@ -152,7 +147,6 @@ Du kommer
%1$s upp till %2$s
Din enhet är inte på samma WiFi som det lokala förrådet du just lagt till! Försök ansluta till detta nätverk: %s
Kräver: %1$s
- Appikon
Utveckling
Spel
Internet
@@ -188,7 +182,6 @@ Du kommer
Mindre
Bakåt
- Installerade
+%1$d mer…
Felaktigt fingeravtryck
Det här är inte en giltig hemsideadress.
@@ -217,8 +210,6 @@ Du kommer
Licens
- Installerade (%d)
- Uppdateringar (%d)
E-post författare
Denna app innehåller icke-fria tillgångar
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 586b60d61..dd660fa80 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -51,10 +51,6 @@
செயல்படுத்த
மாற்றி எழுது
- நிறுவப்பட்டது
- மேம்படுத்தல்கள்
- நிறுவப்பட்டது (%d)
- மேம்படுத்தல்கள் (%d)
F-Droid மேம்படுத்தல்கள் உள்ளன
ப்ளூடூத் வழியாக அனுப்ப
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 4b1753e5a..9fcdfde11 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -47,11 +47,6 @@
กลับ
ยกเลิก
เปิดใช้
- มีดาวน์โหลด
- ติดตั้งอยู่
- มีอัพเดต
- ติดตั้งอยู่ (%d)
- มีอัพเดต (%d)
มีอัพเดตโปรแกรม F-Droid
ส่งผ่านบลูทูธ
@@ -147,8 +142,6 @@
ภาษา
ใช้ภาษาของเครื่อง
- มีอะไรใหม่
- อัพเดตเมื่อไม่นานมานี้
การสื่อสาร
การพัฒนาซอฟต์แวร์
เกม
@@ -266,7 +259,6 @@
เลือกวิธีการส่งต่อผ่านบลูทูธ
ยังไม่ได้เลือกวิธีส่งต่อทางบลูทูธ, โปรดเลือกก่อน!
กำลังดาวน์โหลด %1$s
- ทั้งหมด
ไม่ต้องสนใจชนิดหน้าจอ
แสดงโปรแกรมที่ต้องใช้จอสัมผัสด้วยเสมอ แม้ว่าเครื่องคุณจะไม่มีจอสัมผัส
@@ -279,7 +271,6 @@
กำลังอัพเดตข้อมูลจากแหล่งโปรแกรม
กำลังประมวลผลข้อมูล %2$s / %3$s (%4$d%%) จาก %1$s
ต้องใช้: %1$s
- ไอคอนโปรแกรม
Wi-Fi
ไม่มีโปรแกรมที่ติดตั้งอยู่ตรงตามที่ค้นหา
ไม่พบโปรแกรมตามที่ค้นหา
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 312d60622..805285858 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -43,8 +43,6 @@
Etkinleştir
Anahtar ekle
Üzerine yaz
- Mevcut
- Güncellemeler
F-Droid güncellemeleri mevcut
Hiçbir Bluetooth gönderme yöntemi bulunamadı, birisini seçin!
Bluetooth gönderme yöntemi seç
@@ -92,9 +90,6 @@
Kök yetkileri gerektiren uygulamalar gri yapılmasın
Dokunmatik ekranı yok say
Dokunmatik ekran gerektiren uygulamaları daima dahil et
- Tümü
- Yeni Olanlar
- Yakınlarda Güncellenen
Yerel Depo
F-Droid takasa hazır
Detayları görmek ve başkalarının uygulamalarınızı takas edebilmesi için dokunun.
@@ -133,7 +128,7 @@ bağlanılıyor
İsim
Bu, uygulama listesinin
teyit edilemediği anlamına gelir. İmzasız
- indekslerden indirilen uygulamalara karşı
+ indekslerden indirilen uygulamalara karşı
dikkatli davranmalısınız.
Bu depo henüz kullanılmamıştır.
Sunduğu uygulamaları görmek için etkinleştirmeliziniz.
@@ -156,7 +151,6 @@ F-Droid deposu aranıyor
%1$s değerinden %2$s değerine kadar
Aygıtınız eklemiş olduğunuz yerel deponuzla aynı Wi-Fi\'de değildir. Şu ağa katılmayı deneyin: %s
Gerektirdiği: %1$s
- Uygulama simgesi
Geliştirme
Oyunlar
İnternet
@@ -199,9 +193,6 @@ F-Droid deposu aranıyor
Daha azı
Geri
- Kurulu
- Kurulu (%d)
- Güncellemeler (%d)
+%1$d daha…
Yanlış parmak izi
Bu geçerli bir URL değildir.
diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml
index 3adca7768..f6d06af6f 100644
--- a/app/src/main/res/values-ug/strings.xml
+++ b/app/src/main/res/values-ug/strings.xml
@@ -25,8 +25,6 @@
يېڭى خەزىنە قوش
قوش
ۋاز كەچ
- ئىشلىتىشچان
- يېڭىلانمىلار
F-Droid يېڭىلانمىلىرى بار
خەزىنە ئادرېسى
خەزىنە يېڭىلا
@@ -59,9 +57,6 @@
ماسلاشمايدىغان نەشرىلىرى
Root
سەزگۈر ئېكرانغا پەرۋا قىلما
- ھەممىسى
- يېڭىلىقلار
- يېقىنقى يېڭىلانغانلار
چۈشۈرۈۋاتىدۇ
%2$s / %3$s (%4$d%%)
%1$s
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index eded46ee5..44d918bf7 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -17,8 +17,6 @@
Новий репозиторій
Додати
Назад
- Наявне
- Оновлення
Адреса репозиторію
Оновити
Репозиторії
@@ -39,10 +37,7 @@
Сумісність
Ігнорувати Суперкористувача
Ігнорувати тачскрін
- Всі програми
- Недавні додання
- Недавні оновлення
-F-Droid
+ F-Droid
Схоже, ця програма не сумісна з вашим пристроєм. Спробувати встановити її все одно?
Ви збираєтесь встановити більш стару версію програми. Це можете призвести до некоректної робити і навіть втрати ваших даних. Встановити більш стару версію?
@@ -86,7 +81,6 @@
Назад
Увімкнути
Додати ключ
- Встановлено
F-Droid: доступні оновлення
+%1$d більше…
Надіслати через Bluetooth
@@ -152,7 +146,6 @@
Мова
Типова для системи
- Піктограма додатку
Wi-Fi
Ігри
Графіка
@@ -331,11 +324,9 @@
Змінити пароль
Відсутнє ім\'я користувача, облікові дані не змінено
- Встановлено (%d)
Надано %1$s.
Ліцензія
- Оновлення (%d)
Збереження подробиць по додаткам
Не має збігів серед встановлених програм.
Не має збігів серед доступних програм.
@@ -426,7 +417,7 @@
- %1$d оновлення
- %1$d оновлення
- %1$d оновлень
-
+
Очистити пошук
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index ddf6152ea..ca14baa24 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -42,8 +42,6 @@
Kích hoạt
Thêm mã khoá
Ghi đè
- Hiện có
- Cập nhật
Có cập nhật F-Droid
Không tìm thấy phương pháp gửi qua Bluetooth mặc định, hãy chọn phương pháp!
Chọn phương pháp gửi qua Bluetooth
@@ -87,9 +85,6 @@
Không bôi xám các ứng dụng yêu cầu quyền root
Bỏ qua màn hình cảm ứng
Luôn hiện các ứng dụng yêu cầu màn hình cảm ứng
- Tất cả
- Ứng dụng mới
- Mới cập nhật
Kho nội bộ
F-Droid đã sẵn sàng để trao đổi
Chạm để xem danh sách và cho phép mọi người trao đổi ứng dụng với bạn.
@@ -129,7 +124,6 @@
Từ %1$s đến %2$s
Thiết bị của bạn không trong cùng mạng Wi-Fi với kho nội bộ mới thêm! Hãy vào mạng này: %s
Yêu cầu: %1$s
- Biểu tượng ứng dụng
Lập trình
Trò chơi
Internet
@@ -165,7 +159,6 @@
Tên kho phần mềm nội bộ của bạn: %s
Mã nguồn
Không tương thích
- Đã cài đặt
+%1$d ứng dụng khác…
Đây không phải là URL hợp lệ.
Lịch sử sửa đổi
@@ -304,8 +297,6 @@
Giấy phép
- Đã cài đặt (%d)
- Cập nhật (%d)
Đang lưu thông tin ứng dụng
bởi
E-mail tác giả
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 1db72a224..7a712e0f7 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -36,8 +36,6 @@
启用
添加密钥
覆盖
- 可安装
- 更新
可更新 F-Droid
未找到蓝牙发送方式,请选择一个!
选择蓝牙发送方式
@@ -84,9 +82,6 @@
不以灰色显示需要root权限的应用程序
忽略触屏应用
总是包含需要触屏的应用程序
- 全部
- 新应用
- 最近更新
本地软件源
正在删除当前软件源…
图标
@@ -121,7 +116,6 @@
%1$s 到 %2$s
您的设备与刚刚添加的本地软件源不在同一个Wi-Fi上!尝试加入该网络:%s
需要:%1$s
- 应用程序图标
软件开发
游戏
互联网
@@ -163,9 +157,6 @@
更少
返回
- 已安装
- 已安装(%d)
- 可更新(%d)
+%1$d 更多…
用蓝牙发送
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 238ed0fe3..b50bcdd0d 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -39,8 +39,6 @@
啟用
添加鑰匙
覆寫
- 可安裝
- 更新
有尚未安裝的 F-Droid 更新
請選擇一個藍牙傳送的方式!
選擇藍牙的傳送方式
@@ -82,9 +80,6 @@
略過 root
略過觸碰屏幕
顯示需要觸碰屏幕的應用程式
- 所有
- 最新
- 最近更新
本地倉庫
F-Droid 隨時可以進行交換
觸碰以顯示詳細資料及允許其他人交換您的應用程式。
@@ -117,7 +112,6 @@
直至 %s
您剛才添加的本地倉庫與您的裝置並不在同一個 Wi-Fi 網絡上!請嘗試加入以下網絡:%s
需要:%1$s
- 應用程式圖示
開發
遊戲
互聯網
@@ -145,7 +139,6 @@
連結
返回
- 已安裝
這不是有效的網址。
更新日誌
正在更新軟件倉庫
@@ -302,8 +295,6 @@
%1$s (您的熱點)
特許條款
- 已安裝 (%d)
- 更新 (%d)
為所有網絡請求設置 HTTP 代理
正在儲存應用程式的詳細資料
沒有安裝任何應用程式。\n\nF-Droid 並不提供您裝置上的應用程式。您可以嘗試更新您的軟件倉庫,但若更新後此頁還沒有顯示任何應用程式,您的倉庫的確不提供裝置現有的程式。
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index b8e3586a6..d228e11cf 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -59,11 +59,6 @@
返回
取消
啟用
- 可用的
- 已安裝
- 軟體更新
- 已安裝 (%d)
- 軟體更新 (%d)
有可用的 F-Droid 更新
透過藍牙傳送
@@ -135,13 +130,9 @@
語言
系統預設
- 應用程式圖示
Wi-Fi
熱點
- 全部
- 最新
- 最近更新
開發
遊戲
圖形
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index b7025b7d9..67d371b49 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,27 +1,28 @@
-
+
#ffCC0000
#ff999999
#ffdd2c00
- #CBEFEC
- #E2D6BC
- #6D6862
- #F25050
- #DBDDC9
- #DDDDD0
- #FF7F66
- #94D6FD
- #F3CFC0
- #D6A07A
- #F4F4EC
- #6D6862
- #72C7EA
- #D3DB77
- #DEEFE9
- #FF7043
- #F2E9CE
+
+ #CBEFEC
+ #E2D6BC
+ #6D6862
+ #F25050
+ #DBDDC9
+ #DDDDD0
+ #FF7F66
+ #94D6FD
+ #F3CFC0
+ #D6A07A
+ #F4F4EC
+ #6D6862
+ #72C7EA
+ #D3DB77
+ #DEEFE9
+ #FF7043
+ #F2E9CE
#ff1976d2
#ff0d47a1
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index fc3e85f9f..547e4acc4 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -30,9 +30,4 @@
4dp
72dp
18dp
- 12dp
- 3dp
- 4dp
-
- 18dp
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index ec6c617c5..505cefb68 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -11,7 +11,6 @@
transition_app_item_icon
https://
- %1$s → %2$s
%1$s on F-Droid
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d51af95f..8ab40261b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
-
+
F-Droid
@@ -113,11 +113,6 @@
Overwrite
Clear search
- Available
- Installed
- Updates
- Installed (%d)
- Updates (%d)
F-Droid Updates Available
No Bluetooth send method found, choose one!
Choose Bluetooth send method
@@ -279,30 +274,26 @@
Language
System Default
- App icon
Wi-Fi
Hotspot
- All
- What\'s New
- Recently Updated
- Connectivity
- Development
- Games
- Graphics
- Internet
- Money
- Multimedia
- Navigation
- Phone & SMS
- Reading
- Science & Education
- Security
- Sports & Health
- System
- Theming
- Time
- Writing
+ Connectivity
+ Development
+ Games
+ Graphics
+ Internet
+ Money
+ Multimedia
+ Navigation
+ Phone & SMS
+ Reading
+ Science & Education
+ Security
+ Sports & Health
+ System
+ Theming
+ Time
+ Writing