Begin implementing party invitations

This commit is contained in:
Phillip Thelen 2016-04-19 19:08:37 +02:00
parent 8d4f51e0a3
commit 25ab28a5c2
10 changed files with 287 additions and 11 deletions

View file

@ -102,6 +102,13 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.MainActivity" />
</activity>
<activity
android:name=".ui.activities.PartyInviteActivity"
android:theme="@style/AppThemeWithActionBarBlackText"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute"
android:label="@string/invite_users">
</activity>
<activity android:name="com.facebook.FacebookActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
android:background="?attr/colorPrimary"
android:elevation="0dp"
android:fillViewport="false"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_anchor="@+id/collapsing_toolbar"
app:layout_anchorGravity="bottom"
app:layout_collapseMode="pin"
app:tabGravity="fill"
app:tabIndicatorColor="@android:color/white"
app:tabMode="fixed" />
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:background="@android:color/white" />
</LinearLayout>

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/inviteDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/row_padding"
style="@style/CardTitle"/>
<LinearLayout
android:id="@+id/invitationWrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
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"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/add_invites"
android:layout_margin="@dimen/row_padding" />
</LinearLayout>
</ScrollView>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item android:id="@+id/menu_invite_item"
android:title="@string/invite"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".ui.activities.TaskFormActivity">
<item android:id="@+id/action_send_invites" android:title="@string/invite"
android:orderInCategory="100" app:showAsAction="always" />
</menu>

View file

@ -329,5 +329,15 @@ To start, which parts of your life do you want to improve?</string>
<string name="change_class_description">Change your class and refund your attribute points for 3 gems. </string>
<string name="enable_class">Enable Class System</string>
<string name="changing_class_progress">Changing Class</string>
<string name="by_email">By Email</string>
<string name="invite_existing_users">Invite Existing Users</string>
<string name="send">Send</string>
<string name="invite">Invite</string>
<string name="invite_id_description">If you have friends already using Habitica, invite them by User ID here.</string>
<string name="invite_email_description">If a friend joins Habitica via your email, they\'ll automatically be invited to your party!</string>
<string name="add_invites">Add Invites</string>
<string name="user_id">User ID</string>
<string name="email">Email</string>
<string name="invite_users">Invite to Party</string>
</resources>

View file

@ -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);
}
}

View file

@ -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);
}
}
}

View file

@ -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) {

View file

@ -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);
}
}