From dbb19590d33590effb9976c00064ca7230a98af0 Mon Sep 17 00:00:00 2001 From: itgaojian Date: Fri, 10 Mar 2023 11:21:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BF=E4=B8=80=E7=BA=A7=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cm_utils/constant/PathConfig.java | 6 +- .../core/retrofit_net/BaseUrlApi.java | 1 + .../core/retrofit_net/api/BaseApiService.java | 14 + .../conver/BaseUrlInterceptor.java | 2 + .../base/BannerImageTextAllAdapter.java | 54 + .../core/widget/base/BannerTextAllHolder.java | 28 + .../core/widget/base/BaseActivity.java | 44 + .../ExpandableStatusFix.java | 14 + .../ExpandableTextView.java | 1189 ++++++++++++++++ .../views/expandabletextview/FormatData.java | 102 ++ .../views/expandabletextview/LinkType.java | 11 + .../views/expandabletextview/StatusType.java | 14 + .../views/expandabletextview/UUIDUtils.java | 35 + .../drawable-xhdpi/ic_search_icon_white.png | Bin 0 -> 921 bytes cm_utils/src/main/res/drawable-xhdpi/link.png | Bin 0 -> 1883 bytes .../main/res/layout/item_banner_text_all.xml | 52 + .../src/main/res/layout/layout_search.xml | 52 + cm_utils/src/main/res/values/attrs.xml | 39 +- cm_utils/src/main/res/values/strings.xml | 4 + modulemain/build.gradle | 1 + modulemain/src/main/AndroidManifest.xml | 37 +- .../activitys/news/NewsListActivity.java | 13 +- .../news/NewsLocalDetailActivity.java | 1212 +++++++++++++++++ .../activitys/news/NewsMainActivity.java | 17 +- .../activitys/news/NewsSearchActivity.java | 316 +++++ .../cultural/adapter/NewsTabAdapter.java | 51 + .../cultural/beans/NewsTabBean.java | 10 + .../cultural/fragment/HomeFragment.java | 82 +- .../cultural/fragment/NewsFragment.java | 77 +- .../cultural/holder/NewsTabHolder.java | 21 + .../mudulemain/cultural/net/HomeApi.java | 21 +- .../res/drawable-xhdpi/ic_img_arrow_left.png | Bin 0 -> 5203 bytes .../res/drawable-xhdpi/ic_img_arrow_right.png | Bin 0 -> 5340 bytes .../res/layout/activity_news_local_detail.xml | 219 +++ .../main/res/layout/activity_news_search.xml | 43 + .../item_skeleton_news_content_local.xml | 371 +++++ modulemain/src/main/res/layout/item_tab.xml | 26 + .../layout/activity_new_mine_info_edit.xml | 124 ++ .../layout/activity_new_mine_infor_detail.xml | 124 ++ .../src/main/res/layout/activity_setting.xml | 232 ++-- 40 files changed, 4432 insertions(+), 226 deletions(-) create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerTextAllHolder.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableStatusFix.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableTextView.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java create mode 100755 cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java create mode 100644 cm_utils/src/main/res/drawable-xhdpi/ic_search_icon_white.png create mode 100755 cm_utils/src/main/res/drawable-xhdpi/link.png create mode 100644 cm_utils/src/main/res/layout/item_banner_text_all.xml create mode 100644 cm_utils/src/main/res/layout/layout_search.xml create mode 100644 modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java create mode 100644 modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java create mode 100644 modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsTabAdapter.java create mode 100644 modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsTabHolder.java create mode 100644 modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png create mode 100644 modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png create mode 100644 modulemain/src/main/res/layout/activity_news_local_detail.xml create mode 100644 modulemain/src/main/res/layout/activity_news_search.xml create mode 100644 modulemain/src/main/res/layout/item_skeleton_news_content_local.xml create mode 100644 modulemain/src/main/res/layout/item_tab.xml diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java index b7ca8ae..eb3aebf 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java @@ -96,6 +96,7 @@ public class PathConfig { public static final String PATH_MODULE_MAIN_PLAN = "/modulemain/activity/planMap"; public static final String PATH_MODULE_MAIN_LOGIN = "/modulemain/activity/login";//登录 public static final String PATH_MODULE_MAIN_NEWS_DETAIL = "/modulemain/activity/news/detail";//详情页面 + public static final String PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE = "/modulemain/activity/newsInterface";//新闻详情页面-接口方式 public static final String PATH_MODULE_MAIN_FRAGMENT_MAIN = "/modulemain/fragment/main";//首页fragment public static final String PATH_MODULE_MAIN_NEWS_LIST = "/modulemain/activity/newslist"; @@ -110,6 +111,7 @@ public class PathConfig { public static final String PATH_MODULE_MAIN_CHOOSE_CITY = "/modulemain/activity/choosecity";//选择城市 public static final String PATH_MODULE_MAIN_NEWS_WEB = "/modulemain/activity/newsweb";//连接新闻页 + public static final String PATH_MODULE_MAIN_NEWS_SEARCH = "/modulemain/activity/newsSearch";//新闻收搜 //======================Map================================================== public static final String PATH_MODULE_MAP_NAVIGATION = "/modulemap/activity/navigation";//地图 public static final String PATH_MODULE_MAP_SHOW_ICON = "/modulemap/activity/showicon";//文化地图 @@ -251,7 +253,7 @@ public class PathConfig { public static final String DID_EDU = "e18d7126-f3b0-49cb-aeee-070e54889942";//学历 public static final String DID_NATIVE = "";//籍贯 public static final String DID_SEX = "90f09612-9deb-4229-8d73-d6a865056cde";//性别 - public static final String DID_NATION = "61f86a5a-22b2-4d14-8cdb-46d3cd2bd864";//民族 + public static final String DID_NATION = "039dca8f-7639-41fa-993b-34f8bbc3a3d5";//民族 public static final String DID_ADDRESS = "";//地址 public static final String DID_SERVICE_AREA = "761d8633-3c2f-4e92-b32d-fb50d3dc07b7";//服务区域 public static final String DID_SERVICE_TYPE = "a223b308-014a-4e89-93fa-035a564e7fda";//服务类别 @@ -273,4 +275,6 @@ public class PathConfig { public static final String PATH_MODULE_SHOP_ACTIVITY_SHOP_MINE_ORDER = "/moduleshop/activity/shopOrderList";//我的订单 public static final String PATH_MODULE_SHOP_ACTIVITY_SHOP_MINE_ORDER_DETAIL = "/moduleshop/activity/shopOrderDetail";//我的订单 public static final String PATH_MODULE_SHOP_ACTIVITY_SHOP_ADD_ADDRESS = "/moduleshop/activity/shopAddAddress";//新增收货地 + + } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java index 20f3e8e..61b26d5 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java @@ -59,6 +59,7 @@ public class BaseUrlApi { public static final String BASE_LEGACY_IP = BASE_SYSTEM_IP;//非遗数据库 public static final String BASE_NEWS_IP = BASE_SYSTEM_IP;//新闻 public static final String BASE_SHOP_IP = IP_URL + "xzshop";//商城 + public static final String BASE_BIG_DATA = IP_URL + "module/";//大数据接口 // public static final String BASE_PLACE_IP = TEMP_IP + "venuebooking/";/* 场馆 */ public static final String BASE_PLACE_IMG_IP = BASE_PLACE_IP + "route/file/download/true/";/* 场馆 */ public static final String BASE_CULTURAL_IP = BASE_SYSTEM_IP + "culturalactivity/";/* 文化URL */ diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/api/BaseApiService.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/api/BaseApiService.java index fd68c73..a23f714 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/api/BaseApiService.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/api/BaseApiService.java @@ -34,6 +34,7 @@ import retrofit2.http.PUT; import retrofit2.http.Part; import retrofit2.http.PartMap; import retrofit2.http.Path; +import retrofit2.http.Query; import retrofit2.http.Url; /** @@ -312,4 +313,17 @@ public interface BaseApiService { @Headers({"Content-Type:application/json", "Accept:application/json"}) @GET("app/area/getrelease/{areaId}") Observable getAreaDetail(@Path("areaId") String pId); + + + /** + * 大数据-浏览量 + * 详情浏览量 (网页|安卓|小程序)[a-zA-Z0-9-]{36}(新闻|活动|非遗|场馆|直播|志愿) 我后台正则是这样的 + * 搜索词 安卓QUERY要搜索的内容END + * + * @return + */ + @Headers({"base_url_name:bigdata", "Content-Type:application/json", "Accept:application/json"}) + @GET("app/contentcensusrelease/log") + Observable bigDataRead(@Query("requestUrl") String id); + } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/conver/BaseUrlInterceptor.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/conver/BaseUrlInterceptor.java index 5d92b2d..7bb0b40 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/conver/BaseUrlInterceptor.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/conver/BaseUrlInterceptor.java @@ -46,6 +46,8 @@ public class BaseUrlInterceptor implements Interceptor { newBaseUrl = HttpUrl.parse(BaseUrlApi.BASE_CULTURAL_SHARE); } else if ("shop".equals(headerValue)) { newBaseUrl = HttpUrl.parse(BaseUrlApi.BASE_SHOP_IP); + } else if ("bigdata".equals(headerValue)) { + newBaseUrl = HttpUrl.parse(BaseUrlApi.BASE_BIG_DATA); } else { newBaseUrl = oldHttpUrl; } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java new file mode 100755 index 0000000..5b6d672 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java @@ -0,0 +1,54 @@ +package com.sucstepsoft.cm_utils.core.widget.base; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.sucstepsoft.cm_utils.R; +import com.sucstepsoft.cm_utils.core.beans.BaseImageBean; +import com.sucstepsoft.cm_utils.utils.ConvertUtils; +import com.youth.banner.adapter.BannerAdapter; + +import java.util.List; + +/** + * 作者: adam + * 日期: 2020/6/10 - 5:51 PM + * 邮箱: itgaojian@163.com + * 描述: + */ +public class BannerImageTextAllAdapter extends BannerAdapter { + + public BannerImageTextAllAdapter(List datas) { + super(datas); + + } + + @Override + public BannerTextAllHolder onCreateHolder(ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_banner_text_all, parent, false); + return new BannerTextAllHolder(itemView); + } + + @Override + public void onBindView(BannerTextAllHolder holder, BaseImageBean data, int position, int size) { + RoundedCornersTransform roundedCornersTransform = new RoundedCornersTransform(holder.itemView.getContext(), ConvertUtils.dp2px(2)); + roundedCornersTransform.setNeedCorner(false, false, false, false); + RequestOptions options = new RequestOptions() + .error(R.drawable.ic_img_default_banner) + .placeholder(R.drawable.ic_img_default_banner) + .transform(roundedCornersTransform) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .fitCenter(); + Glide.with(holder.itemView.getContext()) + .asBitmap() + .load(data.getImgUrl()) + .apply(options) + .into(holder.mIvCover); + holder.mTvName.setContent(data.getName()); + } +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerTextAllHolder.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerTextAllHolder.java new file mode 100755 index 0000000..7e82ed2 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerTextAllHolder.java @@ -0,0 +1,28 @@ +package com.sucstepsoft.cm_utils.core.widget.base; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.sucstepsoft.cm_utils.R; +import com.sucstepsoft.cm_utils.core.widget.views.expandabletextview.ExpandableTextView; + +/** + * 作者: adam + * 日期: 2020/6/10 - 5:52 PM + * 邮箱: itgaojian@163.com + * 描述: + */ +public class BannerTextAllHolder extends RecyclerView.ViewHolder { + public ExpandableTextView mTvName; + public ImageView mIvCover; + + public BannerTextAllHolder(@NonNull View itemView) { + super(itemView); + mTvName = itemView.findViewById(R.id.tv_name); + mIvCover = itemView.findViewById(R.id.iv_cover); + } +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java index 02d20e2..013c3db 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java @@ -36,7 +36,10 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.sucstepsoft.cm_utils.R; import com.sucstepsoft.cm_utils.constant.PathConfig; +import com.sucstepsoft.cm_utils.core.beans.BaseSuccessBean; import com.sucstepsoft.cm_utils.core.beans.UserLoginBean; +import com.sucstepsoft.cm_utils.core.retrofit_net.RetrofitManager; +import com.sucstepsoft.cm_utils.core.retrofit_net.api.BaseApiService; import com.sucstepsoft.cm_utils.core.widget.views.BaseAreaListDialog; import com.sucstepsoft.cm_utils.core.widget.views.DoubleAndOneClicklistener; import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; @@ -51,6 +54,11 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + /** * 作者 : Adam on 2018/10/15. * 邮箱 : itgaojian@163.com @@ -122,6 +130,42 @@ public abstract class BaseActivity extends AppCompatActivity { mRlNotify.setVisibility(View.GONE); } + + /** + * 大数据-详情浏览 + * + * @param params + */ + protected void bigDataRead(String params) { + RetrofitManager.getInstance() + .create(BaseApiService.class) + .bigDataRead(params) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseSuccessBean baseSuccessBean) { + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + + public void setEditTextInhibitInputSpeChat(EditText editText) { InputFilter inputFilter = new InputFilter() { Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableStatusFix.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableStatusFix.java new file mode 100755 index 0000000..238710f --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableStatusFix.java @@ -0,0 +1,14 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + + +/** + * @date: on 2018/9/20 + * @author: cretin + * @email: mxnzp_life@163.com + * @desc: 为ExpandableTextView添加展开和收回状态的记录 + */ +public interface ExpandableStatusFix { + void setStatus(StatusType status); + + StatusType getStatus(); +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableTextView.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableTextView.java new file mode 100755 index 0000000..9fcfe56 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/ExpandableTextView.java @@ -0,0 +1,1189 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +import static androidx.core.util.PatternsCompat.AUTOLINK_WEB_URL; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.Intent; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.text.DynamicLayout; +import android.text.Layout; +import android.text.Selection; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.method.Touch; +import android.text.style.ClickableSpan; +import android.text.style.ForegroundColorSpan; +import android.text.style.ImageSpan; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +import com.sucstepsoft.cm_utils.R; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @date: on 2018-08-24 + * @author: cretin + * @email: mxnzp_life@163.com + * @desc: 一个支持展开 收起 网页链接 和 @用户 点击识别 的TextView + */ +public class ExpandableTextView extends AppCompatTextView { + private static final int DEF_MAX_LINE = 4; + public static String TEXT_CONTRACT = "收起"; + public static String TEXT_EXPEND = "展开"; + public static final String Space = " "; + public static String TEXT_TARGET = "网页链接"; + public static final String IMAGE_TARGET = "图"; + public static final String TARGET = IMAGE_TARGET + TEXT_TARGET; + public static final String DEFAULT_CONTENT = " " + + " "; + + private static int retryTime = 0; + + /** + * http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)? + */ + +// public static final String regexp = "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|((www.)|[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4}) +// (:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"; +// public static final String regexp = "http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?"; + + public static final String regexp_mention = "@[\\w\\p{InCJKUnifiedIdeographs}-]{1,26}"; + //匹配自定义链接的正则表达式 +// public static final String self_regex = "\\[([\\w\\p{InCJKUnifiedIdeographs}-]*)]\\([\\w\\p{InCJKUnifiedIdeographs}-]*\\)"; + public static final String self_regex = "\\[([^\\[]*)\\]\\(([^\\(]*)\\)"; + + private TextPaint mPaint; + + boolean linkHit; + + private Context mContext; + + /** + * 记录当前的model + */ + private ExpandableStatusFix mModel; + + /** + * 计算的layout + */ + private DynamicLayout mDynamicLayout; + + //hide状态下,展示多少行开始省略 + private int mLimitLines; + + private int currentLines; + + private int mWidth; + + private Drawable mLinkDrawable = null; + + /** + * 链接和@用户的事件点击 + */ + private OnLinkClickListener linkClickListener; + + /** + * 点击展开或者收回按钮的时候 是否真的执行操作 + */ + private boolean needRealExpandOrContract = true; + + /** + * 展开或者收回事件监听 + */ + private OnExpandOrContractClickListener expandOrContractClickListener; + + /** + * 是否需要收起 + */ + private boolean mNeedContract = true; + + private FormatData mFormatData; + + /** + * 是否需要展开功能 + */ + private boolean mNeedExpend = true; + + /** + * 是否需要转换url成网页链接四个字 + */ + private boolean mNeedConvertUrl = true; + + /** + * 是否需要@用户的功能 + */ + private boolean mNeedMention = true; + + /** + * 是否需要对链接进行处理 + */ + private boolean mNeedLink = true; + + /** + * 是否需要对自定义情况进行处理 + */ + private boolean mNeedSelf = false; + + /** + * 是否需要永远将展开或收回显示在最右边 + */ + private boolean mNeedAlwaysShowRight = false; + + /** + * 是否需要动画 默认开启动画 + */ + private boolean mNeedAnimation = true; + + private int mLineCount; + + private CharSequence mContent; + + /** + * 展开文字的颜色 + */ + private int mExpandTextColor; + /** + * 展开文字的颜色 + */ + private int mMentionTextColor; + + /** + * 链接的字体颜色 + */ + private int mLinkTextColor; + + /** + * 自定义规则的字体颜色 + */ + private int mSelfTextColor; + + /** + * 收起的文字的颜色 + */ + private int mContractTextColor; + + /** + * 展开的文案 + */ + private String mExpandString; + /** + * 收起的文案 + */ + private String mContractString; + + /** + * 在收回和展开前面添加的内容 + */ + private String mEndExpandContent; + + /** + * 在收回和展开前面添加的内容的字体颜色 + */ + private int mEndExpandTextColor; + + //是否AttachedToWindow + private boolean isAttached; + + public ExpandableTextView(Context context) { + this(context, null); + } + + public ExpandableTextView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, -1); + } + + public ExpandableTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs, defStyleAttr); + setMovementMethod(LocalLinkMovementMethod.getInstance()); + addOnAttachStateChangeListener(new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + if (isAttached == false) + doSetContent(); + isAttached = true; + } + + @Override + public void onViewDetachedFromWindow(View v) { + + } + }); + } + + private void init(Context context, AttributeSet attrs, int defStyleAttr) { + //适配英文版 + TEXT_CONTRACT = context.getString(R.string.social_contract); + TEXT_EXPEND = context.getString(R.string.social_expend); + TEXT_TARGET = context.getString(R.string.social_text_target); + + if (attrs != null) { + TypedArray a = + getContext().obtainStyledAttributes(attrs, R.styleable.ExpandableTextView, + defStyleAttr, 0); + + mLimitLines = a.getInt(R.styleable.ExpandableTextView_ep_max_line, DEF_MAX_LINE); + mNeedExpend = a.getBoolean(R.styleable.ExpandableTextView_ep_need_expand, true); + mNeedContract = a.getBoolean(R.styleable.ExpandableTextView_ep_need_contract, false); + mNeedAnimation = a.getBoolean(R.styleable.ExpandableTextView_ep_need_animation, true); + mNeedSelf = a.getBoolean(R.styleable.ExpandableTextView_ep_need_self, false); + mNeedMention = a.getBoolean(R.styleable.ExpandableTextView_ep_need_mention, true); + mNeedLink = a.getBoolean(R.styleable.ExpandableTextView_ep_need_link, true); + mNeedAlwaysShowRight = a.getBoolean(R.styleable.ExpandableTextView_ep_need_always_showright, false); + mNeedConvertUrl = a.getBoolean(R.styleable.ExpandableTextView_ep_need_convert_url, true); + mContractString = a.getString(R.styleable.ExpandableTextView_ep_contract_text); + mExpandString = a.getString(R.styleable.ExpandableTextView_ep_expand_text); + if (TextUtils.isEmpty(mExpandString)) { + mExpandString = TEXT_EXPEND; + } + if (TextUtils.isEmpty(mContractString)) { + mContractString = TEXT_CONTRACT; + } + mExpandTextColor = a.getColor(R.styleable.ExpandableTextView_ep_expand_color, + Color.parseColor("#999999")); + mEndExpandTextColor = a.getColor(R.styleable.ExpandableTextView_ep_expand_color, + Color.parseColor("#999999")); + mContractTextColor = a.getColor(R.styleable.ExpandableTextView_ep_contract_color, + Color.parseColor("#999999")); + mLinkTextColor = a.getColor(R.styleable.ExpandableTextView_ep_link_color, + Color.parseColor("#FF6200")); + mSelfTextColor = a.getColor(R.styleable.ExpandableTextView_ep_self_color, + Color.parseColor("#FF6200")); + mMentionTextColor = a.getColor(R.styleable.ExpandableTextView_ep_mention_color, + Color.parseColor("#FF6200")); + int resId = a.getResourceId(R.styleable.ExpandableTextView_ep_link_res, R.drawable.link); + mLinkDrawable = getResources().getDrawable(resId); + currentLines = mLimitLines; + a.recycle(); + } else { + mLinkDrawable = context.getResources().getDrawable(R.drawable.link); + } + + mContext = context; + + mPaint = getPaint(); + mPaint.setStyle(Paint.Style.FILL_AND_STROKE); + + //初始化link的图片 + mLinkDrawable.setBounds(0, 0, 30, 30); //必须设置图片大小,否则不显示 + } + + private SpannableStringBuilder setRealContent(CharSequence content) { + //处理给定的数据 + mFormatData = formatData(content); + //用来计算内容的大小 + mDynamicLayout = + new DynamicLayout(mFormatData.getFormatedContent(), mPaint, mWidth, Layout.Alignment.ALIGN_NORMAL, 1.2f, 0.0f, + true); + //获取行数 + mLineCount = mDynamicLayout.getLineCount(); + + if (onGetLineCountListener != null) { + onGetLineCountListener.onGetLineCount(mLineCount, mLineCount > mLimitLines); + } + + if (!mNeedExpend || mLineCount <= mLimitLines) { + //不需要展开功能 直接处理链接模块 + return dealLink(mFormatData, false); + } else { + return dealLink(mFormatData, true); + } + } + + /** + * 设置追加的内容 + * + * @param endExpendContent + */ + public void setEndExpendContent(String endExpendContent) { + this.mEndExpandContent = endExpendContent; + } + + /** + * 设置内容 + * + * @param content + */ + public void setContent(final String content) { + mContent = content; + if (isAttached) + doSetContent(); + } + + /** + * 实际设置内容的 + */ + private void doSetContent() { + if (mContent == null) { + return; + } + currentLines = mLimitLines; + + if (mWidth <= 0) { + if (getWidth() > 0) + mWidth = getWidth() - getPaddingLeft() - getPaddingRight(); + } + + if (mWidth <= 0) { + if (retryTime > 10) { + setText(DEFAULT_CONTENT); + } + this.post(new Runnable() { + @Override + public void run() { + retryTime++; + setContent(mContent.toString()); + } + }); + } else { + setRealContent(mContent.toString()); + } + } + + /** + * 设置最后的收起文案 + * + * @return + */ + private String getExpandEndContent() { + if (TextUtils.isEmpty(mEndExpandContent)) { + return String.format(Locale.getDefault(), " %s", + mContractString); + } else { + return String.format(Locale.getDefault(), " %s %s", + mEndExpandContent, mContractString); + } + } + + /** + * 设置展开的文案 + * + * @return + */ + private String getHideEndContent() { + if (TextUtils.isEmpty(mEndExpandContent)) { + return String.format(Locale.getDefault(), mNeedAlwaysShowRight ? " %s" : "... %s", + mExpandString); + } else { + return String.format(Locale.getDefault(), mNeedAlwaysShowRight ? " %s %s" : "... %s %s", + mEndExpandContent, mExpandString); + } + } + + /** + * 处理文字中的链接问题 + * + * @param formatData + * @param ignoreMore + */ + private SpannableStringBuilder dealLink(FormatData formatData, boolean ignoreMore) { + SpannableStringBuilder ssb = new SpannableStringBuilder(); + //获取存储的状态 + if (mModel != null && mModel.getStatus() != null) { + boolean isHide = false; + if (mModel.getStatus() != null) { + if (mModel.getStatus().equals(StatusType.STATUS_CONTRACT)) { + //收起 + isHide = true; + } else { + //展开 + isHide = false; + } + } + if (isHide) { + currentLines = mLimitLines + ((mLineCount - mLimitLines)); + } else { + if (mNeedContract) + currentLines = mLimitLines; + } + } + //处理折叠操作 + if (ignoreMore) { + if (currentLines < mLineCount) { + int index = currentLines - 1; + int endPosition = mDynamicLayout.getLineEnd(index); + int startPosition = mDynamicLayout.getLineStart(index); + float lineWidth = mDynamicLayout.getLineWidth(index); + + String endString = getHideEndContent(); + + //计算原内容被截取的位置下标 + int fitPosition = + getFitPosition(endString, endPosition, startPosition, lineWidth, mPaint.measureText(endString), 0); + String substring = formatData.getFormatedContent().substring(0, fitPosition); + if (substring.endsWith("\n")) { + substring = substring.substring(0, substring.length() - "\n".length()); + } + ssb.append(substring); + + if (mNeedAlwaysShowRight) { + //计算一下最后一行有没有充满 + float lastLineWidth = 0; + for (int i = 0; i < index; i++) { + lastLineWidth += mDynamicLayout.getLineWidth(i); + } + lastLineWidth = lastLineWidth / (index); + float emptyWidth = lastLineWidth - lineWidth - mPaint.measureText(endString); + if (emptyWidth > 0) { + float measureText = mPaint.measureText(Space); + int count = 0; + while (measureText * count < emptyWidth) { + count++; + } + count = count - 1; + for (int i = 0; i < count; i++) { + ssb.append(Space); + } + } + } + + //在被截断的文字后面添加 展开 文字 + ssb.append(endString); + + int expendLength = TextUtils.isEmpty(mEndExpandContent) ? 0 : 2 + mEndExpandContent.length(); + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (needRealExpandOrContract) { + if (mModel != null) { + mModel.setStatus(StatusType.STATUS_CONTRACT); + action(mModel.getStatus()); + } else { + action(); + } + } + if (expandOrContractClickListener != null) { + expandOrContractClickListener.onClick(StatusType.STATUS_EXPAND); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setColor(mExpandTextColor); + ds.setUnderlineText(false); + } + }, ssb.length() - mExpandString.length() - expendLength, ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + ssb.append(formatData.getFormatedContent()); + if (mNeedContract) { + String endString = getExpandEndContent(); + + if (mNeedAlwaysShowRight) { + //计算一下最后一行有没有充满 + int index = mDynamicLayout.getLineCount() - 1; + float lineWidth = mDynamicLayout.getLineWidth(index); + float lastLineWidth = 0; + for (int i = 0; i < index; i++) { + lastLineWidth += mDynamicLayout.getLineWidth(i); + } + lastLineWidth = lastLineWidth / (index); + float emptyWidth = lastLineWidth - lineWidth - mPaint.measureText(endString); + if (emptyWidth > 0) { + float measureText = mPaint.measureText(Space); + int count = 0; + while (measureText * count < emptyWidth) { + count++; + } + count = count - 1; + for (int i = 0; i < count; i++) { + ssb.append(Space); + } + } + } + + ssb.append(endString); + + int expendLength = TextUtils.isEmpty(mEndExpandContent) ? 0 : 2 + mEndExpandContent.length(); + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (mModel != null) { + mModel.setStatus(StatusType.STATUS_EXPAND); + action(mModel.getStatus()); + } else { + action(); + } + if (expandOrContractClickListener != null) { + expandOrContractClickListener.onClick(StatusType.STATUS_CONTRACT); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setColor(mContractTextColor); + ds.setUnderlineText(false); + } + }, ssb.length() - mContractString.length() - expendLength, ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + if (!TextUtils.isEmpty(mEndExpandContent)) { + ssb.append(mEndExpandContent); + ssb.setSpan(new ForegroundColorSpan(mEndExpandTextColor), ssb.length() - mEndExpandContent.length(), ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + } + } else { + ssb.append(formatData.getFormatedContent()); + if (!TextUtils.isEmpty(mEndExpandContent)) { + ssb.append(mEndExpandContent); + ssb.setSpan(new ForegroundColorSpan(mEndExpandTextColor), ssb.length() - mEndExpandContent.length(), ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + //处理链接或者@用户 + List positionDatas = formatData.getPositionDatas(); + HH: + for (FormatData.PositionData data : positionDatas) { + if (ssb.length() >= data.getEnd()) { + if (data.getType().equals(LinkType.LINK_TYPE)) { + if (mNeedExpend && ignoreMore) { + int fitPosition = ssb.length() - getHideEndContent().length(); + if (data.getStart() < fitPosition) { + SelfImageSpan imageSpan = new SelfImageSpan(mLinkDrawable, ImageSpan.ALIGN_BASELINE); + //设置链接图标 + ssb.setSpan(imageSpan, data.getStart(), data.getStart() + 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + //设置链接文字样式 + int endPosition = data.getEnd(); + if (currentLines < mLineCount) { + if (fitPosition > data.getStart() + 1 && fitPosition < data.getEnd()) { + endPosition = fitPosition; + } + } + if (data.getStart() + 1 < fitPosition) { + addUrl(ssb, data, endPosition); + } + } + } else { + SelfImageSpan imageSpan = new SelfImageSpan(mLinkDrawable, ImageSpan.ALIGN_BASELINE); + //设置链接图标 + ssb.setSpan(imageSpan, data.getStart(), data.getStart() + 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + addUrl(ssb, data, data.getEnd()); + } + } else if (data.getType().equals(LinkType.MENTION_TYPE)) { + //如果需要展开 + if (mNeedExpend && ignoreMore) { + int fitPosition = ssb.length() - getHideEndContent().length(); + if (data.getStart() < fitPosition) { + int endPosition = data.getEnd(); + if (currentLines < mLineCount) { + if (fitPosition < data.getEnd()) { + endPosition = fitPosition; + } + } + addMention(ssb, data, endPosition); + } + } else { + addMention(ssb, data, data.getEnd()); + } + } else if (data.getType().equals(LinkType.SELF)) { + //自定义 + //如果需要展开 + if (mNeedExpend && ignoreMore) { + int fitPosition = ssb.length() - getHideEndContent().length(); + if (data.getStart() < fitPosition) { + int endPosition = data.getEnd(); + if (currentLines < mLineCount) { + if (fitPosition < data.getEnd()) { + endPosition = fitPosition; + } + } + addSelf(ssb, data, endPosition); + } + } else { + addSelf(ssb, data, data.getEnd()); + } + } + } + } + //清除链接点击时背景效果 + setHighlightColor(Color.TRANSPARENT); + //将内容设置到控件中 + setText(ssb); + return ssb; + } + + /** + * 获取需要插入的空格 + * + * @param emptyWidth + * @param endStringWidth + * @return + */ + private int getFitSpaceCount(float emptyWidth, float endStringWidth) { + float measureText = mPaint.measureText(Space); + int count = 0; + while (endStringWidth + measureText * count < emptyWidth) { + count++; + } + return --count; + } + + + /** + * 添加自定义规则 + * + * @param ssb + * @param data + * @param endPosition + */ + private void addSelf(SpannableStringBuilder ssb, final FormatData.PositionData data, int endPosition) { + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (linkClickListener != null) + linkClickListener.onLinkClickListener(LinkType.SELF, data.getSelfAim(), data.getSelfContent()); + } + + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(mSelfTextColor); + ds.setUnderlineText(false); + } + }, data.getStart(), endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + + /** + * 添加@用户的Span + * + * @param ssb + * @param data + * @param endPosition + */ + private void addMention(SpannableStringBuilder ssb, final FormatData.PositionData data, int endPosition) { + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (linkClickListener != null) + linkClickListener.onLinkClickListener(LinkType.MENTION_TYPE, data.getUrl(), null); + } + + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(mMentionTextColor); + ds.setUnderlineText(false); + } + }, data.getStart(), endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + /** + * 添加链接的span + * + * @param ssb + * @param data + * @param endPosition + */ + private void addUrl(SpannableStringBuilder ssb, final FormatData.PositionData data, int endPosition) { + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (linkClickListener != null) { + linkClickListener.onLinkClickListener(LinkType.LINK_TYPE, data.getUrl(), null); + } else { + //如果没有设置监听 则调用默认的打开浏览器显示连接 + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Uri url = Uri.parse(data.getUrl()); + intent.setData(url); + mContext.startActivity(intent); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(mLinkTextColor); + ds.setUnderlineText(false); + } + }, data.getStart() + 1, endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + /** + * 设置当前的状态 + * + * @param type + */ + public void setCurrStatus(StatusType type) { + action(type); + } + + private void action() { + action(null); + } + + /** + * 执行展开和收回的动作 + */ + private void action(StatusType type) { + boolean isHide = currentLines < mLineCount; + if (type != null) { + mNeedAnimation = false; + } + if (mNeedAnimation) { + ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); + final boolean finalIsHide = isHide; + valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + Float value = (Float) animation.getAnimatedValue(); + if (finalIsHide) { + currentLines = mLimitLines + (int) ((mLineCount - mLimitLines) * value); + } else { + if (mNeedContract) + currentLines = mLimitLines + (int) ((mLineCount - mLimitLines) * (1 - value)); + } + setText(setRealContent(mContent)); + } + }); + valueAnimator.setDuration(100); + valueAnimator.start(); + } else { + if (isHide) { + currentLines = mLimitLines + ((mLineCount - mLimitLines)); + } else { + if (mNeedContract) + currentLines = mLimitLines; + } + setText(setRealContent(mContent)); + } + } + + /** + * 计算原内容被裁剪的长度 + * + * @param endString + * @param endPosition 指定行最后文字的位置 + * @param startPosition 指定行文字开始的位置 + * @param lineWidth 指定行文字的宽度 + * @param endStringWith 最后添加的文字的宽度 + * @param offset 偏移量 + * @return + */ + private int getFitPosition(String endString, int endPosition, int startPosition, float lineWidth, + float endStringWith, float offset) { + //最后一行需要添加的文字的字数 + int position = (int) ((lineWidth - (endStringWith + offset)) * (endPosition - startPosition) + / lineWidth); + + if (position <= endString.length()) return endPosition; + + //计算最后一行需要显示的正文的长度 + float measureText = mPaint.measureText( + (mFormatData.getFormatedContent().substring(startPosition, startPosition + position))); + + //如果最后一行需要显示的正文的长度比最后一行的长减去“展开”文字的长度要短就可以了 否则加个空格继续算 + if (measureText <= lineWidth - endStringWith) { + return startPosition + position; + } else { + return getFitPosition(endString, endPosition, startPosition, lineWidth, endStringWith, offset + mPaint.measureText(Space)); + } + } + + /** + * 对传入的数据进行正则匹配并处理 + * + * @param content + * @return + */ + private FormatData formatData(CharSequence content) { + FormatData formatData = new FormatData(); + List datas = new ArrayList<>(); + //对链接进行正则匹配 +// Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE); + Pattern pattern = Pattern.compile(self_regex, Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(content); + StringBuffer newResult = new StringBuffer(); + int start = 0; + int end = 0; + int temp = 0; + Map convert = new HashMap<>(); + //对自定义的进行正则匹配 + if (mNeedSelf) { + List datasMention = new ArrayList<>(); + while (matcher.find()) { + start = matcher.start(); + end = matcher.end(); + newResult.append(content.toString().substring(temp, start)); + //将匹配到的内容进行统计处理 + String result = matcher.group(); + if (!TextUtils.isEmpty(result)) { + //解析数据 + String aimSrt = result.substring(result.indexOf("[") + 1, result.indexOf("]")); + String contentSrt = result.substring(result.indexOf("(") + 1, result.indexOf(")")); + String key = UUIDUtils.getUuid(aimSrt.length()); + datasMention.add(new FormatData.PositionData(newResult.length() + 1, newResult.length() + 2 + aimSrt.length(), aimSrt, contentSrt, LinkType.SELF)); + convert.put(key, aimSrt); + newResult.append(" " + key + " "); + temp = end; + } + } + datas.addAll(datasMention); + } + //重置状态 + newResult.append(content.toString().substring(end, content.toString().length())); + content = newResult.toString(); + newResult = new StringBuffer(); + start = 0; + end = 0; + temp = 0; + + if (mNeedLink) { + pattern = AUTOLINK_WEB_URL; + matcher = pattern.matcher(content); + while (matcher.find()) { + start = matcher.start(); + end = matcher.end(); + newResult.append(content.toString().substring(temp, start)); + if (mNeedConvertUrl) { + //将匹配到的内容进行统计处理 + datas.add(new FormatData.PositionData(newResult.length() + 1, newResult.length() + 2 + TARGET.length(), matcher.group(), LinkType.LINK_TYPE)); + newResult.append(" " + TARGET + " "); + } else { + String result = matcher.group(); + String key = UUIDUtils.getUuid(result.length()); + datas.add(new FormatData.PositionData(newResult.length(), newResult.length() + 2 + key.length(), result, LinkType.LINK_TYPE)); + convert.put(key, result); + newResult.append(" " + key + " "); + } + temp = end; + } + } + newResult.append(content.toString().substring(end, content.toString().length())); + //对@用户 进行正则匹配 + if (mNeedMention) { + pattern = Pattern.compile(regexp_mention, Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(newResult.toString()); + List datasMention = new ArrayList<>(); + while (matcher.find()) { + //将匹配到的内容进行统计处理 + datasMention.add(new FormatData.PositionData(matcher.start(), matcher.end(), matcher.group(), LinkType.MENTION_TYPE)); + } + datas.addAll(0, datasMention); + } + if (!convert.isEmpty()) { + String resultData = newResult.toString(); + for (Map.Entry entry : convert.entrySet()) { + resultData = resultData.replaceAll(entry.getKey(), entry.getValue()); + } + newResult = new StringBuffer(resultData); + } + formatData.setFormatedContent(newResult.toString()); + formatData.setPositionDatas(datas); + return formatData; + } + + /** + * 自定义ImageSpan 让Image 在行内居中显示 + */ + class SelfImageSpan extends ImageSpan { + private Drawable drawable; + + public SelfImageSpan(Drawable d, int verticalAlignment) { + super(d, verticalAlignment); + this.drawable = d; + } + + @Override + public Drawable getDrawable() { + return drawable; + } + + @Override + public void draw(@NonNull Canvas canvas, CharSequence text, + int start, int end, float x, + int top, int y, int bottom, @NonNull Paint paint) { + // image to draw + Drawable b = getDrawable(); + // font metrics of text to be replaced + Paint.FontMetricsInt fm = paint.getFontMetricsInt(); + int transY = (y + fm.descent + y + fm.ascent) / 2 + - b.getBounds().bottom / 2; + canvas.save(); + canvas.translate(x, transY); + b.draw(canvas); + canvas.restore(); + } + } + + /** + * 绑定状态 + * + * @param model + */ + public void bind(ExpandableStatusFix model) { + mModel = model; + } + + public static class LocalLinkMovementMethod extends LinkMovementMethod { + static LocalLinkMovementMethod sInstance; + + + public static LocalLinkMovementMethod getInstance() { + if (sInstance == null) + sInstance = new LocalLinkMovementMethod(); + + return sInstance; + } + + @Override + public boolean onTouchEvent(TextView widget, + Spannable buffer, MotionEvent event) { + int action = event.getAction(); + + if (action == MotionEvent.ACTION_UP || + action == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= widget.getTotalPaddingLeft(); + y -= widget.getTotalPaddingTop(); + + x += widget.getScrollX(); + y += widget.getScrollY(); + + Layout layout = widget.getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + + ClickableSpan[] link = buffer.getSpans( + off, off, ClickableSpan.class); + + if (link.length != 0) { + if (action == MotionEvent.ACTION_UP) { + link[0].onClick(widget); + } else if (action == MotionEvent.ACTION_DOWN) { + Selection.setSelection(buffer, + buffer.getSpanStart(link[0]), + buffer.getSpanEnd(link[0])); + } + + if (widget instanceof ExpandableTextView) { + ((ExpandableTextView) widget).linkHit = true; + } + return true; + } else { + Selection.removeSelection(buffer); + Touch.onTouchEvent(widget, buffer, event); + return false; + } + } + return Touch.onTouchEvent(widget, buffer, event); + } + } + + boolean dontConsumeNonUrlClicks = true; + + @Override + public boolean onTouchEvent(MotionEvent event) { + int action = event.getAction(); + linkHit = false; + boolean res = super.onTouchEvent(event); + + if (dontConsumeNonUrlClicks) + return linkHit; + + //防止选择复制的状态不消失 + if (action == MotionEvent.ACTION_UP) { + this.setTextIsSelectable(false); + } + + return res; + } + + public interface OnLinkClickListener { + void onLinkClickListener(LinkType type, String content, String selfContent); + } + + public interface OnGetLineCountListener { + /** + * lineCount 预估可能占有的行数 + * canExpand 是否达到可以展开的条件 + */ + void onGetLineCount(int lineCount, boolean canExpand); + } + + private OnGetLineCountListener onGetLineCountListener; + + public OnGetLineCountListener getOnGetLineCountListener() { + return onGetLineCountListener; + } + + public void setOnGetLineCountListener(OnGetLineCountListener onGetLineCountListener) { + this.onGetLineCountListener = onGetLineCountListener; + } + + public interface OnExpandOrContractClickListener { + void onClick(StatusType type); + } + + public OnLinkClickListener getLinkClickListener() { + return linkClickListener; + } + + public void setLinkClickListener(OnLinkClickListener linkClickListener) { + this.linkClickListener = linkClickListener; + } + + public boolean ismNeedMention() { + return mNeedMention; + } + + public void setNeedMention(boolean mNeedMention) { + this.mNeedMention = mNeedMention; + } + + public Drawable getLinkDrawable() { + return mLinkDrawable; + } + + public void setLinkDrawable(Drawable mLinkDrawable) { + this.mLinkDrawable = mLinkDrawable; + } + + public boolean isNeedContract() { + return mNeedContract; + } + + public void setNeedContract(boolean mNeedContract) { + this.mNeedContract = mNeedContract; + } + + public boolean isNeedExpend() { + return mNeedExpend; + } + + public void setNeedExpend(boolean mNeedExpend) { + this.mNeedExpend = mNeedExpend; + } + + public boolean isNeedAnimation() { + return mNeedAnimation; + } + + public void setNeedAnimation(boolean mNeedAnimation) { + this.mNeedAnimation = mNeedAnimation; + } + + public int getExpandableLineCount() { + return mLineCount; + } + + public void setExpandableLineCount(int mLineCount) { + this.mLineCount = mLineCount; + } + + public int getExpandTextColor() { + return mExpandTextColor; + } + + public void setExpandTextColor(int mExpandTextColor) { + this.mExpandTextColor = mExpandTextColor; + } + + public int getExpandableLinkTextColor() { + return mLinkTextColor; + } + + public void setExpandableLinkTextColor(int mLinkTextColor) { + this.mLinkTextColor = mLinkTextColor; + } + + public int getContractTextColor() { + return mContractTextColor; + } + + public void setContractTextColor(int mContractTextColor) { + this.mContractTextColor = mContractTextColor; + } + + public String getExpandString() { + return mExpandString; + } + + public void setExpandString(String mExpandString) { + this.mExpandString = mExpandString; + } + + public String getContractString() { + return mContractString; + } + + public void setContractString(String mContractString) { + this.mContractString = mContractString; + } + + public int getEndExpandTextColor() { + return mEndExpandTextColor; + } + + public void setEndExpandTextColor(int mEndExpandTextColor) { + this.mEndExpandTextColor = mEndExpandTextColor; + } + + public boolean isNeedLink() { + return mNeedLink; + } + + public void setNeedLink(boolean mNeedLink) { + this.mNeedLink = mNeedLink; + } + + public int getSelfTextColor() { + return mSelfTextColor; + } + + public void setSelfTextColor(int mSelfTextColor) { + this.mSelfTextColor = mSelfTextColor; + } + + public boolean isNeedSelf() { + return mNeedSelf; + } + + public void setNeedSelf(boolean mNeedSelf) { + this.mNeedSelf = mNeedSelf; + } + + public boolean isNeedAlwaysShowRight() { + return mNeedAlwaysShowRight; + } + + public void setNeedAlwaysShowRight(boolean mNeedAlwaysShowRight) { + this.mNeedAlwaysShowRight = mNeedAlwaysShowRight; + } + + public OnExpandOrContractClickListener getExpandOrContractClickListener() { + return expandOrContractClickListener; + } + + public void setExpandOrContractClickListener(OnExpandOrContractClickListener expandOrContractClickListener) { + this.expandOrContractClickListener = expandOrContractClickListener; + } + + public void setExpandOrContractClickListener(OnExpandOrContractClickListener expandOrContractClickListener, boolean needRealExpandOrContract) { + this.expandOrContractClickListener = expandOrContractClickListener; + this.needRealExpandOrContract = needRealExpandOrContract; + } +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java new file mode 100755 index 0000000..9b7a553 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java @@ -0,0 +1,102 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + + +import java.util.List; + +/** + * 记录可以点击的内容 和 位置 + */ + public class FormatData { + private String formatedContent; + private List positionDatas; + + public String getFormatedContent() { + return formatedContent; + } + + public void setFormatedContent(String formatedContent) { + this.formatedContent = formatedContent; + } + + public List getPositionDatas() { + return positionDatas; + } + + public void setPositionDatas(List positionDatas) { + this.positionDatas = positionDatas; + } + + public static class PositionData { + private int start; + private int end; + private String url; + private LinkType type; + //自定义法规则的aim + private String selfAim; + //自定义规则的内容 + private String selfContent; + + public String getSelfAim() { + return selfAim; + } + + public void setSelfAim(String selfAim) { + this.selfAim = selfAim; + } + + public String getSelfContent() { + return selfContent; + } + + public void setSelfContent(String selfContent) { + this.selfContent = selfContent; + } + + public LinkType getType() { + return type; + } + + public void setType(LinkType type) { + this.type = type; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public PositionData(int start, int end, String url, LinkType type) { + this.start = start; + this.end = end; + this.url = url; + this.type = type; + } + + public PositionData(int start, int end, String selfAim,String selfContent, LinkType type) { + this.start = start; + this.end = end; + this.selfAim = selfAim; + this.selfContent = selfContent; + this.type = type; + } + + public int getStart() { + return start; + } + + public void setStart(int start) { + this.start = start; + } + + public int getEnd() { + return end; + } + + public void setEnd(int end) { + this.end = end; + } + } + } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java new file mode 100755 index 0000000..10c390d --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java @@ -0,0 +1,11 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +//定义类型的枚举类型 +public enum LinkType { + //普通链接 + LINK_TYPE, + //@用户 + MENTION_TYPE, + //自定义规则 + SELF +} \ No newline at end of file diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java new file mode 100755 index 0000000..8b73220 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java @@ -0,0 +1,14 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +/** + * @date: on 2018/9/20 + * @author: cretin + * @email: mxnzp_life@163.com + * @desc: 添加描述 + */ +public enum StatusType { + //展开 + STATUS_EXPAND, + //收起 + STATUS_CONTRACT +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java new file mode 100755 index 0000000..f261ff1 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java @@ -0,0 +1,35 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +import java.util.UUID; + +public class UUIDUtils { + /** + * 生成一个32位的不带-的不唯一的uuid + * + * @return + */ + public static String getUuid() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String[] chars = new String[]{"a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z"}; + + + /** + * 生成一个32位的不带-的不唯一的uuid + * + * @return + */ + public static String getUuid(int length) { + StringBuilder stringBuilder = new StringBuilder(UUID.randomUUID().toString()); + while (stringBuilder.length() < length) { + stringBuilder.append(UUID.randomUUID().toString()); + } + return stringBuilder.substring(0,length); + } +} \ No newline at end of file diff --git a/cm_utils/src/main/res/drawable-xhdpi/ic_search_icon_white.png b/cm_utils/src/main/res/drawable-xhdpi/ic_search_icon_white.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2cd5ef77942a68200fc09586bc0141d92b7576 GIT binary patch literal 921 zcmV;K17`e*P)Px&Q%OWYR9HvFmTSn5XB@{r-=>z9$e~el8s!*DQzKChW7Ep9IlLf6B!^|;jYD1_ znw6ZVrVQD5N0=8T-}zU{U^U*Ni=r?q@rX>Wr7wmSp!fu2A=pi9otec&o^6WAu{L1Ta_0@$7btOGtt zjvoV8fb+oTK!4!lwDt&CA!%Q&5QPA?cLH;gvkkz0Nmp(60(wb05^J_2D${^vY40vc zb8CTk3&8e9U@7nyFa~G`d4{!n)4Ri;F0p9{sB;Ba$=~YU)0k?sZlD;VO z&1-;k+f~5g6osv|9G*+ZBH#yLjiiWRgO&$~9QK#g!FJsKnxv?Mn$339#}!FYL!|+p z0TJq{(eIL?=o)3Vqg8uLYFW)eT?A}LU!MaGM*e{DlD@9?aiw+J2Y_#Y!IA=|qGbR} zfbW6zz>C;jCVve8!~k0!MJ#D^8Gy;aq14|s4U!_~xj{Bd(obaoV%$CiPDvWo*wE)X z;WuC;Fi6tHssO1Dt^>^_MK8aT*}emO1ay=1cUgcRf!V-Ul8!Z&!1kBG(Xt~sKL@f- zxF_k;cL2BxbWJlQp6haRAf+K95Ro`hW{A}HY&(WoHiB16T2m81f{52{DDX2dQ_{cH zoY-y#M72)`o~MHD4J?$jrBn^%H>DzqG{h*LCn;LA&}>fuwx_2!_VfWh075gwqc%fQ zT&B<(Qbap|Y$iliM?NnBXMrKWz$DY^cg;#kYi-ARKy*rv+Al=})imKmAf{y8s#Sr5 zCuw|d4y|C@Y0q*=8*C2-4g>8gL6la-wtIve3$c-+5%2yjN&jSEwnGv9nSR%eVcWxj zUx7A75TyaC6=Dt|6D9H20!dqKhsX(t7WE4&Pw@C00000NkvXXu0mjfhg+5W literal 0 HcmV?d00001 diff --git a/cm_utils/src/main/res/drawable-xhdpi/link.png b/cm_utils/src/main/res/drawable-xhdpi/link.png new file mode 100755 index 0000000000000000000000000000000000000000..3b3c1f7c376e1df18c9c9ad0b3d9647dd64c41de GIT binary patch literal 1883 zcmV-h2c-CkP)Px#32;bRa{vGqB>(^xB>_oNB=7(L032yVPgDQ^00IC20000003ZMW04M+e03ZMW z03QGV1EyhjQUL$}19C}3K~!i3?3l}I6fqpfXMG<;d=<2hP3GX^Cfc)DMGyT0R$E&q z8ASyzQWdQV+M6fOzNH>SPy{c&@X&)|1r@xAhk_Mv7K_r-+MNvQH!bN-hfLX6h)86K}^tjLIHNk1WaOo#J_j;V36ufDt$+sr! zh6;5n0eIba?SH0!491JGwx;@;gba%ohv+Uq51N2y*3sdjOAmzO)YNaE+XX<0nPBFu ztF~AM=W7a9i7hgFe^%&ecuu=jyqYNGRK@i66+k&9*8REKfM&Ek7MjzaXmcM+;dYYs zFBm;Lui=ZFw#7jU*M2ox*iffH202{;pF4500)A(d&%7!Dy%hlCCIGozNl=aO9DL)q zJ4Q}xe5+^bYq6FfBkyCNpGQC|;W^)>H%u{PoyTaGa;SQVOkOq##@6&~pw(KQKqxX# zZkl3YX8c8eEeT@HeG_ErTa;Lce3}qi3C;P;z7-X3($48uc^Xs>RVjZT%&&4g2VpET0Ey7ZHtc@>UbS~MEIM{4A^c~U~C2YcJ*j#RZBTmCQnO$8U81%#C#?S0O z)=4(%L`fUAxJPLM|8eT`@@sCSy?%Yr4_W`B>qBt+YOr0!pK*kRnMD=st0Xtx%O(Mxgwbam1u9I`v8qvFrQ z9cx!1>))dUPKq>SUT%AlzJ{;7U!1P4IBd8>;pF$qQ&l8@%uob8GTv|U)78P}V^~Ag zenZR^oyed~2k&wFXs}I!XU}uU_NsyEI+kE@!gcVNExmDmsva-33%b6mZc725Q(}9j z4l8{M&QK0KELe+`pROG5XlN8Xzi)y!ZbJQZAG)@)Zc7C3+OIukA1gA_F>^aBZCSbj z5R6<53&wpt!%};R_Cq0`QD}K1FEZi=EF3fQ?qjNRki zM5nzaGf*1GxrCp(vx`1FX$JteL>?nY(lBIhJE!p2CbfVjJGNc_(l&RDwaO7GosX^SOi}O zK|vJs7HMmn{a4U~py0vxB?nPNP&|lF1VKFrp1g<$6(1)B-*^xVdJsjZHPtrVjn!|~ z?y_uVb~j0zG?+lx-I@8n`M&?3{r}m~v@(Adv86WgR|S**3H=l68#Y*%m?ooXlL{ug z5;{H#Pt{Ls#3FrHnQ}@qdz;dxSq9r{6T4L)_5uG9M-=g|XuD$@?AYM8mR3J%N#coR zhlzFKzobC=CfnpsL!DMl@qST#sX4QMb+$G8+hq5ak?aT+Fd9`j@3`OoS%)^&ak47v zqP+iYXgZh zQgOt-4|Q`LrS57`Ke54lPwOHT$vEOs=C-TstJ01o`>05mlZp8?K_G)VkHnS1>oDky zBmN1_+7Lx9T0FZEg)y%E5dK;wT&x8D#3J+mB-Z3_i@JZmQJb#BC-yGNeq8$z$?H<# z*a6;5X_G6R+%ou189rX2-=8-(&#V-`Yof~)-I{Zh>x}j@#n+Hi#~CnAr3uUoMD4+jTDW|(m<+dzH2iPuL*20E<}k( z|2IVNAsm&B8Y_;(Cc0=h5Qw~fF-lOJeu#dV>uR3o0@uSeft}Z-IO0@eP_JL)(k*lA zL2QsCBF`_YgoU-E{5`K%(Vi1ff_6Y;XvX%OAWn8s8o%@|nB@V~^G&`xxe)K`V^5&0 z))W7TTE4EHb*i{0#F@G{TgUr*0$*^qMRdiAu&8ah_y$)QHrg8=Xn3IEf&bD2e*p`m V&N+o%Li+#!002ovPDHLkV1l>aZ)X4i literal 0 HcmV?d00001 diff --git a/cm_utils/src/main/res/layout/item_banner_text_all.xml b/cm_utils/src/main/res/layout/item_banner_text_all.xml new file mode 100644 index 0000000..8d9610c --- /dev/null +++ b/cm_utils/src/main/res/layout/item_banner_text_all.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cm_utils/src/main/res/layout/layout_search.xml b/cm_utils/src/main/res/layout/layout_search.xml new file mode 100644 index 0000000..16e6447 --- /dev/null +++ b/cm_utils/src/main/res/layout/layout_search.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + diff --git a/cm_utils/src/main/res/values/attrs.xml b/cm_utils/src/main/res/values/attrs.xml index 4353921..312b274 100755 --- a/cm_utils/src/main/res/values/attrs.xml +++ b/cm_utils/src/main/res/values/attrs.xml @@ -96,6 +96,43 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cm_utils/src/main/res/values/strings.xml b/cm_utils/src/main/res/values/strings.xml index 606b892..f8fcd87 100755 --- a/cm_utils/src/main/res/values/strings.xml +++ b/cm_utils/src/main/res/values/strings.xml @@ -30,4 +30,8 @@ 正在下载:%1$d%% 正在检查版本 + 安卓%1$s%2$s%3$s + 收起 + 展开 + 网页链接 diff --git a/modulemain/build.gradle b/modulemain/build.gradle index 065b803..3f65c5d 100755 --- a/modulemain/build.gradle +++ b/modulemain/build.gradle @@ -41,6 +41,7 @@ dependencies { implementation project(':moduleactivity') implementation project(':modulecultural') implementation project(':moduleshop') + implementation project(':moduleijkplayer') implementation files('libs/BaiduLBS_Android.jar') implementation 'androidx.appcompat:appcompat:1.1.0' testImplementation 'junit:junit:4.12' diff --git a/modulemain/src/main/AndroidManifest.xml b/modulemain/src/main/AndroidManifest.xml index d7135a9..388b6de 100755 --- a/modulemain/src/main/AndroidManifest.xml +++ b/modulemain/src/main/AndroidManifest.xml @@ -18,9 +18,11 @@ - - @@ -31,31 +33,44 @@ + + + diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java index 81aaf93..16c0723 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java @@ -2,12 +2,14 @@ package com.tengshisoft.mudulemain.cultural.activitys.news; import android.graphics.Color; import android.text.TextUtils; +import android.view.View; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; +import com.bumptech.glide.Glide; import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.sucstepsoft.cm_utils.constant.PathConfig; import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; @@ -88,6 +90,15 @@ public class NewsListActivity extends BaseActivity { getNewsListByType(mCurrentPage); } }); + mLlImg.setVisibility(View.VISIBLE); + Glide.with(mActivity) + .load(R.drawable.ic_search_icon_white) + .into(mIvInto); + mIvInto.setOnClickListener(v -> ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_SEARCH) + .withString("id", mType) + .withBoolean("isTab", false) + .navigation()); mAdapter.addOnItemClickByType(this::showNewsDetail); if (!TextUtils.isEmpty(UserLgUtils.getToken())) { getNewsListByTypeToken(mCurrentPage); @@ -100,7 +111,7 @@ public class NewsListActivity extends BaseActivity { private void getNewsListByType(int page) { RetrofitManager.getInstance() .create(HomeApi.class) - .getNewsList("", mPId,page + "") + .getNewsList("", mPId, page + "") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java new file mode 100644 index 0000000..989fa01 --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java @@ -0,0 +1,1212 @@ +package com.tengshisoft.mudulemain.cultural.activitys.news; + +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Color; +import android.net.Uri; +import android.net.http.SslError; +import android.os.Build; +import android.os.Environment; +import android.provider.MediaStore; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.webkit.HttpAuthHandler; +import android.webkit.JsResult; +import android.webkit.SslErrorHandler; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.core.content.FileProvider; +import androidx.core.widget.NestedScrollView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.bumptech.glide.Glide; +import com.ethanhua.skeleton.Skeleton; +import com.ethanhua.skeleton.ViewSkeletonScreen; +import com.google.gson.Gson; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.sucstepsoft.cm_utils.constant.PathConfig; +import com.sucstepsoft.cm_utils.core.beans.AddPhotoBean; +import com.sucstepsoft.cm_utils.core.beans.BaseImageBean; +import com.sucstepsoft.cm_utils.core.beans.BaseSuccessBean; +import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; +import com.sucstepsoft.cm_utils.core.retrofit_net.RetrofitManager; +import com.sucstepsoft.cm_utils.core.widget.base.BannerImageTextAllAdapter; +import com.sucstepsoft.cm_utils.core.widget.base.BaseActivity; +import com.sucstepsoft.cm_utils.core.widget.views.BottomDialogShareView; +import com.sucstepsoft.cm_utils.core.widget.views.ButtomDialogCommentView; +import com.sucstepsoft.cm_utils.core.widget.views.ButtomDialogView; +import com.sucstepsoft.cm_utils.core.widget.views.ItemSplitDivider; +import com.sucstepsoft.cm_utils.core.widget.views.NestedScrollWebView; +import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.sucstepsoft.cm_utils.utils.ExceptionHandler; +import com.sucstepsoft.cm_utils.utils.FileUtils; +import com.sucstepsoft.cm_utils.utils.LogUtils; +import com.sucstepsoft.cm_utils.utils.ProiderUtil; +import com.sucstepsoft.cm_utils.utils.TimeUtils; +import com.sucstepsoft.cm_utils.utils.UIUtil; +import com.sucstepsoft.cm_utils.utils.UserLgUtils; +import com.sucstepsoft.cm_utils.utils.toast.ToastUtils; +import com.tengshisoft.moduleijkplayer.player.VideoView; +import com.tengshisoft.mudulemain.R; +import com.tengshisoft.mudulemain.R2; +import com.tengshisoft.mudulemain.cultural.adapter.CommentAdapter; +import com.tengshisoft.mudulemain.cultural.beans.BaseUserBean; +import com.tengshisoft.mudulemain.cultural.beans.CollectBean; +import com.tengshisoft.mudulemain.cultural.beans.CommentListBean; +import com.tengshisoft.mudulemain.cultural.beans.CommentPublishBean; +import com.tengshisoft.mudulemain.cultural.beans.LikeBean; +import com.tengshisoft.mudulemain.cultural.beans.NewsDetailBean; +import com.tengshisoft.mudulemain.cultural.net.HomeApi; +import com.tengshisoft.mudulemain.cultural.widget.ButtomCommentListDialogView; +import com.youth.banner.Banner; +import com.youth.banner.transformer.ScaleInTransformer; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Unbinder; +import cn.jiguang.share.android.api.JShareInterface; +import cn.jiguang.share.android.api.PlatActionListener; +import cn.jiguang.share.android.api.Platform; +import cn.jiguang.share.android.api.ShareParams; +import cn.jiguang.share.qqmodel.QQ; +import cn.jiguang.share.wechat.Wechat; +import cn.jiguang.share.wechat.WechatMoments; +import cn.jiguang.share.weibo.SinaWeibo; +import io.reactivex.Observable; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import top.zibin.luban.Luban; +import top.zibin.luban.OnCompressListener; + +/** + * 新闻详情页面--接口方式 + */ +@Route(path = PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) +public class NewsLocalDetailActivity extends BaseActivity { + @BindView(R2.id.tv_input_comment) + TextView mTvInputComment; + @BindView(R2.id.iv_collect) + ImageView mIvCollect; + @BindView(R2.id.iv_share) + ImageView mIvShare; + @BindView(R2.id.nsl_content) + NestedScrollView mNslContent; + @BindView(R2.id.ll_news_content) + LinearLayout mLlNewsContent; + @BindView(R2.id.rlv_comment) + RecyclerView mRlvComment; + @BindView(R2.id.srl_content) + SmartRefreshLayout mSrlContent; + @BindView(R2.id.ll_input_comment) + LinearLayout mLlComment; + @BindView(R2.id.nwv_content) + NestedScrollWebView mWvContent;//文章 pdf 连接 + @BindView(R2.id.ll_video) + LinearLayout mLlVideo;//视频 + @BindView(R2.id.vv_video) + VideoView mVideo; + @BindView(R2.id.rlv_video_category) + RecyclerView mRlvVideoCategory; + @BindView(R2.id.tv_video_txt) + TypeFaceTextView mTvVideoTxt; + @BindView(R2.id.rl_img) + RelativeLayout mRlImg;//图片 + @BindView(R2.id.bn_img) + Banner mBnImg; + @BindView(R2.id.tv_title) + TypeFaceTextView mTvTitle; + @BindView(R2.id.tv_source) + TypeFaceTextView mTvSource; + @BindView(R2.id.tv_time) + TypeFaceTextView mTvPublishTime; + @BindView(R2.id.ll_title_view) + LinearLayout mLlTitleView; + + + private AddPhotoBean mCurrentBean; + private String mPicPath; + private Unbinder mBind; + private ButtomDialogCommentView mCommentView; + private List mCommentDatas; + private CommentAdapter mAdapter; + private int mCommentPage = 1; + private int mCommentTotalSize = 0; + private String mNId; + private Disposable mDisposable; + private Disposable mLikeDisposable; + private String mIsCommentImg; + private String mIsComment; + private ButtomCommentListDialogView mItemCommentDialog; + private String mIsCollect; + private ViewSkeletonScreen mContentSkeleton; + private String mUrl; + private int mType; + private String mTitle; + private String mPhoto; + private File mDestFile; + + @Override + protected int setLayoutId() { + return R.layout.activity_news_local_detail; + } + + + @Override + public void initData() { + super.initData(); + mBind = ButterKnife.bind(this); + refreshView(STATE_LOAD_LOADING); + mTvBaseTitle.setText("详情"); + mContentSkeleton = Skeleton.bind(mLlNewsContent) + .load(R.layout.item_skeleton_news_content_local) + .show(); + mNId = getIntent().getStringExtra("id"); + mUrl = getIntent().getStringExtra("url"); + mTitle = getIntent().getStringExtra("title"); + mPhoto = getIntent().getStringExtra("photo"); + if (!TextUtils.isEmpty(mPhoto) && !mPhoto.endsWith("/")) { + Observable.create((ObservableOnSubscribe) emitter -> { + emitter.onNext(Glide.with(mActivity) + .asFile() + .load(mPhoto) + .submit(300, 300) + .get()); + emitter.onComplete(); + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(File file) { + + File externalFilesDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); + String fileName = System.currentTimeMillis() + ".jpg"; + mDestFile = new File(externalFilesDir, fileName); + FileUtils.copyFile(file, mDestFile); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + //是否可以评论 + mIsComment = getIntent().getStringExtra("isComment"); + if ("0".equals(mIsComment)) { + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mSrlContent.getLayoutParams(); + params.bottomMargin = 0; + mSrlContent.setLayoutParams(params); + mLlComment.setVisibility(View.GONE); + } + //评论是否可以上传照片 + mIsCommentImg = getIntent().getStringExtra("isCommentImg"); + mIsCollect = getIntent().getStringExtra("isCollect"); + if ("0".equals(mIsCollect)) { + //未收藏 + mIvCollect.setImageResource(R.drawable.ic_collect); + } else { + //已经搜藏 + mIvCollect.setImageResource(R.drawable.ic_collect_check); + } + mIvShare.setOnClickListener(v -> showShareDialog()); + + mCommentDatas = new ArrayList<>(); + mAdapter = new CommentAdapter(mActivity, mCommentDatas, true); + mAdapter.addShowPhotoListener(path -> { + ArrayList lis = new ArrayList(); + lis.add(path); + ARouter.getInstance().build(PathConfig.PATH_MODULE_CAMERA_SHOW_IMG).withStringArrayList("imgUrls", lis).navigation(); + }); + LinearLayoutManager manager = new LinearLayoutManager(mActivity, LinearLayoutManager.VERTICAL, false); + mRlvComment.setLayoutManager(manager); + mRlvComment.addItemDecoration(new ItemSplitDivider(mActivity, LinearLayoutManager.VERTICAL, 1, + Color.parseColor("#F2F2F2"))); + mRlvComment.setAdapter(mAdapter); + mSrlContent.setEnableRefresh(false); + mAdapter.addCommentListener(this::doCommentItem); + mAdapter.addDelListener(this::doDelComment); + mAdapter.addLikeListener((bean, pos, view) -> { + if (mLikeDisposable != null && !mLikeDisposable.isDisposed()) { + //正在网络请求 + } else { + if (!TextUtils.isEmpty(UserLgUtils.getToken())) { + doLike(bean, pos); + } else { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_LOGIN) + .navigation(); + } + } + }); + mSrlContent.setOnLoadMoreListener(refreshLayout -> loadMoreData()); + if (TextUtils.isEmpty(mNId)) { + refreshView(STATE_LOAD_ERROR); + } + + mTvInputComment.setOnClickListener(v -> { + if (!TextUtils.isEmpty(UserLgUtils.getToken())) { + showCommentDialog(); + } else { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_LOGIN) + .navigation(); + } + }); + mIvCollect.setOnClickListener(v -> { + if (!TextUtils.isEmpty(UserLgUtils.getToken())) { + doCollect(mNId); + } else { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_LOGIN) + .navigation(); + } + }); + getNewsDetail(); + } + + + /** + * 获取新闻详情 + */ + private void getNewsDetail() { + RetrofitManager.getInstance() + .create(HomeApi.class) + .getNewsDetail(mNId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(NewsDetailBean newsDetailBean) { + if (!"".equals(newsDetailBean.getNewsContentId())) { + setDataToView(newsDetailBean); + } else { + refreshView(STATE_LOAD_ERROR); + } + } + + @Override + public void onError(Throwable e) { + ExceptionHandler.handleException(e); + refreshView(STATE_LOAD_ERROR); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 加载详情数据 + * + * @param newsDetailBean + */ + private void setDataToView(NewsDetailBean newsDetailBean) { + if (mContentSkeleton != null) { + mContentSkeleton.hide(); + } + //判断是什么类型新闻 + //newsContentType 1 文章 2图片 3音频 4视频 5PDF 6链接 + switch (newsDetailBean.getNewsContentType()) { + case "2": //图片 + createImgView(newsDetailBean); + break; + case "3"://音频 + break; + case "4"://视频 + break; + case "5"://PDF + break; + case "6"://6链接 + break; + case "1": + default: + mLlTitleView.setVisibility(View.VISIBLE); + mTvTitle.setText(newsDetailBean.getNewsContentTitle()); + if (!TextUtils.isEmpty(newsDetailBean.getNewsContentResource())) { + mTvSource.setText("新闻来源:" + newsDetailBean.getNewsContentResource()); + } + if (!TextUtils.isEmpty(newsDetailBean.getNewsContentPublishTime())) { + mTvPublishTime.setText("发布时间:" + newsDetailBean.getNewsContentPublishTime()); + } + createWebView(newsDetailBean); + break; + } + } + + private void showShareDialog() { + BottomDialogShareView shareView = new BottomDialogShareView.DialogBuilder(mActivity).build(); + shareView.addOnChoseListener(new BottomDialogShareView.OnChoseListener() { + @Override + public void shareWeChart() { + shareToPlatform(1); + } + + @Override + public void shareWeibo() { + shareToPlatform(2); + } + + @Override + public void shareQQ() { + shareToPlatform(3); + } + + @Override + public void shareMoment() { + shareToPlatform(4); + } + }); + shareView.show(); + } + + private void shareToPlatform(int type) { + if (mType != 0) { + ToastUtils.showShort("该资讯不支持分享"); + } else { + ShareParams params = new ShareParams(); + if (type == 4) { + params.setTitle(mTitle); + params.setText("日喀则市数字文化云"); + } else { + params.setTitle("日喀则市数字文化云"); + params.setText(mTitle); + } + params.setShareType(Platform.SHARE_WEBPAGE); + params.setUrl(BaseUrlApi.BASE_NEWS_DETAIL + mUrl); + if (mDestFile != null) { + params.setImagePath(mDestFile.getAbsolutePath()); + } else { + File externalFilesDir = mActivity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); + String imgPath = externalFilesDir.getAbsolutePath() + File.separator + "sharelocalImg.png"; + params.setImagePath(imgPath); + } + String platFormName = ""; + if (type == 1) { + platFormName = Wechat.Name; + } else if (type == 2) { + platFormName = SinaWeibo.Name; + + } else if (type == 3) { + platFormName = QQ.Name; + } else if (type == 4) { + platFormName = WechatMoments.Name; + } else { + platFormName = Wechat.Name; + } + JShareInterface.share(platFormName, params, new PlatActionListener() { + @Override + public void onComplete(Platform platform, int i, HashMap hashMap) { + } + + @Override + public void onError(Platform platform, int i, int i1, Throwable throwable) { + if (!TextUtils.isEmpty(throwable.getMessage()) && throwable.getMessage().contains("not install " + + "app")) { + String name = "微信"; + if (type == 1) { + name = "微信"; + } else if (type == 2) { + name = "微博"; + } else { + name = "QQ"; + } + ToastUtils.showShort("您还未安装" + name); + } + } + + @Override + public void onCancel(Platform platform, int i) { + LogUtils.e("cancel"); + } + }); + } + } + + /** + * 加载文章新闻 + */ + private void createWebView(NewsDetailBean b) { + mWvContent.setVisibility(View.VISIBLE); + WebSettings settings = mWvContent.getSettings(); + settings.setCacheMode(WebSettings.LOAD_DEFAULT); + settings.setAppCacheEnabled(true); +// settings.setJavaScriptCanOpenWindowsAutomatically(true); +// settings.setBuiltInZoomControls(false);//显示放大缩小按钮(不支持已经适配好移动端的页面) + settings.setJavaScriptEnabled(true);//启用JS +// settings.setUseWideViewPort(true); //双击缩放 + settings.setBlockNetworkImage(true);//阻塞页面图片加载 + settings.setDomStorageEnabled(true); +// settings.setLoadsImagesAutomatically(true); +// settings.setAllowFileAccess(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + } + String data = b.getNewsContentContent(); + mWvContent.loadData(data, "text/html", "utf-8"); + mWvContent.setWebViewClient(new WebViewClient() { + @Override + public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { + handler.proceed(); + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + mContentSkeleton.hide(); + view.getSettings().setBlockNetworkImage(false);//开启页面图片加载 + runOnUiThread(() -> mWvContent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT))); + } + + @Override + public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { + super.onReceivedHttpAuthRequest(view, handler, host, realm); + + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (url.contains(BaseUrlApi.BASE_SYSTEM_IP + "news/route/file/download/true")) { + //TODO 数图资源 + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_PDF) + .withString("title", mTitle) + .withString("url", url) + .navigation(); + } else { + view.loadUrl(url); + } + return true; + } + }); + mWvContent.setWebChromeClient(new WebChromeClient() { + + @Override + public boolean onJsAlert(WebView view, String url, String message, JsResult result) { + return super.onJsAlert(view, url, message, result); + } + }); + } + + /** + * 加载音频新闻 + */ + private void createAudioView() { + + } + + /** + * 加载视频新闻 + */ + private void createVideoView() { + + } + + /** + * 加载图片新闻 + */ + private void createImgView(NewsDetailBean b) { + mRlImg.setVisibility(View.VISIBLE); + List mBannerList = new ArrayList<>(); + for (int i = 0; i < b.getFileList().size(); i++) { + NewsDetailBean.FileListBean fileListBean = b.getFileList().get(i); + BaseImageBean bannerBean = new BaseImageBean(); +// bannerBean.setPhoto(BaseUrlApi.BASE_NEWS_IMG_URL + fileListBean.getContentFileFileId()); + if (i / 2 == 0) { +// bannerBean.setPhoto(BaseUrlApi.BASE_NEWS_IMG_URL + fileListBean.getContentFileFileId()); + bannerBean.setImgUrl("https://lmg.jj20.com/up/allimg/tp08/46042223542701-lp.jpg"); + } else { + bannerBean.setImgUrl("https://www.ssfiction.com/wp-content/uploads/2020/08/20200805_5f2b1669e9a24.jpg"); + } + bannerBean.setName(fileListBean.getContentFileText()); + mBannerList.add(bannerBean); + } + BannerImageTextAllAdapter mBannerImageAdapter = new BannerImageTextAllAdapter(mBannerList); + mBnImg.setAdapter(mBannerImageAdapter); + mBnImg.setPageTransformer(new ScaleInTransformer()); + mBnImg.setDelayTime(10000L); + mBnImg.start(); + } + + /** + * 收藏新闻 + * + * @param nId + */ + private void doCollect(String nId) { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "收藏中..."); + dialog.show(); + CollectBean bean = new CollectBean(); + bean.setNewsContentId(nId); + Gson gson = new Gson(); + String obj = gson.toJson(bean); + RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), obj); + RetrofitManager.getInstance() + .create(HomeApi.class) + .doCollectNews(body, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseUserBean baseUserBean) { + dialog.dismiss(); + ToastUtils.showShort("收藏成功"); + if ("0".equals(mIsCollect)) { + //未收藏 + mIvCollect.setImageResource(R.drawable.ic_collect_check); + } else { + //已经搜藏 + mIvCollect.setImageResource(R.drawable.ic_collect); + } + } + + @Override + public void onError(Throwable e) { + dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + + /** + * 删除自己的评论 + * + * @param bean + * @param pos + */ + private void doDelComment(CommentListBean.RowsBean bean, int pos) { + new AlertDialog.Builder(mActivity) + .setMessage("确定要删除这条评论吗?") + .setTitle("提示") + .setPositiveButton("确定", (dialog, which) -> { + dialog.dismiss(); + ProgressDialog pDialog = UIUtil.initDialog(mActivity, "删除中..."); + pDialog.show(); + RetrofitManager.getInstance() + .create(HomeApi.class) + .doDelComment(bean.getNewsCommentId(), UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseUserBean baseUserBean) { + pDialog.dismiss(); + mCommentDatas.remove(pos); + mAdapter.notifyItemRemoved(pos); + } + + @Override + public void onError(Throwable e) { + pDialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + }) + .setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create().show(); + } + + + private void doCommentItem(CommentListBean.RowsBean bean, int pos, View v) { + showItemCommentDialog(bean, pos, v); + } + + private void showItemCommentDialog(CommentListBean.RowsBean bean, int pos, View v) { + mItemCommentDialog = new ButtomCommentListDialogView.DialogBuilder(mActivity) + .setCommentBean(bean) + .setIscancelable(true) + .setActivity(NewsLocalDetailActivity.this) + .setIsShowOther(true) + .setIsShowImg(mIsCommentImg) + .setIsBackCancelable(true) + .setAdapter(mAdapter) + .setPosition(pos) + .build(); + mItemCommentDialog.show(); + } + + /** + * 点赞 + * + * @param rowsBean + * @param pos + */ + private void doLike(CommentListBean.RowsBean rowsBean, int pos) { + LikeBean bean = new LikeBean(); + bean.setNewsCommentId(rowsBean.getNewsCommentId()); + Gson gson = new Gson(); + String obj = gson.toJson(bean); + RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), obj); + RetrofitManager.getInstance() + .create(HomeApi.class) + .doSaveLike(body, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + mLikeDisposable = d; + } + + @Override + public void onNext(BaseUserBean baseUserBean) { + if (TextUtils.isEmpty(rowsBean.getCommentLikeStatus())) { + //之前未点赞 + rowsBean.setCommentLikeStatus("1"); + rowsBean.setCommentLikeCount(rowsBean.getCommentLikeCount() + 1); + } else { + if ("0".equals(rowsBean.getCommentLikeStatus())) { + //之前未点赞 + rowsBean.setCommentLikeStatus("1"); + rowsBean.setCommentLikeCount(rowsBean.getCommentLikeCount() + 1); + } else { + //之前点赞了 + rowsBean.setCommentLikeStatus("0"); + rowsBean.setCommentLikeCount(rowsBean.getCommentLikeCount() - 1); + } + } + mAdapter.setItemData(pos); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 加载更多 + */ + private void loadMoreData() { + if (mCommentDatas.size() < mCommentTotalSize) { + ++mCommentPage; + if (!TextUtils.isEmpty(UserLgUtils.getToken())) { + getCommentListByLogin(mCommentPage); + } else { + getCommentList(mCommentPage); + } + } else { + mSrlContent.setNoMoreData(true); + } + } + + /** + * 获取评论列表 + * + * @param page + */ + private void getCommentList(int page) { + RetrofitManager.getInstance() + .create(HomeApi.class) + .getCommentList(page + "", mNId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + mDisposable = d; + } + + @Override + public void onNext(CommentListBean list) { + mCommentTotalSize = list.getTotal(); + if (page == 1) { + if (list.getRows() != null && list.getRows().size() > 0) { + refreshView(STATE_LOAD_SUCCESS); + mCommentDatas = list.getRows(); + mAdapter.setData(mCommentDatas); + } else { + refreshView(STATE_LOAD_SUCCESS); + } + } else { + if (list.getRows() != null && list.getRows().size() > 0) { + mCommentDatas.addAll(list.getRows()); + mAdapter.setData(mCommentDatas); + mSrlContent.finishLoadMore(); + mSrlContent.setNoMoreData(false); + } else { + mSrlContent.setNoMoreData(true); + } + } + } + + @Override + public void onError(Throwable e) { + if (page == 1) { + //TODO 第一次加载 +// refreshViewByState(ERROR); + } else { + mSrlContent.finishRefresh(); + mSrlContent.finishLoadMore(); + } + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 获取登录后的评论列表 + * + * @param page + */ + private void getCommentListByLogin(int page) { + RetrofitManager.getInstance() + .create(HomeApi.class) + .getCommentListByLogin(page + "", mNId, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + mDisposable = d; + } + + @Override + public void onNext(CommentListBean list) { + mCommentTotalSize = list.getTotal(); + if (page == 1) { + if (list.getRows() != null && list.getRows().size() > 0) { + refreshView(STATE_LOAD_SUCCESS); + mCommentDatas = list.getRows(); + mAdapter.setData(mCommentDatas); + } else { + refreshView(STATE_LOAD_SUCCESS); + } + } else { + if (list.getRows() != null && list.getRows().size() > 0) { + mCommentDatas.addAll(list.getRows()); + mAdapter.setData(mCommentDatas); + mSrlContent.finishLoadMore(); + mSrlContent.setNoMoreData(false); + } else { + mSrlContent.setNoMoreData(true); + } + } + } + + @Override + public void onError(Throwable e) { + if (page == 1) { + //TODO 第一次加载 +// refreshViewByState(ERROR); + } else { + mSrlContent.finishRefresh(); + mSrlContent.finishLoadMore(); + } + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + protected void onStart() { + super.onStart(); + mCommentPage = 1; + if (!TextUtils.isEmpty(UserLgUtils.getToken())) { + getCommentListByLogin(mCommentPage); + } else { + getCommentList(mCommentPage); + } + } + + /** + * 显示评论dialog + */ + private void showCommentDialog() { + if (mCommentView != null) { + mCommentView.show(); + } else { + mCommentView = new ButtomDialogCommentView.DialogBuilder(mActivity) + .setIsBackCancelable(true) + .setIscancelable(true) + .setIsShowPhoto(mIsCommentImg) + .build(); + mCommentView.addOnChoseListener(new ButtomDialogCommentView.OnChoseListener() { + @Override + public void chosePhoto() { + showSelectPhoto(new AddPhotoBean()); + } + + @Override + public void choseGif() { + + } + + @Override + public void choseEmoji() { + + } + + @Override + public void loginOut() { + + } + + @Override + public void changePwd(String content) { + publishComment(content); + } + + @Override + public void removeImg() { + + } + + @Override + public void showImg(AddPhotoBean bean) { + + } + }); + mCommentView.show(); + } + + } + + /** + * 评论 + * + * @param content + */ + private void publishComment(String content) { + CommentPublishBean bean = new CommentPublishBean(); + if (mCurrentBean != null) { + bean.setCommentContentFile(mCurrentBean.getId()); + } + if (!TextUtils.isEmpty(UserLgUtils.getLocationLat()) && !TextUtils.isEmpty(UserLgUtils.getLocationLng())) { + bean.setCommentLat(Double.parseDouble(UserLgUtils.getLocationLat())); + bean.setCommentLng(Double.parseDouble(UserLgUtils.getLocationLng())); + bean.setCommentAddress(UserLgUtils.getLocationDistrict()); + } else { + bean.setCommentLat(0); + bean.setCommentLng(0); + bean.setCommentAddress(""); + } + bean.setCommentContent(content); + bean.setNewsContentId(mNId); + Gson gson = new Gson(); + String obj = gson.toJson(bean); + RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), obj); + RetrofitManager.getInstance() + .create(HomeApi.class) + .doSaveComment(body, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseUserBean successBean) { + CommentListBean.RowsBean rowsBean = new CommentListBean.RowsBean(); + rowsBean.setNewsCommentId(successBean.getData()); + rowsBean.setNewsContentId(mNId); + rowsBean.setCommentContent(content); + rowsBean.setGmtCreate(TimeUtils.getNowString()); + rowsBean.setGmtCreateText("刚刚"); + rowsBean.setCommentUserName(UserLgUtils.getName()); + rowsBean.setCommentLikeCount(0); + rowsBean.setCreator(UserLgUtils.getUserId()); + if (mCurrentBean != null) { + rowsBean.setCommentContentFile(mCurrentBean.getId()); + } + rowsBean.setCommentUserIcon(UserLgUtils.getAvatar()); + if (!TextUtils.isEmpty(UserLgUtils.getLocationAddress())) { + rowsBean.setCommentAddress(UserLgUtils.getLocationDistrict()); + } else { + rowsBean.setCommentAddress(""); + } + mCommentDatas.add(0, rowsBean); + mAdapter.setData(mCommentDatas); + mCurrentBean = null; + mCommentView.removePhotoBean(); + ToastUtils.showShort("评论成功"); + } + + @Override + public void onError(Throwable e) { + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK) { + switch (requestCode) { + case BaseUrlApi.CAMERA_REQUEST://相机 + uploadImg(mPicPath, 1); + break; + case BaseUrlApi.PHOTO_REQUEST://相册 + try { + if (data == null) return; + Uri uri = data.getData(); + String[] proj = {MediaStore.Images.Media.DATA}; + Cursor cursor = managedQuery(uri, proj, null, null, null); + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + String srcPath = cursor.getString(column_index); + showSoftKeyBoardDialog(mCommentView.mEtComment); + uploadImg(srcPath, 2); + } catch (Exception e) { + e.printStackTrace(); + } + break; + case BaseUrlApi.CAMERA_REQUEST_DIALOG: + String picPath = mItemCommentDialog.getPicPath(); + uploadImg(picPath, 3); + break; + case BaseUrlApi.PHOTO_REQUEST_DIALOG: + try { + if (data == null) return; + Uri uri = data.getData(); + String[] proj = {MediaStore.Images.Media.DATA}; + Cursor cursor = managedQuery(uri, proj, null, null, null); + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + String srcPath = cursor.getString(column_index); + uploadImg(srcPath, 4); + } catch (Exception e) { + e.printStackTrace(); + } + break; + } + } + super.onActivityResult(requestCode, resultCode, data); + } + + /** + * 上传文件 + * + * @param picPath + */ + private void uploadImg(String picPath, int src) { + File file = new File(picPath); + if (!file.exists()) { + showToast("图片路径错误."); + return; + } + ProgressDialog progressDialog = UIUtil.initDialog(mActivity, "正在上传..."); + progressDialog.show(); + Luban.with(mActivity) + .load(picPath) + .ignoreBy(100) + .setTargetDir(PathConfig.CATCH_PATH) + .filter(path -> !(TextUtils.isEmpty(path) || path.toLowerCase().endsWith(".gif"))) + .setCompressListener(new OnCompressListener() { + @Override + public void onStart() { + + } + + @Override + public void onSuccess(File file) { + RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); + MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), + requestFile); + RetrofitManager.getInstance() + .create(HomeApi.class) + .uploadImage(body, UserLgUtils.getToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseUserBean baseUserBean) { + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + ToastUtils.showShort("上传成功"); + if (src == 2 || src == 1) { + mCurrentBean.setId(baseUserBean.getData()); + mCommentView.setPhotoBean(mCurrentBean); + } else { + AddPhotoBean selePhotoBean = mItemCommentDialog.getSelePhotoBean(); + selePhotoBean.setId(baseUserBean.getData()); + mItemCommentDialog.refreshItemPhoto(selePhotoBean); + } + } + + @Override + public void onError(Throwable e) { + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + ToastUtils.showShort("上传失败,请稍后重试."); + if (file.exists()) { + file.delete(); + } + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + public void onError(Throwable e) { + if (progressDialog.isShowing()) { + progressDialog.dismiss(); + } + ToastUtils.showShort("图片上传失败,请稍后重试"); + } + }) + .launch(); + } + + /** + * 显示选择图片 + * + * @param bean + */ + private void showSelectPhoto(AddPhotoBean bean) { + ButtomDialogView buttomDialogView = new ButtomDialogView.DialogBuilder(mActivity) + .setIsBackCancelable(true) + .setIscancelable(true) + .setShowLocation(Gravity.BOTTOM) + .setIsShowFile(false) + .build(); + buttomDialogView.addOnChoseListener(new ButtomDialogView.OnChoseListener() { + @Override + public void choseFile() { + } + + @Override + public void choseAlbum() { + mCurrentBean = bean; + Intent intent = new Intent(Intent.ACTION_PICK, null); + intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + "image/*"); + startActivityForResult(intent, BaseUrlApi.PHOTO_REQUEST); + buttomDialogView.dismiss(); + } + + @Override + public void choseShoot() { + mCurrentBean = bean; + mPicPath = PathConfig.CATCH_PATH + System.currentTimeMillis() + ".jpg"; + File file = new File(mPicPath); + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + // 下面这句指定调用相机拍照后的照片存储的路径 + Uri uri; + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + uri = Uri.fromFile(file); + } else { + uri = FileProvider.getUriForFile(mActivity, ProiderUtil.getFileProviderName(mActivity), file); + } + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); + startActivityForResult(intent, BaseUrlApi.CAMERA_REQUEST); + buttomDialogView.dismiss(); + } + + @Override + public void loginOut() { + + } + + @Override + public void changePwd() { + + } + }); + buttomDialogView.show(); + } + + @Override + protected void onDestroy() { + mContentView = null; + if (mBind != null) { + mBind.unbind(); + } + super.onDestroy(); + } +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java index 9f50333..d611b99 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java @@ -12,6 +12,8 @@ import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.bumptech.glide.Glide; import com.google.android.material.tabs.TabLayout; import com.sucstepsoft.cm_utils.constant.PathConfig; import com.sucstepsoft.cm_utils.core.retrofit_net.RetrofitManager; @@ -59,6 +61,16 @@ public class NewsMainActivity extends BaseActivity { mPId = getIntent().getStringExtra("pId"); refreshView(STATE_LOAD_LOADING); mTvBaseTitle.setText(mTitle); + mLlImg.setVisibility(View.VISIBLE); + Glide.with(mActivity) + .load(R.drawable.ic_search_icon_white) + .into(mIvInto); + mIvInto.setOnClickListener(v -> ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_SEARCH) + .withString("id", mId) + .withBoolean("isTab", true) + .navigation()); + getNewsTabs(); } @@ -83,8 +95,8 @@ public class NewsMainActivity extends BaseActivity { if (newsTabBeans != null && newsTabBeans.size() > 0) { NewsTabBean allBean = new NewsTabBean(); allBean.setDirectoriesName("全部"); - allBean.setNewsDirectoriesId(""); - allBean.setDirectoriesParentId(mPId); + allBean.setNewsDirectoriesId(mId); + allBean.setDirectoriesParentId(mId); allBean.setDirectoriesView("2"); newsTabBeans.add(0, allBean); mTabs = newsTabBeans; @@ -92,6 +104,7 @@ public class NewsMainActivity extends BaseActivity { Bundle bundle = new Bundle(); bundle.putString("type", newsTabBeans.get(i).getNewsDirectoriesId()); bundle.putString("pId", ""); + bundle.putBoolean("isAll", "全部".equals(newsTabBeans.get(i).getDirectoriesName())); BaseFragment fragment = null; //0 外部链接 1存在子集 2没有子集 if ("0".equals(newsTabBeans.get(i).getDirectoriesView())) { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java new file mode 100644 index 0000000..168f925 --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java @@ -0,0 +1,316 @@ +package com.tengshisoft.mudulemain.cultural.activitys.news; + +import android.text.TextUtils; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.ImageView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.gyf.immersionbar.ImmersionBar; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.sucstepsoft.cm_utils.constant.PathConfig; +import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; +import com.sucstepsoft.cm_utils.core.retrofit_net.RetrofitManager; +import com.sucstepsoft.cm_utils.core.widget.base.BaseActivity; +import com.sucstepsoft.cm_utils.core.widget.views.CustomStateView; +import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.sucstepsoft.cm_utils.utils.toast.ToastUtils; +import com.tengshisoft.mudulemain.R; +import com.tengshisoft.mudulemain.R2; +import com.tengshisoft.mudulemain.cultural.adapter.NewsAdapter; +import com.tengshisoft.mudulemain.cultural.adapter.NewsTabAdapter; +import com.tengshisoft.mudulemain.cultural.beans.NewsItemBean; +import com.tengshisoft.mudulemain.cultural.beans.NewsTabBean; +import com.tengshisoft.mudulemain.cultural.net.HomeApi; +import com.tengshisoft.mudulemain.cultural.utils.ExceptionHandler; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +/** + * 搜索新闻 + */ +@Route(path = PathConfig.PATH_MODULE_MAIN_NEWS_SEARCH) +public class NewsSearchActivity extends BaseActivity { + @BindView(R2.id.iv_search_back) + ImageView mIvSearchBack; + @BindView(R2.id.et_search_content) + EditText mEtSearchContent; + @BindView(R2.id.tv_search_btn) + TypeFaceTextView mTvSearchBtn; + @BindView(R2.id.srl_content) + SmartRefreshLayout mSrlContent; + @BindView(R2.id.rlv_content) + RecyclerView mRlvContent; + @BindView(R2.id.csv_state) + CustomStateView mCsvState; + @BindView(R2.id.rlv_tab) + RecyclerView mRlvTab; + private String mId;//新闻类型ID; + private String mKeywords = "";//搜索的关键字 + private int mCurrentPage = 1; + private List mDatas = new ArrayList<>(); + private NewsAdapter mAdapter; + private boolean mIsTab; + private NewsTabAdapter mTabAdapter; + private List mTabs = new ArrayList<>(); + private int mSearchCount = 1; + private NewsTabBean mCurrentTab; + + @Override + protected int setLayoutId() { + return R.layout.activity_news_search; + } + + @Override + public void initData() { + ButterKnife.bind(this); + mRlTitleBar.setVisibility(View.GONE); + mRlTitleBar1.setVisibility(View.GONE); + ImmersionBar.with(this) + .transparentStatusBar() + .statusBarDarkFont(true) + .fullScreen(true) + .init(); + refreshView(STATE_LOAD_SUCCESS); + mTvSearchBtn.setVisibility(View.GONE); + mId = getIntent().getStringExtra("id"); + //是否有下级目录 + mIsTab = getIntent().getBooleanExtra("isTab", false); + mIvSearchBack.setOnClickListener(v -> finish()); + mCsvState.setState(CustomStateView.STATE_SEARCH); + mEtSearchContent.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + mKeywords = mEtSearchContent.getText().toString().trim(); + hideSoftKeyboard(); + if (TextUtils.isEmpty(mKeywords)) { + ToastUtils.show("请输入要查询的内容"); + } else { + doSaveKeywords(); + if (mIsTab && mSearchCount == 1) { + mSearchCount = 2; + getNewsTab(); + } else { + doRefreshList(1); + } + return true; + } + } + return false; + }); + mAdapter = new NewsAdapter(mActivity, mDatas); + mRlvContent.setLayoutManager(new LinearLayoutManager(mActivity)); + mRlvContent.setAdapter(mAdapter); + mAdapter.addOnItemClickByType(this::showNewsDetail); + mTabAdapter = new NewsTabAdapter(mActivity, mTabs); + mRlvTab.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.HORIZONTAL, false)); + mRlvTab.setAdapter(mTabAdapter); + mTabAdapter.addOnItemClickListener(newsTabBean -> { + mCurrentTab = newsTabBean; + for (int i = 0; i < mTabs.size(); i++) { + NewsTabBean tabBean = mTabs.get(i); + if (tabBean.getDirectoriesName().equals(newsTabBean.getDirectoriesName())) { + tabBean.setCheck(true); + } else { + tabBean.setCheck(false); + } + } + mTabAdapter.setData(mTabs); + doSaveKeywords(); + doRefreshList(1); + }); + mSrlContent.setOnRefreshListener(refreshLayout -> doRefreshList(2)); + mSrlContent.setOnLoadMoreListener(refreshLayout -> doLoadMore()); + } + + /** + * 显示新闻详情 + * + * @param rowsBean + * @param type + */ + private void showNewsDetail(NewsItemBean.RowsBean rowsBean, int type) { + String url = ""; + if ("6".equals(rowsBean.getNewsContentType())) { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) + .withString("title", rowsBean.getNewsContentTitle()) + .withString("url", rowsBean.getNewsContentContent()) + .navigation(); + } else { + int newsType = 0; + if (type == 1) { + //1自定义列表 + //3列表详情 + if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { + //列表 + url = rowsBean.getTemplateRecordUrl(); + newsType = 0; + } else { + //内容 + url = rowsBean.getNewsConfigDescriptionText(); + newsType = 1; + } + } else { + newsType = 0; + url = rowsBean.getTemplateRecordUrl(); + } + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) //TODO 连接 +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE)//TODO 接口方式 + .withString("id", rowsBean.getNewsContentId()) + .withString("url", url) + .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 + .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 + .withString("isCollect", rowsBean.getNewsContentCollectStatus()) + .withString("photo", + BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) + .withString("title", rowsBean.getNewsContentTitle()) + .withInt("type", newsType) + .navigation(); + } + } + + /** + * 获取二级目录 + */ + private void getNewsTab() { + RetrofitManager.getInstance() + .create(HomeApi.class) + .getNewsTabListByPid(mId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + } + + @Override + public void onNext(List newsTabBeans) { + if (newsTabBeans != null && newsTabBeans.size() > 0) { + NewsTabBean b = new NewsTabBean(); + b.setDirectoriesName("全部"); + b.setCheck(true); + mCurrentTab = b; + mTabs.add(b); + mTabs.addAll(newsTabBeans); + mTabAdapter.setData(mTabs); + doRefreshList(1); + } + } + + @Override + public void onError(Throwable e) { + doRefreshList(1); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 保存查询的关键字 + */ + private void doSaveKeywords() { + String params = String.format(getResources().getString(R.string.big_data_str), "QUERY", mKeywords, "END"); + bigDataRead(params); + } + + /** + * 刷新列表 + */ + private void doRefreshList(int i) { + mCurrentPage = 1; + mDatas.clear(); + if (i == 1) { + mCsvState.setState(CustomStateView.STATE_LOAD); + } + mAdapter.setData(mDatas); + if (mIsTab) { + if ("全部".equals(mCurrentTab.getDirectoriesName())) { + getNewsList("", mId); + } else { + getNewsList(mCurrentTab.getNewsDirectoriesId(), ""); + } + } else { + getNewsList("", mId); + } + } + + + /** + * 加载更多 + */ + private void doLoadMore() { + ++mCurrentPage; + if (mIsTab) { + if ("全部".equals(mCurrentTab.getDirectoriesName())) { + getNewsList("", mId); + } else { + getNewsList(mCurrentTab.getNewsDirectoriesId(), ""); + } + } else { + getNewsList("", mId); + } + } + + + private void getNewsList(String id, String pId) { + RetrofitManager.getInstance() + .create(HomeApi.class) + .getNewsList(id, pId, mCurrentPage + "", "10", mKeywords) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(NewsItemBean newsItemBean) { + mDatas.addAll(newsItemBean.getRows()); + mAdapter.setData(mDatas); + mSrlContent.finishRefresh(); + mSrlContent.finishLoadMore(); + if (newsItemBean.getRows().size() > 0) { + mCsvState.setState(CustomStateView.STATE_SUCCESS); + } else { + if (mCurrentPage == 1) { + mCsvState.setState(CustomStateView.STATE_EMPTY); + } + mSrlContent.setNoMoreData(true); + } + + } + + @Override + public void onError(Throwable e) { + ExceptionHandler.handleException(e); + mCsvState.setState(CustomStateView.STATE_ERROR); + mSrlContent.finishLoadMore(); + mSrlContent.finishRefresh(); + } + + @Override + public void onComplete() { + + } + }); + } +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsTabAdapter.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsTabAdapter.java new file mode 100644 index 0000000..0558d5c --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsTabAdapter.java @@ -0,0 +1,51 @@ +package com.tengshisoft.mudulemain.cultural.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.sucstepsoft.cm_utils.core.widget.base.BaseRecyclerAdapter; +import com.tengshisoft.mudulemain.R; +import com.tengshisoft.mudulemain.cultural.beans.NewsTabBean; +import com.tengshisoft.mudulemain.cultural.holder.NewsTabHolder; + +import java.util.List; + +/** + * 作者: adam + * 日期: 2020/5/15 - 10:00 AM + * 邮箱: itgaojian@163.com + * 描述: + */ +public class NewsTabAdapter extends BaseRecyclerAdapter { + + public NewsTabAdapter(Context ctx, List list) { + super(ctx, list); + } + + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public NewsTabHolder createHolder(ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_tab, parent, false); + return new NewsTabHolder(itemView); + } + + @Override + public void bindHolder(NewsTabHolder funcHolder, int i) { + NewsTabBean tab = mData.get(i); + if (tab.isCheck()) { + funcHolder.mVLine.setVisibility(View.VISIBLE); + } else { + funcHolder.mVLine.setVisibility(View.INVISIBLE); + } + funcHolder.mTvName.setText(tab.getDirectoriesName()); + } + + +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsTabBean.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsTabBean.java index e7fca32..bb4fc49 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsTabBean.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsTabBean.java @@ -41,6 +41,16 @@ public class NewsTabBean { private String directoriesTarget3; private String directoriesView; private String newsDirectoriesId; + private boolean isCheck; + + + public boolean isCheck() { + return isCheck; + } + + public void setCheck(boolean check) { + isCheck = check; + } @Override public String toString() { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java index 35b5684..de5e954 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java @@ -213,7 +213,7 @@ public class HomeFragment extends BaseFragment { } else { if (!TextUtils.isEmpty(bean.getId())) { ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) .withString("id", bean.getId()) .withString("url", bean.getUrl()) .withString("isComment", bean.getIsComment())//是否可以评论 @@ -450,44 +450,45 @@ public class HomeFragment extends BaseFragment { * @param type */ private void showNewsDetail(NewsItemBean.RowsBean rowsBean, int type) { - String url = ""; - if ("6".equals(rowsBean.getNewsContentType())) { - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) - .withString("title", rowsBean.getNewsContentTitle()) - .withString("url", rowsBean.getNewsContentContent()) - .navigation(); - } else { - int newsType = 0; - if (type == 1) { - //1自定义列表 - //3列表详情 - if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { - //列表 - url = rowsBean.getTemplateRecordUrl(); - newsType = 0; - } else { - //内容 - url = rowsBean.getNewsConfigDescriptionText(); - newsType = 1; - } - } else { - newsType = 0; - url = rowsBean.getTemplateRecordUrl(); - } - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) - .withString("id", rowsBean.getNewsContentId()) - .withString("url", url) - .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 - .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 - .withString("isCollect", rowsBean.getNewsContentCollectStatus()) - .withString("photo", - BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) - .withString("title", rowsBean.getNewsContentTitle()) - .withInt("type", newsType) - .navigation(); - } + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) + .withString("id", rowsBean.getNewsContentId()) + .withString("url", "") + .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 + .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 + .withString("isCollect", rowsBean.getNewsContentCollectStatus()) + .withString("photo", + BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) + .withString("title", rowsBean.getNewsContentTitle()) + .withInt("type", -1) + .navigation(); +// String url = ""; +// if ("6".equals(rowsBean.getNewsContentType())) { +// ARouter.getInstance() +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) +// .withString("title", rowsBean.getNewsContentTitle()) +// .withString("url", rowsBean.getNewsContentContent()) +// .navigation(); +// } else { +// int newsType = 0; +// if (type == 1) { +// //1自定义列表 +// //3列表详情 +// if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { +// //列表 +// url = rowsBean.getTemplateRecordUrl(); +// newsType = 0; +// } else { +// //内容 +// url = rowsBean.getNewsConfigDescriptionText(); +// newsType = 1; +// } +// } else { +// newsType = 0; +// url = rowsBean.getTemplateRecordUrl(); +// } +// +// } } private void getBannerData() { @@ -566,7 +567,7 @@ public class HomeFragment extends BaseFragment { private void getNewsList(NewsTabBean newsTabBean, BaseRecyclerAdapter adapter, RecyclerView rlvContent, CustomStateView stateView) { RetrofitManager.getInstance() .create(HomeApi.class) - .getNewsTabListByPid(newsTabBean.getNewsDirectoriesId(), "", "5", "1") + .getNewsTabListByPid("", newsTabBean.getNewsDirectoriesId(), "5", "1") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -878,7 +879,6 @@ public class HomeFragment extends BaseFragment { NewsAdapter adapter = new NewsAdapter(mActivity, tempList); adapter.addOnItemClickByType(this::showNewsDetail); RelativeLayout rlvLayout = new RelativeLayout(mActivity); - rlvLayout.setBackgroundColor(Color.parseColor("#000000")); RelativeLayout.LayoutParams rlvParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlvParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); rlvLayout.setLayoutParams(rlvParams); diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java index 5a4f934..2157fb9 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java @@ -110,44 +110,45 @@ public class NewsFragment extends BaseFragment { } private void showNewsDetail(NewsItemBean.RowsBean rowsBean, int type) { - String url = ""; - if ("6".equals(rowsBean.getNewsContentType())) { - //链接新闻 - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) - .withString("url", rowsBean.getNewsContentContent()) - .withString("title", rowsBean.getNewsContentTitle()) - .navigation(); - } else { - int newsType = 0; - if (type == 1) { - //1自定义列表 - //3列表详情 - if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { - //列表 - url = rowsBean.getTemplateRecordUrl(); - newsType = 0; - } else { - //内容 - url = rowsBean.getNewsConfigDescriptionText(); - newsType = 1; - } - } else { - newsType = 0; - url = rowsBean.getTemplateRecordUrl(); - } - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) - .withString("id", rowsBean.getNewsContentId()) - .withString("url", url) - .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 - .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 - .withString("isCollect", rowsBean.getNewsContentCollectStatus()) - .withString("photo", BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) - .withString("title", rowsBean.getNewsContentTitle()) - .withInt("type", newsType) - .navigation(); - } + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) + .withString("id", rowsBean.getNewsContentId()) + .withString("url", "") + .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 + .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 + .withString("isCollect", rowsBean.getNewsContentCollectStatus()) + .withString("photo", BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) + .withString("title", rowsBean.getNewsContentTitle()) + .withInt("type", -1) + .navigation(); +// String url = ""; +// if ("6".equals(rowsBean.getNewsContentType())) { +// //链接新闻 +// ARouter.getInstance() +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) +// .withString("url", rowsBean.getNewsContentContent()) +// .withString("title", rowsBean.getNewsContentTitle()) +// .navigation(); +// } else { +// int newsType = 0; +// if (type == 1) { +// //1自定义列表 +// //3列表详情 +// if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { +// //列表 +// url = rowsBean.getTemplateRecordUrl(); +// newsType = 0; +// } else { +// //内容 +// url = rowsBean.getNewsConfigDescriptionText(); +// newsType = 1; +// } +// } else { +// newsType = 0; +// url = rowsBean.getTemplateRecordUrl(); +// } +// +// } } private void getNewsListByTypeToken(int page) { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsTabHolder.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsTabHolder.java new file mode 100644 index 0000000..bc7f2e5 --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsTabHolder.java @@ -0,0 +1,21 @@ +package com.tengshisoft.mudulemain.cultural.holder; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.tengshisoft.mudulemain.R; + +public class NewsTabHolder extends RecyclerView.ViewHolder { + public View mVLine; + public TypeFaceTextView mTvName; + + public NewsTabHolder(@NonNull View itemView) { + super(itemView); + mVLine = itemView.findViewById(R.id.v_line); + mTvName = itemView.findViewById(R.id.tv_name); + } +} + diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/net/HomeApi.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/net/HomeApi.java index 71f46a2..9626f3c 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/net/HomeApi.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/net/HomeApi.java @@ -136,7 +136,7 @@ public interface HomeApi { */ @Headers({"base_url_name:news", "Content-Type:application/json", "Accept:application/json", "need_area:true"}) @GET("app/newscontent/listpagenewscontentrelease") - Observable getNewsTabListByPid(@Query("newsDirectoriesId") String pid, @Query("newsDirectoriesParentId") String pId, @Query("rows") String rows, @Query("page") String page); + Observable getNewsTabListByPid(@Query("newsDirectoriesId") String id, @Query("newsDirectoriesParentId") String pId, @Query("rows") String rows, @Query("page") String page); // Observable getNewsTabListByPid(@Query("newsDirectoriesParentId") String pid, @Query("rows") String rows, @Query("page") String page); /** @@ -144,7 +144,18 @@ public interface HomeApi { */ @Headers({"base_url_name:news", "Content-Type:application/json", "Accept:application/json", "need_area:true"}) @GET("app/newscontent/listpagenewscontentrelease") - Observable getNewsList(@Query("newsDirectoriesId") String newsDirectoriesId,@Query("newsDirectoriesParentId")String pId, @Query("page") String page); + Observable getNewsList(@Query("newsDirectoriesId") String newsDirectoriesId, @Query("newsDirectoriesParentId") String pId, @Query("page") String page); + + /** + * 获取新闻列表-不需要token + */ + @Headers({"base_url_name:news", "Content-Type:application/json", "Accept:application/json", "need_area:true"}) + @GET("app/newscontent/listpagenewscontentrelease") + Observable getNewsList(@Query("newsDirectoriesId") String newsDirectoriesId, + @Query("newsDirectoriesParentId") String pId, + @Query("page") String page, + @Query("rows") String rows, + @Query("keywords") String keywords); /** * 获取新闻评论数量,多个新闻ID用下划线隔开(id_id_id) @@ -158,14 +169,16 @@ public interface HomeApi { */ @Headers({"base_url_name:news", "Content-Type:application/json", "Accept:application/json", "need_area:true"}) @GET("app/newscontent/listpagenewscontentrelease") - Observable getMainNewsList(@Query("newsDirectoriesId") String newsDirectoriesId, @Query("newsDirectoriesParentId")String pId,@Query("rows") String rows, @Query("page") String page); + Observable getMainNewsList(@Query("newsDirectoriesId") String newsDirectoriesId, @Query("newsDirectoriesParentId") String pId, @Query("rows") String rows, + @Query("page") String page); /** * 获取新闻列表-需要token */ @Headers({"base_url_name:news", "Content-Type:application/json", "Accept:application/json", "need_area:true"}) @GET("app/newscontent/listpagenewscontent") - Observable getNewsListByToken(@Query("newsDirectoriesId") String newsDirectoriesId, @Query("newsDirectoriesParentId")String pId,@Query("page") String page, @Header("token") String token); + Observable getNewsListByToken(@Query("newsDirectoriesId") String newsDirectoriesId, @Query("newsDirectoriesParentId") String pId, @Query("page") String page, + @Header("token") String token); /** * 获取新闻列表-需要token diff --git a/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..af43ca29b1d5265437cc1696fd399c5cad543b1a GIT binary patch literal 5203 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 DSMJE0 literal 0 HcmV?d00001 diff --git a/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..bc942d54160ac2aa4aa7b0f1ea9913ed88b03d58 GIT binary patch literal 5340 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 Ui^QUZKbL=6>iTL`Dt1x-10|tvQ2+n{ literal 0 HcmV?d00001 diff --git a/modulemain/src/main/res/layout/activity_news_local_detail.xml b/modulemain/src/main/res/layout/activity_news_local_detail.xml new file mode 100644 index 0000000..814c367 --- /dev/null +++ b/modulemain/src/main/res/layout/activity_news_local_detail.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modulemain/src/main/res/layout/activity_news_search.xml b/modulemain/src/main/res/layout/activity_news_search.xml new file mode 100644 index 0000000..76a0786 --- /dev/null +++ b/modulemain/src/main/res/layout/activity_news_search.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modulemain/src/main/res/layout/item_skeleton_news_content_local.xml b/modulemain/src/main/res/layout/item_skeleton_news_content_local.xml new file mode 100644 index 0000000..80a8f0e --- /dev/null +++ b/modulemain/src/main/res/layout/item_skeleton_news_content_local.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modulemain/src/main/res/layout/item_tab.xml b/modulemain/src/main/res/layout/item_tab.xml new file mode 100644 index 0000000..fbd6ede --- /dev/null +++ b/modulemain/src/main/res/layout/item_tab.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/modulemine/src/main/res/layout/activity_new_mine_info_edit.xml b/modulemine/src/main/res/layout/activity_new_mine_info_edit.xml index 0dfc5ea..bc397c5 100644 --- a/modulemine/src/main/res/layout/activity_new_mine_info_edit.xml +++ b/modulemine/src/main/res/layout/activity_new_mine_info_edit.xml @@ -29,6 +29,12 @@ android:hint="请输入昵称" /> + @@ -42,6 +48,13 @@ android:hint="请输入邮箱" /> + + + + + + + + + + + + + + + + + + @@ -151,6 +220,13 @@ android:hint="请输入QQ号" /> + + + + + + + + + + + @@ -224,6 +334,13 @@ android:hint="请选择学历" /> + + + + + + @@ -42,6 +49,13 @@ android:hint="未录入" /> + + + + + + + + + + + + + + + + + @@ -151,6 +220,13 @@ android:hint="未录入" /> + + + + + + + + + + + @@ -224,6 +334,13 @@ android:hint="未录入" /> + + + + - + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp"> - + + + android:layout_marginLeft="5dp" + android:drawableRight="@drawable/ic_arrow_cir" + android:text="个人信息" + android:textSize="15sp" /> + - + - - - - - + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp"> - + + + android:layout_marginLeft="5dp" + android:drawableRight="@drawable/ic_arrow_cir" + android:text="重新绑定手机" + android:textSize="15sp" /> + - + - - - - + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp" + android:visibility="gone"> - + android:src="@drawable/ic_change_pwd" /> - - - - - + + - + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp" + android:visibility="gone"> - + android:src="@drawable/ic_clear_cache" /> - + + - - - - + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp"> - + android:layout_centerVertical="true" + android:src="@drawable/ic_check_update" /> - + - - - - - + +