Giter Site home page Giter Site logo

yash-garg / qbittorrent-manager Goto Github PK

View Code? Open in Web Editor NEW
253.0 8.0 6.0 7.13 MB

[WIP] Modern qBittorrent WebUI Client for Android written in Kotlin

Home Page: https://play.google.com/store/apps/details?id=dev.yashgarg.qbit

License: GNU General Public License v3.0

Kotlin 99.84% Shell 0.16%
android coroutines-flow hilt kotlin qbittorrent qbittorrent-webui kotlin-coroutines material-3 android-xml mvi-kotlin

qbittorrent-manager's Introduction

qBittorrent-Manager (SLOW DEVELOPMENT) ๐Ÿšง

Android CI

This is the repository for qBittorrent Manager, an Android app for managing qBittorrent remotely, written in Kotlin.

I mostly work on this project in my free time, so the development may be slow.

Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. ๐Ÿ’–

DrewCarlsonย ย 

Download

Get it on F-Droid Get it on Google Play

Previews

License

See LICENSE

qbittorrent-manager's People

Contributors

imgbot[bot] avatar renovate[bot] avatar thelazyindian avatar yash-garg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

qbittorrent-manager's Issues

[FEATURE REQUEST] Notification on completed torrent

Is your feature request related to a problem? Please describe.
No

Describe the solution you'd like
Notification is shown when torrent completes downloading.

Describe alternatives you've considered
I don't see any alternatives to this.

Additional context
A notification of completed torrent on my phone would be something I pay more attention to then an email sent by qbittorrent. Also emails leave a trail.

Another qbittorrent client on the play store has this feature.
https://play.google.com/store/apps/details?id=me.fengmlo.qbRemot

And there's early support for push notification
https://github.com/fengmlo/qbittorrent-remote-translation/blob/master/server_push.md

[FEATURE REQUEST] Implement connecting to subdirectories

Is your feature request related to a problem? Please describe.
yes, because this app does not let you specify the subdirectory to which the app should connect to. if your qbittorrent instance is exposed through a subdirectory (eg. https://my.home.server/qbittorrent), the app will not be able to connect

Describe the solution you'd like
implement a feature to allow the user to do exactly that.

Describe alternatives you've considered
using other apps I guess?

Additional context
screenshot from another app that implements this feature:
Screenshot_20221207-114605-954

[REFACTOR] Move the hardcoded strings in the project to `strings.xml`

Move hardcoded strings like below, throughout the project to strings.xml.

// TODO: Switch to string resources below
alertDialogBuilder.apply {
setTitle("Add Magnet Link")
setView(R.layout.edit_text)
setNeutralButton("Upload File", null)
setNegativeButton("Cancel") { dialog, _ -> dialog.dismiss() }
setPositiveButton("Add", null)
}

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • chore(deps): update actions/checkout action to v4.1.4
  • chore(deps): update axnavigation to v2.7.7 (androidx.navigation.safeargs, androidx.navigation:navigation-ui-ktx, androidx.navigation:navigation-fragment-ktx)
  • fix(deps): update dependency com.michael-bull.kotlin-result:kotlin-result to v1.1.21
  • chore(deps): update dependency gradle to v8.7
  • chore(deps): update dependency org.jetbrains.kotlinx.binary-compatibility-validator to v0.14.0
  • chore(deps): update gradle/gradle-build-action action to v2.12.0
  • chore(deps): update hilt to v2.51.1 (com.google.dagger.hilt.android, com.google.dagger:hilt-compiler, com.google.dagger:hilt-android)
  • chore(deps): update plugin com.gradle.enterprise to v3.17.2
  • chore(deps): update spotless to v6.25.0 (com.diffplug.spotless, com.diffplug.spotless:spotless-plugin-gradle)
  • fix(deps): update axhilt to v1.2.0 (androidx.hilt:hilt-compiler, androidx.hilt:hilt-work)
  • fix(deps): update coroutines to v1.8.0 (org.jetbrains.kotlinx:kotlinx-coroutines-test, org.jetbrains.kotlinx:kotlinx-coroutines-jdk8, org.jetbrains.kotlinx:kotlinx-coroutines-core)
  • fix(deps): update dependency androidx.compose.foundation:foundation to v1.6.6
  • fix(deps): update dependency androidx.compose.material3:material3 to v1.2.1
  • fix(deps): update dependency androidx.core:core-ktx to v1.13.0
  • fix(deps): update dependency androidx.datastore:datastore-preferences to v1.1.0
  • fix(deps): update dependency androidx.test.uiautomator:uiautomator to v2.3.0
  • fix(deps): update dependency androidx.work:work-runtime-ktx to v2.9.0
  • fix(deps): update dependency app.cash.turbine:turbine to v1.1.0
  • fix(deps): update dependency com.airbnb.android:lottie to v6.4.0
  • fix(deps): update dependency com.google.accompanist:accompanist-themeadapter-material3 to v0.34.0
  • fix(deps): update dependency com.google.android.material:material to v1.11.0
  • fix(deps): update dependency com.squareup.leakcanary:leakcanary-android to v2.14
  • fix(deps): update dependency org.mockito.kotlin:mockito-kotlin to v5.3.1
  • fix(deps): update dependency org.mockito:mockito-core to v5.11.0
  • fix(deps): update lifecycle to v2.7.0 (androidx.lifecycle:lifecycle-viewmodel-ktx, androidx.lifecycle:lifecycle-runtime-ktx)
  • chore(deps): update actions/setup-java action to v4
  • chore(deps): update actions/upload-artifact action to v4
  • chore(deps): update gradle/gradle-build-action action to v3
  • chore(deps): update plugin sentry to v4
  • chore(deps): update tj-actions/changed-files action to v44
  • fix(deps): update dependency com.michael-bull.kotlin-result:kotlin-result to v2
  • ๐Ÿ” Create all rate-limited PRs at once ๐Ÿ”

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

github-actions
.github/workflows/develop_ci.yml
  • actions/checkout v4.1.1
  • tj-actions/changed-files v40
  • actions/checkout v4.1.1
  • actions/setup-java v3.13.0
  • gradle/gradle-build-action v2.9.0
  • actions/checkout v4.1.1
  • actions/setup-java v3.13.0
  • gradle/gradle-build-action v2.9.0
  • actions/upload-artifact v3
.github/workflows/pr_ci.yml
  • actions/checkout v4.1.1
  • tj-actions/changed-files v40
  • actions/checkout v4.1.1
  • actions/setup-java v3.13.0
  • gradle/gradle-build-action v2.9.0
  • actions/checkout v4.1.1
  • actions/setup-java v3.13.0
  • gradle/gradle-build-action v2.9.0
  • actions/checkout v4.1.1
  • actions/setup-java v3.13.0
  • gradle/gradle-build-action v2.9.0
  • actions/upload-artifact v3
gradle
gradle.properties
settings.gradle.kts
  • com.gradle.enterprise 3.15.1
build.gradle.kts
app/build.gradle.kts
benchmark/build.gradle.kts
bonsai-core/build.gradle.kts
build-logic/settings.gradle.kts
build-logic/build.gradle.kts
client-wrapper/settings.gradle.kts
client-wrapper/client/build.gradle.kts
client-wrapper/models/build.gradle.kts
common/build.gradle.kts
gradle/libs.versions.toml
  • androidx.core:core-ktx 1.12.0
  • androidx.activity:activity-ktx 1.8.0
  • androidx.appcompat:appcompat 1.6.1
  • androidx.benchmark:benchmark-macro-junit4 1.2.0
  • androidx.constraintlayout:constraintlayout 2.1.4
  • androidx.datastore:datastore-preferences 1.0.0
  • androidx.swiperefreshlayout:swiperefreshlayout 1.1.0
  • androidx.lifecycle:lifecycle-runtime-ktx 2.6.2
  • androidx.lifecycle:lifecycle-viewmodel-ktx 2.6.2
  • androidx.navigation:navigation-fragment-ktx 2.7.5
  • androidx.navigation:navigation-ui-ktx 2.7.5
  • androidx.profileinstaller:profileinstaller 1.3.1
  • androidx.recyclerview:recyclerview-selection 1.2.0-alpha01
  • androidx.room:room-runtime 2.6.0
  • androidx.room:room-compiler 2.6.0
  • androidx.room:room-ktx 2.6.0
  • androidx.work:work-runtime-ktx 2.8.1
  • androidx.hilt:hilt-work 1.1.0
  • androidx.hilt:hilt-compiler 1.1.0
  • androidx.test.uiautomator:uiautomator 2.2.0
  • androidx.test.espresso:espresso-core 3.5.1
  • androidx.test.ext:junit 1.1.5
  • com.diffplug.spotless:spotless-plugin-gradle 6.22.0
  • org.jetbrains.kotlin:kotlin-gradle-plugin 1.9.10
  • org.jetbrains.kotlinx:kotlinx-coroutines-core 1.7.3
  • org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 1.7.3
  • org.jetbrains.kotlinx:kotlinx-coroutines-test 1.7.3
  • app.cash.turbine:turbine 1.0.0
  • androidx.activity:activity-compose 1.8.0
  • androidx.compose.compiler:compiler 1.5.3
  • androidx.compose.foundation:foundation 1.5.4
  • androidx.compose.material3:material3 1.1.2
  • org.jetbrains.compose.material:material-icons-extended-desktop 1.5.10
  • com.google.accompanist:accompanist-themeadapter-material3 0.32.0
  • com.google.android.material:material 1.10.0
  • com.google.dagger:hilt-android 2.48.1
  • com.google.dagger:hilt-compiler 2.48.1
  • org.jetbrains.kotlinx:kotlinx-serialization-core 1.6.0
  • org.jetbrains.kotlinx:kotlinx-serialization-json 1.6.0
  • io.ktor:ktor-client-core 2.3.5
  • io.ktor:ktor-client-logging 2.3.5
  • io.ktor:ktor-client-okhttp 2.3.5
  • io.ktor:ktor-client-content-negotiation 2.3.5
  • io.ktor:ktor-serialization-kotlinx-json 2.3.5
  • com.squareup.leakcanary:leakcanary-android 2.12
  • me.saket.cascade:cascade 2.3.0
  • com.michael-bull.kotlin-result:kotlin-result 1.1.18
  • com.airbnb.android:lottie 6.2.0
  • com.github.haroldadmin:WhatTheStack 1.0.0-alpha04
  • junit:junit 4.13.2
  • org.mockito:mockito-core 5.7.0
  • org.mockito.kotlin:mockito-kotlin 5.1.0
  • com.android.application 8.3.0-alpha12
  • com.android.library 8.3.0-alpha12
  • com.android.test 8.3.0-alpha12
  • org.jetbrains.kotlinx.binary-compatibility-validator 0.13.2
  • org.jetbrains.kotlin.android 1.9.10
  • com.google.dagger.hilt.android 2.48.1
  • org.jetbrains.kotlin.kapt 1.9.10
  • org.jetbrains.kotlin.plugin.serialization 1.9.10
  • org.jetbrains.kotlin.multiplatform 1.9.10
  • androidx.navigation.safeargs 2.7.5
  • com.diffplug.spotless 6.22.0
  • io.sentry.android.gradle 3.14.0
ui-compose/build.gradle.kts
gradle-wrapper
gradle/wrapper/gradle-wrapper.properties
  • gradle 8.4

  • Check this box to trigger a request for Renovate to run again on this repository

[BUG] Torrent view does not load.

Describe the bug
Torrents do not load after connecting to a server. Instead the app shows a perpetual spinning wheel. No error is shown.

To Reproduce
Steps to reproduce the behavior:
Add server & connect.

Expected behavior
App showing a list of torrents.

Screenshots
Screenshot_20231103-154554

Smartphone (please complete the following information):

  • Device: Pixel 7 Pro
  • OS: Android 14
  • App Version: 0.2.5

Additional context
Persists across installs/storage clearing.

[BUG] Wrong port when testing server connection

client connects to the server on the wrong port

when configuring the server, after specifying "HTTP" and port "443"
the client connects to port 80

the client should connect to port 443 even if the standard http port is 80

[BUG] Memory leak in `bonsai-core` composition

It's probably due to the Composition used in bonsai/core/tree/Tree.kt.

Docs Reference

Leakcanary Stacktrace

D/LeakCanary: โ€‹
D/LeakCanary: ====================================
D/LeakCanary: HEAP ANALYSIS RESULT
D/LeakCanary: ====================================
D/LeakCanary: 3 APPLICATION LEAKS
D/LeakCanary:D/LeakCanary: References underlined with "~~~" are likely causes.
D/LeakCanary: Learn more at https://squ.re/leaks.
D/LeakCanary:D/LeakCanary: 2794 bytes retained by leaking objects
D/LeakCanary: Signature: 294c14f86ef1f535d2d18c00e3aefe49abd3e220
D/LeakCanary: โ”ฌโ”€โ”€โ”€
D/LeakCanary: โ”‚ GC Root: Input or output parameters in native code
D/LeakCanary: โ”‚
D/LeakCanary: โ”œโ”€ dalvik.system.PathClassLoader instance
D/LeakCanary: โ”‚    Leaking: NO (SnapshotKtโ†“ is not leaking and A ClassLoader is never leaking)
D/LeakCanary: โ”‚    โ†“ ClassLoader.runtimeInternalObjects
D/LeakCanary: โ”œโ”€ java.lang.Object[] array
D/LeakCanary: โ”‚    Leaking: NO (SnapshotKtโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ Object[6667]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.snapshots.SnapshotKt class
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking and a class is never leaking)
D/LeakCanary: โ”‚    โ†“ static SnapshotKt.applyObservers
D/LeakCanary: โ”œโ”€ java.util.ArrayList instance
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ ArrayList[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.Recomposer$recompositionRunner$2$unregisterApplyObserver$1 instance
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking)
D/LeakCanary: โ”‚    Anonymous subclass of kotlin.jvm.internal.Lambda
D/LeakCanary: โ”‚    โ†“ Recomposer$recompositionRunner$2$unregisterApplyObserver$1.this$0
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.Recomposer instance
D/LeakCanary: โ”‚    Leaking: NO (CompositionImplโ†“ is not leaking and Recomposer is in state Idle)
D/LeakCanary: โ”‚    โ†“ Recomposer.knownCompositions
D/LeakCanary: โ”œโ”€ java.util.ArrayList instance
D/LeakCanary: โ”‚    Leaking: NO (CompositionImplโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ ArrayList[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.CompositionImpl instance
D/LeakCanary: โ”‚    Leaking: NO (Composition not disposed)
D/LeakCanary: โ”‚    โ†“ CompositionImpl.composer
D/LeakCanary: โ”‚                      ~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.ComposerImpl instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 9.1 kB in 48 objects
D/LeakCanary: โ”‚    โ†“ ComposerImpl.parentProvider
D/LeakCanary: โ”‚                   ~~~~~~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.PersistentHashMap
D/LeakCanary: โ”‚  instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 320 B in 8 objects
D/LeakCanary: โ”‚    โ†“ PersistentHashMap.node
D/LeakCanary: โ”‚                        ~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.TrieNode instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 296 B in 7 objects
D/LeakCanary: โ”‚    โ†“ TrieNode.buffer
D/LeakCanary: โ”‚               ~~~~~~
D/LeakCanary: โ”œโ”€ java.lang.Object[] array
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 272 B in 6 objects
D/LeakCanary: โ”‚    โ†“ Object[45]
D/LeakCanary: โ”‚            ~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.StaticValueHolder instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 12 B in 1 objects
D/LeakCanary: โ”‚    โ†“ StaticValueHolder.value
D/LeakCanary: โ”‚                        ~~~~~
D/LeakCanary: โ”œโ”€ androidx.fragment.app.FragmentViewLifecycleOwner instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 173 B in 6 objects
D/LeakCanary: โ”‚    โ†“ FragmentViewLifecycleOwner.mFragment
D/LeakCanary: โ”‚                                 ~~~~~~~~~
D/LeakCanary: โ•ฐโ†’ dev.yashgarg.qbit.ui.torrent.tabs.TorrentFilesFragment instance
D/LeakCanary: โ€‹     Leaking: YES (ObjectWatcher was watching this because dev.yashgarg.qbit.ui.torrent.tabs.TorrentFilesFragment
D/LeakCanary: โ€‹     received Fragment#onDestroy() callback and Fragment#mFragmentManager is null)
D/LeakCanary: โ€‹     Retaining 2.8 kB in 105 objects
D/LeakCanary: โ€‹     key = 729161f9-e2c4-4211-a526-d0a54992cd9e
D/LeakCanary: โ€‹     watchDurationMillis = 5484
D/LeakCanary: โ€‹     retainedDurationMillis = 483
D/LeakCanary:D/LeakCanary: 210 bytes retained by leaking objects
D/LeakCanary: Signature: cd1c7c9324750e1908bfb93e73a7daaccc8ddf30
D/LeakCanary: โ”ฌโ”€โ”€โ”€
D/LeakCanary: โ”‚ GC Root: Input or output parameters in native code
D/LeakCanary: โ”‚
D/LeakCanary: โ”œโ”€ dalvik.system.PathClassLoader instance
D/LeakCanary: โ”‚    Leaking: NO (SnapshotKtโ†“ is not leaking and A ClassLoader is never leaking)
D/LeakCanary: โ”‚    โ†“ ClassLoader.runtimeInternalObjects
D/LeakCanary: โ”œโ”€ java.lang.Object[] array
D/LeakCanary: โ”‚    Leaking: NO (SnapshotKtโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ Object[6667]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.snapshots.SnapshotKt class
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking and a class is never leaking)
D/LeakCanary: โ”‚    โ†“ static SnapshotKt.applyObservers
D/LeakCanary: โ”œโ”€ java.util.ArrayList instance
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ ArrayList[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.Recomposer$recompositionRunner$2$unregisterApplyObserver$1 instance
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking)
D/LeakCanary: โ”‚    Anonymous subclass of kotlin.jvm.internal.Lambda
D/LeakCanary: โ”‚    โ†“ Recomposer$recompositionRunner$2$unregisterApplyObserver$1.this$0
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.Recomposer instance
D/LeakCanary: โ”‚    Leaking: NO (CompositionImplโ†“ is not leaking and Recomposer is in state Idle)
D/LeakCanary: โ”‚    โ†“ Recomposer.knownCompositions
D/LeakCanary: โ”œโ”€ java.util.ArrayList instance
D/LeakCanary: โ”‚    Leaking: NO (CompositionImplโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ ArrayList[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.CompositionImpl instance
D/LeakCanary: โ”‚    Leaking: NO (Composition not disposed)
D/LeakCanary: โ”‚    โ†“ CompositionImpl.slotTable
D/LeakCanary: โ”‚                      ~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.SlotTable instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 345 B in 17 objects
D/LeakCanary: โ”‚    โ†“ SlotTable.slots
D/LeakCanary: โ”‚                ~~~~~
D/LeakCanary: โ”œโ”€ java.lang.Object[] array
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 6.4 kB in 206 objects
D/LeakCanary: โ”‚    โ†“ Object[32]
D/LeakCanary: โ”‚            ~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.ui.platform.DisposableSaveableStateRegistry instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 37 B in 2 objects
D/LeakCanary: โ”‚    โ†“ DisposableSaveableStateRegistry.onDispose
D/LeakCanary: โ”‚                                      ~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1 instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 21 B in 1 objects
D/LeakCanary: โ”‚    Anonymous subclass of kotlin.jvm.internal.Lambda
D/LeakCanary: โ”‚    โ†“ DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1.$androidxRegistry
D/LeakCanary: โ”‚                                                                                  ~~~~~~~~~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.savedstate.SavedStateRegistry instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 506 B in 19 objects
D/LeakCanary: โ”‚    โ†“ SavedStateRegistry.components
D/LeakCanary: โ”‚                         ~~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.arch.core.internal.SafeIterableMap instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 483 B in 18 objects
D/LeakCanary: โ”‚    โ†“ SafeIterableMap["androidx.lifecycle.internal.SavedStateHandlesProvider"]
D/LeakCanary: โ”‚                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.lifecycle.SavedStateHandlesProvider instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 251 B in 10 objects
D/LeakCanary: โ”‚    โ†“ SavedStateHandlesProvider.viewModel$delegate
D/LeakCanary: โ”‚                                ~~~~~~~~~~~~~~~~~~
D/LeakCanary: โ”œโ”€ kotlin.SynchronizedLazyImpl instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 230 B in 9 objects
D/LeakCanary: โ”‚    โ†“ SynchronizedLazyImpl._value
D/LeakCanary: โ”‚                           ~~~~~~
D/LeakCanary: โ•ฐโ†’ androidx.lifecycle.SavedStateHandlesVM instance
D/LeakCanary: โ€‹     Leaking: YES (ObjectWatcher was watching this because androidx.lifecycle.SavedStateHandlesVM received
D/LeakCanary: โ€‹     ViewModel#onCleared() callback)
D/LeakCanary: โ€‹     Retaining 210 B in 8 objects
D/LeakCanary: โ€‹     key = 375b335d-00db-4565-8c6d-0848ea7ca599
D/LeakCanary: โ€‹     watchDurationMillis = 5485
D/LeakCanary: โ€‹     retainedDurationMillis = 483
D/LeakCanary:D/LeakCanary: 15324 bytes retained by leaking objects
D/LeakCanary: Signature: 3074046c89ba82b393e6e7ba1f02c8a330683dbd
D/LeakCanary: โ”ฌโ”€โ”€โ”€
D/LeakCanary: โ”‚ GC Root: Input or output parameters in native code
D/LeakCanary: โ”‚
D/LeakCanary: โ”œโ”€ dalvik.system.PathClassLoader instance
D/LeakCanary: โ”‚    Leaking: NO (SnapshotKtโ†“ is not leaking and A ClassLoader is never leaking)
D/LeakCanary: โ”‚    โ†“ ClassLoader.runtimeInternalObjects
D/LeakCanary: โ”œโ”€ java.lang.Object[] array
D/LeakCanary: โ”‚    Leaking: NO (SnapshotKtโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ Object[6667]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.snapshots.SnapshotKt class
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking and a class is never leaking)
D/LeakCanary: โ”‚    โ†“ static SnapshotKt.applyObservers
D/LeakCanary: โ”œโ”€ java.util.ArrayList instance
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ ArrayList[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.Recomposer$recompositionRunner$2$unregisterApplyObserver$1 instance
D/LeakCanary: โ”‚    Leaking: NO (Recomposerโ†“ is not leaking)
D/LeakCanary: โ”‚    Anonymous subclass of kotlin.jvm.internal.Lambda
D/LeakCanary: โ”‚    โ†“ Recomposer$recompositionRunner$2$unregisterApplyObserver$1.this$0
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.Recomposer instance
D/LeakCanary: โ”‚    Leaking: NO (CompositionImplโ†“ is not leaking and Recomposer is in state Idle)
D/LeakCanary: โ”‚    โ†“ Recomposer.knownCompositions
D/LeakCanary: โ”œโ”€ java.util.ArrayList instance
D/LeakCanary: โ”‚    Leaking: NO (CompositionImplโ†“ is not leaking)
D/LeakCanary: โ”‚    โ†“ ArrayList[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.CompositionImpl instance
D/LeakCanary: โ”‚    Leaking: NO (Composition not disposed)
D/LeakCanary: โ”‚    โ†“ CompositionImpl.parent
D/LeakCanary: โ”‚                      ~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.ComposerImpl$CompositionContextImpl instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 190 B in 6 objects
D/LeakCanary: โ”‚    โ†“ ComposerImpl$CompositionContextImpl.this$0
D/LeakCanary: โ”‚                                          ~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.ComposerImpl instance
D/LeakCanary: โ”‚    Leaking: UNKNOWN
D/LeakCanary: โ”‚    Retaining 17.2 kB in 54 objects
D/LeakCanary: โ”‚    โ†“ ComposerImpl.composition
D/LeakCanary: โ”‚                   ~~~~~~~~~~~
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.CompositionImpl instance
D/LeakCanary: โ”‚    Leaking: YES (Composition disposed)
D/LeakCanary: โ”‚    Retaining 15.3 kB in 388 objects
D/LeakCanary: โ”‚    โ†“ CompositionImpl.observations
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.collection.IdentityScopeMap instance
D/LeakCanary: โ”‚    Leaking: YES (CompositionImplโ†‘ is leaking)
D/LeakCanary: โ”‚    Retaining 13.2 kB in 356 objects
D/LeakCanary: โ”‚    โ†“ IdentityScopeMap.scopeSets
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.collection.IdentityArraySet[] array
D/LeakCanary: โ”‚    Leaking: YES (CompositionImplโ†‘ is leaking)
D/LeakCanary: โ”‚    Retaining 10.5 kB in 252 objects
D/LeakCanary: โ”‚    โ†“ IdentityArraySet[4]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.collection.IdentityArraySet instance
D/LeakCanary: โ”‚    Leaking: YES (CompositionImplโ†‘ is leaking)
D/LeakCanary: โ”‚    Retaining 148 B in 5 objects
D/LeakCanary: โ”‚    โ†“ IdentityArraySet.values
D/LeakCanary: โ”œโ”€ java.lang.Object[] array
D/LeakCanary: โ”‚    Leaking: YES (CompositionImplโ†‘ is leaking)
D/LeakCanary: โ”‚    Retaining 132 B in 4 objects
D/LeakCanary: โ”‚    โ†“ Object[0]
D/LeakCanary: โ”œโ”€ androidx.compose.runtime.RecomposeScopeImpl instance
D/LeakCanary: โ”‚    Leaking: YES (CompositionImplโ†‘ is leaking)
D/LeakCanary: โ”‚    Retaining 68 B in 3 objects
D/LeakCanary: โ”‚    โ†“ RecomposeScopeImpl.block
D/LeakCanary: โ”œโ”€ androidx.compose.ui.platform.ComposeView$Content$1 instance
D/LeakCanary: โ”‚    Leaking: YES (CompositionImplโ†‘ is leaking)
D/LeakCanary: โ”‚    Retaining 20 B in 1 objects
D/LeakCanary: โ”‚    Anonymous subclass of kotlin.jvm.internal.Lambda
D/LeakCanary: โ”‚    โ†“ ComposeView$Content$1.$tmp1_rcvr
D/LeakCanary: โ•ฐโ†’ androidx.compose.ui.platform.ComposeView instance
D/LeakCanary: โ€‹     Leaking: YES (ObjectWatcher was watching this because dev.yashgarg.qbit.ui.torrent.tabs.TorrentFilesFragment
D/LeakCanary: โ€‹     received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
D/LeakCanary: โ€‹     Retaining 2.4 kB in 39 objects
D/LeakCanary: โ€‹     key = d15cfab8-cfee-4de6-82f2-9e5e4d4f6d02
D/LeakCanary: โ€‹     watchDurationMillis = 5489
D/LeakCanary: โ€‹     retainedDurationMillis = 488
D/LeakCanary: โ€‹     View not part of a window view hierarchy
D/LeakCanary: โ€‹     View.mAttachInfo is null (view detached)
D/LeakCanary: โ€‹     View.mID = R.id.filesComposeView
D/LeakCanary: โ€‹     View.mWindowAttachCount = 1
D/LeakCanary: โ€‹     mContext instance of dev.yashgarg.qbit.MainActivity with mDestroyed = false
D/LeakCanary: ====================================

[FEATURE REQUEST] Add interface for qbittorrent search

Is your feature request related to a problem? Please describe.
I am annoyed when I have to sift through many websites to get a torrent link I can then paste into qBittorrent.

Describe the solution you'd like
The official client implements a search api which allows searching through specific trackers (?) which streamlines the process immensely.

This app could provide a UI for interfacing with this api to allow the easy addition of torrents without leaving the app.

Additional context
I'd like to try my hand at implementing this feature.

[BUG] Failed! z9.a error in 0.2.0

Describe the bug
After updating the app to v0.2.0, opening the app results in a "Failed! z9.a" error and the torrents don't load. Clearing app data and re adding the server also produces the same error and the server can't be added. This bug is not present in the previous version.

To Reproduce
Steps to reproduce the behavior:

  1. Add a server
  2. Enter details
  3. Press Save and test config

Expected behavior
The app loads the torrents correctly as in previous versions.

Smartphone (please complete the following information):

  • Device: POCO F1
  • OS: Android 13
  • App Version V0.2.0

Additional context
Add any other context about the problem here.

[BUG] After upgrading to 0.1.8fce71 I get "403 forbidden"

After updating to the version released today, I got 403 forbidden when opening the app.

I had to clear all data and cache in order to even use it and relogin because there is no way to access the settings without doing that.

Nothing in my app config changed at all. So the app really should have worked fine after updating.

[BUG] Using autofill in the "Add Server" menu puts username in port field

Describe the bug
Clicking add server and using autofill to fill in the login credentials will fill in the username and password correctly but it will also put the username in the Port field.

To Reproduce
Steps to reproduce the behavior:

  1. Click on Add Server
  2. Use autofill to fill in your username and password
  3. Username will be put into Port field as well

Expected behavior
It should only fill in the username and password

Smartphone (please complete the following information):

  • Device: Nothing Phone 1
  • OS: Android 13
  • App Version: 0.2.5

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.