VIP
91
Posts
132
Likes
Achievements
Annual Supporter3-Month SupporterVIP ClubPopularLikedRegularNewcomerFirst Step
Thread Post
Aug 12, 2026
at
7:34 AM
This guide applies specifically to the 'Ian Mod' of TiviMate 5.3.3
I HAVE INCLUDED THE RELEVANT APP
How do you know if I have the 'Ian Mod' version of the app?
- If you have libiptvappsdotnet and libcockpitdotlol in your /libs directory, it's the Ian Mod (or a mod of that.)
It replaces:
The main application/window background.
The large logo on the add-playlist screen.
The expanded main-sidebar logo.
The minimized main-sidebar logo.
It uses ordinary PNG files. No bitmap data is embedded in Smali.
1. Open the APK
Using either MT Manager or APKTool:
Code:
apktool d -f "TiviMate_5.3.3.apk" -o "TiviMate_theme"
Keep an untouched copy of the original APK before starting.
2. Prepare the PNG files
Create these four files:
File Recommended canvas Purpose
brand_app_background.png 1920 Ã 1080 Main application background
brand_empty_logo.png 876 Ã 164 Large no-playlist logo
brand_sidebar_expanded.png 704 Ã 128 Expanded sidebar wordmark
brand_sidebar_minimized.png 128 Ã 128 Compact sidebar mark
Use transparent PNGs for all logos. Do not leave unused transparent padding around the sidebar
logos because Android sizes the view from the complete PNG canvas.
Copy them to:
Code:
res/drawable-nodpi/brand_app_background.png
res/drawable-nodpi/brand_empty_logo.png
res/drawable-nodpi/brand_sidebar_expanded.png
res/drawable-nodpi/brand_sidebar_minimized.png
Create res/drawable-nodpi if it does not exist. drawable-nodpi prevents Android from scaling a
PNG a second time according to device density.
3. Replace the application background
Open:
Code:
res/values/styles.xml
Find the MainActivity theme:
XML:
<style name="APKTOOL_RENAMED_0x7f1403f0" parent="@style/APKTOOL_RENAMED_0x7f1403eb">
<item name="android:windowBackground">@android:color/black</item>
</style>
Replace it with:
XML:
<style name="APKTOOL_RENAMED_0x7f1403f0" parent="@style/APKTOOL_RENAMED_0x7f1403eb">
<item name="android:windowBackground">@drawable/brand_app_background</item>
</style>
This is the background of MainActivity. Normal TiviMate content surfaces, cards, player video and
opaque settings panels continue to cover it, which is intentional.
To guarantee that the image is also behind the no-playlist/live layout, open:
Code:
res/layout/APKTOOL_RENAMED_0x7f0e0058.xml
Add this attribute to its root ConstraintLayout:
XML:
android:background="@drawable/brand_app_background"
Do not add the image as an ImageView above the content. That can intercept focus or cover
fragments.
4. Replace the large no-playlist logo
The APK already uses this drawable for the large empty-state wordmark:
Code:
res/drawable/empty_state_tivimate_wordmark.xml
Delete that XML file. Copy brand_empty_logo.png to the same resource name:
Code:
res/drawable-nodpi/empty_state_tivimate_wordmark.png
Do not keep both empty_state_tivimate_wordmark.xml and
empty_state_tivimate_wordmark.png; Apktool will report a duplicate resource.
The existing view in APKTOOL_RENAMED_0x7f0e0058.xml is already correctly positioned:
XML:
android:id="@id/APKTOOL_RENAMED_0x7f0b03fc"
android:background="@drawable/empty_state_tivimate_wordmark"
android:layout_width="219.0dp"
android:layout_height="41.0dp"
Change the 219dp à 41dp dimensions only if the replacement has a substantially different aspect
ratio. Preserve its constraints and ID.
5. Replace the expanded and minimized sidebar logos
Open:
Code:
res/layout/APKTOOL_RENAMED_0x7f0e001c.xml
Find the ConstraintLayout with:
XML:
android:id="@id/logo"
Replace that complete ConstraintLayout block with:
XML:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24.0dp"
android:layout_marginStart="12.0dp">
<!-- Expanded wordmark. MainActivity finds this exact existing ID. -->
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0228"
android:layout_width="176.0dp"
android:layout_height="32.0dp"
android:src="@drawable/brand_sidebar_expanded"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
<!-- Minimized mark. MainActivity already retains this existing ID. -->
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0229"
android:visibility="gone"
android:layout_width="32.0dp"
android:layout_height="32.0dp"
android:src="@drawable/brand_sidebar_minimized"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
<!-- Required by the generated view binding. Never remove these IDs. -->
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0225"
android:layout_width="1.0dp"
android:layout_height="1.0dp"
android:src="@android:color/transparent"
android:alpha="0.0" />
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0226"
android:layout_width="1.0dp"
android:layout_height="1.0dp"
android:src="@android:color/transparent"
android:alpha="0.0" />
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0227"
android:layout_width="1.0dp"
android:layout_height="1.0dp"
android:src="@android:color/transparent"
android:alpha="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
The three transparent views are required. Removing them crashes layout inflation because generated
binding class LËËáĩˇË; explicitly looks up all five original IDs.
6. Patch the sidebar state Smali
Open:
Code:
smali_classes15/ar/tvplayer/tv/ui/MainActivity.smali
Find:
Smali:
.method public final ËĘáĩĒ(ZZ)V
Within that method, find this block near :cond_4:
Smali:
:cond_4
const/16 v6, 0x12a
invoke-virtual {v9, v10}, Landroid/view/View;->setVisibility(I)V
goto :goto_4
Insert the following code between setVisibility(I)V and goto :goto_4:
Smali:
# PNG branding: v8 == true means the sidebar is minimized.
invoke-virtual {p0}, Lar/tvplayer/tv/ui/MainActivity;->Ëáĩ()LáĩáĩĢ;
move-result-object v9
iget-object v9, v9, LáĩáĩĢ;->ËË:Landroidx/constraintlayout/widget/ConstraintLayout;
const v11, 0x7f0b0228
invoke-virtual {v9, v11}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v9
check-cast v9, Landroid/widget/ImageView;
if-eqz v8, :ian_branding_expanded
# Minimized: hide expanded PNG.
const/16 v11, 0x8
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
invoke-virtual {p0}, Lar/tvplayer/tv/ui/MainActivity;->Ëáĩ()LáĩáĩĢ;
move-result-object v9
iget-object v9, v9, LáĩáĩĢ;->áĩáĩļ:Landroid/widget/ImageView;
const/4 v11, 0x0
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
goto :ian_branding_done
:ian_branding_expanded
# Expanded: show expanded PNG.
const/4 v11, 0x0
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
invoke-virtual {p0}, Lar/tvplayer/tv/ui/MainActivity;->Ëáĩ()LáĩáĩĢ;
move-result-object v9
iget-object v9, v9, LáĩáĩĢ;->áĩáĩļ:Landroid/widget/ImageView;
const/16 v11, 0x8
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
:ian_branding_done
Do not change .locals 13; registers v9 and v11 already exist within that method. Do not put
this code at :goto_4, because the p1 != 0 path can reach :goto_4 before v8 has been assigned.
7. Optional launcher and Android TV banner
These do not affect the in-app logos:
Code:
res/mipmap-*/ic_launcher.png
res/mipmap-*/ic_launcher_round.png
res/mipmap-xhdpi/banner.png
Replace every density variant if changing the launcher icon. Android TV banner artwork should use
a 320 Ã 180 or equivalent 16:9 PNG.
8. Build, align and sign
9. Test
I HAVE INCLUDED THE RELEVANT APP
How do you know if I have the 'Ian Mod' version of the app?
- If you have libiptvappsdotnet and libcockpitdotlol in your /libs directory, it's the Ian Mod (or a mod of that.)
It replaces:
The main application/window background.
The large logo on the add-playlist screen.
The expanded main-sidebar logo.
The minimized main-sidebar logo.
It uses ordinary PNG files. No bitmap data is embedded in Smali.
1. Open the APK
Using either MT Manager or APKTool:
Code:
apktool d -f "TiviMate_5.3.3.apk" -o "TiviMate_theme"
Keep an untouched copy of the original APK before starting.
2. Prepare the PNG files
Create these four files:
File Recommended canvas Purpose
brand_app_background.png 1920 Ã 1080 Main application background
brand_empty_logo.png 876 Ã 164 Large no-playlist logo
brand_sidebar_expanded.png 704 Ã 128 Expanded sidebar wordmark
brand_sidebar_minimized.png 128 Ã 128 Compact sidebar mark
Use transparent PNGs for all logos. Do not leave unused transparent padding around the sidebar
logos because Android sizes the view from the complete PNG canvas.
Copy them to:
Code:
res/drawable-nodpi/brand_app_background.png
res/drawable-nodpi/brand_empty_logo.png
res/drawable-nodpi/brand_sidebar_expanded.png
res/drawable-nodpi/brand_sidebar_minimized.png
Create res/drawable-nodpi if it does not exist. drawable-nodpi prevents Android from scaling a
PNG a second time according to device density.
3. Replace the application background
Open:
Code:
res/values/styles.xml
Find the MainActivity theme:
XML:
<style name="APKTOOL_RENAMED_0x7f1403f0" parent="@style/APKTOOL_RENAMED_0x7f1403eb">
<item name="android:windowBackground">@android:color/black</item>
</style>
Replace it with:
XML:
<style name="APKTOOL_RENAMED_0x7f1403f0" parent="@style/APKTOOL_RENAMED_0x7f1403eb">
<item name="android:windowBackground">@drawable/brand_app_background</item>
</style>
This is the background of MainActivity. Normal TiviMate content surfaces, cards, player video and
opaque settings panels continue to cover it, which is intentional.
To guarantee that the image is also behind the no-playlist/live layout, open:
Code:
res/layout/APKTOOL_RENAMED_0x7f0e0058.xml
Add this attribute to its root ConstraintLayout:
XML:
android:background="@drawable/brand_app_background"
Do not add the image as an ImageView above the content. That can intercept focus or cover
fragments.
4. Replace the large no-playlist logo
The APK already uses this drawable for the large empty-state wordmark:
Code:
res/drawable/empty_state_tivimate_wordmark.xml
Delete that XML file. Copy brand_empty_logo.png to the same resource name:
Code:
res/drawable-nodpi/empty_state_tivimate_wordmark.png
Do not keep both empty_state_tivimate_wordmark.xml and
empty_state_tivimate_wordmark.png; Apktool will report a duplicate resource.
The existing view in APKTOOL_RENAMED_0x7f0e0058.xml is already correctly positioned:
XML:
android:id="@id/APKTOOL_RENAMED_0x7f0b03fc"
android:background="@drawable/empty_state_tivimate_wordmark"
android:layout_width="219.0dp"
android:layout_height="41.0dp"
Change the 219dp à 41dp dimensions only if the replacement has a substantially different aspect
ratio. Preserve its constraints and ID.
5. Replace the expanded and minimized sidebar logos
Open:
Code:
res/layout/APKTOOL_RENAMED_0x7f0e001c.xml
Find the ConstraintLayout with:
XML:
android:id="@id/logo"
Replace that complete ConstraintLayout block with:
XML:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24.0dp"
android:layout_marginStart="12.0dp">
<!-- Expanded wordmark. MainActivity finds this exact existing ID. -->
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0228"
android:layout_width="176.0dp"
android:layout_height="32.0dp"
android:src="@drawable/brand_sidebar_expanded"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
<!-- Minimized mark. MainActivity already retains this existing ID. -->
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0229"
android:visibility="gone"
android:layout_width="32.0dp"
android:layout_height="32.0dp"
android:src="@drawable/brand_sidebar_minimized"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
<!-- Required by the generated view binding. Never remove these IDs. -->
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0225"
android:layout_width="1.0dp"
android:layout_height="1.0dp"
android:src="@android:color/transparent"
android:alpha="0.0" />
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0226"
android:layout_width="1.0dp"
android:layout_height="1.0dp"
android:src="@android:color/transparent"
android:alpha="0.0" />
<ImageView
android:id="@id/APKTOOL_RENAMED_0x7f0b0227"
android:layout_width="1.0dp"
android:layout_height="1.0dp"
android:src="@android:color/transparent"
android:alpha="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
The three transparent views are required. Removing them crashes layout inflation because generated
binding class LËËáĩˇË; explicitly looks up all five original IDs.
6. Patch the sidebar state Smali
Open:
Code:
smali_classes15/ar/tvplayer/tv/ui/MainActivity.smali
Find:
Smali:
.method public final ËĘáĩĒ(ZZ)V
Within that method, find this block near :cond_4:
Smali:
:cond_4
const/16 v6, 0x12a
invoke-virtual {v9, v10}, Landroid/view/View;->setVisibility(I)V
goto :goto_4
Insert the following code between setVisibility(I)V and goto :goto_4:
Smali:
# PNG branding: v8 == true means the sidebar is minimized.
invoke-virtual {p0}, Lar/tvplayer/tv/ui/MainActivity;->Ëáĩ()LáĩáĩĢ;
move-result-object v9
iget-object v9, v9, LáĩáĩĢ;->ËË:Landroidx/constraintlayout/widget/ConstraintLayout;
const v11, 0x7f0b0228
invoke-virtual {v9, v11}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v9
check-cast v9, Landroid/widget/ImageView;
if-eqz v8, :ian_branding_expanded
# Minimized: hide expanded PNG.
const/16 v11, 0x8
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
invoke-virtual {p0}, Lar/tvplayer/tv/ui/MainActivity;->Ëáĩ()LáĩáĩĢ;
move-result-object v9
iget-object v9, v9, LáĩáĩĢ;->áĩáĩļ:Landroid/widget/ImageView;
const/4 v11, 0x0
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
goto :ian_branding_done
:ian_branding_expanded
# Expanded: show expanded PNG.
const/4 v11, 0x0
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
invoke-virtual {p0}, Lar/tvplayer/tv/ui/MainActivity;->Ëáĩ()LáĩáĩĢ;
move-result-object v9
iget-object v9, v9, LáĩáĩĢ;->áĩáĩļ:Landroid/widget/ImageView;
const/16 v11, 0x8
invoke-virtual {v9, v11}, Landroid/view/View;->setVisibility(I)V
:ian_branding_done
Do not change .locals 13; registers v9 and v11 already exist within that method. Do not put
this code at :goto_4, because the p1 != 0 path can reach :goto_4 before v8 has been assigned.
7. Optional launcher and Android TV banner
These do not affect the in-app logos:
Code:
res/mipmap-*/ic_launcher.png
res/mipmap-*/ic_launcher_round.png
res/mipmap-xhdpi/banner.png
Replace every density variant if changing the launcher icon. Android TV banner artwork should use
a 320 Ã 180 or equivalent 16:9 PNG.
8. Build, align and sign
9. Test
đ
reggiefitz
Similar Threads
8 months ago
901
8 months ago
555
8 months ago
598
8 months ago
496
8 months ago
544