diff --git a/.idea/misc.xml b/.idea/misc.xml
index 26dc4f5..70996f8 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -25,5 +25,5 @@
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 31b5123..0063e94 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,7 +9,7 @@ android {
targetSdkVersion 28
versionCode 3
versionName "1.1.1"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
@@ -27,24 +27,24 @@ android {
dependencies {
- implementation 'com.android.support:recyclerview-v7:28.0.0'
+ implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation fileTree(include: ['*.jar'], dir: 'libs')
- androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
+ androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0-beta02', {
exclude group: 'com.android.support', module: 'support-annotations'
})
- implementation 'com.android.support:appcompat-v7:28.0.0'
- implementation 'com.android.support:preference-v7:28.0.0'
- implementation 'com.android.support:design:28.0.0'
- implementation 'com.android.support.constraint:constraint-layout:1.1.3'
- implementation 'com.android.volley:volley:1.0.0'
+ implementation 'androidx.appcompat:appcompat:1.0.0'
+ implementation 'androidx.preference:preference:1.0.0'
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
+ implementation 'com.android.volley:volley:1.1.0'
//noinspection GradleDependency
implementation 'com.google.android.gms:play-services-auth:15.0.0'
- implementation 'com.android.support:support-v4:28.0.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation 'com.android.support:appcompat-v7:28.0.0'
+ implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
- implementation 'com.android.support:support-v4:28.0.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'org.jetbrains:annotations-java5:15.0'
//implementation 'com.github.quivr:android-week-view:2.0.2'//com.github.alamkanak:android-week-view:1.2.6
implementation 'com.ms-square:expandableTextView:0.1.4'
diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java
index 56c3c79..14ec7e8 100644
--- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java
+++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java
@@ -2,24 +2,25 @@ package de.sebse.fuplanner;
import android.content.Intent;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.StringRes;
-import android.support.design.widget.NavigationView;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
+import com.google.android.material.navigation.NavigationView;
+
import java.util.Iterator;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
import de.sebse.fuplanner.fragments.CanteensFragment;
import de.sebse.fuplanner.fragments.LoginFragment;
import de.sebse.fuplanner.fragments.ModulesFragment;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java
index 223b594..41c6ba0 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java
@@ -1,11 +1,11 @@
package de.sebse.fuplanner.fragments;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.fragments.CanteensFragment.OnCanteensFragmentInteractionListener;
import de.sebse.fuplanner.services.Canteen.types.Canteen;
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..7ae6a94 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java
@@ -2,15 +2,15 @@ package de.sebse.fuplanner.fragments;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.Canteen.CanteenBrowser;
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..40f5909 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java
@@ -3,8 +3,6 @@ package de.sebse.fuplanner.fragments;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -13,6 +11,8 @@ import android.widget.EditText;
import java.io.IOException;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java
index 140e4e8..4b85503 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java
@@ -1,11 +1,11 @@
package de.sebse.fuplanner.fragments;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.fragments.ModulesFragment.OnModulesFragmentInteractionListener;
import de.sebse.fuplanner.services.KVV.types.Modules;
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..0c69320 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java
@@ -2,15 +2,15 @@ package de.sebse.fuplanner.fragments;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java
index f229b7b..3b69850 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java
@@ -2,9 +2,9 @@ package de.sebse.fuplanner.fragments;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceFragmentCompat;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.tools.logging.Logger;
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..9248904 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java
@@ -4,8 +4,6 @@ import android.app.AlertDialog;
import android.content.Context;
import android.graphics.RectF;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -15,12 +13,14 @@ import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
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.UtilsDate;
import de.sebse.fuplanner.tools.MainAcitivityListener;
+import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.weekview.MonthLoader;
import de.sebse.fuplanner.tools.ui.weekview.WeekView;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/StartupFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/StartupFragment.java
index 27ffdcc..260c71a 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/StartupFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/StartupFragment.java
@@ -1,12 +1,12 @@
package de.sebse.fuplanner.fragments;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
import de.sebse.fuplanner.R;
/**
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java
index e46ed31..d9bfcca 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java
@@ -1,8 +1,8 @@
package de.sebse.fuplanner.fragments.canteen;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentStatePagerAdapter;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentStatePagerAdapter;
import de.sebse.fuplanner.services.Canteen.types.Canteen;
import de.sebse.fuplanner.tools.UtilsDate;
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..5b299cb 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
@@ -2,13 +2,13 @@ package de.sebse.fuplanner.fragments.canteen;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager.widget.ViewPager;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.Canteen.CanteenBrowser;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java
index 74a5210..c3ce176 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java
@@ -1,9 +1,6 @@
package de.sebse.fuplanner.fragments.canteen;
import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.annotation.StringRes;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -12,6 +9,9 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.Canteen.types.Day;
import de.sebse.fuplanner.services.Canteen.types.Meal;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealFragment.java
index 16eadf2..95cee0b 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealFragment.java
@@ -3,15 +3,14 @@ package de.sebse.fuplanner.fragments.canteen;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ExpandableListView;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.Canteen.CanteenBrowser;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java
index 01b252a..a8c22cc 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java
@@ -1,9 +1,9 @@
package de.sebse.fuplanner.fragments.moddetails;
import android.content.Context;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentStatePagerAdapter;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentStatePagerAdapter;
import de.sebse.fuplanner.R;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java
index f6a6a17..95e5b05 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java
@@ -2,14 +2,14 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java
index 966fad7..cbd9c92 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java
@@ -2,14 +2,14 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java
index b9929fa..960682c 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java
@@ -1,7 +1,5 @@
package de.sebse.fuplanner.fragments.moddetails;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
@@ -9,6 +7,8 @@ import android.view.ViewGroup;
import java.util.ArrayList;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.types.Event;
import de.sebse.fuplanner.services.KVV.types.Modules;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java
index dee1b91..04fb784 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java
@@ -3,15 +3,15 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
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..4eaab77 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
@@ -2,13 +2,13 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+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;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java
index 43311a3..62a779d 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java
@@ -1,8 +1,6 @@
package de.sebse.fuplanner.fragments.moddetails;
import android.annotation.SuppressLint;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
@@ -11,10 +9,11 @@ import android.widget.TextView;
import java.util.ArrayList;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.types.Gradebook;
import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.tools.ui.CustomViewHolder;
import de.sebse.fuplanner.tools.ui.StringViewHolder;
class ModDetailGradebookAdapter extends RecyclerView.Adapter {
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java
index e6dea02..8ddf651 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java
@@ -3,15 +3,15 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java
index 6e0aace..aca5eb7 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java
@@ -1,8 +1,5 @@
package de.sebse.fuplanner.fragments.moddetails;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.RecyclerView;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
@@ -12,6 +9,9 @@ import com.ms.square.android.expandabletextview.ExpandableTextView;
import java.util.ArrayList;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.types.Announcement;
import de.sebse.fuplanner.services.KVV.types.Assignment;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java
index 5573ae3..ae8c7ec 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java
@@ -3,16 +3,16 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
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..dc4067c 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
@@ -8,12 +8,6 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -22,6 +16,12 @@ import android.widget.ImageView;
import java.io.File;
import java.util.Arrays;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityCompat;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteen.java b/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteen.java
index c948706..165b38b 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteen.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteen.java
@@ -1,6 +1,6 @@
package de.sebse.fuplanner.services.Canteen.types;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.io.Serializable;
import java.util.Calendar;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteens.java b/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteens.java
index 80d6c08..959be93 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteens.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Canteens.java
@@ -1,7 +1,7 @@
package de.sebse.fuplanner.services.Canteen.types;
import android.content.Context;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.io.FileInputStream;
import java.io.FileOutputStream;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Day.java b/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Day.java
index 34a10de..699b752 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Day.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/Canteen/types/Day.java
@@ -1,6 +1,6 @@
package de.sebse.fuplanner.services.Canteen.types;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.io.Serializable;
import java.util.Calendar;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/GoogleAuth/GoogleAuth.java b/app/src/main/java/de/sebse/fuplanner/services/GoogleAuth/GoogleAuth.java
index a4f78b1..ead95a8 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/GoogleAuth/GoogleAuth.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/GoogleAuth/GoogleAuth.java
@@ -2,8 +2,6 @@ package de.sebse.fuplanner.services.GoogleAuth;
import android.content.Intent;
import android.content.IntentSender;
-import android.support.annotation.Nullable;
-import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.Toast;
@@ -17,6 +15,9 @@ import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.ResolvableApiException;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.FragmentActivity;
+
import static android.app.Activity.RESULT_OK;
/**
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..70fbd10 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
@@ -1,13 +1,13 @@
package de.sebse.fuplanner.services.KVV;
import android.content.Context;
-import android.support.annotation.NonNull;
import android.util.Pair;
import java.io.IOException;
import java.util.ArrayList;
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;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java
index 179ea06..d87218c 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java
@@ -1,7 +1,6 @@
package de.sebse.fuplanner.services.KVV.types;
import android.content.Context;
-import android.support.annotation.Nullable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -11,6 +10,8 @@ import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
+import androidx.annotation.Nullable;
+
/**
* Created by sebastian on 29.10.17.
*/
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java
index b8dbb1a..9c313bf 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java
@@ -1,8 +1,6 @@
package de.sebse.fuplanner.services.KVV.types;
import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -14,6 +12,9 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
/**
* Created by sebastian on 29.10.17.
*/
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java
index e1b6400..0d29a3f 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java
@@ -1,10 +1,9 @@
package de.sebse.fuplanner.services.KVV.types;
-import android.support.annotation.LayoutRes;
-
import java.io.Serializable;
import java.util.ArrayList;
+import androidx.annotation.LayoutRes;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.tools.ui.treeview.LayoutItemType;
import de.sebse.fuplanner.tools.ui.treeview.TreeNode;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java b/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java
index 4d59659..f4fc34b 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java
@@ -1,7 +1,7 @@
package de.sebse.fuplanner.tools;
import android.graphics.Paint;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
public class ColorRes implements Color {
@ColorInt private final int mResId;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java
index 114d984..0b17123 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java
@@ -1,6 +1,6 @@
package de.sebse.fuplanner.tools;
-import android.support.annotation.StringRes;
+import androidx.annotation.StringRes;
import de.sebse.fuplanner.services.Canteen.CanteenBrowser;
import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java b/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java
index b3c6985..66a1581 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java
@@ -1,8 +1,8 @@
package de.sebse.fuplanner.tools;
import android.content.Context;
-import android.support.annotation.ArrayRes;
-import android.support.v7.preference.PreferenceManager;
+import androidx.annotation.ArrayRes;
+import androidx.preference.PreferenceManager;
public class Preferences {
public static String getString(Context context, @ArrayRes int key) {
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/SortedList.java b/app/src/main/java/de/sebse/fuplanner/tools/SortedList.java
index 48e66ff..15a0ee4 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/SortedList.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/SortedList.java
@@ -1,7 +1,7 @@
package de.sebse.fuplanner.tools;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.io.Serializable;
import java.util.ArrayList;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/UtilsDate.java b/app/src/main/java/de/sebse/fuplanner/tools/UtilsDate.java
index a32ab60..ef817fa 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/UtilsDate.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/UtilsDate.java
@@ -4,7 +4,7 @@ import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.text.format.DateFormat;
import com.google.android.gms.common.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java b/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java
index 3979805..f6c4de0 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java
@@ -1,24 +1,18 @@
package de.sebse.fuplanner.tools.network;
import com.android.volley.AuthFailureError;
+import com.android.volley.Header;
import com.android.volley.Request;
+import com.android.volley.toolbox.HttpResponse;
import com.android.volley.toolbox.HurlStack;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.StatusLine;
-import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicHttpResponse;
-import org.apache.http.message.BasicStatusLine;
-
import java.io.DataOutputStream;
+import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -28,12 +22,15 @@ import java.util.regex.Pattern;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSocketFactory;
+import androidx.annotation.VisibleForTesting;
+
/**
* Created by sebastian on 29.10.17.
*/
public class BetterHurlStack extends HurlStack {
private static final String HEADER_CONTENT_TYPE = "Content-Type";
+ private static final int HTTP_CONTINUE = 100;
private final UrlRewriter mUrlRewriter;
private final SSLSocketFactory mSslSocketFactory;
@@ -76,12 +73,12 @@ public class BetterHurlStack extends HurlStack {
}
@Override
- public HttpResponse performRequest(Request> request, Map additionalHeaders)
+ public HttpResponse executeRequest(Request> request, Map additionalHeaders)
throws IOException, AuthFailureError {
String url = request.getUrl();
HashMap map = new HashMap<>();
- map.putAll(request.getHeaders());
map.putAll(additionalHeaders);
+ map.putAll(request.getHeaders());
if (mUrlRewriter != null) {
String rewritten = mUrlRewriter.rewriteUrl(url);
if (rewritten == null) {
@@ -91,67 +88,85 @@ public class BetterHurlStack extends HurlStack {
}
URL parsedUrl = new URL(url);
HttpURLConnection connection = openConnection(parsedUrl, request);
- for (String headerName : map.keySet()) {
- connection.addRequestProperty(headerName, map.get(headerName));
+ boolean keepConnectionOpen = false;
+ try {
+ for (String headerName : map.keySet()) {
+ connection.setRequestProperty(headerName, map.get(headerName));
+ }
+ setConnectionParametersForRequest(connection, request);
+ // Initialize HttpResponse with data from the HttpURLConnection.
+ int responseCode = connection.getResponseCode();
+ if (responseCode == -1) {
+ // -1 is returned by getResponseCode() if the response code could not be retrieved.
+ // Signal to the caller that something was wrong with the connection.
+ throw new IOException("Could not retrieve response code from HttpUrlConnection.");
+ }
+
+ if (!hasResponseBody(request.getMethod(), responseCode)) {
+ return new HttpResponse(responseCode, convertHeaders(connection.getHeaderFields()));
+ }
+
+ // Need to keep the connection open until the stream is consumed by the caller. Wrap the
+ // stream such that close() will disconnect the connection.
+ keepConnectionOpen = true;
+ return new HttpResponse(
+ responseCode,
+ convertHeaders(connection.getHeaderFields()),
+ connection.getContentLength(),
+ new UrlConnectionInputStream(connection));
+
+ } finally {
+ if (!keepConnectionOpen) {
+ connection.disconnect();
+ }
}
- setConnectionParametersForRequest(connection, request);
- // Initialize HttpResponse with data from the HttpURLConnection.
- ProtocolVersion protocolVersion = new ProtocolVersion("HTTP", 1, 1);
- int responseCode = connection.getResponseCode();
- if (responseCode == -1) {
- // -1 is returned by getResponseCode() if the response code could not be retrieved.
- // Signal to the caller that something was wrong with the connection.
- throw new IOException("Could not retrieve response code from HttpUrlConnection.");
- }
- StatusLine responseStatus = new BasicStatusLine(protocolVersion,
- connection.getResponseCode(), connection.getResponseMessage());
- BasicHttpResponse response = new BasicHttpResponse(responseStatus);
- response.setEntity(entityFromConnection(connection));
- for (Map.Entry> header : connection.getHeaderFields().entrySet()) {
- if (header.getKey() != null) {
- Header h;
- if (header.getKey().equals("Set-Cookie")) {
+ }
+
+ @VisibleForTesting
+ static List convertHeaders(Map> responseHeaders) {
+ List headerList = new ArrayList<>(responseHeaders.size());
+ for (Map.Entry> entry : responseHeaders.entrySet()) {
+ // HttpUrlConnection includes the status line as a header with a null key; omit it here
+ // since it's not really a header and the rest of Volley assumes non-null keys.
+ if (entry.getKey() != null) {
+ if (entry.getKey().equals("Set-Cookie")) {
Pattern pattern = Pattern.compile("^([^=]+=[^;]+;)");
StringBuilder cookieValue = new StringBuilder();
- for (String value: header.getValue()) {
+ for (String value : entry.getValue()) {
Matcher matcher = pattern.matcher(value);
if (matcher.find()) {
cookieValue.append(matcher.group(1));
}
}
- h = new BasicHeader(header.getKey(), cookieValue.toString());
+ headerList.add(new Header(entry.getKey(), cookieValue.toString()));
} else {
- h = new BasicHeader(header.getKey(), header.getValue().get(0));
+ headerList.add(new Header(entry.getKey(), entry.getValue().get(0)));
}
- response.addHeader(h);
}
}
- return response;
+ return headerList;
}
/**
- * Initializes an {@link HttpEntity} from the given {@link HttpURLConnection}.
- * @param connection A http connection
- * @return an HttpEntity populated with data from connection.
+ * Checks if a response message contains a body.
+ *
+ * @see RFC 7230 section 3.3
+ * @param requestMethod request method
+ * @param responseCode response status code
+ * @return whether the response has a body
*/
- private static HttpEntity entityFromConnection(HttpURLConnection connection) {
- BasicHttpEntity entity = new BasicHttpEntity();
- InputStream inputStream;
- try {
- inputStream = connection.getInputStream();
- } catch (IOException ioe) {
- inputStream = connection.getErrorStream();
- }
- entity.setContent(inputStream);
- entity.setContentLength(connection.getContentLength());
- entity.setContentEncoding(connection.getContentEncoding());
- entity.setContentType(connection.getContentType());
- return entity;
+ private static boolean hasResponseBody(int requestMethod, int responseCode) {
+ return requestMethod != Request.Method.HEAD
+ && !(HTTP_CONTINUE <= responseCode && responseCode < HttpURLConnection.HTTP_OK)
+ && responseCode != HttpURLConnection.HTTP_NO_CONTENT
+ && responseCode != HttpURLConnection.HTTP_NOT_MODIFIED;
}
+ // NOTE: Any request headers added here (via setRequestProperty or addRequestProperty) should be
+ // checked against the existing properties in the connection and not overridden if already set.
@SuppressWarnings("deprecation")
- /* package */ static void setConnectionParametersForRequest(HttpURLConnection connection,
- Request> request) throws IOException, AuthFailureError {
+ /* package */ static void setConnectionParametersForRequest(
+ HttpURLConnection connection, Request> request) throws IOException, AuthFailureError {
switch (request.getMethod()) {
case Request.Method.DEPRECATED_GET_OR_POST:
// This is the deprecated way that needs to be handled for backwards compatibility.
@@ -159,16 +174,8 @@ public class BetterHurlStack extends HurlStack {
// GET. Otherwise, it is assumed that the request is a POST.
byte[] postBody = request.getPostBody();
if (postBody != null) {
- // Prepare output. There is no need to set Content-Length explicitly,
- // since this is handled by HttpURLConnection using the size of the prepared
- // output stream.
- connection.setDoOutput(true);
connection.setRequestMethod("POST");
- connection.addRequestProperty(HEADER_CONTENT_TYPE,
- request.getPostBodyContentType());
- DataOutputStream out = new DataOutputStream(connection.getOutputStream());
- out.write(postBody);
- out.close();
+ addBody(connection, request, postBody);
}
break;
case Request.Method.GET:
@@ -209,14 +216,26 @@ public class BetterHurlStack extends HurlStack {
throws IOException, AuthFailureError {
byte[] body = request.getBody();
if (body != null) {
- connection.setDoOutput(true);
- connection.addRequestProperty(HEADER_CONTENT_TYPE, request.getBodyContentType());
- DataOutputStream out = new DataOutputStream(connection.getOutputStream());
- out.write(body);
- out.close();
+ addBody(connection, request, body);
}
}
+ private static void addBody(HttpURLConnection connection, Request> request, byte[] body)
+ throws IOException {
+ // Prepare output. There is no need to set Content-Length explicitly,
+ // since this is handled by HttpURLConnection using the size of the prepared
+ // output stream.
+ connection.setDoOutput(true);
+ // Set the content-type unless it was already set (by Request#getHeaders).
+ if (!connection.getRequestProperties().containsKey(HEADER_CONTENT_TYPE)) {
+ connection.setRequestProperty(
+ HEADER_CONTENT_TYPE, request.getBodyContentType());
+ }
+ DataOutputStream out = new DataOutputStream(connection.getOutputStream());
+ out.write(body);
+ out.close();
+ }
+
private HttpURLConnection openConnection(URL url, Request> request) throws IOException {
HttpURLConnection connection = createConnection(url);
int timeoutMs = request.getTimeoutMs();
@@ -230,4 +249,40 @@ public class BetterHurlStack extends HurlStack {
}
return connection;
}
+
+
+ /**
+ * Wrapper for a {@link HttpURLConnection}'s InputStream which disconnects the connection on
+ * stream close.
+ */
+ static class UrlConnectionInputStream extends FilterInputStream {
+ private final HttpURLConnection mConnection;
+
+ UrlConnectionInputStream(HttpURLConnection connection) {
+ super(inputStreamFromConnection(connection));
+ mConnection = connection;
+ }
+
+ @Override
+ public void close() throws IOException {
+ super.close();
+ mConnection.disconnect();
+ }
+ }
+
+ /**
+ * Initializes an {@link InputStream} from the given {@link HttpURLConnection}.
+ *
+ * @param connection
+ * @return an HttpEntity populated with data from connection.
+ */
+ private static InputStream inputStreamFromConnection(HttpURLConnection connection) {
+ InputStream inputStream;
+ try {
+ inputStream = connection.getInputStream();
+ } catch (IOException ioe) {
+ inputStream = connection.getErrorStream();
+ }
+ return inputStream;
+ }
}
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
index 59a7811..ca7e6ef 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
@@ -1,7 +1,6 @@
package de.sebse.fuplanner.tools.network;
import android.content.Context;
-import android.support.annotation.Nullable;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
@@ -17,6 +16,7 @@ import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
+import androidx.annotation.Nullable;
import de.sebse.fuplanner.tools.logging.Logger;
/**
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/NetworkCallback.java b/app/src/main/java/de/sebse/fuplanner/tools/network/NetworkCallback.java
index fc74221..2f508fe 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/network/NetworkCallback.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/network/NetworkCallback.java
@@ -1,6 +1,6 @@
package de.sebse.fuplanner.tools.network;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
public interface NetworkCallback {
void onResponse(@NonNull T success);
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/CustomViewHolder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/CustomViewHolder.java
index 8a7a0fb..a80021e 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/CustomViewHolder.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/CustomViewHolder.java
@@ -1,8 +1,9 @@
package de.sebse.fuplanner.tools.ui;
-import android.support.v7.widget.RecyclerView;
import android.view.View;
+import androidx.recyclerview.widget.RecyclerView;
+
public class CustomViewHolder extends RecyclerView.ViewHolder {
public final View mView;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/cardview/ExpandableCardView.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/cardview/ExpandableCardView.java
index 455d3b6..2bd0063 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/cardview/ExpandableCardView.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/cardview/ExpandableCardView.java
@@ -4,9 +4,6 @@ package de.sebse.fuplanner.tools.ui.cardview;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.CardView;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
@@ -15,6 +12,9 @@ import android.view.animation.RotateAnimation;
import android.view.animation.Transformation;
import android.widget.ImageButton;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+import androidx.cardview.widget.CardView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.tools.UtilsUi;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeNode.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeNode.java
index 38f6ed0..6e56c51 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeNode.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeNode.java
@@ -1,6 +1,6 @@
package de.sebse.fuplanner.tools.ui.treeview;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewAdapter.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewAdapter.java
index 0f3c130..958c412 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewAdapter.java
@@ -1,10 +1,6 @@
package de.sebse.fuplanner.tools.ui.treeview;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -13,6 +9,11 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
/**
* Created by tlh on 2016/10/1 :)
*/
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewBinder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewBinder.java
index 522536c..a591b35 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewBinder.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/TreeViewBinder.java
@@ -1,9 +1,10 @@
package de.sebse.fuplanner.tools.ui.treeview;
-import android.support.annotation.IdRes;
-import android.support.v7.widget.RecyclerView;
import android.view.View;
+import androidx.annotation.IdRes;
+import androidx.recyclerview.widget.RecyclerView;
+
public abstract class TreeViewBinder implements LayoutItemType {
public abstract VH provideViewHolder(View itemView);
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/TextColorPicker.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/TextColorPicker.java
index 487874d..ac49e9a 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/TextColorPicker.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/TextColorPicker.java
@@ -1,6 +1,6 @@
package de.sebse.fuplanner.tools.ui.weekview;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java
index 65ffd20..5ba8223 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java
@@ -13,11 +13,6 @@ import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.view.GestureDetectorCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.animation.FastOutLinearInInterpolator;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.StaticLayout;
@@ -44,6 +39,11 @@ import java.util.Collections;
import java.util.List;
import java.util.Locale;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.view.GestureDetectorCompat;
+import androidx.core.view.ViewCompat;
+import androidx.interpolator.view.animation.FastOutLinearInInterpolator;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.tools.ColorRes;
import de.sebse.fuplanner.tools.UtilsDate;
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 18e45b1..6b82597 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,5 +1,5 @@
-
-
-
+
diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml
index 58e8c9b..e93de49 100644
--- a/app/src/main/res/layout/app_bar_main.xml
+++ b/app/src/main/res/layout/app_bar_main.xml
@@ -1,18 +1,18 @@
-
-
-
-
+
-
+
diff --git a/app/src/main/res/layout/fragment_expandable_list_view.xml b/app/src/main/res/layout/fragment_expandable_list_view.xml
index 5ecf219..61d6923 100644
--- a/app/src/main/res/layout/fragment_expandable_list_view.xml
+++ b/app/src/main/res/layout/fragment_expandable_list_view.xml
@@ -1,5 +1,5 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml
index eb9b474..58854a9 100644
--- a/app/src/main/res/layout/fragment_login.xml
+++ b/app/src/main/res/layout/fragment_login.xml
@@ -21,7 +21,7 @@
android:contentDescription="@string/cd_ic_launcher"/>
-
-
+
-
-
+
-
-
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_modules_list.xml b/app/src/main/res/layout/fragment_modules_list.xml
index 546bc96..0d4345e 100644
--- a/app/src/main/res/layout/fragment_modules_list.xml
+++ b/app/src/main/res/layout/fragment_modules_list.xml
@@ -1,17 +1,17 @@
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_recycler_view.xml b/app/src/main/res/layout/fragment_recycler_view.xml
index 23c5ea4..f561b1b 100644
--- a/app/src/main/res/layout/fragment_recycler_view.xml
+++ b/app/src/main/res/layout/fragment_recycler_view.xml
@@ -1,19 +1,19 @@
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/GoogleAuth-old.java b/docs/GoogleAuth-old.java
index 4630c80..c93200b 100644
--- a/docs/GoogleAuth-old.java
+++ b/docs/GoogleAuth-old.java
@@ -3,9 +3,6 @@ package de.sebse.fuplanner.services.GoogleAuth;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.Toast;
@@ -19,6 +16,10 @@ import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.app.FragmentActivity;
+
import static android.app.Activity.RESULT_OK;
/**
diff --git a/gradle.properties b/gradle.properties
index aac7c9b..9e6fce1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,6 +9,8 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
+android.enableJetifier=true
+android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.