diff options
author | Marko Zajc <marko@zajc.tel> | 2024-09-02 18:25:21 +0200 |
---|---|---|
committer | Marko Zajc <marko@zajc.tel> | 2024-09-02 18:25:21 +0200 |
commit | 5bd5bd5da2f231b3b5f09982b97c664b05f73747 (patch) | |
tree | e70b83bc47da573d0fa0da2ff9bd0a23d7f6a207 |
-rw-r--r-- | .gitignore | 16 | ||||
-rw-r--r-- | .idea/.gitignore | 3 | ||||
-rw-r--r-- | .idea/compiler.xml | 6 | ||||
-rw-r--r-- | .idea/deploymentTargetSelector.xml | 10 | ||||
-rw-r--r-- | .idea/gradle.xml | 19 | ||||
-rw-r--r-- | .idea/migrations.xml | 10 | ||||
-rw-r--r-- | .idea/misc.xml | 9 | ||||
-rw-r--r-- | .idea/vcs.xml | 6 | ||||
-rw-r--r-- | README.md | 35 | ||||
-rw-r--r-- | app/.gitignore | 1 | ||||
-rw-r--r-- | app/build.gradle | 37 | ||||
-rw-r--r-- | app/src/main/AndroidManifest.xml | 25 | ||||
-rw-r--r-- | app/src/main/java/tel/zajc/rtv/MainActivity.java | 59 | ||||
-rw-r--r-- | app/src/main/res/drawable/banner.png | bin | 0 -> 35693 bytes | |||
-rw-r--r-- | app/src/main/res/drawable/icon.png | bin | 0 -> 133683 bytes | |||
-rw-r--r-- | app/src/main/res/layout/activity_main.xml | 14 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 3 | ||||
-rw-r--r-- | build.gradle | 4 | ||||
-rw-r--r-- | gradle.properties | 21 | ||||
-rw-r--r-- | gradle/libs.versions.toml | 6 | ||||
-rw-r--r-- | gradle/wrapper/gradle-wrapper.jar | bin | 0 -> 59203 bytes | |||
-rw-r--r-- | gradle/wrapper/gradle-wrapper.properties | 6 | ||||
-rwxr-xr-x | gradlew | 185 | ||||
-rw-r--r-- | gradlew.bat | 89 | ||||
-rw-r--r-- | settings.gradle | 23 |
25 files changed, 587 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5986935 --- /dev/null +++ b/.gitignore | |||
@@ -0,0 +1,16 @@ | |||
1 | *.iml | ||
2 | .gradle | ||
3 | /local.properties | ||
4 | /.idea/caches | ||
5 | /.idea/libraries | ||
6 | /.idea/modules.xml | ||
7 | /.idea/workspace.xml | ||
8 | /.idea/navEditor.xml | ||
9 | /.idea/assetWizardSettings.xml | ||
10 | .DS_Store | ||
11 | /build | ||
12 | /captures | ||
13 | .externalNativeBuild | ||
14 | .cxx | ||
15 | local.properties | ||
16 | /app/release/* | ||
diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore | |||
@@ -0,0 +1,3 @@ | |||
1 | # Default ignored files | ||
2 | /shelf/ | ||
3 | /workspace.xml | ||
diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml | |||
@@ -0,0 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <project version="4"> | ||
3 | <component name="CompilerConfiguration"> | ||
4 | <bytecodeTargetLevel target="17" /> | ||
5 | </component> | ||
6 | </project> \ No newline at end of file | ||
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <project version="4"> | ||
3 | <component name="deploymentTargetSelector"> | ||
4 | <selectionStates> | ||
5 | <SelectionState runConfigName="app"> | ||
6 | <option name="selectionMode" value="DROPDOWN" /> | ||
7 | </SelectionState> | ||
8 | </selectionStates> | ||
9 | </component> | ||
10 | </project> \ No newline at end of file | ||
diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml | |||
@@ -0,0 +1,19 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <project version="4"> | ||
3 | <component name="GradleMigrationSettings" migrationVersion="1" /> | ||
4 | <component name="GradleSettings"> | ||
5 | <option name="linkedExternalProjectsSettings"> | ||
6 | <GradleProjectSettings> | ||
7 | <option name="externalProjectPath" value="$PROJECT_DIR$" /> | ||
8 | <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" /> | ||
9 | <option name="modules"> | ||
10 | <set> | ||
11 | <option value="$PROJECT_DIR$" /> | ||
12 | <option value="$PROJECT_DIR$/app" /> | ||
13 | </set> | ||
14 | </option> | ||
15 | <option name="resolveExternalAnnotations" value="false" /> | ||
16 | </GradleProjectSettings> | ||
17 | </option> | ||
18 | </component> | ||
19 | </project> \ No newline at end of file | ||
diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <project version="4"> | ||
3 | <component name="ProjectMigrations"> | ||
4 | <option name="MigrateToGradleLocalJavaHome"> | ||
5 | <set> | ||
6 | <option value="$PROJECT_DIR$" /> | ||
7 | </set> | ||
8 | </option> | ||
9 | </component> | ||
10 | </project> \ No newline at end of file | ||
diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/.idea/misc.xml | |||
@@ -0,0 +1,9 @@ | |||
1 | <project version="4"> | ||
2 | <component name="ExternalStorageConfigurationManager" enabled="true" /> | ||
3 | <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> | ||
4 | <output url="file://$PROJECT_DIR$/build/classes" /> | ||
5 | </component> | ||
6 | <component name="ProjectType"> | ||
7 | <option name="id" value="Android" /> | ||
8 | </component> | ||
9 | </project> \ No newline at end of file | ||
diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml | |||
@@ -0,0 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <project version="4"> | ||
3 | <component name="VcsDirectoryMappings"> | ||
4 | <mapping directory="" vcs="Git" /> | ||
5 | </component> | ||
6 | </project> \ No newline at end of file | ||
diff --git a/README.md b/README.md new file mode 100644 index 0000000..ce59c40 --- /dev/null +++ b/README.md | |||
@@ -0,0 +1,35 @@ | |||
1 | # RTV 365 (TV) Subterfuge | ||
2 | A project that ports the [RTV 365 | ||
3 | (TV)](https://play.google.com/store/apps/details?id=si.rtvslo.rtv4dandroidtv_ab) | ||
4 | application to Android TV 7 (and hopefully earlier). While the application | ||
5 | installs correctly, playing anything fails due to a SSL error. The video | ||
6 | streaming domain, vodstr.rtvslo.si, uses Let's Encrypt certificates, | ||
7 | but the new ISRG Root X2 certificate is not trusted by Android 7.1.1 | ||
8 | and above. | ||
9 | |||
10 | Fortunately, the entire application happens to be a webview to | ||
11 | https://androidtv.rtvslo.si/. Android's webview allows us to handle | ||
12 | (and ignore!) TLS errors. This makes the application prone to MiTM | ||
13 | attacks, but I haven't found a way to extract the root certificate from | ||
14 | [SslError](https://developer.android.com/reference/android/net/http/SslError). | ||
15 | The application supports accounts, but they're only used to gate access | ||
16 | to media - I don't think enabling MiTM is too large of a risk, but you're | ||
17 | welcome to submit patches if you've found a way around this. | ||
18 | |||
19 | The aim of this project is exactly that - to create a minimal webview | ||
20 | wrapper for the application and ignore certificate errors. If your version | ||
21 | of Android TV is not supported, please submit patches to marko@zajc.tel. | ||
22 | |||
23 | ## Downloading | ||
24 | Ready-made builds are available on: | ||
25 | * https://files.zajc.tel/public/builds/rtv365tv-subterfuge | ||
26 | |||
27 | ## Compiling | ||
28 | ``` | ||
29 | $ export ANDROID_HOME=/path/to/android/sdk JAVA_HOME=/path/to/jdk | ||
30 | $ ./gradlew assemble | ||
31 | ``` | ||
32 | |||
33 | ## Available on | ||
34 | * https://git.zajc.tel/rtv365tv-subterfuge.git | ||
35 | * https://github.com/markozajc/rtv365tv-subterfuge | ||
diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore | |||
@@ -0,0 +1 @@ | |||
/build \ No newline at end of file | |||
diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..c68f611 --- /dev/null +++ b/app/build.gradle | |||
@@ -0,0 +1,37 @@ | |||
1 | plugins { | ||
2 | alias(libs.plugins.android.application) | ||
3 | } | ||
4 | |||
5 | android { | ||
6 | namespace 'tel.zajc.rtv' | ||
7 | //noinspection GradleDependency | ||
8 | compileSdk 24 | ||
9 | |||
10 | defaultConfig { | ||
11 | applicationId "tel.zajc.rtv" | ||
12 | minSdk 24 | ||
13 | //noinspection ExpiredTargetSdkVersion | ||
14 | targetSdk 24 | ||
15 | versionCode 1 | ||
16 | versionName "1.0" | ||
17 | |||
18 | } | ||
19 | |||
20 | buildTypes { | ||
21 | release { | ||
22 | minifyEnabled false | ||
23 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') | ||
24 | } | ||
25 | } | ||
26 | compileOptions { | ||
27 | sourceCompatibility JavaVersion.VERSION_1_8 | ||
28 | targetCompatibility JavaVersion.VERSION_1_8 | ||
29 | } | ||
30 | buildFeatures { | ||
31 | viewBinding true | ||
32 | } | ||
33 | } | ||
34 | |||
35 | dependencies { | ||
36 | } | ||
37 | |||
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8505227 --- /dev/null +++ b/app/src/main/AndroidManifest.xml | |||
@@ -0,0 +1,25 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||
3 | |||
4 | <uses-permission android:name="android.permission.INTERNET" /> | ||
5 | |||
6 | <application | ||
7 | android:allowBackup="true" | ||
8 | android:icon="@drawable/icon" | ||
9 | android:label="@string/app_name" | ||
10 | android:supportsRtl="true" | ||
11 | android:banner="@drawable/banner" | ||
12 | android:theme="@android:style/Theme.DeviceDefault.NoActionBar"> | ||
13 | <activity | ||
14 | android:name=".MainActivity" | ||
15 | android:exported="true"> | ||
16 | |||
17 | <intent-filter> | ||
18 | <action android:name="android.intent.action.MAIN" /> | ||
19 | <category android:name="android.intent.category.LAUNCHER" /> | ||
20 | <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> | ||
21 | </intent-filter> | ||
22 | </activity> | ||
23 | </application> | ||
24 | |||
25 | </manifest> \ No newline at end of file | ||
diff --git a/app/src/main/java/tel/zajc/rtv/MainActivity.java b/app/src/main/java/tel/zajc/rtv/MainActivity.java new file mode 100644 index 0000000..9b9fa87 --- /dev/null +++ b/app/src/main/java/tel/zajc/rtv/MainActivity.java | |||
@@ -0,0 +1,59 @@ | |||
1 | package tel.zajc.rtv; | ||
2 | |||
3 | import android.annotation.SuppressLint; | ||
4 | import android.app.Activity; | ||
5 | import android.graphics.*; | ||
6 | import android.net.http.SslError; | ||
7 | import android.os.Bundle; | ||
8 | import android.view.*; | ||
9 | import android.webkit.*; | ||
10 | |||
11 | public class MainActivity extends Activity { | ||
12 | |||
13 | private WebView webView; | ||
14 | |||
15 | @SuppressLint("SetJavaScriptEnabled") | ||
16 | @Override | ||
17 | protected void onCreate(Bundle savedInstanceState) { | ||
18 | super.onCreate(savedInstanceState); | ||
19 | |||
20 | requestWindowFeature(Window.FEATURE_NO_TITLE); | ||
21 | setContentView(R.layout.activity_main); | ||
22 | |||
23 | webView = (WebView) findViewById(R.id.web); | ||
24 | webView.getSettings().setJavaScriptEnabled(true); | ||
25 | webView.getSettings().setSupportZoom(false); | ||
26 | webView.getSettings().setDomStorageEnabled(true); | ||
27 | webView.setBackgroundColor(Color.BLACK); | ||
28 | webView.setWebViewClient(new WebViewClient() { | ||
29 | @Override | ||
30 | @SuppressLint("WebViewClientOnReceivedSslError") | ||
31 | public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { | ||
32 | handler.proceed(); | ||
33 | } | ||
34 | }); | ||
35 | |||
36 | webView.setWebChromeClient(new WebChromeClient() { | ||
37 | @Override | ||
38 | public Bitmap getDefaultVideoPoster() { | ||
39 | Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565); | ||
40 | Canvas canvas = new Canvas(bitmap); | ||
41 | // Use whatever color you want here. You could probably use a transparent color | ||
42 | canvas.drawARGB(255, 0, 0, 0); | ||
43 | return bitmap; | ||
44 | } | ||
45 | }); | ||
46 | |||
47 | webView.loadUrl("https://androidtv.rtvslo.si/?emulator=true"); | ||
48 | } | ||
49 | |||
50 | @Override | ||
51 | public boolean onKeyDown(int keyCode, KeyEvent event) { | ||
52 | if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { | ||
53 | webView.goBack(); | ||
54 | return true; | ||
55 | } | ||
56 | return super.onKeyDown(keyCode, event); | ||
57 | } | ||
58 | |||
59 | } | ||
diff --git a/app/src/main/res/drawable/banner.png b/app/src/main/res/drawable/banner.png new file mode 100644 index 0000000..405f684 --- /dev/null +++ b/app/src/main/res/drawable/banner.png | |||
Binary files differ | |||
diff --git a/app/src/main/res/drawable/icon.png b/app/src/main/res/drawable/icon.png new file mode 100644 index 0000000..d4e3633 --- /dev/null +++ b/app/src/main/res/drawable/icon.png | |||
Binary files differ | |||
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..d4adcac --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml | |||
@@ -0,0 +1,14 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | xmlns:app="http://schemas.android.com/apk/res-auto" | ||
4 | xmlns:tools="http://schemas.android.com/tools" | ||
5 | android:layout_width="match_parent" | ||
6 | android:layout_height="match_parent" | ||
7 | tools:context=".MainActivity"> | ||
8 | |||
9 | <WebView | ||
10 | android:id="@+id/web" | ||
11 | android:layout_width="match_parent" | ||
12 | android:layout_height="match_parent" /> | ||
13 | |||
14 | </FrameLayout> \ No newline at end of file | ||
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..3fb2383 --- /dev/null +++ b/app/src/main/res/values/strings.xml | |||
@@ -0,0 +1,3 @@ | |||
1 | <resources> | ||
2 | <string name="app_name">RTV Subterfuge</string> | ||
3 | </resources> \ No newline at end of file | ||
diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..565f8c2 --- /dev/null +++ b/build.gradle | |||
@@ -0,0 +1,4 @@ | |||
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. | ||
2 | plugins { | ||
3 | alias(libs.plugins.android.application) apply false | ||
4 | } \ No newline at end of file | ||
diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..4387edc --- /dev/null +++ b/gradle.properties | |||
@@ -0,0 +1,21 @@ | |||
1 | # Project-wide Gradle settings. | ||
2 | # IDE (e.g. Android Studio) users: | ||
3 | # Gradle settings configured through the IDE *will override* | ||
4 | # any settings specified in this file. | ||
5 | # For more details on how to configure your build environment visit | ||
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html | ||
7 | # Specifies the JVM arguments used for the daemon process. | ||
8 | # The setting is particularly useful for tweaking memory settings. | ||
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 | ||
10 | # When configured, Gradle will run in incubating parallel mode. | ||
11 | # This option should only be used with decoupled projects. For more details, visit | ||
12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects | ||
13 | # org.gradle.parallel=true | ||
14 | # AndroidX package structure to make it clearer which packages are bundled with the | ||
15 | # Android operating system, and which are packaged with your app's APK | ||
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn | ||
17 | android.useAndroidX=true | ||
18 | # Enables namespacing of each library's R class so that its R class includes only the | ||
19 | # resources declared in the library itself and none from the library's dependencies, | ||
20 | # thereby reducing the size of the R class for that library | ||
21 | android.nonTransitiveRClass=true \ No newline at end of file | ||
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..6911067 --- /dev/null +++ b/gradle/libs.versions.toml | |||
@@ -0,0 +1,6 @@ | |||
1 | [versions] | ||
2 | agp = "8.5.2" | ||
3 | |||
4 | [plugins] | ||
5 | android-application = { id = "com.android.application", version.ref = "agp" } | ||
6 | |||
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.jar | |||
Binary files differ | |||
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a7b2356 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties | |||
@@ -0,0 +1,6 @@ | |||
1 | #Sun Sep 01 23:00:33 CEST 2024 | ||
2 | distributionBase=GRADLE_USER_HOME | ||
3 | distributionPath=wrapper/dists | ||
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip | ||
5 | zipStoreBase=GRADLE_USER_HOME | ||
6 | zipStorePath=wrapper/dists | ||
@@ -0,0 +1,185 @@ | |||
1 | #!/usr/bin/env sh | ||
2 | |||
3 | # | ||
4 | # Copyright 2015 the original author or authors. | ||
5 | # | ||
6 | # Licensed under the Apache License, Version 2.0 (the "License"); | ||
7 | # you may not use this file except in compliance with the License. | ||
8 | # You may obtain a copy of the License at | ||
9 | # | ||
10 | # https://www.apache.org/licenses/LICENSE-2.0 | ||
11 | # | ||
12 | # Unless required by applicable law or agreed to in writing, software | ||
13 | # distributed under the License is distributed on an "AS IS" BASIS, | ||
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
15 | # See the License for the specific language governing permissions and | ||
16 | # limitations under the License. | ||
17 | # | ||
18 | |||
19 | ############################################################################## | ||
20 | ## | ||
21 | ## Gradle start up script for UN*X | ||
22 | ## | ||
23 | ############################################################################## | ||
24 | |||
25 | # Attempt to set APP_HOME | ||
26 | # Resolve links: $0 may be a link | ||
27 | PRG="$0" | ||
28 | # Need this for relative symlinks. | ||
29 | while [ -h "$PRG" ] ; do | ||
30 | ls=`ls -ld "$PRG"` | ||
31 | link=`expr "$ls" : '.*-> \(.*\)$'` | ||
32 | if expr "$link" : '/.*' > /dev/null; then | ||
33 | PRG="$link" | ||
34 | else | ||
35 | PRG=`dirname "$PRG"`"/$link" | ||
36 | fi | ||
37 | done | ||
38 | SAVED="`pwd`" | ||
39 | cd "`dirname \"$PRG\"`/" >/dev/null | ||
40 | APP_HOME="`pwd -P`" | ||
41 | cd "$SAVED" >/dev/null | ||
42 | |||
43 | APP_NAME="Gradle" | ||
44 | APP_BASE_NAME=`basename "$0"` | ||
45 | |||
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||
48 | |||
49 | # Use the maximum available, or set MAX_FD != -1 to use that value. | ||
50 | MAX_FD="maximum" | ||
51 | |||
52 | warn () { | ||
53 | echo "$*" | ||
54 | } | ||
55 | |||
56 | die () { | ||
57 | echo | ||
58 | echo "$*" | ||
59 | echo | ||
60 | exit 1 | ||
61 | } | ||
62 | |||
63 | # OS specific support (must be 'true' or 'false'). | ||
64 | cygwin=false | ||
65 | msys=false | ||
66 | darwin=false | ||
67 | nonstop=false | ||
68 | case "`uname`" in | ||
69 | CYGWIN* ) | ||
70 | cygwin=true | ||
71 | ;; | ||
72 | Darwin* ) | ||
73 | darwin=true | ||
74 | ;; | ||
75 | MINGW* ) | ||
76 | msys=true | ||
77 | ;; | ||
78 | NONSTOP* ) | ||
79 | nonstop=true | ||
80 | ;; | ||
81 | esac | ||
82 | |||
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||
84 | |||
85 | |||
86 | # Determine the Java command to use to start the JVM. | ||
87 | if [ -n "$JAVA_HOME" ] ; then | ||
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||
89 | # IBM's JDK on AIX uses strange locations for the executables | ||
90 | JAVACMD="$JAVA_HOME/jre/sh/java" | ||
91 | else | ||
92 | JAVACMD="$JAVA_HOME/bin/java" | ||
93 | fi | ||
94 | if [ ! -x "$JAVACMD" ] ; then | ||
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||
96 | |||
97 | Please set the JAVA_HOME variable in your environment to match the | ||
98 | location of your Java installation." | ||
99 | fi | ||
100 | else | ||
101 | JAVACMD="java" | ||
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||
103 | |||
104 | Please set the JAVA_HOME variable in your environment to match the | ||
105 | location of your Java installation." | ||
106 | fi | ||
107 | |||
108 | # Increase the maximum file descriptors if we can. | ||
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | ||
110 | MAX_FD_LIMIT=`ulimit -H -n` | ||
111 | if [ $? -eq 0 ] ; then | ||
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | ||
113 | MAX_FD="$MAX_FD_LIMIT" | ||
114 | fi | ||
115 | ulimit -n $MAX_FD | ||
116 | if [ $? -ne 0 ] ; then | ||
117 | warn "Could not set maximum file descriptor limit: $MAX_FD" | ||
118 | fi | ||
119 | else | ||
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | ||
121 | fi | ||
122 | fi | ||
123 | |||
124 | # For Darwin, add options to specify how the application appears in the dock | ||
125 | if $darwin; then | ||
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | ||
127 | fi | ||
128 | |||
129 | # For Cygwin or MSYS, switch paths to Windows format before running java | ||
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then | ||
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` | ||
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | ||
133 | |||
134 | JAVACMD=`cygpath --unix "$JAVACMD"` | ||
135 | |||
136 | # We build the pattern for arguments to be converted via cygpath | ||
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | ||
138 | SEP="" | ||
139 | for dir in $ROOTDIRSRAW ; do | ||
140 | ROOTDIRS="$ROOTDIRS$SEP$dir" | ||
141 | SEP="|" | ||
142 | done | ||
143 | OURCYGPATTERN="(^($ROOTDIRS))" | ||
144 | # Add a user-defined pattern to the cygpath arguments | ||
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then | ||
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | ||
147 | fi | ||
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||
149 | i=0 | ||
150 | for arg in "$@" ; do | ||
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | ||
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option | ||
153 | |||
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition | ||
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | ||
156 | else | ||
157 | eval `echo args$i`="\"$arg\"" | ||
158 | fi | ||
159 | i=`expr $i + 1` | ||
160 | done | ||
161 | case $i in | ||
162 | 0) set -- ;; | ||
163 | 1) set -- "$args0" ;; | ||
164 | 2) set -- "$args0" "$args1" ;; | ||
165 | 3) set -- "$args0" "$args1" "$args2" ;; | ||
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; | ||
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | ||
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | ||
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | ||
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | ||
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | ||
172 | esac | ||
173 | fi | ||
174 | |||
175 | # Escape application args | ||
176 | save () { | ||
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | ||
178 | echo " " | ||
179 | } | ||
180 | APP_ARGS=`save "$@"` | ||
181 | |||
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules | ||
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | ||
184 | |||
185 | exec "$JAVACMD" "$@" | ||
diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat | |||
@@ -0,0 +1,89 @@ | |||
1 | @rem | ||
2 | @rem Copyright 2015 the original author or authors. | ||
3 | @rem | ||
4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | @rem you may not use this file except in compliance with the License. | ||
6 | @rem You may obtain a copy of the License at | ||
7 | @rem | ||
8 | @rem https://www.apache.org/licenses/LICENSE-2.0 | ||
9 | @rem | ||
10 | @rem Unless required by applicable law or agreed to in writing, software | ||
11 | @rem distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | @rem See the License for the specific language governing permissions and | ||
14 | @rem limitations under the License. | ||
15 | @rem | ||
16 | |||
17 | @if "%DEBUG%" == "" @echo off | ||
18 | @rem ########################################################################## | ||
19 | @rem | ||
20 | @rem Gradle startup script for Windows | ||
21 | @rem | ||
22 | @rem ########################################################################## | ||
23 | |||
24 | @rem Set local scope for the variables with windows NT shell | ||
25 | if "%OS%"=="Windows_NT" setlocal | ||
26 | |||
27 | set DIRNAME=%~dp0 | ||
28 | if "%DIRNAME%" == "" set DIRNAME=. | ||
29 | set APP_BASE_NAME=%~n0 | ||
30 | set APP_HOME=%DIRNAME% | ||
31 | |||
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||
34 | |||
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||
37 | |||
38 | @rem Find java.exe | ||
39 | if defined JAVA_HOME goto findJavaFromJavaHome | ||
40 | |||
41 | set JAVA_EXE=java.exe | ||
42 | %JAVA_EXE% -version >NUL 2>&1 | ||
43 | if "%ERRORLEVEL%" == "0" goto execute | ||
44 | |||
45 | echo. | ||
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||
47 | echo. | ||
48 | echo Please set the JAVA_HOME variable in your environment to match the | ||
49 | echo location of your Java installation. | ||
50 | |||
51 | goto fail | ||
52 | |||
53 | :findJavaFromJavaHome | ||
54 | set JAVA_HOME=%JAVA_HOME:"=% | ||
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||
56 | |||
57 | if exist "%JAVA_EXE%" goto execute | ||
58 | |||
59 | echo. | ||
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||
61 | echo. | ||
62 | echo Please set the JAVA_HOME variable in your environment to match the | ||
63 | echo location of your Java installation. | ||
64 | |||
65 | goto fail | ||
66 | |||
67 | :execute | ||
68 | @rem Setup the command line | ||
69 | |||
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||
71 | |||
72 | |||
73 | @rem Execute Gradle | ||
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||
75 | |||
76 | :end | ||
77 | @rem End local scope for the variables with windows NT shell | ||
78 | if "%ERRORLEVEL%"=="0" goto mainEnd | ||
79 | |||
80 | :fail | ||
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||
82 | rem the _cmd.exe /c_ return code! | ||
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||
84 | exit /b 1 | ||
85 | |||
86 | :mainEnd | ||
87 | if "%OS%"=="Windows_NT" endlocal | ||
88 | |||
89 | :omega | ||
diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..21eb329 --- /dev/null +++ b/settings.gradle | |||
@@ -0,0 +1,23 @@ | |||
1 | pluginManagement { | ||
2 | repositories { | ||
3 | google { | ||
4 | content { | ||
5 | includeGroupByRegex("com\\.android.*") | ||
6 | includeGroupByRegex("com\\.google.*") | ||
7 | includeGroupByRegex("androidx.*") | ||
8 | } | ||
9 | } | ||
10 | mavenCentral() | ||
11 | gradlePluginPortal() | ||
12 | } | ||
13 | } | ||
14 | dependencyResolutionManagement { | ||
15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) | ||
16 | repositories { | ||
17 | google() | ||
18 | mavenCentral() | ||
19 | } | ||
20 | } | ||
21 | |||
22 | rootProject.name = "RTV" | ||
23 | include ':app' | ||