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 0000000..1d2cd5e Binary files /dev/null and b/cm_utils/src/main/res/drawable-xhdpi/ic_search_icon_white.png differ 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 0000000..3b3c1f7 Binary files /dev/null and b/cm_utils/src/main/res/drawable-xhdpi/link.png differ 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 0000000..af43ca2 Binary files /dev/null and b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png differ 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 0000000..bc942d5 Binary files /dev/null and b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png differ 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" /> - + - - - - - + +