diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2aaa6ec5..cf005e48 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -201,4 +201,12 @@ + + + + + + + + diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index daf21683..ccb28608 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -2,8 +2,10 @@ package org.mian.gitnex.helpers; import android.app.Activity; import android.content.*; +import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Typeface; @@ -11,6 +13,7 @@ import android.net.Uri; import android.os.Build; import android.util.Base64; import android.util.DisplayMetrics; +import android.util.Log; import android.util.TypedValue; import android.view.View; import androidx.annotation.ColorInt; @@ -370,19 +373,66 @@ public class AppUtil { ctx.startActivity(Intent.createChooser(sharingIntent, url)); } + private static Intent wrapBrowserIntent(Context context, Intent intent) { + + final PackageManager pm = context.getPackageManager(); + final List activities = pm.queryIntentActivities(new Intent(intent).setData(intent.getData().buildUpon().authority("example.com").scheme("https").build()), PackageManager.MATCH_ALL); + final ArrayList chooserIntents = new ArrayList<>(); + final String ourPackageName = context.getPackageName(); + + Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm)); + + for(ResolveInfo resInfo : activities) { + ActivityInfo info = resInfo.activityInfo; + if(!info.enabled || !info.exported) { + continue; + } + if(info.packageName.equals(ourPackageName)) { + continue; + } + + Intent targetIntent = new Intent(intent); + targetIntent.setPackage(info.packageName); + targetIntent.setDataAndType(intent.getData(), intent.getType()); + chooserIntents.add(targetIntent); + } + + if(chooserIntents.isEmpty()) { + return null; + } + + final Intent lastIntent = chooserIntents.remove(chooserIntents.size() - 1); + if(chooserIntents.isEmpty()) { + return lastIntent; + } + + Intent chooserIntent = Intent.createChooser(lastIntent, null); + String extraName = Intent.EXTRA_ALTERNATE_INTENTS; + chooserIntent.putExtra(extraName, chooserIntents.toArray(new Intent[0])); + return chooserIntent; + } + public static void openUrlInBrowser(Context context, String url) { + TinyDB tinyDB = TinyDB.getInstance(context); + Intent i; + if(tinyDB.getBoolean("useCustomTabs")) { + i = new CustomTabsIntent.Builder().setDefaultColorSchemeParams( + new CustomTabColorSchemeParams.Builder().setToolbarColor(getColorFromAttribute(context, R.attr.primaryBackgroundColor)).setNavigationBarColor(getColorFromAttribute(context, R.attr.primaryBackgroundColor)) + .setSecondaryToolbarColor(R.attr.primaryTextColor).build()).build().intent; + i.setData(Uri.parse(url)); + } + else { + i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + i.addCategory(Intent.CATEGORY_BROWSABLE); + } try { - if(tinyDB.getBoolean("useCustomTabs")) { - new CustomTabsIntent.Builder().setDefaultColorSchemeParams(new CustomTabColorSchemeParams.Builder().setToolbarColor(getColorFromAttribute(context, R.attr.primaryBackgroundColor)) - .setNavigationBarColor(getColorFromAttribute(context, R.attr.primaryBackgroundColor)).setSecondaryToolbarColor(R.attr.primaryTextColor).build()).build().launchUrl(context, Uri.parse(url)); - } - else { - Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - i.addCategory(Intent.CATEGORY_BROWSABLE); - context.startActivity(i); + Intent browserIntent = wrapBrowserIntent(context, i); + if(browserIntent == null) { + Toasty.error(context, context.getString(R.string.genericError)); } + context.startActivity(browserIntent); } catch(ActivityNotFoundException e) { Toasty.error(context, context.getString(R.string.browserOpenFailed)); diff --git a/app/src/test/java/org/mian/gitnex/helpers/ParseDiffTest.java b/app/src/test/java/org/mian/gitnex/helpers/ParseDiffTest.java index 7945dd02..7907409a 100644 --- a/app/src/test/java/org/mian/gitnex/helpers/ParseDiffTest.java +++ b/app/src/test/java/org/mian/gitnex/helpers/ParseDiffTest.java @@ -19,9 +19,12 @@ public class ParseDiffTest { List parsed = ParseDiff.getFileDiffViewArray(commitDiff); assertEquals(4, parsed.size()); assertTrue(parsed.get(0).isFileBinary()); + assertEquals("binary ", parsed.get(0).getFileInfo()); assertFalse(parsed.get(1).isFileBinary()); assertEquals(1, parsed.get(1).getFileContents().size()); + assertEquals("newOne.txt", parsed.get(1).getFileName()); + assertEquals("+2, -0", parsed.get(1).getFileInfo()); assertEquals(2, parsed.get(1).getFileContents().get(0).getLineAdded()); assertEquals(0, parsed.get(1).getFileContents().get(0).getLineRemoved()); diff --git a/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java b/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java index 1539b8db..31037e15 100644 --- a/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java +++ b/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java @@ -1,8 +1,8 @@ package org.mian.gitnex.helpers; import org.junit.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.function.ThrowingRunnable; +import static org.junit.Assert.*; /** * @author 6543 @@ -10,6 +10,11 @@ import static org.junit.Assert.assertTrue; public class VersionTest { + @Test + public void invalid() { + assertThrows(IllegalArgumentException.class, () -> new Version("abcd")); + } + @Test public void equal() { @@ -21,6 +26,7 @@ public class VersionTest { assertTrue(new Version("v1.12.0").equal("1.12.0")); assertTrue(new Version("0").equal("0")); assertTrue(new Version("").equal("0")); + assertTrue(new Version("main").equal("main")); assertFalse(new Version("1.12.1").equal("1.12.0+dev-211-g316db0fe7")); assertFalse(new Version("v1.12.0").equal("1.10.0")); @@ -30,6 +36,7 @@ public class VersionTest { assertFalse(new Version("1.2").equal("2.1")); assertFalse(new Version("2.2").equal("2.1.120")); assertFalse(new Version("1.12.3").equal("1.13.0+dev-307-g633f52c22")); + assertFalse(new Version("main").equal("1.17.1")); } @@ -89,6 +96,7 @@ public class VersionTest { assertTrue(new Version("1.13.0+dev-30-gb02d2c377").higher("1.11.4")); assertTrue(new Version("2.1").higher("1.2")); assertTrue(new Version("1.13.0+dev-307-g633f52c22").higher("1.12.3")); + assertTrue(new Version("main").higher("1.18.0")); assertFalse(new Version("1").higher("1.1.10")); assertFalse(new Version("1.12.0+dev-211-g316db0fe7").higher("1.12.1")); @@ -97,6 +105,8 @@ public class VersionTest { assertFalse(new Version("v1.12").higher("2.12.0")); assertFalse(new Version("1").higher("2")); assertFalse(new Version("2.1.120").higher("2.2")); + assertFalse(new Version("main").higher("main")); + assertFalse(new Version("1.17.0").higher("main")); }