code: package com.lody.virtual.server.notification;
  
  import android.app.Notification;
  import android.content.Context;
  import android.content.pm.PackageInfo;
  import android.content.pm.PackageManager;
  import android.os.Build;
  import android.widget.RemoteViews;
  
  import com.lody.virtual.client.core.VirtualCore;
  
  import java.lang.reflect.Field;
  import java.lang.reflect.Modifier;
  import java.util.ArrayList;
  import java.util.List;
  
  import mirror.com.android.internal.R_Hide;
  
  /**
   * @author 247321453
   */
  public abstract class NotificationCompat {
  
      public static final String EXTRA_TITLE = "android.title";
      public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
      public static final String EXTRA_TEXT = "android.text";
      public static final String EXTRA_SUB_TEXT = "android.subText";
      public static final String EXTRA_INFO_TEXT = "android.infoText";
      public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
      public static final String EXTRA_BIG_TEXT = "android.bigText";
      public static final String EXTRA_PROGRESS = "android.progress";
      public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
      public static final String EXTRA_BUILDER_APPLICATION_INFO = "android.appInfo";
      static final String TAG = NotificationCompat.class.getSimpleName();
      static final String SYSTEM_UI_PKG = "com.android.systemui";
      private final List<Integer> sSystemLayoutResIds = new ArrayList<>(10);
      private NotificationFixer mNotificationFixer;
  
      NotificationCompat() {
          loadSystemLayoutRes();
          mNotificationFixer = new NotificationFixer(this);
      }
  
      public static NotificationCompat create() {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              return new NotificationCompatCompatV21();
          } else {
              return new NotificationCompatCompatV14();
          }
      }
  
      private void loadSystemLayoutRes() {
          Field[] fields = R_Hide.layout.TYPE.getFields();
          for (Field field : fields) {
              if (Modifier.isStatic(field.getModifiers())
                      && Modifier.isFinal(field.getModifiers())) {
                  try {
                      int id = field.getInt(null);
                      sSystemLayoutResIds.add(id);
                  } catch (Throwable e) {
                      // ignore
                  }
              }
          }
      }
  
      NotificationFixer getNotificationFixer() {
          return mNotificationFixer;
      }
  
      boolean isSystemLayout(RemoteViews remoteViews) {
          return remoteViews != null
                  && sSystemLayoutResIds.contains(remoteViews.getLayoutId());
      }
  
      public Context getHostContext() {
          return VirtualCore.get().getContext();
      }
  
      PackageInfo getPackageInfo(String packageName) {
          try {
              return VirtualCore.get().getUnHookPackageManager().getPackageInfo(packageName, 0);
          } catch (PackageManager.NameNotFoundException e) {
              // ignore
          }
          return null;
      }
  
      public abstract boolean dealNotification(int id, Notification notification, String packageName);
  }
  