Commit 900c4c4e authored by Varun Patil's avatar Varun Patil

Add basic QR scanning

parent c6381041
...@@ -26,7 +26,8 @@ android { ...@@ -26,7 +26,8 @@ android {
ext { ext {
androidxVersion = '1.0.0' androidxVersion = '1.0.0'
playServicesVersion = '16.0.0' playServicesVersion = '17.0.0'
playServicesVisionVersion = '18.0.0'
retrofitVersion = '2.3.0' retrofitVersion = '2.3.0'
okhttpVersion = '3.14.0' okhttpVersion = '3.14.0'
picassoVersion = '2.71828' picassoVersion = '2.71828'
...@@ -53,6 +54,7 @@ dependencies { ...@@ -53,6 +54,7 @@ dependencies {
implementation "com.google.android.gms:play-services-maps:${playServicesVersion}" implementation "com.google.android.gms:play-services-maps:${playServicesVersion}"
implementation "com.google.android.gms:play-services-location:${playServicesVersion}" implementation "com.google.android.gms:play-services-location:${playServicesVersion}"
implementation "com.google.android.gms:play-services-places:${playServicesVersion}" implementation "com.google.android.gms:play-services-places:${playServicesVersion}"
implementation "com.google.android.gms:play-services-vision:${playServicesVisionVersion}"
implementation "com.squareup.retrofit2:retrofit:${retrofitVersion}" implementation "com.squareup.retrofit2:retrofit:${retrofitVersion}"
implementation "com.squareup.retrofit2:converter-gson:${retrofitVersion}" implementation "com.squareup.retrofit2:converter-gson:${retrofitVersion}"
implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}" implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}"
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<application <application
android:allowBackup="true" android:allowBackup="true"
...@@ -120,6 +122,10 @@ ...@@ -120,6 +122,10 @@
android:name="com.google.firebase.messaging.default_notification_channel_id" android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" /> android:value="@string/default_notification_channel_id" />
<meta-data
android:name="com.google.android.gms.vision.DEPENDENCIES"
android:value="barcode" />
</application> </application>
</manifest> </manifest>
\ No newline at end of file
package app.insti.fragment; package app.insti.fragment;
import android.Manifest;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.webkit.CookieManager; import android.webkit.CookieManager;
...@@ -25,9 +30,14 @@ import android.widget.Toast; ...@@ -25,9 +30,14 @@ import android.widget.Toast;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.MultiProcessor;
import com.google.android.gms.vision.Tracker;
import com.google.gson.Gson; import com.google.gson.Gson;
import app.insti.Constants; import app.insti.Constants;
...@@ -42,6 +52,12 @@ import retrofit2.Call; ...@@ -42,6 +52,12 @@ import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;
import java.io.IOException;
public class WebViewFragment extends BaseFragment { public class WebViewFragment extends BaseFragment {
public ValueCallback<Uri[]> uploadMessage; public ValueCallback<Uri[]> uploadMessage;
...@@ -53,6 +69,7 @@ public class WebViewFragment extends BaseFragment { ...@@ -53,6 +69,7 @@ public class WebViewFragment extends BaseFragment {
} }
private final String host = "insti.app"; private final String host = "insti.app";
private CameraSource mCameraSource;
public WebViewFragment withDate(String date) { public WebViewFragment withDate(String date) {
query += "&date=" + date; query += "&date=" + date;
...@@ -115,6 +132,24 @@ public class WebViewFragment extends BaseFragment { ...@@ -115,6 +132,24 @@ public class WebViewFragment extends BaseFragment {
super.onStart(); super.onStart();
} }
@Override
public void onPause() {
if (mCameraSource != null) {
SurfaceView surfaceView = getView().findViewById(R.id.qr_camera_surfaceview);
mCameraSource.stop();
surfaceView.setVisibility(View.GONE);
}
super.onPause();
}
@Override
public void onStop() {
if (mCameraSource != null) {
mCameraSource.release();
}
super.onStop();
}
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
...@@ -183,6 +218,18 @@ public class WebViewFragment extends BaseFragment { ...@@ -183,6 +218,18 @@ public class WebViewFragment extends BaseFragment {
return view; return view;
} }
private boolean isValidQR(String code) {
return code.startsWith("https://" + host);
}
private void handleQR(String code) {
if (getView() == null || getActivity() == null) return;
WebView webView = getView().findViewById(R.id.add_event_webview);
code += code.contains("?") ? "&" : "?";
webView.loadUrl(code + "sandbox=true");
}
private void setTitle(String title) { private void setTitle(String title) {
Toolbar toolbar = getActivity().findViewById(R.id.toolbar); Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
if (toolbar != null) { if (toolbar != null) {
...@@ -194,6 +241,29 @@ public class WebViewFragment extends BaseFragment { ...@@ -194,6 +241,29 @@ public class WebViewFragment extends BaseFragment {
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
@Override
public Tracker<Barcode> create(Barcode barcode) {
return new MyBarcodeTracker();
}
}
class MyBarcodeTracker extends Tracker<Barcode> {
@Override
public void onUpdate(Detector.Detections<Barcode> detectionResults, Barcode barcode) {
if (isValidQR(barcode.displayValue)) {
getActivity().runOnUiThread(new Runnable() {
public void run() {
mCameraSource.stop();
SurfaceView surfaceView = getView().findViewById(R.id.qr_camera_surfaceview);
surfaceView.setVisibility(View.GONE);
handleQR(barcode.displayValue);
}
});
}
}
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.qr_scan_menu, menu); inflater.inflate(R.menu.qr_scan_menu, menu);
...@@ -201,7 +271,52 @@ public class WebViewFragment extends BaseFragment { ...@@ -201,7 +271,52 @@ public class WebViewFragment extends BaseFragment {
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override @Override
public boolean onMenuItemClick(MenuItem menuItem) { public boolean onMenuItemClick(MenuItem menuItem) {
Toast.makeText(getContext(), "Scan QRs to get achievements!", Toast.LENGTH_LONG).show(); BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(getContext())
.setBarcodeFormats(256).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory();
barcodeDetector.setProcessor(
new MultiProcessor.Builder<>(barcodeFactory).build());
mCameraSource = new CameraSource.Builder(getContext(), barcodeDetector)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(720, 1280)
.setAutoFocusEnabled(true)
.build();
SurfaceView surfaceView = getView().findViewById(R.id.qr_camera_surfaceview);
if (surfaceView == null) {
return false;
}
if (ActivityCompat.checkSelfPermission(
getActivity().getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getContext(), "Please grant camera permission!", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.CAMERA}, 787);
return false;
}
surfaceView.setVisibility(View.VISIBLE);
/* Give surface view time to become visible */
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (ActivityCompat.checkSelfPermission(
getActivity().getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
try {
mCameraSource.start(surfaceView.getHolder());
} catch (IOException ignored) {
surfaceView.setVisibility(View.GONE);
}
}
}, 500);
return false; return false;
} }
}); });
......
...@@ -5,6 +5,12 @@ ...@@ -5,6 +5,12 @@
android:orientation="vertical" android:orientation="vertical"
tools:context="app.insti.fragment.WebViewFragment"> tools:context="app.insti.fragment.WebViewFragment">
<SurfaceView
android:id="@+id/qr_camera_surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone" />
<WebView <WebView
android:id="@+id/add_event_webview" android:id="@+id/add_event_webview"
android:layout_width="match_parent" android:layout_width="match_parent"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment