tnk_flutter_rwd 0.4.4 copy "tnk_flutter_rwd: ^0.4.4" to clipboard
tnk_flutter_rwd: ^0.4.4 copied to clipboard

tnk rwd sdk flutter plugin support android.

example/lib/main.dart

import 'dart:collection';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:tnk_flutter_rwd/tnk_flutter_rwd.dart';
import 'package:tnk_flutter_rwd_example/tnk_flutter_rwd_point_effect.dart';
import 'tnk_flutter_rwd_analytics.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp>
    with WidgetsBindingObserver // 앱 상태변화를 감지하기 위한 observer 사용
{
  final _tnkFlutterRwdPlugin = TnkFlutterRwd();

  @override
  void initState() {
    MethodChannel channel = const MethodChannel('tnk_flutter_rwd');
    channel.setMethodCallHandler(getOfferWallEvent);

    WidgetsBinding.instance.addObserver(this); // 앱 상태변화를 감지하기 위한 observer 등록
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this); // 앱 상태변화를 감지하기 위한 observer 해제
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print('state = $state');
    if (state == AppLifecycleState.resumed) {
      // 앱이 활성화 될때
      print('앱이 활성화 될때');
      _tnkFlutterRwdPlugin.closeAdDetail();
      _tnkFlutterRwdPlugin.closeOfferwall();
    } else if (state == AppLifecycleState.inactive) {
      // 앱이 비활성화 될때
      print('앱이 비활성화 될때');
    } else if (state == AppLifecycleState.paused) {
      // 앱이 일시정지 될때
      print('앱이 일시정지 될때');
    } else if (state == AppLifecycleState.detached) {
      // 앱이 종료될때
      print('앱이 종료될때');
    }
  }

  String _tnkResult = 'Unknown';
  int _myPoint = 0;
  int _queryPoint = 0;
  final String _itemId = "item.0001";
  final int _cost = 2;

  int _selectedIndex = 0;

  Future<void> getOfferWallEvent(MethodCall methodCall) async {
    if (TnkMethodChannelEvent.didOfferwallRemoved(methodCall)) {
      // TODO 오퍼월 close callback
      print("offer window closed");
    }

    setState(() {
      _tnkResult = methodCall.arguments;
    });
  }

  Future<void> showAdList() async {
    String platformVersion;

    try {
      await _tnkFlutterRwdPlugin.setUserName("testUser");
      await _tnkFlutterRwdPlugin.setCOPPA(false);

      _tnkFlutterRwdPlugin.setUseTermsPopup(false);
      platformVersion = await _tnkFlutterRwdPlugin.showAdList("미션 수행하기") ??
          'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // sleepAndClose();
    if (!mounted) return;

    setState(() {
      _tnkResult = platformVersion;
    });
  }

  Future<void> sleepAndClose() async {
    sleep(const Duration(seconds: 10));
    _tnkFlutterRwdPlugin.closeAdDetail();
    _tnkFlutterRwdPlugin.closeOfferwall();
  }

  Future<void> showATTPopup() async {
    try {
      await _tnkFlutterRwdPlugin.showATTPopup();
    } on Exception {
      return;
    }
  }

  Future<void> getEarnPoint() async {
    int point;
    try {
      point = await _tnkFlutterRwdPlugin.getEarnPoint() ?? 0;
    } on PlatformException {
      point = 0;
    }

    // setState(() {
    //   _myPoint = point;
    // });
  }

  Future<void> test() async {
    try {
      String? placementData =
          await _tnkFlutterRwdPlugin.getPlacementJsonData("offer_nor");
      _tnkFlutterRwdPlugin.setUseTermsPopup(false);

      if (placementData != null) {
        Map<String, dynamic> jsonObject = jsonDecode(placementData);
        String resCode = jsonObject["res_code"];
        String resMessage = jsonObject["res_message"];

        if (resCode == "1") {
          List<TnkPlacementAdItem> adList =
              praserJsonToTnkPlacementAdItem(jsonObject["ad_list"]);

          setState(() {
            this.adList.addAll(adList);
            // _tnkResult = placementData ?? "null";
          });
        } else {
          // 광고 로드 실패
        }
      }
    } on PlatformException {
      setState(() {
        _tnkResult = "excetpion";
      });
      return;
    }
  }

  // praser json to List<TnkPlacementAdItem>
  List<TnkPlacementAdItem> praserJsonToTnkPlacementAdItem(
      List<dynamic> adList) {
    List<TnkPlacementAdItem> tnkPlacementAdItemList = [];
    for (var adItem in adList) {
      TnkPlacementAdItem tnkPlacementAdItem = TnkPlacementAdItem();
      tnkPlacementAdItem.app_id = adItem["app_id"];
      tnkPlacementAdItem.app_nm = adItem["app_nm"];
      tnkPlacementAdItem.img_url = adItem["img_url"];
      tnkPlacementAdItem.pnt_amt = adItem["pnt_amt"];
      tnkPlacementAdItem.org_amt = adItem["org_amt"];
      tnkPlacementAdItem.pnt_unit = adItem["pnt_unit"];
      tnkPlacementAdItem.prd_price = adItem["prd_price"];
      tnkPlacementAdItem.org_prd_price = adItem["org_prd_price"];
      tnkPlacementAdItem.sale_dc_rate = adItem["sale_dc_rate"];
      tnkPlacementAdItem.multi_yn = adItem["multi_yn"];
      tnkPlacementAdItem.cmpn_type = adItem["cmpn_type"];
      tnkPlacementAdItem.cmpn_type_name = adItem["cmpn_type_name"];
      tnkPlacementAdItem.like_yn = adItem["like_yn"];

      tnkPlacementAdItemList.add(tnkPlacementAdItem);
    }

    return tnkPlacementAdItemList;
  }

  Future<void> onAdItemClick(String appId) async {
    try {
      await _tnkFlutterRwdPlugin.onItemClick(appId);
      // sleep(const Duration(seconds:5));
      // _tnkFlutterRwdPlugin.closeAdDetail();

      sleep(const Duration(seconds: 10));
      _tnkFlutterRwdPlugin.closeAdDetail();
      _tnkFlutterRwdPlugin.closeOfferwall();
    } on Exception {
      return;
    }
  }

  Future<void> setNoUsePointIcon() async {
    try {
      await _tnkFlutterRwdPlugin.setNoUsePointIcon();
    } on Exception {
      return;
    }
  }

  Future<void> setNoUsePrivacyAlert() async {
    try {
      await _tnkFlutterRwdPlugin.setNoUsePrivacyAlert();
    } on Exception {
      return;
    }
  }

  Future<void> getQueryPoint() async {
    int point;
    try {
      point = await _tnkFlutterRwdPlugin.getQueryPoint() ?? 0;
    } on PlatformException {
      point = 0;
    }

    // setState(() {
    //   _queryPoint = point;
    // });
  }

  Future<void> purchaseItem(String itemId, int cost) async {
    try {
      await _tnkFlutterRwdPlugin.purchaseItem(itemId, cost);
    } on Exception {
      return;
    }
  }

  Future<void> withdrawPoints(String description) async {
    try {
      await _tnkFlutterRwdPlugin.withdrawPoints(description);
    } on Exception {
      return;
    }
  }

  void _showDialog(BuildContext context) {
    showDialog(
        context: context,
        builder: (BuildContext ctx) {
          return const AlertDialog(
            title: Text("abc"),
            content: Text(' 항목을 선택했습니다.'),
          );
        });
  }

  Future<void> setCustomUI() async {
    try {
      HashMap<String, String> paramMap = HashMap();
      //0xff252542
      paramMap.addAll({
        // 카테고리 컬러
        "category_select_font": "#26DACA",
        // 선택된 필터 배경색
        "filter_select_background": "#26DACA",
        // 선택된 필터 폰트 컬러
        "filter_select_font": "#FFFFFF",
        // 선택안한 필터 폰트 컬러
        "filter_not_select_font": "#515151",
        // 선택안한 필터 배경색
        "filter_not_select_background": "#FFFFFF",
        // 광고상세페이지 광고타이틀 폰트 컬러
        "adinfo_title_font": "#161A1B",
        // 광고상세페이지 광고액션 폰트 컬러
        "adinfo_desc_font": "#26DACA",
        // 광고상세페이지 포인트 단위 컬러
        "adinfo_point_unit_font": "#26DACA",
        // 광고상세페이지 포인트 액수 폰트 컬러
        "adinfo_point_amount_font": "#26DACA",
        // 광고상세페이지 버튼 백그라운드 컬러
        "adinfo_button_background": "#26DACA",
        // 광고상세페이지 버튼 폰트 컬러
        "adinfo_button_title_font": "#FFFFFF",
        // 광고상세페이지 버튼 백그라운드 컬러
        "adinfo_button_desc_font": "#FFFFFF",
        "adinfo_button_gradient_option": "L",
        // 광고리스트 광고타이틀 폰트 컬러
        "adlist_title_font": "#161A1B",
        // 광고리스트 광고액션 폰트 컬러
        "adlist_desc_font": "#515151",
        // 광고리스트 포인트 단위 폰트 컬러
        "adlist_point_unit_font": "##26DACA",
        // 광고리스트 포인트 액수 폰트 컬러
        "adlist_point_amount_font": "##26DACA",

        "app_main_color": "#26DACA",

        // 1 - 재화 아이콘, 단위 둘다 표시
        // 2 - 재화 아이콘만 표시
        // 3 - 재화 단위만 표시
        // 4 - 둘다 표시 안함
        "option": "1",

        // 포인트 아이콘 이미지 이름
        "point_icon_name": "star_icon",
        "point_icon_name_sub": "star_icon_white"
      });
      await _tnkFlutterRwdPlugin.setCustomUIDefault(paramMap);
    } on Exception {
      return;
    }
  }

  Future<void> useCustomIcon() async {
    return setCustomUnitIcon(TnkFlutterRwdPointEffectType.ICON);
  }

  Future<void> useCustomIconAndUnit() async {
    return setCustomUnitIcon(TnkFlutterRwdPointEffectType.ICON_N_UNIT);
  }

  Future<void> useUnit() async {
    return setCustomUnitIcon(TnkFlutterRwdPointEffectType.UNIT);
  }

  Future<void> useEffectNone() async {
    return setCustomUnitIcon(TnkFlutterRwdPointEffectType.NONE);
  }

  Future<void> setCustomUnitIcon(String type) async {
    try {
      HashMap<String, String> paramMap = HashMap();
      paramMap.addAll({
        // 1 - 재화 아이콘, 단위 둘다 표시
        // 2 - 재화 아이콘만 표시
        // 3 - 재화 단위만 표시
        // 4 - 둘다 표시 안함
        "option": "2",

        // 포인트 아이콘 이미지 이름
        // "point_icon_name":"star_icon",
        // "point_icon_name_sub":"star_icon_white"
      });
      await _tnkFlutterRwdPlugin.setCustomUnitIcon(paramMap);
    } on Exception {
      return;
    }
  }

  var datas = {1, 2, 3};
  List<TnkPlacementAdItem> adList = [];

  @override
  Widget build(BuildContext context) {
    List<DataRow> cells = [];
    cells = adList
        .map((e) => DataRow(cells: [
              DataCell(
                Container(
                    width: 70, //SET width
                    child: Image(
                      image: NetworkImage(e.img_url),
                      width: 70,
                    )),
                onLongPress: () {
                  onAdItemClick(e.app_id.toString());
                },
              ),
              DataCell(
                Text(
                  e.app_nm,
                ),
              ),
              DataCell(Text(e.pnt_amt.toString())),
            ]))
        .toList();

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter RWD Plugin'),
          actions: [
            IconButton(
                onPressed: () {
                  // setNoUsePointIcon();
                  setCustomUI();
                },
                icon: const Icon(Icons.dashboard_customize))
          ],
        ),
        drawer: Drawer(
          child: ListView(
            padding: EdgeInsets.zero,
            children: <Widget>[
              const UserAccountsDrawerHeader(
                currentAccountPicture: CircleAvatar(
                  backgroundColor: Colors.white,
                ),
                accountName: Text("tnkfactory"),
                accountEmail: Text('[email protected]'),
                decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.only(
                        bottomLeft: Radius.circular(40.0),
                        bottomRight: Radius.circular(40.0))),
              ),
              ListTile(
                leading: const Icon(
                  Icons.tv,
                  color: Colors.blueGrey,
                ),
                title: const Text('OfferWall'),
                onTap: () => "aaa",
              ),
              ListTile(
                leading: const Icon(
                  Icons.ac_unit,
                  color: Colors.blueGrey,
                ),
                title: const Text('new view'),
                onTap: () => {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => NewScreen()),
                  )
                },
              ),
            ],
          ),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                DataTable(
                  columns: const [
                    DataColumn(label: Text('img')),
                    DataColumn(label: Text('title')),
                    DataColumn(label: Text('point')),
                  ],
                  rows: cells,
                  // rows: [
                  //   DataRow(cells: [
                  //     DataCell(Text(_tnkResult)),
                  //     DataCell(Text('$_myPoint')),
                  //     DataCell(Text('$_queryPoint')),
                  //   ]),
                  // ],
                ),
              ]),
              ButtonBar(
                children: [
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ElevatedButton(
                        onPressed: () {
                          test();
                        },
                        style: ElevatedButton.styleFrom(
                            foregroundColor: Colors.white,
                            backgroundColor: Colors.redAccent,
                            shadowColor: Colors.redAccent,
                            elevation: 5),
                        child: const Text("TEST"),
                      ),
                      ElevatedButton(
                          onPressed: () {
                            test();
                          },
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.blueAccent,
                              shadowColor: Colors.blueAccent,
                              elevation: 10),
                          child: const Text('적립가능한 포인트')),
                      ElevatedButton(
                          onPressed: () {
                            getQueryPoint();
                          },
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.blueAccent,
                              shadowColor: Colors.blueAccent,
                              elevation: 10),
                          child: const Text('사용가능한 포인트')),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ElevatedButton(
                          onPressed: () {
                            purchaseItem(_itemId, _cost);
                          },
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.redAccent,
                              shadowColor: Colors.redAccent,
                              elevation: 10),
                          child: const Text('테스트구매')),
                      ElevatedButton(
                          onPressed: () {
                            withdrawPoints("테스트 인출");
                          },
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.redAccent,
                              shadowColor: Colors.redAccent,
                              elevation: 10),
                          child: const Text('테스트인출')),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ElevatedButton(
                          onPressed: showATTPopup,
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.grey,
                              shadowColor: Colors.grey,
                              elevation: 10),
                          child: const Text('ATT Popup')),
                      ElevatedButton(
                          onPressed: setNoUsePointIcon,
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.grey,
                              shadowColor: Colors.grey,
                              elevation: 10),
                          child: const Text('포인트아이콘 사용안함')),
                      ElevatedButton(
                          onPressed: () {},
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.amberAccent,
                              shadowColor: Colors.amberAccent,
                              elevation: 10),
                          child: const Text("abc"))
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ElevatedButton(
                          onPressed: useCustomIcon,
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.grey,
                              shadowColor: Colors.grey,
                              elevation: 10),
                          child: const Text('커스텀아이콘')),
                      ElevatedButton(
                          onPressed: useCustomIconAndUnit,
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.grey,
                              shadowColor: Colors.grey,
                              elevation: 10),
                          child: const Text('커스텀아이콘+유닛')),
                      ElevatedButton(
                          onPressed: useUnit,
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.grey,
                              shadowColor: Colors.grey,
                              elevation: 10),
                          child: const Text('유닛')),
                      ElevatedButton(
                          onPressed: useEffectNone,
                          style: ElevatedButton.styleFrom(
                              foregroundColor: Colors.white,
                              backgroundColor: Colors.grey,
                              shadowColor: Colors.grey,
                              elevation: 10),
                          child: const Text('숫자만')),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ElevatedButton(
                        onPressed: () {
                          Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => NewScreen()),
                          );
                        },
                        style: ElevatedButton.styleFrom(
                            foregroundColor: Colors.white,
                            backgroundColor: Colors.grey,
                            shadowColor: Colors.grey,
                            elevation: 10),
                        child: const Text('새로운화면 이동'),
                      )
                    ],
                  )
                ],
              ),
            ],
          ),
        ),
        bottomNavigationBar: BottomNavigationBar(
          backgroundColor: Colors.white,
          unselectedItemColor: Colors.blueGrey,
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              label: '홈',
            ),
            BottomNavigationBarItem(icon: Icon(Icons.tv), label: 'Offerwall'),
            BottomNavigationBarItem(
                icon: Icon(Icons.notifications), label: '알림'),
          ],
          currentIndex: _selectedIndex,
          selectedItemColor: Colors.blue,
          onTap: _onItemTapped,
        ),
      ),
    );
  }

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });

    if (_selectedIndex == 1) {
      showAdList();
    }
  }









}


class NewScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('New Screen')),
      body: Center(child: Text('This is a new screen')),
    );
  }
}

class TnkPlacementAdItem {
  int app_id = 0; // Int 광고 고유 식별값
  String app_nm = ""; // String 광고 제목
  String img_url = ""; // String 이미지 url
  int pnt_amt = 0; // Int 지급 포인트 (이벤트 진행시 이벤트 배율 적용된 포인트)
  int org_amt = 0; // Int 배율 이벤트 진행 시 원래의 포인트(이벤트 기간 아닐경우 0)
  String pnt_unit = ""; // String 포인트 재화 단위
  int prd_price = 0; // Int CPS상품 가격
  int org_prd_price = 0; // Int CPS상품 할인 전 가격
  int sale_dc_rate = 0; // Int CPS 상품 할인율
  bool multi_yn = false; // Bool 멀티 미션 광고 여부
  int cmpn_type = 0; // Int 광고 유형코드
  String cmpn_type_name = ""; // String 광고 유형 이름
  String like_yn = ""; // String 즐겨찾기 상품 여부
}

class PlacementPubInfo {
  int ad_type =
      0; //	지면에 설정되어 있는 광고 유형(0 : 보상형, 1 : CPS, 2 : 제휴몰, 3 : 뉴스, 4 : 이벤트)
  String title = ""; //	지면 타이틀
  String more_lbl = ""; //	더보기 라벨
  String cust_data = ""; //	매체 설정값
  String ctype_surl =
      ""; //	캠페인타입 정보 URL (해당 URL 호출시 json 반환) {list_count:int, list:[{cmpn_type:int, cmpn_type_nm:string},….]}
  String pnt_unit = ""; //	매체 포인트 명칭
  String plcmt_id = ""; //	매체 설정 지면 ID
}