diff --git a/res/drawable/ic_add.xml b/res/drawable/ic_add.xml
new file mode 100644
--- /dev/null
+++ b/res/drawable/ic_add.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/res/layout/activity_runcommand.xml b/res/layout/activity_runcommand.xml
new file mode 100644
--- /dev/null
+++ b/res/layout/activity_runcommand.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/addcommanddialog.xml b/res/layout/addcommanddialog.xml
new file mode 100644
--- /dev/null
+++ b/res/layout/addcommanddialog.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -229,4 +229,11 @@
Device icon
Settings icon
+ Add a command
+ Name
+ Command
+ You will need to confirm the command on the desktop
+ There are no commands registered
+ You can add new commands in the KDE Connect System Settings
+
diff --git a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java
new file mode 100644
--- /dev/null
+++ b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java
@@ -0,0 +1,57 @@
+package org.kde.kdeconnect.Plugins.RunCommandPlugin;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+
+import org.kde.kdeconnect_tp.R;
+
+public class AddCommandDialog extends DialogFragment {
+
+ private EditText nameField;
+ private EditText commandField;
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(R.string.add_command);
+
+ LayoutInflater inflater = getActivity().getLayoutInflater();
+
+ View view = inflater.inflate(R.layout.addcommanddialog, null);
+
+ nameField = (EditText) view.findViewById(R.id.addcommand_name);
+ commandField = (EditText) view.findViewById(R.id.addcommand_command);
+
+ builder.setView(view);
+
+ builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+
+ if (getActivity() instanceof RunCommandActivity) {
+
+ String name = nameField.getText().toString();
+ String command = commandField.getText().toString();
+
+ ((RunCommandActivity) getActivity()).dialogResult(name, command);
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ }
+ });
+
+ return builder.create();
+ }
+}
diff --git a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java
--- a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java
+++ b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java
@@ -22,11 +22,13 @@
package org.kde.kdeconnect.Plugins.RunCommandPlugin;
import android.os.Bundle;
+import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
+import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
@@ -42,6 +44,12 @@
public class RunCommandActivity extends AppCompatActivity {
private String deviceId;
+ private final RunCommandPlugin.CommandsChangedCallback commandsChangedCallback = new RunCommandPlugin.CommandsChangedCallback() {
+ @Override
+ public void update() {
+ updateView();
+ }
+ };
private void updateView() {
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
@@ -58,7 +66,7 @@
runOnUiThread(new Runnable() {
@Override
public void run() {
- ListView view = (ListView) findViewById(R.id.listView1);
+ ListView view = (ListView) findViewById(R.id.runcommandslist);
final ArrayList commandItems = new ArrayList<>();
for (JSONObject obj : plugin.getCommandList()) {
@@ -89,26 +97,39 @@
plugin.runCommand(entry.getKey());
}
});
+
+
+ TextView explanation = (TextView) findViewById(R.id.addcomand_explanation);
+ String text = getString(R.string.addcommand_explanation);
+ if (!plugin.canAddCommand()) {
+ text += "\n" + getString(R.string.addcommand_explanation2);
+ }
+ explanation.setText(text);
+ explanation.setVisibility(commandItems.isEmpty() ? View.VISIBLE : View.GONE);
}
});
}
});
}
- private final RunCommandPlugin.CommandsChangedCallback theCallback = new RunCommandPlugin.CommandsChangedCallback() {
- @Override
- public void update() {
- updateView();
- }
- };
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_list);
+ setContentView(R.layout.activity_runcommand);
deviceId = getIntent().getStringExtra("deviceId");
+ boolean canAddCommands = BackgroundService.getInstance().getDevice(deviceId).getPlugin(RunCommandPlugin.class).canAddCommand();
+
+ FloatingActionButton addCommandButton = (FloatingActionButton) findViewById(R.id.add_command_button);
+ addCommandButton.setVisibility(canAddCommands ? View.VISIBLE : View.GONE);
+ addCommandButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ new AddCommandDialog().show(getSupportFragmentManager(), "addcommanddialog");
+ }
+ });
+
updateView();
}
@@ -126,7 +147,7 @@
Log.e("RunCommandActivity", "device has no runcommand plugin!");
return;
}
- plugin.addCommandsUpdatedCallback(theCallback);
+ plugin.addCommandsUpdatedCallback(commandsChangedCallback);
}
});
}
@@ -145,7 +166,20 @@
Log.e("RunCommandActivity", "device has no runcommand plugin!");
return;
}
- plugin.removeCommandsUpdatedCallback(theCallback);
+ plugin.removeCommandsUpdatedCallback(commandsChangedCallback);
+ }
+ });
+ }
+
+ public void dialogResult(final String cmdName, final String cmdCmd) {
+ BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
+ @Override
+ public void onServiceStart(BackgroundService service) {
+ Device device = service.getDevice(deviceId);
+ RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class);
+ if(!cmdName.isEmpty() && !cmdCmd.isEmpty()) {
+ plugin.addCommand(cmdName, cmdCmd);
+ }
}
});
}
diff --git a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandPlugin.java b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandPlugin.java
--- a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandPlugin.java
+++ b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandPlugin.java
@@ -39,10 +39,13 @@
public final static String PACKAGE_TYPE_RUNCOMMAND = "kdeconnect.runcommand";
public final static String PACKAGE_TYPE_RUNCOMMAND_REQUEST = "kdeconnect.runcommand.request";
+ public final static String PACKAGE_TYPE_RUNCOMMAND_ADD = "kdeconnect.runcommand.add";
private ArrayList commandList = new ArrayList<>();
private ArrayList callbacks = new ArrayList<>();
+ private boolean canAddCommand;
+
public void addCommandsUpdatedCallback(CommandsChangedCallback newCallback) {
callbacks.add(newCallback);
}
@@ -104,6 +107,8 @@
device.onPluginsChanged();
+ canAddCommand = np.getBoolean("canAddCommand", false);
+
return true;
}
return false;
@@ -133,7 +138,7 @@
@Override
public boolean hasMainActivity() {
- return !commandList.isEmpty();
+ return true;
}
@Override
@@ -148,4 +153,17 @@
return context.getString(R.string.pref_plugin_runcommand);
}
+ public void addCommand(String name, String command){
+
+ NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_RUNCOMMAND_ADD);
+ np.set("name", name);
+ np.set("command", command);
+
+ device.sendPackage(np);
+ }
+
+ public boolean canAddCommand(){
+ return canAddCommand;
+ }
+
}