diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index 68e82b5d1..e0eda724b 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -18,6 +18,7 @@
+
+
+
+
-
diff --git a/Habitica/res/layout/activity_challenge_detail.xml b/Habitica/res/layout/activity_challenge_detail.xml
new file mode 100644
index 000000000..94c60cfd4
--- /dev/null
+++ b/Habitica/res/layout/activity_challenge_detail.xml
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/challenge_item.xml b/Habitica/res/layout/challenge_item.xml
index ef58ef30b..af3d43063 100644
--- a/Habitica/res/layout/challenge_item.xml
+++ b/Habitica/res/layout/challenge_item.xml
@@ -2,9 +2,9 @@
+
+
-
+
@@ -47,58 +53,60 @@
android:layout_weight="0.5"
android:gravity="right">
-
+ android:layout_height="20dp"
+ android:src="@drawable/ic_people_black_24dp" />
+ android:paddingStart="5dp"
+ android:text="0" />
-
+ android:weightSum="1.0">
-
-
-
+ android:layout_weight="0.5"
+ android:gravity="end">
+
+
+
+
+
+
-
-
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 0fd5c40ec..2f7322eff 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -437,4 +437,5 @@ To start, which parts of your life do you want to improve?
Audio Theme
Change Habitica\'s Audio Theme
by
+ Challenge Details
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
index 63c225acc..5396a0f51 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
@@ -7,6 +7,7 @@ import com.habitrpg.android.habitica.modules.ApiModule;
import com.habitrpg.android.habitica.modules.AppModule;
import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver;
import com.habitrpg.android.habitica.ui.activities.AboutActivity;
+import com.habitrpg.android.habitica.ui.activities.ChallengeDetailActivity;
import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity;
import com.habitrpg.android.habitica.ui.activities.FullProfileActivity;
import com.habitrpg.android.habitica.ui.activities.GroupFormActivity;
@@ -196,4 +197,6 @@ public interface AppComponent {
void inject(ChallengeTasksFragment challengeTasksFragment);
void inject(ChallengeTaskRecyclerViewFragment challengeTaskRecyclerViewFragment);
+
+ void inject(ChallengeDetailActivity challengeDetailActivity);
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java
new file mode 100644
index 000000000..e756c0fcc
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java
@@ -0,0 +1,76 @@
+package com.habitrpg.android.habitica.ui.activities;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.widget.Toolbar;
+
+import com.habitrpg.android.habitica.APIHelper;
+import com.habitrpg.android.habitica.HabiticaApplication;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.components.AppComponent;
+import com.habitrpg.android.habitica.ui.adapter.social.ChallengesListViewAdapter.ChallengeViewHolder;
+import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeTasksFragment;
+
+import javax.inject.Inject;
+
+import butterknife.BindView;
+
+public class ChallengeDetailActivity extends BaseActivity {
+
+ public static String CHALLENGE_ID = "CHALLENGE_ID";
+
+ @BindView(R.id.detail_tabs)
+ TabLayout detail_tabs;
+
+ @BindView(R.id.toolbar)
+ Toolbar toolbar;
+
+ @Inject
+ public APIHelper apiHelper;
+
+ private ChallengeViewHolder challengeViewHolder;
+
+ @Override
+ protected int getLayoutResId() {
+ return R.layout.activity_challenge_detail;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setupToolbar(toolbar);
+
+ getSupportActionBar().setTitle(R.string.challenge_details);
+
+ Bundle extras = getIntent().getExtras();
+
+ String challengeId = extras.getString(CHALLENGE_ID);
+
+ ChallengeTasksFragment fragment = new ChallengeTasksFragment();
+ fragment.setTabLayout(detail_tabs);
+ fragment.setUser(HabiticaApplication.User);
+ fragment.setChallengeId(challengeId);
+
+ if (getSupportFragmentManager().getFragments() == null) {
+ getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, fragment).commitAllowingStateLoss();
+ } else {
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+ transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out);
+ transaction.replace(R.id.fragment_container, fragment).addToBackStack(null).commitAllowingStateLoss();
+ }
+
+ apiHelper.apiService.getChallenge(challengeId)
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(challenge -> challengeViewHolder.bind(challenge), throwable -> {
+ });
+
+ challengeViewHolder = new ChallengeViewHolder(findViewById(R.id.challenge_header));
+ }
+
+ @Override
+ protected void injectActivity(AppComponent component) {
+ component.inject(this);
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.java
index 596d5d9d7..0f4885b7c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.java
@@ -51,10 +51,13 @@ public class ChallengesListViewAdapter extends RecyclerView.Adapter {
-
-
public ChallengeHabitsRecyclerViewAdapter(String taskType, TagsHelper tagsHelper, int layoutResource, Context newContext, String userID, SortTasksCallback sortCallback) {
super(taskType, tagsHelper, layoutResource, newContext, userID, sortCallback);
}
@@ -172,7 +170,9 @@ public class ChallengeTaskRecyclerViewFragment extends BaseFragment {
@Override
public HabitViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new HabitViewHolder(getContentView(parent));
+ HabitViewHolder habitViewHolder = new HabitViewHolder(getContentView(parent));
+ habitViewHolder.setDisabled(true);
+ return habitViewHolder;
}
}
@@ -194,7 +194,9 @@ public class ChallengeTaskRecyclerViewFragment extends BaseFragment {
@Override
public DailyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new DailyViewHolder(getContentView(parent), dailyResetOffset);
+ DailyViewHolder dailyViewHolder = new DailyViewHolder(getContentView(parent), dailyResetOffset);
+ dailyViewHolder.setDisabled(true);
+ return dailyViewHolder;
}
}
@@ -212,7 +214,9 @@ public class ChallengeTaskRecyclerViewFragment extends BaseFragment {
@Override
public TodoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new TodoViewHolder(getContentView(parent));
+ TodoViewHolder todoViewHolder = new TodoViewHolder(getContentView(parent));
+ todoViewHolder.setDisabled(true);
+ return todoViewHolder;
}
}
@@ -229,7 +233,9 @@ public class ChallengeTaskRecyclerViewFragment extends BaseFragment {
@Override
public RewardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new RewardViewHolder(getContentView(parent));
+ RewardViewHolder rewardViewHolder = new RewardViewHolder(getContentView(parent));
+ rewardViewHolder.setDisabled(true);
+ return rewardViewHolder;
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java
index 243550fae..515888675 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java
@@ -86,13 +86,13 @@ public class ChallengeTasksFragment extends BaseMainFragment {
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
- return activity.getString(R.string.habits);
+ return getContext().getString(R.string.habits);
case 1:
- return activity.getString(R.string.dailies);
+ return getContext().getString(R.string.dailies);
case 2:
- return activity.getString(R.string.todos);
+ return getContext().getString(R.string.todos);
case 3:
- return activity.getString(R.string.rewards);
+ return getContext().getString(R.string.rewards);
}
return "";
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java
index 8e08824b5..4e4aee35d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java
@@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.social.challenges;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
@@ -11,6 +12,8 @@ import android.view.ViewGroup;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.events.commands.ShowChallengeTasksCommand;
+import com.habitrpg.android.habitica.ui.activities.ChallengeDetailActivity;
+import com.habitrpg.android.habitica.ui.activities.FullProfileActivity;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import org.greenrobot.eventbus.Subscribe;
@@ -88,9 +91,13 @@ public class ChallengesOverviewFragment extends BaseMainFragment {
@Subscribe
public void onEvent(ShowChallengeTasksCommand cmd){
- ChallengeTasksFragment fragment = new ChallengeTasksFragment();
- fragment.setChallengeId(cmd.challengeId);
- activity.displayFragment(fragment);
+ Bundle bundle = new Bundle();
+ bundle.putString(ChallengeDetailActivity.CHALLENGE_ID, cmd.challengeId);
+
+ Intent intent = new Intent(activity, ChallengeDetailActivity.class);
+ intent.putExtras(bundle);
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ startActivity(intent);
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java
index 07f5c87df..9a203311d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java
@@ -37,6 +37,8 @@ public class BaseTaskViewHolder extends RecyclerView.ViewHolder implements View.
@BindColor(R.color.task_gray)
int taskGray;
+ boolean disabled;
+
public BaseTaskViewHolder(View itemView) {
super(itemView);
@@ -92,7 +94,7 @@ public class BaseTaskViewHolder extends RecyclerView.ViewHolder implements View.
@Override
public void onClick(View v) {
- if (v != itemView) {
+ if (v != itemView || isDisabled()) {
return;
}
@@ -105,4 +107,14 @@ public class BaseTaskViewHolder extends RecyclerView.ViewHolder implements View.
public boolean canContainMarkdown() {
return true;
}
+
+ public boolean isDisabled() {
+ return disabled;
+ }
+
+ public void setDisabled(boolean disabled) {
+ this.disabled = disabled;
+
+ itemView.setEnabled(!disabled);
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java
index 00249d292..ad61bee2e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java
@@ -163,4 +163,11 @@ public abstract class ChecklistedViewHolder extends BaseTaskViewHolder implement
}
}
}
+
+ @Override
+ public void setDisabled(boolean disabled) {
+ super.setDisabled(disabled);
+
+ this.checkbox.setEnabled(!disabled);
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.java
index a52fe97ca..68ecb94f4 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.java
@@ -68,4 +68,12 @@ public class HabitViewHolder extends BaseTaskViewHolder {
event.habit = task;
EventBus.getDefault().post(event);
}
+
+ @Override
+ public void setDisabled(boolean disabled) {
+ super.setDisabled(disabled);
+
+ this.btnPlus.setEnabled(!disabled);
+ this.btnMinus.setEnabled(!disabled);
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java
index b53d54f28..ed38676f6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java
@@ -90,5 +90,11 @@ public class RewardViewHolder extends BaseTaskViewHolder {
}
}
+ @Override
+ public void setDisabled(boolean disabled) {
+ super.setDisabled(disabled);
+
+ this.rewardButton.setEnabled(!disabled);
+ }
}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
index b90a98064..13b9d9628 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
@@ -267,6 +267,9 @@ public interface ApiService {
@GET("tasks/challenge/{challengeId}")
Observable getChallengeTasks(@Path("challengeId") String challengeId);
+ @GET("challenges/{challengeId}")
+ Observable getChallenge(@Path("challengeId") String challengeId);
+
//DEBUG: These calls only work on a local development server
@POST("debug/add-ten-gems")