better back handling for fragments

This commit is contained in:
Phillip Thelen 2015-11-23 11:44:55 +01:00
parent 2dddc93c39
commit 687c915bb4
16 changed files with 39 additions and 1569 deletions

View file

@ -84,23 +84,7 @@
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".TaskActivity" />
</activity>
<activity
android:name=".TavernActivity"
android:label="@string/title_activity_tavern"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".TaskActivity" />
</activity>
<activity
android:name=".PartyActivity"
android:label="@string/title_activity_party"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".TaskActivity" />
android:value=".MainActivity" />
</activity>
<activity
android:name=".GemPurchaseActivity"

View file

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:gravity="center"
tools:context=".PartyActivity">
tools:context=".MainActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"

View file

@ -1,79 +0,0 @@
<android.support.v4.widget.DrawerLayout 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"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:gravity="center"
tools:context=".PartyActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="0dp"
tools:context=".MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="false">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="false"
app:titleEnabled="false"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="?attr/actionBarSize"
app:expandedTitleMarginStart="0dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include
android:id="@+id/avatar_with_bars"
layout="@layout/avatar_with_bars"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Toolbar"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.TabLayout
android:id="@+id/detail_tabs"
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.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>

View file

@ -1,171 +0,0 @@
<android.support.v4.widget.DrawerLayout 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"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="0dp"
tools:context=".MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="false">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="false"
app:titleEnabled="false"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="?attr/actionBarSize"
app:expandedTitleMarginStart="0dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include
android:id="@+id/avatar_with_bars"
layout="@layout/avatar_with_bars"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Toolbar"
app:layout_collapseMode="pin"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.TabLayout
android:id="@+id/detail_tabs"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
android:background="@color/brand_300"
android:elevation="0dp"
android:fillViewport="false"
android:theme="@style/MyCustomTabLayout"
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.design.widget.AppBarLayout>
<com.github.clans.fab.FloatingActionMenu
android:id="@+id/fab.menu"
app:layout_behavior="com.habitrpg.android.habitica.ui.helpers.FloatingActionMenuBehavior"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="16dp"
android:layout_marginRight="8dp"
fab:menu_fab_size="normal"
fab:menu_labels_paddingTop="8dp"
fab:menu_labels_paddingRight="8dp"
fab:menu_labels_paddingBottom="8dp"
fab:menu_labels_paddingLeft="8dp"
fab:menu_colorNormal="@color/brand"
fab:menu_colorPressed="@color/brand_400"
fab:menu_colorRipple="#FFFFFF"
fab:menu_animationDelayPerItem="50"
fab:menu_icon="@drawable/fab_add"
fab:menu_buttonSpacing="2dp">
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab.new.habit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fab:fab_colorNormal="@color/brand"
fab:fab_colorPressed="@color/brand_400"
fab:fab_colorRipple="#FFFFFF"
fab:fab_shadowColor="#000"
fab:fab_elevationCompat="6dp"
android:src="@drawable/fab_add"
fab:fab_size="mini"
fab:fab_label="New Habit" />
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab.new.daily"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fab:fab_colorNormal="@color/brand"
fab:fab_colorPressed="@color/brand_400"
fab:fab_colorRipple="#FFFFFF"
fab:fab_shadowColor="#000"
fab:fab_elevationCompat="6dp"
android:src="@drawable/fab_add"
fab:fab_size="mini"
fab:fab_label="New Daily" />
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab.new.todo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fab:fab_colorNormal="@color/brand"
fab:fab_colorPressed="@color/brand_400"
fab:fab_colorRipple="#FFFFFF"
fab:fab_shadowColor="#000"
fab:fab_elevationCompat="6dp"
android:src="@drawable/fab_add"
fab:fab_size="mini"
fab:fab_label="New Todo" />
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab.new.reward"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fab:fab_colorNormal="@color/brand"
fab:fab_colorPressed="@color/brand_400"
fab:fab_colorRipple="#FFFFFF"
fab:fab_shadowColor="#000"
fab:fab_elevationCompat="6dp"
android:src="@drawable/fab_add"
fab:fab_size="mini"
fab:fab_label="New Reward" />
</com.github.clans.fab.FloatingActionMenu>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>

View file

@ -1,45 +0,0 @@
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".TavernActivity">
<LinearLayout
android:id="@+id/layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Toolbar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
<LinearLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<include
android:id="@+id/avatar"
layout="@layout/avatar_with_bars"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/tavern.framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>

View file

@ -42,14 +42,14 @@
android:orientation="horizontal">
<ImageView
android:id="@+id/ic_header"
android:src="@drawable/ic_header_heart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/bar_padding"
android:layout_marginEnd="@dimen/bar_padding"
android:layout_alignTop="@+id/bar_full"
android:layout_alignBottom="@id/bar_full"
android:scaleType="center"/>
android:scaleType="center"
android:contentDescription="Bar Icon" />
<LinearLayout
android:id="@id/bar_full"
android:layout_toRightOf="@id/ic_header"

View file

@ -1,125 +0,0 @@
package com.habitrpg.android.habitica;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore;
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel;
import com.habitrpg.android.habitica.ui.MainDrawerBuilder;
import com.habitrpg.android.habitica.userpicture.UserPicture;
import com.habitrpg.android.habitica.userpicture.UserPictureRunnable;
import com.instabug.wrapper.support.activity.InstabugAppCompatActivity;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.mikepenz.materialdrawer.AccountHeader;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
import butterknife.ButterKnife;
import butterknife.InjectView;
import de.greenrobot.event.EventBus;
import io.fabric.sdk.android.Fabric;
/**
* Created by Negue on 14.09.2015.
*/
public abstract class AvatarActivityBase extends InstabugAppCompatActivity {
//region View Elements
@InjectView(R.id.viewpager)
ViewPager viewPager;
@InjectView(R.id.toolbar)
Toolbar toolbar;
@InjectView(R.id.detail_tabs)
TabLayout detail_tabs;
@InjectView(R.id.avatar_with_bars)
View avatar_with_bars;
@InjectView(R.id.collapsing_toolbar)
CollapsingToolbarLayout collapsingToolbarLayout;
TextView titleTextView;
AccountHeader accountHeader;
Drawer drawer;
//endregion
protected HostConfig hostConfig;
protected HabitRPGUser User;
AvatarWithBarsViewModel avatarInHeader;
protected abstract int getLayoutRes();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutRes());
// Inject Controls
ButterKnife.inject(this);
// Receive Events
EventBus.getDefault().register(this);
// Initialize Crashlytics
Crashlytics crashlytics = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlytics);
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(false);
}
// toolbar.setPadding(0, getResources().getDimensionPixelSize(R.dimen.tool_bar_top_padding), 0, 0);
}
viewPager.setBackgroundColor(getResources().getColor(R.color.white));
avatarInHeader = new AvatarWithBarsViewModel(this, avatar_with_bars);
accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build();
}
protected void setTitle(String text) {
toolbar.setTitle(text);
}
public void updateSidebar() {
final IProfile profile = accountHeader.getProfiles().get(0);
if (User.getAuthentication() != null) {
if (User.getAuthentication().getLocalAuthentication() != null) {
profile.withEmail(User.getAuthentication().getLocalAuthentication().getEmail());
}
}
profile.withName(User.getProfile().getName());
new UserPicture(User, this, true, false).setPictureWithRunnable(new UserPictureRunnable() {
public void run(Bitmap avatar) {
profile.withIcon(avatar);
accountHeader.updateProfile(profile);
}
});
accountHeader.updateProfile(profile);
}
}

View file

@ -25,6 +25,7 @@ public abstract class BaseFragment extends Fragment {
APIHelper mAPIHelper;
protected HabitRPGUser user;
public boolean usesTabLayout;
public int fragmentSidebarPosition;
public void setUser(HabitRPGUser user) { this.user = user; }
public void updateUserData(HabitRPGUser user) { this.user = user; }
@ -52,14 +53,16 @@ public abstract class BaseFragment extends Fragment {
setHasOptionsMenu(true);
activity.setActiveFragment(this);
return null;
}
@Override
public void onDestroy() {
public void onDestroyView() {
EventBus.getDefault().unregister(this);
super.onDestroy();
super.onDestroyView();
}
@Override

View file

@ -172,9 +172,8 @@ public class LoginActivity extends AppCompatActivity
}
private void startMainActivity() {
startActivity(new Intent(LoginActivity.this, TaskActivity.class));
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
}
private void saveTokens(String api, String user) throws Exception {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this);

View file

@ -42,9 +42,6 @@ import io.fabric.sdk.android.Fabric;
*/
public class MainActivity extends InstabugAppCompatActivity implements HabitRPGUserCallback.OnUserReceived, FlowContentObserver.OnSpecificModelStateChangedListener {
@InjectView(R.id.fragment_container)
FrameLayout fragment_container;
BaseFragment activeFragment;
@InjectView(R.id.toolbar)
@ -59,8 +56,6 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
@InjectView(R.id.collapsing_toolbar)
CollapsingToolbarLayout collapsingToolbarLayout;
TextView titleTextView;
AccountHeader accountHeader;
Drawer drawer;
@ -123,7 +118,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
// Create a new Fragment to be placed in the activity layout
TasksFragment tasksFragment = new TasksFragment();
tasksFragment.fragmentSidebarPosition = 0;
// In case this activity was started with special instructions from an
// Intent, pass the Intent's extras to the fragment as arguments
this.displayFragment(tasksFragment);
@ -153,7 +148,6 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).addToBackStack(null).commit();
}
activeFragment = fragment;
}
private TransactionListener<HabitRPGUser> userTransactionListener = new TransactionListener<HabitRPGUser>() {
@ -238,4 +232,9 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
public void onUserFail() {
}
public void setActiveFragment(BaseFragment fragment) {
this.activeFragment = fragment;
this.drawer.setSelectionAtPosition(this.activeFragment.fragmentSidebarPosition, false);
}
}

View file

@ -1,196 +0,0 @@
package com.habitrpg.android.habitica;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import com.habitrpg.android.habitica.events.commands.CreateTagCommand;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
import com.habitrpg.android.habitica.ui.MainDrawerBuilder;
import com.habitrpg.android.habitica.ui.fragments.ChatListFragment;
import com.habitrpg.android.habitica.ui.fragments.PartyInformationFragment;
import com.habitrpg.android.habitica.ui.fragments.PartyMemberListFragment;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
import java.util.HashMap;
import butterknife.InjectView;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class PartyActivity extends AvatarActivityBase implements AppBarLayout.OnOffsetChangedListener {
@InjectView(R.id.appbar)
AppBarLayout appBarLayout;
private APIHelper mAPIHelper;
private Group group;
@Override
protected int getLayoutRes() {
return R.layout.activity_party;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setViewPagerAdapter();
this.hostConfig = PrefsActivity.fromContext(this);
User = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle();
mAPIHelper = new APIHelper(this, hostConfig);
if (User == null)
return;
updateUserAvatars();
updateSidebar();
final ContentCache contentCache = new ContentCache(mAPIHelper.apiService);
// Get the full group data
mAPIHelper.apiService.getGroup("party", new Callback<Group>() {
@Override
public void success(Group group, Response response) {
PartyActivity.this.group = group;
if (partyMemberListFragment != null) {
partyMemberListFragment.setMemberList(group.members);
}
if (partyInformationFragment != null) {
partyInformationFragment.setGroup(group);
}
if (group != null && group.quest != null && !group.quest.key.isEmpty()) {
contentCache.GetQuestContent(group.quest.key, new ContentCache.QuestContentCallback() {
@Override
public void GotQuest(QuestContent content) {
partyInformationFragment.setQuestContent(content);
}
});
}
}
@Override
public void failure(RetrofitError error) {
}
});
}
@Override
protected void onResume() {
super.onResume();
appBarLayout.addOnOffsetChangedListener(this);
}
@Override
protected void onPause() {
super.onPause();
appBarLayout.removeOnOffsetChangedListener(this);
}
private HashMap<Integer, Fragment> fragmentDictionary = new HashMap<>();
private PartyMemberListFragment partyMemberListFragment;
private PartyInformationFragment partyInformationFragment;
public void setViewPagerAdapter() {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
@Override
public Fragment getItem(int position) {
Fragment fragment;
switch (position) {
case 0: {
fragment = partyInformationFragment = new PartyInformationFragment(group);
break;
}
case 1: {
fragment = new ChatListFragment(PartyActivity.this, "party", mAPIHelper, User, false);
break;
}
case 2: {
fragment = partyMemberListFragment = new PartyMemberListFragment(PartyActivity.this, group);
break;
}
default:
fragment = new Fragment();
}
fragmentDictionary.put(position, fragment);
return fragment;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Party";
case 1:
return "Chat";
case 2:
return "Members";
}
return "";
}
});
detail_tabs.setupWithViewPager(viewPager);
}
private void updateUserAvatars() {
avatarInHeader.updateData(User);
}
//region Events
// until there is a party event
public void onEvent(CreateTagCommand event) {
}
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
Fragment fragment = fragmentDictionary.get(viewPager.getCurrentItem());
if (!(fragment instanceof ChatListFragment))
return;
ChatListFragment chatFragment = (ChatListFragment) fragment;
// Disable Refresh if Header is collapsed
if (i == 0) {
chatFragment.setRefreshEnabled(true);
} else {
chatFragment.setRefreshEnabled(false);
}
}
//endregion Events
}

View file

@ -1,782 +0,0 @@
package com.habitrpg.android.habitica;
import android.content.DialogInterface;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.github.clans.fab.FloatingActionMenu;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.callbacks.TaskCreationCallback;
import com.habitrpg.android.habitica.callbacks.TaskScoringCallback;
import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback;
import com.habitrpg.android.habitica.databinding.ValueBarBinding;
import com.habitrpg.android.habitica.events.commands.BuyRewardCommand;
import com.habitrpg.android.habitica.events.HabitScoreEvent;
import com.habitrpg.android.habitica.events.commands.TaskCheckedCommand;
import com.habitrpg.android.habitica.events.TaskLongPressedEvent;
import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.habitrpg.android.habitica.events.TaskTappedEvent;
import com.habitrpg.android.habitica.events.ToggledInnStateEvent;
import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand;
import com.habitrpg.android.habitica.events.commands.CreateTagCommand;
import com.habitrpg.android.habitica.events.commands.FilterTasksByTagsCommand;
import com.habitrpg.android.habitica.helpers.TagsHelper;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel;
import com.habitrpg.android.habitica.ui.EditTextDrawer;
import com.habitrpg.android.habitica.ui.adapter.HabitItemRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.adapter.IReceiveNewEntries;
import com.habitrpg.android.habitica.ui.fragments.TaskRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.helpers.Debounce;
import com.habitrpg.android.habitica.userpicture.UserPicture;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.SuppressedModals;
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.model.SectionDrawerItem;
import com.mikepenz.materialdrawer.model.SwitchDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
import com.raizlabs.android.dbflow.runtime.FlowContentObserver;
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 com.raizlabs.android.dbflow.structure.BaseModel;
import com.raizlabs.android.dbflow.structure.Model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.InjectView;
import butterknife.OnClick;
import de.greenrobot.event.EventBus;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class TaskActivity extends AvatarActivityBase implements HabitRPGUserCallback.OnUserReceived,
TaskScoringCallback.OnTaskScored, FlowContentObserver.OnSpecificModelStateChangedListener,
OnCheckedChangeListener {
public enum SnackbarDisplayType {
NORMAL, FAILURE, DROP
}
static final int TASK_CREATED_RESULT = 1;
static final int TASK_UPDATED_RESULT = 2;
Drawer filterDrawer;
Map<Integer, TaskRecyclerViewFragment> ViewFragmentsDictionary = new HashMap<>();
APIHelper mAPIHelper;
@InjectView(R.id.fab_menu)
FloatingActionMenu floatingMenu;
FlowContentObserver observer;
private TagsHelper tagsHelper;
private ContentCache contentCache;
private MaterialDialog faintDialog;
@Override
protected int getLayoutRes() {
return R.layout.activity_tasks;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.hostConfig = PrefsActivity.fromContext(this);
if (hostConfig == null || hostConfig.getApi() == null || hostConfig.getApi().equals("") || hostConfig.getUser() == null || hostConfig.getUser().equals("")) {
startActivity(new Intent(this, LoginActivity.class));
finish();
return;
}
filterDrawer = new DrawerBuilder()
.withActivity(this)
.withDrawerGravity(Gravity.RIGHT)
.withCloseOnClick(false)
.append(drawer);
viewPager.setCurrentItem(0);
new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener);
this.observer = new FlowContentObserver();
this.observer.registerForContentChanges(this.getApplicationContext(), HabitRPGUser.class);
this.observer.addSpecificModelChangeListener(this);
this.tagsHelper = new TagsHelper();
}
@Override
protected void onResume() {
super.onResume();
if (mAPIHelper == null) {
this.mAPIHelper = new APIHelper(this, hostConfig);
mAPIHelper.retrieveUser(new HabitRPGUserCallback(this));
contentCache = new ContentCache(mAPIHelper.apiService);
}
SetUserData();
}
@Override
protected void onDestroy() {
if (observer != null) {
this.observer.unregisterForContentChanges(this.getApplicationContext());
}
EventBus.getDefault().unregister(this);
super.onDestroy();
}
// region onClick for the FAB Menu
@OnClick(R.id.fab_new_habit)
public void onNewHabit(View view) {
openNewTaskActivity("habit");
}
@OnClick(R.id.fab_new_daily)
public void onNewDaily(View view) {
openNewTaskActivity("daily");
}
@OnClick(R.id.fab_new_todo)
public void onNewTodo(View view) {
openNewTaskActivity("todo");
}
@OnClick(R.id.fab_new_reward)
public void onNewReward(View view) {
openNewTaskActivity("reward");
}
private void openNewTaskActivity(String type) {
Bundle bundle = new Bundle();
bundle.putString("type", type);
bundle.putStringArrayList("tagsId", new ArrayList<String>(this.tagsHelper.getTags()));
Intent intent = new Intent(this, TaskFormActivity.class);
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(intent, TASK_CREATED_RESULT);
}
// endregion
private void showSnackbar(String content) {
showSnackbar(content, SnackbarDisplayType.NORMAL);
}
private void showSnackbar(String content, SnackbarDisplayType displayType) {
Snackbar snackbar = Snackbar.make(floatingMenu, content, Snackbar.LENGTH_LONG);
View snackbarView = snackbar.getView();
if (displayType == SnackbarDisplayType.FAILURE) {
//change Snackbar's background color;
snackbarView.setBackgroundColor(ContextCompat.getColor(this, R.color.worse_10));
} else if (displayType == SnackbarDisplayType.DROP) {
TextView tv = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
tv.setMaxLines(5);
snackbarView.setBackgroundColor(ContextCompat.getColor(this, R.color.best_10));
}
snackbar.show();
}
//region Events
public void onEvent(CreateTagCommand event) {
Tag t = new Tag();
t.setName(event.tagName);
t.save();
mAPIHelper.apiService.createTag(t, new Callback<List<Tag>>() {
@Override
public void success(List<Tag> tags, Response response) {
FillTagFilterDrawer(tags);
}
@Override
public void failure(RetrofitError error) {
showSnackbar("Error: " + error.getMessage(), SnackbarDisplayType.FAILURE);
}
});
}
public void onEvent(TaskTappedEvent event) {
if (event.Task.type.equals("reward"))
return;
Bundle bundle = new Bundle();
bundle.putString("type", event.Task.getType());
bundle.putString("taskId", event.Task.getId());
bundle.putStringArrayList("tagsId", new ArrayList<String>(this.tagsHelper.getTags()));
Intent intent = new Intent(this, TaskFormActivity.class);
intent.putExtras(bundle);
startActivityForResult(intent, TASK_UPDATED_RESULT);
}
public void onEvent(TaskLongPressedEvent event) {
}
public void onEvent(TaskCheckedCommand event) {
mAPIHelper.updateTaskDirection(event.Task.getId(), event.Task.getCompleted() ? TaskDirection.down : TaskDirection.up, new TaskScoringCallback(this, event.Task.getId()));
}
public void onEvent(HabitScoreEvent event) {
mAPIHelper.updateTaskDirection(event.Habit.getId(), event.Up ? TaskDirection.up : TaskDirection.down, new TaskScoringCallback(this, event.Habit.getId()));
}
public void onEvent(AddNewTaskCommand event) {
openNewTaskActivity(event.ClassType.toLowerCase());
}
public void onEvent(final BuyRewardCommand event) {
final String rewardKey = event.Reward.getId();
if (User.getStats().getGp() < event.Reward.getValue()) {
showSnackbar("Not enough Gold", SnackbarDisplayType.FAILURE);
return;
}
if (event.Reward.specialTag == "item") {
if (rewardKey.equals("potion")) {
int currentHp = User.getStats().getHp().intValue();
int maxHp = User.getStats().getMaxHealth();
if(currentHp == maxHp) {
showSnackbar("You don't need to buy an health potion", SnackbarDisplayType.FAILURE);
return;
}
}
mAPIHelper.apiService.buyItem(event.Reward.getId(), new Callback<Void>() {
@Override
public void success(Void aVoid, Response response) {
switch (rewardKey) {
case "potion":
double newHp = Math.min(User.getStats().getMaxHealth(), User.getStats().getHp() + 15);
User.getStats().setHp(newHp);
updateHeader();
break;
default:
// TODO Add bought item to the avatar
break;
}
showSnackbar("Buy Reward Successful " + event.Reward.getText());
}
@Override
public void failure(RetrofitError error) {
showSnackbar("Buy Reward Error " + event.Reward.getText(), SnackbarDisplayType.FAILURE);
}
});
} else {
// user created Rewards
mAPIHelper.updateTaskDirection(rewardKey, TaskDirection.down, new TaskScoringCallback(this, rewardKey));
}
}
public void onEvent(final TaskSaveEvent event) {
Task task = (Task) event.task;
Log.d("tags", "Task saving");
if (event.created) {
this.mAPIHelper.createNewTask(task, new TaskCreationCallback());
updateTags(event.task.getTags());
} else {
this.mAPIHelper.updateTask(task, new TaskUpdateCallback());
}
}
public void onEvent(ToggledInnStateEvent event) {
User.getPreferences().setSleep(event.Inn);
updateUserAvatars();
}
//endregion Events
private void notifyUser(double xp, double hp, double gold,
int lvl, double delta) {
StringBuilder message = new StringBuilder();
SnackbarDisplayType displayType = SnackbarDisplayType.NORMAL;
if (lvl > User.getStats().getLvl()) {
displayLevelUpDialog(lvl);
this.mAPIHelper.retrieveUser(new HabitRPGUserCallback(this));
User.getStats().setLvl((int) lvl);
showSnackbar(message.toString());
} else {
com.magicmicky.habitrpgwrapper.lib.models.Stats stats = User.getStats();
if (xp > stats.getExp()) {
message.append(" + ").append(round(xp - stats.getExp(), 2)).append(" XP");
User.getStats().setExp(xp);
}
if (hp != stats.getHp()) {
displayType = SnackbarDisplayType.FAILURE;
message.append(" - ").append(round(stats.getHp() - hp, 2)).append(" HP");
User.getStats().setHp(hp);
}
if (gold > stats.getGp()) {
message.append(" + ").append(round(gold - stats.getGp(), 2)).append(" GP");
stats.setGp(gold);
} else if (gold < stats.getGp()) {
displayType = SnackbarDisplayType.FAILURE;
message.append(" - ").append(round(stats.getGp() - gold, 2)).append(" GP");
stats.setGp(gold);
}
showSnackbar(message.toString(), displayType);
updateUserAvatars();
}
}
static public Double round(Double value, int n) {
return (Math.round(value * Math.pow(10, n))) / (Math.pow(10, n));
}
public void loadTaskLists() {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
int oldPosition = -1;
@Override
public Fragment getItem(int position) {
int layoutOfType;
TaskRecyclerViewFragment fragment;
HabitItemRecyclerViewAdapter adapter;
switch (position) {
case 0:
layoutOfType = R.layout.habit_item_card;
fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_HABIT, TaskActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class, TaskActivity.this), Task.TYPE_HABIT);
break;
case 1:
layoutOfType = R.layout.daily_item_card;
adapter = new HabitItemRecyclerViewAdapter(Task.TYPE_DAILY, TaskActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class, TaskActivity.this);
if (User != null) {
adapter.dailyResetOffset = User.getPreferences().getDayStart();
}
fragment = TaskRecyclerViewFragment.newInstance(adapter, Task.TYPE_DAILY);
break;
case 3:
layoutOfType = R.layout.reward_item_card;
adapter = new HabitItemRecyclerViewAdapter(Task.TYPE_REWARD, TaskActivity.this.tagsHelper,
layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, TaskActivity.this,
new HabitItemRecyclerViewAdapter.IAdditionalEntries() {
@Override
public void GetAdditionalEntries(final IReceiveNewEntries callBack) {
// request buyable gear
mAPIHelper.apiService.getInventoryBuyableGear(new Callback<List<ItemData>>() {
@Override
public void success(List<ItemData> itemDatas, Response response) {
// get itemdata list
ArrayList<String> itemKeys = new ArrayList<String>();
for (ItemData item : itemDatas) {
itemKeys.add(item.key);
}
itemKeys.add("potion");
contentCache.GetItemDataList(itemKeys, new ContentCache.GotContentEntryCallback<List<ItemData>>() {
@Override
public void GotObject(List<ItemData> obj) {
ArrayList<Task> buyableItems = new ArrayList<Task>();
for (ItemData item : obj) {
Task reward = new Task();
reward.text = item.text;
reward.notes = item.notes;
reward.value = item.value;
reward.setType("reward");
reward.specialTag = "item";
reward.setId(item.key);
buyableItems.add(reward);
}
callBack.GotAdditionalItems(buyableItems);
}
});
}
@Override
public void failure(RetrofitError error) {
}
});
}
});
fragment = TaskRecyclerViewFragment.newInstance(adapter, Task.TYPE_REWARD);
break;
default:
layoutOfType = R.layout.todo_item_card;
fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_TODO, TaskActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class, TaskActivity.this), Task.TYPE_TODO);
}
ViewFragmentsDictionary.put(position, fragment);
return fragment;
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Habits";
case 1:
return "Dailies";
case 2:
return "Todos";
case 3:
return "Rewards";
}
return "";
}
});
detail_tabs.setupWithViewPager(viewPager);
}
public int adjustAlpha(int color, float factor) {
int alpha = Math.round(Color.alpha(color) * factor);
int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
return Color.argb(alpha, red, green, blue);
}
@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_main_activity, 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();
switch (id) {
case R.id.action_search:
filterDrawer.openDrawer();
return true;
case R.id.action_reload:
mAPIHelper.retrieveUser(new HabitRPGUserCallback(this));
return true;
}
return super.onOptionsItemSelected(item);
}
private void updateUserAvatars() {
avatarInHeader.updateData(User);
}
private void updateHeader() {
updateUserAvatars();
setTitle(User.getProfile().getName());
android.support.v7.app.ActionBarDrawerToggle actionBarDrawerToggle = drawer.getActionBarDrawerToggle();
if (actionBarDrawerToggle != null) {
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
}
}
@Override
public void onUserReceived(HabitRPGUser user) {
}
@Override
public void onUserFail() {
}
@Override
public void onTaskDataReceived(TaskDirectionData data) {
notifyUser(data.getExp(), data.getHp(), data.getGp(), data.getLvl(), data.getDelta());
if (data.get_tmp() != null) {
if (data.get_tmp().getDrop() != null) {
showSnackbar(data.get_tmp().getDrop().getDialog(), SnackbarDisplayType.DROP);
}
}
}
@Override
public void onTaskScoringFailed() {
}
@Override
public void onModelStateChanged(Class<? extends Model> aClass, BaseModel.Action action, String s, String s1) {
if (aClass != HabitRPGUser.class)
return;
new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener);
Log.d("db", "received notif");
// SetUserData();
}
private boolean taskListAlreadyAdded;
private void SetUserData() {
if (User != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!taskListAlreadyAdded) {
taskListAlreadyAdded = true;
loadTaskLists();
FillTagFilterDrawer(User.getTags());
}
TaskRecyclerViewFragment fragment = ViewFragmentsDictionary.get(2);
if (fragment != null) {
HabitItemRecyclerViewAdapter adapter =(HabitItemRecyclerViewAdapter)fragment.mAdapter;
adapter.dailyResetOffset = User.getPreferences().getDayStart();
}
updateHeader();
updateSidebar();
displayDeathDialogIfNeeded();
}
});
}
}
// Filter Tags
public void FillTagFilterDrawer(List<Tag> tagList) {
filterDrawer.removeAllItems();
filterDrawer.addItems(
new SectionDrawerItem().withName("Filter by Tag"),
new EditTextDrawer()
);
for (Tag t : tagList) {
filterDrawer.addItem(new SwitchDrawerItem()
.withName(t.getName())
.withTag(t)
.withDescription("" + t.getTasks().size())
.withOnCheckedChangeListener(this)
);
}
}
/*
Updates concerned tags.
*/
public void updateTags(List<TaskTag> tags) {
Log.d("tags", "Updating tags");
List<IDrawerItem> filters = filterDrawer.getDrawerItems();
for (IDrawerItem filter : filters) {
if (filter instanceof SwitchDrawerItem) {
SwitchDrawerItem currentfilter = (SwitchDrawerItem) filter;
Log.v("tags", "Tag " + currentfilter.getName());
String tagId = ((Tag) currentfilter.getTag()).getId();
for (TaskTag tag : tags) {
Tag currentTag = tag.getTag();
if (tagId != null && currentTag != null && tagId.equals(currentTag.getId())) {
currentfilter.withDescription("" + (currentTag.getTasks().size() + 1));
filterDrawer.updateItem(currentfilter);
}
}
}
}
}
// A Filter was checked
private Debounce filterChangedHandler = new Debounce(1500, 1000) {
@Override
public void execute() {
ArrayList<String> tagList = new ArrayList<>();
for (Map.Entry<String, Boolean> f : tagFilterMap.entrySet()) {
if (f.getValue()) {
tagList.add(f.getKey());
}
}
tagsHelper.setTags(tagList);
EventBus.getDefault().post(new FilterTasksByTagsCommand());
}
};
private HashMap<String, Boolean> tagFilterMap = new HashMap<>();
@Override
public void onCheckedChanged(IDrawerItem iDrawerItem, CompoundButton compoundButton, boolean b) {
Tag t = (Tag) iDrawerItem.getTag();
if (t != null) {
tagFilterMap.put(t.getId(), b);
filterChangedHandler.hit();
showSnackbar(t.getName() + " : " + b);
}
}
private TransactionListener<HabitRPGUser> userTransactionListener = new TransactionListener<HabitRPGUser>() {
@Override
public void onResultReceived(HabitRPGUser habitRPGUser) {
User = habitRPGUser;
SetUserData();
}
@Override
public boolean onReady(BaseTransaction<HabitRPGUser> baseTransaction) {
return true;
}
@Override
public boolean hasResult(BaseTransaction<HabitRPGUser> baseTransaction, HabitRPGUser habitRPGUser) {
return true;
}
};
private void displayLevelUpDialog(int level) {
SuppressedModals suppressedModals = User.getPreferences().getSuppressModals();
if (suppressedModals != null) {
if (suppressedModals.getLevelUp()) {
return;
}
}
MaterialDialog dialog = new MaterialDialog.Builder(this)
.title(R.string.levelup_header)
.customView(R.layout.levelup_dialog, true)
.positiveText(R.string.levelup_button)
.positiveColorRes(R.color.brand_100)
.build();
View customView = dialog.getCustomView();
if (customView != null) {
TextView detailView = (TextView)customView.findViewById(R.id.levelupDetail);
detailView.setText(this.getString(R.string.levelup_detail, level));
ImageView avatarView = (ImageView)customView.findViewById(R.id.avatarView);
UserPicture userPicture = new UserPicture(User, this, false, false);
userPicture.setPictureOn(avatarView);
}
dialog.show();
}
private void displayDeathDialogIfNeeded() {
if (User.getStats().getHp() > 0) {
return;
}
if (this.faintDialog == null) {
final TaskActivity activity = this;
this.faintDialog = new MaterialDialog.Builder(this)
.title(R.string.faint_header)
.customView(R.layout.faint_dialog, true)
.positiveText(R.string.faint_button)
.positiveColorRes(R.color.worse_100)
.dismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
faintDialog = null;
mAPIHelper.reviveUser(new HabitRPGUserCallback(activity));
}
})
.cancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
faintDialog = null;
}
})
.build();
View customView = this.faintDialog.getCustomView();
if (customView != null) {
View hpBarView = customView.findViewById(R.id.hpBar);
ValueBarBinding hpBar = DataBindingUtil.bind(hpBarView);
hpBar.setPartyMembers(true);
AvatarWithBarsViewModel.setHpBarData(hpBar, User.getStats(), this);
ImageView avatarView = (ImageView)customView.findViewById(R.id.avatarView);
UserPicture userPicture = new UserPicture(User, this, false, false);
userPicture.setPictureOn(avatarView);
}
this.faintDialog.show();
}
}
}

View file

@ -1,132 +0,0 @@
package com.habitrpg.android.habitica;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.ViewGroup;
import com.habitrpg.android.habitica.events.ToggledInnStateEvent;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel;
import com.habitrpg.android.habitica.ui.MainDrawerBuilder;
import com.habitrpg.android.habitica.ui.fragments.ChatListFragment;
import com.habitrpg.android.habitica.userpicture.UserPicture;
import com.habitrpg.android.habitica.userpicture.UserPictureRunnable;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.mikepenz.materialdrawer.AccountHeader;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
import butterknife.ButterKnife;
import butterknife.InjectView;
import de.greenrobot.event.EventBus;
public class TavernActivity extends AppCompatActivity {
@InjectView(R.id.toolbar)
Toolbar toolbar;
@InjectView(R.id.avatar)
ViewGroup avatarHeader;
private AvatarWithBarsViewModel avatarInHeader;
private APIHelper mAPIHelper;
private HabitRPGUser User;
private AccountHeader accountHeader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tavern);
ButterKnife.inject(this);
setSupportActionBar(toolbar);
// Receive Events
EventBus.getDefault().register(this);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(false);
toolbar.setTitleTextColor(this.getResources().getColor(R.color.white));
}
accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build();
avatarInHeader = new AvatarWithBarsViewModel(this, avatarHeader);
HostConfig hostConfig = PrefsActivity.fromContext(this);
User = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle();
avatarInHeader.updateData(User);
updateSidebar();
mAPIHelper = new APIHelper(this, hostConfig);
setFragment(new ChatListFragment(this, "habitrpg", mAPIHelper, User, true));
}
private void updateSidebar() {
final IProfile profile = accountHeader.getProfiles().get(0);
if (User.getAuthentication() != null) {
if (User.getAuthentication().getLocalAuthentication() != null) {
profile.withEmail(User.getAuthentication().getLocalAuthentication().getEmail());
}
} profile.withName(User.getProfile().getName());
new UserPicture(User, this, true, false).setPictureWithRunnable(new UserPictureRunnable() {
public void run(Bitmap avatar) {
profile.withIcon(avatar);
accountHeader.updateProfile(profile);
}
});
accountHeader.updateProfile(profile);
}
// This could be moved into an abstract BaseActivity
// class for being re-used by several instances
protected void setFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.tavern_framelayout, fragment);
fragmentTransaction.commit();
}
public void onEvent(ToggledInnStateEvent evt) {
avatarInHeader.updateData(User);
}
@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 == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View file

@ -10,6 +10,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.habitrpg.android.habitica.events.commands.CreateTagCommand;
import com.habitrpg.android.habitica.helpers.TagsHelper;
import com.habitrpg.android.habitica.ui.fragments.ChatListFragment;
import com.mikepenz.materialdrawer.DrawerBuilder;
@ -37,4 +38,9 @@ public class TavernFragment extends BaseFragment {
fragmentTransaction.replace(R.id.tavern_framelayout, fragment);
fragmentTransaction.commit();
}
//we don't have custom tavern events right now.
public void onEvent(CreateTagCommand event) {
}
}

View file

@ -10,11 +10,8 @@ import com.habitrpg.android.habitica.BaseFragment;
import com.habitrpg.android.habitica.GemPurchaseActivity;
import com.habitrpg.android.habitica.MainActivity;
import com.habitrpg.android.habitica.PartyFragment;
import com.habitrpg.android.habitica.TaskActivity;
import com.habitrpg.android.habitica.PartyActivity;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.TasksFragment;
import com.habitrpg.android.habitica.TavernActivity;
import com.habitrpg.android.habitica.TavernFragment;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
import com.mikepenz.materialdrawer.AccountHeader;
@ -100,9 +97,8 @@ public class MainDrawerBuilder {
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
// do something with the clicked item :D
BaseFragment fragment = null;
Class newActivityClass = null;
switch (drawerItem.getIdentifier()) {
case SIDEBAR_TASKS: {
@ -117,12 +113,25 @@ public class MainDrawerBuilder {
fragment = new TavernFragment();
break;
}
case SIDEBAR_SETTINGS: {
newActivityClass = PrefsActivity.class;
break;
}
case SIDEBAR_ABOUT: {
newActivityClass = AboutActivity.class;
break;
}
}
if (fragment != null) {
fragment.fragmentSidebarPosition = position;
activity.displayFragment(fragment);
return false;
}
if (newActivityClass != null) {
activity.startActivity(new Intent(activity, newActivityClass));
return false;
}
return true;

View file

@ -11,7 +11,7 @@ import android.widget.RemoteViews;
import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.TaskActivity;
import com.habitrpg.android.habitica.MainActivity;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
@ -64,7 +64,7 @@ public class UpdateWidgetService extends Service implements HabitRPGUserCallback
PendingIntent updateIntent = PendingIntent.getBroadcast(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.BT_refresh, updateIntent);
Intent openAppIntent = new Intent(this.getApplicationContext(), TaskActivity.class);
Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class);
PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.widget_main_view, openApp);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
@ -95,7 +95,7 @@ public class UpdateWidgetService extends Service implements HabitRPGUserCallback
remoteViews.setOnClickPendingIntent(R.id.BT_refresh, updateIntent);
//If user click on life and xp: open the app
Intent openAppIntent = new Intent(this.getApplicationContext(), TaskActivity.class);
Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class);
PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.LL_header, openApp);
remoteViews.setOnClickPendingIntent(R.id.IMG_ProfilePicture, openApp);