hanjing лет назад: 6
Родитель
Сommit
9cf8a201ba

+ 4 - 5
app/src/main/AndroidManifest.xml

@@ -2,7 +2,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     package="com.sheep.jiuyan.samllsheep">
-
     <!-- 极光推送 -->
     <!-- Required -->
     <permission
@@ -96,12 +95,14 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true">
+        <activity android:name="com.sheep.gamegroup.module.task.VideoTaskActivity"></activity>
+
         <service
             android:name=".service.SyncCheckService"
             android:enabled="true"
             android:exported="true">
             <intent-filter>
-                <action android:name="com.sheep.jiuyan.samllsheep.CheckSync"/>
+                <action android:name="com.sheep.jiuyan.samllsheep.CheckSync" />
             </intent-filter>
         </service>
 
@@ -837,7 +838,6 @@
             android:name="com.sheep.gamegroup.view.activity.ActInvitation"
             android:screenOrientation="portrait"
             android:theme="@style/AppActionTheme" /> <!-- start幂动科技 -->
-
         <receiver
             android:name="com.mdad.sdk.mdsdk.AppInstallReceiver"
             android:enabled="true"
@@ -849,8 +849,7 @@
 
                 <data android:scheme="package" />
             </intent-filter>
-        </receiver>
-        <!-- start 小绵羊sdk相关 -->
+        </receiver> <!-- start 小绵羊sdk相关 -->
         <activity
             android:name="com.sheep.gamegroup.view.activity.ActPay"
             android:configChanges="orientation|screenSize"

+ 9 - 0
app/src/main/java/com/kfzs/duanduan/cardview/ScreenUtil.java

@@ -4,8 +4,11 @@ import android.annotation.TargetApi;
 import android.content.Context;
 import android.graphics.Point;
 import android.os.Build;
+import android.util.DisplayMetrics;
 import android.view.WindowManager;
 
+import com.sheep.jiuyan.samllsheep.SheepApp;
+
 /**
  * Created by jameson on 12/19/15.
  */
@@ -35,4 +38,10 @@ public class ScreenUtil {
         final float scale = context.getResources().getDisplayMetrics().density;
         return (int) (pxValue / scale + 0.5f);
     }
+
+    public static float getDensity(){
+        DisplayMetrics displayMetrics = SheepApp.getInstance().getResources().getDisplayMetrics();
+        float density = displayMetrics.density;
+        return density;
+    }
 }

+ 18 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/TaskEty.java

@@ -51,8 +51,26 @@ public class TaskEty implements Serializable, IDownload {
 
     //-----------------
     private String video_url;
+    private int video_num;
+    private int video_type;
     private int benchmark; //4 显示游戏充值
 
+    public int getVideo_num() {
+        return video_num;
+    }
+
+    public void setVideo_num(int video_num) {
+        this.video_num = video_num;
+    }
+
+    public int getVideo_type() {
+        return video_type;
+    }
+
+    public void setVideo_type(int video_type) {
+        this.video_type = video_type;
+    }
+
     public int getBenchmark() {
         return benchmark;
     }

+ 301 - 0
app/src/main/java/com/sheep/gamegroup/module/task/VideoTaskActivity.java

@@ -0,0 +1,301 @@
+package com.sheep.gamegroup.module.task;
+
+import android.Manifest;
+import android.content.pm.PackageManager;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.text.TextUtils;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kfzs.duanduan.cardview.ScreenUtil;
+import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.model.entity.BaseMessage;
+import com.sheep.gamegroup.model.entity.Release_task;
+import com.sheep.gamegroup.model.entity.TaskAcceptedEty;
+import com.sheep.gamegroup.model.util.SheepSubscriber;
+import com.sheep.gamegroup.module.task.helper.ADVideoHelper;
+import com.sheep.gamegroup.module.task.helper.VideoAd;
+import com.sheep.gamegroup.util.CommonUtil;
+import com.sheep.gamegroup.util.DeviceUtil;
+import com.sheep.gamegroup.util.GlideImageLoader;
+import com.sheep.gamegroup.util.LocationUtils;
+import com.sheep.gamegroup.util.LogUtil;
+import com.sheep.gamegroup.util.UMConfigUtils;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.view.activity.helper.SplashHelper;
+import com.sheep.gamegroup.view.customview.SheepGSYVideoView;
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.G;
+import com.shuyu.gsyvideoplayer.GSYVideoManager;
+import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
+import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack;
+import com.umeng.socialize.utils.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import butterknife.BindView;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+public class VideoTaskActivity extends BaseActivity {
+
+    @BindView(R.id.video_player_view)
+    SheepGSYVideoView videoPlayerView;
+
+    private int releaseTaskId = -1;
+
+    private Release_task releaseTask;
+    private TaskAcceptedEty acceptedTask;
+
+    private VideoAd currentVideoAd;
+    private int watchCount = 0;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_video_task;
+    }
+
+    @Override
+    public void onBackPressed() {
+        super.onBackPressed();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        videoPlayerView.onVideoResume();
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        videoPlayerView.onVideoPause();
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        if (checkLocationPermission()) {
+            loadReleaseTask();
+        }
+    }
+
+    @Override
+    public void initView() {
+        hideSystemNavBar();
+        hideSystemStatusBar();
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        videoPlayerView.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                if (event.getAction() == MotionEvent.ACTION_UP && currentVideoAd != null) {
+                    currentVideoAd.clickX = (int) event.getRawX();
+                    currentVideoAd.clickY = (int) event.getRawY();
+                    showDownloadConfirmDialog();
+                }
+                return false;
+            }
+        });
+    }
+
+    @Override
+    public void initData() {
+        releaseTaskId = getIntent().getIntExtra("task_id", -1);
+        if (checkLocationPermission()) {
+            loadReleaseTask();
+        }
+    }
+
+    private void loadReleaseTask() {
+        CommonUtil.getInstance().getTaskDesc(releaseTaskId, rt -> {
+            if (rt == null) {
+                G.showToast("没有该任务");
+            }
+            releaseTask = rt;
+            if (releaseTask.getAccepted_task_id() > 0) {
+                loadAcceptedTask();
+            } else {
+                LogUtil.logI("---------------没有接受任务---------------");
+                acceptTask();
+            }
+        });
+    }
+
+    private void loadAcceptedTask() {
+        CommonUtil.getInstance().getAcceptedTask(releaseTaskId, at -> {
+            if (at == null) {
+                acceptTask();
+                return;
+            }
+            acceptedTask = at;
+            ViewUtil.showConfirmDialog(VideoTaskActivity.this,
+                    "提示",
+                    "你需要观看" + releaseTask.getTask().getVideo_num() + "个视频, 即可获得" + releaseTask.getBonusText() + "元",
+                    "放弃", "继续观看",
+                    d -> finish(),
+                    d -> loadAd()).show();
+        });
+    }
+
+    private void loadAd() {
+        ADVideoHelper.loadVideoAD((ret, ad, msg) -> {
+            if (ret) {
+                currentVideoAd = ad;
+                playVideo();
+            } else {
+                G.showToast(msg);
+                finish();
+            }
+        });
+    }
+
+    private void playVideo() {
+        GSYVideoOptionBuilder gsyVideoOption = new GSYVideoOptionBuilder();
+        gsyVideoOption.setIsTouchWiget(false)
+                .setRotateViewAuto(true)
+                .setLockLand(true)
+                .setAutoFullWithSize(true)
+                .setShowFullAnimation(false)
+                .setUrl(currentVideoAd.videoUrl)
+                .setNeedLockFull(true)
+                .setCacheWithPlay(false)
+                .setVideoAllCallBack(new GSYSampleCallBack() {
+                    @Override
+                    public void onPrepared(String url, Object... objects) {
+                        super.onPrepared(url, objects);
+                        LogUtil.println("initPlay", "onPrepared", url, objects);
+                    }
+
+                    @Override
+                    public void onAutoComplete(String url, Object... objects) {
+                        super.onAutoComplete(url, objects);
+                        watchCount++;
+                        if (watchCount >= releaseTask.getTask().getVideo_num()) {
+                            commitAutoTask();
+                        } else {
+                            ViewUtil.showConfirmDialog(VideoTaskActivity.this,
+                                    "提示",
+                                    "你需要观看" + (releaseTask.getTask().getVideo_num() - watchCount) + "个视频, 即可获得" + releaseTask.getBonusText() + "元",
+                                    "放弃", "继续观看",
+                                    d -> finish(),
+                                    d -> loadAd()).show();
+                        }
+                    }
+
+                    @Override
+                    public void onPlayError(String url, Object... objects) {
+                        super.onPlayError(url, objects);
+                        long curPosition = GSYVideoManager.instance().getCurPlayerManager().getCurrentPosition();
+                        LogUtil.println("initPlay", "onPlayError", url, curPosition);
+                    }
+                }).build(videoPlayerView);
+        videoPlayerView.startPlayLogic();
+    }
+
+    private void acceptTask() {
+        String device_id = DeviceUtil.getDeviceId(SheepApp.getInstance());
+        UMConfigUtils.Event.TASK_ACCEPT.onEvent("device_id", device_id, "release_task_id", releaseTaskId);
+        JSONObject object = new JSONObject();
+        object.put("device_id", device_id);
+        object.put("release_task_id", releaseTaskId);
+        object.put("create_time", System.currentTimeMillis() / 1000L);
+        object.put("app_version", String.valueOf(BuildConfig.VERSION_CODE));
+        SheepApp.getInstance()
+                .getNetComponent()
+                .getApiService()
+                .acceptedTask(object)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        G.showToast(baseMessage.getErrorMsg());
+                    }
+
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        releaseTask.setIs_running(true);
+                        releaseTask.getTask().setRelease_task_id(releaseTask.getId());
+                        loadAcceptedTask();
+                    }
+                });
+    }
+
+    private void commitAutoTask() {
+        JSONObject params = new JSONObject();
+        String gps = LocationUtils.getInstance().getLongitudeLatitude();
+        params.put("gps", gps);
+        params.put("release_task_id", releaseTaskId);
+        params.put("create_time", System.currentTimeMillis() / 1000L);//这里添加时间戳,防止用户抓包后重复使用
+        SheepApp.getInstance().getNetComponent().getApiService().commitAutoTask(params)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(getApplicationContext()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        CommonUtil.getInstance().updateAutoCheck(null);
+                        //这里领取了奖励,要刷新用户信息
+                        CommonUtil.getInstance().updateUserInfo(null);
+                        String amount = releaseTask.getBonusText();
+                        try {
+                            Map h = JSON.parseObject(baseMessage.getData() + "");
+
+                            amount = h.get("amount") + "";
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+
+                        ViewUtil.showMsgDialog(VideoTaskActivity.this, String.format(Locale.CHINA, "奖励已完成,获得奖励%s元", TextUtils.isEmpty(amount) ? releaseTask.getBonusText() : amount), "恭喜你", true);
+                    }
+
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        G.showToast(baseMessage);
+                    }
+                });
+    }
+
+    private void showDownloadConfirmDialog() {
+        if (currentVideoAd == null) return;
+        View rootView = View.inflate(this, R.layout.video_ad_confirm, null);
+        ImageView app_logo_iv = rootView.findViewById(R.id.app_logo_iv);
+        TextView app_name_tv = rootView.findViewById(R.id.app_name_tv);
+        TextView app_desc_tv = rootView.findViewById(R.id.app_desc_tv);
+        int radius = ScreenUtil.dip2px(this, 8);
+        GlideImageLoader.roundedCornersImage(app_logo_iv, currentVideoAd.videoUrl, radius);
+        app_name_tv.setText(currentVideoAd.title);
+        app_desc_tv.setText(currentVideoAd.desc);
+        ViewUtil.showConfirmDialog(this, "下载", rootView, "取消", "立即下载",
+                d -> d.dismiss(),
+                d -> Log.e("adf", "download")).show();
+    }
+
+    public boolean checkLocationPermission() {
+        List<String> permissions = new ArrayList<String>();
+        boolean result = true;
+        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+            permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
+            result = false;
+        }
+        if (permissions.size() > 0) {
+            String[] permissionArrays = new String[permissions.size()];
+            permissionArrays = permissions.toArray(permissionArrays);
+            ActivityCompat.requestPermissions(this,
+                    permissionArrays,
+                    1111);
+        }
+        return result;
+    }
+
+}

+ 156 - 0
app/src/main/java/com/sheep/gamegroup/module/task/helper/ADDownloader.java

@@ -0,0 +1,156 @@
+package com.sheep.gamegroup.module.task.helper;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+import com.liulishuo.okdownload.DownloadContext;
+import com.liulishuo.okdownload.DownloadContextListener;
+import com.liulishuo.okdownload.DownloadTask;
+import com.liulishuo.okdownload.StatusUtil;
+import com.liulishuo.okdownload.core.cause.EndCause;
+import com.liulishuo.okdownload.core.cause.ResumeFailedCause;
+import com.liulishuo.okdownload.core.listener.DownloadListener1;
+import com.liulishuo.okdownload.core.listener.assist.Listener1Assist;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+
+import org.xutils.common.util.LogUtil;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ADDownloader implements DownloadContextListener {
+
+    private DownloadContext context;
+    private DownloadContext.Builder builder;
+    private QueueListener queueListener;
+    private File parentFile;
+
+    private ProgressListener mListener;
+    private Map<String, DownloadTask> tasks = new HashMap<>();
+
+    public ADDownloader() {
+    }
+
+    public ADDownloader init() {
+        DownloadContext.QueueSet set = new DownloadContext.QueueSet();
+        parentFile = new File(SheepApp.getInstance().getFilesDir(), "download");
+        set.setParentPathFile(parentFile);
+        set.setMinIntervalMillisCallbackProcess(200);
+        builder = set.commit();
+        builder.setListener(this);
+        context = builder.build();
+        queueListener = new QueueListener();
+        return this;
+    }
+
+    public ADDownloader setListener(ProgressListener mListener) {
+        this.mListener = mListener;
+        return this;
+    }
+
+    @Override
+    public void taskEnd(@NonNull DownloadContext context, @NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause, int remainCount) {
+
+    }
+
+    @Override
+    public void queueEnd(@NonNull DownloadContext context) {
+
+    }
+
+    public void start(VideoAd item) {
+        DownloadTask task = builder.bind(item.url);
+        task.setTag(item);
+        if (StatusUtil.getStatus(task) == StatusUtil.Status.RUNNING) {
+            return;
+        } else if (StatusUtil.getStatus(task) == StatusUtil.Status.COMPLETED) {
+            return;
+        }
+        task.enqueue(queueListener);
+        if (!tasks.containsKey(item.url)) {
+            tasks.put(item.url, task);
+        }
+    }
+
+    public void cancel(VideoAd ad) {
+        if (tasks.containsKey(ad.url)) {
+            tasks.get(ad.url).cancel();
+        }
+    }
+
+    public void delete(VideoAd ad) {
+        cancel(ad);
+        tasks.remove(ad.url);
+        if (!TextUtils.isEmpty(ad.path)) {
+            new File(ad.path).deleteOnExit();
+        }
+        ad.isDelete = 1;
+        if (mListener != null) {
+            mListener.onStatus("DELETE", null);
+        }
+    }
+
+    public void stopAll() {
+        if (context != null) {
+            context.stop();
+        }
+    }
+
+    public interface ProgressListener {
+        void onProgress(long offset, long total);
+
+        void onStatus(String status, String msg);
+    }
+
+    public class QueueListener extends DownloadListener1 {
+
+        @Override
+        public void taskStart(@NonNull DownloadTask task, @NonNull Listener1Assist.Listener1Model model) {
+            LogUtil.i("taskStart: " + task.getUrl());
+        }
+
+        @Override
+        public void retry(@NonNull DownloadTask task, @NonNull ResumeFailedCause cause) {
+            LogUtil.i("taskRetry: " + task.getUrl() + "  " + cause.toString());
+        }
+
+        @Override
+        public void connected(@NonNull DownloadTask task, int blockCount, long currentOffset, long totalLength) {
+            LogUtil.i("taskConnect: " + task.getUrl());
+            VideoAd item = (VideoAd) task.getTag();
+            if (task.getFile() != null) {
+                item.path = task.getFile().getAbsolutePath();
+            }
+            item.subStatus = StatusUtil.getStatus(task).name();
+        }
+
+        @Override
+        public void progress(@NonNull DownloadTask task, long currentOffset, long totalLength) {
+            LogUtil.i("taskProgress: " + task.getUrl() + ": " + currentOffset + " / " + totalLength);
+            VideoAd item = (VideoAd) task.getTag();
+            item.offset = currentOffset;
+            item.total = totalLength;
+            if (mListener != null) {
+                mListener.onProgress(currentOffset, totalLength);
+            }
+        }
+
+        @Override
+        public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause,
+                            @Nullable Exception realCause,
+                            @NonNull Listener1Assist.Listener1Model model) {
+            if (realCause != null) {
+                realCause.printStackTrace();
+            }
+            LogUtil.i("taskComplete: " + task.getUrl() + "   " + StatusUtil.getStatus(task).name() + "   " + cause.name());
+            VideoAd item = (VideoAd) task.getTag();
+            item.subStatus = StatusUtil.getStatus(task).name();
+            if (mListener != null) {
+                mListener.onStatus(StatusUtil.getStatus(task).name(), (realCause != null ? realCause.getMessage() : null));
+            }
+        }
+    }
+}

+ 176 - 0
app/src/main/java/com/sheep/gamegroup/module/task/helper/ADVideoHelper.java

@@ -0,0 +1,176 @@
+package com.sheep.gamegroup.module.task.helper;
+
+import android.text.TextUtils;
+import android.util.Log;
+import android.webkit.WebView;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.kfzs.duanduan.cardview.ScreenUtil;
+import com.sheep.gamegroup.util.DeviceUtil;
+import com.sheep.gamegroup.util.LogUtil;
+import com.sheep.gamegroup.util.Md5Util;
+import com.sheep.gamegroup.util.NetUtil;
+import com.sheep.gamegroup.util.SysAppUtil;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.snail.antifake.jni.EmulatorDetectUtil;
+
+import java.io.IOException;
+import java.util.Map;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+public class ADVideoHelper {
+
+    private static String webua;
+    private static final String ADURL = "http://118.190.190.63/api/ad";
+
+    public static void loadVideoAD(ADCallback callback) {
+        String params = generateParams();
+        LogUtil.logI("RequestUrl: " + ADURL);
+        LogUtil.logI("RequestBody: " + params);
+        OkHttpClient client = new OkHttpClient();
+        RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), params);
+        Request request = new Request.Builder()
+                .url(ADURL)
+                .addHeader("Content-Type", "application/json")
+                .post(body)
+                .build();
+        client.newCall(request)
+                .enqueue(new Callback() {
+                    @Override
+                    public void onFailure(Call call, IOException e) {
+                        callback.onCallback(false, null, "网络加载失败");
+                        LogUtil.logI("RequestError: " + e.getMessage());
+                        e.printStackTrace();
+                    }
+
+                    @Override
+                    public void onResponse(Call call, Response response) throws IOException {
+                        String resp = response.body().string();
+                        LogUtil.logI("Response: " + resp);
+                        VideoAd ad = parse(resp);
+                        if (ad != null) {
+                            callback.onCallback(true, ad, null);
+                        } else {
+                            callback.onCallback(false, null, "数据解析失败");
+                        }
+                    }
+                });
+    }
+
+    private static String generateParams() {
+        if (TextUtils.isEmpty(webua)) {
+            webua = new WebView(SheepApp.getInstance()).getSettings().getUserAgentString();
+        }
+        Map<String, Integer> cellInfo = NetUtil.getCellStatus();
+        String r = DeviceUtil.getDeviceId(SheepApp.getInstance()) + SheepApp.getInstance().getPackageName() + System.currentTimeMillis();
+        String bid = Md5Util.getStrMd5(r);
+        String params = "{\n" +
+                "\t\"bid\": \"" + bid + "\",\n" +
+                "\t\"api_version\": \"1.0\",\n" +
+                "\t\"ua\": \"" + SysAppUtil.getUserAgent() + "\",\n" +
+                "\t\"webv_ua\": \"" + webua + "\",\n" +
+                "\t\"sdk_version\": 16,\n" +
+                "\t\"app\": {\n" +
+                "\t\t\"app_id\": \"2918\",\n" +
+                "\t\t\"channel_id\": \"xiaomianyang\",\n" +
+                "\t\t\"app_name\": \"小绵羊\",\n" +
+                "\t\t\"package_name\": \"" + SheepApp.getInstance().getPackageName() + "\",\n" +
+                "\t\t\"category\": \"\",\n" +
+                "\t\t\"app_keywords\": \"\",\n" +
+                "\t\t\"app_version\": \"3.6.9\"\n" +
+                "\t},\n" +
+                "\t\"device\": {\n" +
+                "\t\t\"device_id\": [{\n" +
+                "\t\t\t\"device_id\": \"" + DeviceUtil.getDeviceId(SheepApp.getInstance()) + "\",\n" +
+                "\t\t\t\"device_id_type\": 1,\n" +
+                "\t\t\t\"hash_type\": 0\n" +
+                "\t\t}],\n" +
+                "\t\t\"os_type\": 2,\n" +
+                "\t\t\"os_version\": \"7.0\",\n" +
+                "\t\t\"os_api_level\": \"24\",\n" +
+                "\t\t\"brand\": \"" + SysAppUtil.getDeviceBrand() + "\",\n" +
+                "\t\t\"model\": \"" + SysAppUtil.getDeviceModel() + "\",\n" +
+                "\t\t\"device_type\": 2,\n" +
+                "\t\t\"language\": \"zh\",\n" +
+                "\t\t\"screen_width\": " + ScreenUtil.getScreenWidth(SheepApp.getInstance()) + ",\n" +
+                "\t\t\"screen_height\": " + ScreenUtil.getScreenHeight(SheepApp.getInstance()) + ",\n" +
+                "\t\t\"screen_density\": " + ScreenUtil.getDensity() + ",\n" +
+                "\t\t\"screen_orientation\": 1,\n" +
+                "\t\t\"jailbreaked\": false\n" +
+                "\t},\n" +
+                "\t\"network\": {\n" +
+                "\t\t\"network_type\": " + NetUtil.getNetworkType() + ",\n" +
+                "\t\t\"carrier_id\": " + NetUtil.getSubscriptionOperatorType() + ",\n" +
+                "\t\t\"cellular_id\": {\n" +
+                "\t\t\t\"MCC\": " + cellInfo.get("MCC") + ",\n" +
+                "\t\t\t\"MNC\": " + cellInfo.get("MNC") + ",\n" +
+                "\t\t\t\"LAC\": " + cellInfo.get("LAC") + ",\n" +
+                "\t\t\t\"CID\": " + cellInfo.get("CID") + "\n" +
+                "\t\t}\n" +
+                "\t},\n" +
+                "\t\"adspaces\": [{\n" +
+                "\t\t\"adspace_id\": \"46215\",\n" +
+                "\t\t\"adspace_type\": 3,\n" +
+                "\t\t\"adspace_position\": 2,\n" +
+                "\t\t\"allowed_html\": true,\n" +
+                "\t\t\"width\": 720,\n" +
+                "\t\t\"height\": 1280,\n" +
+                "\t\t\"impression_num\": 3,\n" +
+                "\t\t\"keywords\": \"\",\n" +
+                "\t\t\"channel\": \"任务\",\n" +
+                "\t\t\"open_type\": 2,\n" +
+                "\t\t\"interaction_type\": [2, 7, 3],\n" +
+                "\t\t\"asset\": [4, 3, 1, 2],\n" +
+                "\t\t\"impression_time\": 15,\n" +
+                "\t\t\"page_id\": \"\"\n" +
+                "\t}],\n" +
+                "\t\"is_debug\": false\n" +
+                "}";
+        return params;
+    }
+
+    private static VideoAd parse(String response) {
+        VideoAd ad = new VideoAd();
+        Log.i("ad", "------------------------------------------");
+        LogUtil.logI(response);
+        JSONObject json = JSONObject.parseObject(response);
+        JSONArray arr = json.getJSONArray("ads");
+        if (arr == null || arr.size() == 0) {
+            return null;
+        }
+        JSONObject ado = arr.getJSONObject(0);
+        JSONObject creative = ado.getJSONArray("creative").getJSONObject(0);
+        JSONObject adm = creative.getJSONObject("adm");
+        JSONObject nativ = adm.getJSONObject("nativ");
+        ad.title = nativ.getJSONObject("title").getString("text");
+        ad.logo = nativ.getString("logo");
+        ad.desc = nativ.getString("desc");
+        JSONObject video = nativ.getJSONObject("video");
+        ad.coveImgUrl = video.getString("coveImgUrl");
+        ad.videoUrl = video.getString("videoUrl");
+        ad.package_name = creative.getString("package_name");
+        JSONObject interaction_object = creative.getJSONObject("interaction_object");
+        ad.url_type = interaction_object.getInteger("url_type");
+        ad.url = interaction_object.getString("url");
+
+        JSONArray array = creative.getJSONArray("event_track");
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject event = array.getJSONObject(i);
+            ad.addTrack(event.getString("event_type"), event.getString("notify_url"));
+        }
+        return ad;
+    }
+
+    public interface ADCallback {
+        void onCallback(boolean ret, VideoAd ad, String msg);
+    }
+
+}

+ 152 - 0
app/src/main/java/com/sheep/gamegroup/module/task/helper/VideoAd.java

@@ -0,0 +1,152 @@
+package com.sheep.gamegroup.module.task.helper;
+
+import com.kfzs.duanduan.cardview.ScreenUtil;
+import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.util.DeviceUtil;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.zhy.http.okhttp.OkHttpUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VideoAd {
+
+    public final static String TYPE_SHOW = "1";
+    public final static String TYPE_CLICK = "2";
+    public final static String TYPE_OPEN = "3";
+    public final static String TYPE_DOWNLOAD = "4";
+    public final static String TYPE_INSTALL = "5";
+    public final static String TYPE_ACTIVE = "6";
+    public final static String TYPE_DYNAMIC_SHOW = "7";
+    public final static String TYPE_START_DOWN = "8";
+    public final static String TYPE_START_INSTALL = "9";
+    public final static String TYPE_VIDEO_START = "10";
+    public final static String TYPE_VIDEO_FULL_SCREEN = "11";
+    public final static String TYPE_VIDEO_END = "12";
+    public final static String TYPE_VIDEO_CARD_CLICK = "13";
+    public final static String TYPE_VIDEO_SKIP = "14";
+    public final static String TYPE_VIDEO_LOAD_SUCCED = "15";
+    public final static String TYPE_VIDEO_LOAD_FAILED = "16";
+    public final static String TYPE_VIDEO_MUTE = "17";
+    public final static String TYPE_VIDEO_NON_MUTE = "18";
+    public final static String TYPE_VIDEO_PROGRESS = "19";
+    public final static String TYPE_VIDEO_CLOSE = "20";
+    public final static String TYPE_VIDEO_PAUSE = "21";
+    public final static String TYPE_VIDEO_RESUME = "22";
+    public final static String TYPE_VIDEO_FRAME_CLOSE = "23";
+    public final static String TYPE_VIDEO_FRAME_SHOW = "24";
+    public final static String TYPE_VIDEO_FRAME_CLICK = "25";
+    public final static String TYPE_OPEN_FAILURE = "27";
+
+    public final static int STATUS_NOTHING = 0;
+    public final static int STATUS_DOWNLOADED = 1;
+    public final static int STATUS_INSTALLED = 2;
+
+    public int status = STATUS_NOTHING;
+
+    //属性变量
+    public String title;
+    public String desc;
+    public String logo;
+    public String coveImgUrl;
+    public String videoUrl;
+    public String package_name;
+    public String url;
+    public int url_type = 0;
+
+    public Map<String, List<String>> eventTracks = new HashMap<>();
+
+    //时间变量
+    public int clickX = 129;
+    public int clickY = 312;
+    public String clickId = "";
+
+    //下载变量
+    public String subStatus;
+    public String path;
+    public long offset;
+    public long total;
+    public int isDelete;
+
+    public VideoAd() {
+    }
+
+    public void addTrack(String type, String url) {
+        List<String> tracks = null;
+        if (!eventTracks.containsKey("type")) {
+            tracks = new ArrayList<>();
+            eventTracks.put(type, tracks);
+        }
+        tracks.add(url);
+    }
+
+    public void checkAdStatus() {
+        if(!ApkUtils.getInstance().isPkgInstalled(package_name)){
+        } else {
+            status = STATUS_INSTALLED;
+        }
+    }
+
+    public void trigger(String type) {
+        if (eventTracks.containsKey(type)) {
+            for (String url : eventTracks.get(type)) {
+                notify(url);
+            }
+        }
+    }
+
+    private void notify(String url) {
+        url = replaceParams(url);
+        try {
+            OkHttpUtils.get().url(url).build().execute();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private String replaceParams(String url) {
+        if (url.contains("%%REQ_WIDTH%%")) {
+            url = url.replaceAll("%%REQ_WIDTH%%", ScreenUtil.getScreenWidth(SheepApp.getInstance()) + "");
+        }
+        if (url.contains("%%REQ_HEIGHT%%")) {
+            url = url.replaceAll("%%REQ_HEIGHT%%", ScreenUtil.getScreenHeight(SheepApp.getInstance()) + "");
+        }
+        if (url.contains("%%WIDTH%%")) {
+            url = url.replaceAll("%%WIDTH%%", ScreenUtil.getScreenWidth(SheepApp.getInstance()) + "");
+        }
+        if (url.contains("%%HEIGHT%%")) {
+            url = url.replaceAll("%%HEIGHT%%", ScreenUtil.getScreenHeight(SheepApp.getInstance()) + "");
+        }
+        if (url.contains("%%EVENT_TIME_START%%")) {
+            url = url.replaceAll("%%EVENT_TIME_START%%", System.currentTimeMillis() + "");
+        }
+        if (url.contains("%%EVENT_TIME_END%%")) {
+            url = url.replaceAll("%%EVENT_TIME_END%%", System.currentTimeMillis() + "");
+        }
+        if (url.contains("%%TM_MS%%")) {
+            url = url.replaceAll("%%TM_MS%%", System.currentTimeMillis() + "");
+        }
+        if (url.contains("%%TM_MS%%")) {
+            url = url.replaceAll("%%TM_MS%%", System.currentTimeMillis() + "");
+        }
+        if (url.contains("%%DOWNX%%")) {
+            url = url.replaceAll("%%DOWNX%%", clickX + "");
+        }
+        if (url.contains("%%DOWNY%%")) {
+            url = url.replaceAll("%%DOWNY%%", clickY + "");
+        }
+        if (url.contains("%%UPX%%")) {
+            url = url.replaceAll("%%UPX%%", clickX + "");
+        }
+        if (url.contains("%%UPY%%")) {
+            url = url.replaceAll("%%UPY%%", clickY + "");
+        }
+        if (url.contains("%%CLICKID%%")) {
+            url = url.replaceAll("%%CLICKID%%", clickId + "");
+        }
+        return url;
+    }
+
+}

+ 22 - 0
app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java

@@ -1336,6 +1336,27 @@ public class CommonUtil {
                 });
     }
 
+    public void getAcceptedTask(int release_task_id, Action1<TaskAcceptedEty> action) {
+        SheepApp.getInstance().getNetComponent().getApiService().getAcceptedTaskDetail(release_task_id)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        TaskAcceptedEty taskAcceptedEty = baseMessage.getData(TaskAcceptedEty.class);
+                        if (taskAcceptedEty != null) {
+                            action.call(taskAcceptedEty);
+                        }
+
+                    }
+
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        action.call(null);
+                    }
+                });
+    }
+
     public void getTaskDesc(int release_task_id, Action1<Release_task> action) {
         SheepApp.getInstance().getNetComponent().getApiService().taskDesc(release_task_id)
                 .subscribeOn(Schedulers.io())
@@ -1352,6 +1373,7 @@ public class CommonUtil {
 
                     @Override
                     public void onError(BaseMessage baseMessage) {
+                        action.call(null);
                     }
                 });
     }

+ 10 - 0
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -73,6 +73,7 @@ import com.sheep.gamegroup.module.login.LoginAct;
 import com.sheep.gamegroup.module.plugin.model.Plugin;
 import com.sheep.gamegroup.module.plugin.util.SheepPluginUtil;
 import com.sheep.gamegroup.module.skin.util.SkinUtil;
+import com.sheep.gamegroup.module.task.VideoTaskActivity;
 import com.sheep.gamegroup.module.user.activity.ActVip;
 import com.sheep.gamegroup.module.user.model.UserAddressInfo;
 import com.sheep.gamegroup.module.webview.fragment.FgtWeb;
@@ -701,6 +702,12 @@ public class Jump2View {
         }
     }
 
+    public synchronized void goVideoTaskView(Context context, Integer id) {
+        Intent intent = new Intent(context, VideoTaskActivity.class);
+        intent.putExtra("task_id", id);
+        context.startActivity(intent);
+    }
+
     public synchronized void goWelfare(Context context, int taskId) {
         WebParams webParams = new WebParams(Config.getUrlByPath(Config.PATH_WELFARE_HOME));
         goWeb(context, webParams);
@@ -1908,6 +1915,9 @@ public class Jump2View {
                     goWeb(SheepApp.getInstance().getCurrentActivity(), new WebParams(Config.getUrlByPath(Config.PATH_MONEY_REWARD_DETAIL
                             , "id", item.getId(), "device_id", DeviceUtil.getDeviceId(SheepApp.getInstance()), "app_version", String.valueOf(BuildConfig.VERSION_CODE))).setTitle(item.getName()));
                     break;
+                case 1021:
+                    goVideoTaskView(SheepApp.getInstance().getCurrentActivity(), item.getId());
+                    break;
                 case 2:
                     goCreditCardTaskDetail(SheepApp.getInstance().getCurrentActivity(), item.getId());
                     break;

+ 213 - 0
app/src/main/java/com/sheep/gamegroup/util/NetUtil.java

@@ -6,11 +6,33 @@ import android.content.Context;
 import android.content.Intent;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
 import android.os.Build;
+import android.telephony.CellIdentityCdma;
+import android.telephony.CellIdentityGsm;
+import android.telephony.CellIdentityLte;
+import android.telephony.CellIdentityWcdma;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoCdma;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
+import android.telephony.CellSignalStrengthGsm;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.sheep.jiuyan.samllsheep.SheepApp;
 
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * Created by ljy on 2018/3/8.
  */
@@ -88,6 +110,7 @@ public class NetUtil {
 
     /**
      * 判断是否使用代理
+     *
      * @return
      */
     public static boolean isWifiProxy() {
@@ -109,4 +132,194 @@ public class NetUtil {
 //        }
 //        return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
     }
+
+    public static String getIpAddress() {
+        if (isWifi(SheepApp.getInstance())) {
+            try {
+                WifiManager wifiManager = (WifiManager) SheepApp.getInstance().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+                int i = wifiInfo.getIpAddress();
+                return int2ip(i);
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                return ex.getMessage();
+            }
+        } else {
+            try {
+                for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
+                    NetworkInterface intf = en.nextElement();
+                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
+                        InetAddress inetAddress = enumIpAddr.nextElement();
+                        if (!inetAddress.isLoopbackAddress()) {
+                            return inetAddress.getHostAddress();
+                        }
+                    }
+                }
+                return "";
+            } catch (SocketException ex) {
+                ex.printStackTrace();
+                return ex.toString();
+            }
+        }
+    }
+
+    public static String int2ip(int ipInt) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(ipInt & 0xFF).append(".");
+        sb.append((ipInt >> 8) & 0xFF).append(".");
+        sb.append((ipInt >> 16) & 0xFF).append(".");
+        sb.append((ipInt >> 24) & 0xFF);
+        return sb.toString();
+    }
+
+    public static int getNetworkType() {
+        int strNetworkType = 0;
+        ConnectivityManager connectivity = (ConnectivityManager) SheepApp.getInstance()
+                .getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo networkInfo = connectivity.getActiveNetworkInfo();
+        if (networkInfo != null && networkInfo.isConnected()) {
+            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+                strNetworkType = 1;
+            } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
+                String _strSubTypeName = networkInfo.getSubtypeName();
+
+                Log.i("netinfo", "Network getSubtypeName : " + _strSubTypeName);
+
+                // TD-SCDMA   networkType is 17
+                int networkType = networkInfo.getSubtype();
+                switch (networkType) {
+                    case TelephonyManager.NETWORK_TYPE_GPRS:
+                    case TelephonyManager.NETWORK_TYPE_EDGE:
+                    case TelephonyManager.NETWORK_TYPE_CDMA:
+                    case TelephonyManager.NETWORK_TYPE_1xRTT:
+                    case TelephonyManager.NETWORK_TYPE_IDEN: //api<8 : replace by 11
+                        strNetworkType = 2;
+                        break;
+                    case TelephonyManager.NETWORK_TYPE_UMTS:
+                    case TelephonyManager.NETWORK_TYPE_EVDO_0:
+                    case TelephonyManager.NETWORK_TYPE_EVDO_A:
+                    case TelephonyManager.NETWORK_TYPE_HSDPA:
+                    case TelephonyManager.NETWORK_TYPE_HSUPA:
+                    case TelephonyManager.NETWORK_TYPE_HSPA:
+                    case TelephonyManager.NETWORK_TYPE_EVDO_B: //api<9 : replace by 14
+                    case TelephonyManager.NETWORK_TYPE_EHRPD:  //api<11 : replace by 12
+                    case TelephonyManager.NETWORK_TYPE_HSPAP:  //api<13 : replace by 15
+                        strNetworkType = 3;
+                        break;
+                    case TelephonyManager.NETWORK_TYPE_LTE:    //api<11 : replace by 13
+                        strNetworkType = 4;
+                        break;
+                    default:
+                        // http://baike.baidu.com/item/TD-SCDMA 中国移动 联通 电信 三种3G制式
+                        if (_strSubTypeName.equalsIgnoreCase("TD-SCDMA") || _strSubTypeName.equalsIgnoreCase("WCDMA") || _strSubTypeName.equalsIgnoreCase("CDMA2000")) {
+                            strNetworkType = 3;
+                        } else {
+                            strNetworkType = 0;
+                        }
+                        break;
+                }
+                Log.i("netinfo", "Network getSubtype : " + Integer.valueOf(networkType).toString());
+            }
+        }
+        Log.i("netinfo", "Network Type : " + strNetworkType);
+        return strNetworkType;
+    }
+
+    public static int getSubscriptionOperatorType() {
+        int opeType = -1;
+        if (!hasSim()) {
+            return opeType;
+        }
+        TelephonyManager tm = (TelephonyManager) SheepApp.getInstance().getSystemService(Context.TELEPHONY_SERVICE);
+        String operator = tm.getNetworkOperator();
+        if ("46001".equals(operator) || "46006".equals(operator) || "46009".equals(operator)) {
+            // 中国联通
+            opeType = 70123;
+        } else if ("46000".equals(operator) || "46002".equals(operator) || "46004".equals(operator) || "46007".equals(operator)) {
+            // 中国移动
+            opeType = 70120;
+        } else if ("46003".equals(operator) || "46005".equals(operator) || "46011".equals(operator)) {
+            // 中国电信
+            opeType = 70121;
+        } else {
+            opeType = 0;
+        }
+        return opeType;
+    }
+
+    public static boolean hasSim() {
+        TelephonyManager tm = (TelephonyManager) SheepApp.getInstance().getSystemService(Context.TELEPHONY_SERVICE);
+        String operator = tm.getSimOperator();
+        if (TextUtils.isEmpty(operator)) {
+            return false;
+        }
+        return true;
+    }
+
+    public static Map<String, Integer> getCellStatus() {
+        Map<String, Integer> status = new HashMap<>();
+        status.put("MCC", 0);
+        status.put("MNC", 0);
+        status.put("LAC", 0);
+        status.put("CID", 0);
+        TelephonyManager mTelephonyManager = (TelephonyManager) SheepApp.getInstance().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
+        String operator = mTelephonyManager.getNetworkOperator();
+
+        List<CellInfo> cellInfos = mTelephonyManager.getAllCellInfo();
+        Log.i("测试", " 获取邻区基站数量:" + cellInfos.size());
+        for (CellInfo info : cellInfos) {
+            if (info instanceof CellInfoGsm) {
+                parseGSM(info, status);
+            } else if (info instanceof CellInfoCdma) {
+                parseCDMA(info, status);
+            } else if (info instanceof CellInfoLte) {
+                parseLTE(info, status);
+            } else if (info instanceof CellInfoWcdma) {
+                parseWCDMA(info, status);
+            }
+            break;
+        }
+        return status;
+    }
+
+    public static void parseGSM(CellInfo cellInfo, Map<String, Integer> status) {
+        CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfo;
+        CellIdentityGsm cellIdentityGsm = cellInfoGsm.getCellIdentity();
+        int cid = cellIdentityGsm.getCid();
+        int lac = cellIdentityGsm.getLac();
+        int mnc = cellIdentityGsm.getMnc();
+        int mcc = cellIdentityGsm.getMcc();
+        status.put("MCC", mcc);
+        status.put("MNC", mnc);
+        status.put("LAC", lac);
+        status.put("CID", cid);
+    }
+
+    public static void parseCDMA(CellInfo info, Map<String, Integer> status) {
+
+    }
+
+    public static void parseLTE(CellInfo info, Map<String, Integer> status) {
+        CellInfoLte cellInfo = (CellInfoLte) info;
+        CellIdentityLte cellIdentity = cellInfo.getCellIdentity();
+        int mnc = cellIdentity.getMnc();
+        int mcc = cellIdentity.getMcc();
+        status.put("MCC", mcc);
+        status.put("MNC", mnc);
+        status.put("LAC", 0);
+        status.put("CID", 0);
+    }
+
+    public static void parseWCDMA(CellInfo info, Map<String, Integer> status) {
+        CellInfoWcdma cellInfo = (CellInfoWcdma) info;
+        CellIdentityWcdma cellIdentity = cellInfo.getCellIdentity();
+        int cid = cellIdentity.getCid();
+        int lac = cellIdentity.getLac();
+        int mnc = cellIdentity.getMnc();
+        int mcc = cellIdentity.getMcc();
+        status.put("MCC", mcc);
+        status.put("MNC", mnc);
+        status.put("LAC", lac);
+        status.put("CID", cid);
+    }
 }

+ 41 - 3
app/src/main/java/com/sheep/gamegroup/util/ViewUtil.java

@@ -64,6 +64,7 @@ import com.bumptech.glide.request.RequestOptions;
 import com.bumptech.glide.request.target.Target;
 import com.jcodecraeer.xrecyclerview.CustomFooterViewCallBack;
 import com.jcodecraeer.xrecyclerview.XRecyclerView;
+import com.kfzs.duanduan.cardview.ScreenUtil;
 import com.kfzs.duanduan.utils.NumberFormatUtils;
 import com.mdad.sdk.mdsdk.common.AdData;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
@@ -1360,7 +1361,35 @@ public class ViewUtil {
             , View content
             , String cancelText
             , String confirmString
-            , View.OnClickListener confirmListener) {
+            , OnConfirDialogListener confirmListener) {
+        return showConfirmDialog(mContext, title, content, cancelText, confirmString, null, confirmListener);
+    }
+
+    public static AlertDialog showConfirmDialog(Context mContext
+            , String title
+            , String content
+            , String cancelText
+            , String confirmString
+            , OnConfirDialogListener cancelListener
+            , OnConfirDialogListener confirmListener) {
+        TextView contentView = new TextView(mContext);
+        contentView.setText(content);
+        contentView.setTextSize(15f);
+//        contentView.setTextColor(0x999999);
+//        contentView.setBackgroundColor(0xff0000);
+        int padding = ScreenUtil.dip2px(mContext, 16);
+        contentView.setPadding(padding, padding, padding, padding);
+        contentView.setGravity(Gravity.CENTER);
+        return showConfirmDialog(mContext, title, contentView, cancelText, confirmString, cancelListener, confirmListener);
+    }
+
+    public static AlertDialog showConfirmDialog(Context mContext
+            , String title
+            , View content
+            , String cancelText
+            , String confirmString
+            , OnConfirDialogListener cancelListener
+            , OnConfirDialogListener confirmListener) {
         View container = View.inflate(mContext, R.layout.dialog_confirm, null);
         final AlertDialog dialog = new AlertDialog.Builder(mContext, mContext instanceof Activity ? R.style.MyDialogActivityTheme : R.style.AppTheme_Dialog_Alert)
                 .setView(container)
@@ -1371,16 +1400,25 @@ public class ViewUtil {
         contentContainer.addView(content, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
         TextView cancelBtn = container.findViewById(R.id.cancel_btn);
         cancelBtn.setText(cancelText);
-        cancelBtn.setOnClickListener((v) -> dialog.dismiss());
+        cancelBtn.setOnClickListener((v) -> {
+            dialog.dismiss();
+            if (cancelListener != null) {
+                cancelListener.onActin(dialog);
+            }
+        });
         TextView confirmBtn = container.findViewById(R.id.confirm_btn);
         confirmBtn.setText(confirmString);
         confirmBtn.setOnClickListener((v) -> {
             dialog.dismiss();
-            confirmListener.onClick(v);
+            confirmListener.onActin(dialog);
         });
         return dialog;
     }
 
+    public interface OnConfirDialogListener {
+        void onActin(Dialog d);
+    }
+
     public static AlertDialog showUpgradeDialog(Context mContext, final DialogConfig dialogConfig) {
         String title = dialogConfig.getTitle();
         String msg = dialogConfig.getMsg();

+ 16 - 0
app/src/main/res/layout/activity_video_task.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.sheep.gamegroup.module.task.VideoTaskActivity">
+
+    <com.sheep.gamegroup.view.customview.SheepGSYVideoView
+        android:id="@+id/video_player_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+
+
+</RelativeLayout>

+ 36 - 0
app/src/main/res/layout/video_ad_confirm.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginTop="30dp"
+    android:layout_marginBottom="30dp">
+
+    <ImageView
+        android:id="@+id/app_logo_iv"
+        android:layout_width="70dp"
+        android:layout_height="70dp"
+        android:layout_centerHorizontal="true" />
+
+    <TextView
+        android:id="@+id/app_name_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/app_logo_iv"
+        android:layout_marginTop="16sp"
+        android:gravity="center"
+        android:text="标题"
+        android:textColor="@color/black_333333"
+        android:textSize="15sp" />
+
+    <TextView
+        android:id="@+id/app_desc_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/app_name_tv"
+        android:layout_marginTop="12sp"
+        android:gravity="left"
+        android:text="标题"
+        android:textColor="@color/black_999999"
+        android:textSize="13sp" />
+
+</RelativeLayout>

+ 1 - 1
gradle.properties

@@ -20,7 +20,7 @@
 VERSION_NAME=3.6.9
 VERSION_CODE=3006009
 ANDROID_COMPILE_SDK_VERSION=28
-ANDROID_MIN_SDK_VERSION=17
+ANDROID_MIN_SDK_VERSION=18
 ANDORID_TARGET_SDK_VERSION=28
 
 POM_DESCRIPTION=Android Library for cropping images