Skip to content

Commit 452ad53

Browse files
committed
Refactoring
1 parent b17b586 commit 452ad53

40 files changed

+491
-176
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ dependencies {
3939

4040
implementation 'androidx.recyclerview:recyclerview:1.1.0'
4141
implementation 'com.squareup.picasso:picasso:2.71828'
42+
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
4243
}

app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
44
package="com.gapps.videonoapi">
5+
56
<uses-permission android:name="android.permission.INTERNET" />
67

78
<application
@@ -10,11 +11,11 @@
1011
android:label="@string/app_name"
1112
android:roundIcon="@mipmap/ic_launcher_round"
1213
android:supportsRtl="true"
13-
android:usesCleartextTraffic="true"
1414
android:theme="@style/AppTheme"
15+
android:usesCleartextTraffic="true"
1516
tools:targetApi="m">
1617
<activity
17-
android:name=".MainActivity"
18+
android:name=".ui.main.MainActivity"
1819
android:label="@string/app_name"
1920
android:theme="@style/AppTheme.NoActionBar">
2021
<intent-filter>
@@ -23,6 +24,11 @@
2324
<category android:name="android.intent.category.LAUNCHER" />
2425
</intent-filter>
2526
</activity>
27+
<activity
28+
android:name=".ui.text.TextActivity"
29+
android:label="@string/app_name"
30+
android:theme="@style/AppTheme.NoActionBar">
31+
</activity>
2632
</application>
2733

2834
</manifest>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.gapps.videonoapi.ui.base
2+
3+
import android.content.*
4+
import android.net.Uri
5+
import android.widget.TextView
6+
import android.widget.Toast
7+
import androidx.appcompat.app.AppCompatActivity
8+
import com.gapps.library.api.models.video.VideoPreviewModel
9+
import com.gapps.library.ui.bottom_menu.BottomVideoController
10+
11+
abstract class BaseActivity: AppCompatActivity() {
12+
13+
protected fun showVideo(model: VideoPreviewModel) {
14+
val host = model.videoHosting
15+
val linkToPlay = model.linkToPlay
16+
val title = model.videoTitle
17+
val initUrl = model.url
18+
19+
BottomVideoController.build(this) {
20+
setListener(object : BottomVideoController.Listener() {
21+
override fun openLinkIn(link: String) {
22+
openLink(link)
23+
}
24+
25+
override fun copyLink(link: String) {
26+
copyLinkToClipboard(link)
27+
}
28+
})
29+
setHostText(host)
30+
setPlayLink(linkToPlay)
31+
setSize(model.width, model.height)
32+
setTitle(title)
33+
setVideoUrl(initUrl)
34+
setProgressView(TextView(this@BaseActivity).apply { text = "Loading" })
35+
show()
36+
}
37+
}
38+
39+
private fun copyLinkToClipboard(link: String) {
40+
val clip = ClipData.newPlainText("VideoUrl", link)
41+
(getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager)?.setPrimaryClip(clip)
42+
Toast.makeText(this, "Copied: $link", Toast.LENGTH_SHORT).show()
43+
}
44+
45+
private fun openLink(link: String) {
46+
try {
47+
val intent = Intent(Intent.ACTION_VIEW).apply {
48+
data = Uri.parse(link)
49+
}
50+
51+
startActivity(intent)
52+
} catch (e: ActivityNotFoundException) {
53+
e.printStackTrace()
54+
}
55+
}
56+
}

app/src/main/java/com/gapps/videonoapi/MainActivity.kt renamed to app/src/main/java/com/gapps/videonoapi/ui/main/MainActivity.kt

Lines changed: 24 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
package com.gapps.videonoapi
1+
package com.gapps.videonoapi.ui.main
22

33
import android.content.*
4-
import android.net.Uri
54
import android.os.Bundle
6-
import android.widget.TextView
7-
import android.widget.Toast
8-
import androidx.appcompat.app.AppCompatActivity
95
import androidx.recyclerview.widget.LinearLayoutManager
106
import com.gapps.library.api.VideoService
117
import com.gapps.library.api.models.video.VideoPreviewModel
12-
import com.gapps.library.ui.bottom_menu.BottomVideoController
13-
import com.gapps.videonoapi.adapters.VideoAdapter
14-
import com.gapps.videonoapi.custom.abraira.UltimediaVideoInfoModel
15-
import com.gapps.videonoapi.utils.ScrollListener
16-
import com.gapps.videonoapi.utils.alphaSmooth
17-
import com.gapps.videonoapi.utils.convertDpToPx
8+
import com.gapps.library.utils.isVideoUrl
9+
import com.gapps.videonoapi.R
10+
import com.gapps.videonoapi.ui.text.TextActivity
11+
import com.gapps.videonoapi.ui.main.adapters.VideoAdapter
12+
import com.gapps.videonoapi.video_utils.abraira.UltimediaVideoInfoModel
13+
import com.gapps.videonoapi.ui.base.BaseActivity
14+
import com.gapps.videonoapi.utils.recycler_view.MarginItemDecoration
15+
import com.gapps.videonoapi.utils.scroll.ScrollListener
16+
import com.gapps.videonoapi.utils.extensions.alphaSmooth
17+
import com.gapps.videonoapi.utils.extensions.convertDpToPx
1818
import kotlinx.android.synthetic.main.activity_main.*
1919
import okhttp3.OkHttpClient
2020
import okhttp3.logging.HttpLoggingInterceptor
2121
import java.util.concurrent.TimeUnit
2222

23-
class MainActivity : AppCompatActivity() {
23+
class MainActivity : BaseActivity() {
2424

2525
private lateinit var videoService: VideoService
2626

@@ -38,6 +38,7 @@ class MainActivity : AppCompatActivity() {
3838
"https://www.ted.com/talks/jill_bolte_taylor_my_stroke_of_insight",
3939
"https://coub.com/view/um0um0",
4040
"https://ustream.tv/recorded/101541339",
41+
"https://asdasdasdasd.tv/recorded/101541339",
4142
"https://www.ultimedia.com/default/index/videogeneric/id/pzkk35/"
4243
)
4344

@@ -72,69 +73,33 @@ class MainActivity : AppCompatActivity() {
7273
private fun initViews() {
7374
videos_list.apply {
7475
layoutManager = LinearLayoutManager(this@MainActivity)
75-
adapter = VideoAdapter(videoService, object : VideoAdapter.Listener {
76+
val videoAdapter = VideoAdapter(this@MainActivity, videoService, object : VideoAdapter.Listener {
7677
override fun onItemClick(item: VideoPreviewModel) {
7778
showVideo(item)
7879
}
79-
}).apply {
80-
swapData(videoUrls)
80+
})
81+
adapter = videoAdapter.apply {
82+
swapData(videoUrls.filter { it.isVideoUrl() })
8183
}
8284

8385
addOnScrollListener(ScrollListener(convertDpToPx(100f)) {
8486
buttons_container.alphaSmooth(if (it) .1f else 1f)
8587
})
88+
89+
addItemDecoration(MarginItemDecoration(videoAdapter, top = false, bottom = true))
8690
}
8791

88-
refresh.setOnClickListener {
89-
(videos_list.adapter as VideoAdapter).swapData(videoUrls)
92+
text_test.setOnClickListener {
93+
startActivity(Intent(this, TextActivity::class.java))
9094
}
9195

9296
collapse_all.setOnClickListener {
9397
(videos_list.adapter as VideoAdapter).collapseAll()
9498
}
95-
}
96-
97-
private fun showVideo(model: VideoPreviewModel) {
98-
val host = model.videoHosting
99-
val linkToPlay = model.linkToPlay
100-
val title = model.videoTitle
101-
val initUrl = model.url
10299

103-
BottomVideoController.build(this) {
104-
setListener(object : BottomVideoController.Listener() {
105-
override fun openLinkIn(link: String) {
106-
openLink(link)
107-
}
108-
109-
override fun copyLink(link: String) {
110-
copyLinkToClipboard(link)
111-
}
112-
})
113-
setHostText(host)
114-
setPlayLink(linkToPlay)
115-
setSize(model.width, model.height)
116-
setTitle(title)
117-
setVideoUrl(initUrl)
118-
setProgressView(TextView(this@MainActivity).apply { text = "Loading" })
119-
show()
120-
}
121-
}
122-
123-
private fun copyLinkToClipboard(link: String) {
124-
val clip = ClipData.newPlainText("VideoUrl", link)
125-
(getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager)?.setPrimaryClip(clip)
126-
Toast.makeText(this, "Copied: $link", Toast.LENGTH_SHORT).show()
127-
}
128-
129-
private fun openLink(link: String) {
130-
try {
131-
val intent = Intent(Intent.ACTION_VIEW).apply {
132-
data = Uri.parse(link)
133-
}
134-
135-
startActivity(intent)
136-
} catch (e: ActivityNotFoundException) {
137-
e.printStackTrace()
100+
swiperefresh.setOnRefreshListener {
101+
(videos_list.adapter as VideoAdapter).swapData(videoUrls)
102+
swiperefresh.isRefreshing = false
138103
}
139104
}
140105
}

app/src/main/java/com/gapps/videonoapi/adapters/VideoAdapter.kt renamed to app/src/main/java/com/gapps/videonoapi/ui/main/adapters/VideoAdapter.kt

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package com.gapps.videonoapi.adapters
1+
package com.gapps.videonoapi.ui.main.adapters
22

3+
import android.content.Context
34
import android.util.Log
45
import android.util.SparseArray
56
import android.view.LayoutInflater
@@ -11,28 +12,44 @@ import com.gapps.library.api.VideoService
1112
import com.gapps.library.api.models.video.VideoPreviewModel
1213
import com.gapps.library.utils.getWidth
1314
import com.gapps.videonoapi.R
14-
import com.gapps.videonoapi.utils.*
15+
import com.gapps.videonoapi.utils.extensions.*
16+
import com.gapps.videonoapi.utils.picasso.FitThumbnailTransformation
17+
import com.gapps.videonoapi.utils.recycler_view.MarginItemDecoration
1518
import com.squareup.picasso.Picasso
1619
import kotlinx.android.synthetic.main.item_video.view.*
1720

1821

19-
class VideoAdapter(private val videoService: VideoService, private val listener: Listener) : RecyclerView.Adapter<VideoAdapter.Holder>() {
22+
class VideoAdapter(private val context: Context, private val videoService: VideoService, private val listener: Listener)
23+
: RecyclerView.Adapter<VideoAdapter.Holder>(),
24+
MarginItemDecoration.Listener {
2025

2126
private var data: MutableList<String> = mutableListOf()
2227
private val dataExpanded: SparseArray<Boolean> = SparseArray()
2328
private val loadedData: SparseArray<VideoPreviewModel?> = SparseArray()
29+
private val inflater = LayoutInflater.from(context)
2430

2531
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
26-
return Holder(
27-
LayoutInflater.from(parent.context)
28-
.inflate(R.layout.item_video, parent, false)
29-
)
32+
return Holder(inflater.inflate(R.layout.item_video, parent, false))
3033
}
3134

3235
override fun getItemCount() = data.size
3336

3437
override fun onBindViewHolder(holder: Holder, position: Int) = holder.bind(data[position], listener)
3538

39+
override fun getTopMargin(position: Int): Int {
40+
return 0
41+
}
42+
43+
override fun getBottomMargin(position: Int): Int {
44+
Log.d("MarginItemDecoration", "bottom: position: $position, itemCount: $itemCount")
45+
46+
return if (position == itemCount - 1) {
47+
context.convertDpToPx(75f).toInt()
48+
} else {
49+
0
50+
}
51+
}
52+
3653
fun swapData(data: List<String>) {
3754
this.data.clear()
3855
this.data.addAll(data)
@@ -143,18 +160,18 @@ class VideoAdapter(private val videoService: VideoService, private val listener:
143160
type ?: return
144161

145162
val icon = when (type) {
146-
VideoPreviewModel.YOUTUBE -> R.drawable.youtube
147-
VideoPreviewModel.YOUTUBE_MUSIC -> R.drawable.youtube_music
148-
VideoPreviewModel.VIMEO -> R.drawable.vimeo
149-
VideoPreviewModel.RUTUBE -> R.drawable.rutube
150-
VideoPreviewModel.FACEBOOK -> R.drawable.ic_fb
151-
VideoPreviewModel.DAILYMOTION -> R.drawable.dailymotion
152-
VideoPreviewModel.WISTIA -> R.drawable.ic_wistia
153-
VideoPreviewModel.VZAAR -> R.drawable.ic_vzaar
154-
VideoPreviewModel.HULU -> R.drawable.hulu
155-
VideoPreviewModel.USTREAM -> R.drawable.ibm
156-
VideoPreviewModel.TED_TALKS -> R.drawable.ted_talks
157-
VideoPreviewModel.COUB -> R.drawable.ic_coub
163+
"YouTube" -> R.drawable.youtube
164+
"YouTube Music" -> R.drawable.youtube_music
165+
"Vimeo" -> R.drawable.vimeo
166+
"Rutube" -> R.drawable.rutube
167+
"Facebook" -> R.drawable.ic_fb
168+
"Dailymotion" -> R.drawable.dailymotion
169+
"Wistia" -> R.drawable.ic_wistia
170+
"Vzaar" -> R.drawable.ic_vzaar
171+
"Hulu" -> R.drawable.hulu
172+
"Ustream" -> R.drawable.ibm
173+
"Ted Talks" -> R.drawable.ted_talks
174+
"Coub" -> R.drawable.ic_coub
158175
"Ultimedia" -> R.drawable.ultimedia
159176
else -> R.drawable.ic_video
160177
}

0 commit comments

Comments
 (0)