Added download qr. Added invite by qr.

This commit is contained in:
Keith Holliday 2016-08-12 08:09:31 -05:00
parent d789a50de4
commit 45d9dc2d35
10 changed files with 214 additions and 52 deletions

View file

@ -14,7 +14,7 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
@ -162,4 +162,5 @@
</provider>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

View file

@ -12,6 +12,7 @@
android:layout_height="wrap_content"
android:layout_margin="@dimen/row_padding"
style="@style/CardTitle"/>
<LinearLayout
android:id="@+id/invitationWrapper"
android:layout_width="match_parent"
@ -20,6 +21,7 @@
android:clickable="false"
android:layout_marginLeft="@dimen/row_padding"
android:layout_marginRight="@dimen/row_padding" />
<Button
android:id="@+id/addInviteButton"
android:layout_width="wrap_content"
@ -27,5 +29,15 @@
android:layout_gravity="right"
android:text="@string/add_invites"
android:layout_margin="@dimen/row_padding" />
<Button
android:id="@+id/InviteByQR"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scan a QR Code"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_margin="20dp"
android:layout_gravity="center_horizontal|bottom"
/>
</LinearLayout>
</ScrollView>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>

View file

@ -376,4 +376,10 @@ To start, which parts of your life do you want to improve?</string>
<string name="gems_plural">gold</string>
<string name="chat_message_copied">Message copied to Clipboard</string>
<string name="copy_chat_message">Copy to clipboard</string>
<!-- QR Strings -->
<string name="qr_album_name">habitica</string>
<string name="qr_file_name"> habitrpg-qr-code.jpg</string>
<string name="qr_save_message">QR code saved at </string>
</resources>

View file

@ -0,0 +1,101 @@
package com.habitrpg.android.habitica.helpers;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.media.Image;
import android.os.Environment;
import android.support.v7.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.habitrpg.android.habitica.R;
import net.glxn.qrgen.android.QRCode;
import net.glxn.qrgen.core.image.ImageType;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by keithholliday on 8/12/16.
*/
public class QrCodeManager {
//@TODO: Allow users to set other content
private String content;
private Context context;
private String albumnName;
private String fileName;
private String saveMessage;
public QrCodeManager(Context context) {
this.context = context;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.context);
String userId = prefs.getString(this.context.getString(R.string.SP_userID), "");
this.albumnName = this.context.getString(R.string.qr_album_name);
this.fileName = this.context.getString(R.string.qr_file_name);
this.saveMessage = this.context.getString(R.string.qr_save_message);
this.content = userId;
}
public void displayQrCode(ImageView qrImageView) {
if (qrImageView == null) {
return;
}
Bitmap myBitmap = QRCode.from(this.content).bitmap();
qrImageView.setImageBitmap(myBitmap);
}
public void downloadQr(Button qRDownloadButton) {
if (qRDownloadButton == null) {
return;
}
qRDownloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File dir = getAlbumStorageDir(context, albumnName);
dir.mkdirs();
File pathToQRCode = new File(dir, fileName);
try {
pathToQRCode.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
ByteArrayOutputStream qrStream = QRCode.from(content).to(ImageType.JPG).stream();
try {
FileOutputStream outputStream = new FileOutputStream(pathToQRCode);
qrStream.writeTo(outputStream);
outputStream.close();
Toast.makeText(context, saveMessage + pathToQRCode.getPath(),
Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = new File(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
file.mkdirs();
return file;
}
}

View file

@ -33,6 +33,8 @@ import com.habitrpg.android.habitica.events.commands.SellItemCommand;
import com.habitrpg.android.habitica.events.commands.UnlockPathCommand;
import com.habitrpg.android.habitica.events.commands.UpdateUserCommand;
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager;
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator;
import com.habitrpg.android.habitica.prefs.scanner.IntentResult;
import com.habitrpg.android.habitica.ui.AvatarView;
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel;
import com.habitrpg.android.habitica.ui.TutorialView;
@ -124,6 +126,7 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.util.ArrayList;

View file

@ -1,8 +1,13 @@
package com.habitrpg.android.habitica.ui.activities;
import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator;
import com.habitrpg.android.habitica.prefs.scanner.IntentResult;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import android.app.Activity;
import android.content.Intent;
@ -11,20 +16,34 @@ import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import butterknife.BindView;
public class PartyInviteActivity extends BaseActivity {
public class PartyInviteActivity extends BaseActivity implements HabitRPGUserCallback.OnUserReceived {
public static final int RESULT_SEND_INVITES = 100;
public static final String USER_IDS_KEY = "userIDs";
public static final String IS_EMAIL_KEY = "isEmail";
public static final String EMAILS_KEY = "emails";
private HabitRPGUser user;
private String userIdToInvite;
@Inject
APIHelper apiHelper;
@BindView(R.id.tab_layout)
TabLayout tabLayout;
@ -129,4 +148,42 @@ public class PartyInviteActivity extends BaseActivity {
tabLayout.setupWithViewPager(viewPager);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanningResult != null) {
userIdToInvite = scanningResult.getContents();
//@TODO: Inject the user
this.apiHelper.apiService.getUser()
.compose(this.apiHelper.configureApiCallObserver())
.subscribe(new HabitRPGUserCallback(this), throwable -> {});
}
}
@Override
public void onUserReceived(HabitRPGUser user) {
this.user = user;
Toast toast = Toast.makeText(getApplicationContext(),
userIdToInvite, Toast.LENGTH_SHORT);
toast.show();
Map<String, Object> inviteData = new HashMap<>();
List<String> invites = new ArrayList<>();
invites.add(userIdToInvite);
inviteData.put("uuids", invites);
this.apiHelper.apiService.inviteToGroup(this.user.getParty().getId(), inviteData)
.compose(apiHelper.configureApiCallObserver())
.subscribe(aVoid -> {
}, throwable -> {
});
}
}

View file

@ -1,12 +1,15 @@
package com.habitrpg.android.habitica.ui.fragments.preferences;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.helpers.QrCodeManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
@ -29,14 +32,10 @@ public class AccountDetailsFragment extends BasePreferencesFragment {
}
}
displayQRCode();
}
protected void displayQRCode() {
Bitmap myBitmap = QRCode.from(getString(R.string.SP_userID)).bitmap();
ImageView myImage = (ImageView) getActivity().findViewById(R.id.imageView);
myImage.setVisibility(View.VISIBLE);
myImage.setImageBitmap(myBitmap);
ImageView qrImageView = (ImageView) getActivity().findViewById(R.id.imageView);
QrCodeManager qrCodeManager = new QrCodeManager(this.getContext());
qrCodeManager.displayQrCode(qrImageView);
// qrCodeManager.downloadQr(qRDownloadButton);
}
protected List<String> getAccountDetailsPreferences() {

View file

@ -5,6 +5,8 @@ import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.databinding.FragmentGroupInfoBinding;
import com.habitrpg.android.habitica.databinding.ValueBarBinding;
import com.habitrpg.android.habitica.helpers.QrCodeManager;
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator;
import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
@ -13,11 +15,15 @@ import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.databinding.DataBindingUtil;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
@ -33,14 +39,10 @@ import android.widget.Toast;
import net.glxn.qrgen.android.QRCode;
import net.glxn.qrgen.core.image.ImageType;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import javax.inject.Inject;
@ -52,6 +54,7 @@ public class GroupInformationFragment extends BaseFragment {
FragmentGroupInfoBinding viewBinding;
@Inject
APIHelper apiHelper;
@ -116,7 +119,9 @@ public class GroupInformationFragment extends BaseFragment {
bossRageBar = DataBindingUtil.bind(view.findViewById(R.id.bossRageBar));
if (this.group == null) {
displayQRCode();
QrCodeManager qrCodeManager = new QrCodeManager(this.getContext());
qrCodeManager.displayQrCode(qrImageView);
qrCodeManager.downloadQr(qRDownloadButton);
}
return view;
@ -321,40 +326,4 @@ public class GroupInformationFragment extends BaseFragment {
});
builder.show();
}
protected void displayQRCode() {
Bitmap myBitmap = QRCode.from(getString(R.string.SP_userID)).bitmap();
if (qrImageView != null) {
qrImageView.setImageBitmap(myBitmap);
}
if (qRDownloadButton != null) {
qRDownloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File path = new File(getActivity().getFilesDir(), "habitrpg-qr-code");
File file = QRCode.from(getString(R.string.SP_userID)).to(ImageType.JPG).file();
file.renameTo(path);
Toast.makeText(getActivity(), "QR code saved at " + path.getPath(),
Toast.LENGTH_LONG).show();
}
});
}
}
public static void copyFile(File src, File dst) throws IOException
{
FileChannel inChannel = new FileInputStream(src).getChannel();
FileChannel outChannel = new FileOutputStream(dst).getChannel();
try {
inChannel.transferTo(0, inChannel.size(), outChannel);
} finally {
if (inChannel != null)
inChannel.close();
if (outChannel != null)
outChannel.close();
}
}
}

View file

@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments.social.party;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import android.os.Bundle;
@ -57,6 +58,7 @@ public class PartyInviteFragment extends BaseFragment {
@OnClick(R.id.addInviteButton)
public void addInviteField() {
EditText editText = new EditText(getContext());
if (isEmailInvite) {
editText.setHint(R.string.email);
editText.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
@ -66,6 +68,12 @@ public class PartyInviteFragment extends BaseFragment {
invitationWrapper.addView(editText);
}
@OnClick(R.id.InviteByQR)
public void startQRInvite() {
IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity());
scanIntegrator.initiateScan();
}
public String[] getValues() {
List<String> values = new ArrayList<>();
for (int i = 0; i < invitationWrapper.getChildCount(); i++) {