From aba30dc7108493bf82fb9cf8bed8225ee7db4e6f Mon Sep 17 00:00:00 2001 From: contrudar Date: Fri, 30 Sep 2016 19:08:08 +0300 Subject: [PATCH] handle onBackPressed() in Fragment --- .../filepicker/FilePickerActivity.java | 41 +++++++++++++++++++ .../filepicker/FilePickerFragment.java | 26 +++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/nononsenseapps/filepicker/FilePickerActivity.java b/library/src/main/java/com/nononsenseapps/filepicker/FilePickerActivity.java index 00293d5..54afc39 100644 --- a/library/src/main/java/com/nononsenseapps/filepicker/FilePickerActivity.java +++ b/library/src/main/java/com/nononsenseapps/filepicker/FilePickerActivity.java @@ -8,13 +8,19 @@ package com.nononsenseapps.filepicker; import android.annotation.SuppressLint; import android.os.Environment; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.io.File; +import java.util.ArrayList; +import java.util.List; @SuppressLint("Registered") public class FilePickerActivity extends AbstractFilePickerActivity { + @NonNull + private final List onBackPressedListeners = new ArrayList<>(); + public FilePickerActivity() { super(); } @@ -30,4 +36,39 @@ public class FilePickerActivity extends AbstractFilePickerActivity { mode, allowMultiple, allowCreateDir, allowExistingFile, singleClick); return fragment; } + + public void addOnBackPressedListener(@NonNull final OnBackPressedListener onBackPressedListener) { + onBackPressedListeners.add(onBackPressedListener); + } + + public void removeOnBackPressedListener(@NonNull final OnBackPressedListener onBackPressedListener) { + onBackPressedListeners.remove(onBackPressedListener); + } + + @Override + public void onBackPressed() { + for (final OnBackPressedListener onBackPressedListener : onBackPressedListeners) { + if (onBackPressedListener.onBackPressed()) { + return; + } + } + + if (getSupportFragmentManager().getBackStackEntryCount() <= 1) { + supportFinishAfterTransition(); + } else { + getSupportFragmentManager().popBackStack(); + } + } + + public interface OnBackPressedListener { + + /** + * Calls when user presses device back button. + * + * @return True if it is processed by this object. + */ + boolean onBackPressed(); + + } + } diff --git a/library/src/main/java/com/nononsenseapps/filepicker/FilePickerFragment.java b/library/src/main/java/com/nononsenseapps/filepicker/FilePickerFragment.java index ffb4e7d..97ec795 100644 --- a/library/src/main/java/com/nononsenseapps/filepicker/FilePickerFragment.java +++ b/library/src/main/java/com/nononsenseapps/filepicker/FilePickerFragment.java @@ -9,6 +9,7 @@ package com.nononsenseapps.filepicker; import android.Manifest; import android.content.pm.PackageManager; import android.net.Uri; +import android.os.Bundle; import android.os.FileObserver; import android.support.annotation.NonNull; import android.support.v4.content.AsyncTaskLoader; @@ -24,7 +25,7 @@ import java.io.File; * An implementation of the picker which allows you to select a file from the internal/external * storage (SD-card) on a device. */ -public class FilePickerFragment extends AbstractFilePickerFragment { +public class FilePickerFragment extends AbstractFilePickerFragment implements FilePickerActivity.OnBackPressedListener { private static final String[] extensions = new String[]{".doc", ".docx", ".xlsx", ".xls", ".png", ".jpg", ".tif", ".pdf", ".jpeg"}; @@ -35,6 +36,12 @@ public class FilePickerFragment extends AbstractFilePickerFragment { public FilePickerFragment() { } + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ((FilePickerActivity) getActivity()).addOnBackPressedListener(this); + } + /** * This method is used to dictate whether hidden files and folders should be shown or not * @@ -367,4 +374,21 @@ public class FilePickerFragment extends AbstractFilePickerFragment { return lhs.getName().compareToIgnoreCase(rhs.getName()); } } + + @Override + public boolean onBackPressed() { + if ("/".equals(mCurrentPath.toString())) { + return false; + } else { + goUp(); + return true; + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + ((FilePickerActivity) getActivity()).removeOnBackPressedListener(this); + } + }