Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<uses-permission android:name="android.permission.TRANSMIT_IR" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DUMP" tools:ignore="ProtectedPermissions" />
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/termux/api/TermuxApiReceiver.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.termux.api.apis.NotificationListAPI;
import com.termux.api.apis.SAFAPI;
import com.termux.api.apis.SensorAPI;
import com.termux.api.apis.SettingsAPI;
import com.termux.api.apis.ShareAPI;
import com.termux.api.apis.SmsInboxAPI;
import com.termux.api.apis.SmsSendAPI;
Expand Down Expand Up @@ -196,6 +197,9 @@ private void doWork(Context context, Intent intent) {
case "Sensor":
SensorAPI.onReceive(context, intent);
break;
case "Settings":
SettingsAPI.onReceive(this, context, intent);
break;
case "Share":
ShareAPI.onReceive(this, context, intent);
break;
Expand Down
197 changes: 197 additions & 0 deletions app/src/main/java/com/termux/api/apis/SettingsAPI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
package com.termux.api.apis;

import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ApplicationExitInfo;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.util.JsonWriter;

import androidx.annotation.RequiresPermission;
import androidx.appcompat.app.AppCompatActivity;

import com.termux.api.TermuxApiReceiver;
import com.termux.api.util.ResultReturner;
import com.termux.shared.logger.Logger;

import java.util.List;
import java.io.PrintWriter;
import java.io.StringWriter;

import android.content.ContentResolver;
import android.provider.Settings;

// INDENTATION NOTICE this file indentation is configured for mobile screens . small tall screen . DON'T CHANGE it if you edit from desktop computer with large screen and you think it looks wrong to you . it's intentional not a mistake . to reduce unnecessary nesting horizontally and allow set ts=2 in vim tab width 2 spaces only

// after I wrote JSON I realized all output was only one line . so this will convert to simpler output without json
// class JsonWriter {
class myWriter {

StringWriter sw;
public myWriter(StringWriter s) {
sw = s;
}
void setIndent(String s){}
void beginArray(){}
void endArray(){}
void value(String s) {
if (s == null) {
s = "null";
// if (s.trim().isEmpty()
} else if (s.isEmpty())
s = "nmempty";
s += "\n";
sw.append(s);
}

}

public class SettingsAPI {

private static final String LOG_TAG = "SettingsAPI";
static Context context;
static TermuxApiReceiver receiver;
static Intent intent;
static StringWriter sw;
// static JsonWriter out;
static myWriter out;

static ContentResolver cr;
static String setting;
static String type;

public static void onReceive(TermuxApiReceiver _receiver, final Context _context, Intent _intent) {
Logger.logDebug(LOG_TAG, "onReceive");
context = _context;
receiver = _receiver;
intent = _intent;
sw = new StringWriter();
// out = new JsonWriter(sw);
out = new myWriter(sw);

// out.setIndent(" ");
out.setIndent(" ");

cr = context.getContentResolver();
setting = intent.getStringExtra("setting");
type = intent.getStringExtra("type");

Logger.logInfo(LOG_TAG, "==*==*==*==");
Logger.logInfo(LOG_TAG, "received " + intent.toString());

try {
try {
// jsonTest();
settings();
} catch (Exception e) {
Logger.logError(LOG_TAG, e.toString());
out.value(e.toString());
}
write();
} catch (Exception e) {
Logger.logError(LOG_TAG, e.toString());
}
}

static void write() {
ResultReturner.returnData(context.getApplicationContext(), intent, new ResultReturner.WithInput() {
@Override public void writeResult(PrintWriter _out) throws Exception {
try {
// Logger.logInfo(LOG_TAG, "printing \n\""+sw+"\"");
// out.value("\n");
_out.print(sw);
} catch (Exception e) {
Logger.logError(LOG_TAG, e.toString());
}
}
});
}

// # [ array of values
// # { object of key value pair
/*
static void jsonTest() throws Exception {
Logger.logInfo(LOG_TAG, "JSON test");
out.beginArray();
out.value("123");

// out.beginObject();
// out.name("on").value(0);
// out.value(name);
// out.endObject();

out.endArray();
}
*/

static void get() throws Exception {
switch(type) {
case "string":
String get = Settings.Global.getString(cr, setting);
out.value(get);
Logger.logInfo(LOG_TAG, "received string \"" + get + "\"");
break;
case "int":
int geti = Settings.Global.getInt(cr, setting);
// out.name(geti.toString());
out.value(geti+"");
Logger.logInfo(LOG_TAG, "received int \"" + geti + "\"");
break;
default:
out.value(type +" is invalid type did you mean string/int");
break;
}
}

static void set() throws Exception {
String value = intent.getStringExtra("value");
Logger.logInfo(LOG_TAG, "received value \""+value+"\"");
boolean result = false;
switch(type) {
case "string":
// if (value == null || value.trim().isEmpty()) {
// out.value("notice setting empty value");
if (value == null)
value = "";
out.value("setting "+setting+" to \""+value+"\"");
result = Settings.Global.putString(cr, setting, value);
break;
case "int":
if (value == null || value.trim().isEmpty()) {
out.value("int value cannot be empty");
return;
}
out.value("setting "+setting+" to \""+value+"\"");
result = Settings.Global.putInt(cr, setting, Integer.parseInt(value));
break;
default:
out.value(type +" is invalid type did you mean string/int");
// out.value("correct usage termux-api Settings -a get/set --es type string/int --es setting name");
break;
}
out.value("boolean result: "+result);
}

static void settings() throws Exception {
String action = intent.getAction();
Logger.logInfo(LOG_TAG, "received action "+action);
// out.beginArray();
// out.beginObject();
switch(action) {
case "get":
get();
break;
case "set":
set();
break;
default:
out.value(action+" is invalid action. only get/set accepted");
break;
}
// out.endObject();
// out.endArray();
}
} // class