Skip to content

Commit

Permalink
Merge pull request #1 from jarnedemeulemeester/develop
Browse files Browse the repository at this point in the history
First public version 0.1.0
  • Loading branch information
jarnedemeulemeester authored Aug 16, 2021
2 parents 8d1c02c + 0575b9b commit f047b89
Show file tree
Hide file tree
Showing 156 changed files with 8,243 additions and 295 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/discord.xml
/.idea/gradle.xml
/.idea/deploymentTargetDropDown.xml
.DS_Store
/build
/captures
Expand Down
19 changes: 0 additions & 19 deletions .idea/gradle.xml

This file was deleted.

9 changes: 9 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 0 additions & 10 deletions .idea/runConfigurations.xml

This file was deleted.

674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions PRIVACY
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Findroid does not collection any personal data.

Findroid connects to a provided Jellyfin server which may collect some personal data such as IP address and device name.
This provided Jellyfin server is in most cases owned by the user themselves.
41 changes: 40 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,40 @@
Jellyfin
![Findroid banner](images/banner.svg)

# Findroid

Findroid is third-party Android application for Jellyfin that provides a native user interface to browse and play movies and series.

I am developing this application in my spare time.

**This project is in its early stages so expect bugs.**

## Screenshots
Home | Library | Movie | Season | Episode
-----|---------|-------|--------|--------
![Home](images/home-light-dark.png) | ![Library](images/library-dark.png) | ![Movie](images/movie-dark.png) | ![Season](images/season-dark.png) | ![Episode](images/episode-dark.png)

## Features
- Completely native interface
- Supported media items: movies, series, seasons, episodes
- Direct play only, (no transcoding)
- Video codes: H.263, H.264, H.265, VP8, VP9, AV1
- Support depends on Android device
- Audio codes: Vorbis, Opus, FLAC, ALAC, PCM µ-law, PCM A-law, MP1, MP2, MP3, AMR-NB, AMR-WB, AAC, AC-3, E-AC-3, DTS, DTS-HD, TrueHD
- Support provided by ExoPlayer FFmpeg extension
- Subtitle codecs: SRT, VTT, SSA/ASS, PGSSUB
- SSA/ASS has limited styling support see [this issue](https://github.com/google/ExoPlayer/issues/8435)

## Planned features
- Websocket connection (Syncplay)
- Caching
- Offline playback / downloads
- Picture in picture mode
- Chromecast support

This project is licensed under [GPLv3](LICENSE).

The logo is a combination of the Jellyfin logo and the Android robot.

The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

Android is a trademark of Google LLC.
92 changes: 79 additions & 13 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,45 +1,111 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-parcelize'
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'
id 'dagger.hilt.android.plugin'
id 'com.google.android.gms.oss-licenses-plugin'
}

android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
compileSdkVersion 31
buildToolsVersion "31.0.0"

defaultConfig {
applicationId "dev.jdtech.jellyfin"
minSdkVersion 24
targetSdkVersion 30
targetSdkVersion 31
versionCode 1
versionName "1.0"
versionName "0.1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = '1.8'
}

buildFeatures {
dataBinding true
}
}

dependencies {
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
implementation 'androidx.appcompat:appcompat:1.3.1'

// Material
implementation 'com.google.android.material:material:1.4.0'

// ConstraintLayout
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'

// Navigation
def navigation_version = "2.3.5"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"

// RecyclerView
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation "androidx.recyclerview:recyclerview-selection:1.1.0"

// Room
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"

// Preference
def preference_version = "1.1.1"
implementation "androidx.preference:preference-ktx:$preference_version"

// Jellyfin
def jellyfin_version = "1.0.2"
implementation "org.jellyfin.sdk:jellyfin-platform-android:$jellyfin_version"

// Glide
def glide_version = "4.12.0"
implementation "com.github.bumptech.glide:glide:$glide_version"
kapt "com.github.bumptech.glide:compiler:$glide_version"

// Hilt
def hilt_version = "2.38.1"
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"

// ExoPlayer
def exoplayer_version = "2.15.0"
implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version"
implementation files('libs/extension-ffmpeg-release.aar')

// Timber
def timber_version = "5.0.0"
implementation "com.jakewharton.timber:timber:$timber_version"

def oss_licenses_version = "17.0.0"
implementation "com.google.android.gms:play-services-oss-licenses:$oss_licenses_version"

// Testing
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
Binary file added app/libs/extension-ffmpeg-release.aar
Binary file not shown.
4 changes: 3 additions & 1 deletion app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#-renamesourcefileattribute SourceFile

-keep public class dev.jdtech.jellyfin.models.PlayerItem
21 changes: 19 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,37 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dev.jdtech.jellyfin">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Jellyfin">
<activity android:name=".MainActivity">
android:theme="@style/Theme.Jellyfin"
android:usesCleartextTraffic="true">
<activity
android:name=".PlayerActivity"
android:screenOrientation="userLandscape" />
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.JellyfinSplashScreen"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity"
android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar"/>

<activity android:name="com.google.android.gms.oss.licenses.OssLicensesActivity"
android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar"/>

</application>

</manifest>
Binary file added app/src/main/ic_launcher-playstore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 25 additions & 0 deletions app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package dev.jdtech.jellyfin

import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.PreferenceManager
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber

@HiltAndroidApp
class BaseApplication : Application() {
override fun onCreate() {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

when (sharedPreferences.getString("theme", null)) {
"system" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
"light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
"dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}

super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
}
}
Loading

0 comments on commit f047b89

Please sign in to comment.