diff --git a/README.md b/README.md index 998dadb..35ef404 100644 --- a/README.md +++ b/README.md @@ -114,3 +114,24 @@ Download ```groovy compile 'eu.inloop:androidviewmodel:1.3.1' ``` + +## Android Studio Template +For faster creating new screens, you can use [Android Studio Template](/template/AVM_Inloop) + +![Android Studio Template Window](/template/template-preview.png) + +### Install template +#### Manually: +Copy the template folder to Android Studio templates folder (`/Applications/Android Studio.app/Contents/plugins/android/lib/templates/others` on Mac) +#### Automatically: +Run the following command to download and install the template automatically (Mac only) +``` +curl -o androidviewmodel.zip -Lk https://github.com/inloop/AndroidViewModel/archive/master.zip && unzip androidviewmodel.zip && cp -af AndroidViewModel-master/template/AVM_Inloop/. "/Applications/Android Studio.app/Contents/plugins/android/lib/templates/other/AVM_Inloop" && rm -r AndroidViewModel-master && rm androidviewmodel.zip +``` +Don't forget to restart the Android Studio. + +### Usage +In the Android Studio right click inside the Projet window and select `File > New > AndroidViewModel Inloop > AVM Fragment` + + +![Android Studio New Template](/template/create-new-template-preview.png) \ No newline at end of file diff --git a/template/AVM_Inloop/avm_inloop_template_preview.png b/template/AVM_Inloop/avm_inloop_template_preview.png new file mode 100644 index 0000000..4216781 Binary files /dev/null and b/template/AVM_Inloop/avm_inloop_template_preview.png differ diff --git a/template/AVM_Inloop/globals.xml.ftl b/template/AVM_Inloop/globals.xml.ftl new file mode 100644 index 0000000..691656d --- /dev/null +++ b/template/AVM_Inloop/globals.xml.ftl @@ -0,0 +1,5 @@ + + + + <#include "../../activities/common/common_globals.xml.ftl" /> + \ No newline at end of file diff --git a/template/AVM_Inloop/recipe.xml.ftl b/template/AVM_Inloop/recipe.xml.ftl new file mode 100644 index 0000000..2747958 --- /dev/null +++ b/template/AVM_Inloop/recipe.xml.ftl @@ -0,0 +1,48 @@ + + + + <#if appCompat && !(hasDependency('eu.inloop:androidviewmodel'))> + + + + <#if screenType == "Fragment"> + + + + <#if screenType == "BindingFragment"> + + + + + <#if generateViewInterface> + + + + + <#if scrPackage != ""> + + <#else> + + + + <#if vmPackage != ""> + + <#else> + + + + <#if vPackage != ""> + + <#else> + + + + + + \ No newline at end of file diff --git a/template/AVM_Inloop/root/src/app_package/BindingFragment.java.ftl b/template/AVM_Inloop/root/src/app_package/BindingFragment.java.ftl new file mode 100644 index 0000000..429d61e --- /dev/null +++ b/template/AVM_Inloop/root/src/app_package/BindingFragment.java.ftl @@ -0,0 +1,45 @@ +package ${packageName}<#if scrPackage != "">.${scrPackage}; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; +<#if vPackage != ""> + import ${packageName}<#if vPackage != "">.${vPackage?replace('/','.')}.I${viewModelClass?replace('ViewModel', 'View')}; +<#else> + import eu.inloop.viewmodel.IView; + +import eu.inloop.viewmodel.binding.ViewModelBaseBindingFragment; +import eu.inloop.viewmodel.binding.ViewModelBindingConfig; +import ${packageName}.databinding.${underscoreToCamelCase(layoutName)}Binding; +import ${packageName}.R; +import ${packageName}<#if vmPackage != "">.${vmPackage?replace('/','.')}.${viewModelClass}; + +<#if vPackage != ""> + public class ${screenClass} + extends ViewModelBase${screenType} + implements I${viewModelClass?replace('ViewModel', 'View')} { +<#else> + public class ${screenClass} extends ViewModelBase${screenType} { + + + + public static ${screenClass} newInstance() { + final Bundle bundle = new Bundle(); + // set arguments + final ${screenClass} fragment = new ${screenClass}(); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setModelView(this); + } + + @Override + public ViewModelBindingConfig getViewModelBindingConfig() { + return new ViewModelBindingConfig(R.layout.${layoutName}, getActivity()); + } + +} \ No newline at end of file diff --git a/template/AVM_Inloop/root/src/app_package/Fragment.java.ftl b/template/AVM_Inloop/root/src/app_package/Fragment.java.ftl new file mode 100644 index 0000000..97ce736 --- /dev/null +++ b/template/AVM_Inloop/root/src/app_package/Fragment.java.ftl @@ -0,0 +1,45 @@ +package ${packageName}<#if scrPackage != "">.${scrPackage}; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +<#if vPackage != ""> + import ${packageName}<#if vPackage != "">.${vPackage?replace('/','.')}.I${viewModelClass?replace('ViewModel', 'View')}; +<#else> + import eu.inloop.viewmodel.IView; + +import eu.inloop.viewmodel.base.ViewModelBaseFragment; +import ${packageName}.R; +import ${packageName}<#if vmPackage != "">.${vmPackage?replace('/','.')}.${viewModelClass}; + +<#if vPackage != ""> + public class ${screenClass} + extends ViewModelBase${screenType} + implements I${viewModelClass?replace('ViewModel', 'View')} { +<#else> + public class ${screenClass} extends ViewModelBase${screenType} { + + + public static ${screenClass} newInstance() { + final Bundle bundle = new Bundle(); + // set arguments + final ${screenClass} fragment = new ${screenClass}(); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.${layoutName}, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + setModelView(this); + } + +} \ No newline at end of file diff --git a/template/AVM_Inloop/root/src/app_package/ViewInterface.java.ftl b/template/AVM_Inloop/root/src/app_package/ViewInterface.java.ftl new file mode 100644 index 0000000..d79121b --- /dev/null +++ b/template/AVM_Inloop/root/src/app_package/ViewInterface.java.ftl @@ -0,0 +1,8 @@ + +package ${packageName}<#if vmPackage != "">.${vPackage?replace('/','.')}; + +import eu.inloop.viewmodel.IView; + +public interface I${viewModelClass?replace('ViewModel', 'View')} extends IView { + +} \ No newline at end of file diff --git a/template/AVM_Inloop/root/src/app_package/ViewModel.java.ftl b/template/AVM_Inloop/root/src/app_package/ViewModel.java.ftl new file mode 100644 index 0000000..1e57b44 --- /dev/null +++ b/template/AVM_Inloop/root/src/app_package/ViewModel.java.ftl @@ -0,0 +1,24 @@ + +package ${packageName}<#if vmPackage != "">.${vmPackage}; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import eu.inloop.viewmodel.AbstractViewModel; +<#if vPackage != ""> + import ${packageName}<#if vPackage != "">.${vPackage?replace('/','.')}.I${viewModelClass?replace('ViewModel', 'View')}; +<#else> + import eu.inloop.viewmodel.IView; + + +<#if vPackage != ""> + public class ${viewModelClass} extends AbstractViewModel { +<#else> + public class ${viewModelClass} extends AbstractViewModel { + + + @Override + public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) { + super.onCreate(arguments, savedInstanceState); + + } +} \ No newline at end of file diff --git a/template/AVM_Inloop/root/src/app_package/binding_layout.xml.ftl b/template/AVM_Inloop/root/src/app_package/binding_layout.xml.ftl new file mode 100644 index 0000000..f90065f --- /dev/null +++ b/template/AVM_Inloop/root/src/app_package/binding_layout.xml.ftl @@ -0,0 +1,19 @@ + +.${scrPackage?replace('/','.')}.${screenClass}"> + + + ${vmPackage?replace('/','.')}.${viewModelClass}"/> + + + + + + + \ No newline at end of file diff --git a/template/AVM_Inloop/root/src/app_package/layout.xml.ftl b/template/AVM_Inloop/root/src/app_package/layout.xml.ftl new file mode 100644 index 0000000..f0bf876 --- /dev/null +++ b/template/AVM_Inloop/root/src/app_package/layout.xml.ftl @@ -0,0 +1,9 @@ +.${scrPackage?replace('/','.')}.${screenClass}" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + \ No newline at end of file diff --git a/template/AVM_Inloop/template.xml b/template/AVM_Inloop/template.xml new file mode 100644 index 0000000..110cae4 --- /dev/null +++ b/template/AVM_Inloop/template.xml @@ -0,0 +1,90 @@ + \ No newline at end of file diff --git a/template/create-new-template-preview.png b/template/create-new-template-preview.png new file mode 100644 index 0000000..1d57607 Binary files /dev/null and b/template/create-new-template-preview.png differ diff --git a/template/template-preview.png b/template/template-preview.png new file mode 100644 index 0000000..70f9526 Binary files /dev/null and b/template/template-preview.png differ