diff --git a/LottieSample/build.gradle b/LottieSample/build.gradle
index 21fe7e6880..24ccf9646b 100644
--- a/LottieSample/build.gradle
+++ b/LottieSample/build.gradle
@@ -2,52 +2,56 @@ apply plugin: 'com.android.application'
apply plugin: 'com.facebook.testing.screenshot'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId "com.airbnb.lottie"
- minSdkVersion 16
- targetSdkVersion 25
- versionCode 9
- versionName "2.0.0-beta3"
- testInstrumentationRunner "com.airbnb.lottie.TestRunner"
- }
- buildTypes {
- release {
- minifyEnabled false
- }
- }
- lintOptions {
- ignore 'InvalidPackage'
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ compileSdkVersion 25
+ buildToolsVersion "25.0.2"
+ defaultConfig {
+ applicationId "com.airbnb.lottie"
+ minSdkVersion 16
+ targetSdkVersion 25
+ versionCode 9
+ versionName "2.0.0-beta3"
+ testInstrumentationRunner "com.airbnb.lottie.TestRunner"
+ vectorDrawables.useSupportLibrary = true
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
}
+ }
+ lintOptions {
+ ignore 'InvalidPackage'
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
}
dependencies {
- compile project(':lottie')
- compile 'com.android.support:appcompat-v7:25.3.1'
- compile 'com.android.support:recyclerview-v7:25.3.1'
- compile 'com.android.support:design:25.3.1'
- compile 'com.jakewharton:butterknife:8.2.1'
- annotationProcessor 'com.jakewharton:butterknife-compiler:8.2.1'
- compile 'com.squareup.okhttp3:okhttp:3.5.0'
- compile 'com.matthew-tamlin:sliding-intro-screen:3.2.0'
+ compile project(':lottie')
+ compile 'com.android.support:appcompat-v7:25.3.1'
+ compile 'com.android.support:recyclerview-v7:25.3.1'
+ compile 'com.android.support:design:25.3.1'
+ compile 'com.jakewharton:butterknife:8.2.1'
+ annotationProcessor 'com.jakewharton:butterknife-compiler:8.2.1'
+ compile 'com.squareup.okhttp3:okhttp:3.5.0'
+ compile 'com.matthew-tamlin:sliding-intro-screen:3.2.0'
+ compile 'com.dlazaro66.qrcodereaderview:qrcodereaderview:2.0.2'
+
- debugCompile 'com.github.brianPlummer:tinydancer:0.0.9'
+ debugCompile 'com.github.brianPlummer:tinydancer:0.0.9'
- testCompile 'junit:junit:4.12'
+ testCompile 'junit:junit:4.12'
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- exclude group: 'org.hamcrest', module: 'hamcrest-integration'
- })
- androidTestCompile('com.android.support.test:runner:0.5', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- androidTestCompile('com.android.support.test:rules:0.5', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
+ androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ exclude group: 'org.hamcrest', module: 'hamcrest-integration'
+ })
+ androidTestCompile('com.android.support.test:runner:0.5', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+ androidTestCompile('com.android.support.test:rules:0.5', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+ compile 'com.android.support.constraint:constraint-layout:1.0.2'
}
diff --git a/LottieSample/src/main/AndroidManifest.xml b/LottieSample/src/main/AndroidManifest.xml
index 2831dce867..622365d4f0 100644
--- a/LottieSample/src/main/AndroidManifest.xml
+++ b/LottieSample/src/main/AndroidManifest.xml
@@ -2,18 +2,20 @@
-
-
+
+
+
+
+ android:theme="@style/AppTheme">
@@ -21,15 +23,16 @@
-
+
-
-
+
\ No newline at end of file
diff --git a/LottieSample/src/main/java/com/airbnb/lottie/samples/AnimationFragment.java b/LottieSample/src/main/java/com/airbnb/lottie/samples/AnimationFragment.java
index 88dd018ff8..d8396b9e61 100644
--- a/LottieSample/src/main/java/com/airbnb/lottie/samples/AnimationFragment.java
+++ b/LottieSample/src/main/java/com/airbnb/lottie/samples/AnimationFragment.java
@@ -1,15 +1,20 @@
package com.airbnb.lottie.samples;
+import android.Manifest;
import android.animation.Animator;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
+import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
+import android.support.v4.content.ContextCompat;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatSeekBar;
@@ -56,7 +61,12 @@ public class AnimationFragment extends Fragment {
private static final int RC_ASSET = 1337;
private static final int RC_FILE = 1338;
private static final int RC_URL = 1339;
+ private static final int RC_QR = 1340;
+ private static final int RC_CAMERA = 1341;
+
+
static final String EXTRA_ANIMATION_NAME = "animation_name";
+ static final String EXTRA_URL = "json_url";
static AnimationFragment newInstance() {
return new AnimationFragment();
@@ -183,6 +193,9 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
break;
case RC_URL:
+ break;
+ case RC_QR:
+ loadUrl(data.getExtras().getString(EXTRA_URL));
break;
}
}
@@ -216,6 +229,31 @@ void onLoopChanged() {
animationView.loop(loopButton.isActivated());
}
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+ @NonNull int[] grantResults) {
+ if (requestCode==RC_CAMERA && grantResults.length > 0 && grantResults[0] == PackageManager
+ .PERMISSION_GRANTED) {
+ startActivityForResult(new Intent(getContext(), QRScanActivity.class), RC_QR);
+ } else {
+ Toast.makeText(getContext(),R.string.permission_required,Toast.LENGTH_LONG).show();
+ }
+
+ }
+
+ @OnClick(R.id.qrscan)
+ void onQRScanClicked() {
+ animationView.cancelAnimation();
+ if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) !=
+ PackageManager.PERMISSION_GRANTED) {
+
+ requestPermissions(new String[]{Manifest.permission.CAMERA}, RC_CAMERA);
+
+ } else {
+ startActivityForResult(new Intent(getContext(), QRScanActivity.class), RC_QR);
+ }
+ }
+
@OnClick(R.id.restart)
void onRestartClicked() {
boolean restart = animationView.isAnimating();
diff --git a/LottieSample/src/main/java/com/airbnb/lottie/samples/QRScanActivity.java b/LottieSample/src/main/java/com/airbnb/lottie/samples/QRScanActivity.java
new file mode 100644
index 0000000000..49d66377f5
--- /dev/null
+++ b/LottieSample/src/main/java/com/airbnb/lottie/samples/QRScanActivity.java
@@ -0,0 +1,64 @@
+package com.airbnb.lottie.samples;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.PointF;
+import android.os.Vibrator;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+
+import com.dlazaro66.qrcodereaderview.QRCodeReaderView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class QRScanActivity extends AppCompatActivity
+ implements QRCodeReaderView.OnQRCodeReadListener {
+
+ @BindView(R.id.qrdecoderview) QRCodeReaderView qrCodeReaderView;
+ private Vibrator vibrator;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_qrscan);
+ ButterKnife.bind(this);
+
+ vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+
+ /*
+ * Initialize the QR Scanner component
+ */
+ qrCodeReaderView.setQRDecodingEnabled(true);
+ qrCodeReaderView.setAutofocusInterval(2000L);
+ qrCodeReaderView.setBackCamera();
+ qrCodeReaderView.setOnQRCodeReadListener(this);
+ qrCodeReaderView.setOnClickListener(v -> qrCodeReaderView.forceAutoFocus());
+
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ qrCodeReaderView.stopCamera();
+ }
+
+ @Override public void onQRCodeRead(String s, PointF[] pointFS) {
+ vibrator.vibrate(100);
+
+ Intent resultIntent = new Intent();
+ resultIntent.putExtra(AnimationFragment.EXTRA_URL, s);
+ setResult(Activity.RESULT_OK, resultIntent);
+ finish();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ qrCodeReaderView.startCamera();
+ }
+
+
+
+}
diff --git a/LottieSample/src/main/res/drawable/ic_qr_overlay.xml b/LottieSample/src/main/res/drawable/ic_qr_overlay.xml
new file mode 100644
index 0000000000..aee0e22c19
--- /dev/null
+++ b/LottieSample/src/main/res/drawable/ic_qr_overlay.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/LottieSample/src/main/res/drawable/ic_qr_scan.xml b/LottieSample/src/main/res/drawable/ic_qr_scan.xml
new file mode 100644
index 0000000000..ece0b6846f
--- /dev/null
+++ b/LottieSample/src/main/res/drawable/ic_qr_scan.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/LottieSample/src/main/res/layout/activity_qrscan.xml b/LottieSample/src/main/res/layout/activity_qrscan.xml
new file mode 100644
index 0000000000..9773d58d54
--- /dev/null
+++ b/LottieSample/src/main/res/layout/activity_qrscan.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LottieSample/src/main/res/layout/fragment_animation.xml b/LottieSample/src/main/res/layout/fragment_animation.xml
index e8b50b8b9d..4c4924ffc7 100644
--- a/LottieSample/src/main/res/layout/fragment_animation.xml
+++ b/LottieSample/src/main/res/layout/fragment_animation.xml
@@ -1,5 +1,6 @@
+
+
+
@@ -104,14 +115,25 @@
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_loop"/>
+
+
+
+ app:srcCompat="@drawable/ic_restart"/>
+ app:srcCompat="@drawable/ic_assets"/>
+ app:srcCompat="@drawable/ic_file"/>
+ app:srcCompat="@drawable/ic_network"/>
diff --git a/LottieSample/src/main/res/values/strings.xml b/LottieSample/src/main/res/values/strings.xml
index cc18ed13b9..667e13330a 100644
--- a/LottieSample/src/main/res/values/strings.xml
+++ b/LottieSample/src/main/res/values/strings.xml
@@ -3,4 +3,6 @@
Unable to load assets
Use hardware acceleration
Enable merge paths (KK+ only)
+ Camera permissions are required to use the QR Scanner
+ Scan QR Code from lottiefiles.com