From ef666630acfc369067771cca4d3ce9437ea848ef Mon Sep 17 00:00:00 2001 From: kudanai Date: Sat, 8 Apr 2017 02:25:45 +0500 Subject: [PATCH] adapted QR Scanner from Lottie Preview --- LottieSample/build.gradle | 86 ++++++++++--------- LottieSample/src/main/AndroidManifest.xml | 25 +++--- .../lottie/samples/AnimationFragment.java | 38 ++++++++ .../airbnb/lottie/samples/QRScanActivity.java | 64 ++++++++++++++ .../src/main/res/drawable/ic_qr_overlay.xml | 15 ++++ .../src/main/res/drawable/ic_qr_scan.xml | 8 ++ .../src/main/res/layout/activity_qrscan.xml | 45 ++++++++++ .../main/res/layout/fragment_animation.xml | 30 ++++++- LottieSample/src/main/res/values/strings.xml | 2 + 9 files changed, 257 insertions(+), 56 deletions(-) create mode 100644 LottieSample/src/main/java/com/airbnb/lottie/samples/QRScanActivity.java create mode 100644 LottieSample/src/main/res/drawable/ic_qr_overlay.xml create mode 100644 LottieSample/src/main/res/drawable/ic_qr_scan.xml create mode 100644 LottieSample/src/main/res/layout/activity_qrscan.xml 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