diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index b6b3cd25b..66b2ffd57 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -14,7 +14,7 @@
-
+
@@ -162,4 +162,5 @@
+
diff --git a/Habitica/res/layout/fragment_party_invite.xml b/Habitica/res/layout/fragment_party_invite.xml
index 916dc7241..9104bc5da 100644
--- a/Habitica/res/layout/fragment_party_invite.xml
+++ b/Habitica/res/layout/fragment_party_invite.xml
@@ -12,6 +12,7 @@
android:layout_height="wrap_content"
android:layout_margin="@dimen/row_padding"
style="@style/CardTitle"/>
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/qr_code.xml b/Habitica/res/layout/qr_code.xml
new file mode 100644
index 000000000..3509b8411
--- /dev/null
+++ b/Habitica/res/layout/qr_code.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 0aa13106f..af78b9ce0 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -376,4 +376,10 @@ To start, which parts of your life do you want to improve?
gold
Message copied to Clipboard
Copy to clipboard
+
+
+ habitica
+ habitrpg-qr-code.jpg
+ QR code saved at
+
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/QrCodeManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/QrCodeManager.java
new file mode 100644
index 000000000..0fef15e74
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/QrCodeManager.java
@@ -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;
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
index bb81fb7a7..9b87bd05a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
@@ -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;
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java
index f1c108c4b..3f9c41b38 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java
@@ -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 inviteData = new HashMap<>();
+ List 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 -> {
+ });
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java
index 292d7f6de..978f139ef 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java
@@ -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 getAccountDetailsPreferences() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
index 11fccc819..93eea3e01 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
@@ -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();
- }
- }
-
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java
index 72fba720d..dea24400a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java
@@ -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 values = new ArrayList<>();
for (int i = 0; i < invitationWrapper.getChildCount(); i++) {