diff --git a/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
index 94adc5d..ecc1a07 100644
--- a/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
+++ b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
@@ -4,14 +4,21 @@
 import android.content.Context;
 import android.content.Intent;
 import android.util.Log;
+import android.media.AudioManager;
 import android.media.AudioSystem;
 import android.os.IBinder;
+import android.os.UEventObserver;
+import android.os.SystemProperties;
 
 import vendor.qti.hardware.radio.am.V1_0.IQcRilAudioCallback;
 import vendor.qti.hardware.radio.am.V1_0.IQcRilAudio;
 
 public class Service extends android.app.Service {
+	AudioManager audioManager;
 	@Override public void onCreate() {
+		String fp = SystemProperties.get("ro.vendor.build.fingerprint", "nothing");
+		audioManager = getSystemService(AudioManager.class);
+
 		new java.lang.Thread() {
 			@Override
 			public void run() {
@@ -25,37 +32,67 @@
 				} catch(Exception e) {
 					android.util.Log.d("PHH", "Failed setting callback", e);
 				}
-			}
-		}.start();
-	}
+                if(fp.contains("OnePlus6")) {
+                    try {
+                        (new UEventObserver() {
+                            @Override
+                            public void onUEvent(UEventObserver.UEvent event) {
+                                try {
+                                    android.util.Log.v("PHH", "USB UEVENT: " + event.toString());
+                                    String state = event.get("STATE");
 
-	IQcRilAudio service;
-	IQcRilAudioCallback cb = new IQcRilAudioCallback.Stub() {
-		@Override
-		public String getParameters(String parameter) {
-			android.util.Log.d("PHH", "Got getParameters " + parameter);
-			try {
-				return AudioSystem.getParameters(parameter);
-			} catch(Exception e) { 
-				android.util.Log.d("PHH", "Failed getting parameters");
-			}
-			return "";
-		}
+                                    boolean ringing = state.contains("USB=0");
+                                    boolean silent = state.contains("(null)=0");
+                                    boolean vibrate = state.contains("USB_HOST=0");
+                                    android.util.Log.v("PHH", "Got ringing = " + ringing + ", silent = " + silent + ", vibrate = " + vibrate);
+                                    if(ringing && !silent && !vibrate)
+                                        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+                                    if(silent && !ringing && !vibrate)
+                                        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
+                                    if(vibrate && !silent && !ringing)
+                                        audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
+                                } catch(Exception e) {
+                                    android.util.Log.d("PHH", "Failed parsing uevent", e);
+                                }
 
-		@Override
-		public int setParameters(String parameters) {
-			android.util.Log.d("PHH", "Got setParameters " + parameters);
-			try {
-				AudioSystem.setParameters(parameters);
-			} catch(Exception e) { 
-				android.util.Log.d("PHH", "Failed setting parameters");
-			}
-			return 0;
-		}
-	};
+                            }
+                        }).startObserving("DEVPATH=/devices/platform/soc/soc:tri_state_key");
+                    } catch(Exception e) {
+                        android.util.Log.d("PHH", "Failed setting UEventObserver", e);
+                    }
+                }
 
-	@Override
-	public IBinder onBind(Intent intent) {
-		return null;
-	}
+            }
+        }.start();
+    }
+
+    IQcRilAudio service;
+    IQcRilAudioCallback cb = new IQcRilAudioCallback.Stub() {
+        @Override
+        public String getParameters(String parameter) {
+            android.util.Log.d("PHH", "Got getParameters " + parameter);
+            try {
+                return AudioSystem.getParameters(parameter);
+            } catch(Exception e) {
+                android.util.Log.d("PHH", "Failed getting parameters");
+            }
+            return "";
+        }
+
+        @Override
+        public int setParameters(String parameters) {
+            android.util.Log.d("PHH", "Got setParameters " + parameters);
+            try {
+                AudioSystem.setParameters(parameters);
+            } catch(Exception e) {
+                android.util.Log.d("PHH", "Failed setting parameters");
+            }
+            return 0;
+        }
+    };
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
 }
