Skip to content

Commit aac8b8e

Browse files
author
Parseus
committed
Added the share functionality for TV builds
1 parent c8a116f commit aac8b8e

File tree

18 files changed

+231
-30
lines changed

18 files changed

+231
-30
lines changed

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,22 @@
33
<resources>
44
<string name="app_name" translatable="false">&app_name;</string>
55

6+
<string name="action_share">Share</string>
67
<string name="action_settings">Settings</string>
78
<string name="about_app">About &app_name;…</string>
89
<string name="app_version">Version %s</string>
910
<string name="copyright" translatable="false">\u00A9 2018-2025 Parseus</string>
1011
<string name="source_code_link" translatable="false">https://github.com/Parseus/codecinfo</string>
1112

13+
<string name="action_filter_by_feature">Filter by feature</string>
1214
<string name="action_warning">Show device warnings</string>
1315
<string name="action_search">Search</string>
1416
<string name="search_hint">Search codec/DRM info</string>
1517
<string name="search_settings_description">Codec/DRM info</string>
1618

19+
<string name="codec_list">Codec list</string>
20+
<string name="codec_drm_all_info">All codecs and DRMs with details</string>
21+
1722
<string name="unable_to_get_codec_info_error">Unable to get the list of codecs due to an Android platform bug.</string>
1823
<string name="unable_to_get_drm_info_error">Unable to get the list of DRM due to an Android platform bug.</string>
1924

app/src/mobile/res/values/strings.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22
<resources>
33
<string name="close_details">Close details</string>
44

5-
<string name="action_share">Share</string>
65
<string name="choose_share">Choose info to share</string>
7-
<string name="codec_list">Codec list</string>
86
<string name="codec_details_selected">Selected codec details</string>
9-
<string name="codec_drm_all_info">All codecs and DRMs with details</string>
107

118
<string name="feedback_email" translatable="false">parseus.dev@gmail.com</string>
129
<string name="email_subject">Feedback</string>

app/src/tv/AndroidManifest.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
<application
88
android:name=".ui.CodecInfoApp"
9-
android:banner="@drawable/banner">
9+
android:banner="@drawable/banner"
10+
tools:ignore="MissingApplicationIcon">
1011

1112
<activity
1213
android:name="com.parseus.codecinfo.ui.TvMainActivity"
@@ -38,6 +39,10 @@
3839
android:label="@string/app_name"
3940
android:theme="@style/Theme.CodecInfo"
4041
android:parentActivityName="com.parseus.codecinfo.ui.TvMainActivity" />
42+
<activity android:name="com.parseus.codecinfo.ui.TvShareActivity"
43+
android:label="@string/app_name"
44+
android:theme="@style/Theme.CodecInfo"
45+
android:parentActivityName="com.parseus.codecinfo.ui.TvMainActivity" />
4146

4247
</application>
4348

app/src/tv/java/com/parseus/codecinfo/ui/MainTvFragment.kt

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewClickedListener {
100100
if (knownProblems.isNotEmpty()) {
101101
otherPresenterAdapter.add(OtherActionDescriptor(ACTION_DEVICE_ISSUES_ID, R.drawable.ic_warning, R.string.known_issue_warning))
102102
}
103+
otherPresenterAdapter.add(OtherActionDescriptor(ACTION_SHARE_ID, R.drawable.ic_share, R.string.action_share))
103104
otherPresenterAdapter.add(OtherActionDescriptor(ACTION_SETTINGS_ID, R.drawable.ic_settings, R.string.action_settings))
104105
otherPresenterAdapter.add(OtherActionDescriptor(ACTION_ABOUT_ID, R.drawable.ic_info, R.string.about_app))
105106

@@ -112,23 +113,28 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewClickedListener {
112113

113114
override fun onItemClicked(itemViewHolder: Presenter.ViewHolder?, item: Any?,
114115
rowViewHolder: RowPresenter.ViewHolder?, row: Row?) {
115-
if (item is CodecSimpleInfo) {
116-
val intent = Intent(requireActivity(), TvCodecDetailsActivity::class.java).apply {
117-
putExtra("codecId", item.codecId)
118-
putExtra("codecName", item.codecName)
116+
when (item) {
117+
is CodecSimpleInfo -> {
118+
val intent = Intent(requireActivity(), TvCodecDetailsActivity::class.java).apply {
119+
putExtra("codecId", item.codecId)
120+
putExtra("codecName", item.codecName)
121+
}
122+
startActivity(intent)
119123
}
120-
startActivity(intent)
121-
} else if (item is DrmSimpleInfo) {
122-
val intent = Intent(requireActivity(), TvCodecDetailsActivity::class.java).apply {
123-
putExtra("drmName", item.drmName)
124-
putExtra("drmUuid", item.drmUuid)
124+
is DrmSimpleInfo -> {
125+
val intent = Intent(requireActivity(), TvCodecDetailsActivity::class.java).apply {
126+
putExtra("drmName", item.drmName)
127+
putExtra("drmUuid", item.drmUuid)
128+
}
129+
startActivity(intent)
125130
}
126-
startActivity(intent)
127-
} else if (item is OtherActionDescriptor) {
128-
when (item.actionId) {
129-
ACTION_SETTINGS_ID -> startActivity(Intent(requireActivity(), TvSettingsActivity::class.java))
130-
ACTION_ABOUT_ID -> startActivity(Intent(requireActivity(), TvAboutActivity::class.java))
131-
ACTION_DEVICE_ISSUES_ID -> startActivity(Intent(requireActivity(), TvDeviceIssuesActivity::class.java))
131+
is OtherActionDescriptor -> {
132+
when (item.actionId) {
133+
ACTION_SETTINGS_ID -> startActivity(Intent(requireActivity(), TvSettingsActivity::class.java))
134+
ACTION_ABOUT_ID -> startActivity(Intent(requireActivity(), TvAboutActivity::class.java))
135+
ACTION_DEVICE_ISSUES_ID -> startActivity(Intent(requireActivity(), TvDeviceIssuesActivity::class.java))
136+
ACTION_SHARE_ID -> startActivity(Intent(requireActivity(), TvShareActivity::class.java))
137+
}
132138
}
133139
}
134140
}
@@ -137,6 +143,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewClickedListener {
137143
private const val ACTION_SETTINGS_ID = 1000
138144
private const val ACTION_ABOUT_ID = 1001
139145
private const val ACTION_DEVICE_ISSUES_ID = 1002
146+
private const val ACTION_SHARE_ID = 1003
140147
}
141148

142149
}

app/src/tv/java/com/parseus/codecinfo/ui/TvAboutFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.content.pm.PackageManager
44
import android.os.Build
55
import android.os.Bundle
66
import androidx.appcompat.content.res.AppCompatResources
7-
import androidx.core.content.ContextCompat
87
import androidx.leanback.app.GuidedStepSupportFragment
98
import androidx.leanback.widget.GuidanceStylist
109
import androidx.leanback.widget.GuidedAction
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.parseus.codecinfo.ui
2+
3+
import android.os.Build
4+
import android.os.Bundle
5+
import androidx.activity.addCallback
6+
import androidx.fragment.app.FragmentActivity
7+
import androidx.leanback.app.GuidedStepSupportFragment
8+
9+
class TvShareActivity : FragmentActivity() {
10+
11+
override fun onCreate(savedInstanceState: Bundle?) {
12+
super.onCreate(savedInstanceState)
13+
GuidedStepSupportFragment.addAsRoot(this, TvShareFragment(), android.R.id.content)
14+
15+
onBackPressedDispatcher.addCallback(this) {
16+
if (Build.VERSION.SDK_INT == 29 && isTaskRoot && supportFragmentManager.backStackEntryCount == 0) {
17+
// Workaround for a memory leak from https://issuetracker.google.com/issues/139738913
18+
finishAfterTransition()
19+
} else {
20+
isEnabled = false
21+
onBackPressedDispatcher.onBackPressed()
22+
isEnabled = true
23+
}
24+
}
25+
}
26+
27+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.parseus.codecinfo.ui
2+
3+
import android.content.Intent
4+
import android.os.Bundle
5+
import androidx.appcompat.content.res.AppCompatResources
6+
import androidx.leanback.app.GuidedStepSupportFragment
7+
import androidx.leanback.widget.GuidanceStylist
8+
import androidx.leanback.widget.GuidedAction
9+
import com.parseus.codecinfo.R
10+
import com.parseus.codecinfo.utils.getAllInfoString
11+
import com.parseus.codecinfo.utils.getCodecAndDrmItemListString
12+
13+
class TvShareFragment : GuidedStepSupportFragment() {
14+
15+
override fun onCreateGuidance(savedInstanceState: Bundle?): GuidanceStylist.Guidance {
16+
val title = getString(R.string.action_share)
17+
val icon = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_share)
18+
return GuidanceStylist.Guidance(title, null, null, icon)
19+
}
20+
21+
override fun onCreateActions(actions: MutableList<GuidedAction>, savedInstanceState: Bundle?) {
22+
super.onCreateActions(actions, savedInstanceState)
23+
val shareItemListAction = GuidedAction.Builder(requireContext())
24+
.title(R.string.codec_drm_list).id(ACTION_SHARE_ITEM_LIST).build()
25+
val shareAllInfoAction = GuidedAction.Builder(requireContext())
26+
.title(R.string.codec_drm_all_info).id(ACTION_SHARE_ALL_INFO).build()
27+
val cancelAction = GuidedAction.Builder(requireContext()).title(android.R.string.cancel)
28+
.clickAction(GuidedAction.ACTION_ID_CANCEL).build()
29+
actions.add(shareItemListAction)
30+
actions.add(shareAllInfoAction)
31+
actions.add(cancelAction)
32+
}
33+
34+
override fun onGuidedActionClicked(action: GuidedAction) {
35+
if (action.id == ACTION_SHARE_ITEM_LIST || action.id == ACTION_SHARE_ALL_INFO) {
36+
launchShareIntent(action.id)
37+
}
38+
finishGuidedStepSupportFragments()
39+
}
40+
41+
private fun launchShareIntent(actionId: Long) {
42+
val textToShare = when (actionId) {
43+
ACTION_SHARE_ITEM_LIST -> getCodecAndDrmItemListString(requireContext())
44+
ACTION_SHARE_ALL_INFO -> getAllInfoString(requireContext())
45+
else -> ""
46+
}
47+
val shareIntent = Intent.createChooser(Intent().apply {
48+
action = Intent.ACTION_SEND
49+
type = "text/plain"
50+
putExtra(Intent.EXTRA_TEXT, textToShare)
51+
val title = getString(if (actionId == ACTION_SHARE_ITEM_LIST)
52+
R.string.codec_drm_list else R.string.codec_drm_all_info)
53+
putExtra(Intent.EXTRA_TITLE, title)
54+
}, null)
55+
startActivity(shareIntent)
56+
}
57+
58+
companion object {
59+
private const val ACTION_SHARE_ITEM_LIST = -1000L
60+
private const val ACTION_SHARE_ALL_INFO = -1001L
61+
}
62+
63+
}

app/src/tv/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.parseus.codecinfo.ui.fragments
22

3+
import android.content.Intent
34
import android.os.Bundle
45
import android.view.LayoutInflater
56
import android.view.View
@@ -9,6 +10,7 @@ import androidx.core.content.IntentCompat
910
import androidx.core.view.isVisible
1011
import androidx.fragment.app.Fragment
1112
import androidx.recyclerview.widget.DividerItemDecoration
13+
import com.parseus.codecinfo.R
1214
import com.parseus.codecinfo.data.DetailsProperty
1315
import com.parseus.codecinfo.data.codecinfo.getDetailedCodecInfo
1416
import com.parseus.codecinfo.data.drm.DrmVendor
@@ -19,6 +21,8 @@ import com.parseus.codecinfo.ui.CustomLinearLayoutManager
1921
import com.parseus.codecinfo.ui.adapters.DetailsAdapter
2022
import com.parseus.codecinfo.ui.expandablelist.ExpandableItemAdapter
2123
import com.parseus.codecinfo.ui.expandablelist.ExpandableItemAnimator
24+
import com.parseus.codecinfo.utils.getSelectedCodecInfoString
25+
import com.parseus.codecinfo.utils.getSelectedDrmInfoString
2226
import java.util.*
2327

2428
class DetailsFragment : Fragment(), SearchView.OnQueryTextListener {
@@ -36,6 +40,27 @@ class DetailsFragment : Fragment(), SearchView.OnQueryTextListener {
3640

3741
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
3842
_binding = ItemDetailsFragmentLayoutBinding.inflate(inflater, container, false)
43+
binding.share.setOnClickListener {
44+
val textToShare = when {
45+
codecId != null && codecName != null -> getSelectedCodecInfoString(requireContext(),
46+
codecId!!, codecName!!)
47+
drmName != null && drmUuid != null -> getSelectedDrmInfoString(requireContext(),
48+
drmName!!, drmUuid!!)
49+
else -> ""
50+
}
51+
val shareIntent = Intent.createChooser(Intent().apply {
52+
action = Intent.ACTION_SEND
53+
type = "text/plain"
54+
putExtra(Intent.EXTRA_TEXT, textToShare)
55+
val title = if (codecId != null && codecName != null) {
56+
"${getString(R.string.codec_details)}: $codecName"
57+
} else {
58+
"${getString(R.string.drm_details)}: $drmName"
59+
}
60+
putExtra(Intent.EXTRA_TITLE, title)
61+
}, null)
62+
startActivity(shareIntent)
63+
}
3964
return binding.root
4065
}
4166

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.parseus.codecinfo.utils
2+
3+
import android.content.Context
4+
import com.parseus.codecinfo.R
5+
import com.parseus.codecinfo.data.codecinfo.getSimpleCodecInfoList
6+
import com.parseus.codecinfo.data.drm.getSimpleDrmInfoList
7+
8+
fun getCodecAndDrmItemListString(context: Context): String {
9+
val builder = StringBuilder()
10+
11+
builder.append("${context.getString(R.string.codec_list)}:\n\n")
12+
val codecSimpleInfoList = getSimpleCodecInfoList(context, true)
13+
codecSimpleInfoList.addAll(getSimpleCodecInfoList(context, false))
14+
codecSimpleInfoList.forEach { builder.append("$it\n") }
15+
16+
builder.append("\n\n${context.getString(R.string.drm_list)}:\n\n")
17+
getSimpleDrmInfoList(context).forEach { builder.append("$it\n") }
18+
19+
return builder.toString()
20+
}

0 commit comments

Comments
 (0)