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