├── .gitattributes ├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.txt └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── flavienlaurent │ │ └── minimalform │ │ └── app │ │ └── MainActivity.java │ └── res │ ├── anim │ ├── alpha_in.xml │ ├── alpha_out.xml │ ├── slide_in_left.xml │ ├── slide_in_to_bottom.xml │ ├── slide_out_to_bottom.xml │ └── slide_out_to_top.xml │ ├── drawable-hdpi │ ├── custom_textfield_activated_holo_light.9.png │ ├── custom_textfield_default_holo_light.9.png │ ├── custom_textfield_disabled_focused_holo_light.9.png │ ├── custom_textfield_disabled_holo_light.9.png │ ├── custom_textfield_focused_holo_light.9.png │ └── ic_launcher.png │ ├── drawable-mdpi │ ├── custom_textfield_activated_holo_light.9.png │ ├── custom_textfield_default_holo_light.9.png │ ├── custom_textfield_disabled_focused_holo_light.9.png │ ├── custom_textfield_disabled_holo_light.9.png │ ├── custom_textfield_focused_holo_light.9.png │ └── ic_launcher.png │ ├── drawable-xhdpi │ ├── custom_textfield_activated_holo_light.9.png │ ├── custom_textfield_default_holo_light.9.png │ ├── custom_textfield_disabled_focused_holo_light.9.png │ ├── custom_textfield_disabled_holo_light.9.png │ ├── custom_textfield_focused_holo_light.9.png │ └── ic_launcher.png │ ├── drawable-xxhdpi │ ├── custom_textfield_activated_holo_light.9.png │ ├── custom_textfield_default_holo_light.9.png │ ├── custom_textfield_disabled_focused_holo_light.9.png │ ├── custom_textfield_disabled_holo_light.9.png │ ├── custom_textfield_focused_holo_light.9.png │ └── ic_launcher.png │ ├── drawable │ ├── custom_edit_text_holo_light.xml │ ├── custom_pb.xml │ ├── custom_pb_default.xml │ └── custom_pb_progress.xml │ ├── layout │ ├── activity_end.xml │ ├── activity_main.xml │ ├── view_details.xml │ ├── view_error.xml │ └── view_title.xml │ └── values │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── misc ├── demo.apk ├── demo.mp4 └── screen.png └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## AndroidStudio 3 | ################# 4 | 5 | .gradle 6 | project.properties 7 | .idea 8 | gen 9 | *.class 10 | out 11 | *.iml 12 | 13 | ################# 14 | ## Eclipse 15 | ################# 16 | 17 | *.pydevproject 18 | .project 19 | .metadata 20 | bin/ 21 | tmp/ 22 | *.tmp 23 | *.bak 24 | *.swp 25 | *~.nib 26 | local.properties 27 | .classpath 28 | .settings/ 29 | .loadpath 30 | 31 | # External tool builders 32 | .externalToolBuilders/ 33 | 34 | # Locally stored "Eclipse launch configurations" 35 | *.launch 36 | 37 | # CDT-specific 38 | .cproject 39 | 40 | # PDT-specific 41 | .buildpath 42 | 43 | 44 | ################# 45 | ## Visual Studio 46 | ################# 47 | 48 | ## Ignore Visual Studio temporary files, build results, and 49 | ## files generated by popular Visual Studio add-ons. 50 | 51 | # User-specific files 52 | *.suo 53 | *.user 54 | *.sln.docstates 55 | 56 | # Build results 57 | 58 | [Dd]ebug/ 59 | [Rr]elease/ 60 | x64/ 61 | build/ 62 | [Bb]in/ 63 | [Oo]bj/ 64 | 65 | # MSTest test Results 66 | [Tt]est[Rr]esult*/ 67 | [Bb]uild[Ll]og.* 68 | 69 | *_i.c 70 | *_p.c 71 | *.ilk 72 | *.meta 73 | *.obj 74 | *.pch 75 | *.pdb 76 | *.pgc 77 | *.pgd 78 | *.rsp 79 | *.sbr 80 | *.tlb 81 | *.tli 82 | *.tlh 83 | *.tmp 84 | *.tmp_proj 85 | *.log 86 | *.vspscc 87 | *.vssscc 88 | .builds 89 | *.pidb 90 | *.log 91 | *.scc 92 | 93 | # Visual C++ cache files 94 | ipch/ 95 | *.aps 96 | *.ncb 97 | *.opensdf 98 | *.sdf 99 | *.cachefile 100 | 101 | # Visual Studio profiler 102 | *.psess 103 | *.vsp 104 | *.vspx 105 | 106 | # Guidance Automation Toolkit 107 | *.gpState 108 | 109 | # ReSharper is a .NET coding add-in 110 | _ReSharper*/ 111 | *.[Rr]e[Ss]harper 112 | 113 | # TeamCity is a build add-in 114 | _TeamCity* 115 | 116 | # DotCover is a Code Coverage Tool 117 | *.dotCover 118 | 119 | # NCrunch 120 | *.ncrunch* 121 | .*crunch*.local.xml 122 | 123 | # Installshield output folder 124 | [Ee]xpress/ 125 | 126 | # DocProject is a documentation generator add-in 127 | DocProject/buildhelp/ 128 | DocProject/Help/*.HxT 129 | DocProject/Help/*.HxC 130 | DocProject/Help/*.hhc 131 | DocProject/Help/*.hhk 132 | DocProject/Help/*.hhp 133 | DocProject/Help/Html2 134 | DocProject/Help/html 135 | 136 | # Click-Once directory 137 | publish/ 138 | 139 | # Publish Web Output 140 | *.Publish.xml 141 | *.pubxml 142 | 143 | # NuGet Packages Directory 144 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 145 | #packages/ 146 | 147 | # Windows Azure Build Output 148 | csx 149 | *.build.csdef 150 | 151 | # Windows Store app package directory 152 | AppPackages/ 153 | 154 | # Others 155 | sql/ 156 | *.Cache 157 | ClientBin/ 158 | [Ss]tyle[Cc]op.* 159 | ~$* 160 | *~ 161 | *.dbmdl 162 | *.[Pp]ublish.xml 163 | *.pfx 164 | *.publishsettings 165 | 166 | # RIA/Silverlight projects 167 | Generated_Code/ 168 | 169 | # Backup & report files from converting an old project file to a newer 170 | # Visual Studio version. Backup files are not needed, because we have git ;-) 171 | _UpgradeReport_Files/ 172 | Backup*/ 173 | UpgradeLog*.XML 174 | UpgradeLog*.htm 175 | 176 | # SQL Server files 177 | App_Data/*.mdf 178 | App_Data/*.ldf 179 | 180 | ############# 181 | ## Windows detritus 182 | ############# 183 | 184 | # Windows image file caches 185 | Thumbs.db 186 | ehthumbs.db 187 | 188 | # Folder config file 189 | Desktop.ini 190 | 191 | # Recycle Bin used on file shares 192 | $RECYCLE.BIN/ 193 | 194 | # Mac crap 195 | .DS_Store 196 | 197 | 198 | ############# 199 | ## Python 200 | ############# 201 | 202 | *.py[co] 203 | 204 | # Packages 205 | *.egg 206 | *.egg-info 207 | dist/ 208 | build/ 209 | eggs/ 210 | parts/ 211 | var/ 212 | sdist/ 213 | develop-eggs/ 214 | .installed.cfg 215 | 216 | # Installer logs 217 | pip-log.txt 218 | 219 | # Unit test / coverage reports 220 | .coverage 221 | .tox 222 | 223 | #Translations 224 | *.mo 225 | 226 | #Mr Developer 227 | .mr.developer.cfg 228 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Single input form 2 | =============== 3 | 4 | A single EditText instead of a classical form. 5 | 6 | _Very inspired by the [Minimal Format Interface][1]._ 7 | 8 | I implemented an account creation form with only one EditText. The idea here is to pack a multiple (4 in the sample) input form in one field. As a result, the user input is easier and a more fluent process. 9 | 10 | Also, I completely rediscovered [TextSwitcher][2] to animate the form: title, error message. It's very basic but simple to use. 11 | 12 | https://www.youtube.com/watch?v=n6LrI0tL9ZA 13 | 14 | License 15 | ----------- 16 | 17 | Copyright 2013 Flavien Laurent 18 | 19 | Licensed under the Apache License, Version 2.0 (the "License"); 20 | you may not use this file except in compliance with the License. 21 | You may obtain a copy of the License at 22 | 23 | http://www.apache.org/licenses/LICENSE-2.0 24 | 25 | Unless required by applicable law or agreed to in writing, software 26 | distributed under the License is distributed on an "AS IS" BASIS, 27 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 28 | See the License for the specific language governing permissions and 29 | limitations under the License. 30 | 31 | 32 | 33 | [1]: https://github.com/codrops/MinimalForm 34 | [2]: http://developer.android.com/reference/android/widget/TextSwitcher.html 35 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'android' 2 | 3 | android { 4 | compileSdkVersion 19 5 | buildToolsVersion "19.0.3" 6 | 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 19 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | buildTypes { 14 | release { 15 | runProguard false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | compile fileTree(dir: 'libs', include: ['*.jar']) 23 | compile 'com.android.support:appcompat-v7:19.+' 24 | compile 'com.joanzapata.android:android-iconify:1.+' 25 | } 26 | -------------------------------------------------------------------------------- /app/proguard-rules.txt: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:/Users/f.laurent/AppData/Local/Android/android-studio/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the ProGuard 5 | # include property in project.properties. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/flavienlaurent/minimalform/app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.flavienlaurent.minimalform.app; 2 | 3 | import android.animation.ObjectAnimator; 4 | import android.app.Activity; 5 | import android.content.Context; 6 | import android.os.Bundle; 7 | import android.text.InputType; 8 | import android.text.TextUtils; 9 | import android.util.Property; 10 | import android.view.KeyEvent; 11 | import android.view.View; 12 | import android.view.animation.AnimationUtils; 13 | import android.view.inputmethod.EditorInfo; 14 | import android.view.inputmethod.InputMethodManager; 15 | import android.widget.EditText; 16 | import android.widget.IconTextView; 17 | import android.widget.ProgressBar; 18 | import android.widget.TextSwitcher; 19 | import android.widget.TextView; 20 | import android.widget.ViewSwitcher; 21 | 22 | public class MainActivity extends Activity { 23 | 24 | private static final Step[] sSteps = { 25 | new Step(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, R.string.email, R.string.email_error, R.string.email_details, new StepChecker() { 26 | @Override 27 | public boolean check(String input) { 28 | return android.util.Patterns.EMAIL_ADDRESS.matcher(input).matches(); 29 | } 30 | }), 31 | new Step(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD, R.string.password, R.string.password_error, R.string.password_details, new StepChecker() { 32 | @Override 33 | public boolean check(String input) { 34 | return input.length() >= 6; 35 | } 36 | }), 37 | new Step(InputType.TYPE_CLASS_NUMBER, R.string.year_of_birth, R.string.year_of_birth_error, R.string.year_of_birth_details, new StepChecker() { 38 | @Override 39 | public boolean check(String input) { 40 | return TextUtils.isDigitsOnly(input) && input.length() == 4; 41 | } 42 | }), 43 | new Step(InputType.TYPE_CLASS_TEXT, R.string.city, R.string.city_error, R.string.city_details) 44 | }; 45 | 46 | private int mStepIndex = 0; 47 | private boolean mErrored; 48 | 49 | private TextSwitcher mTitleSwitcher; 50 | private TextSwitcher mErrorSwitcher; 51 | private TextSwitcher mDetailsSwitcher; 52 | private EditText mInput; 53 | private IconTextView mNextButton; 54 | private ProgressBar mProgressbar; 55 | private TextView mStepText; 56 | private View mCompletedView; 57 | private View mRetryButton; 58 | 59 | private View.OnClickListener mOnNextButtonClickListener = new View.OnClickListener() { 60 | @Override 61 | public void onClick(View v) { 62 | nextStep(); 63 | } 64 | }; 65 | 66 | private View.OnClickListener mOnRetryButtonClickListener = new View.OnClickListener() { 67 | @Override 68 | public void onClick(View v) { 69 | hideFinalView(); 70 | mStepIndex = 0; 71 | updateStep(); 72 | } 73 | }; 74 | 75 | private TextView.OnEditorActionListener mOnInputEditorActionListener = new TextView.OnEditorActionListener() { 76 | @Override 77 | public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 78 | if (actionId == EditorInfo.IME_ACTION_NEXT || actionId == EditorInfo.IME_ACTION_DONE) { 79 | nextStep(); 80 | return true; 81 | } 82 | return false; 83 | } 84 | }; 85 | 86 | @Override 87 | protected void onCreate(Bundle savedInstanceState) { 88 | super.onCreate(savedInstanceState); 89 | setContentView(R.layout.activity_main); 90 | findViews(); 91 | 92 | setupTitle(); 93 | setupError(); 94 | setupDetails(); 95 | 96 | mInput.setOnEditorActionListener(mOnInputEditorActionListener); 97 | mNextButton.setOnClickListener(mOnNextButtonClickListener); 98 | mRetryButton.setOnClickListener(mOnRetryButtonClickListener); 99 | mErrorSwitcher.setText(""); 100 | 101 | if(savedInstanceState == null) { 102 | mStepIndex = 0; 103 | } else { 104 | mStepIndex = savedInstanceState.getInt("step_index", 0); 105 | } 106 | updateStep(); 107 | } 108 | 109 | @Override 110 | protected void onSaveInstanceState(Bundle outState) { 111 | super.onSaveInstanceState(outState); 112 | outState.putInt("step_index", mStepIndex); 113 | } 114 | 115 | @Override 116 | protected void onRestoreInstanceState(Bundle savedInstanceState) { 117 | super.onRestoreInstanceState(savedInstanceState); 118 | mStepIndex = savedInstanceState.getInt("step_index", 0); 119 | updateStep(); 120 | } 121 | 122 | private void nextStep() { 123 | Step step = sSteps[mStepIndex]; 124 | boolean checkStep = checkStep(); 125 | if(!checkStep) { 126 | if(!mErrored) { 127 | mErrored = true; 128 | mErrorSwitcher.setText(getString(step.mErrorResId)); 129 | } 130 | } else{ 131 | mErrored = false; 132 | } 133 | if(mErrored) { 134 | return; 135 | } 136 | 137 | mStepIndex++; 138 | updateStep(); 139 | mInput.setText(""); 140 | } 141 | 142 | private void updateStep() { 143 | if(mStepIndex >= maxStep()) { 144 | InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); 145 | imm.hideSoftInputFromWindow(mInput.getWindowToken(), 0); 146 | showFinalView(); 147 | return; 148 | } 149 | updateViews(); 150 | } 151 | 152 | private void hideFinalView() { 153 | mCompletedView.animate().alpha(0f).withEndAction(new Runnable() { 154 | @Override 155 | public void run() { 156 | mCompletedView.setVisibility(View.GONE); 157 | } 158 | }); 159 | } 160 | 161 | private void showFinalView() { 162 | mCompletedView.setAlpha(0.0f); 163 | mCompletedView.setVisibility(View.VISIBLE); 164 | mCompletedView.animate().alpha(1f); 165 | } 166 | 167 | private void updateViews() { 168 | if(mStepIndex +1 >= maxStep()) { 169 | mNextButton.setText("{fa-check}"); 170 | mInput.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI); 171 | } else { 172 | mNextButton.setText("{fa-arrow-right}"); 173 | mInput.setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI); 174 | } 175 | mErrorSwitcher.setText(""); 176 | Step step = sSteps[mStepIndex]; 177 | mInput.setInputType(step.mInputType); 178 | mDetailsSwitcher.setText(getString(step.mDetailsResId)); 179 | mTitleSwitcher.setText(getString(step.mTitleResId)); 180 | mStepText.setText((mStepIndex +1) + "/" + maxStep()); 181 | updateProgressbar(); 182 | } 183 | 184 | private static final Property PB_PROGRESS_PROPERTY = 185 | new Property(Integer.class, "PB_PROGRESS_PROPERTY") { 186 | 187 | @Override 188 | public void set(ProgressBar pb, Integer value) { 189 | pb.setProgress(value); 190 | } 191 | 192 | @Override 193 | public Integer get(ProgressBar pb) { 194 | return pb.getProgress(); 195 | } 196 | }; 197 | 198 | private void updateProgressbar() { 199 | mProgressbar.setMax(maxStep() * 100); 200 | ObjectAnimator.ofInt(mProgressbar, PB_PROGRESS_PROPERTY, mStepIndex *100).start(); 201 | } 202 | 203 | private boolean checkStep() { 204 | String inputText = mInput.getText().toString(); 205 | if(TextUtils.isEmpty(inputText)) { 206 | return false; 207 | } 208 | return sSteps[mStepIndex].mChecker.check(inputText); 209 | } 210 | 211 | private int maxStep() { 212 | return sSteps.length; 213 | } 214 | 215 | private void setupError() { 216 | mErrorSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_in_left)); 217 | mErrorSwitcher.setOutAnimation( AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right)); 218 | 219 | mErrorSwitcher.setFactory(new ViewSwitcher.ViewFactory() { 220 | 221 | @Override 222 | public View makeView() { 223 | return getLayoutInflater().inflate(R.layout.view_error, null); 224 | }}); 225 | 226 | mErrorSwitcher.setText(""); 227 | } 228 | 229 | private void setupTitle() { 230 | mTitleSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_in_to_bottom)); 231 | mTitleSwitcher.setOutAnimation( AnimationUtils.loadAnimation(this, R.anim.slide_out_to_top)); 232 | 233 | mTitleSwitcher.setFactory(new ViewSwitcher.ViewFactory() { 234 | 235 | @Override 236 | public View makeView() { 237 | return getLayoutInflater().inflate(R.layout.view_title, null); 238 | } 239 | }); 240 | 241 | mTitleSwitcher.setText(""); 242 | } 243 | 244 | private void setupDetails() { 245 | mDetailsSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.alpha_in)); 246 | mDetailsSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.alpha_out)); 247 | 248 | mDetailsSwitcher.setFactory(new ViewSwitcher.ViewFactory() { 249 | 250 | @Override 251 | public View makeView() { 252 | return getLayoutInflater().inflate(R.layout.view_details, null); 253 | }}); 254 | 255 | mDetailsSwitcher.setText(""); 256 | } 257 | 258 | private void findViews() { 259 | mTitleSwitcher = (TextSwitcher) findViewById(R.id.title_switcher); 260 | mErrorSwitcher = (TextSwitcher) findViewById(R.id.error_switcher); 261 | mDetailsSwitcher = (TextSwitcher) findViewById(R.id.details_switcher); 262 | mInput = (EditText) findViewById(R.id.input); 263 | mNextButton = (IconTextView) findViewById(R.id.next_button); 264 | mProgressbar = (ProgressBar) findViewById(R.id.progressbar); 265 | mStepText = (TextView) findViewById(R.id.step_text); 266 | mCompletedView = findViewById(R.id.completed); 267 | mRetryButton = findViewById(R.id.retry); 268 | } 269 | 270 | private static final class Step { 271 | private int mInputType; 272 | private int mTitleResId; 273 | private int mErrorResId; 274 | private int mDetailsResId; 275 | private final StepChecker mChecker; 276 | 277 | private Step(int inputType, int titleResId, int errorResId, int detailsResId, StepChecker checker) { 278 | mInputType = inputType; 279 | mTitleResId = titleResId; 280 | mErrorResId = errorResId; 281 | mDetailsResId = detailsResId; 282 | mChecker = checker; 283 | } 284 | 285 | private Step(int type, int titleResId, int errorResId, int detailsResId) { 286 | this(type, titleResId, errorResId, detailsResId, new StepChecker() { 287 | @Override 288 | public boolean check(String input) { 289 | return true; 290 | } 291 | }); 292 | } 293 | } 294 | 295 | private interface StepChecker { 296 | boolean check(String input); 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /app/src/main/res/anim/alpha_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/alpha_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_to_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_to_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_to_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/custom_textfield_activated_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-hdpi/custom_textfield_activated_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/custom_textfield_default_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-hdpi/custom_textfield_default_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/custom_textfield_disabled_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-hdpi/custom_textfield_disabled_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/custom_textfield_disabled_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-hdpi/custom_textfield_disabled_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/custom_textfield_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-hdpi/custom_textfield_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/custom_textfield_activated_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-mdpi/custom_textfield_activated_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/custom_textfield_default_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-mdpi/custom_textfield_default_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/custom_textfield_disabled_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-mdpi/custom_textfield_disabled_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/custom_textfield_disabled_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-mdpi/custom_textfield_disabled_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/custom_textfield_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-mdpi/custom_textfield_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/custom_textfield_activated_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xhdpi/custom_textfield_activated_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/custom_textfield_default_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xhdpi/custom_textfield_default_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/custom_textfield_disabled_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xhdpi/custom_textfield_disabled_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/custom_textfield_disabled_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xhdpi/custom_textfield_disabled_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/custom_textfield_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xhdpi/custom_textfield_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/custom_textfield_activated_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xxhdpi/custom_textfield_activated_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/custom_textfield_default_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xxhdpi/custom_textfield_default_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/custom_textfield_disabled_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xxhdpi/custom_textfield_disabled_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/custom_textfield_disabled_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xxhdpi/custom_textfield_disabled_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/custom_textfield_focused_holo_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xxhdpi/custom_textfield_focused_holo_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/app/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_edit_text_holo_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_pb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_pb_default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_pb_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_end.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | 10 | 15 | 16 | 21 | 22 | 26 | 27 | 31 | 32 | 40 | 41 | 50 | 51 | 52 | 58 | 59 | 64 | 65 | 71 | 72 | 82 | 83 | 84 | 85 | 86 | 87 | 92 | 93 | 94 | 95 | 96 | 104 | 105 | 111 | 112 | 120 | 121 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_details.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_error.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Single input form 5 | E-mail 6 | Empty or not well-formed 7 | Your e-mail will be used as your login. Type the one you use most often. 8 | Password 9 | Empty or not 5-chars long 10 | Type your own password (5-chars long). Your personal information is protected with this password. 11 | Year of birth 12 | Empty or not 4-digits long. 13 | We will use your year of birth (4-digits long) only to calculate your age. 14 | City 15 | Enter a city. 16 | We need this information to find you if you mess with us. 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | #67A7C2 10 | #5F9EB7 11 | #3B606F 12 | #437181 13 | #FFFFFF 14 | 15 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | mavenCentral() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:0.9.+' 9 | } 10 | } 11 | 12 | allprojects { 13 | repositories { 14 | mavenCentral() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Settings specified in this file will override any Gradle settings 5 | # configured through the IDE. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Apr 10 15:27:10 PDT 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.10-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /misc/demo.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/misc/demo.apk -------------------------------------------------------------------------------- /misc/demo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/misc/demo.mp4 -------------------------------------------------------------------------------- /misc/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flavienlaurent/singleinputform/51afa535875c1f558489662b1840c3ea89cc62ee/misc/screen.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------