예제 #1
0
  /** This method triggers video watched event */
  public void reportVideoWatchedEvent() {
    if (!watchedAlreadyReported) {
      watchedAlreadyReported = true;

      if (getProgress() >= ExoVideoPlayer.PROGRESS_END) {
        videoComponentCallbacks.onVideoPrequalificationEnd(
            appOffer.getId(), getProgress(), appOffer.getVideoReward());
      } else {
        videoComponentCallbacks.onVideoPrequalificationWatched(
            appOffer.getId(), getProgress(), appOffer.getVideoReward());
      }
    }
  }
예제 #2
0
 public void reportVideoStartEvent() {
   if (videoPlayerInterface != null
       && videoPlayerInterface.isVideoPlaying()
       && !startAlreadyReported) {
     startAlreadyReported = true;
     videoComponentCallbacks.onVideoStartEvent(appOffer.getId());
   }
 }
예제 #3
0
 public void reportVideoMuteEvent(boolean mute) {
   videoComponentCallbacks.onVideoMuteEvent(appOffer.getId(), mute);
 }
예제 #4
0
  public void setup(
      AppOffer _appOffer,
      OnOfferClickListener _onOfferClickListener,
      OnVideoRewardGeneratedListener _onVideoRewardGeneratedListener,
      AppOfferWithResult _appOfferWithResult,
      final VideoComponentCallbacks _videoComponentCallbacks,
      ExoVideoPlayer.GameWallCallback _gameWallCallback,
      boolean _immersiveMode,
      boolean waitForVideoShow) {
    // TODO fetch fullscreen flag from server
    isFullscreen = false;
    this.immersiveMode = _immersiveMode;

    this.appOffer = _appOffer;
    this.onOfferClickListener = _onOfferClickListener;
    this.onVideoRewardGeneratedListener = _onVideoRewardGeneratedListener;
    this.appOfferWithResult = _appOfferWithResult;
    this.videoComponentCallbacks = _videoComponentCallbacks;
    this.gameWallCallback = _gameWallCallback;

    if (isFullscreen) { // TODO
      // LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
      //        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
      // videoPartLayout.setLayoutParams(params);
    } else {
      WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
      Display display = wm.getDefaultDisplay();

      if (Utils.isPortrate(getContext())) {
        Logger.debug("placeForVideo", "width " + display.getWidth());

        // we calculate the available width for video (subtract padding or margins if necessary)
        placeForVideo = display.getWidth();

        LinearLayout.LayoutParams params =
            new LinearLayout.LayoutParams(
                placeForVideo, AnimFactory.getVideoViewHeight(placeForVideo));
        setLayoutParams(params);
      } else {
        Logger.debug("placeForVideo", "height " + display.getHeight());

        placeForVideo =
            display.getHeight()
                - getResources()
                    .getDimensionPixelSize(R.dimen.bee7_dialog_vertical_margin) // top margin
                - getResources()
                    .getDimensionPixelSize(R.dimen.bee7_dialog_vertical_margin) // bottom margin
                - getResources()
                    .getDimensionPixelSize(
                        R.dimen.bee7_ingamewall_video_margin_vertical) // top padding
                - getResources()
                    .getDimensionPixelSize(
                        R.dimen.bee7_ingamewall_video_margin_vertical) // bottom padding
                - getResources()
                    .getDimensionPixelSize(R.dimen.bee7_video_dialog_icon_size) // offer icon height
                - getResources()
                    .getDimensionPixelSize(
                        R.dimen.bee7_dialog_vertical_item_spacing) // spacing between items
                - getResources()
                    .getDimensionPixelSize(
                        R.dimen.bee7_dialog_dl_button_height) // download button height
                - getResources()
                    .getDimensionPixelSize(
                        R.dimen.bee7_dialog_vertical_item_spacing); // spacing between items

        LinearLayout.LayoutParams params =
            new LinearLayout.LayoutParams(
                AnimFactory.getVideoViewWidth(placeForVideo), placeForVideo);
        setLayoutParams(params);
      }
    }

    videoPlayerInterface =
        new ExoVideoPlayer(
            getContext(),
            appOffer.getVideoUrl(),
            0,
            false,
            true,
            waitForVideoShow,
            new VideoCallbackListener() {
              @TargetApi(Build.VERSION_CODES.HONEYCOMB)
              @Override
              public ViewGroup onSurfaceView(TextureView surfaceView) {
                ingamewallVideoLayout.removeAllViews();
                ingamewallVideoLayout.setAlpha(0.0f);
                ingamewallVideoLayout.addView(surfaceView);
                return ingamewallVideoLayout;
              }

              @Override
              public void onError(String e, boolean isVideoDisabled) {
                Logger.debug(
                    "ExoVideoPlayer", "onError: " + e + ", isVideoDisabled: " + isVideoDisabled);
                videoComponentCallbacks.onVideoFailedEvent(appOffer.getId(), e, isVideoDisabled);

                ctaImage.setVisibility(View.VISIBLE);
                ctaVisible = true;
                videoVisible = false;
                progressBar.setVisibility(View.GONE);

                if (!com.bee7.sdk.common.util.Utils.isOnline(getContext())) {
                  new DialogNoInternet(getContext(), immersiveMode).show();
                  onVideoEnd(0, false);
                  videoVisible = false;
                  return;
                }
              }

              @Override
              public void onVideoEnd(int videoPlayed, boolean error) {
                if (closeNoticeLayout.isShown()) {
                  closeNoticeLayout.setVisibility(View.GONE);
                  isCloseNoticeShown = false;
                }

                reportVideoWatchedEvent();

                if (appOffer != null
                    && !error
                    && onVideoRewardGeneratedListener != null
                    && videoPlayed
                        >= 90 // if video was watched more than 90%. I choose 90 instead of 100
                              // because I don't trust player position reporting on all devices.
                    // && !alreadyWatched
                    && (videoComponentCallbacks.getAppOffersModel().getVideoPrequaificationlType()
                            == AppOffersModel.VideoPrequalType.FULLSCREEN_REWARD
                        || videoComponentCallbacks
                                .getAppOffersModel()
                                .getVideoPrequaificationlType()
                            == AppOffersModel.VideoPrequalType.INLINE_REWARD)) {

                  onVideoRewardGeneratedListener.onVideoRewardGenerated(appOffer);
                }

                if (controlsHandler != null) {
                  controlsHandler.removeCallbacksAndMessages(null);
                }

                if (!error) {
                  if (isFullscreen) {
                    ingamewallCtaLayout.setVisibility(View.VISIBLE);
                  }
                  ctaImage.setVisibility(View.VISIBLE);
                  ingamewallVideoLayout.setVisibility(View.GONE);
                  controlsLayout.setVisibility(View.GONE);
                  ctaVisible = true;

                  if (videoComponentCallbacks != null) {
                    videoComponentCallbacks.onVideoEnd();
                  }

                  Animation videoViewHideAnim = AnimFactory.createAlphaHide(ingamewallVideoLayout);
                  videoViewHideAnim.setDuration(AnimFactory.ANIMATION_DURATION_LONG);

                  videoViewHideAnim.setAnimationListener(
                      new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {}

                        @Override
                        public void onAnimationEnd(Animation animation) {
                          if (ingamewallVideoLayout != null) {
                            ingamewallVideoLayout.setVisibility(View.GONE);
                            ingamewallVideoLayout.removeAllViews();
                          }
                          System.gc();
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {}
                      });
                  videoVisible = false;
                  ingamewallVideoLayout.startAnimation(videoViewHideAnim);

                  if (videoPlayerInterface != null) {
                    videoPlayerInterface.onDestroy();
                  }
                  videoPlayerInterface = null;
                  if (controlsHandler != null) {
                    controlsHandler.removeCallbacksAndMessages(null);
                  }
                  controlsHandler = null;
                }

                setKeepScreenOn(false);
              }

              @Override
              public void onVideoStart() {
                showTimedControlsVisibility();

                reportVideoStartEvent();
                if (videoComponentCallbacks != null) {
                  videoComponentCallbacks.onVideoStart();
                }

                if (ingamewallCtaLayout != null) {
                  ingamewallCtaLayout.setVisibility(View.GONE);
                }

                if (!videoVisible) {
                  Animation videoViewHideAnim =
                      AnimFactory.createAlphaShow(ingamewallVideoLayout, false);
                  videoViewHideAnim.setDuration(AnimFactory.ANIMATION_DURATION_LONG);

                  videoViewHideAnim.setAnimationListener(
                      new Animation.AnimationListener() {
                        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
                        @Override
                        public void onAnimationStart(Animation animation) {
                          if (ingamewallVideoLayout != null) {
                            ingamewallVideoLayout.setVisibility(View.VISIBLE);
                          }
                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {}

                        @Override
                        public void onAnimationRepeat(Animation animation) {}
                      });
                  videoVisible = true;
                  ingamewallVideoLayout.startAnimation(videoViewHideAnim);
                }

                setKeepScreenOn(true);
              }

              @Override
              public void onBuffer(boolean buffering) {
                if (buffering) {
                  // show progress
                  progressBar.setVisibility(View.VISIBLE);
                } else {
                  // hide progress
                  progressBar.setVisibility(View.GONE);
                }
              }

              @Override
              public void onTimeToEndUpdate(long progress) {
                if (circleCounter != null) {
                  circleCounter.setText(String.valueOf(progress));
                }
              }

              @Override
              public void onProgress(long progress, long max) {
                // not used
              }
            },
            videoComponentCallbacks.getAppOffersModel().getVideoPrequalGlobalConfig(),
            gameWallCallback);

    if (!TextUtils.isEmpty(appOffer.getCreativeUrl())) {
      try {
        URL cUrl = new URL(appOffer.getCreativeUrl());

        AssetsManagerSetBitmapTask task =
            new AssetsManagerSetBitmapTask(cUrl, getContext()) {
              @Override
              public void bitmapLoadedPost(Bitmap bitmap) {
                if (bitmap != null && ctaImage != null) {
                  ctaImage.setImageBitmap(bitmap);
                } else {
                  setOfferIconAsCreative(appOffer);
                }
              }
            };
        task.setParams(appOffer);

        AssetsManager.getInstance()
            .runEndScreenTask(task, AnimFactory.getVideoViewHeight(placeForVideo), placeForVideo);
      } catch (Exception ignored) {
        setOfferIconAsCreative(appOffer);
      }
    } else {
      setOfferIconAsCreative(appOffer);
    }

    ingamewallVideoLayout.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            synchronized (GameWallView.lastClickSync) {
              // mis-clicking prevention, using threshold of 1000 ms
              if ((SystemClock.elapsedRealtime() - GameWallView.lastClickTimestamp) < 1000) {
                GameWallView.lastClickTimestamp = SystemClock.elapsedRealtime();
                return;
              }

              GameWallView.lastClickTimestamp = SystemClock.elapsedRealtime();

              if (onOfferClickListener != null) {
                onOfferClickListener.onOfferClick(
                    appOffer, appOfferWithResult, true, Publisher.AppOfferStartOrigin.DIALOG_VIDEO);
              }
            }
          }
        });
    closeNoticeLayout.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            closeNoticeLayout.setVisibility(View.GONE);
            isCloseNoticeShown = false;
            if (videoPlayerInterface != null) {
              if (videoPlayerInterface.isVideoAtEnd()) {
                videoPlayerInterface.seekToVideonEnd(3000);
              } else {
                videoPlayerInterface.resumeVideo();
              }
            }
          }
        });
    closeNoticeContinueWatching.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            closeNoticeLayout.setVisibility(View.GONE);
            isCloseNoticeShown = false;
            if (videoPlayerInterface != null) {
              if (videoPlayerInterface.isVideoAtEnd()) {
                videoPlayerInterface.seekToVideonEnd(3000);
              } else {
                videoPlayerInterface.resumeVideo();
              }
            }
          }
        });
    videoMute.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            if (videoPlayerInterface != null && videoPlayerInterface.toggleSound(true)) {
              videoMute.setImageDrawable(getResources().getDrawable(R.drawable.bee7_btn_sound_on));
              reportVideoMuteEvent(false);
            } else {
              videoMute.setImageDrawable(getResources().getDrawable(R.drawable.bee7_btn_sound_off));
              reportVideoMuteEvent(true);
            }
          }
        });
    ctaImage.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            if (onOfferClickListener != null) {
              synchronized (GameWallView.lastClickSync) {
                // mis-clicking prevention, using threshold of 1000 ms
                if ((SystemClock.elapsedRealtime() - GameWallView.lastClickTimestamp) < 1000) {
                  GameWallView.lastClickTimestamp = SystemClock.elapsedRealtime();
                  return;
                }

                GameWallView.lastClickTimestamp = SystemClock.elapsedRealtime();

                onOfferClickListener.onOfferClick(
                    appOffer,
                    appOfferWithResult,
                    true,
                    Publisher.AppOfferStartOrigin.DIALOG_VIDEO_IMG_BTN);
              }
            }
          }
        });
    if (videoClose != null) {
      videoClose.setOnClickListener(
          new OnClickListener() {
            @Override
            public void onClick(View v) {
              if (videoComponentCallbacks != null) {
                videoComponentCallbacks.onHide(videoClose);
              }
            }
          });
    }
    if (closeNoticeClose != null) {
      closeNoticeClose.setOnClickListener(
          new OnClickListener() {
            @Override
            public void onClick(View v) {
              if (videoComponentCallbacks != null) {
                videoComponentCallbacks.onHide(closeNoticeClose);
              }
            }
          });
    }
  }