diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 4e3844e80..526b4c25c 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + diff --git a/app/build.gradle b/app/build.gradle index 796d68586..337950db2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,4 +42,8 @@ dependencies { testImplementation 'junit:junit:' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation("com.squareup.okhttp3:okhttp:4.9.0") + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'com.squareup.picasso:picasso:2.8' + implementation 'de.hdodenhof:circleimageview:3.1.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 995ab87b9..3ba7e4bd1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + (R.id.recview) + recyclerView.layoutManager = GridLayoutManager(view.context, resources.getInteger(R.integer.grid_items)) + + val progressbar = view.findViewById(R.id.progressBar) + fetchJson(progressbar,recyclerView) + + } companion object { @@ -56,4 +79,42 @@ class Home : Fragment() { } } } -} \ No newline at end of file + + private fun fetchJson(progressBar: ProgressBar, recyclerView: RecyclerView) { + val client = OkHttpClient() + + fun run() { + val request = Request.Builder() + .url("https://pipedapi.kavin.rocks/trending?region=US") + .build() + client.newCall(request).enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + e.printStackTrace() + } + override fun onResponse(call: Call, response: Response) { + response.use { + if (!response.isSuccessful) throw IOException("Unexpected code $response") + val body = response.body!!.string() + println(body) + val gson = GsonBuilder().create() + val itemType = object : TypeToken>() {}.type + val trendingList = gson.fromJson>(body, itemType) + runOnUiThread { + progressBar.visibility = View.GONE + recyclerView.adapter = TrendingAdapter(trendingList) + } + } + + + } + }) + } + run() + + } + fun Fragment?.runOnUiThread(action: () -> Unit) { + this ?: return + if (!isAdded) return // Fragment not attached to an Activity + activity?.runOnUiThread(action) + } +} diff --git a/app/src/main/java/xyz/btcland/libretube/Trending.kt b/app/src/main/java/xyz/btcland/libretube/Trending.kt new file mode 100644 index 000000000..989800f54 --- /dev/null +++ b/app/src/main/java/xyz/btcland/libretube/Trending.kt @@ -0,0 +1,14 @@ +package xyz.btcland.libretube + +data class Trending( + val url: String, + val title: String, + val thumbnail: String, + val uploaderName: String, + val uploaderUrl:String, + val uploaderAvatar:String, + val uploadedDate: String, + val duration: Int, + val views: Int, + val uploaderVerified: Boolean +) diff --git a/app/src/main/java/xyz/btcland/libretube/TrendingAdapter.kt b/app/src/main/java/xyz/btcland/libretube/TrendingAdapter.kt new file mode 100644 index 000000000..bf2c66bad --- /dev/null +++ b/app/src/main/java/xyz/btcland/libretube/TrendingAdapter.kt @@ -0,0 +1,55 @@ +package xyz.btcland.libretube + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.squareup.picasso.Picasso +import java.math.BigDecimal +import java.math.RoundingMode + +class TrendingAdapter(private val trendingFeed: List): RecyclerView.Adapter() { + override fun getItemCount(): Int { + return trendingFeed.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val cell = layoutInflater.inflate(R.layout.trending_row,parent,false) + return CustomViewHolder(cell) + } + + override fun onBindViewHolder(holder: CustomViewHolder, position: Int) { + val trending = trendingFeed[position] + holder.v.findViewById(R.id.textView_title).text = trending.title + holder.v.findViewById(R.id.textView_channel).text = trending.uploaderName +" • "+ videoViews(trending.views)+" • "+trending.uploadedDate + val thumbnailImage = holder.v.findViewById(R.id.thumbnail) + val channelImage = holder.v.findViewById(R.id.channel_image) + Picasso.get().load(trending.thumbnail).into(thumbnailImage) + Picasso.get().load(trending.uploaderAvatar).into(channelImage) + } +} +class CustomViewHolder(val v: View): RecyclerView.ViewHolder(v){ + +} +fun videoViews(views: Int): String{ + when { + views<1000 -> { + return views.toString() + } + views in 1000..999999 -> { + val decimal = BigDecimal(views/1000).setScale(0, RoundingMode.HALF_EVEN) + return decimal.toString()+"K" + } + views in 1000000..10000000 -> { + val decimal = BigDecimal(views/1000000).setScale(0, RoundingMode.HALF_EVEN) + return decimal.toString()+"M" + } + else -> { + val decimal = BigDecimal(views/1000000).setScale(0, RoundingMode.HALF_EVEN) + return decimal.toString()+"M" + } + } +} diff --git a/app/src/main/java/xyz/btcland/libretube/Video.kt b/app/src/main/java/xyz/btcland/libretube/Video.kt new file mode 100644 index 000000000..675f3f8ee --- /dev/null +++ b/app/src/main/java/xyz/btcland/libretube/Video.kt @@ -0,0 +1,6 @@ +package xyz.btcland.libretube + +data class Video( + val id: Int, + +) diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 58a6b3941..cea35aceb 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,14 +1,31 @@ - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/trending_row.xml b/app/src/main/res/layout/trending_row.xml new file mode 100644 index 000000000..a99d71186 --- /dev/null +++ b/app/src/main/res/layout/trending_row.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-large/integers.xml b/app/src/main/res/values-large/integers.xml new file mode 100644 index 000000000..e7da413d6 --- /dev/null +++ b/app/src/main/res/values-large/integers.xml @@ -0,0 +1,4 @@ + + + 2 + \ No newline at end of file diff --git a/app/src/main/res/values-xlarge/integers.xml b/app/src/main/res/values-xlarge/integers.xml new file mode 100644 index 000000000..15fe03fa4 --- /dev/null +++ b/app/src/main/res/values-xlarge/integers.xml @@ -0,0 +1,4 @@ + + + 4 + \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml new file mode 100644 index 000000000..194e40225 --- /dev/null +++ b/app/src/main/res/values/integers.xml @@ -0,0 +1,4 @@ + + + 1 + \ No newline at end of file