diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index c9d82c180..9377d1035 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -14,7 +14,7 @@
-
+
@@ -172,4 +172,5 @@
+
diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 42bd0d92a..77e1572df 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -81,6 +81,9 @@ dependencies {
// Image Loading/Caching
compile 'com.squareup.picasso:picasso:2.5.2'
+ //QR Code
+ compile 'com.github.kenglxn.QRGen:android:2.2.0'
+
// Emojis
compile 'com.github.viirus:emoji-lib:0.0.3.2'
diff --git a/Habitica/res/layout/activity_prefs.xml b/Habitica/res/layout/activity_prefs.xml
index 2b64575b9..4bb3134f1 100644
--- a/Habitica/res/layout/activity_prefs.xml
+++ b/Habitica/res/layout/activity_prefs.xml
@@ -6,16 +6,20 @@
android:layout_height="match_parent"
tools:context=".ui.activities.PrefsActivity">
+
+
+
+
-
-
+ tools:context=".ui.activities.MainActivity"
+ android:layout_gravity="center_horizontal|bottom">
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_group_info.xml b/Habitica/res/layout/fragment_group_info.xml
index f6cbe2ad9..136822d1a 100644
--- a/Habitica/res/layout/fragment_group_info.xml
+++ b/Habitica/res/layout/fragment_group_info.xml
@@ -34,7 +34,6 @@
android:layout_height="match_parent"
android:scrollbarSize="3dp"
android:scrollbarThumbVertical="@color/md_grey_500"
-
android:scrollbars="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
\ 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..4711c3aef
--- /dev/null
+++ b/Habitica/res/layout/qr_code.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Habitica/res/layout/qr_dialogue.xml b/Habitica/res/layout/qr_dialogue.xml
new file mode 100644
index 000000000..6b6039ea4
--- /dev/null
+++ b/Habitica/res/layout/qr_dialogue.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 806112b9e..e0b6ef46c 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -15,6 +15,7 @@
Your User ID
API Token
Your API Token
+ Your QR Code
Contact me
An error happened…
Account
@@ -377,4 +378,12 @@ To start, which parts of your life do you want to improve?
gold
Message copied to Clipboard
Copy to clipboard
+
+
+ Have someone invite you with this QR Code
+ habitica
+ habitrpg-qr-code.jpg
+ QR code saved at
+ Your QR Code
+
diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml
index 46d5b2e1b..1d50cc370 100644
--- a/Habitica/res/xml/preferences_fragment.xml
+++ b/Habitica/res/xml/preferences_fragment.xml
@@ -46,6 +46,14 @@
android:shouldDisableView="false"
android:summary="@string/SP_APIToken_summary"/>
+
+
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..136e6809f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/QrCodeManager.java
@@ -0,0 +1,176 @@
+package com.habitrpg.android.habitica.helpers;
+
+import android.app.Dialog;
+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.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.AvatarView;
+import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.mikepenz.materialize.color.Material;
+import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction;
+import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+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 String userId;
+ private Context context;
+ private String qrProfileUrl = "https://habitica.com/qr-code/user/";
+
+ private ImageView qrCodeImageView;
+ private Button qrCodeDownloadButton;
+ private AvatarView avatarView;
+ private FrameLayout qrCodeWrapper;
+
+ private String albumnName;
+ private String fileName;
+ private String saveMessage;
+
+ private TransactionListener userTransactionListener = new TransactionListener() {
+ @Override
+ public void onResultReceived(HabitRPGUser habitRPGUser) {
+ QrCodeManager.this.avatarView.setUser(habitRPGUser);
+ }
+
+ @Override
+ public boolean onReady(BaseTransaction baseTransaction) {
+ return true;
+ }
+
+ @Override
+ public boolean hasResult(BaseTransaction baseTransaction, HabitRPGUser habitRPGUser) {
+ return true;
+ }
+ };
+
+ 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 = this.qrProfileUrl + userId;
+ this.userId = userId;
+ }
+
+ public void setUpView(LinearLayout qrLayout) {
+ this.qrCodeImageView = (ImageView) qrLayout.findViewById(R.id.QRImageView);
+ this.qrCodeDownloadButton = (Button) qrLayout.findViewById(R.id.QRDownloadButton);
+ this.avatarView = (AvatarView) qrLayout.findViewById(R.id.avatarView);
+ this.avatarView.configureView(false, false, false);
+ this.qrCodeWrapper = (FrameLayout) qrLayout.findViewById(R.id.qrCodeWrapper);
+
+ //@TODO: Move to user helper/model
+ new Select()
+ .from(HabitRPGUser.class)
+ .where(Condition.column("id")
+ .eq(userId))
+ .async()
+ .querySingle(userTransactionListener);
+
+ this.displayQrCode();
+ this.setDownloadQr();
+ }
+
+ public void displayQrCode() {
+ if (qrCodeImageView == null) {
+ return;
+ }
+
+ Bitmap myBitmap = QRCode.from(this.content).withColor(0xFF432874, 0xFFFFFFFF).withSize(400, 400).bitmap();
+ qrCodeImageView.setImageBitmap(myBitmap);
+ }
+
+ public void setDownloadQr() {
+ if (qrCodeDownloadButton == null) {
+ return;
+ }
+
+ qrCodeDownloadButton.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();
+ }
+
+ try {
+ FileOutputStream outputStream = new FileOutputStream(pathToQRCode);
+ qrCodeWrapper.setDrawingCacheEnabled(true);
+ Bitmap b = qrCodeWrapper.getDrawingCache();
+ b.compress(Bitmap.CompressFormat.JPEG, 95, 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;
+ }
+
+ public void showDialogue() {
+ final Dialog dialog = new Dialog(context);
+ dialog.setContentView(R.layout.qr_dialogue);
+ dialog.setTitle(R.string.qr_dialogue_title);
+
+ LinearLayout qrLayout = (LinearLayout) dialog.findViewById(R.id.qrLayout);
+ this.setUpView(qrLayout);
+ Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
+
+ dialogButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ }
+ });
+
+ dialog.show();
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.java
index c58fd12d7..5b3808f85 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.java
@@ -91,6 +91,12 @@ public class AvatarView extends View {
isOrphan = true;
}
+ public void configureView(boolean showBackground, boolean showMount, boolean showPet) {
+ this.showBackground = showBackground;
+ this.showMount = showMount;
+ this.showPet = showPet;
+ }
+
private void init(AttributeSet attrs, int defStyle) {
// Load attributes
final TypedArray a = getContext().obtainStyledAttributes(
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 51cb77f7f..cac78a021 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
@@ -34,6 +34,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;
@@ -126,6 +128,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..937b4bc95 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,21 +1,39 @@
package com.habitrpg.android.habitica.ui.activities;
+import com.habitrpg.android.habitica.APIHelper;
+import com.habitrpg.android.habitica.HostConfig;
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 com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction;
+import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.Select;
import android.app.Activity;
import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
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;
@@ -25,6 +43,16 @@ public class PartyInviteActivity extends BaseActivity {
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;
+
+ @Inject
+ protected HostConfig hostConfig;
+
@BindView(R.id.tab_layout)
TabLayout tabLayout;
@@ -33,6 +61,23 @@ public class PartyInviteActivity extends BaseActivity {
List fragments = new ArrayList<>();
+ private TransactionListener userTransactionListener = new TransactionListener() {
+ @Override
+ public void onResultReceived(HabitRPGUser habitRPGUser) {
+ handleUserRecieved(habitRPGUser);
+ }
+
+ @Override
+ public boolean onReady(BaseTransaction baseTransaction) {
+ return true;
+ }
+
+ @Override
+ public boolean hasResult(BaseTransaction baseTransaction, HabitRPGUser habitRPGUser) {
+ return true;
+ }
+ };
+
@Override
protected int getLayoutResId() {
return R.layout.activity_party_invite;
@@ -129,4 +174,46 @@ 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 && scanningResult.getContents() != null) {
+ String qrCodeUrl = scanningResult.getContents();
+ Uri uri = Uri.parse(qrCodeUrl);
+ if (uri == null || uri.getPathSegments().size() < 3) {
+ return;
+ }
+ userIdToInvite = uri.getPathSegments().get(2);
+
+ //@TODO: Move to user helper/model
+ new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener);
+ }
+ }
+
+ public void handleUserRecieved(HabitRPGUser user) {
+ this.user = user;
+
+ if (this.userIdToInvite == null) {
+ return;
+ }
+
+ Toast toast = Toast.makeText(getApplicationContext(),
+ "Invited: " + userIdToInvite, Toast.LENGTH_LONG);
+ 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/activities/PrefsActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java
index 37e2f01d2..454bf3be4 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java
@@ -15,6 +15,9 @@ import android.preference.PreferenceManager;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.PreferenceScreen;
import android.support.v7.widget.Toolbar;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
import butterknife.BindView;
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 c4e6db21f..7a3041e66 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,19 +1,32 @@
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.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.Toast;
+import net.glxn.qrgen.android.QRCode;
+
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class AccountDetailsFragment extends BasePreferencesFragment {
+ private QrCodeManager qrCodeManager;
+
@Override
protected void setupPreferences() {
for (Map.Entry preference : getPreferenceScreen().getSharedPreferences().getAll().entrySet()) {
@@ -22,15 +35,21 @@ public class AccountDetailsFragment extends BasePreferencesFragment {
findPreference(key).setSummary(preference.getValue().toString());
}
}
+
+ qrCodeManager = new QrCodeManager(this.getContext());
}
protected List getAccountDetailsPreferences() {
return Arrays.asList(getString(R.string.SP_username), getString(R.string.SP_email),
- getString(R.string.SP_APIToken), getString(R.string.SP_userID));
+ getString(R.string.SP_APIToken), getString(R.string.SP_userID), getString(R.string.SP_user_qr_code));
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference.getKey().equals(getString(R.string.SP_user_qr_code))) {
+ qrCodeManager.showDialogue();
+ }
+
ClipboardManager clipMan = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
clipMan.setPrimaryClip(ClipData.newPlainText(preference.getKey(), preference.getSummary()));
Toast.makeText(getActivity(), "Copied " + preference.getKey() + " to clipboard.", Toast.LENGTH_SHORT).show();
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 371f6b638..7b1141cf8 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,9 @@ 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.AvatarView;
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,17 +16,35 @@ 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.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+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.FileOutputStream;
+import java.io.IOException;
import javax.inject.Inject;
@@ -35,12 +56,22 @@ public class GroupInformationFragment extends BaseFragment {
FragmentGroupInfoBinding viewBinding;
+
@Inject
APIHelper apiHelper;
+
@BindView(R.id.questMemberView)
LinearLayout questMemberView;
+
@BindView(R.id.collectionStats)
RecyclerView collectionStats;
+
+ @BindView(R.id.qrLayout)
+ LinearLayout qrLayout;
+
+ @BindView(R.id.qrWrapper)
+ CardView qrWrapper;
+
private View view;
private Group group;
private HabitRPGUser user;
@@ -55,7 +86,6 @@ public class GroupInformationFragment extends BaseFragment {
}
public static GroupInformationFragment newInstance(Group group, HabitRPGUser user) {
-
Bundle args = new Bundle();
GroupInformationFragment fragment = new GroupInformationFragment();
@@ -74,6 +104,7 @@ public class GroupInformationFragment extends BaseFragment {
viewBinding = DataBindingUtil.bind(view);
viewBinding.setHideParticipantCard(false);
+
if (user != null) {
viewBinding.setUser(user);
}
@@ -89,6 +120,15 @@ public class GroupInformationFragment extends BaseFragment {
bossHpBar = DataBindingUtil.bind(view.findViewById(R.id.bossHpBar));
bossRageBar = DataBindingUtil.bind(view.findViewById(R.id.bossRageBar));
+ if (this.group == null) {
+ QrCodeManager qrCodeManager = new QrCodeManager(this.getContext());
+ qrCodeManager.setUpView(qrLayout);
+ }
+
+ if (user != null && user.getParty().getId() != null) {
+ ((ViewGroup) qrWrapper.getParent()).removeView(qrWrapper);
+ }
+
return view;
}
@@ -291,5 +331,4 @@ public class GroupInformationFragment extends BaseFragment {
});
builder.show();
}
-
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java
index 0eda9ed2d..791d22814 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java
@@ -84,15 +84,15 @@ public class PartyFragment extends BaseMainFragment {
}, throwable -> {
});
} else {
- AlertDialog.Builder builder = new AlertDialog.Builder(activity)
- .setMessage(activity.getString(R.string.no_party_message))
- .setNeutralButton(android.R.string.ok, (dialog, which) -> {
- activity.getSupportFragmentManager().popBackStackImmediate();
- });
- builder.show();
- if (tabLayout != null) {
- tabLayout.removeAllTabs();
- }
+// AlertDialog.Builder builder = new AlertDialog.Builder(activity)
+// .setMessage(activity.getString(R.string.no_party_message))
+// .setNeutralButton(android.R.string.ok, (dialog, which) -> {
+// activity.getSupportFragmentManager().popBackStackImmediate();
+// });
+// builder.show();
+// if (tabLayout != null) {
+// tabLayout.removeAllTabs();
+// }
}
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++) {
diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java
index db001d465..ea0487a46 100644
--- a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java
+++ b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java
@@ -316,7 +316,10 @@ public class TaskAlarmManagerTest {
Assert.assertNotNull(alarmId);
Assert.assertEquals(true, alarmUp);
- Assert.assertEquals(currentDayOfTheWeek + everyXDay, newReminderTime.get(Calendar.DAY_OF_WEEK));
+
+ int expectedDay = (currentDayOfTheWeek + everyXDay) % 7;
+
+ Assert.assertEquals(expectedDay, newReminderTime.get(Calendar.DAY_OF_WEEK));
}
@Test
@@ -358,6 +361,9 @@ public class TaskAlarmManagerTest {
Assert.assertNotNull(alarmId);
Assert.assertEquals(true, alarmUp);
- Assert.assertEquals(currentDayOfTheWeek + everyXDay, newReminderTime.get(Calendar.DAY_OF_WEEK));
+
+ int expectedDay = (currentDayOfTheWeek + everyXDay) % 7;
+
+ Assert.assertEquals(expectedDay, newReminderTime.get(Calendar.DAY_OF_WEEK));
}
}