package org.awesomeapp.messenger.ui.qr;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
import static android.graphics.Color.BLACK;
import static android.graphics.Color.WHITE;
import static android.view.Gravity.CENTER;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.widget.ImageView.ScaleType.FIT_CENTER;
import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL;
import im.zom.messenger.R;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import org.awesomeapp.messenger.ImApp;
import org.awesomeapp.messenger.ui.BaseActivity;
import org.awesomeapp.messenger.ui.onboarding.OnboardingManager;
import java.util.ArrayList;
@SuppressWarnings("deprecation")
public class QrScanActivity extends BaseActivity
implements QrCodeDecoder.ResultCallback {
private static String TAG = QrScanActivity.class.getPackage().getName();
private CameraView cameraView = null;
private LinearLayout cameraBorder = null;
private LinearLayout layoutMain = null;
private Camera camera = null;
private boolean gotResult = false;
private Intent dataResult = new Intent();
ArrayList<String> resultStrings = new ArrayList<String>();
private final static int MY_PERMISSIONS_REQUEST_CAMERA = 1;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR);
getSupportActionBar().hide();
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA);
if (permissionCheck == PackageManager.PERMISSION_DENIED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
finish();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
else
{
init ();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
init();
} else {
finish();
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
private void init ()
{
String qrData = getIntent().getStringExtra(Intent.EXTRA_TEXT);
cameraView = new CameraView(this);
cameraBorder = new LinearLayout(this);
cameraBorder.setGravity(CENTER);
cameraBorder.setBackgroundColor(BLACK);
cameraBorder.setLayoutParams(new LayoutParams(MATCH_PARENT,
WRAP_CONTENT, 1f));
cameraBorder.addView(cameraView);
ImageView qrCodeView = new ImageView(this);
qrCodeView.setScaleType(FIT_CENTER);
qrCodeView.setBackgroundColor(WHITE);
qrCodeView.setLayoutParams(new LayoutParams(MATCH_PARENT,
WRAP_CONTENT, 1f));
Display display = getWindowManager().getDefaultDisplay();
boolean portrait = display.getWidth() < display.getHeight();
layoutMain = new LinearLayout(this);
if(portrait) layoutMain.setOrientation(VERTICAL);
else layoutMain.setOrientation(HORIZONTAL);
layoutMain.setWeightSum(2);
layoutMain.addView(cameraBorder);
layoutMain.addView(qrCodeView);
setContentView(layoutMain);
new QrGenAsyncTask(this, qrCodeView, display.getWidth()).executeOnExecutor(ImApp.sThreadPoolExecutor,qrData);
}
@Override
protected void onResume() {
super.onResume();
openCamera();
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
private void openCamera() {
Log.d(TAG, "Opening camera");
try {
camera = Camera.open();
cameraView.start(camera, new QrCodeDecoder(this), 0, true);
} catch(Exception e) {
Log.e(TAG, "Error opening camera", e);
}
}
private void releaseCamera() {
Log.d(TAG, "Releasing camera");
try {
cameraView.stop();
camera.release();
} catch(Exception e) {
Log.e(TAG, "Error releasing camera", e);
}
}
public void handleResult(final Result result) {
runOnUiThread(new Runnable() {
public void run() {
gotResult = true;
String resultString = result.getText();
if (!resultStrings.contains(resultString)) {
resultStrings.add(resultString);
dataResult.putStringArrayListExtra("result", resultStrings);
String[] parts = OnboardingManager.decodeInviteLink(resultString);
String message = null;
if (parts != null) {
message = getString(R.string.add_contact_success,parts[0]);
} else {
message = getString(R.string.add_contact_success,resultString);
}
if (message != null)
{
Snackbar.make(layoutMain, message, Snackbar.LENGTH_LONG).show();
}
setResult(RESULT_OK, dataResult);
}
}
});
}
}