content: package com.termux.app.event;
  
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.net.Uri;
  import androidx.annotation.NonNull;
  import androidx.annotation.Nullable;
  import com.termux.shared.data.IntentUtils;
  import com.termux.shared.logger.Logger;
  import com.termux.shared.termux.TermuxUtils;
  import com.termux.shared.termux.file.TermuxFileUtils;
  import com.termux.shared.termux.shell.TermuxShellManager;
  import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment;
  
  public class SystemEventReceiver extends BroadcastReceiver {
  
    private static SystemEventReceiver mInstance;
  
    private static final String LOG_TAG = "SystemEventReceiver";
  
    public static synchronized SystemEventReceiver getInstance() {
      if (mInstance == null) {
        mInstance = new SystemEventReceiver();
      }
      return mInstance;
    }
  
    @Override
    public void onReceive(@NonNull Context context, @Nullable Intent intent) {
      if (intent == null) return;
      Logger.logDebug(LOG_TAG, "Intent Received:\n" + IntentUtils.getIntentString(intent));
  
      String action = intent.getAction();
      if (action == null) return;
  
      switch (action) {
        case Intent.ACTION_BOOT_COMPLETED:
          onActionBootCompleted(context, intent);
          break;
        case Intent.ACTION_PACKAGE_ADDED:
        case Intent.ACTION_PACKAGE_REMOVED:
        case Intent.ACTION_PACKAGE_REPLACED:
          onActionPackageUpdated(context, intent);
          break;
        default:
          Logger.logError(LOG_TAG, "Invalid action \"" + action + "\" passed to " + LOG_TAG);
      }
    }
  
    public synchronized void onActionBootCompleted(@NonNull Context context, @NonNull Intent intent) {
      TermuxShellManager.onActionBootCompleted(context, intent);
    }
  
    public synchronized void onActionPackageUpdated(@NonNull Context context, @NonNull Intent intent) {
      Uri data = intent.getData();
      if (data != null && TermuxUtils.isUriDataForTermuxPluginPackage(data)) {
        Logger.logDebug(LOG_TAG, intent.getAction().replaceAll("^android.intent.action.", "") +
            " event received for \"" + data.toString().replaceAll("^package:", "") + "\"");
        if (TermuxFileUtils.isTermuxFilesDirectoryAccessible(context, false, false) == null)
          TermuxShellEnvironment.writeEnvironmentToFile(context);
      }
    }
  
  
  
    /**
     * Register {@link SystemEventReceiver} to listen to {@link Intent#ACTION_PACKAGE_ADDED},
     * {@link Intent#ACTION_PACKAGE_REMOVED} and {@link Intent#ACTION_PACKAGE_REPLACED} broadcasts.
     * They must be registered dynamically and cannot be registered implicitly in
     * the AndroidManifest.xml due to Android 8+ restrictions.
     *
     *  https://developer.android.com/guide/components/broadcast-exceptions
     */
    public synchronized static void registerPackageUpdateEvents(@NonNull Context context) {
      IntentFilter intentFilter = new IntentFilter();
      intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
      intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
      intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
      intentFilter.addDataScheme("package");
      context.registerReceiver(getInstance(), intentFilter);
    }
  
    public synchronized static void unregisterPackageUpdateEvents(@NonNull Context context) {
      context.unregisterReceiver(getInstance());
    }
  
  }