package com.halomobi.sdk; import static com.halomobi.common.ConstantPool.A_SDK; import static com.halomobi.common.ConstantPool.TrackerType.CLICK; import static com.halomobi.common.ConstantPool.TrackerType.DEEP_LINK_OPEN; import static com.halomobi.common.ConstantPool.TrackerType.DOWNLOADED; import static com.halomobi.common.ConstantPool.TrackerType.INSTALLED; import static com.halomobi.common.ConstantPool.TrackerType.INSTALL_START; import static com.halomobi.common.ConstantPool.TrackerType.OPEN; import static com.halomobi.common.ConstantPool.TrackerType.S_DOWNLOAD; import static com.halomobi.utils.LogUtils.formatDate; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.text.TextUtils; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.halomobi.common.ConstantPool; import com.halomobi.download.DownLoadManager; import com.halomobi.download.bean.DownloadItem; import com.halomobi.download.listener.DownloadStateListener; import com.halomobi.hlinterface.IAdControl; import com.halomobi.network.listeners.AdStateChangListener; import com.halomobi.network.listeners.ClickAdStateChangListener; import com.halomobi.network.listeners.TrackerTaskListener; import com.halomobi.network.report.track.ReportTrackerManager; import com.halomobi.network.request.ad.RequestAdManager; import com.halomobi.network.request.ad.bean.Ad; import com.halomobi.network.request.ad.bean.AdParameter; import com.halomobi.sdk.R; import com.halomobi.sdk.WebViewActivity; import com.halomobi.utils.KeyUtil; import com.halomobi.utils.LogUtils; import com.halomobi.utils.NetworkUtils; import com.halomobi.utils.SDKInfo; import com.halomobi.utils.SystemUtils; import com.halomobi.utils.Utils; import com.halomobi.view.HlTipsDialog; import com.halomobi.view.imageloader.ImageLoader; import java.net.URISyntaxException; import java.util.Arrays; public class AdController implements IAdControl { private boolean isBannerLoop; private Context mContext; private TrackerTaskListener trackerListener; private ClickAdStateChangListener clickListener; public AdController(Context context) { this.mContext = context; } @Override public synchronized void setTrackerTaskListener(TrackerTaskListener trackerListener) { this.trackerListener = trackerListener; } @Override public void setClickAdListener(ClickAdStateChangListener listener) { clickListener = listener; } /** * 请求广告 */ @Override public synchronized final void requestAd(AdParameter adParameter, AdStateChangListener adStateListener) { RequestAdManager.getInstance().requestAd(adParameter, adStateListener); } /** * 关闭广告 */ @Override public void closeAd(Ad adInfo) { reportTracker(adInfo, ConstantPool.TrackerType.CLOSE);//发送关闭广告监播 } /** * 点击广告 * * @param info 广告对象 */ @Override public void clickAd(final Ad info) { clickAd(info, null); } @Override public void clickAd(Ad ad, DownloadStateListener listener) { if (TextUtils.isEmpty(ad.dplk) && TextUtils.isEmpty(ad.clkurl) && TextUtils.isEmpty(ad.landing_url)) { return; } String deepLink = ad.dplk; if (!TextUtils.isEmpty(deepLink)) { if (gotoQuickApp(ad, deepLink, true)) return; } if (TextUtils.isEmpty(ad.clkurl)) { ad.clkurl = ad.landing_url; } // ad.clkurl = "https://www.zhihu.com/tardis/zm/art/403078546"; switch (ad.interaction_type) { case 1://网页跳转 // ad.getTencentUrl(); openWebPage(ad, ad.clkurl); break; case 2://下载 // if (checkInstalled(ad.bundle.trim())) { // //已经安装过,调起应用,不继续执行下载任务 // break; // } // openWebPage(ad, ad.landing_url); if (!Utils.areNotificationsEnabled()) { showSettingDialog(); } //启动下载任务 executeDownload(ad, listener); break; case 3://跳转系统浏览器 reportTracker(ad, CLICK);//发送点击监播 SystemUtils.loopWeb(ad.clkurl);//跳转系统浏览器 break; case 4: //跳转快应用 gotoQuickApp(ad, ad.clkurl, false); break; default: break; } } private void showSettingDialog() { boolean isFirstNotification = Utils.getSp().getBoolean("isFirstNotification", false); if (isFirstNotification) { return; } HlTipsDialog tipsDialog = new HlTipsDialog(mContext, R.style.hl_dialog); tipsDialog.setTipTitle("是否开启通知栏消息?"); tipsDialog.setEnsureStr("确定"); tipsDialog.setCancelStr("取消"); tipsDialog.setonDialogClickListener(new HlTipsDialog.OnDialogClickListener() { @Override public void onCancelClick() { Utils.getSp().edit().putBoolean("isFirstNotification", true).apply(); } @Override public void onEnsureClick() { Utils.getSp().edit().putBoolean("isFirstNotification", true).apply(); Utils.gotoSet(); } }); tipsDialog.show(); } private boolean gotoQuickApp(Ad ad, String deepLink, boolean reportDeepLinkOpen) { try { Intent deepLinkIntent = Intent.parseUri(deepLink, Intent.URI_INTENT_SCHEME); deepLinkIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(deepLinkIntent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfo != null) { mContext.startActivity(deepLinkIntent); LogUtils.d("DeepLink 跳转成功 : " + deepLink); // reportTracker(ad, ConstantPool.TrackerType.CLICK);//发送点击监播 if (clickListener != null) { clickListener.onClickAdStateChang(ClickAdStateChangListener.STATE_WEB_LOAD_DEEPLINK); } if (reportDeepLinkOpen) { reportTracker(ad, CLICK); reportTracker(ad, DEEP_LINK_OPEN);//发送deepLink激活监播 } return true; } else { LogUtils.w("DeepLink NotFound : " + deepLink); } } catch (ActivityNotFoundException e) { LogUtils.w("DeepLink NotFound : " + deepLink); } catch (URISyntaxException e) { e.printStackTrace(); LogUtils.w("DeepLink NotFound : " + deepLink); } return false; } /** * 点击广告后使用WebView打开页面 * * @param info 广告对象 * @param click_url 跳转地址 */ private void openWebPage(final Ad info, String click_url) { ReportTrackerManager.getInstance().reportTrack(info.getTracks(CLICK));//点击监播 Intent intent = new Intent(mContext, WebViewActivity.class); intent.putExtra("urlStr", click_url); mContext.startActivity(intent); } /** * 下载类广告点击后启动下载任务 * * @param info 广告对象 */ private void executeDownload(final Ad info, final DownloadStateListener listener) { if (NetworkUtils.getNetworkType() == NetworkUtils.NET_WIFI) { //如果是wifi 或者 不需要提示二次确认 downLoadApp(info, listener); return; } //非Wifi且需要提示用户 AlertDialog alertDialog = new Builder(mContext).setTitle("提示") .setMessage("确认使用移动网络进行下载?") .setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_CANCEL); } }).setPositiveButton("确认", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_CONFIRM); downLoadApp(info, listener);//启动下载 } }).setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_CANCEL); } }).create(); if (alertDialog == null) { return; } if (!(mContext instanceof Activity)) { Window window = alertDialog.getWindow(); if (window != null) { window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } } if (!alertDialog.isShowing() && !((Activity)mContext).isFinishing()) { alertDialog.show(); } onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_OPEN); } /** * 检测是否已经安装了该应用,如果已安装,打开该应用 * * @param packageName 包名 * @return true 已安装 false 未安装 */ private boolean checkInstalled(String packageName) { if (!DownLoadManager.getInstance(mContext).isAppInstalled(packageName)) {//检测是否已经安装 //未安装 return false; } //尝试调起该应用 if (DownLoadManager.getInstance(mContext).openApp(packageName, -1)) { LogUtils.i("打开 已安装 app--->" + packageName); } return true; } /** * 创建下载任务 * * @param adInfo 广告对象 * @return 下载任务对象 */ private DownloadItem createDownloadItem(final Ad adInfo, final DownloadStateListener listener) { DownloadItem item = new DownloadItem(); item.setName(KeyUtil.getMD5(adInfo.clkurl));//设置下载项目名称 item.setDownLoadUrl(adInfo.clkurl.trim());//下载地址 item.setDeepLink(adInfo.dplk); item.setDownloadStartTrackerTracker(Arrays.toString(adInfo.getTracks(S_DOWNLOAD).toArray())); item.setDownloadedTracker(Arrays.toString(adInfo.getTracks(DOWNLOADED).toArray())); item.setInstallStartTracker(Arrays.toString(adInfo.getTracks(INSTALL_START).toArray())); item.setInstalledTracker(Arrays.toString(adInfo.getTracks(INSTALLED).toArray())); item.setOpenTracker(Arrays.toString(adInfo.getTracks(OPEN).toArray())); if (!TextUtils.isEmpty(adInfo.dplk)) { //deepLink 不为空,deepLink监播才有值 item.setDeepLinkTracker(Arrays.toString(adInfo.getTracks(DEEP_LINK_OPEN).toArray())); } if (adInfo.ctop == 4) { //替换点击位置 item.setClickTracker(Arrays.toString(adInfo.getTracks(CLICK).toArray())); } item.setListener(new DownloadStateListener() { @Override public void onDownloadError(DownloadItem item, int errorCode, String errorMsg) { onClickAdStateChang(ClickAdStateChangListener.STATE_APP_DOWNLOAD_FAILED); } @Override public void onDownloadStart(DownloadItem item, Ad adInfo) { onClickAdStateChang(ClickAdStateChangListener.STATE_APP_DOWNLOAD_START); if (listener != null) { listener.onDownloadStart(item, adInfo); } } @Override public void onDownloaded(DownloadItem item, Ad adInfo) { onClickAdStateChang(ClickAdStateChangListener.STATE_APP_DOWNLOAD_OK); if (listener != null) { listener.onDownloaded(item, adInfo); } } @Override public void onInstalled(DownloadItem item, Ad adInfo) { onClickAdStateChang(ClickAdStateChangListener.STATE_APP_INSTALLED); if (listener != null) { listener.onInstalled(item, adInfo); } } @Override public void onOpened(DownloadItem item, Ad adInfo) { onClickAdStateChang(ClickAdStateChangListener.STATE_APP_OPEN); } }); return item; } /** * 回调点击状态 * * @param clickAdState 当前状态 */ private void onClickAdStateChang(int clickAdState) { if (clickListener == null) { return; } clickListener.onClickAdStateChang(clickAdState); } /** * 准备开始下载任务 * * @param info 广告对象 */ private void downLoadApp(final Ad info, final DownloadStateListener listener) { reportTracker(info, CLICK); DownLoadManager.getInstance(mContext).downloadWithShow(createDownloadItem(info, listener), info); } /** * 发送监播 * * @param info 广告对象 * @param type 监播类型 */ @Override public synchronized void reportTracker(Ad info, int type) { if (info == null) { return; } switch (type) { case ConstantPool.TrackerType.DISPLAY: //banner轮播不曝光 if (info.ad_type == ConstantPool.AdType.BANNER.getType() && isBannerLoop) { if (trackerListener != null) trackerListener.onTrackersReturn(); return; } isBannerLoop = true; if (info.isSubDisTrk) { return; } info.isSubDisTrk = true; info.show_time = System.currentTimeMillis(); LogUtils.i("广告展示:" + formatDate(System.currentTimeMillis())); break; case CLICK: if (info.isSubmitClkTrk) { return; } info.isSubmitClkTrk = true; info.click_time = System.currentTimeMillis(); LogUtils.i("广告点击:" + formatDate(System.currentTimeMillis())); break; case DEEP_LINK_OPEN: if (info.isSubmitDeepLinkTrk) { return; } info.isSubmitDeepLinkTrk = true; LogUtils.i("广告DeepLink打开:" + formatDate(System.currentTimeMillis())); break; default: break; } ReportTrackerManager.getInstance().reportTrack(type, trackerListener, info.getTracks(type)); } @Override public void loadImage(View imageView, String url) { ImageLoader.load(imageView, url); } }