Commit 504e526c authored by linfeng's avatar linfeng

bug修复

parent fd710453
...@@ -59,4 +59,6 @@ public final class Constance { ...@@ -59,4 +59,6 @@ public final class Constance {
public static final String ACTIVITY_URL_SELECTSHOP="/main/home/SelectShopActivity"; public static final String ACTIVITY_URL_SELECTSHOP="/main/home/SelectShopActivity";
public static final String ACTIVITY_URL_PATGENERATEPOSTER="/discovery/other/PatGeneratePosterActivity"; public static final String ACTIVITY_URL_PATGENERATEPOSTER="/discovery/other/PatGeneratePosterActivity";
public static final String ACTIVITY_URL_POSTERACTIVITY="/poster/plugin/PosterActivity";
} }
...@@ -19,6 +19,15 @@ android { ...@@ -19,6 +19,15 @@ android {
} }
} }
// javaCompileOptions {
//
// annotationProcessorOptions {
//
// arguments = [moduleName: project.getName()]
//
// }
// }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
......
...@@ -131,7 +131,6 @@ public class MainActivity extends BaseActivity<CommonPresenter> { ...@@ -131,7 +131,6 @@ public class MainActivity extends BaseActivity<CommonPresenter> {
} }
@Override @Override
public void onShowResult(int requestType, BaseBean result) { public void onShowResult(int requestType, BaseBean result) {
switch (requestType) { switch (requestType) {
...@@ -250,7 +249,9 @@ public class MainActivity extends BaseActivity<CommonPresenter> { ...@@ -250,7 +249,9 @@ public class MainActivity extends BaseActivity<CommonPresenter> {
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
mAdapter.getCurrentFragment().onActivityResult(requestCode, resultCode, data); if (mAdapter != null) {
mAdapter.getCurrentFragment().onActivityResult(requestCode, resultCode, data);
}
} }
......
...@@ -4,4 +4,6 @@ public interface CommonApi extends RvFrameConfig{ ...@@ -4,4 +4,6 @@ public interface CommonApi extends RvFrameConfig{
//行为记录保存 //行为记录保存
public static String RVENTHUSIAST_APP_UNAUTH_SAVE =RvFrameConfig.HOST + "/api/user/behavior/customerBehaviorNotes/app/unauth/save"; public static String RVENTHUSIAST_APP_UNAUTH_SAVE =RvFrameConfig.HOST + "/api/user/behavior/customerBehaviorNotes/app/unauth/save";
String TOUR_SENDMESSAGE = RvFrameConfig.HOST + "/api/universal/message/sendMessage"; // 分享积分
} }
...@@ -46,7 +46,8 @@ public class CommonPresenter extends MvpPresenter { ...@@ -46,7 +46,8 @@ public class CommonPresenter extends MvpPresenter {
customerid = OkGoUtil.getYkId(); customerid = OkGoUtil.getYkId();
customertype = "1"; customertype = "1";
} }
postBodyData2(RvFrameConfig.HOST, CommonApi.RVENTHUSIAST_APP_UNAUTH_SAVE, new SaveOnClick(customertype, customerid, type, typeid), headMap); postBodyData(RvFrameConfig.HOST, 20,CommonApi.RVENTHUSIAST_APP_UNAUTH_SAVE,BaseBean.class, new SaveOnClick(customertype, customerid, type, typeid), headMap,false);
// postBodyData2(RvFrameConfig.HOST, CommonApi.RVENTHUSIAST_APP_UNAUTH_SAVE, new SaveOnClick(customertype, customerid, type, typeid), headMap);
} }
......
...@@ -117,6 +117,10 @@ public class ShareManager extends ShareAction { ...@@ -117,6 +117,10 @@ public class ShareManager extends ShareAction {
} }
public <T extends UMShareListener>void showShareImage2(SHARE_MEDIA share_media, UMImage umImage, T umShareListener){
shareWebContent(share_media,umImage,umShareListener);
}
public void shareWebContent(SHARE_MEDIA share_media, UMWeb umWeb, UMShareListener umShareListener){ public void shareWebContent(SHARE_MEDIA share_media, UMWeb umWeb, UMShareListener umShareListener){
new ShareAction(mActivity).withMedia(umWeb) new ShareAction(mActivity).withMedia(umWeb)
.setPlatform(share_media) .setPlatform(share_media)
......
package com.rv.share.utils; package com.rv.component.utils;
import android.app.Activity;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
...@@ -11,12 +10,6 @@ import android.net.Uri; ...@@ -11,12 +10,6 @@ import android.net.Uri;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import com.rv.share.R;
import com.umeng.socialize.ShareAction;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.media.UMWeb;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
......
package com.rv.share.utils; package com.rv.component.utils;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
......
...@@ -51,6 +51,7 @@ dependencies { ...@@ -51,6 +51,7 @@ dependencies {
api project(':component_control') api project(':component_control')
api project(':component_resource') api project(':component_resource')
api project(':component_dialog') api project(':component_dialog')
api project(':component_utils')
api project(':plugin_poster')
} }
...@@ -88,7 +88,7 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui ...@@ -88,7 +88,7 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui
campAdapter = new CampListAdapter(); campAdapter = new CampListAdapter();
rvContent.setItemAnimator(null); rvContent.setItemAnimator(null);
rvContent.setLayoutManager(new GridLayoutManager(_mActivity, 2)); rvContent.setLayoutManager(new GridLayoutManager(_mActivity, 2));
rvContent.addItemDecoration(new AbSpacesItemDecoration(20,10));// 分割线。 rvContent.addItemDecoration(new AbSpacesItemDecoration(20, 10));// 分割线。
// rvContent.setNestedScrollingEnabled(false); // rvContent.setNestedScrollingEnabled(false);
rvContent.setAdapter(campAdapter); rvContent.setAdapter(campAdapter);
...@@ -117,13 +117,14 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui ...@@ -117,13 +117,14 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui
.build(Constance.ACTIVITY_URL_CAMPDETAIL) .build(Constance.ACTIVITY_URL_CAMPDETAIL)
.withString("id", data.getId()) .withString("id", data.getId())
.withDouble("longitude", lonLongitude) .withDouble("longitude", lonLongitude)
.withDouble("latitude",latLatitude) .withDouble("latitude", latLatitude)
.navigation(); .navigation();
} }
}); });
campAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() { campAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
@Override public void onLoadMoreRequested() { @Override
public void onLoadMoreRequested() {
if (rvContent != null) { if (rvContent != null) {
rvContent.postDelayed(new Runnable() { rvContent.postDelayed(new Runnable() {
@Override @Override
...@@ -176,7 +177,7 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui ...@@ -176,7 +177,7 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui
isOpen = !isOpen; isOpen = !isOpen;
} else if (id == R.id.iv_camp_map) { } else if (id == R.id.iv_camp_map) {
//地图 //地图
startActivity(CampShopShowActivity.getIntent(_mActivity)); startActivity(CampShopShowActivity.getIntent(_mActivity));
} else if (id == R.id.v_shadow) { } else if (id == R.id.v_shadow) {
rvType.setVisibility(View.GONE); rvType.setVisibility(View.GONE);
vShadow.setVisibility(View.GONE); vShadow.setVisibility(View.GONE);
...@@ -311,17 +312,16 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui ...@@ -311,17 +312,16 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui
@Override @Override
public void onRefresh() { public void onRefresh() {
loadDataList(); loadDataList();
} }
public class AbSpacesItemDecoration extends RecyclerView.ItemDecoration { public class AbSpacesItemDecoration extends RecyclerView.ItemDecoration {
private int left; private int left;
private int right; private int right;
public AbSpacesItemDecoration(int left,int right) { public AbSpacesItemDecoration(int left, int right) {
this.left = left; this.left = left;
this.right = right; this.right = right;
} }
...@@ -329,12 +329,12 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui ...@@ -329,12 +329,12 @@ public class CampFragment extends BaseFragment<CampPresenter> implements BaseQui
@Override @Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int childCount = parent.getChildCount(); int childCount = parent.getChildCount();
if ((childCount -1) % 2==0){ if ((childCount - 1) % 2 == 0) {
outRect.left = left; outRect.left = left;
outRect.right = right; outRect.right = right;
outRect.bottom = right; outRect.bottom = right;
outRect.top = right; outRect.top = right;
}else { } else {
outRect.left = right; outRect.left = right;
outRect.right = left; outRect.right = left;
outRect.bottom = right; outRect.bottom = right;
......
...@@ -36,6 +36,24 @@ public class CampDetailsBean extends BaseBean { ...@@ -36,6 +36,24 @@ public class CampDetailsBean extends BaseBean {
private String phone; private String phone;
private double longitude;//": 118.773832, private double longitude;//": 118.773832,
private double latitude;//": 32.031698, private double latitude;//": 32.031698,
private String logo;
private String posterBackground;
public String getPosterBackground() {
return posterBackground;
}
public void setPosterBackground(String posterBackground) {
this.posterBackground = posterBackground;
}
public String getLogo() {
return logo;
}
public void setLogo(String logo) {
this.logo = logo;
}
public String getName() { public String getName() {
return name; return name;
......
package com.rv.camp.camp; package com.rv.camp.camp;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.webkit.JavascriptInterface; import android.webkit.JavascriptInterface;
...@@ -20,8 +23,11 @@ import com.alibaba.android.arouter.facade.annotation.Route; ...@@ -20,8 +23,11 @@ import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter; import com.alibaba.android.arouter.launcher.ARouter;
import com.frame.base.url.Constance; import com.frame.base.url.Constance;
import com.frame.rv.config.RvFrameConfig; import com.frame.rv.config.RvFrameConfig;
import com.ruiwenliu.wrapper.SPConstance;
import com.ruiwenliu.wrapper.base.BaseBean; import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.BaseStatusActivity; import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.util.um.CustomShareListener;
import com.ruiwenliu.wrapper.util.um.ShareManager;
import com.ruiwenliu.wrapper.weight.TitleView; import com.ruiwenliu.wrapper.weight.TitleView;
import com.rv.camp.R; import com.rv.camp.R;
import com.rv.camp.R2; import com.rv.camp.R2;
...@@ -29,6 +35,10 @@ import com.rv.camp.api.CampApi; ...@@ -29,6 +35,10 @@ import com.rv.camp.api.CampApi;
import com.rv.camp.bean.CampDetailsBean; import com.rv.camp.bean.CampDetailsBean;
import com.rv.camp.presenter.CampPresenter; import com.rv.camp.presenter.CampPresenter;
import com.rv.component.control.ProgressWebView; import com.rv.component.control.ProgressWebView;
import com.rv.component.utils.Cookie;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.shareboard.SnsPlatform;
import com.umeng.socialize.utils.ShareBoardlistener;
import com.yuyife.okgo.OkGoUtil; import com.yuyife.okgo.OkGoUtil;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
...@@ -58,8 +68,13 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> { ...@@ -58,8 +68,13 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> {
double longitude; double longitude;
@Autowired() @Autowired()
double latitude; double latitude;
private CampDetailsBean data; private CampDetailsBean data;
private ShareManager shareManager;
private ClipboardManager myClipboard;
private String code;
@Override @Override
protected int setLayout() { protected int setLayout() {
...@@ -72,6 +87,18 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> { ...@@ -72,6 +87,18 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> {
webUrl = CampApi.TRAVEL_CAMPSITEDETAI + "?id=" + id + "&longitude=" + longitude + "&latitude=" + latitude; webUrl = CampApi.TRAVEL_CAMPSITEDETAI + "?id=" + id + "&longitude=" + longitude + "&latitude=" + latitude;
Log.i("CampDetailActivity", "initView: " + webUrl); Log.i("CampDetailActivity", "initView: " + webUrl);
initWeb(); initWeb();
code = Cookie.getStringValue(getApplicationContext(), SPConstance.USER_JSON_CODE, "");
titleView.setImageResource(R.id.iv_title_right, R.drawable.common_icon_rv_rentingcar_icon_share);
titleView.setChildClickListener(R.id.iv_title_right, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (shareManager != null) {
shareManager.open();
}
}
});
} }
...@@ -96,6 +123,9 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> { ...@@ -96,6 +123,9 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> {
private void resultData(CampDetailsBean data) { private void resultData(CampDetailsBean data) {
this.data = data; this.data = data;
if (data != null && data.getData() != null) {
initShare(webUrl + "&shareType=app&code=" + code, data.getData().getName(), " ", data.getData().getLogo());
}
} }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
...@@ -147,10 +177,9 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> { ...@@ -147,10 +177,9 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> {
mWebView.setWebChromeClient(new WebChromeClient() { mWebView.setWebChromeClient(new WebChromeClient() {
@Override @Override
public void onProgressChanged(WebView view, int newProgress) { public void onProgressChanged(WebView view, int newProgress) {
if(newProgress==100){ if (newProgress == 100) {
pbProgress.setVisibility(View.GONE);//加载完网页进度条消失 pbProgress.setVisibility(View.GONE);//加载完网页进度条消失
} } else {
else{
pbProgress.setVisibility(View.VISIBLE);//开始加载网页时显示进度条 pbProgress.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
pbProgress.setProgress(newProgress);//设置进度值 pbProgress.setProgress(newProgress);//设置进度值
} }
...@@ -158,17 +187,11 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> { ...@@ -158,17 +187,11 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> {
}); });
} }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: add setContentView(...) invocation
ButterKnife.bind(this);
}
@OnClick(R2.id.tv_scheduled_camp) @OnClick(R2.id.tv_scheduled_camp)
public void onViewClicked(View view) { public void onViewClicked(View view) {
int id = view.getId(); int id = view.getId();
if (id == R.id.tv_scheduled_camp){ if (id == R.id.tv_scheduled_camp) {
Intent intent = new Intent(Intent.ACTION_DIAL); Intent intent = new Intent(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:" + data.getData().getPhone()); Uri uri = Uri.parse("tel:" + data.getData().getPhone());
intent.setData(uri); intent.setData(uri);
...@@ -235,4 +258,82 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> { ...@@ -235,4 +258,82 @@ public class CampDetailActivity extends BaseStatusActivity<CampPresenter> {
mWebView.destroy();// 生命周期销毁 mWebView.destroy();// 生命周期销毁
} }
/**
* 初始化分享
*/
private void initShare(final String webUrls, final String name, final String content, final String logo) {
shareManager = new ShareManager(this, new ShareBoardlistener() {
@Override
public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
if (snsPlatform.mShowWord.equals("生成海报")) {
if (data.getData() != null) {
String icon = "";
if (TextUtils.isEmpty(data.getData().getPosterBackground())) {
icon = data.getData().getLogo();
} else {
icon = data.getData().getPosterBackground();
}
ARouter.getInstance()
.build(Constance.ACTIVITY_URL_POSTERACTIVITY)
.withString("url", webUrls)
.withString("imageUrl", icon)
.navigation();
}
} else if (snsPlatform.mShowWord.equals("复制链接")) {
copyText();
}
shareManager.showShare(share_media, webUrls, name, content, logo
, new CustomShareListener(mActivity) {
@Override
public void onResult(SHARE_MEDIA platform) {
super.onResult(platform);
if (platform.name().equals("WEIXIN_FAVORITE")) {
showToast(" 收藏成功啦");
} else {
if (platform != SHARE_MEDIA.MORE && platform != SHARE_MEDIA.SMS
&& platform != SHARE_MEDIA.EMAIL
&& platform != SHARE_MEDIA.FLICKR
&& platform != SHARE_MEDIA.FOURSQUARE
&& platform != SHARE_MEDIA.TUMBLR
&& platform != SHARE_MEDIA.POCKET
&& platform != SHARE_MEDIA.PINTEREST
&& platform != SHARE_MEDIA.INSTAGRAM
&& platform != SHARE_MEDIA.GOOGLEPLUS
&& platform != SHARE_MEDIA.YNOTE
&& platform != SHARE_MEDIA.EVERNOTE) {
showToast("分享成功啦");
}
}
}
});
}
}, "rv_um_share_bill", "rv_um_share_copy");
}
/**
* 复制文本
*/
private void copyText() {
if (myClipboard == null) {
myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
}
String code = Cookie.getStringValue(getApplicationContext(), SPConstance.USER_JSON_CODE, "");
ClipData myClip = ClipData.newPlainText("text", webUrl + "&shareType=app&code=" + code);
myClipboard.setPrimaryClip(myClip);
showToast("复制成功!");
}
} }
...@@ -235,6 +235,7 @@ public class PatGeneratePosterActivity extends BaseStatusActivity<PickerPresente ...@@ -235,6 +235,7 @@ public class PatGeneratePosterActivity extends BaseStatusActivity<PickerPresente
c.drawColor(Color.WHITE); c.drawColor(Color.WHITE);
v.layout(startX, startY, w + startX, h + startY); v.layout(startX, startY, w + startX, h + startY);
v.draw(c); v.draw(c);
v.postInvalidate();
return bmp; return bmp;
} }
......
...@@ -54,6 +54,7 @@ dependencies { ...@@ -54,6 +54,7 @@ dependencies {
api project(':plugin_calendar') api project(':plugin_calendar')
api project(':plugin_coupon') api project(':plugin_coupon')
api project(':plugin_carpurchase') api project(':plugin_carpurchase')
api project(':plugin_poster')
api project(':RvWrapper') api project(':RvWrapper')
// api project(':RvTravel') // api project(':RvTravel')
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
......
...@@ -361,12 +361,9 @@ public class CarDetailActivity extends BaseStatusActivity<CommonPresenter> { ...@@ -361,12 +361,9 @@ public class CarDetailActivity extends BaseStatusActivity<CommonPresenter> {
} }
ARouter.getInstance() ARouter.getInstance()
.build(Constance.ACTIVITY_URL_SHAREIMAGE) .build(Constance.ACTIVITY_URL_POSTERACTIVITY)
.withString("icon", icon)
.withString("name", mCarBean.getVehicleModel().getName())
.withString("keyword", mCarBean.getVehicleModel().getKeyword())
.withDouble("price", mCarBean.getVehicleModel().getPrice())
.withString("url", url) .withString("url", url)
.withString("imageUrl", icon)
.navigation(); .navigation();
} else if (snsPlatform.mShowWord.equals("复制链接")) { } else if (snsPlatform.mShowWord.equals("复制链接")) {
...@@ -460,7 +457,7 @@ public class CarDetailActivity extends BaseStatusActivity<CommonPresenter> { ...@@ -460,7 +457,7 @@ public class CarDetailActivity extends BaseStatusActivity<CommonPresenter> {
myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
} }
String code = Cookie.getStringValue(getApplicationContext(), SPConstance.USER_JSON_CODE, ""); String code = Cookie.getStringValue(getApplicationContext(), SPConstance.USER_JSON_CODE, "");
ClipData myClip = ClipData.newPlainText("text", webUrl+ "&shareType=app&code=" + code); ClipData myClip = ClipData.newPlainText("text", webUrl + "&shareType=app&code=" + code);
myClipboard.setPrimaryClip(myClip); myClipboard.setPrimaryClip(myClip);
showToast("复制成功!"); showToast("复制成功!");
} }
......
...@@ -272,7 +272,9 @@ public class CarRentalListActivity extends BaseStatusActivity<CommonPresenter> i ...@@ -272,7 +272,9 @@ public class CarRentalListActivity extends BaseStatusActivity<CommonPresenter> i
map.put("limit", 10); map.put("limit", 10);
map.put("lat", mLat); map.put("lat", mLat);
map.put("lon", mLon); map.put("lon", mLon);
map.put("parkBranchCompanyId", dataBean.getStartCompanyId()); // map.put("parkBranchCompanyId", dataBean.getStartCompanyId());
map.put("startCompanyId",dataBean.getStartCompanyId());
map.put("endCompanyId",dataBean.getEndCompanyId());
try { try {
map.put("startDateTamp", TimeManager.dateToStamp(begDate)); map.put("startDateTamp", TimeManager.dateToStamp(begDate));
map.put("endDateTamp", TimeManager.dateToStamp(endDate)); map.put("endDateTamp", TimeManager.dateToStamp(endDate));
......
...@@ -52,6 +52,7 @@ import com.rv.component.utils.DisplayUtil; ...@@ -52,6 +52,7 @@ import com.rv.component.utils.DisplayUtil;
import com.rv.component.utils.LogUtil; import com.rv.component.utils.LogUtil;
import com.rv.component.utils.MyUtils; import com.rv.component.utils.MyUtils;
import com.rv.component.utils.ObservableScrollView; import com.rv.component.utils.ObservableScrollView;
import com.rv.home.R; import com.rv.home.R;
import com.rv.home.R2; import com.rv.home.R2;
import com.rv.home.rv.module.ApiConfig; import com.rv.home.rv.module.ApiConfig;
...@@ -259,12 +260,12 @@ public class HomeFragment extends BaseFragment<HomePresenter> implements Observa ...@@ -259,12 +260,12 @@ public class HomeFragment extends BaseFragment<HomePresenter> implements Observa
Drawable drawable = getResources().getDrawable(R.drawable.icon_day_times); Drawable drawable = getResources().getDrawable(R.drawable.icon_day_times);
drawable.setBounds(0, 0, DisplayUtil.dip2px(getContext(), 25), DisplayUtil.dip2px(getContext(), 5)); drawable.setBounds(0, 0, DisplayUtil.dip2px(getContext(), 25), DisplayUtil.dip2px(getContext(), 5));
tvDay.setCompoundDrawables(null, null, null, drawable); tvDay.setCompoundDrawables(null, null, null, drawable);
begDate = DateUtils.formatDate8(DateUtils.getCurDateTime()); begDate = MyUtils.getFetureDate(1) + " 09:00";
tvGetTime.setText(DateUtils.formatDate66(begDate)); tvGetTime.setText(DateUtils.formatDate66(begDate));
tvGetWeek.setText("周" + MyUtils.getWeek(DateUtils.getCurDate())); tvGetWeek.setText("周" + MyUtils.getWeek(DateUtils.getCurDate()));
endDate = MyUtils.getFetureDate2(1); endDate = MyUtils.getFetureDate(2)+ " 18:00";
tvOutTime.setText(DateUtils.formatDate66(endDate)); tvOutTime.setText(DateUtils.formatDate66(endDate));
tvOutWeek.setText("周" + MyUtils.getWeek(MyUtils.getFetureDate(1))); tvOutWeek.setText("周" + MyUtils.getWeek(MyUtils.getFetureDate(2)));
copyDay = DateUtils.compareDateDay(MyUtils.getFetureDate(1), DateUtils.getCurDate()) + 1; copyDay = DateUtils.compareDateDay(MyUtils.getFetureDate(1), DateUtils.getCurDate()) + 1;
...@@ -1036,7 +1037,7 @@ public class HomeFragment extends BaseFragment<HomePresenter> implements Observa ...@@ -1036,7 +1037,7 @@ public class HomeFragment extends BaseFragment<HomePresenter> implements Observa
if (listsBanners.size() > 0) { if (listsBanners.size() > 0) {
BeanHomeBanner.DataBean bean = listsBanners.get(position); BeanHomeBanner.DataBean bean = listsBanners.get(position);
mPresenter.saveOnclick("1", bean.getId()); mPresenter.saveOnclick("2", bean.getId());
if (bean != null && !TextUtils.isEmpty(bean.getUrl())) { if (bean != null && !TextUtils.isEmpty(bean.getUrl())) {
mPresenter.toTarget(getActivity(), bean.getUrl(), bean.getTitle()); mPresenter.toTarget(getActivity(), bean.getUrl(), bean.getTitle());
} }
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorYellow"
android:orientation="vertical"
tools:context=".rv.module.ui.main.home.ShareImageActivity">
<com.ruiwenliu.wrapper.statusbar.StatusBarHeightView
app:use_type="use_padding_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/size_50">
<ImageView
android:id="@+id/img_title_left"
android:layout_width="@dimen/size_32"
android:layout_height="@dimen/size_32"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/size_5"
android:clickable="true"
android:padding="@dimen/size_8"
android:src="@drawable/rv_common_icon_back_dark" />
<TextView
android:id="@+id/tv_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:padding="@dimen/size_15"
android:text="分享"
android:textColor="@color/colorWrite"
android:textSize="@dimen/text_16" />
</RelativeLayout>
</com.ruiwenliu.wrapper.statusbar.StatusBarHeightView>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/size_30" />
<android.support.v4.widget.NestedScrollView
android:id="@+id/nested_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_40"
android:layout_marginRight="@dimen/size_40"
android:background="@color/colorYellow"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rl_body"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorWrite">
<ImageView
android:id="@+id/iv_goods"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/size_200"
android:scaleType="fitXY" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/iv_goods"
android:background="@color/colorWrite"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="@dimen/size_10"
android:paddingTop="@dimen/size_10"
android:paddingRight="@dimen/size_10"
android:text="大通自行式C型房车(旅居版)"
android:textColor="@color/textMain"
android:textSize="@dimen/text_16" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_3"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="@dimen/size_10"
android:paddingRight="@dimen/size_10"
android:text="大通自行式C型房车(旅居版)"
android:textColor="@color/textGray"
android:textSize="@dimen/text_12" />
<TextView
android:id="@+id/tv_price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_5"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="@dimen/size_10"
android:paddingRight="@dimen/size_10"
android:text="¥3500天"
android:textColor="@color/colorAuxiliaryRed"
android:textSize="@dimen/text_16" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_15"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/size_15"
android:layout_height="@dimen/size_30"
android:background="@drawable/rv_half_left" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<include layout="@layout/common_line" />
</RelativeLayout>
<ImageView
android:layout_width="@dimen/size_15"
android:layout_height="@dimen/size_30"
android:background="@drawable/rv_half_right" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/size_15">
<ImageView
android:id="@+id/iv_code"
android:layout_width="@dimen/size_80"
android:layout_height="@dimen/size_80"
android:layout_marginLeft="@dimen/size_30"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/size_10"
android:layout_marginRight="@dimen/size_30"
android:layout_toRightOf="@id/iv_code"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="滴房车"
android:textColor="@color/textMain"
android:textSize="@dimen/text_16" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="长按二维码查看详情"
android:textColor="@color/textLightGrey"
android:textSize="@dimen/text_16" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
</LinearLayout>
...@@ -399,6 +399,12 @@ public class MineFragment extends BaseFragment<CommonPresenter> implements Simpl ...@@ -399,6 +399,12 @@ public class MineFragment extends BaseFragment<CommonPresenter> implements Simpl
private void setBanner() { private void setBanner() {
if (images != null && images.size() > 0) {
mineBanner.setVisibility(View.VISIBLE);
} else {
mineBanner.setVisibility(View.GONE);
}
mineBanner.isAutoPlay(true) mineBanner.isAutoPlay(true)
.setBannerTitles(titles) .setBannerTitles(titles)
.setImages(images) .setImages(images)
......
...@@ -269,7 +269,7 @@ ...@@ -269,7 +269,7 @@
android:clickable="false" android:clickable="false"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"> android:visibility="visible">
<ImageView <ImageView
android:layout_width="@dimen/size_25" android:layout_width="@dimen/size_25"
......
...@@ -55,5 +55,6 @@ dependencies { ...@@ -55,5 +55,6 @@ dependencies {
api project(':component_control') api project(':component_control')
api project(':component_resource') api project(':component_resource')
api project(':plugin_coupon') api project(':plugin_coupon')
api project(':plugin_poster')
} }
...@@ -585,6 +585,9 @@ public class TourismFragment extends BaseFragment<TourismPresenter> implements S ...@@ -585,6 +585,9 @@ public class TourismFragment extends BaseFragment<TourismPresenter> implements S
} else { } else {
latLatitude = result.getLocation().latitude; latLatitude = result.getLocation().latitude;
lonLongitude = result.getLocation().longitude; lonLongitude = result.getLocation().longitude;
mTourAroundAdapter.getData().clear();
mTourAroundAdapter.notifyDataSetChanged();
loadTourAroundData();
} }
} }
}); });
......
...@@ -37,4 +37,5 @@ public interface TourismApi extends RvFrameConfig { ...@@ -37,4 +37,5 @@ public interface TourismApi extends RvFrameConfig {
String TOUR_DETAIL = HOST + "/api/tour/tourGood/app/unauth/usable/%s"; // 旅游详情 String TOUR_DETAIL = HOST + "/api/tour/tourGood/app/unauth/usable/%s"; // 旅游详情
} }
...@@ -30,12 +30,14 @@ import com.frame.base.bus.IDCardCertificationEvent; ...@@ -30,12 +30,14 @@ import com.frame.base.bus.IDCardCertificationEvent;
import com.frame.base.bus.Observer; import com.frame.base.bus.Observer;
import com.frame.base.bus.RxBus; import com.frame.base.bus.RxBus;
import com.frame.base.url.Constance; import com.frame.base.url.Constance;
import com.frame.rv.config.CommonApi;
import com.frame.rv.config.RvFrameConfig; import com.frame.rv.config.RvFrameConfig;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.ruiwenliu.wrapper.SPConstance; import com.ruiwenliu.wrapper.SPConstance;
import com.ruiwenliu.wrapper.base.BaseBean; import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.BaseStatusActivity; import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.ruiwenliu.wrapper.bean.BeanUserInfo; import com.ruiwenliu.wrapper.bean.BeanUserInfo;
import com.ruiwenliu.wrapper.util.um.CustomShareListener; import com.ruiwenliu.wrapper.util.um.CustomShareListener;
import com.ruiwenliu.wrapper.util.um.ShareManager; import com.ruiwenliu.wrapper.util.um.ShareManager;
...@@ -114,6 +116,8 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -114,6 +116,8 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
@Autowired() @Autowired()
double price; double price;
private String code;
// public static Intent getIntent(Context context, BeanTourAround.DataBeanX.DataBean dataBean) { // public static Intent getIntent(Context context, BeanTourAround.DataBeanX.DataBean dataBean) {
// return new Intent(context, TravelDetailsActivity.class) // return new Intent(context, TravelDetailsActivity.class)
// .putExtra("dataBean", dataBean); // .putExtra("dataBean", dataBean);
...@@ -132,7 +136,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -132,7 +136,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
initWeb(); initWeb();
initRxbus(); initRxbus();
if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(url)) { if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(url)) {
String code = Cookie.getStringValue(getApplicationContext(), SPConstance.USER_JSON_CODE, ""); code = Cookie.getStringValue(getApplicationContext(), SPConstance.USER_JSON_CODE, "");
initShare(webUrl + "&shareType=app&code=" + code, name, " ", url); initShare(webUrl + "&shareType=app&code=" + code, name, " ", url);
} }
...@@ -275,7 +279,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -275,7 +279,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
name = beanTourDetail.getData().getName(); name = beanTourDetail.getData().getName();
content = beanTourDetail.getData().getContent(); content = beanTourDetail.getData().getContent();
price = Double.valueOf(beanTourDetail.getData().getPrice()); price = Double.valueOf(beanTourDetail.getData().getPrice());
initShare(webUrl + "&shareType=app", name, content, url); initShare(webUrl + "&shareType=app&code=" + code, name, content, url);
} }
break; break;
...@@ -365,7 +369,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -365,7 +369,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
/** /**
* 初始化分享 * 初始化分享
*/ */
private void initShare(final String webUrl, final String name, final String content, final String logo) { private void initShare(final String webUrls, final String name, final String content, final String logo) {
shareManager = new ShareManager(this, new ShareBoardlistener() { shareManager = new ShareManager(this, new ShareBoardlistener() {
@Override @Override
...@@ -380,17 +384,15 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -380,17 +384,15 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
} }
ARouter.getInstance() ARouter.getInstance()
.build(Constance.ACTIVITY_URL_SHAREIMAGE) .build(Constance.ACTIVITY_URL_POSTERACTIVITY)
.withString("icon", icon) .withString("url", webUrls)
.withString("name", name) .withString("imageUrl", icon)
.withString("keyword", content)
.withDouble("price", price)
.withString("url", webUrl)
.navigation(); .navigation();
} else if (snsPlatform.mShowWord.equals("复制链接")) { } else if (snsPlatform.mShowWord.equals("复制链接")) {
copyText(); copyText();
} }
shareManager.showShare(share_media, webUrl, name, content, logo shareManager.showShare(share_media, webUrls, name, content, logo
, new CustomShareListener(mActivity) { , new CustomShareListener(mActivity) {
@Override @Override
...@@ -424,7 +426,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -424,7 +426,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
} }
}, "rv_um_share_bill", "rv_um_share_copy"); }, "rv_um_share_bill", "rv_um_share_copy");
} }
/** /**
* 与h5交互 * 与h5交互
*/ */
...@@ -433,7 +435,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -433,7 +435,7 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
@JavascriptInterface @JavascriptInterface
public String getToken() { public String getToken() {
String token = OkGoUtil.getToken(); String token = OkGoUtil.getToken();
if (TextUtils.isEmpty(token)){ if (TextUtils.isEmpty(token)) {
ARouter.getInstance().build(Constance.ACTIVITY_URL_LOGINRV).navigation(); ARouter.getInstance().build(Constance.ACTIVITY_URL_LOGINRV).navigation();
} }
return token; return token;
...@@ -621,4 +623,22 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter> ...@@ -621,4 +623,22 @@ public class TravelDetailsActivity extends BaseStatusActivity<TourismPresenter>
myClipboard.setPrimaryClip(myClip); myClipboard.setPrimaryClip(myClip);
showToast("复制成功!"); showToast("复制成功!");
} }
/**
* 分享积分
*/
private void sharingSuccess(){
// mPresenter.postBodyData(RvFrameConfig.HOST,0, CommonApi.TOUR_SENDMESSAGE, new Sharing("",""),false);
}
private class Sharing {
private String integralRuleCode;
private String userId;
public Sharing(String integralRuleCode, String userId) {
this.integralRuleCode = integralRuleCode;
this.userId = userId;
}
}
} }
...@@ -140,9 +140,9 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> { ...@@ -140,9 +140,9 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> {
wheelViewLeft.setOnWheelViewListener(new WheelView.OnWheelViewListener() { wheelViewLeft.setOnWheelViewListener(new WheelView.OnWheelViewListener() {
@Override @Override
public void onSelected(int selectedIndex, String item) { public void onSelected(int selectedIndex, String item) {
begSelected = selectedIndex; begSelected = selectedIndex;
s_begTime = item; s_begTime = item;
tvGetTime.setText(item); tvGetTime.setText(item);
} }
}); });
...@@ -207,7 +207,7 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> { ...@@ -207,7 +207,7 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> {
return; return;
} }
if (s_begDate.equals(s_endDate) && DateUtils.formatDate20(s_endTime) <= DateUtils.formatDate20(s_begTime)){ if (s_begDate.equals(s_endDate) && DateUtils.formatDate20(s_endTime) <= DateUtils.formatDate20(s_begTime)) {
showToast("还车时刻要大于取车时刻!"); showToast("还车时刻要大于取车时刻!");
return; return;
} }
...@@ -306,6 +306,9 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> { ...@@ -306,6 +306,9 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> {
if (CalendarDateUtil.getCurDate().equals(curDay)) { if (CalendarDateUtil.getCurDate().equals(curDay)) {
strDay = "今天"; strDay = "今天";
day.setCurDay(true); day.setCurDay(true);
day.setDefTextColor(context.getResources().getColor(R.color.gray_FFB74B));
day.setDefNongTextColor(context.getResources().getColor(R.color.gray_FFB74B));
day.setCanBeChoose(false);
} else if (CalendarDateUtil.compareDateDay(CalendarDateUtil.getCurDate(), curDay) > 0 || spanIndex >= MAX_SPAN) { } else if (CalendarDateUtil.compareDateDay(CalendarDateUtil.getCurDate(), curDay) > 0 || spanIndex >= MAX_SPAN) {
//如果是今天以前 //如果是今天以前
day.setDefTextColor(context.getResources().getColor(R.color.ri_lhui)); day.setDefTextColor(context.getResources().getColor(R.color.ri_lhui));
...@@ -364,9 +367,11 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> { ...@@ -364,9 +367,11 @@ public class CalendarActivity extends BaseStatusActivity<CalendarPresenter> {
* 初始化时间数据 * 初始化时间数据
*/ */
private void initTime() { private void initTime() {
for (int i = 0; i < 24; i++) { for (int i = 9; i < 22; i++) {
timeList.add(String.format("%02d", i) + ":00"); timeList.add(String.format("%02d", i) + ":00");
timeList.add(String.format("%02d", i) + ":30"); if (i < 21) {
timeList.add(String.format("%02d", i) + ":30");
}
} }
} }
} }
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
flavorDimensions "default"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
productFlavors {
//开发环境
dev {
}
sit {
}
pro {
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
api 'com.jakewharton:butterknife:9.0.0-rc1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
implementation 'com.alibaba:fastjson:1.2.21'
api project(':RvWrapper')
api project(':component_resource')
api project(':component_utils')
}
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rv.poster.plugin">
<application>
<activity android:name=".PosterActivity"></activity>
</application>
</manifest>
\ No newline at end of file
package com.rv.home.rv.module.ui.main.home; package com.rv.poster.plugin;
import android.Manifest;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.os.Build;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html; import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.CardView;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Autowired; import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.facade.annotation.Route;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.frame.base.url.Constance; import com.frame.base.url.Constance;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.ruiwenliu.wrapper.base.BaseBean; import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.swipe.SwipeBackActivity; import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.statusbar.StatusBarUtil; import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.ruiwenliu.wrapper.bean.BeanUserInfo;
import com.ruiwenliu.wrapper.bean.UserInfoBean;
import com.ruiwenliu.wrapper.util.TransformationUtil;
import com.ruiwenliu.wrapper.util.glide.GlideManager; import com.ruiwenliu.wrapper.util.glide.GlideManager;
import com.ruiwenliu.wrapper.util.glide.GlideOptions;
import com.ruiwenliu.wrapper.util.um.CustomShareListener; import com.ruiwenliu.wrapper.util.um.CustomShareListener;
import com.ruiwenliu.wrapper.util.um.ShareManager; import com.ruiwenliu.wrapper.util.um.ShareManager;
import com.ruiwenliu.wrapper.weight.TitleView; import com.ruiwenliu.wrapper.weight.TitleView;
import com.rv.home.R; import com.rv.component.utils.CacheEnum;
import com.rv.home.R2; import com.rv.component.utils.DisplayUtil;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter; import com.rv.component.utils.RvCache;
import com.umeng.socialize.UMShareAPI; import com.rv.component.utils.ShareUtils;
import com.rv.component.utils.ZxingUtils;
import com.umeng.socialize.bean.SHARE_MEDIA; import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.shareboard.SnsPlatform; import com.umeng.socialize.shareboard.SnsPlatform;
import com.umeng.socialize.utils.ShareBoardlistener; import com.umeng.socialize.utils.ShareBoardlistener;
import java.util.HashMap; import java.io.File;
import java.util.Map;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
@Route(path = Constance.ACTIVITY_URL_SHAREIMAGE) /**
public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> { * 租车、旅游、营地海报分享
*/
@Route(path = Constance.ACTIVITY_URL_POSTERACTIVITY)
public class PosterActivity extends BaseStatusActivity<CommonPresenter> {
@BindView(R2.id.iv_goods) @BindView(R2.id.img_bill_top)
ImageView ivGoods; ImageView imgBillTop;
@BindView(R2.id.ring_header)
ImageView ringHeader;
@BindView(R2.id.tv_name) @BindView(R2.id.tv_name)
TextView tvName; TextView tvName;
@BindView(R2.id.tv_content) @BindView(R2.id.img_qrcode)
TextView tvContent; ImageView imgQrcode;
@BindView(R2.id.tv_price) @BindView(R2.id.ll_bill_content)
TextView tvPrice; CardView llBillContent;
@BindView(R2.id.iv_code)
ImageView ivCode;
@BindView(R2.id.rl_body)
RelativeLayout rlBody;
private ShareManager shareManager;
@Autowired()
String icon;
@Autowired()
String name;
@Autowired()
String keyword;
@Autowired()
double price;
@Autowired() @Autowired()
String url; String url;
@Override @Autowired()
protected void loadData(Bundle savedInstanceState, Intent intent) { String imageUrl;
}
@Override private ShareManager shareManager;
protected int setLayout() { private Bitmap bitmap = null;
return R.layout.rv_act_share_image; private UMImage image = null;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected int setLayout() {
super.onCreate(savedInstanceState); return R.layout.activity_poster;
StatusBarUtil.setRootViewFitsSystemWindows(mActivity, false);
} }
@Override @Override
protected void initView(Bundle savedInstanceState, TitleView titleView, Intent intent) { protected void initView(Bundle savedInstanceState, TitleView titleView, Intent intent) {
showTitle(false); titleView.setTitle("生成海报");
GlideManager.getInstance(this).loadImage3(icon, ivGoods);
if (!TextUtils.isEmpty(name)) if (!TextUtils.isEmpty(url)) {
tvName.setText(name); Bitmap bitmap = ZxingUtils.createQRImage(url, DisplayUtil.dip2px(this, 150), DisplayUtil.dip2px(this, 150), BitmapFactory.decodeResource(getResources(), R.drawable.logo_hint));
else imgQrcode.setImageBitmap(bitmap);
tvName.setText(""); }
if (!TextUtils.isEmpty(keyword))
tvContent.setText(Html.fromHtml(keyword)); GlideOptions options = GlideOptions.placeholderOf(com.ruiwenliu.wrapper.R.drawable.glide_icon_placeholder).
else error(com.ruiwenliu.wrapper.R.drawable.glide_icon_error);
tvContent.setText(""); TransformationUtil utils = new TransformationUtil(imgBillTop);
tvPrice.setText(String.format("%1$s%2$s", price, this.getString(R.string.rv_day))); Glide.with(this)
.asBitmap()
//生成带中间图标的二维码 .load(imageUrl)
Bitmap success = createQRImage(url, 300, 300, .apply(options)
BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); .apply(RequestOptions
ivCode.setImageBitmap(success); .bitmapTransform(new RoundedCorners(12)).override(imgBillTop.getWidth(), imgBillTop.getHeight())
.disallowHardwareConfig())
.into(utils);
UserInfoBean userInfoBean = (UserInfoBean) RvCache.getInstance(getApplicationContext()).get(CacheEnum.USER);
if (userInfoBean != null && userInfoBean.getData() != null) {
String name = userInfoBean.getData().getNickname();
String url = userInfoBean.getData().getHeadimgurl();
if (!TextUtils.isEmpty(url)) {
GlideManager.getInstance(getApplicationContext()).loadImage(url, ringHeader, R.drawable.icon_bill_defult);
}
if (!TextUtils.isEmpty(name)) {
tvName.setText(name);
}
}
} }
@Override @Override
...@@ -113,26 +121,63 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> { ...@@ -113,26 +121,63 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> {
} }
@OnClick({R2.id.img_title_left, R2.id.tv_share, R2.id.iv_code})
@OnClick({R2.id.tv_item_save_bill, R2.id.tv_item_share})
public void onViewClicked(View view) { public void onViewClicked(View view) {
int i = view.getId(); int id = view.getId();
if (i == R.id.img_title_left) { if (id == R.id.tv_item_save_bill) {
finish(); preShare(0, 1001);
} else if (id == R.id.tv_item_share) {
preShare(1, 1002);
}
}
} else if (i == R.id.tv_share) {
if (rlBody != null && getViewBitmap(rlBody) != null) {
initShare(getViewBitmap(rlBody));
}
} else if (i == R.id.iv_code) {
/**
* 预备下载 进行 6.0权限检查
*/
private void preShare(int type, int requestCode) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if (type == 0) {
saveBill(llBillContent);
} else {
share(llBillContent);
}
} else {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
if (type == 0) {
saveBill(llBillContent);
} else {
share(llBillContent);
}
} else {//申请权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
}
} }
} }
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onActivityResult(requestCode, resultCode, data); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
/** attention to this below ,must add this**/ switch (requestCode) {
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); case 1001:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
saveBill(llBillContent);
} else {
showToast("授权失败,无法分享海报");
}
break;
case 1002:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
share(llBillContent);
} else {
showToast("授权失败,无法分享海报");
}
break;
}
} }
/** /**
...@@ -144,38 +189,32 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> { ...@@ -144,38 +189,32 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> {
shareManager.close(); shareManager.close();
} }
@Override
public void onDestroy() {
super.onDestroy();
}
/** /******
* 获取scrollview的截屏 * 分享
*/ */
public Bitmap getViewBitmap(RelativeLayout view) { public void share(View view) {
int w = view.getWidth(); if (shareManager == null) {
int h = view.getHeight();
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
c.drawColor(Color.WHITE);
/** 如果不设置canvas画布为白色,则生成透明 */
view.layout(0, 0, w, h);
view.draw(c);
return bmp;
}
/** if (view != null && bitmap == null) {
* 初始化分享 bitmap = ShareUtils.viewConversionBitmap(view);
*/ }
private void initShare(final Bitmap bitmap) { File file = null;
if (bitmap != null) {
file = ShareUtils.saveBitmapFile(mActivity, bitmap);
}
if (file != null) {
image = new UMImage(mActivity, file);//bitmap文件
image.compressStyle = UMImage.CompressStyle.SCALE;//大小压缩,默认为大小压缩,适合普通很大的图
image.compressStyle = UMImage.CompressStyle.QUALITY;//质量压缩,适合长图的分享
image.compressFormat = Bitmap.CompressFormat.PNG;
}
if (shareManager == null) {
shareManager = new ShareManager(this, new ShareBoardlistener() { shareManager = new ShareManager(this, new ShareBoardlistener() {
@Override @Override
public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
shareManager.showShareImage2(share_media, image, new CustomShareListener(mActivity) {
shareManager.showShareImage(share_media, bitmap, new CustomShareListener(mActivity) {
@Override @Override
public void onResult(SHARE_MEDIA platform) { public void onResult(SHARE_MEDIA platform) {
super.onResult(platform); super.onResult(platform);
...@@ -200,7 +239,6 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> { ...@@ -200,7 +239,6 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> {
showToast(platform + "分享成功啦"); showToast(platform + "分享成功啦");
} }
} }
} }
...@@ -209,102 +247,23 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> { ...@@ -209,102 +247,23 @@ public class ShareImageActivity extends SwipeBackActivity<CommonPresenter> {
}); });
} }
shareManager.open(); shareManager.open();
} }
public static Bitmap createQRImage(String content, int widthPix, int heightPix, /*****
Bitmap logoBm) { * 保存海报
try { * @param view
//配置参数 */
Map<EncodeHintType, Object> hints = new HashMap<>(); public void saveBill(View view) {
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); if (view != null) {
//容错级别 Bitmap bitmap = ShareUtils.viewConversionBitmap(view);
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); File file = null;
//设置空白边距的宽度 if (bitmap != null) {
hints.put(EncodeHintType.MARGIN, 1); //default is 4 file = ShareUtils.saveBitmapFile(mActivity, bitmap);
// 图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = null;
try {
bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix,
heightPix, hints);
} catch (WriterException e) {
e.printStackTrace();
}
int[] pixels = new int[widthPix * heightPix];
// 下面这里按照二维码的算法,逐个生成二维码的图片,
// 两个for循环是图片横列扫描的结果
for (int y = 0; y < heightPix; y++) {
for (int x = 0; x < widthPix; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * widthPix + x] = 0xff000000;
} else {
pixels[y * widthPix + x] = 0xffffffff;
}
}
} }
if (file != null) {
// 生成二维码图片的格式,使用ARGB_8888 showToast("海报保存在" + file.getAbsolutePath());
Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
if (logoBm != null) {
bitmap = Logo(bitmap, logoBm);
} }
//必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,
// 内存消耗巨大!
return bitmap;
// return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100);
} catch (Exception e) {
e.printStackTrace();
} }
return null;
} }
private static Bitmap Logo(Bitmap src, Bitmap logo) {
if (src == null) {
return null;
}
if (logo == null) {
return src;
}
//获取图片的宽高
int srcWidth = src.getWidth();
int srcHeight = src.getHeight();
int logoWidth = logo.getWidth();
int logoHeight = logo.getHeight();
if (srcWidth == 0 || srcHeight == 0) {
return null;
}
if (logoWidth == 0 || logoHeight == 0) {
return src;
}
//logo大小为二维码整体大小的1/5
float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
try {
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(src, 0, 0, null);
canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
canvas.save();
canvas.restore();
} catch (Exception e) {
bitmap = null;
e.getStackTrace();
}
return bitmap;
}
} }
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorWrite"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F9D993">
<android.support.v7.widget.CardView
android:id="@+id/ll_bill_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginLeft="@dimen/size_15"
android:layout_marginTop="@dimen/size_15"
android:layout_marginRight="@dimen/size_15"
android:layout_marginBottom="@dimen/size_70"
android:background="@color/white"
app:cardCornerRadius="5dp">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_10"
android:layout_marginTop="@dimen/size_10"
android:layout_marginRight="@dimen/size_10"
android:layout_marginBottom="@dimen/size_10"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/img_bill_top"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/ring_header"
android:layout_width="@dimen/size_50"
android:layout_height="@dimen/size_50" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_5"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="false"
android:textColor="@color/colorMain"
android:textSize="@dimen/text_18" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginLeft="@dimen/text_10"
android:gravity="center_vertical"
android:orientation="horizontal">
<View
android:layout_width="1px"
android:layout_height="@dimen/size_60"
android:background="#E1E1E1" />
<ImageView
android:id="@+id/img_qrcode"
android:layout_width="@dimen/size_70"
android:layout_height="@dimen/size_70"
android:layout_marginLeft="@dimen/size_20" />
</LinearLayout>
</LinearLayout>
<include layout="@layout/common_line" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_5"
android:text="滴房车app,带你走进房车生活"
android:textColor="@color/gray_B4B4B4"
android:textSize="@dimen/text_8" />
</LinearLayout>
</ScrollView>
</android.support.v7.widget.CardView>
<!--</LinearLayout>-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/size_70"
android:layout_gravity="bottom"
android:layout_marginLeft="@dimen/size_10"
android:layout_marginRight="@dimen/size_10"
android:gravity="center_horizontal|bottom"
android:orientation="horizontal"
android:paddingTop="@dimen/size_20"
android:paddingBottom="@dimen/size_10">
<TextView
android:id="@+id/tv_item_save_bill"
android:layout_width="0dp"
android:layout_height="@dimen/dp_40"
android:layout_weight="1"
android:background="@drawable/shape_rv_bg_shallow_while_circle"
android:gravity="center"
android:text="保存海报"
android:textColor="#FE9C36"
android:textSize="@dimen/sp_16" />
<TextView
android:id="@+id/tv_item_share"
android:layout_width="0dp"
android:layout_height="@dimen/dp_40"
android:layout_marginLeft="@dimen/size_10"
android:layout_weight="1"
android:background="@drawable/shape_rv_bg_shallow_dark_yellow_circle"
android:gravity="center"
android:text="马上分享"
android:textColor="@color/white"
android:textSize="@dimen/sp_16" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<resources>
<string name="app_name">plugin_poster</string>
</resources>
...@@ -4,13 +4,21 @@ android { ...@@ -4,13 +4,21 @@ android {
compileSdkVersion 28 compileSdkVersion 28
defaultConfig { defaultConfig {
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 28 targetSdkVersion 28
flavorDimensions "default" flavorDimensions "default"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// javaCompileOptions {
//
// annotationProcessorOptions {
//
// arguments = [moduleName: project.getName()]
//
// }
// }
} }
buildTypes { buildTypes {
...@@ -46,6 +54,9 @@ dependencies { ...@@ -46,6 +54,9 @@ dependencies {
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
// annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
api project(':module_home') api project(':module_home')
api project(':component_resource')
api project(':component_utils')
} }
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
package="com.rv.share"> package="com.rv.share">
<application> <application>
<activity android:name=".ShareActivity" /> <activity android:name=".ShareActivity" />
<activity android:name=".BillActivity" /> <activity android:name=".BillActivity" />
<activity android:name=".WebViewActivity"> <activity android:name=".WebViewActivity">
...@@ -17,7 +18,7 @@ ...@@ -17,7 +18,7 @@
</activity> </activity>
<activity android:name=".ReativeBillActivity" /> <activity android:name=".ReativeBillActivity" />
<activity android:name=".PopularizeActivity" /> <activity android:name=".PopularizeActivity" />
<activity android:name=".ShareRulerActivity"></activity> <activity android:name=".ShareRulerActivity" />
</application> </application>
</manifest> </manifest>
\ No newline at end of file
...@@ -10,7 +10,7 @@ import android.view.View; ...@@ -10,7 +10,7 @@ import android.view.View;
import android.webkit.WebView; import android.webkit.WebView;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter; import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.rv.share.utils.StorageUtils; import com.rv.component.utils.StorageUtils;
import com.rv.share.view.ShareChoiceDialog; import com.rv.share.view.ShareChoiceDialog;
import com.umeng.socialize.ShareAction; import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMShareListener; import com.umeng.socialize.UMShareListener;
......
...@@ -6,7 +6,7 @@ import android.view.View; ...@@ -6,7 +6,7 @@ import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter; import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.rv.share.utils.ShareUtils; import com.rv.component.utils.ShareUtils;
import com.rv.share.view.ShareChoiceDialog; import com.rv.share.view.ShareChoiceDialog;
import com.umeng.socialize.ShareAction; import com.umeng.socialize.ShareAction;
import com.umeng.socialize.bean.SHARE_MEDIA; import com.umeng.socialize.bean.SHARE_MEDIA;
......
...@@ -13,7 +13,7 @@ import com.rv.component.utils.DisplayUtil; ...@@ -13,7 +13,7 @@ import com.rv.component.utils.DisplayUtil;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter; import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.rv.share.R; import com.rv.share.R;
import com.rv.share.ReativeBillActivity; import com.rv.share.ReativeBillActivity;
import com.rv.share.utils.ShareUtils; import com.rv.component.utils.ShareUtils;
import com.rv.share.view.ShareChoiceDialog; import com.rv.share.view.ShareChoiceDialog;
import com.umeng.socialize.ShareAction; import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMShareListener; import com.umeng.socialize.UMShareListener;
......
include ':RvFrame', ':plugin_carpurchase' include ':RvFrame', ':plugin_carpurchase', ':plugin_poster'
include ':RvTravel' include ':RvTravel'
include ':RvClient' include ':RvClient'
include ':RvWrapper' include ':RvWrapper'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment