From cbb88109494ffc7916f6639c20ce05c0cec941a9 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期三, 07 四月 2021 15:07:45 +0800
Subject: [PATCH] 3.9.1bug修复

---
 BuWanVideo/src/com/weikou/beibeivideo/util/ad/ExpressAdManager.java |  470 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 432 insertions(+), 38 deletions(-)

diff --git a/BuWanVideo/src/com/weikou/beibeivideo/util/ad/ExpressAdManager.java b/BuWanVideo/src/com/weikou/beibeivideo/util/ad/ExpressAdManager.java
index 61023d8..285db9f 100644
--- a/BuWanVideo/src/com/weikou/beibeivideo/util/ad/ExpressAdManager.java
+++ b/BuWanVideo/src/com/weikou/beibeivideo/util/ad/ExpressAdManager.java
@@ -2,7 +2,9 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.util.Log;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
 import com.bytedance.sdk.openadsdk.AdSlot;
@@ -10,6 +12,7 @@
 import com.bytedance.sdk.openadsdk.TTAdManager;
 import com.bytedance.sdk.openadsdk.TTAdNative;
 import com.bytedance.sdk.openadsdk.TTNativeExpressAd;
+import com.google.gson.Gson;
 import com.qq.e.ads.cfg.VideoOption;
 import com.qq.e.ads.nativ.ADSize;
 import com.qq.e.ads.nativ.NativeExpressAD;
@@ -20,6 +23,7 @@
 import com.qq.e.ads.nativ.express2.VideoOption2;
 import com.qq.e.comm.util.AdError;
 import com.weikou.beibeivideo.entity.ad.ExpressAdContainer;
+import com.weikou.beibeivideo.ui.recommend.SearchActivity;
 import com.weikou.beibeivideo.util.BeibeiConstant;
 import com.weikou.beibeivideo.util.DimenUtils;
 
@@ -30,20 +34,20 @@
  * 淇℃伅娴佸箍鍛婄鐞�
  */
 public class ExpressAdManager {
-    public final static int SOURCE_GDT = 1;//骞跨偣閫�
-    public final static int SOURCE_GDT2 = 11;//骞跨偣閫�2.0
-    public final static int SOURCE_CSJ = 2;//绌垮北鐢�
 
-    int sourceType = SOURCE_GDT;
+
+    final static String TAG = "ExpressAdManager";
+
+    AdUtil.AD_TYPE sourceType = AdUtil.AD_TYPE.gdt;
 
     private TTAdNative mTTAdNative;
     private Context mContext;
 
 
-    public ExpressAdManager(int adSource, Context context) {
+    public ExpressAdManager(AdUtil.AD_TYPE adSource, Context context) {
         sourceType = adSource;
         this.mContext = context;
-        if (sourceType == SOURCE_CSJ) {
+        if (sourceType == AdUtil.AD_TYPE.csj) {
             TTAdManager ttAdManager = TTAdManagerHolder.get();
             mTTAdNative = ttAdManager.createAdNative(context);
 //            TTAdManagerHolder.get().requestPermissionIfNecessary(context);
@@ -62,7 +66,7 @@
      * @param adLoadListener
      */
     public void loadAd(int widthDP, int heightDP, String pid, int count, final IAdLoadListener adLoadListener) {
-        if (sourceType == SOURCE_GDT) {
+        if (sourceType == AdUtil.AD_TYPE.gdt) {
             loadGDT(pid, widthDP, heightDP, count, new IGDTAdLoadListener() {
                 @Override
                 public void onSuccess(List<NativeExpressADView> adList) {
@@ -79,7 +83,7 @@
 
                 }
             }, mContext);
-        } else if (sourceType == SOURCE_GDT2) {
+        } else if (sourceType == AdUtil.AD_TYPE.gdt2) {
             loadGDT2(pid, widthDP, heightDP, count, new IGDTAdLoadListener() {
                 @Override
                 public void onSuccess(List<NativeExpressADView> adList) {
@@ -97,7 +101,7 @@
                 }
             }, mContext);
 
-        } else if (sourceType == SOURCE_CSJ) {
+        } else if (sourceType == AdUtil.AD_TYPE.csj) {
             loadCSJ(pid, widthDP, heightDP, count, new ICSJAdLoadListener() {
                 @Override
                 public void onSuccess(List<TTNativeExpressAd> adList) {
@@ -121,18 +125,23 @@
      */
     public void loadRecommendLargeAd(final IAdLoadListener adLoadListener) {
         //鍔犺浇澶у浘
-        String pid = null;
-        if (sourceType == SOURCE_CSJ) {
-            pid = "945386135";
-        } else if (sourceType == SOURCE_GDT) {
-            pid = BeibeiConstant.GDT_RECOMMAND_NATIVE;
-        }
-        //鑾峰彇灞忓箷鐨勫
         int deviceWidth = DimenUtils.getScreenWidth(mContext);
         deviceWidth = DimenUtils.px2dip(mContext, deviceWidth);
-        int width = deviceWidth - 20;
+        int width = deviceWidth -9 * 2;
         int height = (int) (width * 0.8);
-        loadAd(width, height, pid, 2, adLoadListener);
+        String pid = null;
+        if (sourceType == AdUtil.AD_TYPE.csj) {
+            pid = CSJConstant.RECOMMEND_BIG_IMG_AD;
+            height = (int) (width * 0.78);
+        } else if (sourceType == AdUtil.AD_TYPE.gdt) {
+            pid = BeibeiConstant.GDT_RECOMMAND_NATIVE;
+        } else if (sourceType == AdUtil.AD_TYPE.gdt2) {
+            pid = GDTConstant.PID_HOME_RECOMMEND_BIG_IMG;
+        }
+        //鑾峰彇灞忓箷鐨勫
+
+
+        loadAd(width, height, pid, 1, adLoadListener);
     }
 
     /**
@@ -143,9 +152,9 @@
     public void loadRecommendSmallAd(final IAdLoadListener adLoadListener) {
         //鍔犺浇澶у浘
         String pid = null;
-        if (sourceType == SOURCE_CSJ) {
+        if (sourceType == AdUtil.AD_TYPE.csj) {
             pid = "945375047";
-        } else if (sourceType == SOURCE_GDT) {
+        } else if (sourceType == AdUtil.AD_TYPE.gdt) {
             pid = BeibeiConstant.GDT_RECOMMAND_MIN_NATIVE;
         }
         //鑾峰彇灞忓箷鐨勫
@@ -163,18 +172,21 @@
      * @param adLoadListener
      */
     public void loadVideoDetailPlayerBottomAd(final IAdLoadListener adLoadListener) {
+        Log.i(TAG, "loadVideoDetailPlayerBottomAd");
         //鍔犺浇澶у浘
         String pid = null;
-        if (sourceType == SOURCE_CSJ) {
-            pid = "945375047";
-        } else if (sourceType == SOURCE_GDT2) {
+        if (sourceType == AdUtil.AD_TYPE.csj) {
+            pid = CSJConstant.VIDEO_DETAIL_PLAYER_BOTTOM;
+        } else if (sourceType == AdUtil.AD_TYPE.gdt2) {
             pid = GDTConstant.PID_2_VIDEO_DETAIL_PLAY_EXPRESS1;
         }
+        if (mContext == null)
+            return;
         //鑾峰彇灞忓箷鐨勫
         int deviceWidth = DimenUtils.getScreenWidth(mContext);
         deviceWidth = DimenUtils.px2dip(mContext, deviceWidth);
         int width = (deviceWidth - 20);
-        int height = 80;
+        int height = 100;
         loadAd(width, height, pid, 1, adLoadListener);
     }
 
@@ -187,11 +199,13 @@
     public void loadVideoDetailRelativeVideoBottomAd(final IAdLoadListener adLoadListener) {
         //鍔犺浇澶у浘
         String pid = null;
-        if (sourceType == SOURCE_CSJ) {
-            pid = "945375047";
-        } else if (sourceType == SOURCE_GDT2) {
+        if (sourceType == AdUtil.AD_TYPE.csj) {
+            pid = CSJConstant.VIDEO_DETAIL_GUESSLIKE_TOP;
+        } else if (sourceType == AdUtil.AD_TYPE.gdt2) {
             pid = GDTConstant.PID_2_VIDEO_DETAIL_PLAY_EXPRESS2;
         }
+        if (mContext == null)
+            return;
         //鑾峰彇灞忓箷鐨勫
         int deviceWidth = DimenUtils.getScreenWidth(mContext);
         deviceWidth = DimenUtils.px2dip(mContext, deviceWidth);
@@ -209,9 +223,9 @@
     public void loadRecommendCategorySmallAd(final IAdLoadListener adLoadListener) {
         //鍔犺浇澶у浘
         String pid = null;
-        if (sourceType == SOURCE_CSJ) {
+        if (sourceType == AdUtil.AD_TYPE.csj) {
             pid = "945375047";
-        } else if (sourceType == SOURCE_GDT) {
+        } else if (sourceType == AdUtil.AD_TYPE.gdt) {
             pid = BeibeiConstant.GDT_RECOMMEND_CATEGORY_MIN_NATIVE;
         }
         //鑾峰彇灞忓箷鐨勫
@@ -231,9 +245,9 @@
     public void loadSearchResultSmallAd(int count, final IAdLoadListener adLoadListener) {
         //鍔犺浇澶у浘
         String pid = null;
-        if (sourceType == SOURCE_CSJ) {
+        if (sourceType == AdUtil.AD_TYPE.csj) {
             pid = "945379581";
-        } else if (sourceType == SOURCE_GDT) {
+        } else if (sourceType == AdUtil.AD_TYPE.gdt2) {
             pid = BeibeiConstant.GDT_SEARCH_RESULT_MIN_NATIVE;
         }
         //鑾峰彇灞忓箷鐨勫
@@ -246,6 +260,85 @@
 
 
     /**
+     * 鍔犺浇瑙嗛鍒楄〃灏忓箍鍛�
+     *
+     * @param count
+     * @param columns
+     * @param adLoadListener
+     */
+    public void loadVideoListSmallAd(int count, int columns, final IAdLoadListener adLoadListener) {
+
+        //鍔犺浇澶у浘
+        String pid = null;
+        if (sourceType == AdUtil.AD_TYPE.csj) {
+            pid = "945406595";
+        } else if (sourceType == AdUtil.AD_TYPE.gdt2) {
+            if (columns == 3)
+                pid = GDTConstant.PID_2_VIDEO_LIST_SMALL_AD_COLUMN3;
+            else if (columns == 2)
+                pid = GDTConstant.PID_2_VIDEO_LIST_SMALL_AD_COLUMN2;
+        }
+        //鑾峰彇灞忓箷鐨勫
+        int deviceWidth = DimenUtils.getScreenWidth(mContext);
+        deviceWidth = DimenUtils.px2dip(mContext, deviceWidth);
+        int width = 0;
+        int height = 0;
+
+        if (columns == 2) {
+            width = (deviceWidth - 30) / 2;
+            height = (int) (width * 0.85);
+        } else if (columns == 3) {
+            width = (deviceWidth - 20 - 9 * 2) / 3;
+            height = (int) (width * 1.6);
+        }
+
+        loadAd(width, height, pid, count, adLoadListener);
+    }
+
+
+    /**
+     * 鍔犺浇APP閫�鍑哄箍鍛�
+     *
+     * @param adLoadListener
+     */
+    public void loadAppExitAd(final IAdLoadListener adLoadListener) {
+        //鍔犺浇澶у浘
+        String pid = null;
+        if (sourceType == AdUtil.AD_TYPE.csj) {
+            pid = CSJConstant.APP_EXIT;
+        } else if (sourceType == AdUtil.AD_TYPE.gdt) {
+            pid = BeibeiConstant.GDT_EXIT_DIALOG;
+        }
+        //鑾峰彇灞忓箷鐨勫
+        int deviceWidth = DimenUtils.getScreenWidth(mContext);
+        deviceWidth = DimenUtils.px2dip(mContext, deviceWidth);
+        int width = deviceWidth * 3 / 4;
+        int height = (int) (width / 1.78f);
+
+        loadAd(width, height, pid, 1, adLoadListener);
+    }
+
+
+    /**
+     * 鍔犺浇瑙嗛鎼滅储骞垮憡
+     *
+     * @param adLoadListener
+     */
+    public void loadSearchAd(int widthDP, final IAdLoadListener adLoadListener) {
+        //鍔犺浇澶у浘
+        String pid = null;
+        if (sourceType == AdUtil.AD_TYPE.csj) {
+            pid = CSJConstant.VIDEO_SEARCH;
+        } else if (sourceType == AdUtil.AD_TYPE.gdt) {
+            pid = BeibeiConstant.GDT_SEARCH_NATIVE;
+        }
+        int height = (int) (widthDP / 1.78f);
+
+        loadAd(widthDP, height, pid, 1, adLoadListener);
+    }
+
+
+    /**
      * 鍔犺浇骞跨偣閫氬箍鍛�
      *
      * @param positionId
@@ -254,6 +347,8 @@
      * @param context
      */
     private void loadGDT(String positionId, int widthDP, int heightDP, int count, final IGDTAdLoadListener adLoadListener, Context context) {
+
+
         NativeExpressAD nativeExpressAD = new NativeExpressAD(context, new ADSize(ADSize.FULL_WIDTH, ADSize.AUTO_HEIGHT),
                 positionId, new NativeExpressAD.NativeExpressADListener() {
 
@@ -328,6 +423,9 @@
      * @param context
      */
     private void loadGDT2(String positionId, int widthDP, int heightDP, int count, final IGDTAdLoadListener adLoadListener, Context context) {
+
+        Log.i(TAG, String.format("loadGDT2:positionId-%s  widthDP-%s heightDP-%s", positionId, widthDP, heightDP));
+
         NativeExpressAD2 nativeExpressAD2 = new NativeExpressAD2(context, positionId, new NativeExpressAD2.AdLoadListener() {
             @Override
             public void onLoadSuccess(List<NativeExpressADData2> list) {
@@ -385,23 +483,35 @@
 
 
     /**
-     * 娓叉煋妯℃澘骞垮憡
+     * 娓叉煋妯℃澘鍜屽~鍏呭箍鍛�
      *
      * @param activity
      * @param ad
      * @param fl_ad
      * @param adEventListener
      */
-    public static void render(Activity activity, final ExpressAdContainer ad, final FrameLayout fl_ad, final IAdEventListener adEventListener) {
-        fl_ad.removeAllViews();
+    public static void renderAndFillAd(Activity activity, final ExpressAdContainer ad, final FrameLayout fl_ad, final IAdEventListener adEventListener) {
+
         if (ad == null) {//骞垮憡涓虹┖
             fl_ad.setVisibility(View.GONE);
         } else {
             fl_ad.setVisibility(View.VISIBLE);
             if (ad.getGdt() != null) {
+                if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt()) {
+                    return;
+                }
+                fl_ad.removeAllViews();
                 ad.getGdt().render();
+                if (ad.getGdt().getParent() != null) {
+                    ((ViewGroup) ad.getGdt().getParent()).removeAllViews();
+                }
                 fl_ad.addView(ad.getGdt());
             } else if (ad.getGdt2() != null) {
+                if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt2().getAdView()) {
+                    return;
+                }
+                fl_ad.removeAllViews();
+
                 ad.getGdt2().setAdEventListener(new AdEventListener() {
                     @Override
                     public void onClick() {
@@ -415,6 +525,9 @@
 
                     @Override
                     public void onRenderSuccess() {
+                        if (ad.getGdt2().getAdView().getParent() != null) {
+                            ((ViewGroup) ad.getGdt2().getAdView().getParent()).removeAllViews();
+                        }
                         fl_ad.addView(ad.getGdt2().getAdView());
                     }
 
@@ -426,19 +539,23 @@
                     @Override
                     public void onAdClosed() {
                         if (adEventListener != null) {
-                            adEventListener.closeAd();
+                            adEventListener.closeAd(ad);
                         }
                     }
                 });
                 ad.getGdt2().render();
 
             } else if (ad.getCsj() != null) {
+                if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getCsj().getExpressAdView()) {
+                    return;
+                }
+
                 ad.getCsj().setDislikeCallback(activity, new TTAdDislike.DislikeInteractionCallback() {
 
                     @Override
                     public void onSelected(int i, String s) {
                         if (adEventListener != null) {
-                            adEventListener.closeAd();
+                            adEventListener.closeAd(ad);
                         }
                     }
 
@@ -453,9 +570,274 @@
                     }
                 });
                 ad.getCsj().render();
+                if (ad.getCsj().getExpressAdView().getParent() != null) {
+                    ((ViewGroup) ad.getCsj().getExpressAdView().getParent()).removeAllViews();
+                }
                 fl_ad.addView(ad.getCsj().getExpressAdView());
             }
         }
+
+    }
+
+
+    /**
+     * 娓叉煋骞垮憡
+     *
+     * @param activity
+     * @param ad
+     * @param adRenderListener
+     * @param adEventListener
+     */
+    public static void renderAd(Activity activity, final ExpressAdContainer ad, final IAdRenderListener adRenderListener, final IAdEventListener adEventListener) {
+
+        if (ad == null) {//骞垮憡涓虹┖
+            return;
+        }
+
+        if (ad.getGdt() != null) {
+            ad.getGdt().render();
+            List<ExpressAdContainer> list = new ArrayList<>();
+            list.add(ad);
+            if (adRenderListener != null)
+                adRenderListener.onRenderSuccess(list);
+        } else if (ad.getGdt2() != null) {
+            ad.getGdt2().setAdEventListener(new AdEventListener() {
+                @Override
+                public void onClick() {
+
+                }
+
+                @Override
+                public void onExposed() {
+
+                }
+
+                @Override
+                public void onRenderSuccess() {
+                    List<ExpressAdContainer> list = new ArrayList<>();
+                    list.add(ad);
+                    if (adRenderListener != null)
+                        adRenderListener.onRenderSuccess(list);
+                }
+
+                @Override
+                public void onRenderFail() {
+                    List<ExpressAdContainer> list = new ArrayList<>();
+                    list.add(ad);
+                    if (adRenderListener != null)
+                        adRenderListener.onRenderFail(list);
+                }
+
+                @Override
+                public void onAdClosed() {
+                    if (adEventListener != null)
+                        adEventListener.closeAd(ad);
+                }
+            });
+            ad.getGdt2().render();
+
+        } else if (ad.getCsj() != null) {
+            ad.getCsj().setExpressInteractionListener(new TTNativeExpressAd.ExpressAdInteractionListener() {
+                @Override
+                public void onAdClicked(View view, int i) {
+
+                }
+
+                @Override
+                public void onAdShow(View view, int i) {
+
+                }
+
+                @Override
+                public void onRenderFail(View view, String s, int i) {
+                    List<ExpressAdContainer> list = new ArrayList<>();
+                    list.add(ad);
+                    if (adRenderListener != null)
+                        adRenderListener.onRenderFail(list);
+                }
+
+                @Override
+                public void onRenderSuccess(View view, float v, float v1) {
+                    Log.d(TAG, "onRenderSuccess");
+                    List<ExpressAdContainer> list = new ArrayList<>();
+                    list.add(ad);
+                    if (adRenderListener != null)
+                        adRenderListener.onRenderSuccess(list);
+                }
+            });
+            if (activity != null)
+                ad.getCsj().setDislikeCallback(activity, new TTAdDislike.DislikeInteractionCallback() {
+
+                    @Override
+                    public void onSelected(int i, String s) {
+                        if (adEventListener != null) {
+                            adEventListener.closeAd(ad);
+                        }
+                    }
+
+                    @Override
+                    public void onCancel() {
+
+                    }
+
+                    @Override
+                    public void onRefuse() {
+
+                    }
+                });
+            ad.getCsj().render();
+        }
+
+
+    }
+
+    /**
+     * 涓哄箍鍛婄粦瀹氬叧闂簨浠�
+     *
+     * @param activity
+     * @param ad
+     * @param adEventListener
+     */
+    public static void bindCloseListener(Activity activity, final ExpressAdContainer ad, final IAdEventListener adEventListener) {
+
+        if (ad == null) {//骞垮憡涓虹┖
+            return;
+        }
+
+        if (ad.getGdt() != null) {
+            return;
+        } else if (ad.getGdt2() != null) {
+            ad.getGdt2().setAdEventListener(new AdEventListener() {
+                @Override
+                public void onClick() {
+
+                }
+
+                @Override
+                public void onExposed() {
+
+                }
+
+                @Override
+                public void onRenderSuccess() {
+
+                }
+
+                @Override
+                public void onRenderFail() {
+                }
+
+                @Override
+                public void onAdClosed() {
+                    if (adEventListener != null)
+                        adEventListener.closeAd(ad);
+                }
+            });
+
+        } else if (ad.getCsj() != null) {
+            ad.getCsj().setExpressInteractionListener(new TTNativeExpressAd.ExpressAdInteractionListener() {
+                @Override
+                public void onAdClicked(View view, int i) {
+
+                }
+
+                @Override
+                public void onAdShow(View view, int i) {
+
+                }
+
+                @Override
+                public void onRenderFail(View view, String s, int i) {
+
+                }
+
+                @Override
+                public void onRenderSuccess(View view, float v, float v1) {
+
+                }
+            });
+            ad.getCsj().setDislikeCallback(activity, new TTAdDislike.DislikeInteractionCallback() {
+
+                @Override
+                public void onSelected(int i, String s) {
+                    if (adEventListener != null) {
+                        adEventListener.closeAd(ad);
+                    }
+                }
+
+                @Override
+                public void onCancel() {
+
+                }
+
+                @Override
+                public void onRefuse() {
+
+                }
+            });
+        }
+
+
+    }
+
+
+    /**
+     * 濉厖骞垮憡
+     *
+     * @param ad
+     * @param fl_ad
+     */
+    public static void fillAd(final ExpressAdContainer ad, final FrameLayout fl_ad) {
+
+        fl_ad.post(new Runnable() {
+            @Override
+            public void run() {
+                if (ad == null) {//骞垮憡涓虹┖
+                    fl_ad.setVisibility(View.GONE);
+                } else {
+                    fl_ad.setVisibility(View.VISIBLE);
+                    if (ad.getGdt() != null) {
+                        if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt()) {
+                            return;
+                        }
+                        if (ad.getGdt().getParent() != null) {
+                            ((ViewGroup) ad.getGdt().getParent()).removeAllViews();
+                        }
+                        fl_ad.removeAllViews();
+                        fl_ad.addView(ad.getGdt());
+                    } else if (ad.getGdt2() != null) {
+                        if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt2().getAdView()) {
+                            return;
+                        }
+                        if (ad.getGdt2().getAdView().getParent() != null) {
+                            ((ViewGroup) ad.getGdt2().getAdView().getParent()).removeAllViews();
+                        }
+                        fl_ad.removeAllViews();
+                        fl_ad.addView(ad.getGdt2().getAdView());
+
+                    } else if (ad.getCsj() != null) {
+                        if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getCsj().getExpressAdView()) {
+                            return;
+                        }
+                        if (ad.getCsj().getExpressAdView().getParent() != null) {
+                            ((ViewGroup) ad.getCsj().getExpressAdView().getParent()).removeAllViews();
+                        }
+                        fl_ad.removeAllViews();
+                        fl_ad.addView(ad.getCsj().getExpressAdView());
+                    }
+                }
+                if (fl_ad.getChildCount() > 0) {
+                    fl_ad.getChildAt(0).setVisibility(View.VISIBLE);
+                    fl_ad.getChildAt(0).post(new Runnable() {
+                        @Override
+                        public void run() {
+
+                        }
+                    });
+                }
+            }
+        });
+
 
     }
 
@@ -475,7 +857,19 @@
         public void onSuccess(List<ExpressAdContainer> adList);
     }
 
-    public interface IAdEventListener {
-        public void closeAd();
+    public interface IAdRenderListener {
+        public void onRenderSuccess(List<ExpressAdContainer> adList);
+
+        public void onRenderFail(List<ExpressAdContainer> adList);
     }
+
+    public interface IAdEventListener {
+        public void closeAd(ExpressAdContainer ad);
+    }
+
+
+    public interface IAdShowListener {
+        public void show();
+    }
+
 }

--
Gitblit v1.8.0