diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java index 4f0729d355..96e44c652e 100644 --- a/OsmAnd/src/net/osmand/AndroidUtils.java +++ b/OsmAnd/src/net/osmand/AndroidUtils.java @@ -22,6 +22,8 @@ import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.StateListDrawable; import android.net.Uri; import android.os.Build; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.os.IBinder; import android.os.PowerManager; import android.os.StatFs; @@ -264,6 +266,11 @@ public class AndroidUtils { return ""; } + public static String getFreeSpace(Context ctx, File dir) { + long size = AndroidUtils.getAvailableSpace(dir); + return AndroidUtils.formatSize(ctx, size); + } + public static View findParentViewById(View view, int id) { ViewParent viewParent = view.getParent(); @@ -856,11 +863,39 @@ public class AndroidUtils { return result; } + public static long getAvailableSpace(@NonNull OsmandApplication app) { + return getAvailableSpace(app.getAppPath(null)); + } + + public static long getTotalSpace(@NonNull OsmandApplication app) { + return getTotalSpace(app.getAppPath(null)); + } + public static long getAvailableSpace(@Nullable File dir) { if (dir != null && dir.canRead()) { try { StatFs fs = new StatFs(dir.getAbsolutePath()); - return fs.getAvailableBlocksLong() * fs.getBlockSize(); + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) { + return fs.getAvailableBlocksLong() * fs.getBlockSizeLong(); + } else { + return fs.getAvailableBlocks() * fs.getBlockSize(); + } + } catch (IllegalArgumentException e) { + LOG.error(e); + } + } + return -1; + } + + public static long getTotalSpace(@Nullable File dir) { + if (dir != null && dir.canRead()) { + try { + StatFs fs = new StatFs(dir.getAbsolutePath()); + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) { + return fs.getBlockCountLong() * fs.getBlockSizeLong(); + } else { + return fs.getBlockCount() * fs.getBlockSize(); + } } catch (IllegalArgumentException e) { LOG.error(e); } @@ -887,13 +922,6 @@ public class AndroidUtils { return -1; } - public static float getUsedSpaceGb(File dir) { - if (dir.canRead()) { - return getTotalSpaceGb(dir) - getFreeSpaceGb(dir); - } - return -1; - } - public static CharSequence getStyledString(CharSequence baseString, CharSequence stringToInsertAndStyle, CharacterStyle baseStyle, CharacterStyle replaceStyle) { int indexOfPlaceholder = baseString.toString().indexOf(STRING_PLACEHOLDER); diff --git a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java index 0bf4bb55fb..2a09ffe3e9 100644 --- a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java +++ b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java @@ -22,7 +22,6 @@ import android.media.MediaRecorder; import android.media.SoundPool; import android.net.Uri; import android.os.Build; -import android.os.StatFs; import android.provider.MediaStore; import android.view.Display; import android.view.KeyEvent; @@ -1607,13 +1606,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { double bitrate = (((p.videoBitRate + p.audioBitRate) / 8f) * 60f) / (1 << 30); // gigabytes per minute double clipSpace = bitrate * AV_RS_CLIP_LENGTH.get(); double storageSize = AV_RS_STORAGE_SIZE.get(); - - double availableSpace = storageSize; - File dir = app.getAppPath("").getParentFile(); - if (dir.canRead()) { - StatFs fs = new StatFs(dir.getAbsolutePath()); - availableSpace = (double) (fs.getAvailableBlocks()) * fs.getBlockSize() / (1 << 30) - clipSpace; - } + double availableSpace = (double) AndroidUtils.getAvailableSpace(app) / (1 << 30) - clipSpace; if (usedSpace + clipSpace > storageSize || clipSpace > availableSpace) { Arrays.sort(files, new Comparator() { diff --git a/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java b/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java index 3123b81c9b..5481908653 100644 --- a/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java +++ b/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java @@ -11,7 +11,6 @@ import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.Build; import android.os.Bundle; -import android.os.StatFs; import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; @@ -42,7 +41,6 @@ import net.osmand.plus.widgets.style.CustomTypefaceSpan; import org.apache.commons.logging.Log; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -381,16 +379,7 @@ public class MultimediaNotesFragment extends BaseSettingsFragment implements Cop private void setupStorageSizePref(AudioVideoNotesPlugin plugin) { ListPreferenceEx storageSize = (ListPreferenceEx) findPreference(plugin.AV_RS_STORAGE_SIZE.getId()); - File dir = app.getAppPath("").getParentFile(); - long size = 0; - if (dir.canRead()) { - try { - StatFs fs = new StatFs(dir.getAbsolutePath()); - size = ((long) fs.getBlockSize() * (long) fs.getBlockCount()) / (1 << 30); - } catch (IllegalArgumentException e) { - log.error(e); - } - } + long size = AndroidUtils.getTotalSpace(app) / (1 << 30); if (size > 0) { int value = 1; ArrayList gbList = new ArrayList<>(); diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java b/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java index bd8918ac4d..34c5659a4f 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java @@ -11,7 +11,6 @@ import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.os.StatFs; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -34,10 +33,10 @@ import net.osmand.FileUtils; import net.osmand.PlatformUtil; import net.osmand.ValueHolder; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.ProgressImplementation; import net.osmand.plus.R; import net.osmand.plus.download.DownloadActivity; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -93,18 +92,6 @@ public class DashChooseAppDirFragment { selectePathTemp = null; } - private String getFreeSpace(File dir) { - if (dir.canRead()) { - try { - StatFs fs = new StatFs(dir.getAbsolutePath()); - return AndroidUtils.formatSize(activity, (long) fs.getAvailableBlocks() * fs.getBlockSize()); - } catch (IllegalArgumentException e) { - LOG.error(e); - } - } - return ""; - } - public void updateView() { if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE) { locationPath.setText(R.string.storage_directory_internal_app); @@ -117,7 +104,7 @@ public class DashChooseAppDirFragment { } else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) { locationPath.setText(R.string.storage_directory_manual); } - locationDesc.setText(selectedFile.getAbsolutePath() + " \u2022 " + getFreeSpace(selectedFile)); + locationDesc.setText(selectedFile.getAbsolutePath() + " \u2022 " + AndroidUtils.getFreeSpace(activity, selectedFile)); boolean copyFiles = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath()) && !mapsCopied; warningReadonly.setVisibility(copyFiles ? View.VISIBLE : View.GONE); if (copyFiles) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java index ed45d50e84..65e6a8f855 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java @@ -652,7 +652,7 @@ public class DownloadActivity extends AbstractDownloadActivity implements Downlo TextView messageTextView = (TextView) view.findViewById(R.id.leftTextView); ProgressBar sizeProgress = (ProgressBar) view.findViewById(R.id.progressBar); - File dir = activity.getMyApplication().getAppPath("").getParentFile(); + File dir = activity.getMyApplication().getAppPath(null); String size = ""; int percent = 0; if (dir.canRead()) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 568dcc9ed6..45d9b77402 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -9,7 +9,6 @@ import android.net.TrafficStats; import android.net.Uri; import android.os.AsyncTask; import android.os.AsyncTask.Status; -import android.os.StatFs; import android.view.View; import android.widget.Toast; @@ -17,13 +16,12 @@ import androidx.annotation.UiThread; import androidx.appcompat.app.AlertDialog; import net.osmand.AndroidNetworkUtils; +import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.map.WorldRegion; import net.osmand.map.WorldRegion.RegionParams; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.base.BasicProgressAsyncTask; @@ -31,6 +29,8 @@ import net.osmand.plus.download.DownloadFileHelper.DownloadFileShowWarning; import net.osmand.plus.helpers.DatabaseHelper; import net.osmand.plus.notifications.OsmandNotification; import net.osmand.plus.resources.ResourceManager; +import net.osmand.plus.settings.backend.OsmandPreference; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -302,19 +302,8 @@ public class DownloadIndexesThread { return null; } - @SuppressWarnings("deprecation") public double getAvailableSpace() { - File dir = app.getAppPath("").getParentFile(); - double asz = -1; - if (dir.canRead()) { - try { - StatFs fs = new StatFs(dir.getAbsolutePath()); - asz = (((long) fs.getAvailableBlocks()) * fs.getBlockSize()) / (1 << 20); - } catch (IllegalArgumentException e) { - LOG.error(e); - } - } - return asz; + return AndroidUtils.getAvailableSpace(app) / (1 << 20); } /// PRIVATE IMPL diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DataStoragePlaceDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/DataStoragePlaceDialogFragment.java index be619f324f..76bc14f5af 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/DataStoragePlaceDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/DataStoragePlaceDialogFragment.java @@ -5,7 +5,6 @@ import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.os.StatFs; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -17,8 +16,6 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import com.ibm.icu.impl.IllegalIcuArgumentException; - import androidx.annotation.NonNull; import androidx.fragment.app.FragmentManager; @@ -28,12 +25,12 @@ import net.osmand.IProgress; import net.osmand.PlatformUtil; import net.osmand.plus.OnDismissDialogFragmentListener; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.base.BottomSheetDialogFragment; import net.osmand.plus.dashboard.DashChooseAppDirFragment; import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadIndexesThread; +import net.osmand.plus.settings.backend.OsmandSettings; import org.apache.commons.logging.Log; @@ -119,7 +116,7 @@ public class DataStoragePlaceDialogFragment extends BottomSheetDialogFragment { deviceStorageImageView.setImageDrawable(getContentIcon(R.drawable.ic_action_phone)); TextView deviceStorageDescription = (TextView) view.findViewById(R.id.deviceMemoryDescription); deviceStorageDescription.setText(deviceStorageName); - deviceStorageDescription.setText(getFreeSpace(deviceStorage)); + deviceStorageDescription.setText(AndroidUtils.getFreeSpace(activity, deviceStorage)); View sharedMemoryRow = view.findViewById(R.id.sharedMemoryRow); if (hasExternalStoragePermission && sharedStorage != null) { @@ -127,7 +124,7 @@ public class DataStoragePlaceDialogFragment extends BottomSheetDialogFragment { ImageView sharedMemoryImageView = (ImageView) view.findViewById(R.id.sharedMemoryImageView); sharedMemoryImageView.setImageDrawable(getContentIcon(R.drawable.ic_action_phone)); TextView sharedMemoryDescription = (TextView) view.findViewById(R.id.sharedMemoryDescription); - sharedMemoryDescription.setText(getFreeSpace(sharedStorage)); + sharedMemoryDescription.setText(AndroidUtils.getFreeSpace(activity, sharedStorage)); } else { view.findViewById(R.id.divSharedStorage).setVisibility(View.GONE); sharedMemoryRow.setVisibility(View.GONE); @@ -139,7 +136,7 @@ public class DataStoragePlaceDialogFragment extends BottomSheetDialogFragment { ImageView memoryStickImageView = (ImageView) view.findViewById(R.id.memoryStickImageView); memoryStickImageView.setImageDrawable(getContentIcon(R.drawable.ic_sdcard)); TextView memoryStickDescription = (TextView) view.findViewById(R.id.memoryStickDescription); - memoryStickDescription.setText(getFreeSpace(cardStorage)); + memoryStickDescription.setText(AndroidUtils.getFreeSpace(activity, cardStorage)); } else { view.findViewById(R.id.divExtStorage).setVisibility(View.GONE); memoryStickRow.setVisibility(View.GONE); @@ -192,23 +189,6 @@ public class DataStoragePlaceDialogFragment extends BottomSheetDialogFragment { .getDefaultInternalStorage(); } - private String getFreeSpace(File dir) { - String sz = ""; - if (dir != null && dir.canRead()) { - try { - StatFs fs = new StatFs(dir.getAbsolutePath()); - @SuppressWarnings("deprecation") - long size = (long) fs.getAvailableBlocks() * fs.getBlockSize(); - if (size > 0) { - sz = AndroidUtils.formatSize(getActivity(), size); - } - } catch (IllegalIcuArgumentException e) { - LOG.error(e); - } - } - return sz; - } - private void checkAssets() { getMyApplication().getResourceManager().checkAssets(IProgress.EMPTY_PROGRESS, true); } diff --git a/OsmAnd/src/net/osmand/plus/firstusage/FirstUsageWizardFragment.java b/OsmAnd/src/net/osmand/plus/firstusage/FirstUsageWizardFragment.java index f8c3935b25..8bbc8c456e 100644 --- a/OsmAnd/src/net/osmand/plus/firstusage/FirstUsageWizardFragment.java +++ b/OsmAnd/src/net/osmand/plus/firstusage/FirstUsageWizardFragment.java @@ -5,7 +5,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.os.StatFs; import android.provider.Settings.Secure; import android.util.Log; import android.view.LayoutInflater; @@ -37,7 +36,6 @@ import net.osmand.plus.AppInitializer.AppInitializeListener; import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; @@ -51,12 +49,12 @@ import net.osmand.plus.download.IndexItem; import net.osmand.plus.download.ui.DataStoragePlaceDialogFragment; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.resources.ResourceManager; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import org.json.JSONObject; -import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashMap; @@ -331,7 +329,7 @@ public class FirstUsageWizardFragment extends BaseOsmAndFragment implements OsmA FragmentActivity activity = getActivity(); if (!OsmAndLocationProvider.isLocationPermissionAvailable(activity)) { ActivityCompat.requestPermissions(activity, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, + new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, FIRST_USAGE_LOCATION_PERMISSION); } else { app.getLocationProvider().addLocationListener(this); @@ -387,13 +385,13 @@ public class FirstUsageWizardFragment extends BaseOsmAndFragment implements OsmA @Override public void onResume() { super.onResume(); - ((MapActivity)getActivity()).disableDrawer(); + ((MapActivity) getActivity()).disableDrawer(); } @Override public void onPause() { super.onPause(); - ((MapActivity)getActivity()).enableDrawer(); + ((MapActivity) getActivity()).enableDrawer(); } @Override @@ -697,7 +695,7 @@ public class FirstUsageWizardFragment extends BaseOsmAndFragment implements OsmA TextView freeSpaceValue = (TextView) storageView.findViewById(R.id.storage_free_space_value); String freeSpaceStr = getString(R.string.storage_free_space) + ": "; freeSpace.setText(freeSpaceStr); - freeSpaceValue.setText(getFreeSpace(settings.getExternalStorageDirectory())); + freeSpaceValue.setText(AndroidUtils.getFreeSpace(storageView.getContext(), settings.getExternalStorageDirectory())); AppCompatButton changeStorageButton = (AppCompatButton) storageView.findViewById(R.id.storage_change_button); if (wizardType == WizardType.MAP_DOWNLOAD) { @@ -709,7 +707,7 @@ public class FirstUsageWizardFragment extends BaseOsmAndFragment implements OsmA public void onClick(View v) { if (!DownloadActivity.hasPermissionToWriteExternalStorage(getContext())) { ActivityCompat.requestPermissions(getActivity(), - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, FIRST_USAGE_REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION); } else { @@ -737,18 +735,6 @@ public class FirstUsageWizardFragment extends BaseOsmAndFragment implements OsmA } } - private String getFreeSpace(File dir) { - if (dir.canRead()) { - try { - StatFs fs = new StatFs(dir.getAbsolutePath()); - return AndroidUtils.formatSize(getActivity(), (long) fs.getAvailableBlocks() * fs.getBlockSize()); - } catch (IllegalArgumentException e) { - LOG.error(e); - } - } - return ""; - } - public static void showSearchLocationFragment(FragmentActivity activity, boolean searchByIp) { Fragment fragment = new FirstUsageWizardFragment(); Bundle args = new Bundle(); diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsListFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsListFragment.java index 6e2129deab..b7c5c6a0f9 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsListFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsListFragment.java @@ -36,7 +36,6 @@ import net.osmand.plus.settings.fragments.ExportSettingsAdapter.OnItemSelectedLi import net.osmand.plus.widgets.TextViewEx; import net.osmand.util.Algorithms; -import java.io.File; import java.util.ArrayList; import java.util.EnumMap; import java.util.LinkedHashMap; @@ -221,8 +220,7 @@ public abstract class BaseSettingsListFragment extends BaseOsmAndFragment implem if (calculatedSize != 0) { selectedItemsSize.setText(AndroidUtils.formatSize(app, calculatedSize)); - File dir = app.getAppPath("").getParentFile(); - long availableSizeBytes = AndroidUtils.getAvailableSpace(dir); + long availableSizeBytes = AndroidUtils.getAvailableSpace(app); if (calculatedSize > availableSizeBytes) { String availableSize = AndroidUtils.formatSize(app, availableSizeBytes); availableSpaceDescr.setText(getString(R.string.export_not_enough_space_descr, availableSize));