Home Add A How To Hide QR Code from TiviMate 5.3.3 Mod
TUTORIAL

Hide QR Code from TiviMate 5.3.3 Mod

2 hours ago
5 views
Avatar
93
Posts
134
Likes
Achievements
Annual Supporter3-Month SupporterVIP ClubPopularLikedRegularNewcomerFirst Step
Thread Post Aug 13, 2026 at 7:03 PM
This guide applies specifically to the 'Ian Mod' of TiviMate 5.3.3

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.)

These tweaks are to remove the QR code from the Service selection activity:

It's worth noting that this was added as a QoL feature to the mod and runs locally on the users network so if you are having issues and this is why you want it removed then try these steps:
- Connect your phone/device to the same Wifi as the device the TiviMate app is running on.
- If using an Emulator, click the link to copy and paste it into the Emulators Browser (the emulators use their own fake network which your phone/device wont be on.)

However if you do wish to remove it then, feel free to continue:

1. Open the APK
Using either MT Manager or APKTool:

Code:

apktool d -f "TiviMate_5.3.3.apk" -o tivimate_hide_qr


Create this directory:
Code:

classes21/com/ian/qr


2. Add the startup provider
Create:
Code:
classes21/com/ian/qr/QrVisibilityInitProvider.smali

Paste:

Smali:

.class public final Lcom/ian/qr/QrVisibilityInitProvider;
.super Landroid/content/ContentProvider;
.source "QrVisibilityInitProvider.java"

.method public constructor <init>()V
.locals 0

invoke-direct {p0}, Landroid/content/ContentProvider;-><init>()V

return-void
.end method

.method public onCreate()Z
.locals 2

invoke-virtual {p0}, Landroid/content/ContentProvider;->getContext()Landroid/content/Context;

move-result-object v0

invoke-virtual {v0}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;

move-result-object v0

check-cast v0, Landroid/app/Application;

new-instance v1, Lcom/ian/qr/QrVisibilityCallbacks;

invoke-direct {v1}, Lcom/ian/qr/QrVisibilityCallbacks;-><init>()V

invoke-virtual {v0, v1}, Landroid/app/Application;->registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks😉V

const/4 v0, 0x1

return v0
.end method

.method public query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String😉Landroid/database/Cursor;
.locals 1

const/4 v0, 0x0

return-object v0
.end method

.method public getType(Landroid/net/Uri😉Ljava/lang/String;
.locals 1

const/4 v0, 0x0

return-object v0
.end method

.method public insert(Landroid/net/Uri;Landroid/content/ContentValues😉Landroid/net/Uri;
.locals 1

const/4 v0, 0x0

return-object v0
.end method

.method public delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String😉I
.locals 1

const/4 v0, 0x0

return v0
.end method

.method public update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String😉I
.locals 1

const/4 v0, 0x0

return v0
.end method


3. Add the activity callback
Create:

Code:

classes21/com/ian/qr/QrVisibilityCallbacks.smali


Paste:

Smali:

.class public final Lcom/ian/qr/QrVisibilityCallbacks;
.super Ljava/lang/Object;
.implements Landroid/app/Application$ActivityLifecycleCallbacks;
.source "QrVisibilityCallbacks.java"

.method public constructor <init>()V
.locals 0

invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void
.end method

.method public onActivityResumed(Landroid/app/Activity😉V
.locals 0

invoke-static {p1}, Lcom/ian/qr/QrVisibilitySuppressor;->watch(Landroid/app/Activity😉V

return-void
.end method

.method public onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle😉V
.locals 0
return-void
.end method

.method public onActivityStarted(Landroid/app/Activity😉V
.locals 0
return-void
.end method

.method public onActivityPaused(Landroid/app/Activity😉V
.locals 0
return-void
.end method

.method public onActivityStopped(Landroid/app/Activity😉V
.locals 0
return-void
.end method

.method public onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle😉V
.locals 0
return-void
.end method

.method public onActivityDestroyed(Landroid/app/Activity😉V
.locals 0
return-void
.end method


4. Add the QR suppressor
Create:

Code:

classes21/com/ian/qr/QrVisibilitySuppressor.smali


Paste:
Smali:

.class public final Lcom/ian/qr/QrVisibilitySuppressor;
.super Ljava/lang/Object;
.source "QrVisibilitySuppressor.java"

.method private constructor <init>()V
.locals 0

invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void
.end method

.method public static watch(Landroid/app/Activity😉V
.locals 2

new-instance v0, Ljava/lang/ref/WeakReference;

invoke-direct {v0, p0}, Ljava/lang/ref/WeakReference;-><init>(Ljava/lang/Object😉V

const/4 v1, 0x0

invoke-static {v0, v1}, Lcom/ian/qr/QrVisibilitySuppressor;->suppress(Ljava/lang/ref/WeakReference;I)V

return-void
.end method

.method public static suppress(Ljava/lang/ref/WeakReference;I)V
.locals 6

invoke-virtual {p0}, Ljava/lang/ref/Reference;->get()Ljava/lang/Object;

move-result-object v0

check-cast v0, Landroid/app/Activity;

if-eqz v0, :return

invoke-virtual {v0}, Landroid/app/Activity;->isFinishing()Z

move-result v1

if-nez v1, :return

const v1, 0x514010

invoke-virtual {v0, v1}, Landroid/app/Activity;->findViewById(I)Landroid/view/View;

move-result-object v0

if-nez v0, :hide

const/16 v1, 0x14

if-ge p1, v1, :return

new-instance v1, Landroid/os/Handler;

invoke-static {}, Landroid/os/Looper;->getMainLooper()Landroid/os/Looper;

move-result-object v2

invoke-direct {v1, v2}, Landroid/os/Handler;-><init>(Landroid/os/Looper😉V

new-instance v2, Lcom/ian/qr/QrVisibilityRetry;

add-int/lit8 v3, p1, 0x1

invoke-direct {v2, p0, v3}, Lcom/ian/qr/QrVisibilityRetry;-><init>(Ljava/lang/ref/WeakReference;I)V

const-wide/16 v3, 0x32

invoke-virtual {v1, v2, v3, v4}, Landroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z

return-void

:hide
const/4 v1, 0x0

invoke-virtual {v0, v1}, Landroid/view/View;->setAlpha(F)V

const/4 v2, 0x0

invoke-virtual {v0, v2}, Landroid/view/View;->setFocusable(Z)V

invoke-virtual {v0, v2}, Landroid/view/View;->setFocusableInTouchMode(Z)V

invoke-virtual {v0, v2}, Landroid/view/View;->setClickable(Z)V

const/4 v2, 0x4

invoke-virtual {v0, v2}, Landroid/view/View;->setImportantForAccessibility(I)V

invoke-virtual {v0}, Landroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams;

move-result-object v2

if-eqz v2, :return

const/4 v3, 0x1

iput v3, v2, Landroid/view/ViewGroup$LayoutParams;->width:I

iput v3, v2, Landroid/view/ViewGroup$LayoutParams;->height:I

invoke-virtual {v0, v2}, Landroid/view/View;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams😉V

:return
return-void
.end method

The app recreates the QR panel asynchronously so this leaves the expected view present but makes it transparent, non-focusable, non-clickable and 1 × 1 pixel.
(Hidden basically...)

5. Add the retry runnable
Create:

Code:

classes21/com/ian/qr/QrVisibilityRetry.smali

Smali:

.class public final Lcom/ian/qr/QrVisibilityRetry;
.super Ljava/lang/Object;
.implements Ljava/lang/Runnable;
.source "QrVisibilityRetry.java"

.field private final reference:Ljava/lang/ref/WeakReference;
.field private final attempt:I

.method public constructor <init>(Ljava/lang/ref/WeakReference;I)V
.locals 0

invoke-direct {p0}, Ljava/lang/Object;-><init>()V

iput-object p1, p0, Lcom/ian/qr/QrVisibilityRetry;->reference:Ljava/lang/ref/WeakReference;

iput p2, p0, Lcom/ian/qr/QrVisibilityRetry;->attempt:I

return-void
.end method

.method public run()V
.locals 2

iget-object v0, p0, Lcom/ian/qr/QrVisibilityRetry;->reference:Ljava/lang/ref/WeakReference;

iget v1, p0, Lcom/ian/qr/QrVisibilityRetry;->attempt:I

invoke-static {v0, v1}, Lcom/ian/qr/QrVisibilitySuppressor;->suppress(Ljava/lang/ref/WeakReference;I)V

return-void
.end method

6. Register the provider
Open:

Code:

AndroidManifest.xml


Inside the existing <application> element, add:

XML:

<provider
android:name="com.ian.qr.QrVisibilityInitProvider"
android:authorities="ar.tvplayer.tv.qrvisibilityinit"
android:exported="false"
android:initOrder="100" />


Do not add a second <application> element. If the package ID was changed from ar.tvplayer.tv, change the authority to YOUR.PACKAGE.NAME.qrvisibilityinit.

7. Build, align and sign
8. Test


Do not add a second <application> element. If the package ID was changed from ar.tvplayer.tv, change the authority to YOUR.PACKAGE.NAME.qrvisibilityinit.

7. Build, align and sign
8. Test

Clear the app data or uninstall the old build, install the signed APK, then open Add playlist → Services.

Confirm that:

The QR panel is not visible.
Focus remains on the service list.
Opening a service and returning does not reveal the QR panel.
The Services screen does not crash.

Do not delete the QR container from XML and do not remove its required view ID. Either change can crash the protected controller or generated view binding