mirror of https://github.com/termux/termux-app
92 lines
3.5 KiB
Java
92 lines
3.5 KiB
Java
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.command.environment.TermuxShellEnvironment;
|
|
import com.termux.shared.termux.shell.TermuxShellManager;
|
|
|
|
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());
|
|
}
|
|
|
|
}
|