mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-19 20:29:02 +00:00
begin reworking activities into fragments
This commit is contained in:
parent
237b66cb6b
commit
aa79010ea0
18 changed files with 1551 additions and 854 deletions
|
|
@ -81,34 +81,34 @@
|
|||
<activity
|
||||
android:name=".TaskFormActivity"
|
||||
android:theme="@style/AppThemeWithActionBarBlackText"
|
||||
android:parentActivityName=".MainActivity">
|
||||
android:parentActivityName=".TaskActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.habitrpg.android.habitica.MainActivity" />
|
||||
android:value=".TaskActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".TavernActivity"
|
||||
android:label="@string/title_activity_tavern"
|
||||
android:parentActivityName=".MainActivity">
|
||||
android:parentActivityName=".TaskActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.habitrpg.android.habitica.MainActivity" />
|
||||
android:value=".TaskActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".PartyActivity"
|
||||
android:label="@string/title_activity_party"
|
||||
android:parentActivityName=".MainActivity">
|
||||
android:parentActivityName=".TaskActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.habitrpg.android.habitica.MainActivity" />
|
||||
android:value=".TaskActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".GemPurchaseActivity"
|
||||
android:label="@string/title_activity_gem_purchase"
|
||||
android:parentActivityName=".MainActivity">
|
||||
android:parentActivityName=".TaskActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.habitrpg.android.habitica.MainActivity" />
|
||||
android:value=".TaskActivity" />
|
||||
</activity>
|
||||
|
||||
<activity android:name="com.facebook.FacebookActivity"
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<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:fitsSystemWindows="true"
|
||||
android:gravity="center"
|
||||
tools:context=".MainActivity">
|
||||
tools:context=".PartyActivity">
|
||||
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
android:id="@+id/main_content"
|
||||
|
|
@ -15,13 +15,13 @@
|
|||
android:elevation="0dp"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<android.support.v4.view.ViewPager
|
||||
android:id="@+id/viewpager"
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/fragment_container"
|
||||
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"
|
||||
|
|
@ -51,12 +51,10 @@
|
|||
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"
|
||||
android:minHeight="?attr/actionBarSize"
|
||||
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
|
||||
|
||||
|
||||
</android.support.design.widget.CollapsingToolbarLayout>
|
||||
|
||||
<android.support.design.widget.TabLayout
|
||||
|
|
@ -64,10 +62,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="@color/brand_300"
|
||||
android:background="?attr/colorPrimary"
|
||||
android:elevation="0dp"
|
||||
android:fillViewport="false"
|
||||
android:theme="@style/MyCustomTabLayout"
|
||||
|
||||
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
|
||||
app:layout_anchor="@+id/collapsing_toolbar"
|
||||
app:layout_anchorGravity="bottom"
|
||||
|
||||
|
|
@ -75,97 +74,6 @@
|
|||
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>
|
||||
171
Habitica/res/layout/activity_tasks.xml
Normal file
171
Habitica/res/layout/activity_tasks.xml
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
<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>
|
||||
5
Habitica/res/layout/fragment_party.xml
Normal file
5
Habitica/res/layout/fragment_party.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/view_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
5
Habitica/res/layout/fragment_tasks.xml
Normal file
5
Habitica/res/layout/fragment_tasks.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/view_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
|
@ -1,7 +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="com.habitrpg.android.habitica.MainActivity">
|
||||
tools:context="com.habitrpg.android.habitica.TaskActivity">
|
||||
|
||||
<!-- Search, should appear as action button -->
|
||||
<item android:id="@+id/action_search"
|
||||
|
|
|
|||
|
|
@ -99,8 +99,7 @@ public abstract class AvatarActivityBase extends InstabugAppCompatActivity {
|
|||
|
||||
avatarInHeader = new AvatarWithBarsViewModel(this, avatar_with_bars);
|
||||
accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build();
|
||||
drawer = MainDrawerBuilder.CreateDefaultBuilderSettings(this, toolbar, accountHeader)
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
protected void setTitle(String text) {
|
||||
|
|
|
|||
31
Habitica/src/com/habitrpg/android/habitica/BaseFragment.java
Normal file
31
Habitica/src/com/habitrpg/android/habitica/BaseFragment.java
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package com.habitrpg.android.habitica;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.design.widget.TabLayout;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
|
||||
|
||||
/**
|
||||
* Created by admin on 18/11/15.
|
||||
*/
|
||||
public abstract class BaseFragment extends Fragment {
|
||||
|
||||
public MainActivity activity;
|
||||
APIHelper mAPIHelper;
|
||||
protected HabitRPGUser user;
|
||||
|
||||
public void setUser(HabitRPGUser user) { this.user = user; }
|
||||
public void updateUserData(HabitRPGUser user) { this.user = user; }
|
||||
public void setTabLayout(TabLayout tabLayout) {}
|
||||
public void setActivity(MainActivity activity) {this.activity = activity; }
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
this.activity = (MainActivity) getActivity();
|
||||
}
|
||||
}
|
||||
|
|
@ -74,9 +74,6 @@ public class GemPurchaseActivity extends AppCompatActivity {
|
|||
}
|
||||
|
||||
accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build();
|
||||
Drawer drawer = MainDrawerBuilder.CreateDefaultBuilderSettings(this, toolbar, accountHeader)
|
||||
.withSelectedItem(2)
|
||||
.build();
|
||||
|
||||
HostConfig hostConfig = PrefsActivity.fromContext(this);
|
||||
HabitRPGUser user = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle();
|
||||
|
|
|
|||
|
|
@ -1,40 +1,27 @@
|
|||
package com.habitrpg.android.habitica;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.text.SpannableString;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.text.util.Linkify;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.Transformation;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TableRow;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.facebook.AccessToken;
|
||||
import com.facebook.CallbackManager;
|
||||
import com.facebook.FacebookCallback;
|
||||
import com.facebook.FacebookException;
|
||||
import com.facebook.FacebookSdk;
|
||||
import com.facebook.login.LoginResult;
|
||||
import com.facebook.login.widget.LoginButton;
|
||||
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
|
||||
|
|
@ -185,7 +172,7 @@ public class LoginActivity extends AppCompatActivity
|
|||
}
|
||||
|
||||
private void startMainActivity() {
|
||||
startActivity(new Intent(LoginActivity.this, MainActivity.class));
|
||||
startActivity(new Intent(LoginActivity.this, TaskActivity.class));
|
||||
finish();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,66 +1,29 @@
|
|||
package com.habitrpg.android.habitica;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.databinding.DataBindingUtil;
|
||||
import android.graphics.Bitmap;
|
||||
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.support.design.widget.CollapsingToolbarLayout;
|
||||
import android.support.design.widget.TabLayout;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.View;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.github.clans.fab.FloatingActionMenu;
|
||||
import com.crashlytics.android.Crashlytics;
|
||||
import com.crashlytics.android.core.CrashlyticsCore;
|
||||
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.MainDrawerBuilder;
|
||||
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.habitrpg.android.habitica.userpicture.UserPictureRunnable;
|
||||
import com.instabug.wrapper.support.activity.InstabugAppCompatActivity;
|
||||
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.AccountHeader;
|
||||
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.mikepenz.materialdrawer.model.interfaces.IProfile;
|
||||
import com.raizlabs.android.dbflow.runtime.FlowContentObserver;
|
||||
import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction;
|
||||
import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener;
|
||||
|
|
@ -69,56 +32,58 @@ 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.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
import butterknife.OnClick;
|
||||
import de.greenrobot.event.EventBus;
|
||||
import retrofit.Callback;
|
||||
import retrofit.RetrofitError;
|
||||
import retrofit.client.Response;
|
||||
import io.fabric.sdk.android.Fabric;
|
||||
|
||||
/**
|
||||
* Created by admin on 18/11/15.
|
||||
*/
|
||||
public class MainActivity extends InstabugAppCompatActivity implements HabitRPGUserCallback.OnUserReceived, FlowContentObserver.OnSpecificModelStateChangedListener {
|
||||
|
||||
@InjectView(R.id.fragment_container)
|
||||
FrameLayout fragment_container;
|
||||
|
||||
public class MainActivity extends AvatarActivityBase implements HabitRPGUserCallback.OnUserReceived,
|
||||
TaskScoringCallback.OnTaskScored, FlowContentObserver.OnSpecificModelStateChangedListener,
|
||||
OnCheckedChangeListener {
|
||||
BaseFragment activeFragment;
|
||||
|
||||
public enum SnackbarDisplayType {
|
||||
NORMAL, FAILURE, DROP
|
||||
}
|
||||
@InjectView(R.id.toolbar)
|
||||
Toolbar toolbar;
|
||||
|
||||
static final int TASK_CREATED_RESULT = 1;
|
||||
static final int TASK_UPDATED_RESULT = 2;
|
||||
@InjectView(R.id.detail_tabs)
|
||||
TabLayout detail_tabs;
|
||||
|
||||
Drawer filterDrawer;
|
||||
@InjectView(R.id.avatar_with_bars)
|
||||
View avatar_with_bars;
|
||||
|
||||
Map<Integer, TaskRecyclerViewFragment> ViewFragmentsDictionary = new HashMap<>();
|
||||
@InjectView(R.id.collapsing_toolbar)
|
||||
CollapsingToolbarLayout collapsingToolbarLayout;
|
||||
|
||||
APIHelper mAPIHelper;
|
||||
TextView titleTextView;
|
||||
|
||||
@InjectView(R.id.fab_menu)
|
||||
FloatingActionMenu floatingMenu;
|
||||
AccountHeader accountHeader;
|
||||
Drawer drawer;
|
||||
|
||||
protected HostConfig hostConfig;
|
||||
protected HabitRPGUser user;
|
||||
|
||||
AvatarWithBarsViewModel avatarInHeader;
|
||||
|
||||
FlowContentObserver observer;
|
||||
|
||||
private TagsHelper tagsHelper;
|
||||
|
||||
private ContentCache contentCache;
|
||||
|
||||
private MaterialDialog faintDialog;
|
||||
APIHelper mAPIHelper;
|
||||
|
||||
@Override
|
||||
protected int getLayoutRes() {
|
||||
return R.layout.activity_main;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
// Inject Controls
|
||||
ButterKnife.inject(this);
|
||||
|
||||
// Initialize Crashlytics
|
||||
Crashlytics crashlytics = new Crashlytics.Builder()
|
||||
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
|
||||
.build();
|
||||
Fabric.with(this, crashlytics);
|
||||
|
||||
this.hostConfig = PrefsActivity.fromContext(this);
|
||||
if (hostConfig == null || hostConfig.getApi() == null || hostConfig.getApi().equals("") || hostConfig.getUser() == null || hostConfig.getUser().equals("")) {
|
||||
|
|
@ -126,15 +91,7 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
|
|||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
filterDrawer = new DrawerBuilder()
|
||||
.withActivity(this)
|
||||
.withDrawerGravity(Gravity.RIGHT)
|
||||
.withCloseOnClick(false)
|
||||
.append(drawer);
|
||||
|
||||
viewPager.setCurrentItem(0);
|
||||
this.mAPIHelper = new APIHelper(this, hostConfig);
|
||||
|
||||
new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener);
|
||||
this.observer = new FlowContentObserver();
|
||||
|
|
@ -142,560 +99,61 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
|
|||
|
||||
this.observer.addSpecificModelChangeListener(this);
|
||||
|
||||
this.tagsHelper = new TagsHelper();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
avatarInHeader = new AvatarWithBarsViewModel(this, avatar_with_bars);
|
||||
accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build();
|
||||
drawer = MainDrawerBuilder.CreateDefaultBuilderSettings(this, toolbar, accountHeader)
|
||||
.build();
|
||||
|
||||
// Create a new Fragment to be placed in the activity layout
|
||||
TasksFragment tasksFragment = new TasksFragment();
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
mAPIHelper.retrieveUser(new HabitRPGUserCallback(this));
|
||||
SetUserData();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
if (observer != null) {
|
||||
this.observer.unregisterForContentChanges(this.getApplicationContext());
|
||||
}
|
||||
EventBus.getDefault().unregister(this);
|
||||
public void displayFragment(BaseFragment fragment) {
|
||||
fragment.setArguments(getIntent().getExtras());
|
||||
fragment.mAPIHelper = mAPIHelper;
|
||||
fragment.setUser(user);
|
||||
fragment.setActivity(this);
|
||||
fragment.setTabLayout(detail_tabs);
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
if (getSupportFragmentManager().getFragments() == null) {
|
||||
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, fragment).commit();
|
||||
} 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, MainActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class, MainActivity.this), Task.TYPE_HABIT);
|
||||
|
||||
break;
|
||||
case 1:
|
||||
layoutOfType = R.layout.daily_item_card;
|
||||
adapter = new HabitItemRecyclerViewAdapter(Task.TYPE_DAILY, MainActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class, MainActivity.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, MainActivity.this.tagsHelper,
|
||||
layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, MainActivity.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, MainActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class, MainActivity.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();
|
||||
Log.w("Tags", "onCheckedChanged" + compoundButton.isChecked() + " : " + b);
|
||||
if (t != null) {
|
||||
tagFilterMap.put(t.getId(), b);
|
||||
filterChangedHandler.hit();
|
||||
showSnackbar(t.getName() + " : " + b);
|
||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).addToBackStack(null).commit();
|
||||
}
|
||||
activeFragment = fragment;
|
||||
}
|
||||
|
||||
private TransactionListener<HabitRPGUser> userTransactionListener = new TransactionListener<HabitRPGUser>() {
|
||||
@Override
|
||||
public void onResultReceived(HabitRPGUser habitRPGUser) {
|
||||
User = habitRPGUser;
|
||||
user = habitRPGUser;
|
||||
SetUserData();
|
||||
}
|
||||
|
||||
|
|
@ -710,77 +168,68 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
|
|||
}
|
||||
};
|
||||
|
||||
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) {
|
||||
@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);
|
||||
}
|
||||
|
||||
private void SetUserData() {
|
||||
if (user != null) {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
updateHeader();
|
||||
updateSidebar();
|
||||
if (activeFragment != null) {
|
||||
activeFragment.updateUserData(user);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (this.faintDialog == null) {
|
||||
final MainActivity 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();
|
||||
private void updateUserAvatars() {
|
||||
avatarInHeader.updateData(user);
|
||||
}
|
||||
|
||||
View customView = this.faintDialog.getCustomView();
|
||||
if (customView != null) {
|
||||
View hpBarView = customView.findViewById(R.id.hpBar);
|
||||
private void updateHeader() {
|
||||
updateUserAvatars();
|
||||
setTitle(user.getProfile().getName());
|
||||
|
||||
ValueBarBinding hpBar = DataBindingUtil.bind(hpBarView);
|
||||
hpBar.setPartyMembers(true);
|
||||
AvatarWithBarsViewModel.setHpBarData(hpBar, User.getStats(), this);
|
||||
android.support.v7.app.ActionBarDrawerToggle actionBarDrawerToggle = drawer.getActionBarDrawerToggle();
|
||||
|
||||
ImageView avatarView = (ImageView)customView.findViewById(R.id.avatarView);
|
||||
UserPicture userPicture = new UserPicture(User, this, false, false);
|
||||
userPicture.setPictureOn(avatarView);
|
||||
if (actionBarDrawerToggle != null) {
|
||||
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
this.faintDialog.show();
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUserReceived(HabitRPGUser user) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUserFail() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
160
Habitica/src/com/habitrpg/android/habitica/PartyFragment.java
Normal file
160
Habitica/src/com/habitrpg/android/habitica/PartyFragment.java
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
package com.habitrpg.android.habitica;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.design.widget.AppBarLayout;
|
||||
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.Gravity;
|
||||
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.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.QuestContent;
|
||||
import com.mikepenz.materialdrawer.DrawerBuilder;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import retrofit.Callback;
|
||||
import retrofit.RetrofitError;
|
||||
import retrofit.client.Response;
|
||||
|
||||
/**
|
||||
* Created by admin on 18/11/15.
|
||||
*/
|
||||
public class PartyFragment extends BaseFragment {
|
||||
|
||||
public TabLayout tabLayout;
|
||||
public ViewPager viewPager;
|
||||
private Group group;
|
||||
private HashMap<Integer, Fragment> fragmentDictionary = new HashMap<>();
|
||||
|
||||
private PartyMemberListFragment partyMemberListFragment;
|
||||
private PartyInformationFragment partyInformationFragment;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
// Inflate the layout for this fragment
|
||||
View v = inflater.inflate(R.layout.fragment_party, container, false);
|
||||
|
||||
viewPager = (ViewPager) v.findViewById(R.id.view_pager);
|
||||
|
||||
viewPager.setCurrentItem(0);
|
||||
|
||||
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) {
|
||||
PartyFragment.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) {
|
||||
if (partyInformationFragment != null) {
|
||||
partyInformationFragment.setQuestContent(content);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void failure(RetrofitError error) {
|
||||
|
||||
}
|
||||
});
|
||||
setViewPagerAdapter();
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTabLayout(TabLayout tabLayout) {
|
||||
this.tabLayout = tabLayout;
|
||||
this.tabLayout.removeAllTabs();
|
||||
}
|
||||
|
||||
public void setViewPagerAdapter() {
|
||||
android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();
|
||||
|
||||
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(activity, "party", mAPIHelper, user, false);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
fragment = partyMemberListFragment = new PartyMemberListFragment(activity, 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 "";
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
}
|
||||
|
||||
|
||||
//region Events
|
||||
|
||||
// until there is a party event
|
||||
public void onEvent(CreateTagCommand event) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
783
Habitica/src/com/habitrpg/android/habitica/TaskActivity.java
Normal file
783
Habitica/src/com/habitrpg/android/habitica/TaskActivity.java
Normal file
|
|
@ -0,0 +1,783 @@
|
|||
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();
|
||||
Log.w("Tags", "onCheckedChanged" + compoundButton.isChecked() + " : " + b);
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
209
Habitica/src/com/habitrpg/android/habitica/TasksFragment.java
Normal file
209
Habitica/src/com/habitrpg/android/habitica/TasksFragment.java
Normal file
|
|
@ -0,0 +1,209 @@
|
|||
package com.habitrpg.android.habitica;
|
||||
|
||||
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.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.habitrpg.android.habitica.helpers.TagsHelper;
|
||||
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.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
|
||||
import com.mikepenz.materialdrawer.Drawer;
|
||||
import com.mikepenz.materialdrawer.DrawerBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import retrofit.Callback;
|
||||
import retrofit.RetrofitError;
|
||||
import retrofit.client.Response;
|
||||
|
||||
/**
|
||||
* Created by admin on 18/11/15.
|
||||
*/
|
||||
public class TasksFragment extends BaseFragment {
|
||||
|
||||
public TabLayout tabLayout;
|
||||
public ViewPager viewPager;
|
||||
|
||||
Drawer filterDrawer;
|
||||
|
||||
Map<Integer, TaskRecyclerViewFragment> ViewFragmentsDictionary = new HashMap<>();
|
||||
|
||||
private TagsHelper tagsHelper;
|
||||
private ContentCache contentCache;
|
||||
|
||||
public void setActivity(MainActivity activity) {
|
||||
super.setActivity(activity);
|
||||
contentCache = new ContentCache(mAPIHelper.apiService);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTabLayout(TabLayout tabLayout) {
|
||||
this.tabLayout = tabLayout;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
// Inflate the layout for this fragment
|
||||
View v = inflater.inflate(R.layout.fragment_tasks, container, false);
|
||||
|
||||
viewPager = (ViewPager) v.findViewById(R.id.view_pager);
|
||||
|
||||
filterDrawer = new DrawerBuilder()
|
||||
.withActivity(activity)
|
||||
.withDrawerGravity(Gravity.RIGHT)
|
||||
.withCloseOnClick(false)
|
||||
.append(activity.drawer);
|
||||
|
||||
viewPager.setCurrentItem(0);
|
||||
this.tagsHelper = new TagsHelper();
|
||||
|
||||
loadTaskLists();
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
public void loadTaskLists() {
|
||||
android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();
|
||||
|
||||
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, TasksFragment.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class, activity), Task.TYPE_HABIT);
|
||||
|
||||
break;
|
||||
case 1:
|
||||
layoutOfType = R.layout.daily_item_card;
|
||||
adapter = new HabitItemRecyclerViewAdapter(Task.TYPE_DAILY, TasksFragment.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class, activity);
|
||||
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, TasksFragment.this.tagsHelper,
|
||||
layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, activity,
|
||||
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, TasksFragment.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class, activity), 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 "";
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
|
||||
}
|
||||
|
||||
public void updateUserData(HabitRPGUser user) {
|
||||
super.updateUserData(user);
|
||||
if (this.user != null) {
|
||||
TaskRecyclerViewFragment fragment = ViewFragmentsDictionary.get(2);
|
||||
if (fragment != null) {
|
||||
HabitItemRecyclerViewAdapter adapter =(HabitItemRecyclerViewAdapter)fragment.mAdapter;
|
||||
adapter.dailyResetOffset = this.user.getPreferences().getDayStart();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -69,9 +69,7 @@ public class TavernActivity extends AppCompatActivity {
|
|||
}
|
||||
|
||||
accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build();
|
||||
Drawer drawer = MainDrawerBuilder.CreateDefaultBuilderSettings(this, toolbar, accountHeader)
|
||||
.withSelectedItem(2)
|
||||
.build();
|
||||
|
||||
|
||||
avatarInHeader = new AvatarWithBarsViewModel(this, avatarHeader);
|
||||
|
||||
|
|
|
|||
|
|
@ -6,10 +6,14 @@ import android.support.v7.widget.Toolbar;
|
|||
import android.view.View;
|
||||
|
||||
import com.habitrpg.android.habitica.AboutActivity;
|
||||
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.prefs.PrefsActivity;
|
||||
import com.mikepenz.materialdrawer.AccountHeader;
|
||||
|
|
@ -19,11 +23,11 @@ import com.mikepenz.materialdrawer.DrawerBuilder;
|
|||
import com.mikepenz.materialdrawer.model.DividerDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.SectionDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.HashMap;
|
||||
|
||||
|
||||
|
|
@ -40,16 +44,7 @@ public class MainDrawerBuilder {
|
|||
static final int SIDEBAR_SETTINGS = 6;
|
||||
static final int SIDEBAR_ABOUT = 7;
|
||||
|
||||
private static HashMap<Integer, Class> ClassMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
ClassMap.put(SIDEBAR_TASKS, MainActivity.class);
|
||||
ClassMap.put(SIDEBAR_TAVERN, TavernActivity.class);
|
||||
ClassMap.put(SIDEBAR_PARTY, PartyActivity.class);
|
||||
ClassMap.put(SIDEBAR_PURCHASE, GemPurchaseActivity.class);
|
||||
ClassMap.put(SIDEBAR_SETTINGS, PrefsActivity.class);
|
||||
ClassMap.put(SIDEBAR_ABOUT, AboutActivity.class);
|
||||
}
|
||||
|
||||
public static AccountHeaderBuilder CreateDefaultAccountHeader(final Activity activity) {
|
||||
AccountHeaderBuilder builder = new AccountHeaderBuilder()
|
||||
|
|
@ -69,7 +64,7 @@ public class MainDrawerBuilder {
|
|||
}
|
||||
|
||||
|
||||
public static DrawerBuilder CreateDefaultBuilderSettings(final Activity activity, Toolbar toolbar, AccountHeader accountHeader) {
|
||||
public static DrawerBuilder CreateDefaultBuilderSettings(final MainActivity activity, Toolbar toolbar, AccountHeader accountHeader) {
|
||||
DrawerBuilder builder = new DrawerBuilder()
|
||||
.withActivity(activity);
|
||||
|
||||
|
|
@ -106,13 +101,21 @@ public class MainDrawerBuilder {
|
|||
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
|
||||
// do something with the clicked item :D
|
||||
|
||||
Class selectedClass = ClassMap.get(drawerItem.getIdentifier());
|
||||
BaseFragment fragment = null;
|
||||
|
||||
if (selectedClass != null && activity.getClass() != selectedClass) {
|
||||
activity.startActivity(new Intent(activity, selectedClass));
|
||||
return false;
|
||||
} else if (selectedClass != null) {
|
||||
//same item was clicked again
|
||||
switch (drawerItem.getIdentifier()) {
|
||||
case SIDEBAR_TASKS: {
|
||||
fragment = new TasksFragment();
|
||||
break;
|
||||
}
|
||||
case SIDEBAR_PARTY: {
|
||||
fragment = new PartyFragment();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fragment != null) {
|
||||
activity.displayFragment(fragment);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -121,14 +124,6 @@ public class MainDrawerBuilder {
|
|||
}
|
||||
});
|
||||
|
||||
Class activityClass = activity.getClass();
|
||||
for (java.util.Map.Entry<Integer,Class> entry: ClassMap.entrySet()) {
|
||||
if(entry.getValue() == activityClass){
|
||||
builder.withSelectedItem(entry.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.MainActivity;
|
||||
import com.habitrpg.android.habitica.TaskActivity;
|
||||
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(), MainActivity.class);
|
||||
Intent openAppIntent = new Intent(this.getApplicationContext(), TaskActivity.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(), MainActivity.class);
|
||||
Intent openAppIntent = new Intent(this.getApplicationContext(), TaskActivity.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);
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ public interface ApiService {
|
|||
@GET("/content")
|
||||
void getContent(Callback<ContentResult> contentResultCallback);
|
||||
|
||||
/* User API */
|
||||
/* user API */
|
||||
|
||||
@GET("/user/")
|
||||
void getUser(Callback<HabitRPGUser> habitRPGUserCallback);
|
||||
|
|
|
|||
Loading…
Reference in a new issue