diff --git a/src/com/android/permissioncontroller/permission/ui/handheld/ReviewOngoingUsageFragment.java b/src/com/android/permissioncontroller/permission/ui/handheld/ReviewOngoingUsageFragment.java
index 41f3f45..c7b7263 100644
--- a/src/com/android/permissioncontroller/permission/ui/handheld/ReviewOngoingUsageFragment.java
+++ b/src/com/android/permissioncontroller/permission/ui/handheld/ReviewOngoingUsageFragment.java
@@ -26,9 +26,12 @@
 import static com.android.permissioncontroller.permission.debug.UtilsKt.shouldShowPermissionsDashboard;
 
 import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.location.LocationManager;
+import android.media.AudioManager;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.text.Html;
@@ -74,6 +77,7 @@
     static final String PHONE_CALL = "android:phone_call_microphone";
     static final String VIDEO_CALL = "android:phone_call_camera";
 
+    private AudioManager mAudioManager;
     private @NonNull PermissionUsages mPermissionUsages;
     private boolean mPermissionUsagesLoaded;
     private @Nullable AlertDialog mDialog;
@@ -82,6 +86,13 @@
     private ArraySet<String> mSystemUsage = new ArraySet<>(0);
     private long mStartTime;
 
+    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            onPermissionUsagesLoaded();
+        }
+    };
+
     /**
      * @return A new {@link ReviewOngoingUsageFragment}
      */
@@ -99,6 +110,9 @@
 
         long numMillis = getArguments().getLong(Intent.EXTRA_DURATION_MILLIS);
 
+        mAudioManager = getContext().getSystemService(AudioManager.class);
+        getContext().registerReceiver(mReceiver,
+                new IntentFilter(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED));
         mPermissionUsages = new PermissionUsages(getActivity());
         mStartTime = Math.max(System.currentTimeMillis() - numMillis, Instant.EPOCH.toEpochMilli());
         String[] permissions = new String[]{CAMERA, MICROPHONE};
@@ -188,14 +202,18 @@
     }
 
     private void showDialog(@NonNull List<Pair<AppPermissionUsage, List<GroupUsage>>> usages) {
-        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
-                .setView(createDialogView(usages))
-                .setPositiveButton(R.string.ongoing_usage_dialog_ok, (dialog, which) ->
-                        PermissionControllerStatsLog.write(PRIVACY_INDICATORS_INTERACTED,
-                                PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_DISMISS))
-                .setOnDismissListener((dialog) -> getActivity().finish());
-        mDialog = builder.create();
-        mDialog.show();
+        if (mDialog == null || !mDialog.isShowing()) {
+            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+                    .setView(createDialogView(usages))
+                    .setPositiveButton(R.string.ongoing_usage_dialog_ok, (dialog, which) ->
+                            PermissionControllerStatsLog.write(PRIVACY_INDICATORS_INTERACTED,
+                                    PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_DISMISS))
+                    .setOnDismissListener((dialog) -> getActivity().finish());
+            mDialog = builder.create();
+            mDialog.show();
+        } else {
+            mDialog.setView(createDialogView(usages));
+        }
     }
 
     /**
@@ -251,6 +269,9 @@
             int numGroups = groups.size();
             for (int groupNum = 0; groupNum < numGroups; groupNum++) {
                 AppPermissionGroup group = groups.get(groupNum).getGroup();
+                if (group.getName().equals(MICROPHONE) && mAudioManager.isMicrophoneMute()) {
+                    continue;
+                }
                 usedGroups.put(group.getName(), group.getLabel());
             }
         }
@@ -283,35 +304,42 @@
         }
 
         if (!mOpUsage.isEmpty()) {
-            if (mOpUsage.containsKey(VIDEO_CALL) && mOpUsage.containsKey(
-                    PHONE_CALL)) {
+            boolean hasVideo = mOpUsage.containsKey(VIDEO_CALL);
+            boolean hasPhone = mOpUsage.containsKey(PHONE_CALL)
+                    && !mAudioManager.isMicrophoneMute();
+            if (hasVideo && hasPhone) {
                 otherUseContent.setText(
                         Html.fromHtml(getString(R.string.phone_call_uses_microphone_and_camera),
                                 0));
-            } else if (mOpUsage.containsKey(VIDEO_CALL)) {
+            } else if (hasVideo && mAudioManager.isMicrophoneMute()) {
                 otherUseContent.setText(
                         Html.fromHtml(getString(R.string.phone_call_uses_camera), 0));
-            } else if (mOpUsage.containsKey(PHONE_CALL)) {
+            } else if (hasPhone) {
                 otherUseContent.setText(
                         Html.fromHtml(getString(R.string.phone_call_uses_microphone), 0));
             }
 
-            if (mOpUsage.containsKey(VIDEO_CALL)) {
+            if (hasVideo) {
                 usedGroups.put(CAMERA, KotlinUtils.INSTANCE.getPermGroupLabel(context, CAMERA));
+                if (!mAudioManager.isMicrophoneMute()) {
+                    usedGroups.put(MICROPHONE,
+                            KotlinUtils.INSTANCE.getPermGroupLabel(context, MICROPHONE));
+                }
             }
 
-            if (mOpUsage.containsKey(PHONE_CALL)) {
+            if (hasPhone) {
                 usedGroups.put(MICROPHONE,
                         KotlinUtils.INSTANCE.getPermGroupLabel(context, MICROPHONE));
             }
         }
 
         if (!mSystemUsage.isEmpty()) {
-            if (mSystemUsage.contains(MICROPHONE) && mSystemUsage.contains(CAMERA)) {
+            if (mSystemUsage.contains(MICROPHONE) && mSystemUsage.contains(CAMERA)
+                    && !mAudioManager.isMicrophoneMute()) {
                 systemUseContent.setText(getString(R.string.system_uses_microphone_and_camera));
             } else if (mSystemUsage.contains(CAMERA)) {
                 systemUseContent.setText(getString(R.string.system_uses_camera));
-            } else if (mSystemUsage.contains(MICROPHONE) ) {
+            } else if (mSystemUsage.contains(MICROPHONE) && !mAudioManager.isMicrophoneMute()) {
                 systemUseContent.setText(getString(R.string.system_uses_microphone));
             }
 
@@ -326,6 +354,14 @@
             PermissionApp app = usage.first.getApp();
             List<GroupUsage> groups = usage.second;
 
+            // Check if this uses only mic permission. If the mic is muted, do not show
+            if (groups.size() == 1) {
+                if (groups.get(0).getGroup().getName().equals(MICROPHONE)
+                        && mAudioManager.isMicrophoneMute()) {
+                    continue;
+                }
+            }
+
             View itemView = inflater.inflate(R.layout.ongoing_usage_dialog_item, appsList, false);
 
             ((TextView) itemView.requireViewById(R.id.app_name)).setText(app.getLabel());
@@ -337,6 +373,9 @@
             int numGroups = usages.get(usageNum).second.size();
             for (int groupNum = 0; groupNum < numGroups; groupNum++) {
                 AppPermissionGroup group = groups.get(groupNum).getGroup();
+                if (mAudioManager.isMicrophoneMute() && group.getName().equals(MICROPHONE)) {
+                    continue;
+                }
 
                 ViewGroup groupView = (ViewGroup) inflater.inflate(R.layout.image_view, null);
                 ((ImageView) groupView.requireViewById(R.id.icon)).setImageDrawable(
@@ -379,4 +418,11 @@
     public void onCreatePreferences(Bundle bundle, String s) {
         // empty
     }
+
+    @Override
+    public void onDestroy() {
+        getContext().unregisterReceiver(mReceiver);
+        super.onDestroy();
+
+    }
 }
