From 7f7c1efac1af19badae86c39118903c4da383838 Mon Sep 17 00:00:00 2001 From: Archenoth Date: Mon, 2 Dec 2019 02:38:37 -0700 Subject: [PATCH] Add PendingIntent in TermuxService to return data from execution This commit adds an optional final argument to the BackgroundJob constructor for a PendingIntent to return the results of its execution to, and also attempts to pass an optional pendingIntent to it from the Service start intent --- .../java/com/termux/app/BackgroundJob.java | 67 ++++++++++++++----- .../java/com/termux/app/TermuxService.java | 2 +- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index 61e9ad23..2b1888aa 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -1,5 +1,9 @@ package com.termux.app; +import android.app.Activity; +import android.app.PendingIntent; +import android.content.Intent; +import android.os.Bundle; import android.util.Log; import java.io.BufferedReader; @@ -24,7 +28,11 @@ public final class BackgroundJob { final Process mProcess; - public BackgroundJob(String cwd, String fileToExecute, final String[] args, final TermuxService service) { + public BackgroundJob(String cwd, String fileToExecute, final String[] args, final TermuxService service){ + this(cwd, fileToExecute, args, service, null); + } + + public BackgroundJob(String cwd, String fileToExecute, final String[] args, final TermuxService service, PendingIntent pendingIntent) { String[] env = buildEnvironment(false, cwd); if (cwd == null) cwd = TermuxService.HOME_PATH; @@ -43,6 +51,28 @@ public final class BackgroundJob { mProcess = process; final int pid = getPid(mProcess); + final Bundle result = new Bundle(); + final StringBuilder outResult = new StringBuilder(); + final StringBuilder errResult = new StringBuilder(); + + Thread errThread = new Thread() { + @Override + public void run() { + InputStream stderr = mProcess.getErrorStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(stderr, StandardCharsets.UTF_8)); + String line; + try { + // FIXME: Long lines. + while ((line = reader.readLine()) != null) { + errResult.append(line).append('\n'); + Log.i(LOG_TAG, "[" + pid + "] stderr: " + line); + } + } catch (IOException e) { + // Ignore. + } + } + }; + errThread.start(); new Thread() { @Override @@ -50,11 +80,13 @@ public final class BackgroundJob { Log.i(LOG_TAG, "[" + pid + "] starting: " + processDescription); InputStream stdout = mProcess.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stdout, StandardCharsets.UTF_8)); + String line; try { // FIXME: Long lines. while ((line = reader.readLine()) != null) { Log.i(LOG_TAG, "[" + pid + "] stdout: " + line); + outResult.append(line).append('\n'); } } catch (IOException e) { Log.e(LOG_TAG, "Error reading output", e); @@ -68,26 +100,25 @@ public final class BackgroundJob { } else { Log.w(LOG_TAG, "[" + pid + "] exited with code: " + exitCode); } - } catch (InterruptedException e) { - // Ignore. - } - } - }.start(); + result.putString("stdout", outResult.toString()); + result.putInt("exitCode", exitCode); - new Thread() { - @Override - public void run() { - InputStream stderr = mProcess.getErrorStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(stderr, StandardCharsets.UTF_8)); - String line; - try { - // FIXME: Long lines. - while ((line = reader.readLine()) != null) { - Log.i(LOG_TAG, "[" + pid + "] stderr: " + line); + errThread.join(); + result.putString("stderr", errResult.toString()); + + Intent data = new Intent(); + data.putExtra("result", result); + + if(pendingIntent != null) { + try { + pendingIntent.send(service.getApplicationContext(), Activity.RESULT_OK, data); + } catch (PendingIntent.CanceledException e) { + // The caller doesn't want the result? That's fine, just ignore + } } - } catch (IOException e) { - // Ignore. + } catch (InterruptedException e) { + // Ignore } } }.start(); diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index b17643fe..bbaf87c5 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -148,7 +148,7 @@ public final class TermuxService extends Service implements SessionChangedCallba String cwd = intent.getStringExtra(EXTRA_CURRENT_WORKING_DIRECTORY); if (intent.getBooleanExtra(EXTRA_EXECUTE_IN_BACKGROUND, false)) { - BackgroundJob task = new BackgroundJob(cwd, executablePath, arguments, this); + BackgroundJob task = new BackgroundJob(cwd, executablePath, arguments, this, intent.getParcelableExtra("pendingIntent")); mBackgroundTasks.add(task); updateNotification(); } else {