diff --git a/AndroidManifest.xml b/AndroidManifest.xml
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,6 +27,7 @@
+
+
+
+
+
+
commandItems = new ArrayList<>();
- for (JSONObject obj : plugin.getCommandList()) {
- try {
- commandItems.add(new CommandEntry(obj.getString("name"),
- obj.getString("command"), obj.getString("key")));
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
-
- Collections.sort(commandItems, new Comparator() {
- @Override
- public int compare(ListAdapter.Item lhs, ListAdapter.Item rhs) {
- String lName = ((CommandEntry) lhs).getName();
- String rName = ((CommandEntry) rhs).getName();
- return lName.compareTo(rName);
- }
- });
+ final ArrayList commandItems = plugin.getCommandList();
ListAdapter adapter = new ListAdapter(RunCommandActivity.this, commandItems);
diff --git a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandBroadcastReceiver.java b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandBroadcastReceiver.java
--- a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandBroadcastReceiver.java
+++ b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandBroadcastReceiver.java
@@ -1,4 +1,46 @@
package org.kde.kdeconnect.Plugins.RunCommandPlugin;
-public class RunCommandBroadcastReceiver {
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import org.kde.kdeconnect.BackgroundService;
+import org.kde.kdeconnect.Device;
+
+import static org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin.PACKAGE_TYPE_RUNCOMMAND;
+import static org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin.PACKAGE_TYPE_RUNCOMMAND_DEVICEID;
+
+public class RunCommandBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive( final Context context, final Intent intent ){
+
+ if( PACKAGE_TYPE_RUNCOMMAND.equals( intent.getAction() ) ){
+
+ BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
+
+ @Override
+ public void onServiceStart(final BackgroundService service) {
+
+ try{
+
+ final String deviceId = intent.getStringExtra( PACKAGE_TYPE_RUNCOMMAND_DEVICEID );
+ final String commandKey = intent.getStringExtra( PACKAGE_TYPE_RUNCOMMAND );
+ final Device device = service.getDevice( deviceId );
+ final RunCommandPlugin plugin = device.getPlugin( RunCommandPlugin.class );
+
+ if( plugin == null ){
+ Log.e( "RunCommandActivity", "device has no runcommand plugin!" );
+ return;
+ }
+
+ plugin.runCommand( commandKey );
+ }
+ catch( Exception e ){
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+ }
}
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
@@ -22,6 +22,7 @@
package org.kde.kdeconnect.Plugins.RunCommandPlugin;
import android.app.Activity;
+import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
@@ -30,122 +31,193 @@
import org.json.JSONObject;
import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin;
+import org.kde.kdeconnect.UserInterface.List.ListAdapter;
+import org.kde.kdeconnect.UserInterface.MaterialActivity;
import org.kde.kdeconnect_tp.R;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Iterator;
+import cyanogenmod.app.CMStatusBarManager;
+import cyanogenmod.app.CustomTile;
+
public class RunCommandPlugin extends Plugin {
+ public final static int CUSTOM_TILE_ID = 1;
public final static String PACKAGE_TYPE_RUNCOMMAND = "kdeconnect.runcommand";
+ public final static String PACKAGE_TYPE_RUNCOMMAND_DEVICEID = "kdeconnect.runcommand.deviceid";
public final static String PACKAGE_TYPE_RUNCOMMAND_REQUEST = "kdeconnect.runcommand.request";
- private ArrayList commandList = new ArrayList<>();
- private ArrayList callbacks = new ArrayList<>();
+ private ArrayList< ListAdapter.Item > commandList = new ArrayList<>();
+ private ArrayList< CommandsChangedCallback > callbacks = new ArrayList<>();
- public void addCommandsUpdatedCallback(CommandsChangedCallback newCallback) {
- callbacks.add(newCallback);
+ public void addCommandsUpdatedCallback( CommandsChangedCallback newCallback ){
+ callbacks.add( newCallback );
}
- public void removeCommandsUpdatedCallback(CommandsChangedCallback theCallback) {
- callbacks.remove(theCallback);
+ public void removeCommandsUpdatedCallback( CommandsChangedCallback theCallback ){
+ callbacks.remove( theCallback );
}
interface CommandsChangedCallback {
void update();
- };
+ }
- public ArrayList getCommandList() {
+ public ArrayList< ListAdapter.Item > getCommandList(){
return commandList;
}
@Override
- public String getDisplayName() {
- return context.getResources().getString(R.string.pref_plugin_runcommand);
+ public String getDisplayName(){
+ return context.getResources().getString( R.string.pref_plugin_runcommand );
}
@Override
- public String getDescription() {
- return context.getResources().getString(R.string.pref_plugin_runcommand_desc);
+ public String getDescription(){
+ return context.getResources().getString( R.string.pref_plugin_runcommand_desc );
}
@Override
- public Drawable getIcon() {
- return ContextCompat.getDrawable(context, R.drawable.runcommand_plugin_icon);
+ public Drawable getIcon(){
+ return ContextCompat.getDrawable( context, R.drawable.runcommand_plugin_icon );
}
@Override
- public boolean onCreate() {
+ public boolean onCreate(){
requestCommandList();
return true;
}
@Override
- public boolean onPackageReceived(NetworkPackage np) {
+ public boolean onPackageReceived( NetworkPackage np ){
+
+ if( np.has( "commandList" ) ){
- if (np.has("commandList")) {
commandList.clear();
- try {
- JSONObject obj = new JSONObject(np.getString("commandList"));
- Iterator keys = obj.keys();
- while(keys.hasNext()){
+
+ try{
+ JSONObject obj = new JSONObject( np.getString( "commandList" ) );
+ Iterator< String > keys = obj.keys();
+ ArrayList< CustomTile.ExpandedListItem > expandedListItems = new ArrayList<>();
+ Intent intent;
+ PendingIntent pendingIntent;
+ int intentIndex = 0;
+ Intent activityIntent = new Intent( context, MaterialActivity.class );
+ activityIntent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
+
+ PendingIntent pendingActivityIntent = PendingIntent.getActivity( context, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT );
+
+ while( keys.hasNext() ){
String s = keys.next();
- JSONObject o = obj.getJSONObject(s);
- o.put("key", s);
- commandList.add(o);
+ JSONObject o = obj.getJSONObject( s );
+ o.put( "key", s );
+
+ try{
+ commandList.add( new CommandEntry( o.getString( "name" ), o.getString( "command" ), o.getString( "key" ) ) );
+ }
+ catch( JSONException e ){
+ e.printStackTrace();
+ }
}
- } catch (JSONException e) {
+
+ Collections.sort( commandList, new Comparator< ListAdapter.Item >() {
+ @Override
+ public int compare( ListAdapter.Item lhs, ListAdapter.Item rhs ){
+ String lName = ( (CommandEntry) lhs ).getName();
+ String rName = ( (CommandEntry) rhs ).getName();
+ return lName.compareTo( rName );
+ }
+ } );
+
+ for( ListAdapter.Item command : commandList ){
+
+ intent = new Intent();
+
+ intent.setAction( PACKAGE_TYPE_RUNCOMMAND );
+ intent.putExtra( PACKAGE_TYPE_RUNCOMMAND, ((CommandEntry)command).getKey() );
+ intent.putExtra( PACKAGE_TYPE_RUNCOMMAND_DEVICEID, device.getDeviceId() );
+
+ pendingIntent = PendingIntent.getBroadcast( context, intentIndex, intent, PendingIntent.FLAG_UPDATE_CURRENT );
+
+ CustomTile.ExpandedListItem expandedListItem = new CustomTile.ExpandedListItem();
+
+ expandedListItem.setExpandedListItemDrawable( R.drawable.ic_command );
+ expandedListItem.setExpandedListItemTitle( ( (CommandEntry) command ).getName() );
+
+ expandedListItem.setExpandedListItemSummary( ( (CommandEntry) command ).getCommand() );
+
+ expandedListItem.setExpandedListItemOnClickIntent( pendingIntent );
+ expandedListItems.add( expandedListItem );
+
+ intentIndex++;
+ }
+
+ CustomTile.ListExpandedStyle listExpandedStyle = new CustomTile.ListExpandedStyle();
+ listExpandedStyle.setListItems( expandedListItems );
+
+ CustomTile mCustomTile = new CustomTile.Builder( context )
+ .setExpandedStyle( listExpandedStyle )
+ .setLabel( "KDE Connect" )
+ .setIcon( R.drawable.icon )
+ .setOnLongClickIntent( pendingActivityIntent )
+ .shouldCollapsePanel( true )
+ .build();
+
+ CMStatusBarManager.getInstance( context ).publishTile( "TAG", CUSTOM_TILE_ID, mCustomTile );
+
+ }
+ catch( JSONException e ){
e.printStackTrace();
}
- for (CommandsChangedCallback aCallback : callbacks) {
+ for( CommandsChangedCallback aCallback : callbacks ){
aCallback.update();
}
- device.onPluginsChanged();
-
return true;
}
return false;
}
@Override
- public String[] getSupportedPackageTypes() {
- return new String[]{PACKAGE_TYPE_RUNCOMMAND};
+ public String[] getSupportedPackageTypes(){
+ return new String[]{ PACKAGE_TYPE_RUNCOMMAND };
}
@Override
- public String[] getOutgoingPackageTypes() {
- return new String[]{PACKAGE_TYPE_RUNCOMMAND_REQUEST};
+ public String[] getOutgoingPackageTypes(){
+ return new String[]{ PACKAGE_TYPE_RUNCOMMAND_REQUEST };
}
- public void runCommand(String cmdKey) {
- NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_RUNCOMMAND_REQUEST);
- np.set("key", cmdKey);
- device.sendPackage(np);
+ public void runCommand( String cmdKey ){
+ NetworkPackage np = new NetworkPackage( PACKAGE_TYPE_RUNCOMMAND_REQUEST );
+ np.set( "key", cmdKey );
+ device.sendPackage( np );
}
- private void requestCommandList() {
- NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_RUNCOMMAND_REQUEST);
- np.set("requestCommandList", true);
- device.sendPackage(np);
+ private void requestCommandList(){
+ NetworkPackage np = new NetworkPackage( PACKAGE_TYPE_RUNCOMMAND_REQUEST );
+ np.set( "requestCommandList", true );
+ device.sendPackage( np );
}
@Override
- public boolean hasMainActivity() {
+ public boolean hasMainActivity(){
return !commandList.isEmpty();
}
@Override
- public void startMainActivity(Activity parentActivity) {
- Intent intent = new Intent(parentActivity, RunCommandActivity.class);
- intent.putExtra("deviceId", device.getDeviceId());
- parentActivity.startActivity(intent);
+ public void startMainActivity( Activity parentActivity ){
+ Intent intent = new Intent( parentActivity, RunCommandActivity.class );
+ intent.putExtra( "deviceId", device.getDeviceId() );
+ parentActivity.startActivity( intent );
}
@Override
- public String getActionName() {
- return context.getString(R.string.pref_plugin_runcommand);
+ public String getActionName(){
+ return context.getString( R.string.pref_plugin_runcommand );
}
}