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; + } + }