diff --git a/Share/.gitignore b/Share/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/Share/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Share/build.gradle b/Share/build.gradle new file mode 100644 index 000000000..039fa8b89 --- /dev/null +++ b/Share/build.gradle @@ -0,0 +1,73 @@ +apply plugin: 'com.android.library' +apply plugin: 'img-optimizer' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + + +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + packagingOptions { + pickFirst "lib/armeabi/libyuvutils.so" + pickFirst "lib/arm64-v8a/libyuvutils.so" + pickFirst "lib/armeabi-v7a/libyuvutils.so" + pickFirst "lib/armeabi/libyuvtools.so" + pickFirst "lib/arm64-v8a/libyuvtools.so" + pickFirst "lib/armeabi-v7a/libyuvtools.so" + exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" + exclude "lib/arm64-v8a/libmmcv_api_express.so" + exclude "lib/arm64-v8a/libMediaEncoder.so" + exclude "lib/arm64-v8a/libarcore_sdk_c.so" + exclude "lib/arm64-v8a/libmediadecoder.so" + exclude "lib/arm64-v8a/libMediaMuxer.so" + exclude "lib/arm64-v8a/libarcore_sdk_jni.so" + exclude "lib/arm64-v8a/libMediaUtils.so" + exclude "lib/arm64-v8a/libcosmosffmpeg.so" + + } + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + manifestPlaceholders = rootProject.ext.manifestPlaceholders + ndk { + abiFilters "armeabi-v7a", "arm64-v8a" + } + } + aaptOptions { + cruncherEnabled = false + useNewCruncher = false + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} +repositories { + flatDir { + dirs 'libs', '../libs' + } +} +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation rootProject.ext.dependencies["appcompat-androidx"] + implementation rootProject.ext.dependencies["recyclerview-androidx"] + //common + implementation project(path: ':common') + //Twitter + implementation 'com.twitter.sdk.android:twitter:3.1.1' + //facebook & Messenger + implementation 'com.facebook.android:facebook-share:15.2.0' + + + +} diff --git a/Share/consumer-rules.pro b/Share/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/Share/proguard-rules.pro b/Share/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/Share/proguard-rules.pro @@ -0,0 +1,21 @@ +# 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 \ No newline at end of file diff --git a/Share/src/androidTest/java/com/yunbao/share/ExampleInstrumentedTest.java b/Share/src/androidTest/java/com/yunbao/share/ExampleInstrumentedTest.java new file mode 100644 index 000000000..73039a6f1 --- /dev/null +++ b/Share/src/androidTest/java/com/yunbao/share/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.yunbao.share; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.yunbao.share.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/Share/src/main/AndroidManifest.xml b/Share/src/main/AndroidManifest.xml new file mode 100644 index 000000000..0f2b62f39 --- /dev/null +++ b/Share/src/main/AndroidManifest.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/java/com/yunbao/share/AbsShareInterface.java b/Share/src/main/java/com/yunbao/share/AbsShareInterface.java new file mode 100644 index 000000000..fed5ddee8 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/AbsShareInterface.java @@ -0,0 +1,34 @@ +package com.yunbao.share; + +import android.content.Context; +import android.content.IntentFilter; +import android.net.Uri; + +import androidx.core.content.FileProvider; + +import com.twitter.sdk.android.tweetcomposer.TweetUploadService; +import com.yunbao.share.bean.ShareBuilder; +import com.yunbao.share.receiver.TwitterResultReceiver; + +import java.io.File; + +public abstract class AbsShareInterface { + protected final Context mContext; + + public AbsShareInterface(Context context) { + this.mContext = context; + IntentFilter filter = new IntentFilter(TweetUploadService.UPLOAD_SUCCESS); + filter.addAction(TweetUploadService.UPLOAD_FAILURE); + filter.addAction(TweetUploadService.TWEET_COMPOSE_CANCEL); + context.registerReceiver(new TwitterResultReceiver(), filter); + } + + public abstract void share(ShareBuilder builder, ICallback callback); + + public Uri fileToUri(File file){ + return FileProvider.getUriForFile(mContext, + mContext.getPackageName() + ".fileprovider", + file + ); + } +} diff --git a/Share/src/main/java/com/yunbao/share/ICallback.java b/Share/src/main/java/com/yunbao/share/ICallback.java new file mode 100644 index 000000000..777da4d81 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/ICallback.java @@ -0,0 +1,6 @@ +package com.yunbao.share; + +public interface ICallback { + void onSuccess(); + void onFailure(); +} diff --git a/Share/src/main/java/com/yunbao/share/adapters/InviteRewardListAdapter.java b/Share/src/main/java/com/yunbao/share/adapters/InviteRewardListAdapter.java new file mode 100644 index 000000000..27f03e25d --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/adapters/InviteRewardListAdapter.java @@ -0,0 +1,67 @@ +package com.yunbao.share.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.pdlive.shayu.R; +import com.yunbao.share.bean.InviteRewardBean; + +import java.util.List; + +public class InviteRewardListAdapter extends RecyclerView.Adapter { + private Context mContext; + private List list; + + public InviteRewardListAdapter(Context mContext) { + this.mContext = mContext; + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public RewardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new RewardViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_invite_reward,parent,false)); + } + + @Override + public void onBindViewHolder(@NonNull RewardViewHolder holder, int position) { + holder.setData(list.get(position),position); + } + + @Override + public int getItemCount() { + return list.size(); + } + + + public static class RewardViewHolder extends RecyclerView.ViewHolder { + private final TextView item1; + private final TextView item2; + private final TextView item3; + private final TextView item4; + + public RewardViewHolder(@NonNull View itemView) { + super(itemView); + item1 = itemView.findViewById(R.id.item1); + item2 = itemView.findViewById(R.id.item2); + item3 = itemView.findViewById(R.id.item3); + item4 = itemView.findViewById(R.id.item4); + } + + void setData(InviteRewardBean bean, int position) { + item1.setText(bean.getUsername()); + item2.setText(bean.getInviteTime()); + item3.setText(bean.getType()); + item4.setText(bean.getReward()); + } + } +} diff --git a/Share/src/main/java/com/yunbao/share/adapters/ShareAppAdapter.java b/Share/src/main/java/com/yunbao/share/adapters/ShareAppAdapter.java new file mode 100644 index 000000000..5c106481f --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/adapters/ShareAppAdapter.java @@ -0,0 +1,130 @@ +package com.yunbao.share.adapters; + +import android.content.Context; +import android.os.Environment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.recyclerview.widget.RecyclerView; + +import com.pdlive.shayu.R; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; +import com.yunbao.share.platform.FacebookShare; +import com.yunbao.share.platform.Instagram; +import com.yunbao.share.platform.Line; +import com.yunbao.share.platform.MessengerShare; +import com.yunbao.share.platform.TwitterShare; +import com.yunbao.share.platform.WhatsApp; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class ShareAppAdapter extends RecyclerView.Adapter { + private Context mContext; + private List list; + + public ShareAppAdapter(Context mContext) { + list = new ArrayList<>(); + this.mContext = mContext; + } + + public void setList(List list) { + this.list = list; + notifyDataSetChanged(); + } + + @NonNull + @Override + public AppViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new AppViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_share_app, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull AppViewHolder holder, int position) { + ShareBuilder builder = list.get(position); + switch (builder.getType()) { + case ShareBuilder.APP_FACEBOOK: + holder.setData(builder, R.mipmap.icon_share_facebook, R.string.dialog_share_app_facebook); + break; + case ShareBuilder.APP_LINE: + holder.setData(builder, R.mipmap.icon_share_line, R.string.dialog_share_app_line); + break; + case ShareBuilder.APP_TWITTER: + holder.setData(builder, R.mipmap.icon_share_twitter, R.string.dialog_share_app_twitter); + break; + case ShareBuilder.APP_WHATSAPP: + holder.setData(builder, R.mipmap.icon_share_whatsapp, R.string.dialog_share_app_whatsapp); + break; + case ShareBuilder.APP_MESSENGER: + holder.setData(builder, R.mipmap.icon_share_messenger, R.string.dialog_share_app_messenger); + break; + case ShareBuilder.APP_INSTAGRAM: + holder.setData(builder, R.mipmap.icon_share_instagram, R.string.dialog_share_app_instagram); + break; + } + } + + @Override + public int getItemCount() { + return list.size(); + } + + public static class AppViewHolder extends RecyclerView.ViewHolder { + ImageView icon; + TextView title; + + public AppViewHolder(@NonNull View itemView) { + super(itemView); + icon = itemView.findViewById(R.id.share_app_icon); + title = itemView.findViewById(R.id.share_app_name); + } + + public void setData(ShareBuilder bean, @DrawableRes int iconId, @StringRes int appName) { + icon.setImageResource(iconId); + title.setText(appName); + itemView.setOnClickListener(v -> { + switch (bean.getType()) { + case ShareBuilder.APP_FACEBOOK: + new FacebookShare(itemView.getContext()).share(bean, new ShareCallback()); + break; + case ShareBuilder.APP_LINE: + new Line(itemView.getContext()).share(bean, new ShareCallback()); + break; + case ShareBuilder.APP_TWITTER: + new TwitterShare(itemView.getContext()).share(bean, new ShareCallback()); + break; + case ShareBuilder.APP_WHATSAPP: + new WhatsApp(itemView.getContext()).share(bean, new ShareCallback()); + break; + case ShareBuilder.APP_MESSENGER: + new MessengerShare(itemView.getContext()).share(bean, new ShareCallback()); + break; + case ShareBuilder.APP_INSTAGRAM: + new Instagram(itemView.getContext()).share(bean, new ShareCallback()); + break; + } + }); + } + + private static class ShareCallback implements ICallback { + + @Override + public void onSuccess() { + + } + + @Override + public void onFailure() { + + } + } + } +} diff --git a/Share/src/main/java/com/yunbao/share/bean/InviteRewardBean.java b/Share/src/main/java/com/yunbao/share/bean/InviteRewardBean.java new file mode 100644 index 000000000..af999aaa8 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/bean/InviteRewardBean.java @@ -0,0 +1,63 @@ +package com.yunbao.share.bean; + +import androidx.annotation.NonNull; + +public class InviteRewardBean{ + private String username; + private String inviteTime; + private String type; + private String reward; + + public InviteRewardBean() { + } + + public InviteRewardBean(String username, String inviteTime, String type, String reward) { + this.username = username; + this.inviteTime = inviteTime; + this.type = type; + this.reward = reward; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getInviteTime() { + return inviteTime; + } + + public void setInviteTime(String inviteTime) { + this.inviteTime = inviteTime; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getReward() { + return reward; + } + + public void setReward(String reward) { + this.reward = reward; + } + + @NonNull + @Override + public String toString() { + return "InviteRewardBean{" + + "username='" + username + '\'' + + ", inviteTime='" + inviteTime + '\'' + + ", type='" + type + '\'' + + ", reward='" + reward + '\'' + + '}'; + } +} diff --git a/Share/src/main/java/com/yunbao/share/bean/ShareBuilder.java b/Share/src/main/java/com/yunbao/share/bean/ShareBuilder.java new file mode 100644 index 000000000..bfe1da282 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/bean/ShareBuilder.java @@ -0,0 +1,136 @@ +package com.yunbao.share.bean; + +import androidx.annotation.NonNull; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.utils.StringUtil; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +public class ShareBuilder { + public static final int APP_FACEBOOK = 0; + public static final int APP_LINE = 1; + public static final int APP_TWITTER = 2; + public static final int APP_WHATSAPP = 3; + public static final int APP_MESSENGER = 4; + public static final int APP_INSTAGRAM = 5; + + private String text; + private String link; + private File file; + private int type; + private String uid; + private String anchorId; + private String anchorName; + private String anchorAvatar; + + public static String createLiveShareLink(String shareUid, String anchorId, String anchorName, String anchorAvatar) { + try { + return String.format(CommonAppConfig.HOST + + "/h5/activity/FriendInvitation/liveShare.html?user_id=%s&anchor_id=%s&anchor_name=%s&anchor_avatar=%s&isGoogle=%s", + shareUid, + anchorId, + URLEncoder.encode(anchorName, "UTF-8"), + URLEncoder.encode(anchorAvatar, "UTF-8"), + CommonAppConfig.IS_GOOGLE_PLAY ? "1" : "0" + ); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + public static String createInviteLink(String shareUid){ + return String.format("https://www.pdlive.com/public/app/download/index.html?user_id=%s&isGoogle=%s", + shareUid, + CommonAppConfig.IS_GOOGLE_PLAY ? "1" : "0" + ); + } + + public static ShareBuilder builder(int type) { + return new ShareBuilder(type); + } + + private ShareBuilder(int type) { + this.type = type; + } + + public int getType() { + return type; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getAnchorId() { + return anchorId; + } + + public void setAnchorId(String anchorId) { + this.anchorId = anchorId; + } + + public String getAnchorName() { + return anchorName; + } + + public void setAnchorName(String anchorName) { + this.anchorName = anchorName; + } + + public String getAnchorAvatar() { + return anchorAvatar; + } + + public void setAnchorAvatar(String anchorAvatar) { + this.anchorAvatar = anchorAvatar; + } + + public ShareBuilder setText(String text) { + this.text = text; + return this; + } + + public ShareBuilder setLink(String link) { + this.link = link; + return this; + } + + public ShareBuilder setFile(File file) { + this.file = file; + return this; + } + + public String getText() { + if (StringUtil.isEmpty(text)) { + return getLink(); + } + return text + "\n" + getLink(); + } + + public String getLink() { + if (StringUtil.isEmpty(link)) { + link = createLiveShareLink(uid, anchorId, anchorName, anchorAvatar); + } + return link; + } + + public File getFile() { + return file; + } + + @NonNull + @Override + public String toString() { + return "ShareBuilder{" + + "text='" + text + '\'' + + ", link='" + link + '\'' + + ", file=" + file + + '}'; + } +} diff --git a/Share/src/main/java/com/yunbao/share/platform/FacebookShare.java b/Share/src/main/java/com/yunbao/share/platform/FacebookShare.java new file mode 100644 index 000000000..118e90406 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/platform/FacebookShare.java @@ -0,0 +1,51 @@ +package com.yunbao.share.platform; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; + +import androidx.annotation.NonNull; + +import com.facebook.CallbackManager; +import com.facebook.FacebookCallback; +import com.facebook.FacebookException; +import com.facebook.share.Sharer; +import com.facebook.share.model.ShareLinkContent; +import com.facebook.share.widget.ShareDialog; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.share.AbsShareInterface; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; + +public class FacebookShare extends AbsShareInterface { + public static CallbackManager callbackManager; + public FacebookShare(Context context) { + super(context); + } + + @Override + public void share(ShareBuilder builder, ICallback callback) { + callbackManager= CallbackManager.Factory.create(); + ShareLinkContent content = new ShareLinkContent.Builder() + .setContentUrl(Uri.parse(builder.getLink())) + .build(); + ShareDialog dialog=new ShareDialog((Activity) mContext); + dialog.registerCallback(callbackManager, new FacebookCallback() { + @Override + public void onSuccess(Sharer.Result result) { + ToastUtil.show("Facebook分享成功"); + } + + @Override + public void onCancel() { + ToastUtil.show("Facebook分享取消"); + } + + @Override + public void onError(@NonNull FacebookException e) { + ToastUtil.show("Facebook分享失败:"+e.toString()); + } + }); + dialog.show(content); + } +} diff --git a/Share/src/main/java/com/yunbao/share/platform/Instagram.java b/Share/src/main/java/com/yunbao/share/platform/Instagram.java new file mode 100644 index 000000000..da876e6fb --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/platform/Instagram.java @@ -0,0 +1,27 @@ +package com.yunbao.share.platform; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import com.yunbao.share.AbsShareInterface; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; + +public class Instagram extends AbsShareInterface { + public Instagram(Context context) { + super(context); + } + + @Override + public void share(ShareBuilder builder, ICallback callback) { + String type = "image/*"; + Intent share = new Intent(Intent.ACTION_SEND); + Uri uri = fileToUri(builder.getFile()); + share.setType(type); + share.putExtra(Intent.EXTRA_STREAM, uri); + share.setPackage("com.instagram.android"); + mContext.startActivity(Intent.createChooser(share, "Share to")); + callback.onSuccess(); + } +} diff --git a/Share/src/main/java/com/yunbao/share/platform/Line.java b/Share/src/main/java/com/yunbao/share/platform/Line.java new file mode 100644 index 000000000..bbad5c934 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/platform/Line.java @@ -0,0 +1,31 @@ +package com.yunbao.share.platform; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import com.yunbao.share.AbsShareInterface; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; + +import java.net.URLEncoder; + +public class Line extends AbsShareInterface { + + public Line(Context context) { + super(context); + } + + @Override + public void share(ShareBuilder builder, ICallback callback) { + try { + Intent share = new Intent(Intent.ACTION_VIEW, Uri.parse("https://line.me/R/share?text=" + URLEncoder.encode(builder.getText(), "UTF-8"))); + mContext.startActivity(share); + callback.onSuccess(); + } catch (Exception e) { + callback.onFailure(); + throw new RuntimeException(e); + } + } + +} diff --git a/Share/src/main/java/com/yunbao/share/platform/MessengerShare.java b/Share/src/main/java/com/yunbao/share/platform/MessengerShare.java new file mode 100644 index 000000000..0080b3d47 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/platform/MessengerShare.java @@ -0,0 +1,60 @@ +package com.yunbao.share.platform; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; + +import androidx.annotation.NonNull; + +import com.facebook.CallbackManager; +import com.facebook.FacebookCallback; +import com.facebook.FacebookException; +import com.facebook.FacebookSdk; +import com.facebook.share.Sharer; +import com.facebook.share.model.ShareLinkContent; +import com.facebook.share.widget.MessageDialog; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.share.AbsShareInterface; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; + +public class MessengerShare extends AbsShareInterface { + public static CallbackManager callbackManager; + + public MessengerShare(Context context) { + super(context); + FacebookSdk.setIsDebugEnabled(true); + } + + @Override + public void share(ShareBuilder builder, ICallback callback) { + callbackManager = CallbackManager.Factory.create(); + ShareLinkContent content = new ShareLinkContent.Builder() + .setContentUrl(Uri.parse(builder.getLink())) + .build(); + MessageDialog dialog = new MessageDialog((Activity) mContext); + dialog.registerCallback(callbackManager, new FacebookCallback() { + @Override + public void onSuccess(Sharer.Result result) { + ToastUtil.show("Messenger分享成功:"+result.getPostId()); + callback.onSuccess(); + } + + @Override + public void onCancel() { + ToastUtil.show("Messenger分享取消"); + } + + @Override + public void onError(@NonNull FacebookException e) { + ToastUtil.show("Messenger分享失败:" + e.toString()); + e.printStackTrace(); + } + }); + if(dialog.canShow(content)) { + dialog.show(content); + }else{ + callback.onFailure(); + } + } +} diff --git a/Share/src/main/java/com/yunbao/share/platform/TwitterShare.java b/Share/src/main/java/com/yunbao/share/platform/TwitterShare.java new file mode 100644 index 000000000..fbd73b0b5 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/platform/TwitterShare.java @@ -0,0 +1,73 @@ +package com.yunbao.share.platform; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import com.twitter.sdk.android.core.Twitter; +import com.yunbao.share.AbsShareInterface; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; + +import java.net.URLEncoder; + +public class TwitterShare extends AbsShareInterface { + public TwitterShare(Context context) { + super(context); + Twitter.initialize(context); + + } + + @Override + public void share(ShareBuilder date, ICallback callback) { + +/* + new TwitterAuthClient().authorize((Activity) mContext, new Callback() { + @Override + public void success(Result result) { + //获取以下登录成功返回信息进行登录验证 + + //获取登录用户信息 + final TwitterSession activeSession=TwitterCore.getInstance().getSessionManager().getActiveSession(); + Intent intent = new ComposerActivity.Builder(mContext) + .session(activeSession) + .image(fileToUri(date.getFile())) + .text(date.getText()) + .hashtags("#twitter") + .createIntent(); + mContext.startActivity(intent); + + } + @Override + public void failure(TwitterException e) { + } + });*/ + /* TweetComposer.Builder builder; + if (date.getFile() == null) { + try { + builder=new TweetComposer.Builder(mContext) + .text(date.getText()) + .url(new URL(date.getLink())); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } else { + builder = new TweetComposer.Builder(mContext) + .text(date.getText()) + .image(fileToUri(date.getFile())); + } + builder.show();*/ + try { + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_VIEW); + sendIntent.putExtra(Intent.EXTRA_TEXT, date.getLink()); + // sendIntent.setType("text/plain"); + //sendIntent.setPackage("com.twitter.composer.ComposerShareActivity"); + sendIntent.setData(Uri.parse("https://twitter.com/intent/tweet?text=" +URLEncoder.encode(date.getText(),"UTF-8"))); + mContext.startActivity(sendIntent); + callback.onSuccess(); + } catch (Exception e) { + callback.onFailure(); + } + } +} diff --git a/Share/src/main/java/com/yunbao/share/platform/WhatsApp.java b/Share/src/main/java/com/yunbao/share/platform/WhatsApp.java new file mode 100644 index 000000000..51485e6fb --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/platform/WhatsApp.java @@ -0,0 +1,30 @@ +package com.yunbao.share.platform; + +import android.content.Context; +import android.content.Intent; + +import com.yunbao.share.AbsShareInterface; +import com.yunbao.share.ICallback; +import com.yunbao.share.bean.ShareBuilder; + +public class WhatsApp extends AbsShareInterface { + public WhatsApp(Context context) { + super(context); + } + + @Override + public void share(ShareBuilder builder, ICallback callback) { + try { + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, builder.getText()); + sendIntent.setType("text/plain"); + sendIntent.setPackage("com.whatsapp"); + mContext.startActivity(sendIntent); + callback.onSuccess(); + } catch (Exception e) { + callback.onFailure(); + } + + } +} diff --git a/Share/src/main/java/com/yunbao/share/receiver/TwitterResultReceiver.java b/Share/src/main/java/com/yunbao/share/receiver/TwitterResultReceiver.java new file mode 100644 index 000000000..0ff6d9eb9 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/receiver/TwitterResultReceiver.java @@ -0,0 +1,28 @@ +package com.yunbao.share.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.twitter.sdk.android.tweetcomposer.TweetUploadService; +import com.yunbao.common.utils.ToastUtil; + +public class TwitterResultReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.i("分享log", "onReceive: "+intent.getAction()); + if (TweetUploadService.UPLOAD_SUCCESS.equals(intent.getAction())) { + ToastUtil.show("推特分享成功"); + // success + final Long tweetId = intent.getExtras().getLong(TweetUploadService.EXTRA_TWEET_ID); + } else if (TweetUploadService.UPLOAD_FAILURE.equals(intent.getAction())) { + // failure + ToastUtil.show("推特分享失败"); + final Intent retryIntent = intent.getExtras().getParcelable(TweetUploadService.EXTRA_RETRY_INTENT); + } else if (TweetUploadService.TWEET_COMPOSE_CANCEL.equals(intent.getAction())) { + // cancel + ToastUtil.show("推特分享取消"); + } + } +} diff --git a/Share/src/main/java/com/yunbao/share/ui/InvitePopDialog.java b/Share/src/main/java/com/yunbao/share/ui/InvitePopDialog.java new file mode 100644 index 000000000..fc109bffc --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/ui/InvitePopDialog.java @@ -0,0 +1,131 @@ +package com.yunbao.share.ui; + +import static android.content.Context.CLIPBOARD_SERVICE; + +import android.app.Dialog; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.makeramen.roundedimageview.RoundedImageView; +import com.pdlive.shayu.R; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.share.bean.ShareBuilder; +import com.yunbao.share.adapters.ShareAppAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class InvitePopDialog extends AbsDialogPopupWindow { + private ShareAppAdapter adapter; + private RecyclerView list; + private RoundedImageView avatar; + private TextView info; + private TextView link; + private List data; + + private String uid; + private String anchorId; + private String anchorName; + private String anchorAvatar; + + public InvitePopDialog(@NonNull Context context) { + super(context); + } + + public InvitePopDialog setUid(String uid) { + this.uid = uid; + return this; + } + + public InvitePopDialog setAnchorId(String anchorId) { + this.anchorId = anchorId; + return this; + } + + public InvitePopDialog setAnchorName(String anchorName) { + this.anchorName = anchorName; + return this; + } + + public InvitePopDialog setAnchorAvatar(String anchorAvatar) { + this.anchorAvatar = anchorAvatar; + return this; + } + + @Override + public void buildDialog(XPopup.Builder builder) { + + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_share; + } + + + @Override + protected void onCreate() { + super.onCreate(); + findViewById(R.id.close).setOnClickListener(v -> dismiss()); + findViewById(R.id.share_copy).setOnClickListener(v -> copyLink()); + findViewById(R.id.share_title).setOnClickListener(v -> copyLink()); + findViewById(R.id.share_preview).setVisibility(GONE); + findViewById(R.id.share_dialog).setBackgroundResource(R.mipmap.bg_dialog_inviet); + ((TextView) findViewById(R.id.share_title)).setText(R.string.dialog_invite_title); + ((TextView) findViewById(R.id.share_title)).setTextColor(R.drawable.bg_invite_title); + list = findViewById(R.id.share_apps_list); + avatar = findViewById(R.id.share_avatar); + info = findViewById(R.id.share_info); + link = findViewById(R.id.share_link); + adapter = new ShareAppAdapter(getContext()); + list.setLayoutManager(new GridLayoutManager(getContext(), 3)); + list.setAdapter(adapter); + initData(); + } + + private void initData() { + data = new ArrayList<>(); + data.add(builder(ShareBuilder.APP_FACEBOOK)); + data.add(builder(ShareBuilder.APP_LINE)); + data.add(builder(ShareBuilder.APP_TWITTER)); + data.add(builder(ShareBuilder.APP_WHATSAPP)); + data.add(builder(ShareBuilder.APP_MESSENGER)); + // data.add(builder(ShareBuilder.APP_INSTAGRAM)); + adapter.setList(data); + + } + + private ShareBuilder builder(int type) { + ShareBuilder builder = ShareBuilder.builder(type); + //builder.setText(WordUtil.getString(R.string.dialog_share_info)); + builder.setLink(ShareBuilder.createInviteLink(uid)); + builder.setUid(uid); + builder.setAnchorId(anchorId); + builder.setAnchorName(anchorName); + builder.setAnchorAvatar(anchorAvatar); + return builder; + } + + private void copyLink() { + ClipboardManager cm = (ClipboardManager) getContext().getSystemService(CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText("text", link.getText().toString()); + cm.setPrimaryClip(clipData); + ToastUtil.show(WordUtil.getString(com.yunbao.common.R.string.copy_success)); + DialogUitl.showSimpleDialog(getContext(), ShareBuilder.createInviteLink(uid), new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + dialog.dismiss(); + } + }); + } +} diff --git a/Share/src/main/java/com/yunbao/share/ui/InviteRewardPopDialog.java b/Share/src/main/java/com/yunbao/share/ui/InviteRewardPopDialog.java new file mode 100644 index 000000000..1ac8acecc --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/ui/InviteRewardPopDialog.java @@ -0,0 +1,131 @@ +package com.yunbao.share.ui; + +import static android.content.Context.CLIPBOARD_SERVICE; + +import android.app.Dialog; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.makeramen.roundedimageview.RoundedImageView; +import com.pdlive.shayu.R; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.share.bean.ShareBuilder; +import com.yunbao.share.adapters.ShareAppAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class InviteRewardPopDialog extends AbsDialogPopupWindow { + private ShareAppAdapter adapter; + private RecyclerView list; + private RoundedImageView avatar; + private TextView info; + private TextView link; + private List data; + + private String uid; + private String anchorId; + private String anchorName; + private String anchorAvatar; + + public InviteRewardPopDialog(@NonNull Context context) { + super(context); + } + + public InviteRewardPopDialog setUid(String uid) { + this.uid = uid; + return this; + } + + public InviteRewardPopDialog setAnchorId(String anchorId) { + this.anchorId = anchorId; + return this; + } + + public InviteRewardPopDialog setAnchorName(String anchorName) { + this.anchorName = anchorName; + return this; + } + + public InviteRewardPopDialog setAnchorAvatar(String anchorAvatar) { + this.anchorAvatar = anchorAvatar; + return this; + } + + @Override + public void buildDialog(XPopup.Builder builder) { + + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_share; + } + + + @Override + protected void onCreate() { + super.onCreate(); + findViewById(R.id.close).setOnClickListener(v -> dismiss()); + findViewById(R.id.share_copy).setOnClickListener(v -> copyLink()); + findViewById(R.id.share_title).setOnClickListener(v -> copyLink()); + findViewById(R.id.share_preview).setVisibility(GONE); + findViewById(R.id.share_dialog).setBackgroundResource(R.mipmap.bg_dialog_inviet); + ((TextView) findViewById(R.id.share_title)).setText(R.string.dialog_invite_title); + ((TextView) findViewById(R.id.share_title)).setTextColor(R.drawable.bg_invite_title); + list = findViewById(R.id.share_apps_list); + avatar = findViewById(R.id.share_avatar); + info = findViewById(R.id.share_info); + link = findViewById(R.id.share_link); + adapter = new ShareAppAdapter(getContext()); + list.setLayoutManager(new LinearLayoutManager(getContext(),RecyclerView.VERTICAL,false)); + list.setAdapter(adapter); + initData(); + } + + private void initData() { + data = new ArrayList<>(); + data.add(builder(ShareBuilder.APP_FACEBOOK)); + data.add(builder(ShareBuilder.APP_LINE)); + data.add(builder(ShareBuilder.APP_TWITTER)); + data.add(builder(ShareBuilder.APP_WHATSAPP)); + data.add(builder(ShareBuilder.APP_MESSENGER)); + // data.add(builder(ShareBuilder.APP_INSTAGRAM)); + adapter.setList(data); + + } + + private ShareBuilder builder(int type) { + ShareBuilder builder = ShareBuilder.builder(type); + //builder.setText(WordUtil.getString(R.string.dialog_share_info)); + builder.setLink(ShareBuilder.createInviteLink(uid)); + builder.setUid(uid); + builder.setAnchorId(anchorId); + builder.setAnchorName(anchorName); + builder.setAnchorAvatar(anchorAvatar); + return builder; + } + + private void copyLink() { + ClipboardManager cm = (ClipboardManager) getContext().getSystemService(CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText("text", link.getText().toString()); + cm.setPrimaryClip(clipData); + ToastUtil.show(WordUtil.getString(com.yunbao.common.R.string.copy_success)); + DialogUitl.showSimpleDialog(getContext(), ShareBuilder.createInviteLink(uid), new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + dialog.dismiss(); + } + }); + } +} diff --git a/Share/src/main/java/com/yunbao/share/ui/SharePopDialog.java b/Share/src/main/java/com/yunbao/share/ui/SharePopDialog.java new file mode 100644 index 000000000..1b38891a6 --- /dev/null +++ b/Share/src/main/java/com/yunbao/share/ui/SharePopDialog.java @@ -0,0 +1,146 @@ +package com.yunbao.share.ui; + +import static android.content.Context.CLIPBOARD_SERVICE; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.makeramen.roundedimageview.RoundedImageView; +import com.pdlive.shayu.R; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.share.bean.ShareBuilder; +import com.yunbao.share.adapters.ShareAppAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class SharePopDialog extends AbsDialogPopupWindow { + private ShareAppAdapter adapter; + private RecyclerView list; + private RoundedImageView avatar; + private TextView info; + private TextView link; + private List data; + + private String uid; + private String anchorId; + private String anchorName; + private String anchorAvatar; + private String shareLink; + + public SharePopDialog(@NonNull Context context) { + super(context); + } + + public SharePopDialog setUid(String uid) { + this.uid = uid; + return this; + } + + public SharePopDialog setAnchorId(String anchorId) { + this.anchorId = anchorId; + return this; + } + + public SharePopDialog setAnchorName(String anchorName) { + this.anchorName = anchorName; + return this; + } + + public SharePopDialog setAnchorAvatar(String anchorAvatar) { + this.anchorAvatar = anchorAvatar; + return this; + } + + public SharePopDialog setShareLink(String link) { + this.shareLink = link; + return this; + } + + @Override + public void buildDialog(XPopup.Builder builder) { + + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_share; + } + + + @Override + protected void onCreate() { + super.onCreate(); + findViewById(R.id.close).setOnClickListener(v -> dismiss()); + findViewById(R.id.share_copy).setOnClickListener(v -> copyLink()); + list = findViewById(R.id.share_apps_list); + avatar = findViewById(R.id.share_avatar); + info = findViewById(R.id.share_info); + link = findViewById(R.id.share_link); + adapter = new ShareAppAdapter(getContext()); + list.setLayoutManager(new GridLayoutManager(getContext(), 3)); + list.setAdapter(adapter); + initData(); + } + + private void initData() { + data = new ArrayList<>(); + data.add(builder(ShareBuilder.APP_FACEBOOK)); + data.add(builder(ShareBuilder.APP_LINE)); + data.add(builder(ShareBuilder.APP_TWITTER)); + data.add(builder(ShareBuilder.APP_WHATSAPP)); + data.add(builder(ShareBuilder.APP_MESSENGER)); + //data.add(builder(ShareBuilder.APP_INSTAGRAM)); + adapter.setList(data); + String url; + if (shareLink == null) { + url = ShareBuilder.createLiveShareLink(uid, anchorId, anchorName, anchorAvatar).substring(0, 40) + "..."; + } else { + if (shareLink.length() > 40) { + url = shareLink.substring(0, 40) + "..."; + } else { + url = shareLink; + } + } + link.setText(url); + info.setText(String.format(WordUtil.getString(R.string.dialog_share_info), StringUtil.isEmpty(anchorName) ? "" : anchorName)); + ImgLoader.display(getContext(), anchorAvatar, avatar); + } + + private ShareBuilder builder(int type) { + ShareBuilder builder = ShareBuilder.builder(type); + builder.setText(String.format(WordUtil.getString(R.string.dialog_share_info), StringUtil.isEmpty(anchorName) ? "" : anchorName)); + builder.setUid(uid); + builder.setAnchorId(anchorId); + builder.setAnchorName(anchorName); + builder.setAnchorAvatar(anchorAvatar); + if (shareLink != null) { + builder.setLink(shareLink); + } + return builder; + } + + private void copyLink() { + String url; + if (shareLink != null) { + url = shareLink; + } else { + url = ShareBuilder.createLiveShareLink(uid, anchorId, anchorName, anchorAvatar); + } + ClipboardManager cm = (ClipboardManager) getContext().getSystemService(CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText("text", url); + cm.setPrimaryClip(clipData); + ToastUtil.show(WordUtil.getString(com.yunbao.common.R.string.copy_success)); + } +} diff --git a/Share/src/main/res/drawable/background_fff.xml b/Share/src/main/res/drawable/background_fff.xml new file mode 100644 index 000000000..2b3a47e26 --- /dev/null +++ b/Share/src/main/res/drawable/background_fff.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/drawable/bg_btn.xml b/Share/src/main/res/drawable/bg_btn.xml new file mode 100644 index 000000000..f7cda2e72 --- /dev/null +++ b/Share/src/main/res/drawable/bg_btn.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/drawable/bg_invite_title.xml b/Share/src/main/res/drawable/bg_invite_title.xml new file mode 100644 index 000000000..1d7b0cf28 --- /dev/null +++ b/Share/src/main/res/drawable/bg_invite_title.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/layout/dialog_invite_list.xml b/Share/src/main/res/layout/dialog_invite_list.xml new file mode 100644 index 000000000..877aab9e3 --- /dev/null +++ b/Share/src/main/res/layout/dialog_invite_list.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/layout/dialog_share.xml b/Share/src/main/res/layout/dialog_share.xml new file mode 100644 index 000000000..65b31da1c --- /dev/null +++ b/Share/src/main/res/layout/dialog_share.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/layout/item_invite_reward.xml b/Share/src/main/res/layout/item_invite_reward.xml new file mode 100644 index 000000000..33cbd0d57 --- /dev/null +++ b/Share/src/main/res/layout/item_invite_reward.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/layout/item_share_app.xml b/Share/src/main/res/layout/item_share_app.xml new file mode 100644 index 000000000..789064f41 --- /dev/null +++ b/Share/src/main/res/layout/item_share_app.xml @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/Share/src/main/res/layout/view_share_preview.xml b/Share/src/main/res/layout/view_share_preview.xml new file mode 100644 index 000000000..f7c1e97f2 --- /dev/null +++ b/Share/src/main/res/layout/view_share_preview.xml @@ -0,0 +1,74 @@ + + + + + + + + + +