Add A How To

'Ian Mod' of TiviMate 5.3.3 **apk included**

August 12, 2026
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

Project Assets

Securely access the files for this release.

Download Files