From 2093a21694e09a077ebe261eb85ab28eb953bea4 Mon Sep 17 00:00:00 2001 From: Jakub Zomerfeld Date: Wed, 15 Sep 2021 14:04:07 +0200 Subject: [PATCH 1/3] feat: update sdk 30 & min to 23 --- app/build.gradle | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f3a7109..3e012d4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 + compileSdkVersion 30 defaultConfig { applicationId "at.xtools.pwawrapper" - minSdkVersion 20 - targetSdkVersion 28 - versionCode 1 - versionName "1.0" + minSdkVersion 23 + targetSdkVersion 30 + versionCode 2 + versionName "2.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -15,6 +15,11 @@ android { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + + debug { + minifyEnabled false + debuggable true + } } } @@ -24,5 +29,5 @@ dependencies { exclude group: 'com.android.support', module: 'support-annotations' }) implementation 'com.android.support:appcompat-v7:28.0.0' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' } From 95d728c2810845516c4fc21e77217048972ebc82 Mon Sep 17 00:00:00 2001 From: Jakub Zomerfeld Date: Wed, 15 Sep 2021 14:05:27 +0200 Subject: [PATCH 2/3] fix: update gitignore to ignore .idea folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 47a01f1..ea469c0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ local.properties .Trashes ehthumbs.db Thumbs.db +/.idea From 0dce56261061fd8e2dc932c63230eaf84f770b7b Mon Sep 17 00:00:00 2001 From: Jakub Zomerfeld Date: Wed, 15 Sep 2021 14:19:53 +0200 Subject: [PATCH 3/3] feat: upgrade gradle, mavenCentral, AndroidX --- .idea/gradle.xml | 12 +++-- .idea/misc.xml | 2 +- app/build.gradle | 6 +-- app/src/main/AndroidManifest.xml | 4 +- .../java/at/xtools/pwawrapper/Constants.java | 18 +++---- .../at/xtools/pwawrapper/MainActivity.java | 7 ++- .../at/xtools/pwawrapper/ui/UIManager.java | 53 +++++++++---------- .../pwawrapper/webview/WebViewHelper.java | 48 ++++++----------- app/src/main/res/layout/activity_main.xml | 4 +- build.gradle | 7 +-- gradle.properties | 2 + gradle/wrapper/gradle-wrapper.properties | 2 +- 12 files changed, 77 insertions(+), 88 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 2996d53..35ffc65 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,13 +1,19 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index 37a7509..ef61796 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3e012d4..ceefcb1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { targetSdkVersion 30 versionCode 2 versionName "2.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -25,9 +25,9 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { + androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0', { exclude group: 'com.android.support', module: 'support-annotations' }) - implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'androidx.appcompat:appcompat:1.3.1' testImplementation 'junit:junit:4.13.2' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f60de54..7ac01ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -16,7 +17,8 @@ android:icon="@mipmap/ic_launcher_round" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" - android:supportsRtl="true"> + android:supportsRtl="true" + tools:targetApi="n"> diff --git a/app/src/main/java/at/xtools/pwawrapper/Constants.java b/app/src/main/java/at/xtools/pwawrapper/Constants.java index 13b136e..5a85371 100644 --- a/app/src/main/java/at/xtools/pwawrapper/Constants.java +++ b/app/src/main/java/at/xtools/pwawrapper/Constants.java @@ -3,22 +3,22 @@ public class Constants { public Constants(){} // Root page - public static String WEBAPP_URL = "https://www.leasingrechnen.at/"; - public static String WEBAPP_HOST = "leasingrechnen.at"; // used for checking Intent-URLs + public static final String WEBAPP_URL = "https://www.leasingrechnen.at/"; + public static final String WEBAPP_HOST = "leasingrechnen.at"; // used for checking Intent-URLs // User Agent tweaks - public static boolean POSTFIX_USER_AGENT = true; // set to true to append USER_AGENT_POSTFIX to user agent - public static boolean OVERRIDE_USER_AGENT = false; // set to true to use USER_AGENT instead of default one - public static String USER_AGENT_POSTFIX = "AndroidApp"; // useful for identifying traffic, e.g. in Google Analytics - public static String USER_AGENT = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36"; + public static final boolean POSTFIX_USER_AGENT = true; // set to true to append USER_AGENT_POSTFIX to user agent + public static final boolean OVERRIDE_USER_AGENT = false; // set to true to use USER_AGENT instead of default one + public static final String USER_AGENT_POSTFIX = "AndroidApp"; // useful for identifying traffic, e.g. in Google Analytics + public static final String USER_AGENT = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36"; // Constants // window transition duration in ms - public static int SLIDE_EFFECT = 2200; + public static final int SLIDE_EFFECT = 2200; // show your app when the page is loaded XX %. // lower it, if you've got server-side rendering (e.g. to 35), // bump it up to ~98 if you don't have SSR or a loading screen in your web app - public static int PROGRESS_THRESHOLD = 65; + public static final int PROGRESS_THRESHOLD = 65; // turn on/off mixed content (both https+http within one page) for API >= 21 - public static boolean ENABLE_MIXED_CONTENT = true; + public static final boolean ENABLE_MIXED_CONTENT = true; } diff --git a/app/src/main/java/at/xtools/pwawrapper/MainActivity.java b/app/src/main/java/at/xtools/pwawrapper/MainActivity.java index 0e20a64..c44ad8c 100644 --- a/app/src/main/java/at/xtools/pwawrapper/MainActivity.java +++ b/app/src/main/java/at/xtools/pwawrapper/MainActivity.java @@ -2,15 +2,13 @@ import android.content.Intent; import android.net.Uri; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import at.xtools.pwawrapper.ui.UIManager; import at.xtools.pwawrapper.webview.WebViewHelper; public class MainActivity extends AppCompatActivity { - // Globals - private UIManager uiManager; private WebViewHelper webViewHelper; private boolean intentHandled = false; @@ -22,7 +20,8 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); // Setup Helpers - uiManager = new UIManager(this); + // Globals + UIManager uiManager = new UIManager(this); webViewHelper = new WebViewHelper(this, uiManager); // Setup App diff --git a/app/src/main/java/at/xtools/pwawrapper/ui/UIManager.java b/app/src/main/java/at/xtools/pwawrapper/ui/UIManager.java index f1bc913..c347fee 100644 --- a/app/src/main/java/at/xtools/pwawrapper/ui/UIManager.java +++ b/app/src/main/java/at/xtools/pwawrapper/ui/UIManager.java @@ -19,27 +19,24 @@ public class UIManager { // Instance variables - private Activity activity; - private WebView webView; - private ProgressBar progressSpinner; - private ProgressBar progressBar; - private LinearLayout offlineContainer; + private final Activity activity; + private final WebView webView; + private final ProgressBar progressSpinner; + private final ProgressBar progressBar; + private final LinearLayout offlineContainer; private boolean pageLoaded = false; public UIManager(Activity activity) { this.activity = activity; - this.progressBar = (ProgressBar) activity.findViewById(R.id.progressBarBottom); - this.progressSpinner = (ProgressBar) activity.findViewById(R.id.progressSpinner); - this.offlineContainer = (LinearLayout) activity.findViewById(R.id.offlineContainer); - this.webView = (WebView) activity.findViewById(R.id.webView); + this.progressBar = activity.findViewById(R.id.progressBarBottom); + this.progressSpinner = activity.findViewById(R.id.progressSpinner); + this.offlineContainer = activity.findViewById(R.id.offlineContainer); + this.webView = activity.findViewById(R.id.webView); // set click listener for offline-screen - offlineContainer.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - webView.loadUrl(Constants.WEBAPP_URL); - setOffline(false); - } + offlineContainer.setOnClickListener(v -> { + webView.loadUrl(Constants.WEBAPP_URL); + setOffline(false); }); } @@ -92,21 +89,19 @@ public void setOffline(boolean offline) { // set icon in recent activity view to a white one to be visible in the app bar public void changeRecentAppsIcon() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Bitmap iconWhite = BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_appbar); + Bitmap iconWhite = BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_appbar); - TypedValue typedValue = new TypedValue(); - Resources.Theme theme = activity.getTheme(); - theme.resolveAttribute(R.attr.colorPrimary, typedValue, true); - int color = typedValue.data; + TypedValue typedValue = new TypedValue(); + Resources.Theme theme = activity.getTheme(); + theme.resolveAttribute(R.attr.colorPrimary, typedValue, true); + int color = typedValue.data; - ActivityManager.TaskDescription description = new ActivityManager.TaskDescription( - activity.getResources().getString(R.string.app_name), - iconWhite, - color - ); - activity.setTaskDescription(description); - iconWhite.recycle(); - } + ActivityManager.TaskDescription description = new ActivityManager.TaskDescription( + activity.getResources().getString(R.string.app_name), + iconWhite, + color + ); + activity.setTaskDescription(description); + iconWhite.recycle(); } } diff --git a/app/src/main/java/at/xtools/pwawrapper/webview/WebViewHelper.java b/app/src/main/java/at/xtools/pwawrapper/webview/WebViewHelper.java index f19f49c..1a9f976 100644 --- a/app/src/main/java/at/xtools/pwawrapper/webview/WebViewHelper.java +++ b/app/src/main/java/at/xtools/pwawrapper/webview/WebViewHelper.java @@ -1,5 +1,6 @@ package at.xtools.pwawrapper.webview; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; @@ -26,15 +27,15 @@ public class WebViewHelper { // Instance variables - private Activity activity; - private UIManager uiManager; - private WebView webView; - private WebSettings webSettings; + private final Activity activity; + private final UIManager uiManager; + private final WebView webView; + private final WebSettings webSettings; public WebViewHelper(Activity activity, UIManager uiManager) { this.activity = activity; this.uiManager = uiManager; - this.webView = (WebView) activity.findViewById(R.id.webView); + this.webView = activity.findViewById(R.id.webView); this.webSettings = webView.getSettings(); } @@ -73,6 +74,7 @@ public void forceCacheIfOffline() { } // handles initial setup of webview + @SuppressLint("SetJavaScriptEnabled") public void setupWebView() { // accept cookies CookieManager.getInstance().setAcceptCookie(true); @@ -82,20 +84,13 @@ public void setupWebView() { webSettings.setSupportMultipleWindows(true); // PWA settings - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - webSettings.setDatabasePath(activity.getApplicationContext().getFilesDir().getAbsolutePath()); - } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - webSettings.setAppCacheMaxSize(Long.MAX_VALUE); - } webSettings.setDomStorageEnabled(true); webSettings.setAppCachePath(activity.getApplicationContext().getCacheDir().getAbsolutePath()); webSettings.setAppCacheEnabled(true); webSettings.setDatabaseEnabled(true); // enable mixed content mode conditionally - if (Constants.ENABLE_MIXED_CONTENT - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Constants.ENABLE_MIXED_CONTENT) { webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); } @@ -150,21 +145,16 @@ public void onPageStarted(WebView view, String url, Bitmap favicon) { @Deprecated @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - handleLoadError(errorCode); - } } @TargetApi(Build.VERSION_CODES.M) @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // new API method calls this on every error for each resource. - // we only want to interfere if the page itself got problems. - String url = request.getUrl().toString(); - if (view.getUrl().equals(url)) { - handleLoadError(error.getErrorCode()); - } + // new API method calls this on every error for each resource. + // we only want to interfere if the page itself got problems. + String url = request.getUrl().toString(); + if (view.getUrl().equals(url)) { + handleLoadError(error.getErrorCode()); } } }); @@ -192,17 +182,13 @@ private void handleLoadError(int errorCode) { uiManager.setOffline(true); } else { // Unsupported Scheme, recover - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - goBack(); - } - }, 100); + new Handler().postDelayed(() -> goBack(), 100); } } // handle external urls - private boolean handleUrlLoad(WebView view, String url) { + @SuppressLint("QueryPermissionsNeeded") + private void handleUrlLoad(WebView view, String url) { // prevent loading content that isn't ours if (!url.startsWith(Constants.WEBAPP_URL)) { // stop loading @@ -222,13 +208,11 @@ private boolean handleUrlLoad(WebView view, String url) { showNoAppDialog(activity); } // return value for shouldOverrideUrlLoading - return true; } else { // let WebView load the page! // activate loading animation screen uiManager.setLoading(true); // return value for shouldOverrideUrlLoading - return false; } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e7e0f96..a628c12 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -23,8 +23,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - android:tint="@color/colorPrimary" - app:srcCompat="@drawable/ic_cloud_off_black_48dp" /> + app:srcCompat="@drawable/ic_cloud_off_black_48dp" + app:tint="@color/colorPrimary" />