From 71f5bb735ca003b54eb1f987df01f01a92910cff Mon Sep 17 00:00:00 2001 From: Joshua <8Joshua@web.de> Date: Thu, 18 Oct 2018 19:25:46 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Download=20Bugs=20gefixt=20und=20Berechtigu?= =?UTF-8?q?ngspr=C3=BCfung=20verbessert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .idea/modules.xml | 1 + .idea/vcs.xml | 2 +- .../java/de/sebse/fuplanner/MainActivity.java | 23 ++- .../fuplanner/fragments/CanteensFragment.java | 6 +- .../fuplanner/fragments/LoginFragment.java | 6 +- .../fuplanner/fragments/ModulesFragment.java | 6 +- .../fuplanner/fragments/ScheduleFragment.java | 10 +- .../canteen/DaySwitcherFragment.java | 10 +- .../moddetails/ModDetailFragment.java | 10 +- .../moddetails/ModDetailResourceFragment.java | 138 +++++++++++++----- .../services/Canteen/CanteenBrowser.java | 6 +- .../de/sebse/fuplanner/services/KVV/KVV.java | 6 +- ...istener.java => MainActivityListener.java} | 6 +- .../RequestPermissionsResultListener.java | 5 + 15 files changed, 168 insertions(+), 69 deletions(-) rename app/src/main/java/de/sebse/fuplanner/tools/{MainAcitivityListener.java => MainActivityListener.java} (72%) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/RequestPermissionsResultListener.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 26dc4f5..a8cce1b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -25,5 +25,5 @@ - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 62306f1..1192ec5 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,7 @@ + diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 56c3c79..7d44634 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -18,7 +18,9 @@ import android.view.MenuItem; import android.view.View; import android.widget.TextView; +import java.util.HashMap; import java.util.Iterator; +import java.util.function.BiConsumer; import de.sebse.fuplanner.fragments.CanteensFragment; import de.sebse.fuplanner.fragments.LoginFragment; @@ -34,11 +36,12 @@ import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth; import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; +import de.sebse.fuplanner.tools.RequestPermissionsResultListener; import de.sebse.fuplanner.tools.logging.Logger; public class MainActivity extends AppCompatActivity - implements MainAcitivityListener, + implements MainActivityListener, NavigationView.OnNavigationItemSelectedListener, LoginFragment.OnLoginFragmentInteractionListener, ModulesFragment.OnModulesFragmentInteractionListener, @@ -68,6 +71,7 @@ public class MainActivity extends AppCompatActivity private String fragmentData = ""; private CanteenBrowser mCanteenBrowser; private boolean mOfflineMode = false; + private HashMap permissionListeners = new HashMap<>(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -215,6 +219,13 @@ public class MainActivity extends AppCompatActivity super.onSaveInstanceState(savedInstanceState); } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + for (RequestPermissionsResultListener listener: permissionListeners.values()) { + listener.callback(requestCode, permissions, grantResults); + } + } + /* --------------------------------------------*/ /* --------------------------------------------*/ /* --------------------------------------------*/ @@ -482,4 +493,12 @@ public class MainActivity extends AppCompatActivity public void refreshFailed(boolean isFailed) { setRefreshFailedBanner(isFailed); } + + public void addRequestPermissionsResultListener(RequestPermissionsResultListener listener, String id) { + permissionListeners.put(id, listener); + } + + public void removeRequestPermissionsResultListener(String id) { + permissionListeners.remove(id); + } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java index efb5813..f9a2e75 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java @@ -14,7 +14,7 @@ import android.view.ViewGroup; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.Canteen.CanteenBrowser; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; /** @@ -87,8 +87,8 @@ public class CanteensFragment extends Fragment { throw new RuntimeException(context.toString() + " must implement OnCanteensFragmentInteractionListener"); } - if (context instanceof MainAcitivityListener) - ((MainAcitivityListener) context).onTitleTextChange(R.string.canteens); + if (context instanceof MainActivityListener) + ((MainActivityListener) context).onTitleTextChange(R.string.canteens); else throw new RuntimeException(context.toString() + "must implement MainActivityListener"); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java index 8a43ba5..7cc16dd 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java @@ -19,7 +19,7 @@ import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth; import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; /** @@ -120,8 +120,8 @@ public class LoginFragment extends Fragment { throw new RuntimeException(context.toString() + " must implement OnLoginFragmentInteractionListener"); } - if (context instanceof MainAcitivityListener) - ((MainAcitivityListener) context).onTitleTextChange(R.string.log_in); + if (context instanceof MainActivityListener) + ((MainActivityListener) context).onTitleTextChange(R.string.log_in); else throw new RuntimeException(context.toString() + "must implement MainActivityListener"); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java index e0a3ae0..28fd0b8 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java @@ -14,7 +14,7 @@ import android.view.ViewGroup; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.KVV; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; /** @@ -87,8 +87,8 @@ public class ModulesFragment extends Fragment { throw new RuntimeException(context.toString() + " must implement OnModulesFragmentInteractionListener"); } - if (context instanceof MainAcitivityListener) - ((MainAcitivityListener) context).onTitleTextChange(R.string.courses); + if (context instanceof MainActivityListener) + ((MainActivityListener) context).onTitleTextChange(R.string.courses); else throw new RuntimeException(context.toString() + "must implement MainActivityListener"); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java index 3c63246..b7176cd 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java @@ -20,7 +20,7 @@ import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.types.Event; import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.tools.UtilsDate; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.weekview.MonthLoader; import de.sebse.fuplanner.tools.ui.weekview.WeekView; @@ -29,14 +29,14 @@ import de.sebse.fuplanner.tools.ui.weekview.WeekViewEvent; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the - * {@link MainAcitivityListener} interface + * {@link MainActivityListener} interface * to handle interaction events. * Use the {@link ScheduleFragment#newInstance} factory method to * create an instance of this fragment. * */ public class ScheduleFragment extends Fragment implements MonthLoader.MonthChangeListener, WeekView.ScrollListener, WeekView.DoubleTapListener, WeekView.EventClickListener { - private MainAcitivityListener mListener; + private MainActivityListener mListener; private WeekView mWeekView; private final Logger log = new Logger(this); private Modules mModules = null; @@ -99,8 +99,8 @@ public class ScheduleFragment extends Fragment implements MonthLoader.MonthChang @Override public void onAttach(Context context) { super.onAttach(context); - if (context instanceof MainAcitivityListener) { - mListener = (MainAcitivityListener) context; + if (context instanceof MainActivityListener) { + mListener = (MainActivityListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java index a855b50..86ff0a2 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java @@ -13,7 +13,7 @@ import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.Canteen.CanteenBrowser; import de.sebse.fuplanner.services.Canteen.types.Canteen; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; @@ -21,7 +21,7 @@ import de.sebse.fuplanner.tools.network.NetworkErrorCallback; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the - * {@link MainAcitivityListener} interface + * {@link MainActivityListener} interface * to handle interaction events. * Use the {@link DaySwitcherFragment#newInstance} factory method to * create an instance of this fragment. @@ -32,7 +32,7 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener // Parameters private int mCanteenId; - private MainAcitivityListener mListener; + private MainActivityListener mListener; private final Logger log = new Logger(this); private ViewPager mViewPager; private DaySwitcherAdapter adapterViewPager; @@ -90,8 +90,8 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener @Override public void onAttach(Context context) { super.onAttach(context); - if (context instanceof MainAcitivityListener) { - mListener = (MainAcitivityListener) context; + if (context instanceof MainActivityListener) { + mListener = (MainActivityListener) context; } else { throw new RuntimeException(context.toString() + " must implement MainActivityListener"); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java index bdede97..7dca767 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java @@ -11,13 +11,13 @@ import android.view.ViewGroup; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.types.Modules; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the - * {@link MainAcitivityListener} interface + * {@link MainActivityListener} interface * to handle interaction events. * Use the {@link ModDetailFragment#newInstance} factory method to * create an instance of this fragment. @@ -28,7 +28,7 @@ public class ModDetailFragment extends Fragment implements ModDetailListener { // Parameters private String mItemPos; - private MainAcitivityListener mListener; + private MainActivityListener mListener; private final Logger log = new Logger(this); private ViewPager mViewPager; private String mPageRestoreRequest = null; @@ -97,8 +97,8 @@ public class ModDetailFragment extends Fragment implements ModDetailListener { @Override public void onAttach(Context context) { super.onAttach(context); - if (context instanceof MainAcitivityListener) { - mListener = (MainAcitivityListener) context; + if (context instanceof MainActivityListener) { + mListener = (MainActivityListener) context; } else { throw new RuntimeException(context.toString() + " must implement MainActivityListener"); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java index c4bd605..d6755d3 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java @@ -5,6 +5,7 @@ import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; @@ -20,14 +21,18 @@ import android.view.ViewGroup; import android.widget.ImageView; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; +import de.sebse.fuplanner.fragments.LoginFragment; import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.KVV.types.Resource; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.Regex; +import de.sebse.fuplanner.tools.RequestPermissionsResultListener; import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.treeview.DirectoryNodeBinder; @@ -35,6 +40,8 @@ import de.sebse.fuplanner.tools.ui.treeview.FileNodeBinder; import de.sebse.fuplanner.tools.ui.treeview.TreeNode; import de.sebse.fuplanner.tools.ui.treeview.TreeViewAdapter; +import static android.support.v4.content.ContextCompat.checkSelfPermission; + /** * A simple {@link Fragment} subclass. * Use the {@link ModDetailResourceFragment#newInstance} factory method to @@ -47,6 +54,8 @@ public class ModDetailResourceFragment extends Fragment { private final Logger log = new Logger(this); private ModDetailResourceAdapter adapter; private SwipeRefreshLayout swipeLayout; + private MainActivityListener context; + private RequestedDownload requestedDownload; public ModDetailResourceFragment() { @@ -95,7 +104,7 @@ public class ModDetailResourceFragment extends Fragment { onToggle(!node.isExpand(), holder); // if (!node.isExpand()) // adapter.collapseBrotherNode(node); - } else { + } else if(node.getContent() instanceof Resource.File) { KVV kvv = ((MainActivity) getActivity()).getKVV(); kvv.getModule(mItemPos, (Modules.Module module) -> { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext()); @@ -159,48 +168,94 @@ public class ModDetailResourceFragment extends Fragment { return view; } - private void download(Resource.File file, String modul, boolean downloadNew){ - KVV kvv = ((MainActivity) getActivity()).getKVV(); - + private void download(Resource.File file, String folderName, boolean downloadNew){ + if (getActivity() == null) { + showDownloadError(); + return; + } + if (checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + // Access granted + downloadOrOpen(file, folderName, downloadNew); + } else { + this.requestedDownload = new RequestedDownload(file, folderName, downloadNew); ActivityCompat.requestPermissions(ModDetailResourceFragment.super.getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); + } + } - if(isExternalStorageWritable()){ - kvv.getResourceFile(success1 -> { - if (success1.equals("")){//Datei wurde nicht heruntergeladen - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext()); - alertDialogBuilder - .setTitle(R.string.ErrorFileDownload) - .setMessage( - R.string.ErrorFileDownloadText - ) - .setCancelable(true) - .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()); - AlertDialog alertDialog = alertDialogBuilder.create(); - alertDialog.show(); - }else { - if (Regex.has("^http", success1)){ - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(success1)); - startActivity(intent); - } - else { - fileOpen(new File(success1)); - } - + private void downloadOrOpen(Resource.File file, String folderName, boolean downloadNew) { + KVV kvv = this.context.getKVV(); + if(isExternalStorageWritable()){ + kvv.getResourceFile(success1 -> { + if (success1.equals("")){//Datei wurde nicht heruntergeladen + showDownloadError(); + }else { + if (Regex.has("^http", success1)){ + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(success1)); + startActivity(intent); + } + else { + fileOpen(new File(success1)); } - }, error -> { - - log.e(error); - }, file.getTitle(), file.getUrl(), modul, downloadNew ); - } - - - + } + }, log::e, file.getTitle(), file.getUrl(), folderName, downloadNew); + } + } + private void showDownloadError() { + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext()); + alertDialogBuilder + .setTitle(R.string.ErrorFileDownload) + .setMessage( + R.string.ErrorFileDownloadText + ) + .setCancelable(true) + .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()); + AlertDialog alertDialog = alertDialogBuilder.create(); + alertDialog.show(); + } + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof MainActivityListener) { + this.context = ((MainActivityListener) context); + this.context.addRequestPermissionsResultListener((requestCode, permissions, grantResults) -> { + if (requestedDownload == null) { + log.d("No request"); + return; + } + if (getActivity() == null) { + showDownloadError(); + return; + } + ArrayList intList = new ArrayList<>(); + for (int i : grantResults) + { + intList.add(i); + } + log.d(requestCode, Arrays.asList(permissions), intList); + int pos = Arrays.asList(permissions).indexOf("android.permission.WRITE_EXTERNAL_STORAGE"); + if (pos != -1) { + if (grantResults[pos] != -1) { + downloadOrOpen(requestedDownload.file, requestedDownload.folderName, requestedDownload.downloadNew); + } else { + log.d(requestedDownload, pos, grantResults[pos]); + showDownloadError(); + } + requestedDownload = null; + } + }, "ModDetailResourceFragment"); + } else + throw new RuntimeException(context.toString() + "must implement MainActivityListener"); + } + @Override + public void onDetach() { + super.onDetach(); + this.context.removeRequestPermissionsResultListener("ModDetailResourceFragment"); } /* Checks if external storage is available for read and write */ @@ -286,4 +341,19 @@ public class ModDetailResourceFragment extends Fragment { } } + + + + + private class RequestedDownload { + Resource.File file; + String folderName; + boolean downloadNew; + + RequestedDownload(Resource.File file, String folderName, boolean downloadNew) { + this.file = file; + this.folderName = folderName; + this.downloadNew = downloadNew; + } + } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/Canteen/CanteenBrowser.java b/app/src/main/java/de/sebse/fuplanner/services/Canteen/CanteenBrowser.java index f21dbd8..88df91d 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/Canteen/CanteenBrowser.java +++ b/app/src/main/java/de/sebse/fuplanner/services/Canteen/CanteenBrowser.java @@ -13,7 +13,7 @@ import de.sebse.fuplanner.services.Canteen.types.Canteen; import de.sebse.fuplanner.services.Canteen.types.Canteens; import de.sebse.fuplanner.services.Canteen.types.Day; import de.sebse.fuplanner.tools.AsyncQueue; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.network.HTTPService; import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkError; @@ -23,12 +23,12 @@ public class CanteenBrowser extends HTTPService { private Canteens canteens; private final AsyncQueue queue = new AsyncQueue(); private final Context context; - private MainAcitivityListener mListener; + private MainActivityListener mListener; public CanteenBrowser(Context context) { super(context); this.context = context; - if (context instanceof MainAcitivityListener) + if (context instanceof MainActivityListener) mListener = (MainActivity) context; else throw new RuntimeException(context.toString() + "must implement MainActivityListener"); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java index f815c5b..5cfd049 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java @@ -10,7 +10,7 @@ import java.util.HashMap; import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; -import de.sebse.fuplanner.tools.MainAcitivityListener; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; @@ -25,11 +25,11 @@ public class KVV { private boolean isLoginPending = true; private final ArrayList updatingList; private final HashMap addons = new HashMap<>(); - private final MainAcitivityListener mListener; + private final MainActivityListener mListener; private Logger log = new Logger(this); public KVV(Context context) { - mListener = (MainAcitivityListener) context; + mListener = (MainActivityListener) context; this.context = context; this.updatingList = new ArrayList<>(); } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java similarity index 72% rename from app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java rename to app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java index 114d984..f5ed544 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java @@ -6,7 +6,7 @@ import de.sebse.fuplanner.services.Canteen.CanteenBrowser; import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth; import de.sebse.fuplanner.services.KVV.KVV; -public interface MainAcitivityListener { +public interface MainActivityListener { void onTitleTextChange(String newTitle); void onTitleTextChange(@StringRes int titleId); @@ -20,4 +20,8 @@ public interface MainAcitivityListener { void refreshFailed(boolean isFailed); CanteenBrowser getCanteenBrowser(); + + void addRequestPermissionsResultListener(RequestPermissionsResultListener listener, String id); + + void removeRequestPermissionsResultListener(String id); } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/RequestPermissionsResultListener.java b/app/src/main/java/de/sebse/fuplanner/tools/RequestPermissionsResultListener.java new file mode 100644 index 0000000..f42f55e --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/RequestPermissionsResultListener.java @@ -0,0 +1,5 @@ +package de.sebse.fuplanner.tools; + +public interface RequestPermissionsResultListener { + void callback(int requestCode, String[] permissions, int[] grantResults); +} From 7ba31b86172e68d821360798a8db85c74ed4b85b Mon Sep 17 00:00:00 2001 From: Joshua <8Joshua@web.de> Date: Thu, 18 Oct 2018 19:31:10 +0200 Subject: [PATCH 2/4] =?UTF-8?q?ResourceFragment=20aufger=C3=A4umt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moddetails/ModDetailResourceFragment.java | 43 +++++++------------ 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java index d6755d3..adc6ef6 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java @@ -105,40 +105,29 @@ public class ModDetailResourceFragment extends Fragment { // if (!node.isExpand()) // adapter.collapseBrotherNode(node); } else if(node.getContent() instanceof Resource.File) { - KVV kvv = ((MainActivity) getActivity()).getKVV(); + KVV kvv = ModDetailResourceFragment.this.context.getKVV(); kvv.getModule(mItemPos, (Modules.Module module) -> { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext()); Resource.File file = (Resource.File) node.getContent(); - String ordnername = "FU-"+module.title; + String folderName = "FU-"+module.title; File f = new File(Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_DOWNLOADS)+"/"+ordnername+"/"+file.getTitle()); + Environment.DIRECTORY_DOWNLOADS)+"/"+folderName+"/"+file.getTitle()); + alertDialogBuilder + .setTitle(file.getTitle()) + .setMessage( + getResources().getString(R.string.creator_name, file.getAuthor()) + "\n" + + getResources().getString(R.string.last_modified_on, UtilsDate.getModifiedDateTime(context, file.getModifiedDate())) + ) + .setCancelable(true) + .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()); if (f.exists()) {//prüffen ob bereits herunter geladen alertDialogBuilder - .setTitle(file.getTitle()) - .setMessage( - getResources().getString(R.string.creator_name, file.getAuthor()) + "\n" + - getResources().getString(R.string.last_modified_on, UtilsDate.getModifiedDateTime(context, file.getModifiedDate())) - ) - .setCancelable(true) - .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()) - .setNegativeButton(R.string.openFile, (dialog, id) -> download(file, ordnername, false)) - .setPositiveButton(R.string.download, (dialog, id) -> download(file, ordnername, true)); - AlertDialog alertDialog = alertDialogBuilder.create(); - alertDialog.show(); - } - else { - alertDialogBuilder - .setTitle(file.getTitle()) - .setMessage( - getResources().getString(R.string.creator_name, file.getAuthor()) + "\n" + - getResources().getString(R.string.last_modified_on, UtilsDate.getModifiedDateTime(context, file.getModifiedDate())) - ) - .setCancelable(true) - .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()) - .setPositiveButton(R.string.download, (dialog, id) -> download(file, ordnername, true)); - AlertDialog alertDialog = alertDialogBuilder.create(); - alertDialog.show(); + .setNegativeButton(R.string.openFile, (dialog, id) -> download(file, folderName, false)); } + alertDialogBuilder + .setPositiveButton(R.string.download, (dialog, id) -> download(file, folderName, true)); + AlertDialog alertDialog = alertDialogBuilder.create(); + alertDialog.show(); }, error -> { log.e(error); From c0b4268f0e7044b05f2a495bc6da08504981f1d8 Mon Sep 17 00:00:00 2001 From: Joshua <8Joshua@web.de> Date: Thu, 18 Oct 2018 19:31:46 +0200 Subject: [PATCH 3/4] ResourceFragment Warnumgen entfernt --- .../fragments/moddetails/ModDetailResourceFragment.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java index adc6ef6..883c3c4 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java @@ -26,13 +26,11 @@ import java.util.Arrays; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; -import de.sebse.fuplanner.fragments.LoginFragment; import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.KVV.types.Resource; import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.Regex; -import de.sebse.fuplanner.tools.RequestPermissionsResultListener; import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.treeview.DirectoryNodeBinder; @@ -129,9 +127,7 @@ public class ModDetailResourceFragment extends Fragment { AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); - }, error -> { - log.e(error); - }); + }, log::e); } return false; } From ff1845d7aa7887446b33353448ca76880f73bb14 Mon Sep 17 00:00:00 2001 From: Joshua <8Joshua@web.de> Date: Thu, 18 Oct 2018 20:02:17 +0200 Subject: [PATCH 4/4] Kein Fragment Commit wenn isStateSaved --- app/src/main/java/de/sebse/fuplanner/MainActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 7d44634..d65ab31 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -313,6 +313,9 @@ public class MainActivity extends AppCompatActivity } private void changeFragment(int newFragment, String newData) { + if (mFragmentManager.isStateSaved()) + return; + //log.d("changeFragment: ", newFragment, newData); onTitleTextChange(R.string.courses); Fragment fragment;