VIP
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
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
Similar Threads
8 months ago
753
8 months ago
902
8 months ago
433
8 months ago
557
8 months ago
398