diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4632092038..d4dc355ab5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -604,6 +604,14 @@ android:name=".forum.search.ForumOrUserSearchActivity" android:screenOrientation="portrait" /> + + + + diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index ca42ec55d8..f507c902a6 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -115,6 +115,7 @@ class DefaultJsApi(var context: Context) { .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BiResponse() { override fun onSuccess(data: ResponseBody) { + EnergyTaskHelper.postEnergyTask("bind_wechat") handler.complete(true) } @@ -198,6 +199,7 @@ class DefaultJsApi(var context: Context) { @JavascriptInterface fun updateRegulationTestStatus(msg: Any) { if (msg.toString().toLowerCase(Locale.getDefault()) == "pass") { + EnergyTaskHelper.postEnergyTask("finish_etiquette_exam") SPUtils.setString(Constants.SP_REGULATION_TEST_PASS_STATUS, "pass") } } @@ -257,6 +259,11 @@ class DefaultJsApi(var context: Context) { runOnUiThread { DirectUtils.directToWebView(context, url.toString(), "内部网页") } } + @JavascriptInterface + fun postWearBadgeTask(msg: Any) { + EnergyTaskHelper.postEnergyTask("wear_badge") + } + @Keep internal data class ImageEvent(var imageList: ArrayList = arrayListOf(), var position: Int = 0) diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index 2ec0f8122c..cbe7ddffe8 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -179,6 +179,18 @@ public class Constants { public static final String LOGOUT_ADDRESS_DEV = "https://static-web.ghzs.com/ghzs_help_dev/help.html?content=5f6b1f02786564003944a693"; public static final String LOGOUT_ADDRESS = "https://static-web.ghzs.com/ghzs_help/help.html?content=5f534111b1f72909fc225672"; + // 商品详情 + public static final String COMMODITY_DETAIL_ADDRESS_DEV = "https://static-web.ghzs.com/shop-dev/index.html#/product"; + public static final String COMMODITY_DETAIL_ADDRESS = "https://static-web.ghzs.com/shop/index.html#/product"; + + // 光能记录 + public static final String ENERGY_RECORD_ADDRESS_DEV = "https://static-web.ghzs.com/shop-dev/index.html#/record"; + public static final String ENERGY_RECORD_ADDRESS = "https://static-web.ghzs.com/shop/index.html#/record"; + + // 订单中心 + public static final String ORDER_CENTER_ADDRESS_DEV = "https://static-web.ghzs.com/shop-dev/index.html#/orders"; + public static final String ORDER_CENTER_ADDRESS = "https://static-web.ghzs.com/shop/index.html#/orders"; + //最少需要多少数据才能上传 public static final int DATA_AMOUNT = 20; diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index 9a2a29a478..43fcfcb809 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -1945,6 +1945,52 @@ public class DialogUtils { return dialog; } + public static void showEnergyDialog(Context context, String userName, String energy) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); + + View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_energy, null); + ((TextView)contentView.findViewById(R.id.userName)).setText("\"" + userName + "\""); + ((TextView)contentView.findViewById(R.id.energy)).setText(energy + ""); + + contentView.findViewById(R.id.dialog_positive).setOnClickListener(v -> { + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + } + + public static void showEnergyTaskNoticeDialog(Context context, String title, String content) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); + + View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_notice, null); + TextView titleTv = contentView.findViewById(R.id.dialog_title); + TextView contentTv = contentView.findViewById(R.id.dialog_content); + TextView okTv = contentView.findViewById(R.id.dialog_ok); + + if (title == null) { + titleTv.setVisibility(View.GONE); + } else { + titleTv.setVisibility(View.VISIBLE); + titleTv.setText(title); + } + contentTv.setText(content); + + okTv.setTextColor(ContextCompat.getColor(context, R.color.theme_font)); + okTv.setOnClickListener(v -> { + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + } + /** * @param context may be is application context * @return activity context diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index a40ab8e7be..356e7d53b3 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -39,6 +39,8 @@ import com.gh.gamecenter.gamedetail.rating.RatingReplyActivity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mygame.PlayedGameActivity import com.gh.gamecenter.personalhome.UserHomeActivity +import com.gh.gamecenter.personalhome.background.PersonalityBackgroundActivity +import com.gh.gamecenter.personalhome.border.AvatarBorderActivity import com.gh.gamecenter.qa.CommunityFragment import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity import com.gh.gamecenter.qa.article.SimpleArticleListActivity @@ -48,10 +50,12 @@ import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity import com.gh.gamecenter.qa.subject.CommunitySubjectActivity import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.gamecenter.security.BindPhoneActivity import com.gh.gamecenter.servers.GameServersActivity import com.gh.gamecenter.subject.SubjectActivity import com.gh.gamecenter.suggest.SuggestType import com.gh.gamecenter.tag.TagsActivity +import com.gh.gamecenter.user.UserViewModel import com.gh.gamecenter.video.data.VideoDataActivity import com.gh.gamecenter.video.detail.VideoDetailActivity import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel @@ -249,6 +253,68 @@ object DirectUtils { "bbs_detail" -> directForumDetail(context, linkEntity.link ?: "", entrance) + "mobile_bind" -> { + CheckLoginUtils.checkLogin(context, entrance) { + context.startActivity(BindPhoneActivity.getNormalIntent(context, false)) + } + } + + "authentication" -> { + CheckLoginUtils.checkLogin(context, entrance) { + context.startActivity(UserInfoEditActivity.getIntent(context, UserViewModel.TYPE_ID_CARD)) + } + } + + "user_background" -> { + CheckLoginUtils.checkLogin(context, entrance) { + context.startActivity(PersonalityBackgroundActivity.getIntent(context)) + } + } + + "avatar_frame" -> { + CheckLoginUtils.checkLogin(context, entrance) { + context.startActivity(AvatarBorderActivity.getIntent(context)) + } + } + + "badge" -> { + CheckLoginUtils.checkLogin(context, entrance) { + UserManager.getInstance().userInfoEntity?.run { + directToBadgeWall(context, userId, name, icon) + } + } + } + + "etiquette_exam" -> directToRegulationTestPage(context) + + "setting" -> context.startActivity(SettingActivity.getIntent(context, false, entrance)) + + "index_page" -> directToMainActivity(context) + + "video_upload" -> context.startActivity(VideoManagerActivity.getIntent(context, "", entrance)) + + "bbs" -> directToForum(context) + + "user_page" -> directToHomeActivity(context, UserManager.getInstance().userId, "", entrance) + + "video_tab" -> directToVideoTab(context) + + "toolkit" -> context.startActivity(ToolBoxActivity.getIntent(context, entrance)) + + "toolkit_detail" -> { + linkEntity.toolkit?.run { + if (url != null && url!!.contains(Config.URL_ARTICLE)) { + val newsId = url!!.substring(url!!.lastIndexOf("/") + 1, url!!.length - 5) // 5: ".html" + val intent = NewsDetailActivity.getIntentById(context, newsId, entrance) + context.startActivity(intent) + } else { + context.startActivity(WebActivity.getWebByCollectionTools(context, this, false)) + } + } ?: "" + } + + "halo_tab" -> directToPersonalTab(context) + //"h5_game_center" -> directLetoGameCenter(context) "" -> { @@ -1049,6 +1115,46 @@ object DirectUtils { } } + /** + * 到首页视频 tab + */ + @JvmStatic + fun directToVideoTab(context: Context) { + if (RunningUtils.isRunning(context) + && MainActivity::class.java.name == RunningUtils.getBaseActivity(context)) { + val intent = Intent(context, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + context.startActivity(intent) + + // 这里换个线程操作是为了做一点延时 + AppExecutor.ioExecutor.execute { + EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_ASK)) + } + } else { + jumpActivity(context, Bundle().apply { putInt(KEY_POSITION, MainWrapperFragment.INDEX_VIDEO) }) + } + } + + /** + * 到我的光环 tab + */ + @JvmStatic + fun directToPersonalTab(context: Context) { + if (RunningUtils.isRunning(context) + && MainActivity::class.java.name == RunningUtils.getBaseActivity(context)) { + val intent = Intent(context, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + context.startActivity(intent) + + // 这里换个线程操作是为了做一点延时 + AppExecutor.ioExecutor.execute { + EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_ASK)) + } + } else { + jumpActivity(context, Bundle().apply { putInt(KEY_POSITION, MainWrapperFragment.INDEX_PERSONAL) }) + } + } + /** * 跳转至使用帮助与反馈 * @param position 使用帮助:[HelpAndFeedbackActivity.HELP_ITEM],意见反馈:[HelpAndFeedbackActivity.SUGGESTION_ITEM] @@ -1060,4 +1166,47 @@ object DirectUtils { bundle.putInt(BaseActivity_TabLayout.PAGE_INDEX, position) jumpActivity(context, bundle) } + + /** + * 跳转至商品详情 + */ + @JvmStatic + fun directToCommodityDetail(context: Context, commodityId: String) { + var url: String = if ("internal" == BuildConfig.FLAVOR) { + Constants.COMMODITY_DETAIL_ADDRESS_DEV + } else { + Constants.COMMODITY_DETAIL_ADDRESS + } + + url = String.format(Locale.CHINA, "%s?shopid=%s×tamp=%d", url, commodityId, (Date().time / 1000 / 1000.toFloat()).roundToInt()) + directToFullScreenWebPage(context, url, false) + } + + /** + * 跳转至光能记录 + */ + @JvmStatic + fun directToEnergyRecord(context: Context, position: Int) { + var url: String = if ("internal" == BuildConfig.FLAVOR) { + Constants.ENERGY_RECORD_ADDRESS_DEV + } else { + Constants.ENERGY_RECORD_ADDRESS + } + + url = String.format(Locale.CHINA, "%s?position=%s×tamp=%d", url, position, (Date().time / 1000 / 1000.toFloat()).roundToInt()) + directToFullScreenWebPage(context, url, false) + } + + /** + * 跳转至订单中心 + */ + @JvmStatic + fun directToOrderCenter(context: Context) { + var url: String = if ("internal" == BuildConfig.FLAVOR) { + Constants.ORDER_CENTER_ADDRESS_DEV + } else { + Constants.ORDER_CENTER_ADDRESS + } + directToFullScreenWebPage(context, url, false) + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 21b4d27a15..ef1d6ced62 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -655,6 +655,8 @@ public class DownloadItemUtils { } DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location); PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName()); + + EnergyTaskHelper.postEnergyTask("play_game", gameEntity.getId(), gameEntity.getApk().get(0).getPackageName()); } else if (str.equals(context.getString(R.string.update))) { if (entrance.contains("我的游戏")) { MtaHelper.onEvent("我的游戏_启动", "更新", gameEntity.getName()); @@ -688,6 +690,8 @@ public class DownloadItemUtils { downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style)); DeviceRemindDialog.Companion.showDeviceRemindDialog(context, gameEntity); + + EnergyTaskHelper.postEnergyTask("download_game", gameEntity.getId(), gameEntity.getApk().get(0).getPackageName()); } else { Utils.toast(context, msg); } diff --git a/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt b/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt new file mode 100644 index 0000000000..9fc52b0619 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt @@ -0,0 +1,115 @@ +package com.gh.common.util + +import android.annotation.SuppressLint +import android.content.Context +import android.view.Gravity +import android.view.View +import android.widget.LinearLayout +import android.widget.PopupWindow +import android.widget.TextView +import com.facebook.drawee.view.SimpleDraweeView +import com.gh.base.CurrentActivityHolder +import com.gh.gamecenter.R +import com.gh.gamecenter.entity.EnergyTaskCompleteEntity +import com.gh.gamecenter.guangneng.GuangnengCenterActivity +import com.gh.gamecenter.guangneng.GuangnengHouseActivity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.EmptyResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import com.lightgame.utils.AppManager +import com.lightgame.utils.Utils +import io.reactivex.schedulers.Schedulers +import okhttp3.MediaType +import okhttp3.RequestBody +import org.json.JSONObject + +/** + * 上报光能任务辅助类 + */ +object EnergyTaskHelper { + + @JvmStatic + fun postEnergyTask(action: String) { + postEnergyTask(action, null, null, null) + } + + @JvmStatic + fun postEnergyTask(action: String, id: String) { + postEnergyTask(action, id, null, null) + } + + @JvmStatic + fun postEnergyTask(action: String, id: String, packageName: String) { + postEnergyTask(action, id, packageName, null) + } + + @JvmStatic + fun postGnTaskForWeb(action: String, url: String) { + postEnergyTask(action, null, null, url) + } + + @SuppressLint("CheckResult") + @JvmStatic + fun postEnergyTask(action: String, id: String? = null, packageName: String? = null, url: String? = null) { + val jsonObject = JSONObject() + jsonObject.put("action", action) + + if (id != null) { + val actionParam = JSONObject() + actionParam.put("_id", id) + if (packageName != null) { + actionParam.put("package", packageName) + } + jsonObject.put("action_param", actionParam) + } + + if (url != null) { + val actionParam = JSONObject() + actionParam.put("url", url) + } + + debugOnly { Utils.log("GnTaskHelper -> $jsonObject") } + + val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) + RetrofitManager.getInstance(HaloApp.getInstance().application) + .api.postEnergyTask(body) + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + data.forEach { showPopup(it) } + } + }) + } + + // 完成弹窗 + @JvmStatic + fun showPopup(entity: EnergyTaskCompleteEntity) { + val currentActivity = AppManager.getInstance().recentActiveActivity + val contentView = View.inflate(currentActivity, R.layout.popup_energy_task, null) + val taskIcon = contentView.findViewById(R.id.taskIcon) + ImageUtils.display(taskIcon, entity.icon) + contentView.run { + findViewById(R.id.taskDesc).text = "恭喜你!完成任务:${entity.name}" + findViewById(R.id.taskEnergy).text = "+${entity.energy}光能" + isFocusable = true + isFocusableInTouchMode = true + setOnClickListener { + currentActivity.startActivity(GuangnengCenterActivity.getIntent(currentActivity)) + } + } + val popWindow = PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, + 110F.dip2px() - DisplayUtils.getStatusBarHeight(currentActivity.resources)) + popWindow.run { + isClippingEnabled = false + showAtLocation(currentActivity.window.decorView, Gravity.TOP, 0, 0) + } + + countDownTimer(3) { finish, _ -> + if (finish && popWindow != null && popWindow.isShowing) { + popWindow.dismiss() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index ee48a70945..2c7f140a6b 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -221,6 +221,7 @@ public class EntranceUtils { public static final String KEY_PRIMARY_CATALOG_NAME = "primaryCatalogName"; public static final String KEY_CATALOG_TITLE = "catalog_title"; public static final String KEY_CATALOG_INIT_TITLE = "catalog_init_title"; + public static final String KEY_CATEGORY_LIST = "categoty_list"; public static void jumpActivity(Context context, Bundle bundle) { bundle.putBoolean(KEY_REQUIRE_REDIRECT, true); diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index 0a02bd8645..bc5c046b60 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -678,6 +678,35 @@ public class ShareUtils { if (listener != null) { listener.onItemClick(holder.getAdapterPosition()); } + + switch (mShareEntrance) { + case game: + case plugin: + EnergyTaskHelper.postEnergyTask("share_game_detail", resourceId); + break; + case video: + EnergyTaskHelper.postEnergyTask("share_video", resourceId); + break; + case news: + EnergyTaskHelper.postEnergyTask("share_article", resourceId); + break; + case askNormal: + EnergyTaskHelper.postEnergyTask("share_question", resourceId); + break; + case answerNormal: + EnergyTaskHelper.postEnergyTask("share_answer", resourceId); + break; + case communityArticle: + EnergyTaskHelper.postEnergyTask("share_community_article", resourceId); + break; + case tools: + EnergyTaskHelper.postEnergyTask("share_toolkit", resourceId); + break; + case web: + EnergyTaskHelper.postGnTaskForWeb("share_web", shareUrl); + break; + } + switch (holder.getPosition()) { case 0: shareType = "wechat_friend"; diff --git a/app/src/main/java/com/gh/common/util/TimeUtils.kt b/app/src/main/java/com/gh/common/util/TimeUtils.kt index c1ab1cc6cb..8beef42d98 100644 --- a/app/src/main/java/com/gh/common/util/TimeUtils.kt +++ b/app/src/main/java/com/gh/common/util/TimeUtils.kt @@ -117,6 +117,17 @@ object TimeUtils { return calendar.timeInMillis } + @JvmStatic + fun getTimeOfToday(hour: Int): Long { + val calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")) + calendar.timeInMillis = getJavaTimestamp(System.currentTimeMillis()) + calendar.set(Calendar.HOUR_OF_DAY, hour) + calendar.set(Calendar.MINUTE, 0) + calendar.set(Calendar.SECOND, 0) + calendar.set(Calendar.MILLISECOND, 0) + return calendar.timeInMillis + } + @JvmStatic fun getJavaTimestamp(timestamp: Long): Long { return if ((log10(timestamp.toDouble()) + 1).toInt() == 10) { diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 4f2d0ebbb5..f1908eafeb 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -2,7 +2,6 @@ package com.gh.gamecenter; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -19,7 +18,6 @@ import android.util.Log; import android.view.KeyEvent; import androidx.annotation.NonNull; -import androidx.annotation.RestrictTo; import androidx.lifecycle.ViewModelProviders; import com.gh.base.AppUncaughtHandler; @@ -31,13 +29,10 @@ import com.gh.common.avoidcallback.AvoidOnResultManager; import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.exposure.meta.MetaUtil; -import com.gh.common.loghub.LoghubUtils; import com.gh.common.repository.ReservationRepository; import com.gh.common.simulator.SimulatorGameManager; import com.gh.common.util.ActivationHelper; import com.gh.common.util.ClassUtils; -import com.gh.common.util.ConcernUtils; -import com.gh.common.util.DataCollectionUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceTokenUtils; import com.gh.common.util.DeviceUtils; @@ -57,18 +52,14 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.PlatformUtils; import com.gh.common.util.SPUtils; import com.gh.common.util.ShareUtils; -import com.gh.common.util.ThirdPartyPackageHelper; import com.gh.common.util.ToastUtils; -import com.gh.common.util.UrlFilterUtils; import com.gh.download.DownloadManager; import com.gh.gamecenter.download.DownloadFragment; import com.gh.gamecenter.entity.CommunityEntity; -import com.gh.gamecenter.entity.GameDigestEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.InnerMetaInfoEntity; import com.gh.gamecenter.entity.NotificationUgc; import com.gh.gamecenter.eventbus.EBNetworkState; -import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.fragment.MainWrapperFragment; @@ -77,11 +68,9 @@ import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.UpdateManager; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.normal.NormalFragment; -import com.gh.gamecenter.packagehelper.PackageRepository; import com.gh.gamecenter.packagehelper.PackageViewModel; import com.gh.gamecenter.qa.CommunityFragment; import com.gh.gamecenter.retrofit.BiResponse; -import com.gh.gamecenter.retrofit.EmptyResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.suggest.SuggestSelectFragment; @@ -90,7 +79,6 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.halo.assistant.HaloApp; -import com.halo.assistant.fragment.SettingsFragment; import com.lightgame.download.DownloadEntity; import com.lightgame.download.DownloadStatus; import com.lightgame.download.FileUtils; @@ -101,7 +89,6 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.jetbrains.annotations.NotNull; -import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; @@ -111,7 +98,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enumeration; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; diff --git a/app/src/main/java/com/gh/gamecenter/amway/AmwayViewModel.kt b/app/src/main/java/com/gh/gamecenter/amway/AmwayViewModel.kt index 0d7cb0c743..d4b3fc1f0d 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/AmwayViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/AmwayViewModel.kt @@ -2,10 +2,7 @@ package com.gh.gamecenter.amway import android.annotation.SuppressLint import android.app.Application -import com.gh.common.util.EntranceUtils -import com.gh.common.util.ErrorHelper -import com.gh.common.util.LogUtils -import com.gh.common.util.ToastUtils +import com.gh.common.util.* import com.gh.download.DownloadManager import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.baselist.LoadStatus @@ -209,6 +206,8 @@ class AmwayViewModel(application: Application) : ListViewModel(context) { + + override fun getItemCount(): Int { + return if (mEntityList == null || mEntityList.isEmpty()) return 0 else mEntityList.size + 1 + } + + override fun getItemViewType(position: Int): Int { + if (position == itemCount - 1) { + return ItemViewType.ITEM_FOOTER + } + return ItemViewType.ITEM_BODY + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + ItemViewType.ITEM_BODY -> { + CommodityItemViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.commodity_item, parent, false)) + } + else -> { + FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is CommodityItemViewHolder -> { + holder.binding.run { + root.layoutParams = (root.layoutParams as ViewGroup.MarginLayoutParams).apply { + val top = if (position == 0 || position == 1) 8F.dip2px() else 0 + topMargin = top + } + + val commodity = mEntityList[position] + entity = commodity + executePendingBindings() + + commodity.tag?.run { + if (id.isNotBlank()) tagContainer.addView(getTagView(this)) + } + + originEnergy.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG + originEnergy.paint.isAntiAlias = true + + root.setOnClickListener { DirectUtils.directToCommodityDetail(mContext, commodity.id) } + } + } + + is FooterViewHolder -> holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint) + } + } + + private fun getTagView(tag: CommodityEntity.CommodityTagEntity): TextView { + return TextView(mContext).apply { + layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) + textSize = 10F + text = tag.name + setTextColor(Color.parseColor("#${tag.style.color}")) + setPadding(4F.dip2px(), 4F.dip2px(), 4F.dip2px(), 4F.dip2px()) + val drawable = GradientDrawable() + drawable.setColor(Color.parseColor("#${tag.style.background}")) + drawable.cornerRadius = DisplayUtils.dip2px(2F).toFloat() + background = drawable + } + } + + fun isLoadOver(): Boolean { + return mIsOver + } + + inner class CommodityItemViewHolder(val binding: CommodityItemBinding) : BaseRecyclerViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/CommodityListFragment.kt b/app/src/main/java/com/gh/gamecenter/guangneng/CommodityListFragment.kt new file mode 100644 index 0000000000..657137376e --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/CommodityListFragment.kt @@ -0,0 +1,120 @@ +package com.gh.gamecenter.guangneng + +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.GridLayoutManager +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.ListFragment +import com.gh.gamecenter.databinding.FragmentCommodityListBinding +import com.gh.gamecenter.entity.CommodityCategoryEntity +import com.gh.gamecenter.entity.CommodityEntity +import com.gh.gamecenter.entity.SubjectSettingEntity + +class CommodityListFragment : ListFragment() { + + private var mAdapter: CommodityListAdapter? = null + private lateinit var mBinding: FragmentCommodityListBinding + private var mCategoryList: ArrayList? = null + private var mCurrentIndex = 0 + + override fun getLayoutId() = 0 + + override fun getInflatedLayout() = FragmentCommodityListBinding.inflate(layoutInflater).apply { mBinding = this }.root + + override fun provideListViewModel(): CommodityListViewModel { + mEntrance = requireArguments().getString(EntranceUtils.KEY_ENTRANCE) ?: "" + val categoryId = requireArguments().getString(EntranceUtils.KEY_CATEGORY_ID) ?: "" + val factory = CommodityListViewModel.Factory(categoryId, mEntrance) + return viewModelProvider(factory) + } + + override fun provideListAdapter() = mAdapter + ?: CommodityListAdapter(requireContext()).apply { mAdapter = this } + + override fun getItemDecoration() = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val gridLayoutManager = GridLayoutManager(context, 2) + gridLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (position == mAdapter!!.itemCount - 1) { + 2 + } else { + 1 + } + } + } + mListRv.layoutManager = gridLayoutManager + mListRefresh?.layoutParams = (mListRefresh?.layoutParams as ViewGroup.MarginLayoutParams).apply { + leftMargin = 12F.dip2px() + rightMargin = 12F.dip2px() + } + + requireArguments().getParcelableArrayList(EntranceUtils.KEY_CATEGORY_LIST)?.run { + mCategoryList = this + mBinding.header.visibility = View.VISIBLE + mBinding.more.setOnClickListener { requireContext().startActivity(GuangnengHouseActivity.getIntent(requireContext())) } + this.forEachIndexed { index, entity -> + val item = layoutInflater.inflate(R.layout.item_filter_commodity_size, mBinding.categoryContainer, false) + mBinding.categoryContainer.addView(item) + val tv = item.findViewById(R.id.size_tv) + tv.text = entity.name + item.setOnClickListener { + if (index != mCurrentIndex) { + changeCategoryBg(index) + mListViewModel.categoryId = entity.id + onLoadRefresh() + mCurrentIndex = index + } + } + } + changeCategoryBg(0) + } + + mBinding.bottom.run { + if (mEntrance == "光能中心") { + visibility = View.VISIBLE + setOnClickListener { requireContext().startActivity(GuangnengHouseActivity.getIntent(requireContext())) } + } else { + visibility = View.GONE + } + } + } + + private fun changeCategoryBg(position: Int) { + mCategoryList?.forEachIndexed { index, _ -> + val item = mBinding.categoryContainer.getChildAt(index) + val tv = item.findViewById(R.id.size_tv) + if (position == index) { + tv.setTextColor(R.color.theme_font.toColor()) + tv.setBackgroundResource(R.drawable.button_round_e6f8fa) + } else { + tv.setTextColor(R.color.text_666666.toColor()) + tv.setBackgroundResource(R.drawable.button_round_f5f5f5) + } + } + } + + fun refreshPage(size: SubjectSettingEntity.Size) { + mListViewModel.sortSize = size + onRefresh() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mListRefresh?.isNestedScrollingEnabled = false + } + + override fun onLoadDone() { + super.onLoadDone() + mListRefresh?.isEnabled = false + } + + fun setNestedScrollingEnabled(enable: Boolean) { + mListRv.isNestedScrollingEnabled = enable + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/CommodityListViewModel.kt b/app/src/main/java/com/gh/gamecenter/guangneng/CommodityListViewModel.kt new file mode 100644 index 0000000000..69fff63803 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/CommodityListViewModel.kt @@ -0,0 +1,46 @@ +package com.gh.gamecenter.guangneng + +import android.app.Application +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.gh.common.util.UrlFilterUtils +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.CommodityEntity +import com.gh.gamecenter.entity.SubjectSettingEntity +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import io.reactivex.Single + +class CommodityListViewModel(application: Application, var categoryId: String, var entrance: String): ListViewModel(application) { + + var sortSize = SubjectSettingEntity.Size() + + override fun provideDataObservable(page: Int) = null + + override fun provideDataSingle(page: Int): Single> { + return RetrofitManager.getInstance(getApplication()).api.getCommodities(getFilter(), page) + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { + if (entrance == "光能中心" && it.size > 10) { + mResultLiveData.postValue(it.subList(0, 10)) + } else { + mResultLiveData.postValue(it) + } + } + } + + private fun getFilter(): String { + return UrlFilterUtils.getFilterQuery( + "category_id", categoryId, + "min_energy", sortSize.min.toString(), + "max_energy", sortSize.max.toString()) + } + + class Factory(private val categoryId: String, private val entrance: String) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return CommodityListViewModel(HaloApp.getInstance().application, categoryId, entrance) as T + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterActivity.kt b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterActivity.kt new file mode 100644 index 0000000000..ac5843ccc7 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterActivity.kt @@ -0,0 +1,22 @@ +package com.gh.gamecenter.guangneng + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.gh.common.util.DisplayUtils +import com.gh.gamecenter.NormalActivity + +class GuangnengCenterActivity : NormalActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + hideToolbar(true) + DisplayUtils.transparentStatusAndNavigation(this) + } + + companion object { + fun getIntent(context: Context?): Intent? { + return getTargetIntent(context, GuangnengCenterActivity::class.java, GuangnengCenterFragment::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterFragment.kt b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterFragment.kt new file mode 100644 index 0000000000..e951f79a5f --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterFragment.kt @@ -0,0 +1,259 @@ +package com.gh.gamecenter.guangneng + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.widget.CheckedTextView +import android.widget.ImageView +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import butterknife.OnClick +import com.gh.base.adapter.FragmentAdapter +import com.gh.base.fragment.BaseLazyFragment +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentGuangnengCenterBinding +import com.gh.gamecenter.entity.CommodityCategoryEntity +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.personalhome.UserHomeViewModel +import com.gh.gamecenter.user.UserViewModel +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.tabs.TabLayout +import com.halo.assistant.HaloApp + + +class GuangnengCenterFragment : BaseLazyFragment() { + + private lateinit var mBinding: FragmentGuangnengCenterBinding + private lateinit var mUserViewModel: UserViewModel + private lateinit var mUserHomeViewModel: UserHomeViewModel + private lateinit var mGnCenterViewModel: GuangnengCenterViewModel + private val mTitleList = listOf("赚光能", "兑换区") + private var mFragmentsList = ArrayList() + private var mCategoryList = ArrayList() + + override fun getLayoutId() = 0 + + override fun getInflatedLayout() = FragmentGuangnengCenterBinding.inflate(layoutInflater).apply { mBinding = this }.root + + override fun onFragmentResume() { + super.onFragmentResume() + + // 6:00-18:59 展示白天背景,否则展示夜晚背景 + if (System.currentTimeMillis() >= TimeUtils.getTimeOfToday(6) + && System.currentTimeMillis() < TimeUtils.getTimeOfToday(19) ) { + mBinding.background.setImageResource(R.drawable.bg_gncenter_day) + } else { + mBinding.background.setImageResource(R.drawable.bg_gncenter_night) + } + + if (NetworkUtils.isNetworkConnected(requireContext())) { + if (CheckLoginUtils.isLogin()) { + mUserHomeViewModel.getUserEnergy() + if (mFragmentsList.isNotEmpty()) { + (mFragmentsList[0] as TaskFragment).onLoadRefresh() + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + mGnCenterViewModel = viewModelProvider() + mUserViewModel = viewModelProvider(UserViewModel.Factory(HaloApp.getInstance().application)) + mUserHomeViewModel = viewModelProvider(UserHomeViewModel.Factory(HaloApp.getInstance().application, UserManager.getInstance().userId)) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mGnCenterViewModel.categories.observe(viewLifecycleOwner, Observer { + mCategoryList.clear() + mCategoryList.addAll(it) + initViewpager() + }) + + mUserViewModel.loginObsUserinfo.observe(viewLifecycleOwner, Observer { + if (it != null && it.data != null) { + mUserHomeViewModel.userId = UserManager.getInstance().userId + mUserHomeViewModel.getUserEnergy() + if (mFragmentsList.isNotEmpty()) { + (mFragmentsList[0] as TaskFragment).onLoadRefresh() + } + } + }) + + mUserHomeViewModel.energy.observe(viewLifecycleOwner, Observer { + mBinding.userEnergy.text = "${it}光能" + }) + + mBinding.run { + val screenHeight = resources.displayMetrics.heightPixels + val behavior = BottomSheetBehavior.from(bottomSheet) + val toolbarHeight = screenHeight - DisplayUtils.getStatusBarHeight(resources) - 48F.dip2px() + behavior.peekHeight = screenHeight - 312F.dip2px() + behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_HIDDEN) { + behavior.state = BottomSheetBehavior.STATE_COLLAPSED + } + + if (bottomSheet.height > toolbarHeight) { + val layoutParams = bottomSheet.layoutParams + layoutParams.height = toolbarHeight + bottomSheet.layoutParams = layoutParams + } + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) { + } + }) + } + } + + private fun initViewpager() { + mBinding.run { + mFragmentsList.clear() + val tag = "android:switcher:${viewpager.id}:" + val taskFragment = childFragmentManager.findFragmentByTag("${tag}0") ?: TaskFragment() + val commodityListFragment = childFragmentManager.findFragmentByTag("${tag}1") + ?: CommodityListFragment().apply { + val bundle = Bundle() + bundle.putString(EntranceUtils.KEY_ENTRANCE, "光能中心") + if (mCategoryList.isNotEmpty()) { + bundle.putString(EntranceUtils.KEY_CATEGORY_ID, mCategoryList[0].id) + bundle.putParcelableArrayList(EntranceUtils.KEY_CATEGORY_LIST, + if (mCategoryList.size > 2) ArrayList(mCategoryList.subList(0, 2)) else mCategoryList) + } + arguments = bundle + } + mFragmentsList.add(taskFragment) + mFragmentsList.add(commodityListFragment) + + viewpager.offscreenPageLimit = mFragmentsList.size + viewpager.adapter = FragmentAdapter(childFragmentManager, mFragmentsList, mTitleList) + tabLayout.setupWithViewPager(viewpager) + + for (i in 0 until tabLayout.tabCount) { + val tab = tabLayout.getTabAt(i) ?: continue + val tabTitle = if (tab.text != null) tab.text.toString() else "" + val tabView = getTabView(tabTitle) + tab.customView = tabView + } + + tabLayout.getTabAt(0)?.let { updateTabStyle(it, true) } + tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabReselected(tab: TabLayout.Tab?) { + updateTabStyle(tab, true) + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + updateTabStyle(tab, false) + } + + override fun onTabSelected(tab: TabLayout.Tab?) { + updateTabStyle(tab, true) + } + }) + + // 处理BottomSheetBehavior的ViewPager嵌套RecyclerView滑动冲突问题 + viewpager.addOnPageChangeListener { + (mFragmentsList[0] as TaskFragment).setNestedScrollingEnabled(it == 0) + (mFragmentsList[1] as CommodityListFragment).setNestedScrollingEnabled(it == 1) + bottomSheet.requestLayout() + } + } + } + + private fun getTabView(title: String): View { + val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item_gn_house, null) + val tabTitle = view.findViewById(R.id.tab_title) + if (tabTitle is CheckedTextView) { + tabTitle.text = title + } + return view + } + + private fun updateTabStyle(tab: TabLayout.Tab?, isChecked: Boolean) { + val tabView = tab?.customView + tabView?.run { + val tabIndicator = findViewById(R.id.tab_indicator) + tabIndicator.visibility = if (isChecked) View.VISIBLE else View.INVISIBLE + } + } + + @OnClick(R.id.backIv, R.id.gnRecord, R.id.lotteryCenter, R.id.signSwitch, R.id.signBubble, + R.id.oneDay, R.id.twoDay, R.id.threeDay, R.id.fourDay, R.id.fiveDay, R.id.sixDay, R.id.sevenDay) + fun onViewClicked(v: View) { + when (v.id) { + R.id.backIv -> requireActivity().finish() + + R.id.gnRecord -> { + ifLogin("光能中心-光能记录") { + DirectUtils.directToEnergyRecord(requireContext(), 0) + } + } + + R.id.lotteryCenter -> { + ifLogin("光能中心-抽奖中心") { + // 抽奖中心 + } + } + + R.id.signSwitch -> { + ifLogin("光能中心-签到提醒") { + // 签到提醒 + } + } + + R.id.signBubble -> { + ifLogin("光能中心-签到气泡") { + // 签到气泡 + } + } + + R.id.oneDay -> { + ifLogin("光能中心-1天") { + // 1天 + } + } + + R.id.twoDay -> { + ifLogin("光能中心-2天") { + // 2天 + } + } + + R.id.threeDay -> { + ifLogin("光能中心-3天") { + // 3天 + } + } + + R.id.fourDay -> { + ifLogin("光能中心-4天") { + // 4天 + } + } + + R.id.fiveDay -> { + ifLogin("光能中心-5天") { + // 5天 + } + } + + R.id.sixDay -> { + ifLogin("光能中心-6天") { + // 6天 + } + } + + R.id.sevenDay -> { + ifLogin("光能中心-7天") { + // 7天 + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterViewModel.kt b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterViewModel.kt new file mode 100644 index 0000000000..d3850572e6 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengCenterViewModel.kt @@ -0,0 +1,39 @@ +package com.gh.gamecenter.guangneng + +import android.annotation.SuppressLint +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData +import com.gh.gamecenter.entity.CommodityCategoryEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class GuangnengCenterViewModel(application: Application) : AndroidViewModel(application) { + + private val api = RetrofitManager.getInstance(getApplication()).api + var categories = MutableLiveData>() + + + init { + getCommodityCategories() + } + + @SuppressLint("CheckResult") + fun getCommodityCategories() { + api.commodityCategories + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + categories.postValue(data) + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + categories.postValue(null) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseActivity.kt b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseActivity.kt new file mode 100644 index 0000000000..c0b70d1996 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseActivity.kt @@ -0,0 +1,22 @@ +package com.gh.gamecenter.guangneng + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.gh.common.util.DisplayUtils +import com.gh.gamecenter.NormalActivity + +class GuangnengHouseActivity : NormalActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + hideToolbar(true) + DisplayUtils.transparentStatusAndNavigation(this) + } + + companion object { + fun getIntent(context: Context?): Intent? { + return getTargetIntent(context, GuangnengHouseActivity::class.java, GuangnengHouseFragment::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseFragment.kt b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseFragment.kt new file mode 100644 index 0000000000..abb7490c92 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseFragment.kt @@ -0,0 +1,291 @@ +package com.gh.gamecenter.guangneng + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.widget.CheckedTextView +import android.widget.ImageView +import android.widget.TextView +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import butterknife.OnClick +import com.gh.base.adapter.FragmentAdapter +import com.gh.base.fragment.BaseLazyFragment +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentGuangnengHouseBinding +import com.gh.gamecenter.entity.CommodityCategoryEntity +import com.gh.gamecenter.entity.SubjectSettingEntity +import com.gh.gamecenter.entity.TaskEntity +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.personalhome.UserHomeViewModel +import com.gh.gamecenter.user.UserViewModel +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.tabs.TabLayout +import com.halo.assistant.HaloApp +import kotlin.math.abs + +class GuangnengHouseFragment: BaseLazyFragment() { + + private lateinit var mBinding: FragmentGuangnengHouseBinding + private lateinit var mUserViewModel: UserViewModel + private lateinit var mUserHomeViewModel: UserHomeViewModel + private lateinit var mGnHouseViewModel: GuangnengHouseViewModel + private lateinit var mCommodityCategories: List + private val mTitleList = ArrayList() + private val mFragments = ArrayList() + private val mTasks = ArrayList() + private val mRollUserNames = ArrayList() + private val mRollCommodityNames = ArrayList() + private var currentSizeIndex = 0 + + override fun getLayoutId() = 0 + + override fun getInflatedLayout() = FragmentGuangnengHouseBinding.inflate(layoutInflater).apply { mBinding = this }.root + + override fun onFragmentResume() { + super.onFragmentResume() + + if (NetworkUtils.isNetworkConnected(requireContext())) { + if (CheckLoginUtils.isLogin()) { + mUserHomeViewModel.getUserEnergy() + mGnHouseViewModel.getNoviceTasks() + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + mGnHouseViewModel = viewModelProvider() + mUserViewModel = viewModelProvider(UserViewModel.Factory(HaloApp.getInstance().application)) + mUserHomeViewModel = viewModelProvider(UserHomeViewModel.Factory(HaloApp.getInstance().application, UserManager.getInstance().userId)) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mUserViewModel.loginObsUserinfo.observe(viewLifecycleOwner, Observer { + if (it != null && it.data != null) { + mBinding.run { + val userInfo = it.data + userIcon.display(userInfo.iconBorder?.url, userInfo.icon ?: "") + userName.text = userInfo.name + } + mUserHomeViewModel.userId = UserManager.getInstance().userId + mUserHomeViewModel.getUserEnergy() + } else { + mBinding.run { + userIcon.display("", "") + userName.text = "请先登录" + } + } + }) + + mUserHomeViewModel.energy.observe(viewLifecycleOwner, Observer { + mBinding.userEnergy.text = "${it}光能" + }) + + mGnHouseViewModel.rollNotices.observe(viewLifecycleOwner, Observer { list -> + if (list.isEmpty()) return@Observer + mRollUserNames.clear() + mRollCommodityNames.clear() + list.forEach { + mRollUserNames.add(it.user.name) + mRollCommodityNames.add(it.commodity.name) + } + initRollNotice() + }) + + mGnHouseViewModel.noviceTasks.observe(viewLifecycleOwner, Observer { + mTasks.clear() + mTasks.addAll(it) + mGnHouseViewModel.getDailyTasks() + }) + + mGnHouseViewModel.dailyTasks.observe(viewLifecycleOwner, Observer { + mTasks.addAll(it) + initTaskView() + }) + + mGnHouseViewModel.commodityCategories.observe(viewLifecycleOwner, Observer { + if (it.isEmpty()) return@Observer + mCommodityCategories = it + initViewPager() + }) + + mBinding.run { + appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + if (abs(verticalOffset) >= appBarLayout.totalScrollRange / 2) { + toolbar.setBackgroundColor(R.color.white.toColor()) + backIv.setImageResource(R.drawable.ic_back_gamedetail) + title.setTextColor(R.color.text_333333.toColor()) + gnRuleTv.setTextColor(R.color.text_333333.toColor()) + gnRuleIv.setImageResource(R.drawable.icon_doubt_black) + tabLayout.setBackgroundColor(R.color.white.toColor()) + sizeContainer.setBackgroundColor(R.color.white.toColor()) + DisplayUtils.setStatusBarColor(requireActivity(), R.color.white, true) + } else { + toolbar.setBackgroundColor(R.color.transparent.toColor()) + backIv.setImageResource(R.drawable.ic_toolbar_back_white) + title.setTextColor(R.color.white.toColor()) + gnRuleTv.setTextColor(R.color.white.toColor()) + gnRuleIv.setImageResource(R.drawable.icon_doubt_white) + tabLayout.setBackgroundColor(R.color.transparent.toColor()) + sizeContainer.setBackgroundColor(R.color.transparent.toColor()) + DisplayUtils.setStatusBarColor(requireActivity(), R.color.transparent, true) + } + }) + } + } + + private fun initRollNotice() { + mBinding.run { + rollNotice.visibility = View.VISIBLE + userNameMarquee.startWithList(mRollUserNames) + commodityNameMarquee.startWithList(mRollCommodityNames) + } + } + + private fun initTaskView() { + mBinding.run { + if (mTasks.isEmpty()) { + GnTaskTitle.visibility = View.GONE + GnTaskContainer.visibility = View.GONE + } else { + GnTaskTitle.visibility = View.VISIBLE + GnTaskContainer.visibility = View.VISIBLE + GnTaskMore.setOnClickListener { requireContext().startActivity(GuangnengCenterActivity.getIntent(requireContext())) } + GnTaskContainer.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.HORIZONTAL, false) + GnTaskContainer.adapter = HorizontalGnTaskAdapter(requireContext(), "光能屋", mTasks) + } + } + } + + private fun initViewPager() { + mBinding.run { + mTitleList.clear() + mFragments.clear() + val tag = "android:switcher:${viewpager.id}:" + mCommodityCategories.forEachIndexed { index, entity -> + mTitleList.add(entity.name) + val commodityListFragment = childFragmentManager.findFragmentByTag("$tag$index") + ?: CommodityListFragment().with(bundleOf( + EntranceUtils.KEY_ENTRANCE to "光能屋", + EntranceUtils.KEY_CATEGORY_ID to entity.id)) + mFragments.add(commodityListFragment) + } + + viewpager.offscreenPageLimit = mFragments.size + viewpager.adapter = FragmentAdapter(childFragmentManager, mFragments, mTitleList) + tabLayout.setupWithViewPager(viewpager) + + for (i in 0 until tabLayout.tabCount) { + val tab = tabLayout.getTabAt(i) ?: continue + val tabTitle = if (tab.text != null) tab.text.toString() else "" + val tabView = getTabView(tabTitle) + tab.customView = tabView + } + + tabLayout.getTabAt(0)?.let { updateTabStyle(it, true) } + tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabReselected(tab: TabLayout.Tab?) { + updateTabStyle(tab, true) + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + updateTabStyle(tab, false) + } + + override fun onTabSelected(tab: TabLayout.Tab?) { + updateTabStyle(tab, true) + } + }) + } + + initSize() + } + + + private fun getTabView(title: String): View { + val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item_gn_house, null) + val tabTitle = view.findViewById(R.id.tab_title) + if (tabTitle is CheckedTextView) { + tabTitle.text = title + } + return view + } + + private fun updateTabStyle(tab: TabLayout.Tab?, isChecked: Boolean) { + val tabView = tab?.customView + tabView?.run { + val tabIndicator = findViewById(R.id.tab_indicator) + tabIndicator.visibility = if (isChecked) View.VISIBLE else View.INVISIBLE + } + } + + private fun getDefaultSizeFilterArray(): ArrayList { + return arrayListOf().apply { + add(SubjectSettingEntity.Size(min = -1, max = -1, text = "全部")) + add(SubjectSettingEntity.Size(min = 1, max = 100, text = "1-100")) + add(SubjectSettingEntity.Size(min = 101, max = 500, text = "101-500")) + add(SubjectSettingEntity.Size(min = 501, max = 2000, text = "501-2000")) + add(SubjectSettingEntity.Size(min = 2000, max = -1, text = "2000以上")) + } + } + + + private fun initSize() { + getDefaultSizeFilterArray().forEachIndexed { index, size -> + val item = layoutInflater.inflate(R.layout.item_filter_commodity_size, mBinding.sizeContainer, false) + mBinding.sizeContainer.addView(item) + val tv = item.findViewById(R.id.size_tv) + tv.text = size.text + item.setOnClickListener { + if (currentSizeIndex != index) { + changeSizeBg(index) + (mFragments[mBinding.viewpager.currentItem] as CommodityListFragment).refreshPage(size) + currentSizeIndex = index + } + } + } + changeSizeBg(0) + } + + private fun changeSizeBg(position: Int) { + getDefaultSizeFilterArray().forEachIndexed { index, _ -> + val item = mBinding.sizeContainer.getChildAt(index) + val tv = item.findViewById(R.id.size_tv) + if (position == index) { + tv.setTextColor(R.color.theme_font.toColor()) + tv.setBackgroundResource(R.drawable.button_round_e6f8fa) + } else { + tv.setTextColor(R.color.text_666666.toColor()) + tv.setBackgroundResource(R.drawable.button_round_f5f5f5) + } + } + } + + + @OnClick(R.id.backIv, R.id.gnRecord, R.id.gnOrder) + fun onViewClicked(v: View) { + when (v.id) { + R.id.backIv -> requireActivity().finish() + + R.id.gnRecord -> { + ifLogin("光能屋-光能记录") { + DirectUtils.directToEnergyRecord(requireContext(), 1) + } + } + + R.id.gnOrder -> { + ifLogin("光能屋-订单中心") { + DirectUtils.directToOrderCenter(requireContext()) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseViewModel.kt b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseViewModel.kt new file mode 100644 index 0000000000..f42d45447f --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/GuangnengHouseViewModel.kt @@ -0,0 +1,78 @@ +package com.gh.gamecenter.guangneng + +import android.annotation.SuppressLint +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData +import com.gh.gamecenter.entity.CommodityCategoryEntity +import com.gh.gamecenter.entity.RollNoticeEntity +import com.gh.gamecenter.entity.TaskEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class GuangnengHouseViewModel(application: Application) + : AndroidViewModel(application) { + + private val api = RetrofitManager.getInstance(getApplication()).api + var commodityCategories = MutableLiveData>() + var noviceTasks = MutableLiveData>() + var dailyTasks = MutableLiveData>() + var rollNotices = MutableLiveData>() + + + init { + getRollNotices() + getNoviceTasks() + getCommodityCategories() + } + + @SuppressLint("CheckResult") + fun getRollNotices() { + api.rollNotices + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + rollNotices.postValue(data) + } + }) + } + + @SuppressLint("CheckResult") + fun getNoviceTasks() { + api.noviceTasks + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + noviceTasks.postValue(data) + } + }) + } + + @SuppressLint("CheckResult") + fun getDailyTasks() { + api.getDailyTasks(1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + dailyTasks.postValue(data) + } + }) + } + + @SuppressLint("CheckResult") + fun getCommodityCategories() { + api.commodityCategories + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + commodityCategories.postValue(data) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/HorizontalGnTaskAdapter.kt b/app/src/main/java/com/gh/gamecenter/guangneng/HorizontalGnTaskAdapter.kt new file mode 100644 index 0000000000..fd36864272 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/HorizontalGnTaskAdapter.kt @@ -0,0 +1,64 @@ +package com.gh.gamecenter.guangneng + +import android.content.Context +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.NoviceTaskItemBinding +import com.gh.gamecenter.entity.TaskEntity +import com.lightgame.adapter.BaseRecyclerAdapter + +class HorizontalGnTaskAdapter(context: Context, + private val entrance: String, + private var mList: List) + : BaseRecyclerAdapter(context) { + + + override fun getItemCount() = mList.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) + = GnTaskViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.novice_task_item, parent, false)) + + + override fun onBindViewHolder(holder: GnTaskViewHolder, position: Int) { + holder.binding.run { + root.layoutParams = (root.layoutParams as ViewGroup.MarginLayoutParams).apply { + leftMargin = if (position == 0) 16F.dip2px() else 0 + } + + val task = mList[position] + entity = task + executePendingBindings() + + if (task.status == "finished") { + taskBtn.text = "已完成" + taskBtn.setTextColor(R.color.text_cccccc.toColor()) + taskBtn.setBackgroundResource(R.drawable.button_round_f5f5f5) + } else { + taskBtn.text = "去完成" + taskBtn.setTextColor(R.color.theme_font.toColor()) + taskBtn.setBackgroundResource(R.drawable.button_round_ebfdff) + } + + taskNotice.setOnClickListener { + DialogUtils.showEnergyTaskNoticeDialog(mContext, task.name, task.descr) + } + + root.setOnClickListener { + CheckLoginUtils.checkLogin(mContext, entrance) { + when (task.status) { + "normal" -> DirectUtils.directToLinkPage(mContext, task.link, entrance, "") + + "limiting" -> ToastUtils.toast(R.string.limiting_tip.toResString()) + +// "finished" -> {} + } + } + } + } + } + + class GnTaskViewHolder(val binding: NoviceTaskItemBinding) : BaseRecyclerViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/TaskAdapter.kt b/app/src/main/java/com/gh/gamecenter/guangneng/TaskAdapter.kt new file mode 100644 index 0000000000..c7a1330ac3 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/TaskAdapter.kt @@ -0,0 +1,156 @@ +package com.gh.gamecenter.guangneng + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.constant.ItemViewType +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.* + +class TaskAdapter(context: Context) : ListAdapter(context) { + + private val mEntrance = "光能屋-任务列表" + + override fun getItemCount(): Int { + return if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT + } + + override fun getItemViewType(position: Int): Int { + return if (position == itemCount - 1) { + ItemViewType.ITEM_FOOTER + } else { + val item = mEntityList[position] + when { + item.noviceTasks != null -> TYPE_NOVICE + + item.title != null -> TYPE_TITLE + + else -> TYPE_NORMAL + } + } + } + + override fun areItemsTheSame(oldItem: TaskItemData?, newItem: TaskItemData?): Boolean { + return when { + oldItem?.noviceTasks != null && newItem?.noviceTasks != null -> { + oldItem.noviceTasks?.size == newItem.noviceTasks?.size + } + + oldItem?.title != null && newItem?.title != null -> true + + oldItem?.dailyTask != null && newItem?.dailyTask != null -> { + oldItem.dailyTask?.id == newItem.dailyTask?.id + } + + else -> super.areItemsTheSame(oldItem, newItem) + } + } + + override fun areContentsTheSame(oldItem: TaskItemData?, newItem: TaskItemData?): Boolean { + return when { + oldItem?.noviceTasks != null && newItem?.noviceTasks != null -> { + oldItem.noviceTasks?.size == newItem.noviceTasks?.size + } + + oldItem?.title != null && newItem?.title != null -> true + + oldItem?.dailyTask != null && newItem?.dailyTask != null -> { + oldItem.dailyTask?.id == newItem.dailyTask?.id + } + + else -> super.areContentsTheSame(oldItem, newItem) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view: View + return when (viewType) { + ItemViewType.ITEM_FOOTER -> { + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } + + TYPE_NOVICE -> NoviceTasksViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.novice_tasks_item, parent, false)) + + TYPE_TITLE -> TaskTitleViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.task_title_item, parent, false)) + + else -> DailyTaskViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.daily_task_item, parent, false)) + } + } + + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is NoviceTasksViewHolder -> { + val list = mEntityList[position].noviceTasks!! + holder.binding.taskContainer.run { + layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + adapter = HorizontalGnTaskAdapter(context, "光能中心", list) + } + } + + is TaskTitleViewHolder -> { + holder.binding.run { + val titleStr = mEntityList[position].title!! + var top = if (titleStr == "新手任务") 16F.dip2px() else 32F.dip2px() + var bottom = if (titleStr == "新手任务") 16F.dip2px() else 5F.dip2px() + root.layoutParams = (root.layoutParams as ViewGroup.MarginLayoutParams).apply { + topMargin = top + bottomMargin = bottom + } + title.text = titleStr + } + } + + is DailyTaskViewHolder -> { + val task = mEntityList[position].dailyTask!! + holder.binding.run { + entity = task + executePendingBindings() + + taskNotice.setOnClickListener { + DialogUtils.showEnergyTaskNoticeDialog(mContext, task.name, task.descr) + } + + root.setOnClickListener { + CheckLoginUtils.checkLogin(mContext, mEntrance) { + when (task.status) { + "normal" -> DirectUtils.directToLinkPage(mContext, task.link, mEntrance, "") + + "limiting" -> { + DirectUtils.directToLinkPage(mContext, task.link, mEntrance, "") + } + +// "finished" -> {} + } + } + } + } + } + + is FooterViewHolder -> { + holder.initItemPadding() + holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint) + } + } + } + + inner class NoviceTasksViewHolder(val binding: NoviceTasksItemBinding): BaseRecyclerViewHolder(binding.root) + inner class TaskTitleViewHolder(val binding: TaskTitleItemBinding): BaseRecyclerViewHolder(binding.root) + inner class DailyTaskViewHolder(val binding: DailyTaskItemBinding): BaseRecyclerViewHolder(binding.root) + + companion object { + private const val TYPE_NOVICE = 900 + + private const val TYPE_TITLE = 901 + + private const val TYPE_NORMAL = 902 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/TaskFragment.kt b/app/src/main/java/com/gh/gamecenter/guangneng/TaskFragment.kt new file mode 100644 index 0000000000..445649be18 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/TaskFragment.kt @@ -0,0 +1,31 @@ +package com.gh.gamecenter.guangneng + +import android.os.Bundle +import com.gh.common.util.viewModelProvider +import com.gh.gamecenter.baselist.ListFragment + +class TaskFragment: ListFragment() { + + private var mAdapter: TaskAdapter? = null + + override fun provideListAdapter()= mAdapter + ?: TaskAdapter(requireContext()).apply { mAdapter = this } + + override fun provideListViewModel(): TaskViewModel = viewModelProvider() + + override fun getItemDecoration() = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mListRefresh?.isNestedScrollingEnabled = false + } + + override fun onLoadDone() { + super.onLoadDone() + mListRefresh?.isEnabled = false + } + + fun setNestedScrollingEnabled(enable: Boolean) { + mListRv.isNestedScrollingEnabled = enable + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/TaskItemData.kt b/app/src/main/java/com/gh/gamecenter/guangneng/TaskItemData.kt new file mode 100644 index 0000000000..d328edf859 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/TaskItemData.kt @@ -0,0 +1,7 @@ +package com.gh.gamecenter.guangneng + +import com.gh.gamecenter.entity.TaskEntity + +data class TaskItemData(var noviceTasks: List? = null, + var title: String? = null, + var dailyTask: TaskEntity? = null) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/guangneng/TaskViewModel.kt b/app/src/main/java/com/gh/gamecenter/guangneng/TaskViewModel.kt new file mode 100644 index 0000000000..a458a315e4 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/guangneng/TaskViewModel.kt @@ -0,0 +1,49 @@ +package com.gh.gamecenter.guangneng + +import android.app.Application +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.TaskEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class TaskViewModel(application: Application) + : ListViewModel(application) { + + private val mApi = RetrofitManager.getInstance(getApplication()).api + + override fun provideDataObservable(page: Int) = null + + override fun provideDataSingle(page: Int): Single> { + return mApi.getDailyTasks(page) + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { list -> + + val itemDataList = arrayListOf() + + mApi.noviceTasks + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + if (data.isNotEmpty()) { + itemDataList.add(TaskItemData(title = "新手任务")) + itemDataList.add(TaskItemData(noviceTasks = data)) + } + + itemDataList.add(TaskItemData(title = "日常任务")) + + list.forEach { + itemDataList.add(TaskItemData(dailyTask = it)) + } + + mResultLiveData.postValue(itemDataList) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt index f468d95f63..adee92cbb1 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt @@ -251,6 +251,7 @@ open class PlayedGameAdapter(context: Context, } fun resetListData() { + if (!hasHeader()) EnergyTaskHelper.postEnergyTask("open_game_time") setListData(mEntityList) } diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index 95a72872be..b3dcada82b 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -42,7 +42,7 @@ import com.gh.common.util.StringUtils; import com.gh.common.util.TimeUtils; import com.gh.common.util.ToastUtils; import com.gh.common.view.AvatarBorderView; -import com.gh.common.view.VerticalItemDecoration; +import com.gh.common.view.SpacingItemDecoration; import com.gh.gamecenter.GameDetailActivity; import com.gh.gamecenter.MainActivity; import com.gh.gamecenter.MessageActivity; @@ -64,6 +64,8 @@ import com.gh.gamecenter.eventbus.EBNetworkState; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.fragment.MainWrapperFragment; +import com.gh.gamecenter.guangneng.GuangnengCenterActivity; +import com.gh.gamecenter.guangneng.GuangnengHouseActivity; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.message.MessageUnreadRepository; import com.gh.gamecenter.message.MessageUnreadViewModel; @@ -144,10 +146,8 @@ public class PersonalFragment extends BaseLazyFragment { RecyclerView mFuncRecyclerView; @BindView(R.id.personal_new_fans_tips) View personalNewFansTips; - @BindView(R.id.personal_background) - SimpleDraweeView mPersonalBackground; - @BindView(R.id.personal_background_shadow) - View mPersonalBackgroundShadow; + @BindView(R.id.personal_guangneng_tv) + TextView mPersonalEnergy; public final static String LOGIN_TAG = "login_tag"; //登入标识 public final static String LOGOUT_TAG = "logout_tag"; // 登出标识 @@ -227,7 +227,7 @@ public class PersonalFragment extends BaseLazyFragment { mPersonalFuncGroupAdapter = new PersonalFunctionGroupAdapter(requireContext()); mFuncRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); mFuncRecyclerView.setAdapter(mPersonalFuncGroupAdapter); - mFuncRecyclerView.addItemDecoration(new VerticalItemDecoration(requireContext(), 8f, false)); + mFuncRecyclerView.addItemDecoration(new SpacingItemDecoration(true, false, false, false, 0, DisplayUtils.dip2px(32F), 0, 0)); int statusBarHeight = Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ? 0 : DisplayUtils.getStatusBarHeight(getResources()); ViewGroup.LayoutParams params = toolbar.getLayoutParams(); @@ -375,6 +375,10 @@ public class PersonalFragment extends BaseLazyFragment { } }); + mUserHomeViewModel.getEnergy().observe(this, energy -> { + mPersonalEnergy.setText(energy + ""); + }); + mPersonalViewModel.getHaloAddData().observe(this, datas -> { if (!datas.isEmpty()) { mPersonalFuncGroupAdapter.setListData(datas); @@ -428,6 +432,9 @@ public class PersonalFragment extends BaseLazyFragment { mUnreadViewModel.retry(); mUserHomeViewModel.getBadgeList(); mUserHomeViewModel.availableBadges(); + if (CheckLoginUtils.isLogin()) { + mUserHomeViewModel.getUserEnergy(); + } } int currentItem = ((MainWrapperFragment) getParentFragment()).getCurrentItem(); if (currentItem == INDEX_PERSONAL) { @@ -497,7 +504,8 @@ public class PersonalFragment extends BaseLazyFragment { } @OnClick({R.id.toolbar, R.id.collapsingToolbar, R.id.iv_arrow, R.id.personal_info, R.id.personal_login, R.id.personal_user_small_icon, R.id.personal_user_icon, R.id.personal_msg, - R.id.personal_user_name_small, R.id.personal_user_name, R.id.personal_badge, R.id.personal_home}) + R.id.personal_user_name_small, R.id.personal_user_name, R.id.personal_badge, R.id.personal_home, + R.id.personal_guangneng, R.id.personal_guangneng_center, R.id.personal_guangneng_house, R.id.personal_guangneng_record}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.collapsingToolbar: @@ -558,6 +566,30 @@ public class PersonalFragment extends BaseLazyFragment { MtaHelper.onEvent("我的光环_新", "徽章中心", "进入徽章中心"); DirectUtils.directToBadgeWall(requireContext(), mUserInfoEntity.getUserId(), mUserInfoEntity.getName(), mUserInfoEntity.getIcon()); break; + case R.id.personal_guangneng: + if (mUserInfoEntity != null) { + MtaHelper.onEvent("我的光环_新", "光能值", "点击光能值"); + DialogUtils.showEnergyDialog(requireContext(), mUserInfoEntity.getName(), mPersonalEnergy.getText().toString()); + } else { + CheckLoginUtils.checkLogin(getContext(), "我的光环-光能值", null); + } + break; + case R.id.personal_guangneng_center: + MtaHelper.onEvent("我的光环_新", "光能中心", "进入光能中心"); + requireContext().startActivity(GuangnengCenterActivity.Companion.getIntent(requireContext())); + break; + case R.id.personal_guangneng_house: + MtaHelper.onEvent("我的光环_新", "光能屋", "进入光能屋"); + requireContext().startActivity(GuangnengHouseActivity.Companion.getIntent(requireContext())); + break; + case R.id.personal_guangneng_record: + if (mUserInfoEntity != null) { + MtaHelper.onEvent("我的光环_新", "光能记录", "进入光能记录"); + DirectUtils.directToEnergyRecord(requireContext(), 0); + } else { + CheckLoginUtils.checkLogin(getContext(), "我的光环-光能记录", null); + } + break; default: break; } @@ -706,15 +738,6 @@ public class PersonalFragment extends BaseLazyFragment { private void changeLoginState(boolean isLogin) { if (isLogin) { - // 设置背景 - if (mUserInfoEntity.getBackground() != null) { - ImageUtils.display(mPersonalBackground, mUserInfoEntity.getBackground().getUrl()); - // 自定义背景才需要加阴影 - if (TextUtils.isEmpty(mUserInfoEntity.getBackground().getId())) { - mPersonalBackgroundShadow.setVisibility(View.VISIBLE); - } - } - SignEntity signEntity = mDatabase.signDao().getSignEntityById(UserManager.getInstance().getUserId()); if (signEntity != null && !isCanSign(signEntity.getLastTime())) { mPersonalSign.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.personal_sign_icon_yellow)); @@ -735,10 +758,10 @@ public class PersonalFragment extends BaseLazyFragment { mUserHomeViewModel.setUserId(UserManager.getInstance().getUserId()); mUserHomeViewModel.getBadgeList(); mUserHomeViewModel.availableBadges(); + mUserHomeViewModel.getUserEnergy(); MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(true); } else { - ImageUtils.display(mPersonalBackground, R.drawable.personal_top_bg); - mPersonalBackgroundShadow.setVisibility(View.GONE); + mPersonalEnergy.setText("--"); mUserIcon.display("", "", ""); mUserIconSmall.setImageURI(""); mPersonalBadgeTv.setText("我的徽章"); diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt index bb1ab34251..27ee7cd957 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt @@ -10,9 +10,11 @@ import androidx.lifecycle.ViewModelProvider import com.gh.gamecenter.R import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.EBUserFollow +import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.google.gson.JsonObject import com.halo.assistant.HaloApp import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers @@ -30,6 +32,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV var availableBadge = MutableLiveData() var availableBadgeCount = MutableLiveData() var playGamesCount = MutableLiveData() + var energy = MutableLiveData() fun getUserInfo() { RetrofitManager.getInstance(getApplication()) @@ -152,6 +155,19 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV }) } + @SuppressLint("CheckResult") + fun getUserEnergy() { + RetrofitManager.getInstance(getApplication()) + .api.getUserEnergies(UserManager.getInstance().userId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: JsonObject) { + energy.postValue(data["energy"].asInt) + } + }) + } + class Factory(private val mApplication: Application, private val mUserId: String) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt index a26a9e5a46..eebe5cd7a2 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt @@ -58,6 +58,8 @@ class BackgroundPreviewFragment : NormalFragment() { mUserViewModel.uploadBackground.observeNonNull(this) { mPostDialog?.dismiss() if (it) { + EnergyTaskHelper.postEnergyTask("update_user_background") + requireActivity().setResult(Activity.RESULT_OK) requireActivity().finish() mUserViewModel.uploadBackground.value = false diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt index 4fb048114e..f32a3241f5 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt @@ -62,6 +62,7 @@ class AvatarBorderFragment : BaseFragment_TabLayout() { mUserViewModel.uploadAvatarBorder.observe(this, Observer { mPostDialog?.dismiss() if (it) { + EnergyTaskHelper.postEnergyTask("wear_avatar_frame") requireActivity().finish() mUserViewModel.uploadAvatarBorder.value = false } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt index 6330a512a2..a0cb2843cd 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt @@ -4,6 +4,7 @@ import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.common.util.ErrorHelper +import com.gh.common.util.EnergyTaskHelper import com.gh.common.util.toObject import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.entity.ErrorEntity @@ -39,6 +40,8 @@ class ExcellentCommentsViewModel(application: Application, var userId: String) override fun onResponse(response: ResponseBody?) { Utils.toast(getApplication(), "点赞成功") callback.invoke() + + EnergyTaskHelper.postEnergyTask("vote_game_comment", commentId) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt index 5070eb62f7..cd49dcfffd 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt @@ -3,10 +3,7 @@ package com.gh.gamecenter.personalhome.home import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.gh.common.util.ErrorHelper -import com.gh.common.util.ToastUtils -import com.gh.common.util.UrlFilterUtils -import com.gh.common.util.toObject +import com.gh.common.util.* import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.entity.ErrorEntity @@ -89,6 +86,8 @@ class UserCommentHistoryViewModel(application: Application, var userId: String) override fun onResponse(response: ResponseBody?) { Utils.toast(getApplication(), "点赞成功") callback.invoke() + + EnergyTaskHelper.postEnergyTask("vote_game_comment", commentId) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt index e6ef2febb0..243d951da1 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt @@ -3,10 +3,7 @@ package com.gh.gamecenter.personalhome.home import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.gh.common.util.ErrorHelper -import com.gh.common.util.ToastUtils -import com.gh.common.util.UrlFilterUtils -import com.gh.common.util.toObject +import com.gh.common.util.* import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.entity.ErrorEntity @@ -50,6 +47,8 @@ class UserHistoryViewModel(application: Application, var userId: String, private override fun onResponse(response: ResponseBody?) { Utils.toast(getApplication(), "点赞成功") callback.invoke() + + EnergyTaskHelper.postEnergyTask("vote_game_comment", commentId) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt index a779c43226..3e0dd4b006 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt @@ -180,8 +180,10 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH override fun onResponse(response: VoteEntity?) { if (entity.type == "community_article") { entity.me.isCommunityArticleVote = true + EnergyTaskHelper.postEnergyTask("vote_community_article", entity.id) } else { entity.me.isAnswerVoted = true + EnergyTaskHelper.postEnergyTask("vote_answer", entity.id) } Utils.toast(itemView.context, "已赞同") } @@ -287,6 +289,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH override fun onResponse(response: VoteEntity?) { entity.me.isCommunityArticleVote = true Utils.toast(itemView.context, "已赞同") + EnergyTaskHelper.postEnergyTask("vote_community_article", entity.id) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailViewModel.kt index 617611cf52..5b3db39e39 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailViewModel.kt @@ -92,6 +92,8 @@ class AnswerDetailViewModel(application: Application) : AndroidViewModel(applica mVoteLiveData.postValue(apiResponse) syncVoteData(answerId) + + EnergyTaskHelper.postEnergyTask("vote_answer", answerId) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt index 18076a0ea4..26b3bea91b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt @@ -168,7 +168,7 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { toast("发布成功") var answerId: String? = null tryWithDefaultCatch { - answerId = JSONObject(it.data?.string()).getString("_id") + answerId = JSONObject(it.data).getString("_id") } if (answerId == null) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt index 66613c6b82..8444ca5df3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt @@ -11,9 +11,7 @@ import com.gh.base.fragment.WaitingDialogFragment import com.gh.common.syncpage.SyncDataEntity import com.gh.common.syncpage.SyncFieldConstants import com.gh.common.syncpage.SyncPageRepository -import com.gh.common.util.ImageUtils -import com.gh.common.util.UploadImageUtils -import com.gh.common.util.UrlFilterUtils +import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager @@ -52,7 +50,7 @@ class AnswerEditViewModel(application: Application, var cacheAnswerContent: String? = null val processDialog = MediatorLiveData() - val postLiveData = MediatorLiveData>() + val postLiveData = MediatorLiveData>() val postImageLiveData = MediatorLiveData>>() val deleteDraftLiveDate = MediatorLiveData() val draftsLiveData = MediatorLiveData() @@ -88,11 +86,16 @@ class AnswerEditViewModel(application: Application, .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false)) - postLiveData.postValue(Resource.success(response)) + val data = response?.string() + postLiveData.postValue(Resource.success(data)) EventBus.getDefault().post(EBReuse(AnswerEditActivity.ANSWER_DRAFT_CHANGE_TAG)) if (TextUtils.isEmpty(answerId)) { syncAnswerCount() + + tryWithDefaultCatch { + EnergyTaskHelper.postEnergyTask("post_answer", JSONObject(data).optString("_id")) + } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt index 6fef6ffd5b..84de303951 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt @@ -9,6 +9,7 @@ import com.gh.common.syncpage.SyncFieldConstants import com.gh.common.syncpage.SyncPageRepository import com.gh.common.util.CollectionUtils import com.gh.common.util.ErrorHelper +import com.gh.common.util.EnergyTaskHelper import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommentEntity import com.gh.gamecenter.entity.VoteEntity @@ -111,6 +112,8 @@ class ArticleDetailViewModel(application: Application, like.postValue(response) syncVoteData() + + EnergyTaskHelper.postEnergyTask("vote_community_article", articleId) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt index c76adef3cd..4b4886e796 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt @@ -270,12 +270,19 @@ class ArticleEditViewModel(application: Application) : AndroidViewModel(applicat } processDialog.postValue(WaitingDialogFragment.WaitingDialogData("上传中...", false)) MtaHelper.onEvent("发表文章", "发布成功", UserManager.getInstance().community.name) - postArticle.postValue(response?.string()) + val data = response?.string() + postArticle.postValue(data) EventBus.getDefault().post(EBReuse(ArticleEditActivity.ARTICLE_POSTED_TAG)) if (draftEntity?.id != null) { EventBus.getDefault().post(EBReuse(ArticleEditActivity.ARTICLE_DRAFT_CHANGE_TAG)) } + + if (detailEntity == null) { + tryWithDefaultCatch { + EnergyTaskHelper.postEnergyTask("publish_community_article", JSONObject(data).optString("_id")) + } + } } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt index 6ab5d191ce..fdf8965f3b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.gh.common.syncpage.SyncDataEntity import com.gh.common.syncpage.SyncFieldConstants import com.gh.common.syncpage.SyncPageRepository -import com.gh.common.util.CommentDraftContainer -import com.gh.common.util.createRequestBody -import com.gh.common.util.tryCatchInRelease +import com.gh.common.util.* import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.entity.CommentDraft import com.gh.gamecenter.entity.CommentEntity @@ -121,6 +119,18 @@ open class NewCommentViewModel(application: Application, SyncFieldConstants.ARTICLE_COMMENT_REPLY_COUNT, commentEntity.reply + 1)) } + + if (commentType == CommentType.COMMUNITY_ARTICLE && commentEntity == null) { + tryWithDefaultCatch { + EnergyTaskHelper.postEnergyTask("comment_community_article", JSONObject(response?.string()).optString("_id")) + } + } + + if (commentType == CommentType.VIDEO && commentEntity == null) { + tryWithDefaultCatch { + EnergyTaskHelper.postEnergyTask("comment_video", JSONObject(response?.string()).optString("_id")) + } + } } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt index 69aaf2acc3..df2c58e014 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt @@ -373,9 +373,16 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica override fun onResponse(response: ResponseBody?) { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false)) MtaHelper.onEvent("发表问题", "提交成功", communityEntity?.name) - postLiveData.postValue(Resource.success(response?.string())) + val data = response?.string() + postLiveData.postValue(Resource.success(data)) EventBus.getDefault().post(EBReuse(QuestionEditActivity.QUESTION_POSTED_TAG)) if (questionEntity == null && !isFromSearch) cleanCurrentCommunityDraft() + + if (questionEntity == null) { + tryWithDefaultCatch { + EnergyTaskHelper.postEnergyTask("post_question", JSONObject(data).optString("_id")) + } + } } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 63b9ad57e9..78389ff90b 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -15,8 +15,10 @@ import com.gh.gamecenter.entity.CatalogEntity; import com.gh.gamecenter.entity.CategoryEntity; import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.CommentnumEntity; +import com.gh.gamecenter.entity.CommodityEntity; import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.DeviceDialogEntity; +import com.gh.gamecenter.entity.EnergyTaskCompleteEntity; import com.gh.gamecenter.entity.FollowersOrFansEntity; import com.gh.gamecenter.entity.ForumCategoryEntity; import com.gh.gamecenter.entity.ForumDetailEntity; @@ -55,9 +57,11 @@ import com.gh.gamecenter.entity.PrivacyPolicyEntity; import com.gh.gamecenter.entity.Rating; import com.gh.gamecenter.entity.RatingComment; import com.gh.gamecenter.entity.RatingReplyEntity; +import com.gh.gamecenter.entity.RollNoticeEntity; import com.gh.gamecenter.entity.ServerCalendarEntity; import com.gh.gamecenter.entity.ServersGameCategory; import com.gh.gamecenter.entity.SettingsEntity; +import com.gh.gamecenter.entity.CommodityCategoryEntity; import com.gh.gamecenter.entity.SignEntity; import com.gh.gamecenter.entity.SimpleGameEntity; import com.gh.gamecenter.entity.SimulatorEntity; @@ -67,6 +71,7 @@ import com.gh.gamecenter.entity.SubjectRecommendEntity; import com.gh.gamecenter.entity.SubjectRefreshEntity; import com.gh.gamecenter.entity.SubjectSettingEntity; import com.gh.gamecenter.entity.TagEntity; +import com.gh.gamecenter.entity.TaskEntity; import com.gh.gamecenter.entity.TimeEntity; import com.gh.gamecenter.entity.ToolBoxEntity; import com.gh.gamecenter.entity.UnifiedUserTrendEntity; @@ -2785,4 +2790,46 @@ public interface ApiService { */ @GET("catalogs/{catalog_id}/special") Single> getSpecialCatalogs(@Path("catalog_id") String catalogId, @Query("page") int page); + + /** + * 上报光能任务 + */ + @POST("devices/{device_id}/download_simulator_games") + Single> postEnergyTask(@Body RequestBody body); + + /** + * 获取商品分类列表 + */ + @GET("shop/commodities/categories") + Single> getCommodityCategories(); + + /** + * 获取商品列表 + */ + @GET("shop/commodities") + Single> getCommodities(@Query("filter") String filter, @Query("page") int page); + + /** + * 获取新手任务列表 + */ + @GET("novice_tasks") + Single> getNoviceTasks(); + + /** + * 获取日常任务列表 + */ + @GET("daily_tasks") + Single> getDailyTasks(@Query("page") int page); + + /** + * 获取用户剩余光能 + */ + @GET("users/{user_id}/energies") + Single getUserEnergies(@Path("user_id") String userId); + + /** + * 获取光能屋滚动通知 + */ + @GET("shop/orders/roll_notices") + Single> getRollNotices(); } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt b/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt index ffaf58198b..7533878b40 100644 --- a/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt @@ -109,6 +109,9 @@ class BindPhoneFragment : NormalFragment() { mViewModel.finishLiveData.observe(viewLifecycleOwner, Observer { isSuccess -> if (isSuccess) { + // 上报光能任务 + EnergyTaskHelper.postEnergyTask("bind_mobile") + // 更新本地用户已绑定手机的信息 val phoneNum: String = mBindPhoneEt.text.toString().trim { it <= ' ' }.replace(" ".toRegex(), "") UserManager.getInstance().userInfoEntity = UserManager.getInstance().userInfoEntity?.apply { diff --git a/app/src/main/java/com/gh/gamecenter/user/UserRepository.java b/app/src/main/java/com/gh/gamecenter/user/UserRepository.java index 3cdb44b36b..9acdde992c 100644 --- a/app/src/main/java/com/gh/gamecenter/user/UserRepository.java +++ b/app/src/main/java/com/gh/gamecenter/user/UserRepository.java @@ -16,6 +16,7 @@ import com.gh.common.repository.ReservationRepository; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceUtils; import com.gh.common.util.GameSubstituteRepositoryHelper; +import com.gh.common.util.EnergyTaskHelper; import com.gh.common.util.GsonUtils; import com.gh.common.util.LoginHelper; import com.gh.common.util.LoginUtils; @@ -229,6 +230,12 @@ public class UserRepository { PushManager.getAndSetAlias(); GameSubstituteRepositoryHelper.updateSubstitutableGames(); + + if (response.isFirstLogin()) { + EnergyTaskHelper.postEnergyTask("register"); + } else { + EnergyTaskHelper.postEnergyTask("login"); + } } @Override @@ -337,6 +344,7 @@ public class UserRepository { mCacheUserInfoEntity.setIcon(content); break; case UserViewModel.TYPE_ID_CARD: + EnergyTaskHelper.postEnergyTask("authentication"); mCacheUserInfoEntity.setIdCard(GsonUtils.fromJson(content, IdCardEntity.class)); break; case UserViewModel.TYPE_INTRODUCE: diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt index 16ef0ad21b..817710427a 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt @@ -8,10 +8,7 @@ import androidx.recyclerview.widget.RecyclerView import com.gh.common.exposure.meta.MetaUtil import com.gh.common.history.HistoryDatabase import com.gh.common.runOnIoThread -import com.gh.common.util.UrlFilterUtils -import com.gh.common.util.createRequestBodyAny -import com.gh.common.util.tryCatchInRelease -import com.gh.common.util.tryWithDefaultCatch +import com.gh.common.util.* import com.gh.download.DownloadManager import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.MyVideoEntity @@ -366,6 +363,7 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel .subscribe(object : BiResponse() { override fun onSuccess(data: ResponseBody) { //Utils.toast(getApplication(), "已点赞") + EnergyTaskHelper.postEnergyTask("vote_video", videoDetail.id) } override fun onFailure(exception: Exception) { diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoViewModel.kt index c4655946a3..b67c018faa 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoViewModel.kt @@ -66,6 +66,8 @@ class UploadVideoViewModel(application: Application) : AndroidViewModel(applicat val url = jsonObject.getString("url") val length = jsonObject.getLong("length") postLiveData.postValue(Resource.success(MyVideoEntity(id = videoId, poster = poster, url = url, length = length, status = "pending"))) + + EnergyTaskHelper.postEnergyTask("upload_video", videoId) } } diff --git a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java index ee6b471fbd..6b804e170e 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java @@ -28,6 +28,7 @@ import com.gh.common.history.HistoryHelper; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.EntranceUtils; +import com.gh.common.util.EnergyTaskHelper; import com.gh.common.util.LoginUtils; import com.gh.common.util.MtaHelper; import com.gh.common.util.NotificationHelper; @@ -136,6 +137,7 @@ public class SettingsFragment extends NormalFragment { super.onActivityResult(requestCode, resultCode, data); if (requestCode == UsageStatsHelper.USAGE_STATUS_REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { mSettingUsageStatsSb.setChecked(UsageStatsHelper.checkForPermission()); + if (UsageStatsHelper.checkForPermission()) EnergyTaskHelper.postEnergyTask("open_game_time"); } // 当前登录方式为手机号登录,更换手机号后,回到该界面更新"退出账号"的手机号 diff --git a/app/src/main/res/color/text_tabbar_gh_house_style.xml b/app/src/main/res/color/text_tabbar_gh_house_style.xml new file mode 100644 index 0000000000..e85d3084ad --- /dev/null +++ b/app/src/main/res/color/text_tabbar_gh_house_style.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/bg_energy_dialog.png b/app/src/main/res/drawable-xxhdpi/bg_energy_dialog.png new file mode 100755 index 0000000000..ccd36234b1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_energy_dialog.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_gn_house.png b/app/src/main/res/drawable-xxhdpi/bg_gn_house.png new file mode 100755 index 0000000000..90021a3041 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_gn_house.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_gncenter_card.png b/app/src/main/res/drawable-xxhdpi/bg_gncenter_card.png new file mode 100755 index 0000000000..26030d8993 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_gncenter_card.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_gncenter_day.png b/app/src/main/res/drawable-xxhdpi/bg_gncenter_day.png new file mode 100755 index 0000000000..2dc04712c5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_gncenter_day.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_gncenter_night.png b/app/src/main/res/drawable-xxhdpi/bg_gncenter_night.png new file mode 100755 index 0000000000..48d1a4a115 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_gncenter_night.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_personal_info.png b/app/src/main/res/drawable-xxhdpi/bg_personal_info.png new file mode 100755 index 0000000000..b896308c2e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_personal_info.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_popup_energy_task.png b/app/src/main/res/drawable-xxhdpi/bg_popup_energy_task.png new file mode 100755 index 0000000000..f5163233c8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_popup_energy_task.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_commodity_selected.png b/app/src/main/res/drawable-xxhdpi/ic_commodity_selected.png new file mode 100755 index 0000000000..6696c245e2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_commodity_selected.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_gift.png b/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_gift.png new file mode 100755 index 0000000000..b2c6fa1008 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_gift.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_normal.png b/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_normal.png new file mode 100755 index 0000000000..fd4fd4efa3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_normal.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_signed.png b/app/src/main/res/drawable-xxhdpi/ic_energy_center_signed.png new file mode 100755 index 0000000000..08273df0b2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_energy_center_signed.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_house_notice.png b/app/src/main/res/drawable-xxhdpi/ic_energy_house_notice.png new file mode 100755 index 0000000000..df5e510c58 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_energy_house_notice.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gn_center_lottery.png b/app/src/main/res/drawable-xxhdpi/ic_gn_center_lottery.png new file mode 100755 index 0000000000..7132420ec2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gn_center_lottery.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gn_center_record.png b/app/src/main/res/drawable-xxhdpi/ic_gn_center_record.png new file mode 100755 index 0000000000..479181c75c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gn_center_record.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gn_center_top_gn.png b/app/src/main/res/drawable-xxhdpi/ic_gn_center_top_gn.png new file mode 100755 index 0000000000..f8fa764896 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gn_center_top_gn.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gn_order_center.png b/app/src/main/res/drawable-xxhdpi/ic_gn_order_center.png new file mode 100755 index 0000000000..5484100969 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gn_order_center.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gncenter_done.png b/app/src/main/res/drawable-xxhdpi/ic_gncenter_done.png new file mode 100755 index 0000000000..dc2a265763 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gncenter_done.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gncenter_more.png b/app/src/main/res/drawable-xxhdpi/ic_gncenter_more.png new file mode 100755 index 0000000000..af9dd1a530 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gncenter_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gncenter_notice.png b/app/src/main/res/drawable-xxhdpi/ic_gncenter_notice.png new file mode 100755 index 0000000000..13a1ceaf61 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gncenter_notice.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gncenter_sign.png b/app/src/main/res/drawable-xxhdpi/ic_gncenter_sign.png new file mode 100755 index 0000000000..f91ab9341c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gncenter_sign.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gncenter_switch_on.png b/app/src/main/res/drawable-xxhdpi/ic_gncenter_switch_on.png new file mode 100755 index 0000000000..a38c1ca5cd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gncenter_switch_on.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gncenter_verify.png b/app/src/main/res/drawable-xxhdpi/ic_gncenter_verify.png new file mode 100755 index 0000000000..c08eebb488 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gncenter_verify.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_gnhouse_gn.png b/app/src/main/res/drawable-xxhdpi/ic_gnhouse_gn.png new file mode 100755 index 0000000000..703a8147b6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_gnhouse_gn.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_guangneng.png b/app/src/main/res/drawable-xxhdpi/ic_guangneng.png new file mode 100755 index 0000000000..9877d6bc10 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_guangneng.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_guangneng_center.png b/app/src/main/res/drawable-xxhdpi/ic_guangneng_center.png new file mode 100755 index 0000000000..00ae9dfb61 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_guangneng_center.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_guangneng_house.png b/app/src/main/res/drawable-xxhdpi/ic_guangneng_house.png new file mode 100755 index 0000000000..c8526b00d1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_guangneng_house.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_guangneng_record.png b/app/src/main/res/drawable-xxhdpi/ic_guangneng_record.png new file mode 100755 index 0000000000..17c5e207e4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_guangneng_record.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_popup_energy_task_more.png b/app/src/main/res/drawable-xxhdpi/ic_popup_energy_task_more.png new file mode 100755 index 0000000000..4cf0affc93 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_popup_energy_task_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_doubt_black.png b/app/src/main/res/drawable-xxhdpi/icon_doubt_black.png new file mode 100755 index 0000000000..681a022723 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_doubt_black.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_doubt_white.png b/app/src/main/res/drawable-xxhdpi/icon_doubt_white.png new file mode 100755 index 0000000000..fe5c881cc8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_doubt_white.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_dialog.png b/app/src/main/res/drawable-xxxhdpi/bg_energy_dialog.png new file mode 100755 index 0000000000..2e4cb569e4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_energy_dialog.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_gn_house.png b/app/src/main/res/drawable-xxxhdpi/bg_gn_house.png new file mode 100755 index 0000000000..6751739409 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_gn_house.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_gncenter_card.png b/app/src/main/res/drawable-xxxhdpi/bg_gncenter_card.png new file mode 100755 index 0000000000..c73976de20 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_gncenter_card.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_gncenter_day.png b/app/src/main/res/drawable-xxxhdpi/bg_gncenter_day.png new file mode 100755 index 0000000000..d19557d9f3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_gncenter_day.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_gncenter_night.png b/app/src/main/res/drawable-xxxhdpi/bg_gncenter_night.png new file mode 100755 index 0000000000..23ba0cff48 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_gncenter_night.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_personal_info.png b/app/src/main/res/drawable-xxxhdpi/bg_personal_info.png new file mode 100755 index 0000000000..3a1fcee4a0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_personal_info.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_popup_energy_task.png b/app/src/main/res/drawable-xxxhdpi/bg_popup_energy_task.png new file mode 100755 index 0000000000..f7a62d71ec Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_popup_energy_task.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_commodity_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_commodity_selected.png new file mode 100755 index 0000000000..edcf970fc2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_commodity_selected.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_gift.png b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_gift.png new file mode 100755 index 0000000000..4091847aaa Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_gift.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_normal.png b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_normal.png new file mode 100755 index 0000000000..e89555f8dc Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_normal.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_signed.png b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_signed.png new file mode 100755 index 0000000000..ad27b56f27 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_signed.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_house_notice.png b/app/src/main/res/drawable-xxxhdpi/ic_energy_house_notice.png new file mode 100755 index 0000000000..560bb42def Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_energy_house_notice.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gn_center_lottery.png b/app/src/main/res/drawable-xxxhdpi/ic_gn_center_lottery.png new file mode 100755 index 0000000000..84a151d657 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gn_center_lottery.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gn_center_record.png b/app/src/main/res/drawable-xxxhdpi/ic_gn_center_record.png new file mode 100755 index 0000000000..0e467818e0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gn_center_record.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gn_center_top_gn.png b/app/src/main/res/drawable-xxxhdpi/ic_gn_center_top_gn.png new file mode 100755 index 0000000000..38b5184f21 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gn_center_top_gn.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gn_order_center.png b/app/src/main/res/drawable-xxxhdpi/ic_gn_order_center.png new file mode 100755 index 0000000000..fe555dbaa5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gn_order_center.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gncenter_done.png b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_done.png new file mode 100755 index 0000000000..242d39e7e7 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_done.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gncenter_notice.png b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_notice.png new file mode 100755 index 0000000000..dded6803bf Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_notice.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gncenter_sign.png b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_sign.png new file mode 100755 index 0000000000..5ec7e25270 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_sign.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gncenter_switch_on.png b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_switch_on.png new file mode 100755 index 0000000000..79b59d1d21 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_switch_on.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gncenter_verify.png b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_verify.png new file mode 100755 index 0000000000..670f42ce44 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gncenter_verify.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gnhouse_gn.png b/app/src/main/res/drawable-xxxhdpi/ic_gnhouse_gn.png new file mode 100755 index 0000000000..99e824e540 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_gnhouse_gn.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_guangneng.png b/app/src/main/res/drawable-xxxhdpi/ic_guangneng.png new file mode 100755 index 0000000000..5b5e0dd9a8 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_guangneng.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_guangneng_center.png b/app/src/main/res/drawable-xxxhdpi/ic_guangneng_center.png new file mode 100755 index 0000000000..8261dd2ff3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_guangneng_center.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_guangneng_house.png b/app/src/main/res/drawable-xxxhdpi/ic_guangneng_house.png new file mode 100755 index 0000000000..b342d0a791 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_guangneng_house.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_guangneng_record.png b/app/src/main/res/drawable-xxxhdpi/ic_guangneng_record.png new file mode 100755 index 0000000000..5d7eaf5f32 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_guangneng_record.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_popup_energy_task_more.png b/app/src/main/res/drawable-xxxhdpi/ic_popup_energy_task_more.png new file mode 100755 index 0000000000..6f2c1b1f77 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_popup_energy_task_more.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/icon_doubt_black.png b/app/src/main/res/drawable-xxxhdpi/icon_doubt_black.png new file mode 100755 index 0000000000..c3aeef65fd Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_doubt_black.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/icon_doubt_white.png b/app/src/main/res/drawable-xxxhdpi/icon_doubt_white.png new file mode 100755 index 0000000000..8bea2a274d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_doubt_white.png differ diff --git a/app/src/main/res/drawable/bg_energy_center_dotted_line.xml b/app/src/main/res/drawable/bg_energy_center_dotted_line.xml new file mode 100644 index 0000000000..49f584cb7e --- /dev/null +++ b/app/src/main/res/drawable/bg_energy_center_dotted_line.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_energy_house_roll_notice.xml b/app/src/main/res/drawable/bg_energy_house_roll_notice.xml new file mode 100644 index 0000000000..9f21c282bd --- /dev/null +++ b/app/src/main/res/drawable/bg_energy_house_roll_notice.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_7ce7f8.xml b/app/src/main/res/drawable/button_round_7ce7f8.xml new file mode 100644 index 0000000000..b366f13345 --- /dev/null +++ b/app/src/main/res/drawable/button_round_7ce7f8.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_806f9cef.xml b/app/src/main/res/drawable/button_round_806f9cef.xml new file mode 100644 index 0000000000..5e0baa7e01 --- /dev/null +++ b/app/src/main/res/drawable/button_round_806f9cef.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_e6f8fa.xml b/app/src/main/res/drawable/button_round_e6f8fa.xml new file mode 100644 index 0000000000..ecfd180709 --- /dev/null +++ b/app/src/main/res/drawable/button_round_e6f8fa.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_ebfdff.xml b/app/src/main/res/drawable/button_round_ebfdff.xml new file mode 100644 index 0000000000..268a1fd6e2 --- /dev/null +++ b/app/src/main/res/drawable/button_round_ebfdff.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_gncenter_card_rectangle.xml b/app/src/main/res/drawable/shape_gncenter_card_rectangle.xml new file mode 100644 index 0000000000..3f2a991d51 --- /dev/null +++ b/app/src/main/res/drawable/shape_gncenter_card_rectangle.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/commodity_item.xml b/app/src/main/res/layout/commodity_item.xml new file mode 100644 index 0000000000..497b859e6a --- /dev/null +++ b/app/src/main/res/layout/commodity_item.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/daily_task_item.xml b/app/src/main/res/layout/daily_task_item.xml new file mode 100644 index 0000000000..7948a27bce --- /dev/null +++ b/app/src/main/res/layout/daily_task_item.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_energy.xml b/app/src/main/res/layout/dialog_energy.xml new file mode 100644 index 0000000000..5009fced1a --- /dev/null +++ b/app/src/main/res/layout/dialog_energy.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_notice.xml b/app/src/main/res/layout/dialog_notice.xml index b6b0acc0ee..6e478db629 100644 --- a/app/src/main/res/layout/dialog_notice.xml +++ b/app/src/main/res/layout/dialog_notice.xml @@ -25,6 +25,8 @@ android:id="@+id/dialog_content" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginLeft="24dp" + android:layout_marginRight="24dp" android:layout_marginBottom="24dp" android:lineSpacingExtra="7dp" android:gravity="center" diff --git a/app/src/main/res/layout/fragment_commodity_list.xml b/app/src/main/res/layout/fragment_commodity_list.xml new file mode 100644 index 0000000000..855ca2a04e --- /dev/null +++ b/app/src/main/res/layout/fragment_commodity_list.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guangneng_center.xml b/app/src/main/res/layout/fragment_guangneng_center.xml new file mode 100644 index 0000000000..875c4dd9c0 --- /dev/null +++ b/app/src/main/res/layout/fragment_guangneng_center.xml @@ -0,0 +1,566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guangneng_house.xml b/app/src/main/res/layout/fragment_guangneng_house.xml new file mode 100644 index 0000000000..921d72f235 --- /dev/null +++ b/app/src/main/res/layout/fragment_guangneng_house.xml @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_personal.xml b/app/src/main/res/layout/fragment_personal.xml index 5198672c68..014d3883c4 100644 --- a/app/src/main/res/layout/fragment_personal.xml +++ b/app/src/main/res/layout/fragment_personal.xml @@ -5,7 +5,8 @@ android:id="@+id/list_refresh" android:fitsSystemWindows="false" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="@color/white"> - + android:layout_height="248dp" + android:paddingLeft="4dp" + android:paddingTop="56dp" + android:paddingRight="22dp" + android:background="@drawable/bg_personal_info" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - - - - - - + + - - + + + + app:layout_constraintStart_toEndOf="@+id/personal_user_icon_container" + app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" + tools:text="姓名" /> - + app:layout_constraintStart_toEndOf="@+id/personal_user_icon_container"> - - - - + android:textSize="9sp" /> - + - - - + + + + + + + + + + + + + + + + + + android:layout_centerHorizontal="true" + android:layout_marginTop="4dp" + android:textColor="@color/text_333333" + android:textSize="11sp" + android:text="@string/guangneng" /> + + + + + + + + android:layout_marginTop="4dp" + android:textColor="@color/text_333333" + android:textSize="11sp" + android:text="@string/guangneng_center" /> + + - - + android:layout_width="40dp" + android:layout_height="40dp" + android:src="@drawable/ic_guangneng_house" /> + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_filter_commodity_size.xml b/app/src/main/res/layout/item_filter_commodity_size.xml new file mode 100644 index 0000000000..10a381ab71 --- /dev/null +++ b/app/src/main/res/layout/item_filter_commodity_size.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_personal_fun_group.xml b/app/src/main/res/layout/item_personal_fun_group.xml index eeeb97c51d..e86f0cea28 100644 --- a/app/src/main/res/layout/item_personal_fun_group.xml +++ b/app/src/main/res/layout/item_personal_fun_group.xml @@ -3,12 +3,10 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/bg_personal_card" android:orientation="vertical" - android:paddingLeft="18dp" - android:paddingTop="16dp" - android:paddingRight="16dp" - android:paddingBottom="28dp"> + android:paddingLeft="16dp" + android:paddingBottom="32dp" + android:paddingRight="16dp"> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/novice_tasks_item.xml b/app/src/main/res/layout/novice_tasks_item.xml new file mode 100644 index 0000000000..3b92c2b200 --- /dev/null +++ b/app/src/main/res/layout/novice_tasks_item.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/popup_energy_task.xml b/app/src/main/res/layout/popup_energy_task.xml new file mode 100644 index 0000000000..442736a11b --- /dev/null +++ b/app/src/main/res/layout/popup_energy_task.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_item_gn_house.xml b/app/src/main/res/layout/tab_item_gn_house.xml new file mode 100644 index 0000000000..2fd13ce3bc --- /dev/null +++ b/app/src/main/res/layout/tab_item_gn_house.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/task_title_item.xml b/app/src/main/res/layout/task_title_item.xml new file mode 100644 index 0000000000..d9658bd13a --- /dev/null +++ b/app/src/main/res/layout/task_title_item.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c4fec896bd..7365aefd1b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -120,6 +120,7 @@ #FFC247 #FF9933 #F4F5F6 + #CDF5F0 #80000000 #404040 #ededed @@ -129,6 +130,12 @@ #EBF5FF #3797FF #EFF7FF + #806F9CEF + #EBFDFF + #7CE7F8 + #E6F8FA + #91F0FD + #34D2EA #b2b2b2 #9a9a9a #3a3a3a @@ -217,6 +224,9 @@ #757575 #0E0E0E #F9FAFB + #00CDEB + #80EFFF + #00BFDB #99666666 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cdd7bd3aee..22a6cb9d96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -766,6 +766,16 @@ 已尝试添加到桌面 如桌面未出现图标,请开启桌面快捷方式权限 + 光能 + 光能中心 + 光能屋 + 光能记录 + 光能规则 + 赚光能 + 兑换规则 + 你来晚啦,任务已经被人做完喇~ + 前往光能屋查看更多 +