unfinishd qr code implemenation. thanks to @emdete

This commit is contained in:
iNPUTmice 2014-11-03 22:47:07 +01:00
parent 4614ff343e
commit d458919c8f
6 changed files with 132 additions and 18 deletions

View file

@ -34,6 +34,8 @@ dependencies {
compile 'com.android.support:support-v13:19.1.0' compile 'com.android.support:support-v13:19.1.0'
compile 'org.bouncycastle:bcprov-jdk15on:1.50' compile 'org.bouncycastle:bcprov-jdk15on:1.50'
compile 'net.java:otr4j:0.21' compile 'net.java:otr4j:0.21'
compile 'com.google.zxing:core:3.1.0'
compile 'com.google.zxing:android-integration:3.1.0'
} }
android { android {

View file

@ -1,23 +1,44 @@
package eu.siacs.conversations.ui; package eu.siacs.conversations.ui;
import android.app.AlertDialog;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView; import android.widget.AutoCompleteTextView;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.util.Hashtable;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R; import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
@ -222,6 +243,42 @@ public class EditAccountActivity extends XmppActivity {
} }
} }
protected void showQrCode() {
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
final int width = (size.x < size.y ? size.x : size.y);
String jid = mAccount.getJid();
Bitmap bitmap = createQrCodeBitmap("xmpp:" + jid, width);
ImageView view = new ImageView(this);
view.setImageBitmap(bitmap);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
builder.create().show();
}
protected Bitmap createQrCodeBitmap(String input, int size) {
try {
final QRCodeWriter QR_CODE_WRITER = new QRCodeWriter();
final Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
final BitMatrix result = QR_CODE_WRITER.encode(input, BarcodeFormat.QR_CODE, size, size, hints);
final int width = result.getWidth();
final int height = result.getHeight();
final int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
final int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = result.get(x, y) ? Color.BLACK : Color.TRANSPARENT;
}
}
final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
} catch (final WriterException e) {
return null;
}
}
protected void updateSaveButton() { protected void updateSaveButton() {
if (mAccount != null if (mAccount != null
&& mAccount.getStatus() == Account.STATUS_CONNECTING) { && mAccount.getStatus() == Account.STATUS_CONNECTING) {
@ -298,6 +355,27 @@ public class EditAccountActivity extends XmppActivity {
}); });
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.editaccount, menu);
MenuItem showQrCode = menu.findItem(R.id.action_show_qr_code);
if (mAccount == null) {
showQrCode.setVisible(false);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_show_qr_code:
showQrCode();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
@ -387,7 +465,7 @@ public class EditAccountActivity extends XmppActivity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (copyTextToClipboard(fingerprint,R.string.otr_fingerprint)) { if (copyTextToClipboard(fingerprint, R.string.otr_fingerprint)) {
Toast.makeText( Toast.makeText(
EditAccountActivity.this, EditAccountActivity.this,
R.string.toast_message_otr_fingerprint, R.string.toast_message_otr_fingerprint,

View file

@ -24,6 +24,7 @@ import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -40,6 +41,11 @@ import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;
import android.widget.Spinner; import android.widget.Spinner;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R; import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Bookmark; import eu.siacs.conversations.entities.Bookmark;
@ -491,10 +497,13 @@ public class StartConversationActivity extends XmppActivity {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_create_contact: case R.id.action_create_contact:
showCreateContactDialog(null); showCreateContactDialog(null);
break; return true;
case R.id.action_join_conference: case R.id.action_join_conference:
showJoinConferenceDialog(); showJoinConferenceDialog();
break; return true;
case R.id.action_scan_qr_code:
new IntentIntegrator(this).initiateScan();
return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@ -508,6 +517,18 @@ public class StartConversationActivity extends XmppActivity {
return super.onKeyUp(keyCode, event); return super.onKeyUp(keyCode, event);
} }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if ((requestCode & 0xFFFF) == IntentIntegrator.REQUEST_CODE) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (scanResult != null && scanResult.getFormatName() != null) {
String data = scanResult.getContents();
Log.d(Config.LOGTAG, data);
}
}
super.onActivityResult(requestCode,requestCode,intent);
}
@Override @Override
protected void onBackendConnected() { protected void onBackendConnected() {
xmppConnectionService.setOnRosterUpdateListener(this.onRosterUpdate); xmppConnectionService.setOnRosterUpdateListener(this.onRosterUpdate);

View file

@ -0,0 +1,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_show_qr_code"
android:title="@string/show_qr_code"
android:showAsAction="never" />
</menu>

View file

@ -1,31 +1,35 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item <item
android:id="@+id/action_search" android:id="@+id/action_search"
android:actionLayout="@layout/actionview_search" android:actionLayout="@layout/actionview_search"
android:icon="@drawable/ic_action_search" android:icon="@drawable/ic_action_search"
android:showAsAction="collapseActionView|always" android:showAsAction="collapseActionView|always"
android:title="@string/search"/> android:title="@string/search" />
<item <item
android:id="@+id/action_create_contact" android:id="@+id/action_create_contact"
android:icon="@drawable/ic_action_add_person" android:icon="@drawable/ic_action_add_person"
android:showAsAction="always" android:showAsAction="always"
android:title="@string/create_contact"/> android:title="@string/create_contact" />
<item <item
android:id="@+id/action_join_conference" android:id="@+id/action_join_conference"
android:icon="@drawable/ic_action_add_group" android:icon="@drawable/ic_action_add_group"
android:showAsAction="always" android:showAsAction="always"
android:title="@string/join_conference"/> android:title="@string/join_conference" />
<item
android:id="@+id/action_scan_qr_code"
android:showAsAction="never"
android:title="@string/scan_qr_code" />
<item <item
android:id="@+id/action_accounts" android:id="@+id/action_accounts"
android:orderInCategory="90" android:orderInCategory="90"
android:showAsAction="never" android:showAsAction="never"
android:title="@string/action_accounts"/> android:title="@string/action_accounts" />
<item <item
android:id="@+id/action_settings" android:id="@+id/action_settings"
android:orderInCategory="100" android:orderInCategory="100"
android:showAsAction="never" android:showAsAction="never"
android:title="@string/action_settings"/> android:title="@string/action_settings" />
</menu> </menu>

View file

@ -282,5 +282,6 @@
<string name="url_copied_to_clipboard">URL copied to clipboard</string> <string name="url_copied_to_clipboard">URL copied to clipboard</string>
<string name="message_copied_to_clipboard">Message copied to clipboard</string> <string name="message_copied_to_clipboard">Message copied to clipboard</string>
<string name="image_transmission_failed">Image transmission failed</string> <string name="image_transmission_failed">Image transmission failed</string>
<string name="scan_qr_code">Scan QR code</string>
<string name="show_qr_code">Show QR code</string>
</resources> </resources>