Skip to content

Commit

Permalink
Add initial commit.
Browse files Browse the repository at this point in the history
  • Loading branch information
liutikas committed Sep 27, 2016
0 parents commit f281103
Show file tree
Hide file tree
Showing 38 changed files with 782 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
22 changes: 22 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions .idea/copyright/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 46 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/runConfigurations.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
29 changes: 29 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "net.liutikas.stepperwidget"
minSdkVersion 9
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
17 changes: 17 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/aurimas/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package net.liutikas.stepperwidget;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();

assertEquals("net.liutikas.stepperwidget", appContext.getPackageName());
}
}
20 changes: 20 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.liutikas.stepperwidget">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
13 changes: 13 additions & 0 deletions app/src/main/java/net/liutikas/stepperwidget/MainActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.liutikas.stepperwidget;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
136 changes: 136 additions & 0 deletions app/src/main/java/net/liutikas/stepperwidget/StepperWidget.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package net.liutikas.stepperwidget;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

public class StepperWidget extends LinearLayout {
private final ImageButton mPlusButton;
private final ImageButton mMinusButton;
private final TextView mLabelOne;
private final TextView mLabelTwo;
private boolean mLabelOneVisible = false;
private int mCounter = 0;
private int mChange = 0;

private ValueAnimator mAnimator;

public StepperWidget(Context context) {
this(context, null);
}

public StepperWidget(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public StepperWidget(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs);
setOrientation(VERTICAL);
inflate(context, R.layout.stepper, this);
mPlusButton = (ImageButton) findViewById(R.id.plus);
mMinusButton = (ImageButton) findViewById(R.id.minus);
mLabelOne = (TextView) findViewById(R.id.label1);
mLabelTwo = (TextView) findViewById(R.id.label2);
mPlusButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
updateLabel(1);
}
});
mMinusButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
updateLabel(-1);
}
});
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
initalizeAnimator();
}
updateLabel(0);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void initalizeAnimator() {
mAnimator = ValueAnimator.ofInt(100);
mAnimator.setDuration(300);
mAnimator.setInterpolator(new FastOutSlowInInterpolator());
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Integer value = (Integer) valueAnimator.getAnimatedValue();
if (value < 100 && mChange == 0) {
mAnimator.end();
} else if (mChange < 0) {
getEnteringLabel().setTranslationY(100 - value);
getLeavingLabel().setTranslationY(-value);
} else {
getEnteringLabel().setTranslationY(-100 + value);
getLeavingLabel().setTranslationY(value);
}
}
});
mAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {}

@Override
public void onAnimationEnd(Animator animator) {
getLeavingLabel().setVisibility(INVISIBLE);
mLabelOneVisible = !mLabelOneVisible;
}

@Override
public void onAnimationCancel(Animator animator) {}

@Override
public void onAnimationRepeat(Animator animator) {}
});
}

private TextView getEnteringLabel() {
return mLabelOneVisible ? mLabelTwo : mLabelOne;
}

private TextView getLeavingLabel() {
return mLabelOneVisible ? mLabelOne : mLabelTwo;
}

private void updateLabel(int change) {
mCounter += change;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
updateLabelAnimated(change);
return;
}
if (mLabelOneVisible) {
mLabelTwo.setText(Integer.toString(mCounter));
mLabelOne.setVisibility(INVISIBLE);
mLabelTwo.setVisibility(VISIBLE);
} else {
mLabelOne.setText(Integer.toString(mCounter));
mLabelOne.setVisibility(VISIBLE);
mLabelTwo.setVisibility(INVISIBLE);
}
mLabelOneVisible = !mLabelOneVisible;
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void updateLabelAnimated(final int change) {
if (mAnimator.isRunning()) {
mAnimator.end();
}
mChange = change;
final TextView enteringLabel = getEnteringLabel();
enteringLabel.setText(Integer.toString(mCounter));
enteringLabel.setVisibility(VISIBLE);

mAnimator.start();
}
}
Loading

0 comments on commit f281103

Please sign in to comment.