Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:screenOrientation="landscape"
android:theme="@style/Theme.SampleTv">
<!--
android:banner="@drawable/app_icon_your_company"
Expand All @@ -27,6 +28,7 @@
android:exported="true"
android:banner="@drawable/app_icon_your_company"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
64 changes: 50 additions & 14 deletions app/src/main/java/com/tech/sampletv/MainFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ package com.tech.sampletv

import android.os.Build
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.leanback.app.BrowseSupportFragment
import androidx.leanback.widget.*
import com.tech.sampletv.model.HeaderItemModel
import com.tech.sampletv.prasenter.HeaderPresenter
import com.tech.sampletv.utils.MyHeaderList
import java.util.*

/*BrowesSupportFragment is provided by leanback lib
* BrowesSupportFragment containing HeadersFragment and RowsFragment
*
* */

class MainFragment : BrowseSupportFragment() {
/*BrowesSupportFragment is provided by leanback lib
* BrowesSupportFragment containing HeadersFragment and RowsFragment
*
* */

class MainFragment : BrowseSupportFragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_main, container, false)
}

@RequiresApi(Build.VERSION_CODES.M)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand All @@ -32,14 +32,50 @@ class MainFragment : BrowseSupportFragment() {
//badgeDrawable=resources.getDrawable(R.drawable.vedio_banner,null)
// set Title
title="This is my first TV App"
headersState=HEADERS_ENABLED
isHeadersTransitionOnBackEnabled=true

//set fastLane (or headers) background color
brandColor=resources.getColor(R.color.fastlane_background,null)

// set search icon color
searchAffordanceColor=resources.getColor(R.color.search_opaque,null)

setHeader()

}
private fun setHeader(){
headersState=HEADERS_ENABLED
isHeadersTransitionOnBackEnabled=true

// set fastLane (or headers) background color
brandColor = ContextCompat.getColor(requireContext(), R.color.fastlane_background)

// set search icon color
searchAffordanceColor = ContextCompat.getColor(requireContext(), R.color.search_opaque)

// Lines of code to be added
val sHeaderPresenter: PresenterSelector = ClassPresenterSelector()
.addClassPresenter(DividerRow::class.java, DividerPresenter())
.addClassPresenter(SectionRow::class.java, RowHeaderPresenter())
.addClassPresenter(Row::class.java, HeaderPresenter())

setHeaderPresenterSelector(sHeaderPresenter)

loadRows()
}

private fun loadRows() {
//var i=0
var myHeader = MyHeaderList.headerList
val rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
for (i in myHeader.indices) {
//add category with icon
val listRowAdapter = ArrayObjectAdapter(HeaderPresenter())
var header = HeaderItemModel(i, MyHeaderList.headerList[i], R.drawable.arrow)
rowsAdapter.add(ListRow(header, listRowAdapter))
}


setAdapter(rowsAdapter);

}

}
34 changes: 34 additions & 0 deletions app/src/main/java/com/tech/sampletv/model/HeaderItemModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.tech.sampletv.model

import androidx.leanback.widget.HeaderItem
import com.tech.sampletv.model.HeaderItemModel

/*
Copyright (C) SampleTv - All Rights Reserved Ⓒ
Unauthorized copying of this file, via any medium is strictly prohibited
Proprietary and confidential.
See the License for the specific language governing permissions and limitations under the License.

Created by Sanjay Singh on 25,April,2023 at 2:08 AM for SampleTv.
New Delhi,India
*/
class HeaderItemModel : HeaderItem {

// Hold an icon resource id
var iconResId = ICON_NONE

// Title + Icon
// No icon, label only
@JvmOverloads
constructor(id: Int, name: String, iconResId: Int = ICON_NONE) : super(id.toLong(), name) {
this.iconResId = iconResId
}

// Title label
constructor(name: String) : super(name) {}

companion object {
private val TAG = HeaderItemModel::class.java.simpleName
const val ICON_NONE = -1
}
}
47 changes: 47 additions & 0 deletions app/src/main/java/com/tech/sampletv/prasenter/HeaderPresenter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.tech.sampletv.prasenter

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.Presenter
import androidx.leanback.widget.RowHeaderPresenter
import com.tech.sampletv.R
import com.tech.sampletv.model.HeaderItemModel

/*
Copyright (C) SampleTv - All Rights Reserved Ⓒ
Unauthorized copying of this file, via any medium is strictly prohibited
Proprietary and confidential.
See the License for the specific language governing permissions and limitations under the License.

Created by Sanjay Singh on 25,April,2023 at 2:11 AM for SampleTv.
New Delhi,India
*/
class HeaderPresenter : RowHeaderPresenter() {
private var unSelecteditems = 0f

override fun onCreateViewHolder(viewGroup: ViewGroup): ViewHolder {
unSelecteditems = viewGroup.resources.getFraction(R.fraction.lb_browse_header_unselect_alpha, 1, 1)
val inflater = viewGroup.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val view = inflater.inflate(R.layout.header_row, null)
return ViewHolder(view)
}

override fun onBindViewHolder(viewHolder: Presenter.ViewHolder, o: Any) {
val iconHeaderItem = (o as ListRow).headerItem as HeaderItemModel
val rootView = viewHolder.view
val iconView = rootView.findViewById<AppCompatImageView>(R.id.header_icon)
val label = rootView.findViewById<AppCompatTextView>(R.id.header_label)
label.text = iconHeaderItem.name
iconView.setImageResource(iconHeaderItem.iconResId)
}

override fun onUnbindViewHolder(holder: Presenter.ViewHolder) {}

companion object {
private val TAG = HeaderPresenter::class.java.simpleName
}
}
15 changes: 15 additions & 0 deletions app/src/main/java/com/tech/sampletv/utils/MyHeaderList.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.tech.sampletv.utils

/*
Copyright (C) SampleTv - All Rights Reserved Ⓒ
Unauthorized copying of this file, via any medium is strictly prohibited
Proprietary and confidential.
See the License for the specific language governing permissions and limitations under the License.

Created by Sanjay Singh on 25,April,2023 at 2:59 AM for SampleTv.
New Delhi,India
*/

object MyHeaderList {
var headerList = arrayOf("Home", "News", "Movie", "Series", "Others")
}
Binary file added app/src/main/res/drawable/arrow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 24 additions & 0 deletions app/src/main/res/layout/header_row.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:padding="10dp"
android:orientation="horizontal">

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/header_label"
android:layout_width="140dp"
android:text="Header"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:textSize="18sp" />

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/header_icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:visibility="visible" />

</LinearLayout>
6 changes: 6 additions & 0 deletions app/src/main/res/values/fraction.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="fraction" type="fraction">5%</item>
<item name="parent_fraction" type="fraction">2%p</item>
<item name="lb_browse_header_unselect_alpha" type="fraction">50%</item>
</resources>