Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Make your own Android Studio Plugin

Make your own Android Studio Plugin

Slides from our talk for Droidcon Italy 2017

Synesthesia

April 06, 2017
Tweet

More Decks by Synesthesia

Other Decks in Technology

Transcript

  1. public class HelloWorldActivity extends BaseBackActivity { public static Intent getCallingIntent(Context

    context) { Intent i = new Intent(context, HelloWorldActivity.class); return i; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setToolbarTitle(getString(R.string.lbl_title_helloworld)); if (savedInstanceState == null) { replaceFragment(HelloWorldFragment.newInstance()); } } }
  2. public class HelloWorldFragment extends BaseMvpFragment<HelloWorldPresenter> implements HelloWorldMvpView { public static

    HelloWorldFragment newInstance() { HelloWorldFragment fragment = new HelloWorldFragment(); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getMvpFragmentComponent(savedInstanceState).inject(this); } }
  3. public class HelloWorldPresenter extends BasePresenter<HelloWorldMvpView> { public HelloWorldPresenter(SchedulerProvider schedulerProvider) {

    super(schedulerProvider); } @Override protected void restoreDataOnConfigurationChange() { } @Override protected void subscribeRequestsOnResume() { } }
  4. <idea-plugin version="2"> <id>it.droidcon.androidstudioplugin</id> <name>Droidcon Example</name> <version>1.0.1</version> <vendor email="[email protected]" url=“http://www.synesthesia.it"> Synesthesia</vendor>

    <description><![CDATA[Description of you plugin]]></description> <change-notes><![CDATA[* First version.<br/>]]></change-notes> <idea-version since-build="160"/> <depends>com.intellij.modules.lang</depends> <depends>com.intellij.modules.java</depends> <depends>org.jetbrains.android</depends> <actions> ... </actions> </idea-plugin>
  5. <actions> <group id="DroidconPlugin.NewMenu"> <add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewElement"/> <group id="DroidconPlugin.NewMenu.Droidcon" popup="true"

    text="_Droidcon" icon="/icons/icon_blue_droid.png" description="Droidcon menu"> <action id="DroidconPlugin.NewMenu.Droidcon.NewClass" class="it.droidcon.androidstudioplugin.actions.HelloWorldAction" text="_Hello world class" description="Create a new empty class"/> <action id="DroidconPlugin.NewMenu.Droidcon.ThreadExample" class="it.droidcon.androidstudioplugin.actions.ThreadAction" text="_Simple thread example" description="Simple example of thread management"/> <action id="DroidconPlugin.NewMenu.Droidcon.Template" class="it.droidcon.androidstudioplugin.actions.TemplateActivityAction" text="_Template Example" icon="/icons/template.png" description="An example of template integration inside a plugin"/> <action id="DroidconPlugin.NewMenu.Droidcon.Wizard" class="it.droidcon.androidstudioplugin.actions.WizardAction" text="_Wizard" icon="/icons/wizard.png" description="Basic Wizard Example"/> </group>
  6. <group id="DroidconPlugin.NewMenu"> <add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewElement"/> <group id="DroidconPlugin.NewMenu.Droidcon" popup="true" text="_Droidcon"

    icon="/icons/icon_blue_droid.png" description="Droidcon menu”> <action ... /> <action id="DroidconPlugin.NewMenu.Droidcon.Wizard" class="it.droidcon.androidstudioplugin.actions.WizardAction" text="_Wizard" icon="/icons/wizard.png" description="Basic Wizard Example”/>
  7. public class HelloWorldAction extends AnAction { @Override public void actionPerformed(AnActionEvent

    anActionEvent) { ... } @Override public void update(AnActionEvent e) { ... } }
  8. public class ${activityName}Activity extends ${superClass} { public static Intent getCallingIntent(Context

    context) { Intent i = new Intent(context, ${activityName}Activity.class); return i; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_${activityName?lower_case}); } }
  9. public class DroidWizardModel extends NewProjectModel { private Project myProject; private

    IntegerProperty firstNumber = new SimpleIntegerProperty(0); private IntegerProperty secondNumber = new SimpleIntegerProperty(0); public DroidWizardModel(@NotNull Project project) { myProject = project; } @Override public void handleFinished() { Long result = firstNumber.longValue() + secondNumber.longValue(); Utils.showDialogMessage(myProject, "Result", " A + B = " + result.toString()); } public void setFirstNumber(Integer number) {firstNumber.setValue(number);} public void setSecondNumber(Integer secondNumber { this.secondNumber.setValue(secondNumber); } }
  10. plugin.xml Java <extensions defaultExtensionNs="com.intellij">
 <!--Necessary for delivery Live Templates into

    the plugin-->
 <defaultLiveTemplatesProvider implementation="DroidconLiveTemplateProvider"/>
 </extensions> public class DroidconLiveTemplateProvider implements DefaultLiveTemplatesProvider {
 
 @Override
 public String[] getDefaultLiveTemplateFiles() {
 return new String[] {"liveTemplates/MyLiveTemplates"};
 }
 
 @Nullable
 @Override
 public String[] getHiddenLiveTemplateFiles() {
 return new String[0];
 }
 
 }