diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index 3f7f47be5..58d2a3be5 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -102,6 +102,13 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.MainActivity" />
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_party_invite.xml b/Habitica/res/layout/fragment_party_invite.xml
new file mode 100644
index 000000000..916dc7241
--- /dev/null
+++ b/Habitica/res/layout/fragment_party_invite.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/menu/menu_party.xml b/Habitica/res/menu/menu_party.xml
new file mode 100644
index 000000000..72766c45d
--- /dev/null
+++ b/Habitica/res/menu/menu_party.xml
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Habitica/res/menu/menu_party_invite.xml b/Habitica/res/menu/menu_party_invite.xml
new file mode 100644
index 000000000..ebdb8d4e4
--- /dev/null
+++ b/Habitica/res/menu/menu_party_invite.xml
@@ -0,0 +1,7 @@
+
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 8b95d4ebb..27c20e3d6 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -329,5 +329,15 @@ To start, which parts of your life do you want to improve?
Change your class and refund your attribute points for 3 gems.
Enable Class System
Changing Class
+ By Email
+ Invite Existing Users
+ Send
+ Invite
+ If you have friends already using Habitica, invite them by User ID here.
+ If a friend joins Habitica via your email, they\'ll automatically be invited to your party!
+ Add Invites
+ User ID
+ Email
+ Invite to Party
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.java
index 7496393d6..c64feeb59 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.java
@@ -21,6 +21,7 @@ import com.github.data5tream.emojilib.EmojiGridView;
import com.github.data5tream.emojilib.EmojiPopup;
import com.github.data5tream.emojilib.emoji.Emojicon;
import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.UiUtils;
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser;
import butterknife.Bind;
@@ -199,14 +200,14 @@ public class GroupFormActivity extends BaseActivity {
@Override
public boolean onSupportNavigateUp() {
finish();
- dismissKeyboard();
+ UiUtils.dismissKeyboard(this);
return true;
}
@Override
public void onBackPressed() {
finish();
- dismissKeyboard();
+ UiUtils.dismissKeyboard(this);
}
private void finishActivitySuccessfuly() {
@@ -218,14 +219,6 @@ public class GroupFormActivity extends BaseActivity {
resultIntent.putExtras(bundle);
setResult(Activity.RESULT_OK, resultIntent);
finish();
- dismissKeyboard();
- }
-
- private void dismissKeyboard() {
- InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- View currentFocus = getCurrentFocus();
- if (currentFocus != null) {
- imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
- }
+ UiUtils.dismissKeyboard(this);
}
}
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
new file mode 100644
index 000000000..c059d3f78
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java
@@ -0,0 +1,101 @@
+package com.habitrpg.android.habitica.ui.activities;
+
+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.view.Menu;
+import android.view.MenuItem;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.StableFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.StableRecyclerFragment;
+import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class PartyInviteActivity extends BaseActivity {
+
+ @Bind(R.id.tab_layout)
+ TabLayout tabLayout;
+
+ @Bind(R.id.view_pager)
+ ViewPager viewPager;
+
+ @Override
+ protected int getLayoutResId() {
+ return R.layout.activity_party_invite;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ viewPager.setCurrentItem(0);
+
+ setViewPagerAdapter();
+ }
+
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_party_invite, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ //noinspection SimplifiableIfStatement
+ if (id == R.id.action_send_invites) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ public void setViewPagerAdapter() {
+ android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
+
+ viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
+
+ @Override
+ public Fragment getItem(int position) {
+
+ PartyInviteFragment fragment = new PartyInviteFragment();
+
+ fragment.isEmailInvite = position == 0;
+
+ return fragment;
+ }
+
+ @Override
+ public int getCount() {
+ return 2;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ switch (position) {
+ case 0:
+ return getString(R.string.by_email);
+ case 1:
+ return getString(R.string.invite_existing_users);
+ }
+ return "";
+ }
+ });
+
+ if (tabLayout != null && viewPager != null) {
+ tabLayout.setupWithViewPager(viewPager);
+ }
+ }
+}
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 83d00d78f..803ea899c 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
@@ -1,17 +1,22 @@
package com.habitrpg.android.habitica.ui.fragments.social.party;
import android.content.DialogInterface;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.habitrpg.android.habitica.ContentCache;
import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.fragments.social.ChatListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.GroupInformationFragment;
@@ -95,6 +100,28 @@ public class PartyFragment extends BaseMainFragment {
return v;
}
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ inflater.inflate(R.menu.menu_party, menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ switch (id) {
+ case R.id.menu_invite_item:
+ Intent intent = new Intent(getActivity(), PartyInviteActivity.class);
+ startActivity(intent);
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
public void setViewPagerAdapter() {
android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();
if (this.user == null) {
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
new file mode 100644
index 000000000..b6723d9ac
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java
@@ -0,0 +1,59 @@
+package com.habitrpg.android.habitica.ui.fragments.social.party;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.text.InputType;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+public class PartyInviteFragment extends BaseFragment {
+
+ public boolean isEmailInvite;
+
+ @Bind(R.id.inviteDescription)
+ TextView inviteDescription;
+
+ @Bind(R.id.invitationWrapper)
+ LinearLayout invitationWrapper;
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ View v = inflater.inflate(R.layout.fragment_party_invite, container, false);
+ ButterKnife.bind(this, v);
+
+ if (isEmailInvite) {
+ inviteDescription.setText(getString(R.string.invite_email_description));
+ } else {
+ inviteDescription.setText(getString(R.string.invite_id_description));
+ }
+
+ addInviteField();
+
+ return v;
+ }
+
+ @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);
+ } else {
+ editText.setHint(R.string.user_id);
+ }
+ invitationWrapper.addView(editText);
+ }
+}