package com.edufound.reader.popwindow; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.graphics.Color; import android.graphics.PointF; import android.net.Uri; import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.TextView; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.davemorrissey.labs.subscaleview.ImageSource; import com.davemorrissey.labs.subscaleview.ImageViewState; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.edufound.reader.R; import com.edufound.reader.application.EApplication; import com.edufound.reader.bean.ChannelCodeEnum; import com.edufound.reader.bean.ModelBean; import com.edufound.reader.bean.RecordResultBean; import com.edufound.reader.bean.UserRecordBean; import com.edufound.reader.cusview.GridRadioGroup; import com.edufound.reader.listener.PopUtilClickListener; import com.edufound.reader.listener.PopupRecordStatusListener; import com.edufound.reader.util.miutil.MiSoundSDKUtil; import com.edufound.reader.presenter.PopWindowPresneter; import com.edufound.reader.util.Consts; import com.edufound.reader.util.DataCleanManager; import com.edufound.reader.util.DeviceUtil; import com.edufound.reader.util.DeviceUuidFactory; import com.edufound.reader.util.EfunboxUtil; import com.edufound.reader.util.GlideUtils; import com.edufound.reader.util.SizeUtils; import com.jakewharton.rxbinding4.view.RxView; import com.orhanobut.logger.Logger; import java.io.File; import java.util.concurrent.TimeUnit; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import io.reactivex.rxjava3.functions.Consumer; public class PopWindowUtil { private static PopWindowPresneter mPresenter; private static PopupWindow mPopupWindow; private static FrameLayout dialog_view; private static PopupWindow recordPopupWindow; private static FrameLayout record_view; private static PopupWindow eventPopupWindow; private static FrameLayout event_view; private static void initPresenter() { if (mPresenter == null) { mPresenter = new PopWindowPresneter(); } } private static boolean checkWindowShoing() { if (mPopupWindow == null) { return false; } return mPopupWindow.isShowing(); } public static void hidePopupWindow() { if (mPopupWindow != null && mPopupWindow.isShowing()) { mPopupWindow.dismiss(); } if (recordPopupWindow != null && recordPopupWindow.isShowing()) { recordPopupWindow.dismiss(); } if (eventPopupWindow != null && eventPopupWindow.isShowing()) { eventPopupWindow.dismiss(); } } public static void showExitAppWindow(Activity context, View parent) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_exit_app, null); dialog_view.setFocusable(true); ImageView image = dialog_view.findViewById(R.id.popupwindow_exit_app_image); GlideUtils.loadImageSizeKipMemoryCache(context, "http://reader-apk.ai160.com/reader-apk/res/exit_app.png", image); FrameLayout exit = dialog_view.findViewById(R.id.popupwindow_exit_app_ok); FrameLayout cancel = dialog_view.findViewById(R.id.popupwindow_exit_app_cancel); setClickListener(exit, o -> { EApplication.killAppProcess(context); }); setClickListener(cancel, o -> { mPopupWindow.dismiss(); }); RxView.longClicks(image).subscribe(o -> { //显示deviceInfo showDeviceInfo(context); }); newPopupWindow(parent, true); } public static void showSelectGradeWindow(Context context, View parent, int checked, PopUtilClickListener listener) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_select_grade, null); dialog_view.setFocusable(true); FrameLayout btn_ok = dialog_view.findViewById(R.id.popupwindow_select_ok); GridRadioGroup gridRadioGroup = dialog_view.findViewById(R.id.popupwindow_select_grade_gridgroup); int id = 0; final String[] checkText = {String.valueOf(id)}; switch (checked) { case 0: id = R.id.popupwindow_select_grade_one; checkText[0] = "一年级"; break; case 1: id = R.id.popupwindow_select_grade_two; checkText[0] = "二年级"; break; case 2: id = R.id.popupwindow_select_grade_three; checkText[0] = "三年级"; break; case 3: id = R.id.popupwindow_select_grade_four; checkText[0] = "四年级"; break; case 4: id = R.id.popupwindow_select_grade_pre; checkText[0] = "学前"; break; } gridRadioGroup.setOnCheckedChangeListener(new GridRadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(GridRadioGroup group, int checkedId) { group.check(checkedId); switch (checkedId) { case R.id.popupwindow_select_grade_one: //一年级 checkText[0] = "一年级"; break; case R.id.popupwindow_select_grade_two: checkText[0] = "二年级"; //二年级 break; case R.id.popupwindow_select_grade_three: checkText[0] = "三年级"; //三年级 break; case R.id.popupwindow_select_grade_four: checkText[0] = "四年级"; //四年级 break; case R.id.popupwindow_select_grade_pre: //学前 checkText[0] = "学前"; break; } } }); gridRadioGroup.check(id); setClickListener(btn_ok, o -> { mPopupWindow.dismiss(); listener.clickSubmit(checkText[0]); }); newPopupWindow(parent, true); } public static void showExitLoginWindow(Context context, View parent, PopUtilClickListener listener) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_exit_login, null); dialog_view.setFocusable(true); ImageView image = dialog_view.findViewById(R.id.popupwindow_exit_login_image); GlideUtils.loadImageSizeKipMemoryCache(context, "http://reader-apk.ai160.com/reader-apk/res/exit_login.png", image); FrameLayout exit = dialog_view.findViewById(R.id.popupwindow_exit_login_ok); FrameLayout cancel = dialog_view.findViewById(R.id.popupwindow_exit_login_cancel); setClickListener(exit, o -> { mPopupWindow.dismiss(); listener.clickSubmit(null); }); setClickListener(cancel, o -> { mPopupWindow.dismiss(); listener.clickCancel(); }); newPopupWindow(parent, true); } public static void showCancellationAccountWindow(Context context, View parent, PopUtilClickListener listener) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_cancellation_account, null); dialog_view.setFocusable(true); FrameLayout exit = dialog_view.findViewById(R.id.popupwindow_cancellation_account_ok); FrameLayout cancel = dialog_view.findViewById(R.id.popupwindow_cancellation_account_cancel); setClickListener(exit, o -> { mPopupWindow.dismiss(); listener.clickSubmit(null); }); setClickListener(cancel, o -> { mPopupWindow.dismiss(); listener.clickCancel(); }); newPopupWindow(parent, true); } public static void showBindWeChatWindow(Activity context, View parent, @Nullable PopUtilClickListener listener) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_bind_wechat, null); dialog_view.setFocusable(true); ImageView back = dialog_view.findViewById(R.id.popupwindow_bindwechat_back); ImageView image = dialog_view.findViewById(R.id.popupwindow_bind_wechat_image); TextView text = dialog_view.findViewById(R.id.popupwindow_bind_wechat_name); setClickListener(back, o -> { mPopupWindow.dismiss(); if (listener != null) { listener.clickCancel(); } mPresenter.getPopHandler().removeMessages(0x1312); }); mPresenter.getBindWeChatPath(context, image); mPresenter.getMyInfo(context, text); newPopupWindow(parent, false); } public static void showRecordStatusWindow(Activity context, View parent, RecordResultBean bean, UserRecordBean.UserRead userread, PopupRecordStatusListener listener) { initPresenter(); if (recordPopupWindow != null) { recordPopupWindow = null; } if (record_view != null) { record_view = null; } EfunboxUtil.initDesignSize(context); record_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_record_status, null); record_view.setFocusable(true); record_view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return false; } }); ImageView back = record_view.findViewById(R.id.popupwindow_record_status_close); setClickListener(back, o -> { recordPopupWindow.dismiss(); }); mPresenter.initRecordStatusWindow(context, record_view, bean, userread, listener); recordPopupWindow = new PopupWindow(record_view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); recordPopupWindow.setFocusable(false); recordPopupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0); recordPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { record_view.removeAllViews(); record_view = null; recordPopupWindow = null; } }); } public static void showMyOrderWindow(Activity context, View parent) { initPresenter(); if (checkWindowShoing()) { mPopupWindow.dismiss(); return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_myorder, null); dialog_view.setFocusable(true); dialog_view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return false; } }); ImageView back = dialog_view.findViewById(R.id.popupwindow_myorder_back); setClickListener(back, o -> { mPopupWindow.dismiss(); }); mPresenter.myOrderWindowInit(context, dialog_view); newPopupWindow(parent, false); } public static void showRecordRemovedWindow(Context context, View parent, PopUtilClickListener listener) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_record_remove, null); dialog_view.setFocusable(true); FrameLayout ok = dialog_view.findViewById(R.id.popupwindow_record_remove_ok); FrameLayout cancel = dialog_view.findViewById(R.id.popupwindow_record_remove_cancel); setClickListener(ok, o -> { mPopupWindow.dismiss(); listener.clickSubmit(null); }); setClickListener(cancel, o -> { mPopupWindow.dismiss(); listener.clickCancel(); }); newPopupWindow(parent, true); } /** * 注冊送7天活动的popupwindow */ public static void RegistrationEventsWindow(Context context, View parent, PopUtilClickListener listener) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_registration_events, null); dialog_view.setFocusable(true); ImageView img = dialog_view.findViewById(R.id.popupwindow_registration_events_img); GlideUtils.loadImageSizeKipMemoryCache(context, "http://reader-apk.ai160.com/reader-apk/res/login_event.png", img); ImageView close = dialog_view.findViewById(R.id.popupwindow_registration_events_close); setClickListener(img, o -> { mPopupWindow.dismiss(); listener.clickSubmit(null); }); setClickListener(close, o -> { mPopupWindow.dismiss(); listener.clickCancel(); }); newPopupWindow(parent, true); } /** * 跳转webview的活动 */ public static void webviewEventsWindow(Context context, View parent, PopUtilClickListener listener, boolean needwindow) { initPresenter(); if (!needwindow) { listener.clickSubmit(null); return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_webs_events, null); dialog_view.setFocusable(true); ImageView img = dialog_view.findViewById(R.id.popupwindow_webs_events_img); GlideUtils.loadImageSizeKipMemoryCache(context, "http://reader-apk.ai160.com/reader-apk/res/event_img.png", img); ImageView close = dialog_view.findViewById(R.id.popupwindow_webs_events_close); setClickListener(img, o -> { eventPopupWindow.dismiss(); listener.clickSubmit(null); }); setClickListener(close, o -> { eventPopupWindow.dismiss(); listener.clickCancel(); }); eventPopupWindow = new PopupWindow(dialog_view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); eventPopupWindow.setFocusable(true); eventPopupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0); eventPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { dialog_view.removeAllViews(); dialog_view = null; eventPopupWindow = null; } }); } public static void miSoundLoginWindow(Context context, View parent, int type, PopWindowPresneter.MISoundLoginCallBack callBack) { initPresenter(); if (checkWindowShoing()) { mPopupWindow.dismiss(); return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_mi_sound_qrcode_layout, null); dialog_view.setFocusable(true); dialog_view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return false; } }); ConstraintLayout mQRLoginLayout = dialog_view.findViewById(R.id.popupwindow_mi_sound_qrcode_login_layout); mQRLoginLayout.setVisibility(View.GONE); ConstraintLayout mBindPhoneNumLayout = dialog_view.findViewById(R.id.popupwindow_mi_sound_bind_phone_layout); ConstraintLayout mShowBindNumLayout = dialog_view.findViewById(R.id.popupwindow_mi_sound_show_bind_phoneNum_layout); mBindPhoneNumLayout.setVisibility(View.GONE); switch (type) { case MiSoundSDKUtil.MI_SOUND_QRCODE_UPDATE_USER: case MiSoundSDKUtil.MI_SOUND_QRCODE_TYPE: mQRLoginLayout.setVisibility(View.VISIBLE); break; case MiSoundSDKUtil.MI_SOUND_BIND_PHONENUM: mBindPhoneNumLayout.setVisibility(View.VISIBLE); break; case MiSoundSDKUtil.MI_SOUND_SHOW_BINDPHONENUM: mShowBindNumLayout.setVisibility(View.VISIBLE); break; } ImageView close = dialog_view.findViewById(R.id.popupwindow_mi_sound_qrcode_layout_close); setClickListener(close, o -> { if (callBack != null) { callBack.closeWindow(); } mPresenter.getPopHandler().removeMessages(0x1313); mPopupWindow.dismiss(); }); mPresenter.initMiSoundLoginWindow(context, dialog_view, type, new PopWindowPresneter.MISoundLoginCallBack() { @Override public void success() { if (callBack != null) { callBack.success(); } mPopupWindow.dismiss(); } @Override public void closeWindow() { } }); dialog_view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return false; } }); newPopupWindow(parent, true); } /** * 超长图popupwindow */ public static void showLongSizeImg(Context context, String url, View parent) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_show_rule, null); dialog_view.setFocusable(true); final File[] imgResource = new File[1]; SubsamplingScaleImageView imageView = (SubsamplingScaleImageView) dialog_view.findViewById(R.id.imageview); imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM); imageView.setMinScale(1.0F); //下载图片保存到本地 GlideUtils.downloadImage(context, url, new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(File resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { imgResource[0] = resource; imageView.setImage(ImageSource.uri(Uri.fromFile(resource)), new ImageViewState(1.0F, new PointF(0, 0), 0)); // Uri uri = Uri.fromFile(resource); // imageView.setImage(uri); return false; } }); ImageView back = dialog_view.findViewById(R.id.popupwindow_show_rule_back); setClickListener(back, o -> { if (imgResource[0] != null) { DataCleanManager.deleteFilesByDirectory(imgResource[0]); } mPopupWindow.dismiss(); }); newPopupWindow(parent, true); } /** * 排行榜 * */ /** * 超长图popupwindow */ public static void showRankListWindow(Context context, ModelBean.ReadUserList bean, View parent) { initPresenter(); if (checkWindowShoing()) { return; } EfunboxUtil.initDesignSize(context); dialog_view = (FrameLayout) LayoutInflater.from(context).inflate(R.layout.popupwindow_show_ranklist, null); dialog_view.setFocusable(true); mPresenter.rankListInit(context, dialog_view, bean.getId()); ImageView back = dialog_view.findViewById(R.id.popupwindow_ranklist_back); setClickListener(back, o -> { mPopupWindow.dismiss(); }); newPopupWindow(parent, true); } private static void showDeviceInfo(Activity context) { StringBuffer buffer = new StringBuffer(); buffer.append("\tpackageName:\t\t" + context.getPackageName() + "\n"); buffer.append("\tapk渠道:\t" + "\t" + Consts.getUMengChannel() + "\n"); buffer.append("\tUUID:\t" + "\t" + DeviceUuidFactory.getUuid() + "\n"); // buffer.append("\t设备SN号:\t\t" + DeviceUtil.getSerialNumber() + "\n"); buffer.append("\t厂商:\t" + "\t" + DeviceUtil.getDeviceBrand() + "\n"); buffer.append("\t型号:\t" + "\t" + DeviceUtil.getSystemModel() + "\n"); buffer.append("\t系统版本号:\t" + "\t" + DeviceUtil.getSystemVersion() + "\n"); buffer.append("\t应用版本号:\t" + "\t" + DeviceUtil.getVersionCode(context) + "\n"); buffer.append("\t应用版本号名称:\t" + "\t" + DeviceUtil.getVersionName(context) + "\n"); buffer.append("\t屏幕宽度:\t\t" + DeviceUtil.getWidth(context) + "\n"); buffer.append("\t屏幕高度:\t\t" + DeviceUtil.getHeight(context) + "\n"); buffer.append("\t屏幕密度:\t\t" + DeviceUtil.getDensity(context) + "\n"); buffer.append("\t屏幕DPI:\t\t" + DeviceUtil.getDensityDpi(context) + "\n"); if (Consts.getmConstsUserBean() != null) { buffer.append("\tUserEid:\t\t" + Consts.getmConstsUserBean().getEid() + "\n"); buffer.append("\tUID:\t\t" + Consts.getmConstsUserBean().getUid() + "\n"); buffer.append("\t注册渠道:\t\t" + Consts.getmConstsUserBean().getChannel() + "\n"); } if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode()) && Consts.getmConstsBaiDuUserBean() != null) { buffer.append("\t百度UserId:\t\t" + Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId() + "\n"); } View infoView = LayoutInflater.from(context).inflate(R.layout.window_deviceinfo, null); TextView text = (TextView) infoView.findViewById(R.id.deviceinfo); text.setText(buffer.toString()); text.setTextSize(SizeUtils.dp2px(context, 20)); text.setTextColor(Color.WHITE); Dialog dialog = new Dialog(context); dialog.setContentView(infoView); Window dialogWindow = dialog.getWindow(); dialogWindow.setGravity(Gravity.CENTER); WindowManager m = context.getWindowManager(); Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用 WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值 p.height = (int) (d.getHeight() * 0.8); p.width = (int) (d.getWidth() * 0.7); dialogWindow.setAttributes(p); dialog.setTitle("Device信息"); dialog.show(); } private static void setClickListener(View view, Consumer onNext) { RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext); } private static void newPopupWindow(View parent, boolean nedFocus) { if (parent == null) { Logger.e("newPopupWindow-parent=null"); return; } mPopupWindow = new PopupWindow(dialog_view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); mPopupWindow.setFocusable(nedFocus); mPopupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0); mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { dialog_view.removeAllViews(); dialog_view = null; mPopupWindow = null; } }); } }