From c2ae1d016ed889a2e01da9b057ba138f9d3d9e87 Mon Sep 17 00:00:00 2001 From: Stefan Schueller Date: Sat, 1 Aug 2020 13:25:17 +0200 Subject: [PATCH 1/4] Lib updates --- app/build.gradle | 14 +++++++------- app/src/main/AndroidManifest.xml | 2 +- .../activities/AppCompatPreferenceActivity.java | 10 +++++----- .../instarepost/activities/IntroActivity.java | 4 ++-- .../instarepost/activities/MainActivity.java | 14 +++++++------- .../instarepost/activities/SettingsActivity.java | 12 ++++-------- .../instarepost/adapters/PostAdapter.java | 6 +++--- .../schueller/instarepost/helpers/Intents.java | 7 +++++-- .../net/schueller/instarepost/helpers/Util.java | 9 +-------- .../instarepost/network/ClipBoardProcessor.java | 5 +++-- .../schueller/instarepost/network/Downloader.java | 15 +-------------- .../ui/EndlessRecyclerViewScrollListener.java | 8 ++++---- .../instarepost/ui/ItemClickSupport.java | 2 +- app/src/main/res/layout/activity_main.xml | 10 +++++----- app/src/main/res/layout/item_post.xml | 4 ++-- build.gradle | 4 ++++ gradle.properties | 4 +++- 17 files changed, 58 insertions(+), 72 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 73a77d9..b5ba40b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,13 +15,13 @@ repositories { } android { - compileSdkVersion 28 - buildToolsVersion '28.0.3' + compileSdkVersion 29 + buildToolsVersion '29.0.3' defaultConfig { applicationId "net.schueller.instarepost" minSdkVersion 19 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 174 versionName "1.7.4" } @@ -52,12 +52,12 @@ dependencies { testImplementation 'junit:junit:4.12' - implementation 'com.android.support:support-v4:28.0.0' - implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.github.sschueller:android-ClipboardManagerCompat:-SNAPSHOT' implementation 'org.jsoup:jsoup:1.12.1' - implementation 'com.android.support:cardview-v7:28.0.0' - implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.github.paolorotolo:appintro:4.1.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d547197..6c85ea0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -57,7 +57,7 @@ diff --git a/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java b/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java index f34aaf1..50bae33 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java @@ -20,11 +20,11 @@ import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceActivity; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatDelegate; -import android.support.v7.widget.Toolbar; +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java b/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java index d742669..c57b44b 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java @@ -19,8 +19,8 @@ import android.graphics.Color; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import com.github.paolorotolo.appintro.AppIntro2; import com.github.paolorotolo.appintro.AppIntroFragment; diff --git a/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java b/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java index 23dda8c..c8bb76d 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java @@ -44,16 +44,16 @@ import android.os.Handler; import android.preference.PreferenceManager; -import android.support.v4.app.ActivityCompat; +import androidx.core.app.ActivityCompat; -import android.support.v4.app.NotificationCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; +import androidx.core.app.NotificationCompat; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; -import android.support.v7.widget.CardView; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; diff --git a/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java b/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java index 5325685..be98e61 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java @@ -23,24 +23,20 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; -import android.media.Ringtone; -import android.media.RingtoneManager; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; -import android.support.v7.app.ActionBar; +import androidx.appcompat.app.ActionBar; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; -import android.preference.RingtonePreference; -import android.support.v7.app.AlertDialog; -import android.text.TextUtils; + +import androidx.appcompat.app.AlertDialog; + import android.view.MenuItem; import com.raizlabs.android.dbflow.sql.language.Delete; -import com.raizlabs.android.dbflow.sql.language.Set; import net.schueller.instarepost.R; import net.schueller.instarepost.models.Hashtag; diff --git a/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java b/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java index 3a95642..47451ef 100644 --- a/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java +++ b/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java @@ -19,8 +19,8 @@ import android.content.Context; import android.os.Environment; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -151,7 +151,7 @@ public void removeAt(int position) { notifyItemRangeChanged(position, postList.size()); } - class PostViewHolder extends RecyclerView.ViewHolder { + static class PostViewHolder extends RecyclerView.ViewHolder { ImageView postImageView; TextView captionTextView, usernameTextView, isVideo; diff --git a/app/src/main/java/net/schueller/instarepost/helpers/Intents.java b/app/src/main/java/net/schueller/instarepost/helpers/Intents.java index da3b383..fd1b0b9 100644 --- a/app/src/main/java/net/schueller/instarepost/helpers/Intents.java +++ b/app/src/main/java/net/schueller/instarepost/helpers/Intents.java @@ -23,7 +23,9 @@ import android.net.Uri; import android.os.Environment; import android.preference.PreferenceManager; -import android.support.v4.content.FileProvider; + +import androidx.core.content.FileProvider; + import android.webkit.MimeTypeMap; import com.raizlabs.android.dbflow.sql.language.Select; @@ -114,6 +116,7 @@ public static void rePost(Context context, Long postId) { String clipText = username + "\n---\n" + caption; if (!"".equals(customCaptionPref)) { + assert customCaptionPref != null; clipText = customCaptionPref.replace("%username%", username); clipText = clipText.replace("%caption%", caption); clipText = clipText.replace("%nl%", "\n"); @@ -148,7 +151,7 @@ public static void openUsername(Context context, Long postId) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_VIEW); - shareIntent.setData(Uri.parse("https://www.instagram.com/_u/"+post.getUsername().substring(1)+"/")); + shareIntent.setData(Uri.parse("https://www.instagram.com/_u/" + post.getUsername().substring(1) + "/")); context.startActivity(shareIntent); } diff --git a/app/src/main/java/net/schueller/instarepost/helpers/Util.java b/app/src/main/java/net/schueller/instarepost/helpers/Util.java index bffd6fd..596edd4 100644 --- a/app/src/main/java/net/schueller/instarepost/helpers/Util.java +++ b/app/src/main/java/net/schueller/instarepost/helpers/Util.java @@ -20,11 +20,6 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.util.Log; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import java.util.ArrayList; import java.util.List; @@ -33,12 +28,10 @@ public class Util { - private static String TAG = "Util"; - public static List parseHashTags(String string) { Pattern MY_PATTERN = Pattern.compile("#(\\S+)"); Matcher mat = MY_PATTERN.matcher(string); - List list = new ArrayList(); + List list = new ArrayList<>(); while (mat.find()) { list.add(mat.group(1)); } diff --git a/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java b/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java index 87cc83c..b0e44f9 100644 --- a/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java +++ b/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java @@ -6,7 +6,7 @@ import android.os.Handler; import android.os.Looper; import android.os.StrictMode; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.Log; import android.widget.Toast; @@ -29,6 +29,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -139,7 +140,7 @@ public void onResponse(@NonNull Call call, @NonNull Response response) throws IO for (Element Elm : js) { Matcher m = p.matcher(Elm.html()); if (m.matches()) { - jsonObj = new JSONObject(m.group(1)); + jsonObj = new JSONObject(Objects.requireNonNull(m.group(1))); } } diff --git a/app/src/main/java/net/schueller/instarepost/network/Downloader.java b/app/src/main/java/net/schueller/instarepost/network/Downloader.java index fd15a49..ad7cbe3 100644 --- a/app/src/main/java/net/schueller/instarepost/network/Downloader.java +++ b/app/src/main/java/net/schueller/instarepost/network/Downloader.java @@ -87,18 +87,6 @@ public static void download(Context context, String folder, String url, final bo Log.v(TAG, "downloadManager enqueue"); -// BroadcastReceiver onComplete = new BroadcastReceiver() { -// public void onReceive(Context context, Intent intent) { -// context.unregisterReceiver(this); -// // save meta data -// -// // getMimeTypeForDownloadedFile(long id) -// -// Log.v(TAG, "Download complete"); -// } -// }; - - String username = Parser.getUsername(postMetaJSON); String caption = Parser.getCaption(postMetaJSON); @@ -148,10 +136,9 @@ public static void download(Context context, String folder, String url, final bo postHashtag.save(); } + // start download downloadManager.enqueue(request); - //MainActivity.presentHeadsUpNotification(context, R.mipmap.ic_launcher, filePath, post); - } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java b/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java index 92c02b8..ab62943 100644 --- a/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java +++ b/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java @@ -17,10 +17,10 @@ */ package net.schueller.instarepost.ui; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener { // The minimum amount of items to have below your current scroll position diff --git a/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java b/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java index 2f83562..5f3eff7 100644 --- a/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java +++ b/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java @@ -17,7 +17,7 @@ */ package net.schueller.instarepost.ui; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import net.schueller.instarepost.R; diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c213439..5c61030 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,7 +6,7 @@ android:background="@color/colorAccent"> - - + @@ -78,16 +78,16 @@ - - - + diff --git a/app/src/main/res/layout/item_post.xml b/app/src/main/res/layout/item_post.xml index 89bd075..3532a0b 100644 --- a/app/src/main/res/layout/item_post.xml +++ b/app/src/main/res/layout/item_post.xml @@ -4,7 +4,7 @@ android:layout_height="wrap_content" android:padding="8dip"> - - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index ce4bdb3..7a39018 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,10 @@ allprojects { maven { url "https://jitpack.io" } // required to find the project's artifacts maven { url "https://www.jitpack.io" } + maven { + url 'https://maven.google.com/' + name 'Google' + } } } diff --git a/gradle.properties b/gradle.properties index 9b6ae2a..bdda067 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,6 @@ # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file +# org.gradle.parallel=true +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file From 060799c4748b0eed2780fe701985bfd390ac41c4 Mon Sep 17 00:00:00 2001 From: Stefan Schueller Date: Sat, 1 Aug 2020 17:18:52 +0200 Subject: [PATCH 2/4] Tests, formatting --- app/build.gradle | 58 ++- app/src/main/AndroidManifest.xml | 38 +- .../schueller/instarepost/AppDatabase.java | 4 + .../AppCompatPreferenceActivity.java | 126 ------- .../instarepost/activities/IntroActivity.java | 1 + .../instarepost/activities/MainActivity.java | 144 ++++---- .../activities/SettingsActivity.java | 337 +++++------------- .../instarepost/adapters/PostAdapter.java | 3 + .../instarepost/helpers/Intents.java | 4 +- .../instarepost/helpers/NotificationID.java | 2 + .../schueller/instarepost/helpers/Parser.java | 22 ++ .../schueller/instarepost/helpers/Util.java | 2 +- .../schueller/instarepost/models/Hashtag.java | 1 + .../schueller/instarepost/models/Node.java | 1 + .../schueller/instarepost/models/Post.java | 1 + .../network/ClipBoardProcessor.java | 40 ++- .../instarepost/network/Downloader.java | 6 +- .../ui/EndlessRecyclerViewScrollListener.java | 11 +- .../instarepost/ui/ItemClickSupport.java | 14 +- app/src/main/res/layout/settings_activity.xml | 9 + app/src/main/res/values/strings.xml | 15 + app/src/main/res/xml/pref_general.xml | 93 ----- app/src/main/res/xml/root_preferences.xml | 40 +++ .../instarepost/ExampleUnitTest.java | 15 - .../schueller/instarepost/ParserUnitTest.java | 44 +++ 25 files changed, 436 insertions(+), 595 deletions(-) delete mode 100644 app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java create mode 100644 app/src/main/res/layout/settings_activity.xml delete mode 100644 app/src/main/res/xml/pref_general.xml create mode 100644 app/src/main/res/xml/root_preferences.xml delete mode 100644 app/src/test/java/net/schueller/instarepost/ExampleUnitTest.java create mode 100644 app/src/test/java/net/schueller/instarepost/ParserUnitTest.java diff --git a/app/build.gradle b/app/build.gradle index b5ba40b..0bdf28d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,12 +18,17 @@ android { compileSdkVersion 29 buildToolsVersion '29.0.3' + useLibrary 'android.test.runner' + useLibrary 'android.test.base' + useLibrary 'android.test.mock' + defaultConfig { applicationId "net.schueller.instarepost" minSdkVersion 19 targetSdkVersion 29 - versionCode 174 - versionName "1.7.4" + versionCode 200 + versionName "2.0.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -34,9 +39,16 @@ android { applicationVariants.all { variant -> variant.resValue "string", "versionName", variant.versionName } + testOptions { + unitTests { + includeAndroidResources = true + } + } } dependencies { + implementation 'androidx.preference:preference:1.1.1' + // if Java use this. If using Kotlin do NOT use this. annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" @@ -50,17 +62,53 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - testImplementation 'junit:junit:4.12' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.github.sschueller:android-ClipboardManagerCompat:-SNAPSHOT' - implementation 'org.jsoup:jsoup:1.12.1' + implementation 'org.jsoup:jsoup:1.13.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.github.paolorotolo:appintro:4.1.0' implementation 'com.joanzapata.iconify:android-iconify-fontawesome:2.2.2' // (v4.5) - implementation("com.squareup.okhttp3:okhttp:4.3.1") + implementation('com.squareup.okhttp3:okhttp:4.8.0') + + // Testing-only dependencies + testImplementation 'junit:junit:4.13' + + // Core library + androidTestImplementation 'androidx.test:core:1.2.0' + + // AndroidJUnitRunner and JUnit Rules + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + + // Assertions + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.ext:truth:1.2.0' + androidTestImplementation 'com.google.truth:truth:1.0.1' + + // Espresso dependencies + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-web:3.2.0' + androidTestImplementation 'androidx.test.espresso.idling:idling-concurrent:3.2.0' + + // The following Espresso dependency can be either "implementation" + // or "androidTestImplementation", depending on whether you want the + // dependency to appear on your APK's compile classpath or the test APK + // classpath. + androidTestImplementation 'androidx.test.espresso:espresso-idling-resource:3.2.0' + + testImplementation 'androidx.test:core:1.2.0' + testImplementation 'androidx.test.ext:junit:1.1.1' + testImplementation 'org.robolectric:robolectric:4.3.1' + testImplementation 'androidx.test.espresso:espresso-core:3.2.0' + testImplementation 'androidx.test.espresso:espresso-intents:3.2.0' + testImplementation 'androidx.test.ext:truth:1.2.0' + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6c85ea0..b30fde6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,24 +3,29 @@ package="net.schueller.instarepost"> - + + android:supportsRtl="true" + android:theme="@style/AppTheme"> + - + @@ -32,27 +37,25 @@ + + - - - + - + - - @@ -63,9 +66,8 @@ android:grantUriPermissions="true"> + android:resource="@xml/provider_paths" /> - \ No newline at end of file diff --git a/app/src/main/java/net/schueller/instarepost/AppDatabase.java b/app/src/main/java/net/schueller/instarepost/AppDatabase.java index 1a6ccfb..0a1adcd 100644 --- a/app/src/main/java/net/schueller/instarepost/AppDatabase.java +++ b/app/src/main/java/net/schueller/instarepost/AppDatabase.java @@ -41,9 +41,11 @@ public class AppDatabase { @Migration(version = 2, database = AppDatabase.class) public static class Migration2 extends AlterTableMigration { + public Migration2(Class table) { super(table); } + @Override public void onPreMigrate() { addColumn(SQLiteType.INTEGER, "userId"); @@ -150,9 +152,11 @@ public void migrate(DatabaseWrapper database) { @Migration(version = 6, database = AppDatabase.class) public static class Migration4 extends AlterTableMigration { + public Migration4(Class table) { super(table); } + @Override public void onPreMigrate() { addColumn(SQLiteType.INTEGER, "status"); diff --git a/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java b/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java deleted file mode 100644 index 50bae33..0000000 --- a/app/src/main/java/net/schueller/instarepost/activities/AppCompatPreferenceActivity.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2020 Stefan Schüller - * - * License: GPL-3.0+ - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package net.schueller.instarepost.activities; - -import android.content.res.Configuration; -import android.os.Bundle; -import android.preference.PreferenceActivity; -import androidx.annotation.LayoutRes; -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup; - -/** - * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls - * to be used with AppCompat. - */ -public abstract class AppCompatPreferenceActivity extends PreferenceActivity { - - private AppCompatDelegate mDelegate; - - @Override - protected void onCreate(Bundle savedInstanceState) { - getDelegate().installViewFactory(); - getDelegate().onCreate(savedInstanceState); - super.onCreate(savedInstanceState); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - getDelegate().onPostCreate(savedInstanceState); - } - - public ActionBar getSupportActionBar() { - return getDelegate().getSupportActionBar(); - } - - public void setSupportActionBar(@Nullable Toolbar toolbar) { - getDelegate().setSupportActionBar(toolbar); - } - - @Override - public MenuInflater getMenuInflater() { - return getDelegate().getMenuInflater(); - } - - @Override - public void setContentView(@LayoutRes int layoutResID) { - getDelegate().setContentView(layoutResID); - } - - @Override - public void setContentView(View view) { - getDelegate().setContentView(view); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - getDelegate().setContentView(view, params); - } - - @Override - public void addContentView(View view, ViewGroup.LayoutParams params) { - getDelegate().addContentView(view, params); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getDelegate().onPostResume(); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - super.onTitleChanged(title, color); - getDelegate().setTitle(title); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getDelegate().onConfigurationChanged(newConfig); - } - - @Override - protected void onStop() { - super.onStop(); - getDelegate().onStop(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - getDelegate().onDestroy(); - } - - public void invalidateOptionsMenu() { - getDelegate().invalidateOptionsMenu(); - } - - private AppCompatDelegate getDelegate() { - if (mDelegate == null) { - mDelegate = AppCompatDelegate.create(this, null); - } - return mDelegate; - } -} diff --git a/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java b/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java index c57b44b..08775a4 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/IntroActivity.java @@ -28,6 +28,7 @@ import net.schueller.instarepost.R; public class IntroActivity extends AppIntro2 { + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java b/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java index c8bb76d..04ea81d 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java @@ -90,13 +90,14 @@ public class MainActivity extends AppCompatActivity { static String TAG = "MainActivity"; - String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + + String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "instarepost" + File.separator; private boolean AppRated; // Storage Permissions variables private static final int REQUEST_EXTERNAL_STORAGE = 1; + private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, @@ -107,6 +108,7 @@ public class MainActivity extends AppCompatActivity { public List mPosts; + public PostAdapter rvAdapter; @@ -115,10 +117,12 @@ public class MainActivity extends AppCompatActivity { //persmission method. public static void verifyStoragePermissions(Activity activity) { // Check if we have read or write permission - int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); + int writePermission = ActivityCompat + .checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); - if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) { + if (writePermission != PackageManager.PERMISSION_GRANTED + || readPermission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions( activity, @@ -184,7 +188,8 @@ public boolean onOptionsItemSelected(MenuItem item) { startActivity(launchIntent);//null pointer check in case package name was not found } else { - Toast.makeText(this, getString(R.string.toast_please_install_instagram), Toast.LENGTH_LONG).show(); + Toast.makeText(this, getString(R.string.toast_please_install_instagram), Toast.LENGTH_LONG) + .show(); } break; case R.id.action_help: @@ -223,7 +228,8 @@ protected void onCreate(Bundle savedInstanceState) { startActivity(launchIntent);//null pointer check in case package name was not found } else { - Toast.makeText(this, getString(R.string.toast_please_install_instagram), Toast.LENGTH_LONG).show(); + Toast.makeText(this, getString(R.string.toast_please_install_instagram), Toast.LENGTH_LONG) + .show(); } } } @@ -392,48 +398,50 @@ public void onLoadMore(int page, int totalItemsCount) { } }); - ItemClickSupport.addTo(rvItems).setOnItemLongClickListener(new ItemClickSupport.OnItemLongClickListener() { - @Override - public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) { - - final int position2 = position; - - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + ItemClickSupport.addTo(rvItems) + .setOnItemLongClickListener(new ItemClickSupport.OnItemLongClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - switch (which){ - case DialogInterface.BUTTON_POSITIVE: - //Yes button clicked - // Clicking on items - Post post = rvAdapter.getItem(position2); - // delete post.filePath - File file = new File(filePath+post.getImageFile()); - if (!file.delete()) { - Log.e(TAG, "File Delete failed. " + filePath+post.getImageFile()); - } - rvAdapter.removeAt(position2); - rvAdapter.notifyItemRemoved(position2); - - if (rvAdapter.getItemCount() < 1) { - showHelpCard(true); + public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) { + + final int position2 = position; + + DialogInterface.OnClickListener dialogClickListener + = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + //Yes button clicked + // Clicking on items + Post post = rvAdapter.getItem(position2); + // delete post.filePath + File file = new File(filePath + post.getImageFile()); + if (!file.delete()) { + Log.e(TAG, "File Delete failed. " + filePath + post.getImageFile()); + } + rvAdapter.removeAt(position2); + rvAdapter.notifyItemRemoved(position2); + + if (rvAdapter.getItemCount() < 1) { + showHelpCard(true); + } + + post.delete(); + break; + case DialogInterface.BUTTON_NEGATIVE: + //No button clicked + break; } - - post.delete(); - break; - case DialogInterface.BUTTON_NEGATIVE: - //No button clicked - break; - } + } + }; + + AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); + builder.setMessage(getString(R.string.dialog_are_you_sure_you_want_to_delete)) + .setPositiveButton(getString(R.string.dialog_yes), dialogClickListener) + .setNegativeButton(getString(R.string.dialog_no), dialogClickListener).show(); + return true; } - }; - - AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); - builder.setMessage(getString(R.string.dialog_are_you_sure_you_want_to_delete)) - .setPositiveButton(getString(R.string.dialog_yes), dialogClickListener) - .setNegativeButton(getString(R.string.dialog_no), dialogClickListener).show(); - return true; - } - }); + }); } @@ -468,8 +476,8 @@ public static void presentHeadsUpNotification(Context context, int icon, String // JSON String caption = Parser.getCaption(postMetaJSON); //String profile_pic_url = ""; - String username = Parser.getUsername(postMetaJSON); - boolean isVideo = Parser.isVideo(postMetaJSON); + String username = Parser.getUsername(postMetaJSON); + boolean isVideo = Parser.isVideo(postMetaJSON); try { @@ -484,26 +492,30 @@ public static void presentHeadsUpNotification(Context context, int icon, String shareIntent.putExtra("notificationId", notification_id); shareIntent.putExtra("postId", post.getId()); - PendingIntent pendingIntentRepost = PendingIntent.getBroadcast(context, notification_id, repostIntent, PendingIntent.FLAG_CANCEL_CURRENT); - PendingIntent pendingIntentShare = PendingIntent.getBroadcast(context, notification_id, shareIntent, PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent pendingIntentRepost = PendingIntent + .getBroadcast(context, notification_id, repostIntent, PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent pendingIntentShare = PendingIntent + .getBroadcast(context, notification_id, shareIntent, PendingIntent.FLAG_CANCEL_CURRENT); //PendingIntent contentIntent = PendingIntent.getActivity(this, 0, share, 0); - if (!isVideo) { // Create the URI from the media final File myImageFile = new File(filepath); Bitmap bitmap_image = BitmapFactory.decodeFile(myImageFile.getAbsolutePath()); - NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, "EasyRepost"); + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, + "EasyRepost"); notificationBuilder.setAutoCancel(true) .setContentTitle(username) .setContentText(caption) .setSmallIcon(icon) .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap_image)) .setAutoCancel(true) - .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.view_details), pendingIntentRepost) - .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.heads_up_share), pendingIntentShare) + .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.view_details), + pendingIntentRepost) + .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.heads_up_share), + pendingIntentShare) .setContentIntent(pendingIntentRepost) .setVibrate(new long[]{100, 0, 100}) @@ -511,27 +523,32 @@ public static void presentHeadsUpNotification(Context context, int icon, String .setWhen(System.currentTimeMillis()) .setPriority(Notification.PRIORITY_MAX); - NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + NotificationManager notificationManager = (NotificationManager) context + .getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notification_id, notificationBuilder.build()); } else { - NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, "EasyRepost"); + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, + "EasyRepost"); notificationBuilder.setAutoCancel(true) .setContentTitle(username) .setContentText(caption) .setSmallIcon(icon) .setAutoCancel(true) - .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.view_details), pendingIntentRepost) - .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.heads_up_share), pendingIntentShare) + .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.view_details), + pendingIntentRepost) + .addAction(android.R.drawable.ic_menu_share, context.getString(R.string.heads_up_share), + pendingIntentShare) .setContentIntent(pendingIntentRepost) .setVibrate(new long[]{100, 0, 100}) .setDefaults(Notification.DEFAULT_ALL) .setWhen(System.currentTimeMillis()) .setPriority(Notification.PRIORITY_MAX); - NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + NotificationManager notificationManager = (NotificationManager) context + .getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notification_id, notificationBuilder.build()); } @@ -549,9 +566,13 @@ public static void presentHeadsUpNotification(Context context, int icon, String // rating crap CardView rateCard; + TextView questionTextView; + Button leftButton; + Button rightButton; + int state; private void rateCard() { @@ -572,18 +593,15 @@ public void onClick(View v) { if (state == 1) { // Not really - state = 3; setRateTexts(); } else if (state == 2) { // No, thanks - dismisRate(); } else if (state == 3) { // No, thanks - dismisRate(); } } @@ -595,7 +613,6 @@ public void onClick(View v) { if (state == 1) { // Yes! - state = 2; setRateTexts(); } else if (state == 2) { @@ -624,13 +641,11 @@ public void onClick(View v) { // Ok, sure //Log.v(TAG, "Give Feedback"); - - dismisRate(); Intent Email = new Intent(Intent.ACTION_SEND); Email.setType("text/email"); - Email.putExtra(Intent.EXTRA_EMAIL, new String[] { getString(R.string.feedback_email_address) }); + Email.putExtra(Intent.EXTRA_EMAIL, new String[]{getString(R.string.feedback_email_address)}); Email.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.feedback_subject)); startActivity(Intent.createChooser(Email, getString(R.string.feedback_chooser))); } @@ -665,7 +680,6 @@ private void dismisRate() { editor.putBoolean(ratePref, true); editor.apply(); - rateCard.setVisibility(View.GONE); } diff --git a/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java b/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java index be98e61..fe8c8e9 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/SettingsActivity.java @@ -1,243 +1,94 @@ -/* - * Copyright 2020 Stefan Schüller - * - * License: GPL-3.0+ - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package net.schueller.instarepost.activities; - - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.res.Configuration; -import android.os.Build; -import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import androidx.appcompat.app.ActionBar; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; - -import androidx.appcompat.app.AlertDialog; - -import android.view.MenuItem; - -import com.raizlabs.android.dbflow.sql.language.Delete; - -import net.schueller.instarepost.R; -import net.schueller.instarepost.models.Hashtag; -import net.schueller.instarepost.models.Post; -import net.schueller.instarepost.models.User; - -import java.util.List; - -/** - * A {@link PreferenceActivity} that presents a set of application mainmenu. On - * handset devices, mainmenu are presented as a single list. On tablets, - * mainmenu are split by category, with category headers shown to the left of - * the list of mainmenu. - *

- * See - * Android Design: Settings for design guidelines and the Settings - * API Guide for more information on developing a Settings UI. - */ -public class SettingsActivity extends AppCompatPreferenceActivity { - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - this.finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - - /** - * A preference value change listener that updates the preference's summary - * to reflect its new value. - */ - private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - String stringValue = value.toString(); - - if (preference instanceof ListPreference) { - // For list preferences, look up the correct display value in - // the preference's 'entries' list. - ListPreference listPreference = (ListPreference) preference; - int index = listPreference.findIndexOfValue(stringValue); - - // Set the summary to reflect the new value. - preference.setSummary( - index >= 0 - ? listPreference.getEntries()[index] - : null); - - } else { - // For all other preferences, set the summary to the value's - // simple string representation. - preference.setSummary(stringValue); - } - return true; - } - }; - - /** - * Helper method to determine if the device has an extra-large screen. For - * example, 10" tablets are extra-large. - */ - private static boolean isXLargeTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; - } - - /** - * Binds a preference's summary to its value. More specifically, when the - * preference's value is changed, its summary (line of text below the - * preference title) is updated to reflect the value. The summary is also - * immediately updated upon calling this method. The exact display format is - * dependent on the type of preference. - * - * @see #sBindPreferenceSummaryToValueListener - */ - private static void bindPreferenceSummaryToValue(Preference preference) { - // Set the listener to watch for value changes. - preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); - - // Trigger the listener immediately with the preference's - // current value. - sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, - PreferenceManager - .getDefaultSharedPreferences(preference.getContext()) - .getString(preference.getKey(), "")); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setupActionBar(); - getFragmentManager().beginTransaction().replace(android.R.id.content, new GeneralPreferenceFragment()).commit(); - - } - - /** - * Set up the {@link android.app.ActionBar}, if the API is available. - */ - private void setupActionBar() { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - // Show the Up button in the action bar. - actionBar.setDisplayHomeAsUpEnabled(true); - } - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onIsMultiPane() { - return isXLargeTablet(this); - } - - /** - * {@inheritDoc} - */ - @Override - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public void onBuildHeaders(List

target) { - //loadHeadersFromResource(R.xml.pref_headers, target); - } - - /** - * This method stops fragment injection in malicious applications. - * Make sure to deny any unknown fragments here. - */ - protected boolean isValidFragment(String fragmentName) { - return PreferenceFragment.class.getName().equals(fragmentName) - || GeneralPreferenceFragment.class.getName().equals(fragmentName); - } - - /** - * This fragment shows general preferences only. It is used when the - * activity is showing a two-pane mainmenu UI. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public static class GeneralPreferenceFragment extends PreferenceFragment { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_general); - setHasOptionsMenu(true); - - // Bind the summaries of EditText/List/Dialog/Ringtone preferences - // to their values. When their values change, their summaries are - // updated to reflect the new value, per the Android Design - // guidelines. - bindPreferenceSummaryToValue(findPreference("example_text")); - bindPreferenceSummaryToValue(findPreference("pref_instagram_username")); - //bindPreferenceSummaryToValue(findPreference("example_list")); - - // clear all - Preference clearAll = findPreference("pref_clear_all"); - clearAll.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - - AlertDialog.Builder builder = new AlertDialog.Builder(preference.getContext()); - builder.setMessage(R.string.dialog_are_you_sure_you_want_to_delete_all).setPositiveButton(R.string.dialog_yes, dialogClickListener) - .setNegativeButton(R.string.dialog_no, dialogClickListener).show(); - - return false; - } - - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which){ - case DialogInterface.BUTTON_POSITIVE: - //Yes button clicked - // clear all data - Delete.table(Hashtag.class); - Delete.table(Post.class); - Delete.table(User.class); - - break; - - case DialogInterface.BUTTON_NEGATIVE: - //No button clicked - break; - } - } - }; - }); - - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - startActivity(new Intent(getActivity(), SettingsActivity.class)); - return true; - } - return super.onOptionsItemSelected(item); - } - } - -} +/* + * Copyright 2020 Stefan Schüller + * + * License: GPL-3.0+ + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.schueller.instarepost.activities; + +import android.content.DialogInterface; +import android.os.Bundle; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; + +import com.raizlabs.android.dbflow.sql.language.Delete; + +import net.schueller.instarepost.R; +import net.schueller.instarepost.models.Hashtag; +import net.schueller.instarepost.models.Post; +import net.schueller.instarepost.models.User; + +public class SettingsActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new SettingsFragment()) + .commit(); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + public static class SettingsFragment extends PreferenceFragmentCompat { + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.root_preferences, rootKey); + + Preference pref = findPreference("pref_clear_all"); + + assert pref != null; + pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AlertDialog.Builder builder = new AlertDialog.Builder(preference.getContext()); + builder.setMessage(R.string.dialog_are_you_sure_you_want_to_delete_all) + .setPositiveButton(R.string.dialog_yes, dialogClickListener) + .setNegativeButton(R.string.dialog_no, dialogClickListener).show(); + + return false; + } + + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + //Yes button clicked + // clear all data + Delete.table(Hashtag.class); + Delete.table(Post.class); + Delete.table(User.class); + + break; + + case DialogInterface.BUTTON_NEGATIVE: + //No button clicked + break; + } + } + }; + }); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java b/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java index 47451ef..c3f97a6 100644 --- a/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java +++ b/app/src/main/java/net/schueller/instarepost/adapters/PostAdapter.java @@ -46,6 +46,7 @@ public class PostAdapter extends RecyclerView.Adapter { private ArrayList postList = new ArrayList<>(); + private Context mContext; // Pass in the contact array into the constructor @@ -154,7 +155,9 @@ public void removeAt(int position) { static class PostViewHolder extends RecyclerView.ViewHolder { ImageView postImageView; + TextView captionTextView, usernameTextView, isVideo; + Button repostButton, shareButton; PostViewHolder(View itemView) { diff --git a/app/src/main/java/net/schueller/instarepost/helpers/Intents.java b/app/src/main/java/net/schueller/instarepost/helpers/Intents.java index fd1b0b9..d16237a 100644 --- a/app/src/main/java/net/schueller/instarepost/helpers/Intents.java +++ b/app/src/main/java/net/schueller/instarepost/helpers/Intents.java @@ -46,6 +46,7 @@ public class Intents { private static String subPath = "instarepost"; + private static String instagramPackage = "com.instagram.android"; public static void share(Context context, Long postId) { @@ -109,7 +110,8 @@ public static void rePost(Context context, Long postId) { String username = Parser.getUsername(postMetaJSON); SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); - String customCaptionPref = sharedPref.getString("example_text", context.getString(R.string.pref_default_caption)); + String customCaptionPref = sharedPref + .getString("example_text", context.getString(R.string.pref_default_caption)); final ClipboardManagerCompat clipboardManager = ClipboardManagerCompatFactory.create(context); diff --git a/app/src/main/java/net/schueller/instarepost/helpers/NotificationID.java b/app/src/main/java/net/schueller/instarepost/helpers/NotificationID.java index b42aa51..fcf0ab9 100644 --- a/app/src/main/java/net/schueller/instarepost/helpers/NotificationID.java +++ b/app/src/main/java/net/schueller/instarepost/helpers/NotificationID.java @@ -20,7 +20,9 @@ import java.util.concurrent.atomic.AtomicInteger; public class NotificationID { + private final static AtomicInteger c = new AtomicInteger(0); + public static int getID() { return c.incrementAndGet(); } diff --git a/app/src/main/java/net/schueller/instarepost/helpers/Parser.java b/app/src/main/java/net/schueller/instarepost/helpers/Parser.java index d6f56c2..132c4b6 100644 --- a/app/src/main/java/net/schueller/instarepost/helpers/Parser.java +++ b/app/src/main/java/net/schueller/instarepost/helpers/Parser.java @@ -17,7 +17,13 @@ */ package net.schueller.instarepost.helpers; +import android.app.Application; +import android.content.Context; import android.util.Log; +import java.lang.ref.WeakReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import net.schueller.instarepost.R; import net.schueller.instarepost.models.Node; import org.json.JSONArray; import org.json.JSONException; @@ -26,8 +32,24 @@ public class Parser { + private static String TAG = "Parser"; + public static String matchInstagramUri(String uri, Context context) { + + Pattern pattern = Pattern + .compile(context.getResources().getString(R.string.data_instagram_regex_pattern)); + Matcher matches = pattern.matcher(uri); + + Log.v(TAG, "clipboardData: " + uri); + + if (matches.matches()) { + return matches.group(1); + } + + return null; + } + public static boolean isPrivate(JSONObject sharedData) { // entry_data -> ProfilePage -> graphql -> user -> is_private diff --git a/app/src/main/java/net/schueller/instarepost/helpers/Util.java b/app/src/main/java/net/schueller/instarepost/helpers/Util.java index 596edd4..78201e2 100644 --- a/app/src/main/java/net/schueller/instarepost/helpers/Util.java +++ b/app/src/main/java/net/schueller/instarepost/helpers/Util.java @@ -40,7 +40,7 @@ public static List parseHashTags(String string) { // http://stackoverflow.com/questions/29728573/android-loading-drawable-into-imageview-taking-a-lot-of-memory/29728695#29728695 public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, - int reqWidth, int reqHeight) { + int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); diff --git a/app/src/main/java/net/schueller/instarepost/models/Hashtag.java b/app/src/main/java/net/schueller/instarepost/models/Hashtag.java index 8a7dad2..42164d2 100644 --- a/app/src/main/java/net/schueller/instarepost/models/Hashtag.java +++ b/app/src/main/java/net/schueller/instarepost/models/Hashtag.java @@ -30,6 +30,7 @@ @Table(database = AppDatabase.class) @ManyToMany(referencedTable = Post.class) public class Hashtag extends BaseModel { + @PrimaryKey(autoincrement = true) long id; // package-private recommended, not required diff --git a/app/src/main/java/net/schueller/instarepost/models/Node.java b/app/src/main/java/net/schueller/instarepost/models/Node.java index 113b6dc..fcb2c0f 100644 --- a/app/src/main/java/net/schueller/instarepost/models/Node.java +++ b/app/src/main/java/net/schueller/instarepost/models/Node.java @@ -20,6 +20,7 @@ public class Node { private String url; + private boolean isVideo; public String getUrl() { diff --git a/app/src/main/java/net/schueller/instarepost/models/Post.java b/app/src/main/java/net/schueller/instarepost/models/Post.java index eaab5ff..340b3c6 100644 --- a/app/src/main/java/net/schueller/instarepost/models/Post.java +++ b/app/src/main/java/net/schueller/instarepost/models/Post.java @@ -33,6 +33,7 @@ @Table(database = AppDatabase.class) @ManyToMany(referencedTable = Hashtag.class) public class Post extends BaseModel { + @PrimaryKey(autoincrement = true) long id; // package-private recommended, not required diff --git a/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java b/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java index b0e44f9..2654fa9 100644 --- a/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java +++ b/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java @@ -41,11 +41,14 @@ import okhttp3.ResponseBody; import static android.content.Context.CLIPBOARD_SERVICE; +import static net.schueller.instarepost.helpers.Parser.matchInstagramUri; public class ClipBoardProcessor { private static final String TAG = "ClipBoardProcessor"; + private Context mContext; + private String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "instarepost" + File.separator; @@ -54,43 +57,39 @@ public ClipBoardProcessor(Context context) { } public void processUri(String uri) { - try { - Pattern p = Pattern.compile(mContext.getString(R.string.data_instagram_regex_pattern)); - Matcher m = p.matcher(uri); + String parsedUri = matchInstagramUri(uri, mContext); - Log.v(TAG, "clipboardData: " + uri); + if (parsedUri != null) { - if (m.matches()) { + try { - String url = m.group(1); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); // check item is not already in db - List posts = new Select().from(Post.class).where(Post_Table.url.eq(url)).queryList(); + List posts = new Select().from(Post.class).where(Post_Table.url.eq(parsedUri)).queryList(); if (posts.size() == 0) { try { - parsePageHeaderInfo(url); + parsePageHeaderInfo(parsedUri); } catch (Exception e) { e.printStackTrace(); } } + } catch (Exception e) { + Log.v(TAG, "Unable match: " + e.toString()); } - } catch (Exception e) { - Log.v(TAG, "Unable match" + e.toString()); + } else { + Log.v(TAG, "Unable match: " + uri); } + } public void performClipboardCheck() { ClipboardManager clipboardManager = (ClipboardManager) mContext.getSystemService(CLIPBOARD_SERVICE); -// Log.v(TAG, "performClipboardCheck"); -// Log.v(TAG, "hasPrimaryClip " + clipboardManager.hasPrimaryClip()); -// Log.v(TAG, "getPrimaryClip " + clipboardManager.getPrimaryClip()); - if (clipboardManager.hasPrimaryClip() && clipboardManager.getPrimaryClip() != null) { try { @@ -124,8 +123,9 @@ public void onFailure(@NonNull Call call, @NonNull IOException e) { @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { - if (!response.isSuccessful()) + if (!response.isSuccessful()) { throw new IOException("Unexpected code " + response); + } assert responseBody != null; @@ -135,7 +135,8 @@ public void onResponse(@NonNull Call call, @NonNull Response response) throws IO try { Elements js = doc.select("script[type=text/javascript]"); - Pattern p = Pattern.compile(mContext.getString(R.string.data_instagram_shared_data_regex_pattern)); + Pattern p = Pattern + .compile(mContext.getString(R.string.data_instagram_shared_data_regex_pattern)); for (Element Elm : js) { Matcher m = p.matcher(Elm.html()); @@ -155,7 +156,8 @@ public void onResponse(@NonNull Call call, @NonNull Response response) throws IO // we have a carousel, download each for (Node node : nodes) { Log.v(TAG, "Download: " + node.getUrl()); - Downloader.download(mContext.getApplicationContext(), filePath, node.getUrl(), node.isVideo(), jsonObj); + Downloader.download(mContext.getApplicationContext(), filePath, node.getUrl(), + node.isVideo(), jsonObj); } } else { Log.v(TAG, "No nodes found"); @@ -167,7 +169,9 @@ public void onResponse(@NonNull Call call, @NonNull Response response) throws IO new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { - Toast.makeText(mContext, mContext.getString(R.string.error_private_posts_no_support), Toast.LENGTH_LONG).show(); + Toast.makeText(mContext, + mContext.getString(R.string.error_private_posts_no_support), + Toast.LENGTH_LONG).show(); } }); } diff --git a/app/src/main/java/net/schueller/instarepost/network/Downloader.java b/app/src/main/java/net/schueller/instarepost/network/Downloader.java index ad7cbe3..37b66f0 100644 --- a/app/src/main/java/net/schueller/instarepost/network/Downloader.java +++ b/app/src/main/java/net/schueller/instarepost/network/Downloader.java @@ -44,7 +44,8 @@ private static String getApplicationName(Context context) { return context.getString(stringId); } - public static void download(Context context, String folder, String url, final boolean isVideo, final JSONObject postMetaJSON) { + public static void download(Context context, String folder, String url, final boolean isVideo, + final JSONObject postMetaJSON) { Log.v(TAG, "Download start"); @@ -84,7 +85,6 @@ public static void download(Context context, String folder, String url, final bo DownloadManager.Request.VISIBILITY_VISIBLE) .setDestinationUri(uri); - Log.v(TAG, "downloadManager enqueue"); String username = Parser.getUsername(postMetaJSON); @@ -118,7 +118,7 @@ public static void download(Context context, String folder, String url, final bo post.save(); - Log.v(TAG, "post: "+ post.getUrl()); + Log.v(TAG, "post: " + post.getUrl()); // find add hashtags List hashtags = Util.parseHashTags(caption); diff --git a/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java b/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java index ab62943..c17d3d1 100644 --- a/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java +++ b/app/src/main/java/net/schueller/instarepost/ui/EndlessRecyclerViewScrollListener.java @@ -23,15 +23,20 @@ import androidx.recyclerview.widget.StaggeredGridLayoutManager; public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener { + // The minimum amount of items to have below your current scroll position // before loading more. private int visibleThreshold = 5; + // The current offset index of data you have loaded private int currentPage = 0; + // The total number of items in the dataset after the last load private int previousTotalItemCount = 0; + // True if we are still waiting for the last set of data to load. private boolean loading = true; + // Sets the starting page index private int startingPageIndex = 0; @@ -56,8 +61,7 @@ public int getLastVisibleItem(int[] lastVisibleItemPositions) { for (int i = 0; i < lastVisibleItemPositions.length; i++) { if (i == 0) { maxSize = lastVisibleItemPositions[i]; - } - else if (lastVisibleItemPositions[i] > maxSize) { + } else if (lastVisibleItemPositions[i] > maxSize) { maxSize = lastVisibleItemPositions[i]; } } @@ -73,7 +77,8 @@ public void onScrolled(RecyclerView view, int dx, int dy) { int totalItemCount = mLayoutManager.getItemCount(); if (mLayoutManager instanceof StaggeredGridLayoutManager) { - int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) mLayoutManager).findLastVisibleItemPositions(null); + int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) mLayoutManager) + .findLastVisibleItemPositions(null); // get maximum element within the list lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions); } else if (mLayoutManager instanceof LinearLayoutManager) { diff --git a/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java b/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java index 5f3eff7..823491c 100644 --- a/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java +++ b/app/src/main/java/net/schueller/instarepost/ui/ItemClickSupport.java @@ -17,15 +17,20 @@ */ package net.schueller.instarepost.ui; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import android.view.View; import net.schueller.instarepost.R; public class ItemClickSupport { + private final RecyclerView mRecyclerView; + private OnItemClickListener mOnItemClickListener; + private OnItemLongClickListener mOnItemLongClickListener; + private View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { @@ -35,6 +40,7 @@ public void onClick(View v) { } } }; + private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { @@ -45,10 +51,11 @@ public boolean onLongClick(View v) { return false; } }; + private RecyclerView.OnChildAttachStateChangeListener mAttachListener = new RecyclerView.OnChildAttachStateChangeListener() { @Override - public void onChildViewAttachedToWindow(View view) { + public void onChildViewAttachedToWindow(@NonNull View view) { if (mOnItemClickListener != null) { view.setOnClickListener(mOnClickListener); } @@ -58,7 +65,7 @@ public void onChildViewAttachedToWindow(View view) { } @Override - public void onChildViewDetachedFromWindow(View view) { + public void onChildViewDetachedFromWindow(@NonNull View view) { } }; @@ -90,9 +97,8 @@ public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) { return this; } - public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) { + public void setOnItemLongClickListener(OnItemLongClickListener listener) { mOnItemLongClickListener = listener; - return this; } private void detach(RecyclerView view) { diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml new file mode 100644 index 0000000..de6591a --- /dev/null +++ b/app/src/main/res/layout/settings_activity.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8ed1d2..2a9ebe2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,4 +109,19 @@ This image already exists on this device. Please remove it to download it again. Folder + + Messages + Sync + + + Your signature + Default reply action + + + Sync email periodically + Download incoming attachments + Automatically download attachments for incoming emails + + Only download attachments when manually requested + diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml deleted file mode 100644 index 474754e..0000000 --- a/app/src/main/res/xml/pref_general.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml new file mode 100644 index 0000000..5b45b6f --- /dev/null +++ b/app/src/main/res/xml/root_preferences.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/net/schueller/instarepost/ExampleUnitTest.java b/app/src/test/java/net/schueller/instarepost/ExampleUnitTest.java deleted file mode 100644 index 2197d5f..0000000 --- a/app/src/test/java/net/schueller/instarepost/ExampleUnitTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.schueller.instarepost; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * To work on unit tests, switch the Test Artifact in the Build Variants view. - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/app/src/test/java/net/schueller/instarepost/ParserUnitTest.java b/app/src/test/java/net/schueller/instarepost/ParserUnitTest.java new file mode 100644 index 0000000..785080e --- /dev/null +++ b/app/src/test/java/net/schueller/instarepost/ParserUnitTest.java @@ -0,0 +1,44 @@ +package net.schueller.instarepost; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNull; +import static net.schueller.instarepost.helpers.Parser.matchInstagramUri; + +import android.content.Context; +import android.os.Build; +import android.test.suitebuilder.annotation.LargeTest; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import org.junit.*; +import org.junit.runner.*; +import org.robolectric.annotation.Config; + +@RunWith(AndroidJUnit4.class) +@Config(sdk = Build.VERSION_CODES.O_MR1) +@LargeTest +public class ParserUnitTest { + + @Test + public void testMatchInstagramUri() { + + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + // matches + assertEquals("https://www.instagram.com/p/CDRGNQTHh7X/", + matchInstagramUri("https://www.instagram.com/p/CDRGNQTHh7X/?igshid=1opjbfc2u28wa", + context)); + + assertEquals("https://www.instagram.com/tv/CDRGNQTHh7X/", + matchInstagramUri("https://www.instagram.com/tv/CDRGNQTHh7X/", + context)); + + //no matches + assertNull(matchInstagramUri("https://www.instagram.com/r/CDRGN", + context)); + assertNull( + matchInstagramUri("https://www.instagram.com/p/CDRGNQTHh7X", + context)); + assertNull(matchInstagramUri("https://www.google.com/p/CDRGNQTHh7X/?igshid=1opjbfc2u28wa", + context)); + } +} \ No newline at end of file From 414a223ba484f9ba574349f226c2e29ecfdada2c Mon Sep 17 00:00:00 2001 From: Stefan Schueller Date: Sat, 1 Aug 2020 20:48:11 +0200 Subject: [PATCH 3/4] formatting --- app/src/main/AndroidManifest.xml | 4 +- .../instarepost/activities/MainActivity.java | 34 ++-- .../network/ClipBoardProcessor.java | 10 +- .../{activity_main.xml => main_activity.xml} | 190 +++++++++--------- app/src/main/res/values/constants.xml | 8 + app/src/main/res/values/strings.xml | 60 +----- app/src/main/res/xml-v29/root_preferences.xml | 34 ++++ app/src/main/res/xml/root_preferences.xml | 14 +- 8 files changed, 176 insertions(+), 178 deletions(-) rename app/src/main/res/layout/{activity_main.xml => main_activity.xml} (95%) create mode 100644 app/src/main/res/values/constants.xml create mode 100644 app/src/main/res/xml-v29/root_preferences.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b30fde6..a8a2131 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + android:supportsRtl="true"> diff --git a/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java b/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java index 04ea81d..cd02c38 100644 --- a/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java +++ b/app/src/main/java/net/schueller/instarepost/activities/MainActivity.java @@ -137,16 +137,9 @@ protected void onResume() { Log.v(TAG, "onResume"); Log.v(TAG, "SDK: " + Build.VERSION.SDK_INT); - if (Build.VERSION.SDK_INT >= 29) { - // trigger clip - Log.v(TAG, "trigger clip"); - ClipBoardProcessor cbp = new ClipBoardProcessor(getApplicationContext()); - cbp.performClipboardCheck(); - } - super.onResume(); - setContentView(R.layout.activity_main); + setContentView(R.layout.main_activity); verifyStoragePermissions(this); drawList(); } @@ -208,7 +201,7 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); + setContentView(R.layout.main_activity); Intent intent = getIntent(); String action = intent.getAction(); @@ -218,19 +211,24 @@ protected void onCreate(Bundle savedInstanceState) { if ("text/plain".equals(type)) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); ClipBoardProcessor cbp = new ClipBoardProcessor(getApplicationContext()); - cbp.processUri(sharedText); - - // go back to instagram - Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.instagram.android"); - if (launchIntent != null) { + if (cbp.processUri(sharedText)) { + // go back to instagram + Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.instagram.android"); + if (launchIntent != null) { + + Toast.makeText(this, getString(R.string.toast_launching_instagram), Toast.LENGTH_SHORT) + .show(); + startActivity(launchIntent);//null pointer check in case package name was not found + } else { - Toast.makeText(this, getString(R.string.toast_launching_instagram), Toast.LENGTH_SHORT).show(); - startActivity(launchIntent);//null pointer check in case package name was not found + Toast.makeText(this, getString(R.string.toast_please_install_instagram), Toast.LENGTH_LONG) + .show(); + } } else { - - Toast.makeText(this, getString(R.string.toast_please_install_instagram), Toast.LENGTH_LONG) + Toast.makeText(this, getString(R.string.toast_not_a_valid_instagram_uri), Toast.LENGTH_LONG) .show(); } + } } diff --git a/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java b/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java index 2654fa9..0011cd4 100644 --- a/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java +++ b/app/src/main/java/net/schueller/instarepost/network/ClipBoardProcessor.java @@ -56,7 +56,7 @@ public ClipBoardProcessor(Context context) { mContext = context; } - public void processUri(String uri) { + public boolean processUri(String uri) { String parsedUri = matchInstagramUri(uri, mContext); @@ -73,18 +73,21 @@ public void processUri(String uri) { if (posts.size() == 0) { try { parsePageHeaderInfo(parsedUri); + return true; } catch (Exception e) { e.printStackTrace(); + return false; } } } catch (Exception e) { Log.v(TAG, "Unable match: " + e.toString()); + return false; } } else { Log.v(TAG, "Unable match: " + uri); } - + return false; } public void performClipboardCheck() { @@ -114,6 +117,9 @@ private void parsePageHeaderInfo(String urlStr) { .addHeader("user-agent", mContext.getString(R.string.data_instagram_user_agent)) .build(); + Log.v(TAG, "urlStr: " + urlStr); + + client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/main_activity.xml similarity index 95% rename from app/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/main_activity.xml index 5c61030..8e93bc5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -1,96 +1,94 @@ - - - - - - - - - - -