Skip to content

Commit 82eef52

Browse files
committed
Add Android Studio Template for faster generating new AVM Fragments
1 parent 2150a4d commit 82eef52

13 files changed

+314
-0
lines changed

README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,24 @@ Download
114114
```groovy
115115
compile 'eu.inloop:androidviewmodel:1.3.1'
116116
```
117+
118+
## Android Studio Template
119+
For faster creating new screens, you can use [Android Studio Template](/template/AVM_Inloop)
120+
121+
![Android Studio Template Window](/template/template-preview.png)
122+
123+
### Install template
124+
#### Manually:
125+
Copy the template folder to Android Studio templates folder (`/Applications/Android Studio.app/Contents/plugins/android/lib/templates/others` on Mac)
126+
#### Automatically:
127+
Run the following command to download and install the template automatically (Mac only)
128+
```
129+
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
130+
```
131+
<b>Don't forget to restart the Android Studio.</b>
132+
133+
### Usage
134+
In the Android Studio right click inside the Projet window and select `File > New > AndroidViewModel Inloop > AVM Fragment`
135+
136+
137+
![Android Studio New Template](/template/create-new-template-preview.png)
4.17 KB
Loading
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0"?>
2+
<globals>
3+
<global id="generateActivityTitle" type="boolean" value="false" />
4+
<#include "../../activities/common/common_globals.xml.ftl" />
5+
</globals>

template/AVM_Inloop/recipe.xml.ftl

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?xml version="1.0"?>
2+
<recipe>
3+
4+
<#if appCompat && !(hasDependency('eu.inloop:androidviewmodel'))>
5+
<dependency mavenUrl="eu.inloop:androidviewmodel:1.3.1"/>
6+
</#if>
7+
8+
<#if screenType == "Fragment">
9+
<instantiate from="src/app_package/layout.xml.ftl"
10+
to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
11+
<instantiate from="src/app_package/Fragment.java.ftl"
12+
to="${escapeXmlAttribute(srcOut)}/${scrPackage}/${screenClass}.java" />
13+
</#if>
14+
<#if screenType == "BindingFragment">
15+
<instantiate from="src/app_package/binding_layout.xml.ftl"
16+
to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
17+
<instantiate from="src/app_package/BindingFragment.java.ftl"
18+
to="${escapeXmlAttribute(srcOut)}/${scrPackage}/${screenClass}.java" />
19+
</#if>
20+
<instantiate from="src/app_package/ViewModel.java.ftl"
21+
to="${escapeXmlAttribute(srcOut)}/${vmPackage}/${viewModelClass}.java" />
22+
<#if generateViewInterface>
23+
<instantiate from="src/app_package/ViewInterface.java.ftl"
24+
to="${escapeXmlAttribute(srcOut)}/${vPackage}/I${viewModelClass?replace('ViewModel', 'View')}.java" />
25+
</#if>
26+
27+
28+
<#if scrPackage != "">
29+
<open file="${escapeXmlAttribute(srcOut)}/${scrPackage}/${screenClass}.java" />
30+
<#else>
31+
<open file="${escapeXmlAttribute(srcOut)}/${screenClass}.java" />
32+
</#if>
33+
34+
<#if vmPackage != "">
35+
<open file="${escapeXmlAttribute(srcOut)}/${vmPackage}/${viewModelClass}.java" />
36+
<#else>
37+
<open file="${escapeXmlAttribute(srcOut)}/${viewModelClass}.java" />
38+
</#if>
39+
40+
<#if vPackage != "">
41+
<open file="${escapeXmlAttribute(srcOut)}/${vPackage}/I${viewModelClass?replace('ViewModel', 'View')}.java" />
42+
<#else>
43+
<open file="${escapeXmlAttribute(srcOut)}/I${viewModelClass?replace('ViewModel', 'View')}.java" />
44+
</#if>
45+
46+
<open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
47+
48+
</recipe>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package ${packageName}<#if scrPackage != "">.${scrPackage}</#if>;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.View;
6+
<#if vPackage != "">
7+
import ${packageName}<#if vPackage != "">.${vPackage?replace('/','.')}</#if>.I${viewModelClass?replace('ViewModel', 'View')};
8+
<#else>
9+
import eu.inloop.viewmodel.IView;
10+
</#if>
11+
import eu.inloop.viewmodel.binding.ViewModelBaseBindingFragment;
12+
import eu.inloop.viewmodel.binding.ViewModelBindingConfig;
13+
import ${packageName}.databinding.${underscoreToCamelCase(layoutName)}Binding;
14+
import ${packageName}.R;
15+
import ${packageName}<#if vmPackage != "">.${vmPackage?replace('/','.')}</#if>.${viewModelClass};
16+
17+
<#if vPackage != "">
18+
public class ${screenClass}
19+
extends ViewModelBase${screenType}<I${viewModelClass?replace('ViewModel', 'View')}, ${viewModelClass}, ${underscoreToCamelCase(layoutName)}Binding>
20+
implements I${viewModelClass?replace('ViewModel', 'View')} {
21+
<#else>
22+
public class ${screenClass} extends ViewModelBase${screenType}<IView, ${viewModelClass}, ${underscoreToCamelCase(layoutName)}Binding> {
23+
</#if>
24+
25+
26+
public static ${screenClass} newInstance() {
27+
final Bundle bundle = new Bundle();
28+
// set arguments
29+
final ${screenClass} fragment = new ${screenClass}();
30+
fragment.setArguments(bundle);
31+
return fragment;
32+
}
33+
34+
@Override
35+
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
36+
super.onViewCreated(view, savedInstanceState);
37+
setModelView(this);
38+
}
39+
40+
@Override
41+
public ViewModelBindingConfig getViewModelBindingConfig() {
42+
return new ViewModelBindingConfig(R.layout.${layoutName}, getActivity());
43+
}
44+
45+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package ${packageName}<#if scrPackage != "">.${scrPackage}</#if>;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
<#if vPackage != "">
9+
import ${packageName}<#if vPackage != "">.${vPackage?replace('/','.')}</#if>.I${viewModelClass?replace('ViewModel', 'View')};
10+
<#else>
11+
import eu.inloop.viewmodel.IView;
12+
</#if>
13+
import eu.inloop.viewmodel.base.ViewModelBaseFragment;
14+
import ${packageName}.R;
15+
import ${packageName}<#if vmPackage != "">.${vmPackage?replace('/','.')}</#if>.${viewModelClass};
16+
17+
<#if vPackage != "">
18+
public class ${screenClass}
19+
extends ViewModelBase${screenType}<I${viewModelClass?replace('ViewModel', 'View')}, ${viewModelClass}>
20+
implements I${viewModelClass?replace('ViewModel', 'View')} {
21+
<#else>
22+
public class ${screenClass} extends ViewModelBase${screenType}<IView, ${viewModelClass}> {
23+
</#if>
24+
25+
public static ${screenClass} newInstance() {
26+
final Bundle bundle = new Bundle();
27+
// set arguments
28+
final ${screenClass} fragment = new ${screenClass}();
29+
fragment.setArguments(bundle);
30+
return fragment;
31+
}
32+
33+
@Override
34+
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
35+
return inflater.inflate(R.layout.${layoutName}, container, false);
36+
}
37+
38+
@Override
39+
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
40+
super.onViewCreated(view, savedInstanceState);
41+
42+
setModelView(this);
43+
}
44+
45+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
package ${packageName}<#if vmPackage != "">.${vPackage?replace('/','.')}</#if>;
3+
4+
import eu.inloop.viewmodel.IView;
5+
6+
public interface I${viewModelClass?replace('ViewModel', 'View')} extends IView {
7+
8+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
package ${packageName}<#if vmPackage != "">.${vmPackage}</#if>;
3+
4+
import android.os.Bundle;
5+
import android.support.annotation.Nullable;
6+
import eu.inloop.viewmodel.AbstractViewModel;
7+
<#if vPackage != "">
8+
import ${packageName}<#if vPackage != "">.${vPackage?replace('/','.')}</#if>.I${viewModelClass?replace('ViewModel', 'View')};
9+
<#else>
10+
import eu.inloop.viewmodel.IView;
11+
</#if>
12+
13+
<#if vPackage != "">
14+
public class ${viewModelClass} extends AbstractViewModel<I${viewModelClass?replace('ViewModel', 'View')}> {
15+
<#else>
16+
public class ${viewModelClass} extends AbstractViewModel<IView> {
17+
</#if>
18+
19+
@Override
20+
public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) {
21+
super.onCreate(arguments, savedInstanceState);
22+
23+
}
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
tools:context="<#if scrPackage != "">.${scrPackage?replace('/','.')}</#if>.${screenClass}">
6+
7+
<data>
8+
<variable
9+
name="viewModel"
10+
type="${packageName}.<#if vmPackage != "">${vmPackage?replace('/','.')}.</#if>${viewModelClass}"/>
11+
</data>
12+
13+
<FrameLayout
14+
android:layout_width="match_parent"
15+
android:layout_height="match_parent">
16+
17+
</FrameLayout>
18+
19+
</layout>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<FrameLayout
2+
xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
tools:context="<#if scrPackage != "">.${scrPackage?replace('/','.')}</#if>.${screenClass}"
6+
android:layout_width="match_parent"
7+
android:layout_height="match_parent">
8+
9+
</FrameLayout>

0 commit comments

Comments
 (0)