diff --git a/.idea/modules.xml b/.idea/modules.xml
index e77f8476248e..8eebf8d5e687 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -56,7 +56,6 @@
-
@@ -257,6 +256,7 @@
+
diff --git a/python/educational-core/build.gradle b/python/educational-core/build.gradle
index 5f9a6f47c265..0fd4879a267a 100644
--- a/python/educational-core/build.gradle
+++ b/python/educational-core/build.gradle
@@ -79,6 +79,7 @@ private static String getIdeaPath() {
project(':student') {
dependencies {
+ compile project(':edu-intellij')
compile fileTree(dir: 'lib', include: ['*.jar'])
}
diff --git a/python/educational-core/edu-intellij/edu-intellij.iml b/python/educational-core/edu-intellij/edu-intellij.iml
new file mode 100644
index 000000000000..e63dbeeada21
--- /dev/null
+++ b/python/educational-core/edu-intellij/edu-intellij.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft b/python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft
new file mode 100644
index 000000000000..3d99c65140bd
--- /dev/null
+++ b/python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft
@@ -0,0 +1,18 @@
+import org.junit.runner.Description;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+
+public class EduTestRunner {
+ public static void main(String[] args) throws ClassNotFoundException {
+ Class> testClass = EduTestRunner.class.getClassLoader().loadClass(args[0]);
+ JUnitCore runner = new JUnitCore();
+ runner.addListener(new RunListener() {
+ @Override
+ public void testFailure(Failure failure) throws Exception {
+ System.out.println("#educational_plugin FAILED + " + failure.getMessage());
+ }
+ });
+ runner.run(testClass);
+ }
+}
\ No newline at end of file
diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java
new file mode 100644
index 000000000000..5934ad168102
--- /dev/null
+++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java
@@ -0,0 +1,13 @@
+package com.jetbrains.edu.intellij;
+
+import com.intellij.lang.LanguageExtension;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+
+@SuppressWarnings("unused") //used in other educational plugins that are stored in separate repository
+public interface EduCourseConfigurator {
+ String EP_NAME = "com.jetbrains.edu.intellij.courseConfigurator";
+ LanguageExtension INSTANCE = new LanguageExtension<>(EP_NAME);
+
+ default void configureModule(@NotNull final Project project) {}
+}
diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java
new file mode 100644
index 000000000000..99501d9b40a1
--- /dev/null
+++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java
@@ -0,0 +1,9 @@
+package com.jetbrains.edu.intellij;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.platform.ProjectTemplate;
+
+public interface EduIntelliJProjectTemplate extends ProjectTemplate {
+ ExtensionPointName EP_NAME =
+ ExtensionPointName.create("Edu.eduIntelliJProjectTemplate");
+}
diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java
new file mode 100644
index 000000000000..cd234fbccf6c
--- /dev/null
+++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java
@@ -0,0 +1,33 @@
+package com.jetbrains.edu.intellij;
+
+import com.intellij.icons.AllIcons;
+import com.intellij.ide.util.projectWizard.WizardContext;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.platform.ProjectTemplate;
+import com.intellij.platform.ProjectTemplatesFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+
+@SuppressWarnings("unused") //used in other educational plugins that are stored in separate repository
+public class EduIntelliJTemplateFactory extends ProjectTemplatesFactory {
+ private static final String GROUP_NAME = "Education";
+
+ @NotNull
+ @Override
+ public String[] getGroups() {
+ return new String[]{GROUP_NAME};
+ }
+
+ @NotNull
+ @Override
+ public ProjectTemplate[] createTemplates(@Nullable String group, WizardContext context) {
+ return ApplicationManager.getApplication().getExtensions(EduIntelliJProjectTemplate.EP_NAME);
+ }
+
+ @Override
+ public Icon getGroupIcon(String group) {
+ return AllIcons.Modules.Types.UserDefined;
+ }
+}
diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java
new file mode 100644
index 000000000000..7b910943c002
--- /dev/null
+++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java
@@ -0,0 +1,61 @@
+package com.jetbrains.edu.intellij.android;
+
+import com.intellij.ide.projectWizard.ProjectSettingsStep;
+import com.intellij.ide.projectWizard.ProjectTemplateList;
+import com.intellij.ide.util.newProjectWizard.AbstractProjectWizard;
+import com.intellij.ide.util.newProjectWizard.StepSequence;
+import com.intellij.ide.util.projectWizard.ModuleWizardStep;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
+import com.intellij.platform.ProjectTemplate;
+import com.jetbrains.edu.intellij.EduIntelliJProjectTemplate;
+
+import javax.swing.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+class EduSelectCourseProjectWizard extends AbstractProjectWizard {
+
+ private StepSequence mySequence = new StepSequence();
+
+ EduSelectCourseProjectWizard() {
+ super("New Course", null, (String)null);
+ init();
+ }
+
+ protected void init() {
+ myWizardContext.setModulesProvider(ModulesProvider.EMPTY_MODULES_PROVIDER);
+ MyChooseCourseStep step = new MyChooseCourseStep();
+ mySequence.addCommonStep(step);
+ mySequence.addCommonFinishingStep(new ProjectSettingsStep(myWizardContext), null);
+ mySequence.getAllSteps().forEach(this::addStep);
+ super.init();
+ }
+
+ @Override
+ public StepSequence getSequence() {
+ return mySequence;
+ }
+
+ private class MyChooseCourseStep extends ModuleWizardStep {
+ private ProjectTemplateList myTemplateList = new ProjectTemplateList();
+
+ @Override
+ public JComponent getComponent() {
+ return myTemplateList;
+ }
+
+ @Override
+ public void updateDataModel() {
+ myWizardContext.setProjectTemplate(myTemplateList.getSelectedTemplate());
+ }
+
+ @Override
+ public void updateStep() {
+ List templates = new ArrayList<>();
+ Collections.addAll(templates, ApplicationManager.getApplication().getExtensions(EduIntelliJProjectTemplate.EP_NAME));
+ myTemplateList.setTemplates(templates, false);
+ }
+ }
+}
diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java
new file mode 100644
index 000000000000..4b7d35f75a45
--- /dev/null
+++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java
@@ -0,0 +1,28 @@
+package com.jetbrains.edu.intellij.android;
+
+import com.intellij.icons.AllIcons;
+import com.intellij.ide.impl.NewProjectUtil;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.application.ApplicationManager;
+import com.jetbrains.edu.intellij.EduIntelliJProjectTemplate;
+
+public class EduStartLearningAction extends AnAction {
+
+ public EduStartLearningAction() {
+ super(AllIcons.Modules.Types.UserDefined);
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ EduSelectCourseProjectWizard wizard = new EduSelectCourseProjectWizard();
+ NewProjectUtil.createNewProject(AnAction.getEventProject(e), wizard);
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ if (ApplicationManager.getApplication().getExtensions(EduIntelliJProjectTemplate.EP_NAME).length < 1) {
+ e.getPresentation().setEnabledAndVisible(false);
+ }
+ }
+}
diff --git a/python/educational-core/settings.gradle b/python/educational-core/settings.gradle
index 8377fed16671..9089b7568c38 100644
--- a/python/educational-core/settings.gradle
+++ b/python/educational-core/settings.gradle
@@ -1 +1 @@
-include 'student', 'course-creator'
\ No newline at end of file
+include 'student', 'course-creator', 'edu-intellij'
\ No newline at end of file
diff --git a/python/educational-core/student/resources/META-INF/android-dependencies.xml b/python/educational-core/student/resources/META-INF/android-dependencies.xml
new file mode 100644
index 000000000000..0d220c720017
--- /dev/null
+++ b/python/educational-core/student/resources/META-INF/android-dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python/educational-core/student/resources/META-INF/edu-intellij.xml b/python/educational-core/student/resources/META-INF/edu-intellij.xml
new file mode 100644
index 000000000000..5737fe0ace7c
--- /dev/null
+++ b/python/educational-core/student/resources/META-INF/edu-intellij.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/python/educational-core/student/resources/META-INF/plugin.xml b/python/educational-core/student/resources/META-INF/plugin.xml
index e66e65581561..cfdebc5729f6 100644
--- a/python/educational-core/student/resources/META-INF/plugin.xml
+++ b/python/educational-core/student/resources/META-INF/plugin.xml
@@ -20,6 +20,8 @@
on how to target different products -->
com.intellij.modules.lang
+ com.intellij.modules.androidstudio
+ com.intellij.modules.java
@@ -35,6 +37,10 @@
+
+
+
+