diff --git a/Habitica/res/layout/fragment_tavern_detail.xml b/Habitica/res/layout/fragment_tavern_detail.xml
index b1766563e..c09301471 100644
--- a/Habitica/res/layout/fragment_tavern_detail.xml
+++ b/Habitica/res/layout/fragment_tavern_detail.xml
@@ -2,47 +2,33 @@
+
-
-
-
-
-
-
+ android:background="@color/days_gray"
+ android:layout_marginTop="@dimen/spacing_large"
+ android:layout_marginBottom="@dimen/spacing_large"/>
+
+
+
+ android:layout_margin="@dimen/spacing_large"/>
-
-
\ No newline at end of file
diff --git a/Habitica/res/values/strings.constants.xml b/Habitica/res/values/strings.constants.xml
index f0165b571..d639e3592 100644
--- a/Habitica/res/values/strings.constants.xml
+++ b/Habitica/res/values/strings.constants.xml
@@ -25,5 +25,6 @@
Ian
Leslie
Time Travelers
+ Daniel
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 626e55374..e4b17aa50 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -346,7 +346,11 @@
Quest
Rare
World Quest
- Rest in the Inn to prevent your undone Dailies from hurting you overnight! (Note: does not prevent you from receiving Boss damage.)
+ Need a break? Check into Daniel’s Inn to pause some of Habitica’s more difficult game mechanics:\n\n
+• Missed Dailies won’t damage you\n
+• Tasks won’t lose streaks or decay in color\n
+• Bosses won’t do damage for your missed Dailies\n
+• Your boss damage or collection quest items will stay pending until check-out
You don\'t have any %s
Lvl %d
Lvl %1$d %2$s
@@ -719,4 +723,5 @@
You can only purchase gear for your current class
%d points
Toogle Emojis
+ Welcome to the Inn! Pull up a chair to chat, or take a break from your tasks.
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.java
deleted file mode 100644
index 4b0357b85..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.habitrpg.android.habitica.ui.fragments.social;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-
-import com.habitrpg.android.habitica.R;
-import com.habitrpg.android.habitica.components.AppComponent;
-import com.habitrpg.android.habitica.data.UserRepository;
-import com.habitrpg.android.habitica.helpers.RxErrorHandler;
-import com.habitrpg.android.habitica.models.user.User;
-import com.habitrpg.android.habitica.modules.AppModule;
-import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import butterknife.BindView;
-import butterknife.OnClick;
-
-public class TavernDetailFragment extends BaseFragment {
-
- @Inject
- UserRepository userRepository;
- @Inject
- @Named(AppModule.NAMED_USER_ID)
- String userId;
-
- @BindView(R.id.dailies_button)
- Button dailiesButton;
- private User user;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
- return inflater.inflate(R.layout.fragment_tavern_detail, container, false);
- }
-
- @Override
- public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- getCompositeSubscription().add(userRepository.getUser(userId).subscribe(user -> {
- this.user = user;
- this.updatePausedState();
- }, RxErrorHandler.handleEmptyError()));
- }
-
- private void updatePausedState() {
- if (dailiesButton == null) {
- return;
- }
- if (user.getPreferences().getSleep()) {
- dailiesButton.setText(R.string.tavern_inn_checkOut);
- } else {
- dailiesButton.setText(R.string.tavern_inn_rest);
- }
- }
-
- @Override
- public void injectFragment(AppComponent component) {
- component.inject(this);
- }
-
- @OnClick(R.id.dailies_button)
- public void dailiesButtonClicked() {
- userRepository.sleep(user).subscribe(user -> {}, RxErrorHandler.handleEmptyError());
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt
new file mode 100644
index 000000000..1d76df09a
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt
@@ -0,0 +1,120 @@
+package com.habitrpg.android.habitica.ui.fragments.social
+
+import android.graphics.Bitmap
+import android.graphics.Shader
+import android.graphics.drawable.BitmapDrawable
+import android.net.Uri
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.components.AppComponent
+import com.habitrpg.android.habitica.data.UserRepository
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.user.User
+import com.habitrpg.android.habitica.modules.AppModule
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment
+
+import javax.inject.Inject
+import javax.inject.Named
+
+import butterknife.OnClick
+import com.facebook.common.executors.CallerThreadExecutor
+import com.facebook.common.references.CloseableReference
+import com.facebook.datasource.DataSource
+import com.facebook.drawee.backends.pipeline.Fresco
+import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber
+import com.facebook.imagepipeline.image.CloseableImage
+import com.facebook.imagepipeline.request.ImageRequestBuilder
+import com.habitrpg.android.habitica.helpers.RemoteConfigManager
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
+import kotlinx.android.synthetic.main.shop_header.*
+import kotlinx.android.synthetic.main.fragment_tavern_detail.*
+import rx.Observable
+import rx.android.schedulers.AndroidSchedulers
+import rx.functions.Action1
+
+class TavernDetailFragment : BaseFragment() {
+
+ @Inject
+ lateinit var userRepository: UserRepository
+ @field:[Inject Named(AppModule.NAMED_USER_ID)]
+ lateinit var userId: String
+ @Inject
+ lateinit var configManager: RemoteConfigManager
+
+
+ private var user: User? = null
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View? {
+ super.onCreateView(inflater, container, savedInstanceState)
+ return inflater.inflate(R.layout.fragment_tavern_detail, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ compositeSubscription.add(userRepository.getUser(userId).subscribe(Action1 {
+ this.user = it
+ this.updatePausedState()
+ }, RxErrorHandler.handleEmptyError()))
+
+ descriptionView.setText(R.string.tavern_description)
+ namePlate.setText(R.string.tavern_owner)
+
+ DataBindingUtils.loadImage(sceneView, "tavern_scene" + configManager.shopSpriteSuffix())
+
+ backgroundView.scaleType = ImageView.ScaleType.FIT_START
+
+ val imageRequest = ImageRequestBuilder
+ .newBuilderWithSource(Uri.parse("https://habitica-assets.s3.amazonaws.com/mobileApp/images/tavern_background" + configManager.shopSpriteSuffix() + ".png"))
+ .build()
+
+ val imagePipeline = Fresco.getImagePipeline()
+ val dataSource = imagePipeline.fetchDecodedImage(imageRequest, this)
+
+ dataSource.subscribe(object : BaseBitmapDataSubscriber() {
+ override fun onFailureImpl(dataSource: DataSource>?) {
+ dataSource?.close()
+ }
+
+ public override fun onNewResultImpl(bitmap: Bitmap?) {
+ if (dataSource.isFinished && bitmap != null) {
+ val aspectRatio = bitmap.width / bitmap.height.toFloat()
+ val height = context?.resources?.getDimension(R.dimen.shop_height)?.toInt() ?: 0
+ val width = Math.round(height * aspectRatio)
+ val drawable = BitmapDrawable(context?.resources, Bitmap.createScaledBitmap(bitmap, width, height, false))
+ drawable.tileModeX = Shader.TileMode.REPEAT
+ Observable.just(drawable)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(Action1 { backgroundView.background = it }, RxErrorHandler.handleEmptyError())
+ dataSource.close()
+ }
+ }
+ }, CallerThreadExecutor.getInstance())
+ }
+
+ private fun updatePausedState() {
+ if (dailiesButton == null) {
+ return
+ }
+ if (user?.preferences?.sleep == true) {
+ dailiesButton .setText(R.string.tavern_inn_checkOut)
+ } else {
+ dailiesButton.setText(R.string.tavern_inn_rest)
+ }
+ }
+
+ override fun injectFragment(component: AppComponent) {
+ component.inject(this)
+ }
+
+ @OnClick(R.id.dailiesButton)
+ fun dailiesButtonClicked() {
+ user?.let { userRepository.sleep(it).subscribe(Action1 { }, RxErrorHandler.handleEmptyError()) }
+ }
+}