这是indexloc提供的服务,不要输入任何密码
Skip to content

Commit 6f6ddd0

Browse files
Added: Add support for session action for foreground commands
Valid values are defined by `TermuxConstants.TERMUX_APP.TERMUX_SERVICE.VALUE_EXTRA_SESSION_ACTION_*`, currently, between `0` and `3`. https://github.com/termux/termux-app/blob/v0.117/termux-shared/src/main/java/com/termux/shared/termux/TermuxConstants.java#L856
1 parent 49acd10 commit 6f6ddd0

File tree

5 files changed

+150
-40
lines changed

5 files changed

+150
-40
lines changed

app/src/main/java/com/termux/tasker/EditConfigurationActivity.java

Lines changed: 77 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.termux.shared.models.TextIOInfo;
1414
import com.termux.shared.models.errors.Error;
1515
import com.termux.shared.termux.TermuxConstants;
16+
import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_SERVICE;
1617
import com.termux.shared.file.FileUtils;
1718
import com.termux.shared.termux.TermuxUtils;
1819
import com.termux.tasker.utils.LoggerUtils;
@@ -34,6 +35,7 @@
3435
import android.widget.AutoCompleteTextView;
3536
import android.widget.CheckBox;
3637
import android.widget.CompoundButton;
38+
import android.widget.EditText;
3739
import android.widget.TextView;
3840

3941
import java.io.File;
@@ -61,6 +63,7 @@ public final class EditConfigurationActivity extends AbstractPluginActivity {
6163
private TextInputLayout mWorkingDirectoryPathTextLayout;
6264
private AutoCompleteTextView mWorkingDirectoryPathText;
6365
private TextView mStdinView;
66+
private EditText mSessionAction;
6467
private CheckBox mInTerminalCheckbox;
6568
private CheckBox mWaitForResult;
6669
private TextView mExecutableAbsolutePathText;
@@ -109,6 +112,7 @@ protected void onCreate(final Bundle savedInstanceState) {
109112
mWorkingDirectoryPathTextLayout = findViewById(R.id.layout_working_directory_path);
110113
mWorkingDirectoryPathText = findViewById(R.id.working_directory_path);
111114
mStdinView = findViewById(R.id.view_stdin);
115+
mSessionAction = findViewById(R.id.session_action);
112116
mInTerminalCheckbox = findViewById(R.id.in_terminal);
113117
mWaitForResult = findViewById(R.id.wait_for_result);
114118
mExecutableAbsolutePathText = findViewById(R.id.executable_absolute_path);
@@ -121,6 +125,7 @@ protected void onCreate(final Bundle savedInstanceState) {
121125
setExecutionPathViews();
122126
setWorkingDirectoryPathViews();
123127
setStdinView();
128+
setSessionActionViews();
124129
setInTerminalView();
125130

126131
// Currently savedInstanceState bundle is not supported
@@ -154,6 +159,11 @@ protected void onCreate(final Bundle savedInstanceState) {
154159
updateStdinViewText();
155160
updateStdinViewVisibility(inTerminal);
156161

162+
final String sessionAction = localeBundle.getString(PluginBundleManager.EXTRA_SESSION_ACTION);
163+
mSessionAction.setText(sessionAction);
164+
processSessionAction(sessionAction);
165+
updateSessionActionViewVisibility(inTerminal);
166+
157167
final boolean waitForResult = localeBundle.getBoolean(PluginBundleManager.EXTRA_WAIT_FOR_RESULT);
158168
mWaitForResult.setChecked(waitForResult);
159169
}
@@ -192,13 +202,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
192202

193203

194204
private void setExecutionPathViews() {
195-
mExecutablePathText.addTextChangedListener(new TextWatcher() {
196-
@Override
197-
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
198-
199-
@Override
200-
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
201-
205+
mExecutablePathText.addTextChangedListener(new AfterTextChangedWatcher() {
202206
@Override
203207
public void afterTextChanged(Editable editable) {
204208
processExecutablePath(editable == null ? null : editable.toString());
@@ -211,13 +215,7 @@ public void afterTextChanged(Editable editable) {
211215

212216

213217
private void setWorkingDirectoryPathViews() {
214-
mWorkingDirectoryPathText.addTextChangedListener(new TextWatcher() {
215-
@Override
216-
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
217-
218-
@Override
219-
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
220-
218+
mWorkingDirectoryPathText.addTextChangedListener(new AfterTextChangedWatcher() {
221219
@Override
222220
public void afterTextChanged(Editable editable) {
223221
processWorkingDirectoryPath(editable == null ? null : editable.toString());
@@ -263,10 +261,22 @@ private void updateStdinViewText() {
263261

264262
private void updateStdinViewVisibility(boolean inTerminal) {
265263
if (mStdinView == null) return;
266-
if (inTerminal)
267-
mStdinView.setVisibility(View.GONE);
268-
else
269-
mStdinView.setVisibility(View.VISIBLE);
264+
mStdinView.setVisibility(inTerminal ? View.GONE : View.VISIBLE);
265+
}
266+
267+
268+
private void setSessionActionViews() {
269+
mSessionAction.addTextChangedListener(new AfterTextChangedWatcher() {
270+
@Override
271+
public void afterTextChanged(Editable editable) {
272+
processSessionAction(editable == null ? null : editable.toString());
273+
}
274+
});
275+
}
276+
277+
private void updateSessionActionViewVisibility(boolean inTerminal) {
278+
if (mSessionAction == null) return;
279+
mSessionAction.setVisibility(inTerminal ? View.VISIBLE : View.GONE);
270280
}
271281

272282

@@ -275,6 +285,7 @@ private void setInTerminalView() {
275285
@Override
276286
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
277287
updateStdinViewVisibility(isChecked);
288+
updateSessionActionViewVisibility(isChecked);
278289
}
279290
});
280291
}
@@ -566,6 +577,32 @@ else if (workingDirectoryPathText.startsWith("$PREFIX/") || workingDirectoryPath
566577
mWorkingDirectoryPathText.showDropDown();
567578
}
568579

580+
private void processSessionAction(String sessionActionString) {
581+
processIntFieldValue(mSessionAction, sessionActionString,
582+
TERMUX_SERVICE.MIN_VALUE_EXTRA_SESSION_ACTION, TERMUX_SERVICE.MAX_VALUE_EXTRA_SESSION_ACTION);
583+
}
584+
585+
private void processIntFieldValue(EditText editText, String stringValue, int min, int max) {
586+
if (editText == null) return;
587+
editText.setError(null);
588+
if (DataUtils.isNullOrEmpty(stringValue)) return;
589+
if (PluginUtils.isPluginHostAppVariableContainingString(stringValue)) return;
590+
591+
Integer value = null;
592+
boolean invalid = false;
593+
594+
try {
595+
value = Integer.parseInt(stringValue);
596+
}
597+
catch (Exception e) {
598+
invalid = true;
599+
}
600+
601+
if (invalid || value < min || value > max) {
602+
editText.setError(getString(R.string.error_int_not_in_range, min, max));
603+
}
604+
}
605+
569606

570607

571608

@@ -577,9 +614,10 @@ public void finish() {
577614
return;
578615
}
579616

580-
final String executable = mExecutablePathText.getText() == null ? null : mExecutablePathText.getText().toString();
581-
final String arguments = mArgumentsText.getText() == null ? null : mArgumentsText.getText().toString();
582-
final String workingDirectory = mWorkingDirectoryPathText.getText() == null ? null : mWorkingDirectoryPathText.getText().toString();
617+
final String executable = DataUtils.getDefaultIfUnset(mExecutablePathText.getText() == null ? null : mExecutablePathText.getText().toString(), null);
618+
final String arguments = DataUtils.getDefaultIfUnset(mArgumentsText.getText() == null ? null : mArgumentsText.getText().toString(), null);
619+
final String workingDirectory = DataUtils.getDefaultIfUnset(mWorkingDirectoryPathText.getText() == null ? null : mWorkingDirectoryPathText.getText().toString(), null);
620+
final String sessionAction = DataUtils.getDefaultIfUnset(mSessionAction.getText() == null ? null : mSessionAction.getText().toString(), null);
583621
final boolean inTerminal = mInTerminalCheckbox.isChecked();
584622
final boolean waitForResult = mWaitForResult.isChecked();
585623

@@ -599,7 +637,7 @@ public void finish() {
599637
* stored in the Bundle, as Locale's classloader will not recognize it).
600638
*/
601639
final Bundle resultBundle = PluginBundleManager.generateBundle(getApplicationContext(),
602-
executable, arguments, workingDirectory, mStdin, inTerminal, waitForResult);
640+
executable, arguments, workingDirectory, mStdin, sessionAction, inTerminal, waitForResult);
603641
if (resultBundle == null) {
604642
Logger.showToast(this, getString(R.string.error_generate_plugin_bundle_failed), true);
605643
setResult(RESULT_CODE_FAILED, resultIntent);
@@ -610,7 +648,8 @@ public void finish() {
610648
Logger.logDebug(LOG_TAG, "Result bundle size: " + PluginBundleManager.getBundleSize(resultBundle));
611649

612650
// The blurb is a concise status text to be displayed in the host's UI.
613-
final String blurb = PluginBundleManager.generateBlurb(this, executable, arguments, workingDirectory, mStdin, inTerminal, waitForResult);
651+
final String blurb = PluginBundleManager.generateBlurb(this, executable, arguments,
652+
workingDirectory, mStdin, sessionAction, inTerminal, waitForResult);
614653

615654
// If host supports variable replacement when running plugin action, then
616655
// request it to replace variables in following fields
@@ -619,7 +658,8 @@ public void finish() {
619658
PluginBundleManager.EXTRA_EXECUTABLE,
620659
PluginBundleManager.EXTRA_ARGUMENTS,
621660
PluginBundleManager.EXTRA_WORKDIR,
622-
PluginBundleManager.EXTRA_STDIN
661+
PluginBundleManager.EXTRA_STDIN,
662+
PluginBundleManager.EXTRA_SESSION_ACTION
623663
});
624664
}
625665

@@ -689,4 +729,17 @@ public void onActivityResult(ActivityResult result) {
689729
});
690730
}
691731

732+
733+
static class AfterTextChangedWatcher implements TextWatcher {
734+
@Override
735+
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
736+
737+
@Override
738+
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
739+
740+
@Override
741+
public void afterTextChanged(Editable editable) {
742+
}
743+
}
744+
692745
}

app/src/main/java/com/termux/tasker/FireReceiver.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ public void onReceive(final Context context, final Intent intent) {
7575
executionCommand.inBackground = !(intent.getBooleanExtra(PluginBundleManager.EXTRA_TERMINAL, false));
7676
final boolean waitForResult = bundle.getBoolean(PluginBundleManager.EXTRA_WAIT_FOR_RESULT, true);
7777

78-
if (executionCommand.inBackground)
78+
if (executionCommand.inBackground) {
7979
executionCommand.stdin = IntentUtils.getStringExtraIfSet(intent, PluginBundleManager.EXTRA_STDIN, null);
80-
80+
} else {
81+
executionCommand.sessionAction = IntentUtils.getStringExtraIfSet(intent, PluginBundleManager.EXTRA_SESSION_ACTION, null);
82+
}
8183

8284
// If Termux app is not installed, enabled or accessible with current context or if
8385
// TermuxConstants.TERMUX_PREFIX_DIR_PATH does not exist or has required permissions, then
@@ -184,6 +186,7 @@ public void onReceive(final Context context, final Intent intent) {
184186
if (executionCommand.workingDirectory != null && !executionCommand.workingDirectory.isEmpty())
185187
executionIntent.putExtra(TERMUX_SERVICE.EXTRA_WORKDIR, executionCommand.workingDirectory);
186188
executionIntent.putExtra(TERMUX_SERVICE.EXTRA_STDIN, executionCommand.stdin);
189+
executionIntent.putExtra(TERMUX_SERVICE.EXTRA_SESSION_ACTION, executionCommand.sessionAction);
187190
executionIntent.putExtra(TERMUX_SERVICE.EXTRA_BACKGROUND, executionCommand.inBackground);
188191

189192
// Send execution intent to TERMUX_SERVICE

app/src/main/java/com/termux/tasker/PluginBundleManager.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public class PluginBundleManager {
3131
/** The {@code String} extra for stdin for background commands. */
3232
public static final String EXTRA_STDIN = TermuxConstants.TERMUX_TASKER_PACKAGE_NAME + ".extra.STDIN"; // Default: "com.termux.tasker.extra.STDIN"
3333

34+
/** The {@code String} extra for terminal session action defined by
35+
* {@link com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_SERVICE}
36+
* `VALUE_EXTRA_SESSION_ACTION_*` values.
37+
*/
38+
public static final String EXTRA_SESSION_ACTION = TermuxConstants.TERMUX_TASKER_PACKAGE_NAME + ".extra.SESSION_ACTION"; // Default: "com.termux.tasker.extra.SESSION_ACTION"
39+
3440
/** The {@code boolean} extra for whether the executable should be run inside a terminal. */
3541
public static final String EXTRA_TERMINAL = TermuxConstants.TERMUX_TASKER_PACKAGE_NAME + ".extra.TERMINAL"; // Default: "com.termux.tasker.extra.TERMINAL"
3642

@@ -73,6 +79,7 @@ public static String parseBundle(@NonNull final Context context, final Bundle bu
7379
* The bundle may optionally contain:
7480
* - EXTRA_WORKDIR
7581
* - EXTRA_STDIN
82+
* - EXTRA_SESSION_ACTION
7683
* - EXTRA_TERMINAL
7784
* - EXTRA_WAIT_FOR_RESULT
7885
* - VARIABLE_REPLACE_KEYS
@@ -91,13 +98,13 @@ public static String parseBundle(@NonNull final Context context, final Bundle bu
9198
}
9299

93100
/*
94-
* Check if bundle contains at least 3 keys but no more than 8.
101+
* Check if bundle contains at least 3 keys but no more than 9.
95102
* Run this test after checking for required Bundle extras above so that the error message
96103
* is more useful. (E.g. the caller will see what extras are missing, rather than just a
97104
* message that there is the wrong number).
98105
*/
99-
if (bundle.keySet().size() < 3 || bundle.keySet().size() > 8) {
100-
return String.format("The bundle must contain 3-8 keys, but currently contains %d keys.", bundle.keySet().size());
106+
if (bundle.keySet().size() < 3 || bundle.keySet().size() > 9) {
107+
return String.format("The bundle must contain 3-9 keys, but currently contains %d keys.", bundle.keySet().size());
101108
}
102109

103110
if (TextUtils.isEmpty(bundle.getString(EXTRA_EXECUTABLE))) {
@@ -123,7 +130,7 @@ public static String parseBundle(@NonNull final Context context, final Bundle bu
123130
@Nullable
124131
public static Bundle generateBundle(@NonNull final Context context, final String executable,
125132
final String arguments, final String workingDirectory,
126-
final String stdin,
133+
final String stdin, final String sessionAction,
127134
final boolean inTerminal, final boolean waitForResult) {
128135
final Bundle result = new Bundle();
129136
result.putString(EXTRA_EXECUTABLE, executable);
@@ -132,8 +139,11 @@ public static Bundle generateBundle(@NonNull final Context context, final String
132139
result.putBoolean(EXTRA_TERMINAL, inTerminal);
133140
result.putBoolean(EXTRA_WAIT_FOR_RESULT, waitForResult);
134141

135-
if (!inTerminal)
142+
if (!inTerminal) {
136143
result.putString(EXTRA_STDIN, stdin);
144+
} else {
145+
result.putString(EXTRA_SESSION_ACTION, sessionAction);
146+
}
137147

138148
Integer versionCode = PackageUtils.getVersionCodeForPackage(context);
139149
if (versionCode == null) {
@@ -151,14 +161,19 @@ public static Bundle generateBundle(@NonNull final Context context, final String
151161
* @return A blurb for the plug-in.
152162
*/
153163
public static String generateBlurb(@NonNull final Context context, final String executable,
154-
final String arguments, final String workingDirectory, final String stdin,
155-
final boolean inTerminal, final boolean waitForResult) {
164+
final String arguments, final String workingDirectory,
165+
final String stdin, final String sessionAction,
166+
final boolean inTerminal, final boolean waitForResult) {
156167
StringBuilder builder = new StringBuilder();
157-
builder.append(context.getString(R.string.blurb_executable_and_arguments, executable, arguments));
168+
builder.append(context.getString(R.string.blurb_executable_and_arguments, executable, arguments == null ? "" : " " + arguments));
158169
builder.append("\n\n").append(context.getString(R.string.blurb_working_directory, (!DataUtils.isNullOrEmpty(workingDirectory) ? UNICODE_CHECK : UNICODE_UNCHECK)));
159170

160-
if (!inTerminal)
171+
if (!inTerminal) {
161172
builder.append("\n").append(context.getString(R.string.blurb_stdin, (!DataUtils.isNullOrEmpty(stdin) ? UNICODE_CHECK : UNICODE_UNCHECK)));
173+
} else {
174+
if (!DataUtils.isNullOrEmpty(sessionAction))
175+
builder.append("\n").append(context.getString(R.string.blurb_session_action, sessionAction));
176+
}
162177

163178
builder.append("\n").append(context.getString(R.string.blurb_in_terminal, (inTerminal ? UNICODE_CHECK : UNICODE_UNCHECK)));
164179
builder.append("\n").append(context.getString(R.string.blurb_wait_for_result, (waitForResult ? UNICODE_CHECK : UNICODE_UNCHECK)));

app/src/main/res/layout/edit_activity.xml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,42 @@
224224

225225

226226

227+
<!-- Session Action -->
228+
<androidx.cardview.widget.CardView
229+
xmlns:card_view="http://schemas.android.com/apk/res-auto"
230+
android:layout_width="match_parent"
231+
android:layout_height="wrap_content"
232+
android:layout_marginTop="@dimen/activity_vertical_margin"
233+
android:padding="@dimen/activity_view_padding_mini"
234+
card_view:cardCornerRadius="4dp">
235+
<LinearLayout
236+
android:layout_width="match_parent"
237+
android:layout_height="wrap_content"
238+
android:layout_weight="1"
239+
android:orientation="vertical">
240+
241+
<TextView
242+
android:layout_width="match_parent"
243+
android:layout_height="wrap_content"
244+
android:gravity="start|center_vertical"
245+
android:textSize="14sp"
246+
android:textStyle="bold"
247+
android:textColor="@android:color/black"
248+
android:text="@string/title_session_action"
249+
tools:labelFor="@id/session_action" />
250+
251+
<EditText
252+
android:id="@+id/session_action"
253+
android:layout_width="match_parent"
254+
android:layout_height="wrap_content"
255+
android:gravity="start|center_vertical"
256+
android:importantForAutofill="no" />
257+
258+
</LinearLayout>
259+
</androidx.cardview.widget.CardView>
260+
261+
262+
227263
<CheckBox
228264
android:id="@+id/in_terminal"
229265
android:layout_width="match_parent"

app/src/main/res/values/strings.xml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<string name="title_arguments">Arguments</string>
2121
<string name="title_working_directory_path">Working directory path</string>
2222
<string name="title_stdin">Stdin</string>
23+
<string name="title_session_action">Terminal Session Action</string>
2324
<string name="title_execute_in_terminal">Execute in a terminal session</string>
2425
<string name="title_wait_for_result">Wait for result for commands (Requires timeout > 0)</string>
2526

@@ -28,6 +29,7 @@
2829

2930
<string name="error_executable_required">Executable required.</string>
3031
<string name="error_null_or_empty_executable">The executable is null or empty.</string>
32+
<string name="error_int_not_in_range">Value must be in between %1$d and %2$d.</string>
3133

3234
<string name="help">Visit %1$s for more info on plugin usage.</string>
3335

@@ -40,11 +42,12 @@
4042
<string name="error_generate_plugin_bundle_failed">Failed to generate plugin bundle</string>
4143
<string name="error_get_version_code_failed">Failed to get version code for %1$s</string>
4244

43-
<string name="blurb_executable_and_arguments">%1$s %2$s</string>
44-
<string name="blurb_working_directory">%1$s Working Directory</string>
45-
<string name="blurb_stdin">%1$s Stdin</string>
46-
<string name="blurb_in_terminal">%1$s Terminal Session</string>
47-
<string name="blurb_wait_for_result">%1$s Wait For Result</string>
45+
<string name="blurb_executable_and_arguments">%1$s%2$s</string>
46+
<string name="blurb_working_directory">Working Directory %1$s</string>
47+
<string name="blurb_stdin">Stdin %1$s</string>
48+
<string name="blurb_session_action">Session Action %1$s</string>
49+
<string name="blurb_in_terminal">Terminal Session %1$s</string>
50+
<string name="blurb_wait_for_result">Wait For Result %1$s</string>
4851

4952
<!-- From Locale API: -->
5053
<string name="twofortyfouram_locale_breadcrumb_format" tools:ignore="UnusedResources">%1$s%2$s%3$s</string>

0 commit comments

Comments
 (0)