From 616bf5d1339fe6e62083901c62b4f1dce4b6c53f Mon Sep 17 00:00:00 2001 From: xdk78 Date: Sun, 18 Feb 2018 17:36:01 +0100 Subject: [PATCH] [W.I.P] Rewrite app to MVP with Dependency Injection part 1 #22 --- .travis.yml | 5 +- app/build.gradle | 20 +- app/src/main/AndroidManifest.xml | 89 +++-- .../java/cat/pantsu/nyaapantsu/MainApp.kt | 14 + .../nyaapantsu/adapter/TorrentListAdapter.kt | 40 +-- .../nyaapantsu/adapter/ViewPagerAdapter.kt | 29 -- .../cat/pantsu/nyaapantsu/api/ApiConstants.kt | 5 + .../nyaapantsu/api/torrent/TorrentApi.kt | 11 + .../api/torrent/TorrentRepository.kt | 18 + .../api/torrent/TorrentRetrofitApi.kt | 31 ++ .../nyaapantsu/application/Initializer.kt | 51 --- .../pantsu/nyaapantsu/base/BaseActivity.kt | 6 + .../pantsu/nyaapantsu/base/BaseFragment.kt | 6 + .../pantsu/nyaapantsu/base/BasePresenter.kt | 21 ++ .../cat/pantsu/nyaapantsu/base/BaseView.kt | 6 + .../nyaapantsu/base/MainAppSchedulers.kt | 15 + .../cat/pantsu/nyaapantsu/base/Schedulers.kt | 9 + .../nyaapantsu/di/component/MainComponent.kt | 23 ++ .../nyaapantsu/di/module/ActivityBuilder.kt | 23 ++ .../pantsu/nyaapantsu/di/module/AppModule.kt | 13 + .../di/module/about/AboutFragmentProvider.kt | 13 + .../nyaapantsu/di/module/api/ApiModule.kt | 44 +++ .../torrent/TorrentListFragmentProvider.kt | 13 + .../di/module/torrent/TorrentListModule.kt | 15 + .../pantsu/nyaapantsu/helper/ImageGetter.kt | 53 --- .../cat/pantsu/nyaapantsu/helper/Playlist.kt | 38 -- .../pantsu/nyaapantsu/helper/ProfileHelper.kt | 55 --- .../pantsu/nyaapantsu/helper/QueryHelper.kt | 72 ---- .../nyaapantsu/helper/TorrentStreamHelper.kt | 6 +- .../cat/pantsu/nyaapantsu/model/FlagChip.kt | 30 -- .../pantsu/nyaapantsu/model/ProfileQuery.kt | 42 --- .../java/cat/pantsu/nyaapantsu/model/Query.kt | 93 ----- .../pantsu/nyaapantsu/model/RecentlyPlayed.kt | 10 - .../cat/pantsu/nyaapantsu/model/Torrent.kt | 86 ----- .../java/cat/pantsu/nyaapantsu/model/Utils.kt | 10 - .../nyaapantsu/mvp/model/TorrentListModel.kt | 120 +++++++ .../mvp/model/TorrentListResponse.kt | 4 + .../{model/User.kt => mvp/model/UserModel.kt} | 10 +- .../mvp/presenter/TorrentListPresenter.kt | 22 ++ .../nyaapantsu/mvp/view/TorrentListView.kt | 11 + .../nyaapantsu/ui/activity/BaseActivity.kt | 42 --- .../nyaapantsu/ui/activity/HomeActivity.kt | 173 +-------- .../nyaapantsu/ui/activity/LoginActivity.kt | 321 ----------------- .../nyaapantsu/ui/activity/ProfileActivity.kt | 25 -- .../ui/activity/SettingsActivity.kt | 30 -- .../nyaapantsu/ui/activity/SplashActivity.kt | 10 +- .../nyaapantsu/ui/activity/TorrentActivity.kt | 55 --- .../nyaapantsu/ui/fragment/AboutFragment.kt | 50 +-- .../nyaapantsu/ui/fragment/ProfileFragment.kt | 105 ------ .../nyaapantsu/ui/fragment/RecentFragment.kt | 108 ------ .../nyaapantsu/ui/fragment/SearchFragment.kt | 138 -------- .../ui/fragment/SettingsFragment.kt | 17 - .../ui/fragment/TorrentListFragment.kt | 221 +++--------- .../ui/fragment/TorrentViewFragment.kt | 310 ---------------- .../nyaapantsu/ui/fragment/UploadFragment.kt | 330 ------------------ .../java/cat/pantsu/nyaapantsu/util/Utils.kt | 20 +- 56 files changed, 619 insertions(+), 2518 deletions(-) create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/MainApp.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/adapter/ViewPagerAdapter.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/api/ApiConstants.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentApi.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRepository.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRetrofitApi.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/application/Initializer.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/base/BaseActivity.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/base/BaseFragment.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/base/BasePresenter.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/base/BaseView.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/base/MainAppSchedulers.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/base/Schedulers.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/component/MainComponent.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/module/ActivityBuilder.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/module/AppModule.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/module/about/AboutFragmentProvider.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/module/api/ApiModule.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListFragmentProvider.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListModule.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/helper/ImageGetter.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/helper/Playlist.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/helper/ProfileHelper.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/helper/QueryHelper.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/model/FlagChip.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/model/ProfileQuery.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/model/Query.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/model/RecentlyPlayed.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/model/Torrent.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/model/Utils.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListModel.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListResponse.kt rename app/src/main/java/cat/pantsu/nyaapantsu/{model/User.kt => mvp/model/UserModel.kt} (71%) create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/mvp/presenter/TorrentListPresenter.kt create mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/mvp/view/TorrentListView.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/BaseActivity.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/LoginActivity.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/ProfileActivity.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/SettingsActivity.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/TorrentActivity.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/fragment/ProfileFragment.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/fragment/RecentFragment.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/fragment/SearchFragment.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/fragment/SettingsFragment.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/fragment/TorrentViewFragment.kt delete mode 100644 app/src/main/java/cat/pantsu/nyaapantsu/ui/fragment/UploadFragment.kt diff --git a/.travis.yml b/.travis.yml index 99f974b..dc446c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,9 +14,6 @@ cache: env: global: - - ANDROID_API=27 - - EMULATOR_API=21 - - ANDROID_BUILD_TOOLS=27.0.2 - secure: "Q69n6Io0RWFsXJvWjPPwkjXYftSKFSDSPVRwC/6nJuB4PquQ3MV2A5PuyAzWIgNXYMbOcNC/N5MNyPbm6MURot2U0yCYPg1L82ShVeEqSBpqTia+AZgzDh1ePeJY7BXtesnJ1c1XkumyhyLAf11m0YEyeP1/Lg26cdOhOavtK8nriis0a0Hycar7V1S/oG0s/7HKzFWv9eoNyD3dPm8WfJNoz2nYzykz+3sS8dec9nXJVj6eUu25rRKpePZ7J/jZqhsKSF8j4cecDe4ZHKKh3QjyNWy/TbtNyT4FnkJjTJky11mlq0//wt1JMU3kBjUjnrgs/iGMW3N1ANo36XhkuwMrECC9YvP0p+MmhHL8ApMzPOh091sEPzQLZgxo4Y5EI5flG8mPRNmmRK/3FfmYtyvOdbFT7d7JgPJksVgPggZ+5+iSfaTzRmxKPZLmnpamFe9HbbFPmaW6Q1ag72caX/IC2BmxwEjoHP261e3ruDVP2uTXWTKQAiI3FyVAhtaB3LiXUxF/pQGJ4Kq1ZjmvF28O5VZXIQMdIfg3Lj4zxEMCBuZpRfKebuhZe9lVj/lLIRMr0ahTLBA4r6ub3tPlfTfjrsxbIfTn8EqhLzDX7n0V2AC4vVj7iyUG5q8ma9tkZGgJcZGuZiG2jtGDkwmYQ37c4p5VJP7Ozy1yTtneCTQ=" - secure: "NwZUziNYooHs0wO9z+Nqw1UgF4XARVWZOV+PGxPp2LjqCkONFI38GWGS/JaeX/Rvf0p/TWBlyphaMBH5iTUem8EWR/AqvAtgNYy2H3BQJxhwgldTpDoQvBnv7j1B1jwd81Mif4s8SRBrfHm1nPKWidZQCJ/ASQVyaauiQonPRiYfc8qG3NeX6mKNke8mAwf84oF2Fv2WQD3asIqxH4b0L3icGSWwr5Gh7mRTjvyM78CdKDBggUNNKowP+9CXV/JAyKH+EHlKy5vsr+VWlFy1K4RX7RW7UqlHF69JM39lc+hNzua5j+OtwSYlEwBLc6xSBgu8Gnj2iHWg8rlZ5u4HdAPG2WnKlu39yU2t+xYXkAzgmI+pRgidNZi+D4TMdpSyKCsz7r0WjmwKRlzMzW+Gm+WA8Op2WJiOWW5aBYINPA157yLyTmkQgSkYh3UtonjMgsXavUC/ffCdaEEReypEccQaqjQORk7ol292KyYcQnTG0UaLK6m4jjcUFOrhcS/mW5TptnqEFDTl/hY3NBdgWyjrmj/gxK+CwXc/lwwn7zBv530KuXHgI8sAA6a7zJIIhidwT+PzvLkMKV5GQVhpsIArMdMawiZG6BU/SrEqn87Kb572+EIoIticV17dg/8Pv37j8gxkFKhUEK2UtQnKqbWHAI6vysEGjy8O1VZ7tfk=" @@ -30,7 +27,7 @@ before_install: - ./gradlew dependencies || true before_script: -- (while sleep 3; do echo "y"; done) | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" "extras;android;m2repository" "extras;google;m2repository" "build-tools;$ANDROID_BUILD_TOOLS" "platforms;android-$ANDROID_API" +- (while sleep 3; do echo "y"; done) | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" "extras;android;m2repository" "extras;google;m2repository" "build-tools;27.0.2" "platforms;android-27" script: - "./gradlew clean build connectedCheck -PdisablePreDex --stacktrace" diff --git a/app/build.gradle b/app/build.gradle index 48ac320..cd6b6c3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,16 +40,30 @@ dependencies { implementation "org.jetbrains.anko:anko:$anko_version" // networking - implementation 'com.github.kittinunf.result:result:1.1.0' - implementation 'com.github.kittinunf.fuel:fuel-android:1.9.0' implementation 'net.gotev:uploadservice:3.2.4' implementation 'net.gotev:uploadservice-okhttp:3.2.4' implementation "com.github.se-bastiaan:TorrentStream-Android:2.3.0" implementation "com.github.se-bastiaan:TorrentStreamServer-Android:1.0.0" + // retrofit + implementation 'com.squareup.retrofit2:retrofit:2.3.0' + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + + // rx + implementation 'io.reactivex.rxjava2:rxjava:2.1.9' + implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0' + implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' + implementation 'com.google.code.gson:gson:2.8.2' + + // dagger 2 + implementation "com.google.dagger:dagger:2.14.1" + kapt "com.google.dagger:dagger-compiler:2.14.1" + kapt "com.google.dagger:dagger-android-processor:2.14.1" + implementation "com.google.dagger:dagger-android:2.14.1" + implementation "com.google.dagger:dagger-android-support:2.14.1" // image - implementation 'com.facebook.fresco:fresco:1.3.0' implementation 'com.github.bumptech.glide:glide:4.6.1' kapt 'com.github.bumptech.glide:compiler:4.6.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d0b4094..4002c4e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,8 +13,7 @@ - - - + + + + + - + - - - - - - - + + + + + + + + + + + + + + - - - + + + - - - + + + + + + + + + - + + + + + - + - + + + + - + \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/MainApp.kt b/app/src/main/java/cat/pantsu/nyaapantsu/MainApp.kt new file mode 100644 index 0000000..9a60541 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/MainApp.kt @@ -0,0 +1,14 @@ +package cat.pantsu.nyaapantsu + + +import cat.pantsu.nyaapantsu.di.component.DaggerMainComponent +import dagger.android.AndroidInjector +import dagger.android.support.DaggerApplication + + +class MainApp : DaggerApplication() { + + override fun applicationInjector(): AndroidInjector = + DaggerMainComponent.builder().create(this) + +} diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/adapter/TorrentListAdapter.kt b/app/src/main/java/cat/pantsu/nyaapantsu/adapter/TorrentListAdapter.kt index 9f283e0..86fe68d 100644 --- a/app/src/main/java/cat/pantsu/nyaapantsu/adapter/TorrentListAdapter.kt +++ b/app/src/main/java/cat/pantsu/nyaapantsu/adapter/TorrentListAdapter.kt @@ -12,23 +12,21 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import cat.pantsu.nyaapantsu.R -import cat.pantsu.nyaapantsu.model.Torrent -import cat.pantsu.nyaapantsu.ui.activity.TorrentActivity +import cat.pantsu.nyaapantsu.mvp.model.TorrentListModel +import cat.pantsu.nyaapantsu.mvp.model.TorrentListResponse import cat.pantsu.nyaapantsu.util.Utils import kotlinx.android.synthetic.main.torrent_item.view.* -import org.jetbrains.anko.startActivity import org.jetbrains.anko.toast -import java.util.* -class TorrentListAdapter(var activity: Activity, var torrentList: LinkedList) : RecyclerView.Adapter() { +class TorrentListAdapter(var context: Context, private var torrentList: TorrentListResponse) : RecyclerView.Adapter() { @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: TorrentListViewHolder?, position: Int) { if (holder == null) return - val item = torrentList[position] + val item = torrentList.torrents[position] holder.itemView.name.text = item.name - holder.itemView.uploader.text = item.username + holder.itemView.uploader.text = item.uploaderName holder.itemView.stats.text = "S: " + item.seeders + " L: " + item.leechers holder.itemView.date.text = item.date @@ -44,44 +42,44 @@ class TorrentListAdapter(var activity: Activity, var torrentList: LinkedList when { - !TextUtils.isEmpty(item.download) -> Utils.download(activity, holder.itemView, item.download, item.name) - else -> activity.toast(activity.getString(R.string.torrent_not_available)) + !TextUtils.isEmpty(item.torrent) -> Utils.download(context as Activity, holder.itemView, item.torrent, item.name) + else -> context.toast(context.getString(R.string.torrent_not_available)) } } holder.itemView.copy.setOnClickListener { _ -> - val clipboard = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clipData = ClipData.newPlainText(item.name, item.magnet) clipboard.primaryClip = clipData - activity.toast(activity.getString(R.string.magnet_copied)) + context.toast(context.getString(R.string.magnet_copied)) } - holder.itemView.cardview.setOnClickListener { _ -> - activity.startActivity("position" to position, "type" to "search") - } +// holder.itemView.cardview.setOnClickListener { _ -> +// activity.startActivity("position" to position, "type" to "search") +// } when (item.status) { 2 -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - holder.itemView.cardview.setCardBackgroundColor(activity.resources.getColorStateList(R.color.colorRemake, null)) + holder.itemView.cardview.setCardBackgroundColor(context.resources.getColorStateList(R.color.colorRemake, null)) } else { - holder.itemView.cardview.setCardBackgroundColor(activity.resources.getColorStateList(R.color.colorRemake)) + holder.itemView.cardview.setCardBackgroundColor(context.resources.getColorStateList(R.color.colorRemake)) } } 3 -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - holder.itemView.cardview.setCardBackgroundColor(activity.resources.getColorStateList(R.color.colorTrusted, null)) + holder.itemView.cardview.setCardBackgroundColor(context.resources.getColorStateList(R.color.colorTrusted, null)) } else { - holder.itemView.cardview.setCardBackgroundColor(activity.resources.getColorStateList(R.color.colorTrusted)) + holder.itemView.cardview.setCardBackgroundColor(context.resources.getColorStateList(R.color.colorTrusted)) } } 4 -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - holder.itemView.cardview.setCardBackgroundColor(activity.resources.getColorStateList(R.color.colorAPlus, null)) + holder.itemView.cardview.setCardBackgroundColor(context.resources.getColorStateList(R.color.colorAPlus, null)) } else { - holder.itemView.cardview.setCardBackgroundColor(activity.resources.getColorStateList(R.color.colorAPlus)) + holder.itemView.cardview.setCardBackgroundColor(context.resources.getColorStateList(R.color.colorAPlus)) } } } @@ -98,7 +96,7 @@ class TorrentListAdapter(var activity: Activity, var torrentList: LinkedList) : FragmentStatePagerAdapter(fm) { - private var fragments: LinkedList = LinkedList() - - init { - fragments = list - } - - override fun getItem(position: Int): Fragment { - val torrent = fragments[position] - return TorrentViewFragment.newInstance(torrent.id) - } - - override fun getCount(): Int { - return fragments.size - } - -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/api/ApiConstants.kt b/app/src/main/java/cat/pantsu/nyaapantsu/api/ApiConstants.kt new file mode 100644 index 0000000..661596f --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/api/ApiConstants.kt @@ -0,0 +1,5 @@ +package cat.pantsu.nyaapantsu.api + +object ApiConstants { + const val BASE_URL = "https://nyaa.pantsu.cat/api/" +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentApi.kt b/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentApi.kt new file mode 100644 index 0000000..1a1b8e4 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentApi.kt @@ -0,0 +1,11 @@ +package cat.pantsu.nyaapantsu.api.torrent + +import cat.pantsu.nyaapantsu.mvp.model.TorrentListModel +import cat.pantsu.nyaapantsu.mvp.model.TorrentListResponse +import io.reactivex.Single + + +interface TorrentApi { + fun getTorrentList(): Single> + +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRepository.kt b/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRepository.kt new file mode 100644 index 0000000..40aeeb6 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRepository.kt @@ -0,0 +1,18 @@ +package cat.pantsu.nyaapantsu.api.torrent + +import cat.pantsu.nyaapantsu.mvp.model.TorrentListModel +import cat.pantsu.nyaapantsu.mvp.model.TorrentListResponse +import io.reactivex.Single +import retrofit2.Retrofit + + +class TorrentRepository(val retrofit: Retrofit) : TorrentApi { + private val mainApi by lazy { retrofit.create(TorrentRetrofitApi::class.java) } + + override fun getTorrentList(): Single> = mainApi.getTorrentList( + null, null, null, "20", + null, null, null, + null, null, null, + null, null, null, + null, null, null, null) +} diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRetrofitApi.kt b/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRetrofitApi.kt new file mode 100644 index 0000000..3c8c884 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/api/torrent/TorrentRetrofitApi.kt @@ -0,0 +1,31 @@ +package cat.pantsu.nyaapantsu.api.torrent + +import cat.pantsu.nyaapantsu.mvp.model.TorrentListModel +import cat.pantsu.nyaapantsu.mvp.model.TorrentListResponse +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + + +interface TorrentRetrofitApi { + + @GET("search") + fun getTorrentList(@Query("c") c: List?, + @Query("q") q: String?, + @Query("page") page: Int?, + @Query("limit") limit: String?, + @Query("userID") userID: String?, + @Query("fromID") fromID: String?, + @Query("s") s: String?, + @Query("maxage") maxage: String?, + @Query("toDate") toDate: String?, + @Query("fromDate") fromDate: String?, + @Query("dateType") dateType: String?, + @Query("minSize") minSize: String?, + @Query("maxSize") maxSize: String?, + @Query("sizeType") sizeType: String?, + @Query("sort") sort: String?, + @Query("order") order: Boolean?, + @Query("lang") lang: List?): Single> + +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/application/Initializer.kt b/app/src/main/java/cat/pantsu/nyaapantsu/application/Initializer.kt deleted file mode 100644 index ace16d2..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/application/Initializer.kt +++ /dev/null @@ -1,51 +0,0 @@ -package cat.pantsu.nyaapantsu.application - -import android.app.Application -import android.preference.PreferenceManager -import cat.pantsu.nyaapantsu.BuildConfig -import cat.pantsu.nyaapantsu.model.User -import cat.pantsu.nyaapantsu.model.Utils -import com.facebook.drawee.backends.pipeline.Fresco -import com.github.kittinunf.fuel.core.FuelManager -import net.gotev.uploadservice.UploadService -import net.gotev.uploadservice.okhttp.OkHttpStack - -/** - * Created by akuma06 on 24/06/2017. - */ -class Initializer : Application() { - - override fun onCreate() { - super.onCreate() - Fresco.initialize(this) - // setup the broadcast action namespace string which will - // be used to notify upload status. - // Gradle automatically generates proper variable as below. - UploadService.NAMESPACE = BuildConfig.APPLICATION_ID - // Or, you can define it manually. - UploadService.NAMESPACE = "cat.pantsu.nyaapantsu" - UploadService.HTTP_STACK = OkHttpStack() // a new client will be automatically created - - // Fuel Manager init - FuelManager.instance.basePath = "https://nyaa.pantsu.cat/api" - - val keepLogin = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("keep_login_switch", true) - if (!keepLogin) { - User.id =0 - User.name="" - User.token="" - User.status=0 - User.md5 = "" - } - - val doubleBackToExit = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("doubleBackToExit", true) - if (doubleBackToExit) { - Utils.doubleBackToExit = true - } - else if(!doubleBackToExit){ - Utils.doubleBackToExit = false - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseActivity.kt b/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseActivity.kt new file mode 100644 index 0000000..4c4852b --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseActivity.kt @@ -0,0 +1,6 @@ +package cat.pantsu.nyaapantsu.base + + +import dagger.android.support.DaggerAppCompatActivity + +abstract class BaseActivity : DaggerAppCompatActivity() diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseFragment.kt b/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseFragment.kt new file mode 100644 index 0000000..70805ef --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseFragment.kt @@ -0,0 +1,6 @@ +package cat.pantsu.nyaapantsu.base + +import dagger.android.support.DaggerFragment + + +abstract class BaseFragment : DaggerFragment() diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/base/BasePresenter.kt b/app/src/main/java/cat/pantsu/nyaapantsu/base/BasePresenter.kt new file mode 100644 index 0000000..309778f --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/base/BasePresenter.kt @@ -0,0 +1,21 @@ +package cat.pantsu.nyaapantsu.base + +import io.reactivex.disposables.CompositeDisposable + +open class BasePresenter { + var compositeObservable = CompositeDisposable() + var view: T? = null + val isSubscribed: Boolean + get() = view != null + + fun subscribe(view: T) { + compositeObservable.dispose() + compositeObservable = CompositeDisposable() + this.view = view + } + + fun unsubscribe() { + view = null + compositeObservable.dispose() + } +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseView.kt b/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseView.kt new file mode 100644 index 0000000..8d9a669 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/base/BaseView.kt @@ -0,0 +1,6 @@ +package cat.pantsu.nyaapantsu.base + + +interface BaseView { + fun onError(e: Throwable?) +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/base/MainAppSchedulers.kt b/app/src/main/java/cat/pantsu/nyaapantsu/base/MainAppSchedulers.kt new file mode 100644 index 0000000..8171173 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/base/MainAppSchedulers.kt @@ -0,0 +1,15 @@ +package cat.pantsu.nyaapantsu.base + +import io.reactivex.Scheduler +import io.reactivex.android.schedulers.AndroidSchedulers + + +class MainAppSchedulers : Schedulers { + override fun mainThread(): Scheduler { + return AndroidSchedulers.mainThread() + } + + override fun backgroundThread(): Scheduler { + return io.reactivex.schedulers.Schedulers.io() + } +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/base/Schedulers.kt b/app/src/main/java/cat/pantsu/nyaapantsu/base/Schedulers.kt new file mode 100644 index 0000000..af6d824 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/base/Schedulers.kt @@ -0,0 +1,9 @@ +package cat.pantsu.nyaapantsu.base + +import io.reactivex.Scheduler + + +interface Schedulers { + fun mainThread(): Scheduler + fun backgroundThread(): Scheduler +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/component/MainComponent.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/component/MainComponent.kt new file mode 100644 index 0000000..9238138 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/component/MainComponent.kt @@ -0,0 +1,23 @@ +package cat.pantsu.nyaapantsu.di.component + +import cat.pantsu.nyaapantsu.MainApp +import cat.pantsu.nyaapantsu.di.module.ActivityBuilder +import cat.pantsu.nyaapantsu.di.module.AppModule +import cat.pantsu.nyaapantsu.di.module.api.ApiModule +import dagger.Component +import dagger.android.AndroidInjector +import dagger.android.support.AndroidSupportInjectionModule +import javax.inject.Singleton + + +@Singleton +@Component(modules = [ + AndroidSupportInjectionModule::class, + AppModule::class, + ActivityBuilder::class, + ApiModule::class]) + +internal interface MainComponent : AndroidInjector { + @Component.Builder + abstract class Builder : AndroidInjector.Builder() +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/module/ActivityBuilder.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/ActivityBuilder.kt new file mode 100644 index 0000000..7477631 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/ActivityBuilder.kt @@ -0,0 +1,23 @@ +package cat.pantsu.nyaapantsu.di.module + +import cat.pantsu.nyaapantsu.di.module.about.AboutFragmentProvider +import cat.pantsu.nyaapantsu.di.module.torrent.TorrentListFragmentProvider +import cat.pantsu.nyaapantsu.di.module.torrent.TorrentListModule +import cat.pantsu.nyaapantsu.ui.activity.HomeActivity +import cat.pantsu.nyaapantsu.ui.activity.SplashActivity +import dagger.Module +import dagger.android.ContributesAndroidInjector + + +@Module +abstract class ActivityBuilder { + + @ContributesAndroidInjector(modules = [ + TorrentListModule::class, TorrentListFragmentProvider::class, + AboutFragmentProvider::class + ]) + abstract fun bindHomeActivity(): HomeActivity + + @ContributesAndroidInjector() + abstract fun bindSplashActivity(): SplashActivity +} diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/module/AppModule.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/AppModule.kt new file mode 100644 index 0000000..b61c365 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/AppModule.kt @@ -0,0 +1,13 @@ +package cat.pantsu.nyaapantsu.di.module + +import android.content.Context +import cat.pantsu.nyaapantsu.MainApp +import dagger.Binds +import dagger.Module + + +@Module +abstract class AppModule { + @Binds + abstract fun provideContext(application: MainApp): Context +} diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/module/about/AboutFragmentProvider.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/about/AboutFragmentProvider.kt new file mode 100644 index 0000000..3814d30 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/about/AboutFragmentProvider.kt @@ -0,0 +1,13 @@ +package cat.pantsu.nyaapantsu.di.module.about + +import cat.pantsu.nyaapantsu.ui.fragment.AboutFragment +import dagger.Module +import dagger.android.ContributesAndroidInjector + + +@Module +abstract class AboutFragmentProvider { + @ContributesAndroidInjector() + abstract fun provideAboutFragment(): AboutFragment + +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/module/api/ApiModule.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/api/ApiModule.kt new file mode 100644 index 0000000..ef3fbef --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/api/ApiModule.kt @@ -0,0 +1,44 @@ +package cat.pantsu.nyaapantsu.di.module.api + +import cat.pantsu.nyaapantsu.api.ApiConstants +import cat.pantsu.nyaapantsu.api.torrent.TorrentApi +import cat.pantsu.nyaapantsu.api.torrent.TorrentRepository +import cat.pantsu.nyaapantsu.base.MainAppSchedulers +import cat.pantsu.nyaapantsu.base.Schedulers +import dagger.Module +import dagger.Provides +import retrofit2.Retrofit +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory +import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Singleton + + +@Module +class ApiModule { + + @Provides + fun provideTorrentApi(retrofit: Retrofit): TorrentApi = TorrentRepository(retrofit) + + @Provides + @Singleton + fun provideRetrofit( + rxJavaCallAdapterFactory: RxJava2CallAdapterFactory, + gsonConverterFactory: GsonConverterFactory): Retrofit { + return Retrofit.Builder() + .baseUrl(ApiConstants.BASE_URL) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .addConverterFactory(gsonConverterFactory) + .build() + } + + @Provides + @Singleton + fun provideGsonConverterFactory(): GsonConverterFactory = GsonConverterFactory.create() + + @Provides + @Singleton + fun provideRxJavaCallAdapter(): RxJava2CallAdapterFactory = RxJava2CallAdapterFactory.create() + + @Provides + fun provideMainAppSchedulers(): Schedulers = MainAppSchedulers() +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListFragmentProvider.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListFragmentProvider.kt new file mode 100644 index 0000000..c3bc236 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListFragmentProvider.kt @@ -0,0 +1,13 @@ +package cat.pantsu.nyaapantsu.di.module.torrent + +import cat.pantsu.nyaapantsu.ui.fragment.TorrentListFragment +import dagger.Module +import dagger.android.ContributesAndroidInjector + + +@Module +abstract class TorrentListFragmentProvider { + @ContributesAndroidInjector(modules = [TorrentListModule::class]) + abstract fun provideTorrentListFragment(): TorrentListFragment + +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListModule.kt b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListModule.kt new file mode 100644 index 0000000..f569a88 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/di/module/torrent/TorrentListModule.kt @@ -0,0 +1,15 @@ +package cat.pantsu.nyaapantsu.di.module.torrent + +import cat.pantsu.nyaapantsu.api.torrent.TorrentApi +import cat.pantsu.nyaapantsu.base.Schedulers +import cat.pantsu.nyaapantsu.mvp.presenter.TorrentListPresenter +import dagger.Module +import dagger.Provides + + +@Module +class TorrentListModule { + @Provides + fun provideTorrentListPresenter(schedulers: Schedulers, torrentApi: TorrentApi) = TorrentListPresenter(schedulers, torrentApi) + +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/helper/ImageGetter.kt b/app/src/main/java/cat/pantsu/nyaapantsu/helper/ImageGetter.kt deleted file mode 100644 index 7c56e0b..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/helper/ImageGetter.kt +++ /dev/null @@ -1,53 +0,0 @@ -package cat.pantsu.nyaapantsu.helper - -import android.opengl.ETC1.getHeight -import android.opengl.ETC1.getWidth -import android.R.attr.x -import android.app.Activity -import android.content.Context -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable -import android.graphics.Bitmap -import android.graphics.Point -import android.widget.TextView -import android.graphics.drawable.LevelListDrawable -import android.os.AsyncTask -import android.util.Log -import com.bumptech.glide.Glide - - -/** - * Created by akuma06 on 13/07/2017. - */ -class ImageGetterAsyncTask(private val context: Context, private val source: String, private val levelListDrawable: LevelListDrawable) : AsyncTask() { - private var t: TextView? = null - val LOG_CAT = "TORRENT_IMG" - override fun doInBackground(vararg params: TextView): Bitmap? { - t = params[0] - try { - Log.d(LOG_CAT, "Downloading the image from: " + source) - return Glide.with(context).asBitmap().load(source).submit().get() - } catch (e: Exception) { - return null - } - - } - - override fun onPostExecute(bitmap: Bitmap) { - try { - val d = BitmapDrawable(context.getResources(), bitmap) - val size = Point() - (context as Activity).windowManager.defaultDisplay.getSize(size) - // Lets calculate the ratio according to the screen width in px - val multiplier = size.x / bitmap.width - Log.d(LOG_CAT, "multiplier: " + multiplier) - levelListDrawable.addLevel(1, 1, d) - // Set bounds width and height according to the bitmap resized size - levelListDrawable.setBounds(0, 0, bitmap.width * multiplier, bitmap.height * multiplier) - levelListDrawable.level = 1 - t!!.text = t!!.text // invalidate() doesn't work correctly... - } catch (e: Exception) { /* Like a null bitmap, etc. */ - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/helper/Playlist.kt b/app/src/main/java/cat/pantsu/nyaapantsu/helper/Playlist.kt deleted file mode 100644 index 5027263..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/helper/Playlist.kt +++ /dev/null @@ -1,38 +0,0 @@ -package cat.pantsu.nyaapantsu.helper - -import cat.pantsu.nyaapantsu.model.RecentlyPlayed -import cat.pantsu.nyaapantsu.model.Torrent -import org.json.JSONArray -import org.json.JSONException - -/** - * Created by akuma06 on 04/07/2017. - */ - -fun getRecentPlaylistAsArray(): JSONArray { - try { - val torrents = JSONArray(RecentlyPlayed.torrents) - return torrents - } catch (e: JSONException) { - e.printStackTrace() - } - return JSONArray() -} - -fun setRecentPlaylist(results: JSONArray) { - RecentlyPlayed.torrents = results.toString() -} - -fun addTorrentToRecentPlaylist(torrent: Torrent) { - val torrents = getRecentPlaylistAsArray() - val newTorrents = JSONArray() - for (i in 0..(torrents.length() - 1)) { - if (torrent.id == torrents.getJSONObject(i).getInt("id")) { - torrents.remove(i) - break - } - } - newTorrents.put(torrent.toJson()) - for (i in 0..(torrents.length() - 1)) newTorrents.put(torrents[i]) - setRecentPlaylist(newTorrents) -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/helper/ProfileHelper.kt b/app/src/main/java/cat/pantsu/nyaapantsu/helper/ProfileHelper.kt deleted file mode 100644 index d0232db..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/helper/ProfileHelper.kt +++ /dev/null @@ -1,55 +0,0 @@ -package cat.pantsu.nyaapantsu.helper - -import android.util.Log -import cat.pantsu.nyaapantsu.model.ProfileQuery -import com.github.kittinunf.fuel.android.core.Json -import com.github.kittinunf.fuel.android.extension.responseJson -import com.github.kittinunf.fuel.httpGet -import com.github.kittinunf.result.Result -import com.github.kittinunf.result.getAs -import org.json.JSONObject - - -class ProfileHelper private constructor(){ - var query: ProfileQuery ?= null - var profile: JSONObject = JSONObject() - - private object Holder { - val INSTANCE = ProfileHelper() - } - - companion object { - val instance: ProfileHelper by lazy { Holder.INSTANCE } - } - - - fun get(cb: Callback) { - ("/profile" + query.toString()).httpGet().responseJson { request, response, result -> - when (result) { - is Result.Failure -> { - Log.d("Network", "Big Fail :/") - Log.d("Network", response.toString()) - Log.d("Network", request.toString()) - cb.failure() - } - is Result.Success -> { - Log.d("Network", result.toString()) - Log.d("Network", request.toString()) - Log.d("Network", response.toString()) - - val json = result.getAs() - if (json !== null) { - val resultObj = json.obj() - profile = resultObj.optJSONObject("data") - } - cb.success(profile) - } - } - } - } - - interface Callback { - fun failure() - fun success(profile: JSONObject) - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/helper/QueryHelper.kt b/app/src/main/java/cat/pantsu/nyaapantsu/helper/QueryHelper.kt deleted file mode 100644 index e1c36df..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/helper/QueryHelper.kt +++ /dev/null @@ -1,72 +0,0 @@ -package cat.pantsu.nyaapantsu.helper - -import android.util.Log -import cat.pantsu.nyaapantsu.model.Query -import cat.pantsu.nyaapantsu.model.Torrent -import com.github.kittinunf.fuel.android.core.Json -import com.github.kittinunf.fuel.android.extension.responseJson -import com.github.kittinunf.fuel.httpGet -import com.github.kittinunf.result.Result -import com.github.kittinunf.result.getAs -import org.json.JSONArray -import java.util.* - -/** - * Created by ltype on 2017/7/9. - */ -class QueryHelper private constructor(){ - var query: Query ?= null - var torrents: JSONArray = JSONArray() - - private object Holder { - val INSTANCE = QueryHelper() - } - - companion object { - val instance: QueryHelper by lazy { Holder.INSTANCE } - fun parseTorrents(torrents: JSONArray): LinkedList { - val length = (torrents.length() - 1) - return (0..length).mapTo(LinkedList()) { Torrent(torrents.getJSONObject(it)) } - } - } - - - fun next(cb: Callback) { - search(cb) - } - - fun prev(cb: Callback) { - query!!.page += 1 - search(cb) - } - - fun search(cb: Callback) { - ("/search" + query.toString()).httpGet().responseJson { request, response, result -> - when (result) { - is Result.Failure -> { - Log.d("Network", "Big Fail :/") - Log.d("Network", response.toString()) - Log.d("Network", request.toString()) - cb.failure() - } - is Result.Success -> { - Log.d("Network", result.toString()) - Log.d("Network", request.toString()) - Log.d("Network", response.toString()) - - val json = result.getAs() - if (json !== null) { - val resultObj = json.obj() - torrents = resultObj.optJSONArray("torrentOlds") - } - cb.success(parseTorrents(torrents)) - } - } - } - } - - interface Callback { - fun failure() - fun success(torrentList: LinkedList) - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/helper/TorrentStreamHelper.kt b/app/src/main/java/cat/pantsu/nyaapantsu/helper/TorrentStreamHelper.kt index 834726d..1f4df34 100644 --- a/app/src/main/java/cat/pantsu/nyaapantsu/helper/TorrentStreamHelper.kt +++ b/app/src/main/java/cat/pantsu/nyaapantsu/helper/TorrentStreamHelper.kt @@ -1,14 +1,11 @@ package cat.pantsu.nyaapantsu.helper import android.os.Environment -import cat.pantsu.nyaapantsu.model.Torrent import com.github.se_bastiaan.torrentstream.TorrentOptions import com.github.se_bastiaan.torrentstream.TorrentStream import com.github.se_bastiaan.torrentstream.listeners.TorrentListener -/** - * Created by ltype on 2017/7/12. - */ + class TorrentStreamHelper private constructor() { private val stream: TorrentStream = newInstance() private var listener: TorrentListener ?= null @@ -18,7 +15,6 @@ class TorrentStreamHelper private constructor() { } companion object { - var torrent: Torrent? = null val instance: TorrentStreamHelper by lazy { Holder.INSTANCE } } diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/FlagChip.kt b/app/src/main/java/cat/pantsu/nyaapantsu/model/FlagChip.kt deleted file mode 100644 index c7b1835..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/FlagChip.kt +++ /dev/null @@ -1,30 +0,0 @@ -package cat.pantsu.nyaapantsu.model - -import android.graphics.drawable.Drawable -import android.net.Uri -import com.pchmn.materialchips.model.ChipInterface - -/** - * Created by akuma06 on 18/07/2017. - */ -class FlagChip(val id: String, val flag: Uri, val name: String, val code: String) : ChipInterface { - override fun getInfo(): String { - return code - } - - override fun getAvatarDrawable(): Drawable? { - return null - } - - override fun getLabel(): String { - return name - } - - override fun getId(): Any { - return id - } - - override fun getAvatarUri(): Uri { - return flag - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/ProfileQuery.kt b/app/src/main/java/cat/pantsu/nyaapantsu/model/ProfileQuery.kt deleted file mode 100644 index 58cf6e8..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/ProfileQuery.kt +++ /dev/null @@ -1,42 +0,0 @@ -package cat.pantsu.nyaapantsu.model - -import android.os.Parcel -import android.os.Parcelable - - - -class ProfileQuery : Parcelable { - - var userID = 0 - - constructor() - - constructor(parcel: Parcel) { - userID = parcel.readInt() - - } - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(userID) - - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ProfileQuery { - return ProfileQuery(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } - - override fun toString(): String { - return "?id=$userID" - } - -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/Query.kt b/app/src/main/java/cat/pantsu/nyaapantsu/model/Query.kt deleted file mode 100644 index 4092805..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/Query.kt +++ /dev/null @@ -1,93 +0,0 @@ -package cat.pantsu.nyaapantsu.model - -import android.os.Parcel -import android.os.Parcelable -import android.text.TextUtils - -/** - * Created by ltype on 2017/7/6. - * @see API - */ -class Query() : Parcelable { - var c = "" - var q = "" - var limit = "" - var userID = "" - var fromID = "" - var s = "" - var maxage = "" - var toDate = "" - var fromDate = "" - var dateType = "d" - var minSize = "" - var maxSize = "" - var sizeType = "" - var sort = "" - var order = "" - var lang = "" - var page = 1 - - override fun toString(): String { - return "?c=$c&q=$q&limit=$limit&userID=$userID&fromID=$fromID&s=$s&maxage=$maxage" + - "&toDate=$toDate&fromDate=$fromDate&dateType=$dateType&minSize=$minSize" + - "&maxSize=$maxSize&sizeType=$sizeType&sort=$sort&order=$order&lang=$lang&page=$page" - } - - fun isQueryable(): Boolean { - return !TextUtils.isEmpty(q) || !TextUtils.isEmpty(c) || !TextUtils.isEmpty(s) || !TextUtils.isEmpty(limit) - } - - constructor(parcel: Parcel) : this() { - c = parcel.readString() - q = parcel.readString() - limit = parcel.readString() - userID = parcel.readString() - fromID = parcel.readString() - s = parcel.readString() - maxage = parcel.readString() - toDate = parcel.readString() - fromDate = parcel.readString() - dateType = parcel.readString() - minSize = parcel.readString() - maxSize = parcel.readString() - sizeType = parcel.readString() - sort = parcel.readString() - order = parcel.readString() - lang = parcel.readString() - page = parcel.readInt() - } - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeString(c) - parcel.writeString(q) - parcel.writeString(limit) - parcel.writeString(userID) - parcel.writeString(fromID) - parcel.writeString(s) - parcel.writeString(maxage) - parcel.writeString(toDate) - parcel.writeString(fromDate) - parcel.writeString(dateType) - parcel.writeString(minSize) - parcel.writeString(maxSize) - parcel.writeString(sizeType) - parcel.writeString(sort) - parcel.writeString(order) - parcel.writeString(lang) - parcel.writeInt(page) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): Query { - return Query(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/RecentlyPlayed.kt b/app/src/main/java/cat/pantsu/nyaapantsu/model/RecentlyPlayed.kt deleted file mode 100644 index ad35fe2..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/RecentlyPlayed.kt +++ /dev/null @@ -1,10 +0,0 @@ -package cat.pantsu.nyaapantsu.model - -import com.chibatching.kotpref.KotprefModel - -/** - * Created by akuma06 on 04/07/2017. - */ -object RecentlyPlayed : KotprefModel() { - var torrents by stringPref("") -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/Torrent.kt b/app/src/main/java/cat/pantsu/nyaapantsu/model/Torrent.kt deleted file mode 100644 index e27361f..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/Torrent.kt +++ /dev/null @@ -1,86 +0,0 @@ -package cat.pantsu.nyaapantsu.model - -import org.json.JSONArray -import org.json.JSONObject - -/** - * Created by akuma06 on 20/06/2017. - */ -class Torrent(torrent: JSONObject) { - val categories = arrayOf("_", "3_", "3_12", "3_5", "3_13", "3_6", "2_", "2_3", "2_4", "4_", "4_7", "4_14", "4_8", "5_", "5_9", "5_10", "5_18", "5_11", "6_", "6_15", "6_16", "1_", "1_1", "1_2") - internal var name: String = "" - internal var description: String = "" - internal var username: String = "" - internal var id = 0 - internal var user_id = 0 - internal var status = 0 - internal var website = "" - internal var languages = JSONArray() - internal var category = 0 - internal var magnet = "" - internal var download = "" - internal var hash = "" - internal var date = "" - internal var size = "" - internal var seeders = 0 - internal var leechers = 0 - internal var completed = 0 - internal var last_scrape = "" - internal var fileList = JSONArray() - - init { - - name = if (torrent.optString("name") !== null) torrent.optString("name") else "" - description = if (torrent.optString("description") !== null) torrent.optString("description") else "" - username = if (torrent.optString("uploader_name") !== null) torrent.optString("uploader_name") else "" - website = if (torrent.optString("website_link") !== null) torrent.optString("website_link") else "" - languages = if (torrent.optJSONArray("languages") !== null) torrent.optJSONArray("languages") else JSONArray() - magnet = if (torrent.optString("magnet") !== null) torrent.optString("magnet") else "" - download = if (torrent.optString("torrent") !== null) torrent.optString("torrent") else "" - hash = if (torrent.optString("hash") !== null) torrent.optString("hash") else "" - date = if (torrent.optString("date") !== null) torrent.optString("date") else "" - size = humanReadableByteCount(torrent.optLong("filesize"), false) - id = torrent.optInt("id") - status = torrent.optInt("status") - user_id = torrent.optInt("uploader_id") - seeders = torrent.optInt("seeders") - leechers = torrent.optInt("leechers") - completed = torrent.optInt("completed") - last_scrape = if (torrent.optString("last_scrape") !== null) torrent.optString("last_scrape") else "" - fileList = if (torrent.optJSONArray("file_list") !== null) torrent.optJSONArray("file_list") else JSONArray("[]") - category = if (torrent.optString("category") !== null) categories.indexOf(torrent.optString("category") + "_" + torrent.optString("sub_category")) else 0 - if (category == -1) { - category = 0 - } - } - - fun humanReadableByteCount(bytes: Long, si: Boolean): String { - val unit = if (si) 1000 else 1024 - if (bytes < unit) return bytes.toString() + " B" - val exp = (Math.log(bytes.toDouble()) / Math.log(unit.toDouble())).toInt() - val pre = (if (si) "kMGTPE" else "KMGTPE")[exp - 1] + if (si) "" else "i" - return String.format("%.1f %sB", bytes / Math.pow(unit.toDouble(), exp.toDouble()), pre) - } - - fun toJson(): JSONObject { - return JSONObject().putOpt("name", name) - .putOpt("description", description) - .putOpt("uploader_name", username) - .putOpt("website_link", website) - .putOpt("languages", languages) - .putOpt("magnet", magnet) - .putOpt("torrent", download) - .putOpt("hash", hash) - .putOpt("date", date) - .putOpt("filesize", size) - .putOpt("id", id) - .putOpt("status", status) - .putOpt("uploader_id", user_id) - .putOpt("seeders", seeders) - .putOpt("leechers", leechers) - .putOpt("completed", completed) - .putOpt("last_scrape", last_scrape) - .putOpt("file_list", fileList) - .putOpt("category", category) - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/Utils.kt b/app/src/main/java/cat/pantsu/nyaapantsu/model/Utils.kt deleted file mode 100644 index 24d3505..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/Utils.kt +++ /dev/null @@ -1,10 +0,0 @@ -package cat.pantsu.nyaapantsu.model - -import com.chibatching.kotpref.KotprefModel - -/** - * Created by xdk78 on 2017-07-13. - */ -object Utils : KotprefModel() { - var doubleBackToExit by booleanPref(default = true) -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListModel.kt b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListModel.kt new file mode 100644 index 0000000..97fa9bc --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListModel.kt @@ -0,0 +1,120 @@ +package cat.pantsu.nyaapantsu.mvp.model + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName +import org.json.JSONArray +import java.math.BigInteger + +data class TorrentListModel( + @SerializedName("id") + @Expose + val id: Int, + + @SerializedName("name") + @Expose + val name: String, + + @SerializedName("status") + @Expose + val status: Int, + + @SerializedName("hash") + @Expose + val hash: String, + + @SerializedName("date") + @Expose + val date: String, + + @SerializedName("filesize") + @Expose + val filesize: BigInteger, + + @SerializedName("description") + @Expose + val description: String, + + @SerializedName("comments") + @Expose + val comments: List, + + @SerializedName("sub_category") + @Expose + val subCategory: String, + + @SerializedName("category") + @Expose + val category: String, + + @SerializedName("anidbid") + @Expose + val anidbid: Int, + + @SerializedName("vndbid") + @Expose + val vndbid: Int, + + @SerializedName("vgmdbid") + @Expose + val vgmdbid: Int, + + @SerializedName("dlsite") + @Expose + val dlsite: String, + + @SerializedName("videoquality") + @Expose + val videoquality: String, + + @SerializedName("tags") + @Expose + val tags: Any, + + @SerializedName("uploader_id") + @Expose + val uploaderId: Int, + + @SerializedName("uploader_name") + @Expose + val uploaderName: String, + + @SerializedName("uploader_old") + @Expose + val uploaderOld: String, + + @SerializedName("website_link") + @Expose + val websiteLink: String, + + @SerializedName("languages") + @Expose + val languages: List, + + @SerializedName("magnet") + @Expose + val magnet: String, + + @SerializedName("torrent") + @Expose + val torrent: String, + + @SerializedName("seeders") + @Expose + val seeders: Int, + + @SerializedName("leechers") + @Expose + val leechers: Int, + + @SerializedName("completed") + @Expose + val completed: Int, + + @SerializedName("last_scrape") + @Expose + val lastScrape: String, + + @SerializedName("file_list") + @Expose + val fileList: List +) diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListResponse.kt b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListResponse.kt new file mode 100644 index 0000000..7a9584f --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/TorrentListResponse.kt @@ -0,0 +1,4 @@ +package cat.pantsu.nyaapantsu.mvp.model + + +data class TorrentListResponse(val torrents: List, val queryRecordCount: Int, val totalRecordCount: Int) diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/model/User.kt b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/UserModel.kt similarity index 71% rename from app/src/main/java/cat/pantsu/nyaapantsu/model/User.kt rename to app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/UserModel.kt index 60eebc1..9e768a0 100644 --- a/app/src/main/java/cat/pantsu/nyaapantsu/model/User.kt +++ b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/model/UserModel.kt @@ -1,15 +1,13 @@ -package cat.pantsu.nyaapantsu.model +package cat.pantsu.nyaapantsu.mvp.model import com.chibatching.kotpref.KotprefModel -/** - * Created by akuma06 on 21/06/2017. - */ -object User : KotprefModel() { + +object UserModel : KotprefModel() { var id by intPref(default = 0) var name by stringPref(default = "れんちょん") var md5 by stringPref() var token by stringPref() var status by intPref(default = 0) var splash by booleanPref(default = false) -} +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/mvp/presenter/TorrentListPresenter.kt b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/presenter/TorrentListPresenter.kt new file mode 100644 index 0000000..13bbb5f --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/presenter/TorrentListPresenter.kt @@ -0,0 +1,22 @@ +package cat.pantsu.nyaapantsu.mvp.presenter + +import cat.pantsu.nyaapantsu.api.torrent.TorrentApi +import cat.pantsu.nyaapantsu.base.BasePresenter +import cat.pantsu.nyaapantsu.base.Schedulers +import cat.pantsu.nyaapantsu.mvp.view.TorrentListView + + +class TorrentListPresenter(val schedulers: Schedulers, val torrentApi: TorrentApi) : BasePresenter() { + + fun loadData() { + compositeObservable.add( + torrentApi + .getTorrentList() + .observeOn(schedulers.mainThread()) + .subscribeOn(schedulers.backgroundThread()) + .subscribe( + { items -> view?.onItemLoaded(items) }, + { error -> view?.onError(error) }) + ) + } +} diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/mvp/view/TorrentListView.kt b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/view/TorrentListView.kt new file mode 100644 index 0000000..80f32b9 --- /dev/null +++ b/app/src/main/java/cat/pantsu/nyaapantsu/mvp/view/TorrentListView.kt @@ -0,0 +1,11 @@ +package cat.pantsu.nyaapantsu.mvp.view + +import cat.pantsu.nyaapantsu.base.BaseView +import cat.pantsu.nyaapantsu.mvp.model.TorrentListModel +import cat.pantsu.nyaapantsu.mvp.model.TorrentListResponse + +interface TorrentListView : BaseView { + + fun onItemLoaded(items: TorrentListResponse) + +} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/BaseActivity.kt b/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/BaseActivity.kt deleted file mode 100644 index 923ac1e..0000000 --- a/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/BaseActivity.kt +++ /dev/null @@ -1,42 +0,0 @@ -package cat.pantsu.nyaapantsu.ui.activity - -import android.os.Bundle -import android.preference.PreferenceManager -import android.support.v7.app.AppCompatActivity -import android.view.Menu -import android.view.MenuItem -import cat.pantsu.nyaapantsu.R -import cat.pantsu.nyaapantsu.util.Utils - -/** - * Created by ltype on 2017/7/11. - */ -abstract class BaseActivity: AppCompatActivity() { - - override fun onPostCreate(savedInstanceState: Bundle?) { - super.onPostCreate(savedInstanceState) - if (this !is HomeActivity) { - supportActionBar!!.setDisplayHomeAsUpEnabled(true) - } - } - - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - val enable = PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean("mascot_voice_switch", true) - if (enable) menuInflater.inflate(R.menu.menu_pets, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - if (this !is HomeActivity) finish() - } - R.id.menu_play -> { - Utils.playVoice(applicationContext) - } - } - - return super.onOptionsItemSelected(item) - } -} \ No newline at end of file diff --git a/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/HomeActivity.kt b/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/HomeActivity.kt index c597648..b87e0e1 100644 --- a/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/HomeActivity.kt +++ b/app/src/main/java/cat/pantsu/nyaapantsu/ui/activity/HomeActivity.kt @@ -1,84 +1,32 @@ package cat.pantsu.nyaapantsu.ui.activity -import android.app.Fragment -import android.net.Uri import android.os.Bundle import android.support.design.widget.NavigationView -import android.support.design.widget.Snackbar -import android.support.v4.content.ContextCompat import android.support.v4.view.GravityCompat import android.support.v7.app.ActionBarDrawerToggle -import android.util.Log import android.view.MenuItem -import android.widget.Button -import android.widget.ImageView -import android.widget.TextView import cat.pantsu.nyaapantsu.R -import cat.pantsu.nyaapantsu.model.Query -import cat.pantsu.nyaapantsu.model.User -import cat.pantsu.nyaapantsu.model.Utils -import cat.pantsu.nyaapantsu.ui.fragment.* -import com.bumptech.glide.Glide -import com.github.kittinunf.fuel.android.core.Json -import com.github.kittinunf.fuel.android.extension.responseJson -import com.github.kittinunf.fuel.httpGet -import com.github.kittinunf.result.Result -import com.github.kittinunf.result.getAs +import cat.pantsu.nyaapantsu.base.BaseActivity +import cat.pantsu.nyaapantsu.ui.fragment.AboutFragment +import cat.pantsu.nyaapantsu.ui.fragment.TorrentListFragment import kotlinx.android.synthetic.main.activity_home.* import kotlinx.android.synthetic.main.app_bar_home.* -import org.jetbrains.anko.contentView -import org.jetbrains.anko.find -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.toast -class HomeActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener, TorrentListFragment.OnFragmentInteractionListener, UploadFragment.OnFragmentInteractionListener, AboutFragment.OnFragmentInteractionListener { - - private var count = 0 +class HomeActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home) setSupportActionBar(toolbar) - fab.setOnClickListener { _ -> - val uploadFragment = UploadFragment.newInstance() - fragmentManager.beginTransaction() - .replace(R.id.main_fragment, uploadFragment as Fragment) - .commit() - } - - val toggle = ActionBarDrawerToggle( - this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) + val toggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) drawer_layout.addDrawerListener(toggle) toggle.syncState() - - checkUser() - val header = nav_view.getHeaderView(0) - val memberButton = header.find