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 14ec7e8..6071bb0 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -9,7 +9,9 @@ import android.widget.TextView; import com.google.android.material.navigation.NavigationView; +import java.util.HashMap; import java.util.Iterator; +import java.util.function.BiConsumer; import androidx.annotation.NonNull; import androidx.annotation.StringRes; @@ -35,11 +37,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, @@ -69,6 +72,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) { @@ -216,6 +220,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); + } + } + /* --------------------------------------------*/ /* --------------------------------------------*/ /* --------------------------------------------*/ @@ -303,6 +314,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; @@ -483,4 +497,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 7ae6a94..50526ef 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 androidx.swiperefreshlayout.widget.SwipeRefreshLayout; 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 40f5909..30ee62a 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 0c69320..589deb0 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 androidx.swiperefreshlayout.widget.SwipeRefreshLayout; 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 9248904..224cf9e 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java @@ -19,8 +19,8 @@ import de.sebse.fuplanner.R; 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.MainAcitivityListener; import de.sebse.fuplanner.tools.UtilsDate; +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 5b299cb..46be30a 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 4eaab77..d1c2591 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 androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; 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 dc4067c..ad0568a 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; @@ -14,6 +15,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import androidx.annotation.NonNull; @@ -27,6 +29,7 @@ import de.sebse.fuplanner.R; 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.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; @@ -35,6 +38,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 +52,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,45 +102,32 @@ public class ModDetailResourceFragment extends Fragment { onToggle(!node.isExpand(), holder); // if (!node.isExpand()) // adapter.collapseBrotherNode(node); - } else { - KVV kvv = ((MainActivity) getActivity()).getKVV(); + } else if(node.getContent() instanceof Resource.File) { + 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); - }); + }, log::e); } return false; } @@ -159,48 +153,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 +326,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 70fbd10..9326026 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 androidx.annotation.NonNull; 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 0b17123..3efe281 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); +}