commit d5c2384e285dab94f8f6c9e82f37dfd552ae0df9 Author: fengshengxiong Date: Thu Jan 22 16:48:55 2026 +0800 app名称:PrankSoundboard 包名:com.prankSoundboard.prankSoundboard 1.0未传 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..9e8b9e9 --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "d693b4b9dbac2acd4477aea4555ca6dcbea44ba2" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2 + base_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2 + - platform: ios + create_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2 + base_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..7bd60b3 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# prank_soundboard + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/about.txt b/about.txt new file mode 100644 index 0000000..2d01619 --- /dev/null +++ b/about.txt @@ -0,0 +1,59 @@ +【应用简介】 + +恶搞音效板是一款专为恶作剧爱好者打造的趣味音效应用!收录了数百种搞笑音效,包括空气喇叭、放屁声、理发器、打喷嚏、枪声、尖叫声等多种分类,让你随时随地成为派对焦点,给朋友带来意想不到的惊喜! + +【核心功能】 + +🎵 丰富音效库 +• 6大热门分类,数百种高品质音效 +• 持续更新,不断添加新内容 +• 一键播放,操作简单直观 + +⭐ 收藏管理 +• 收藏你最喜欢的音效 +• 快速访问常用音效 +• 滑动删除,轻松管理 + +🎚️ 播放控制 +• 音量调节,精确控制 +• 循环播放,持续恶搞 +• 进度显示,实时掌控 + +🎨 精美界面 +• 现代化设计,视觉享受 +• 流畅动画,操作顺滑 +• 分类配色,一目了然 + +【使用场景】 + +✓ 朋友聚会 - 活跃气氛的最佳工具 +✓ 恶作剧 - 给朋友一个惊喜 +✓ 派对娱乐 - 成为全场焦点 +✓ 搞笑视频 - 为视频添加音效 +✓ 日常娱乐 - 随时随地开心一笑 + +【主要特色】 + +• 完全免费 - 所有音效免费使用 +• 无需网络 - 离线也能畅玩(部分音效) +• 简单易用 - 老少皆宜的操作界面 +• 高品质音效 - 清晰响亮的音质 +• 持续更新 - 定期添加新音效 + +【分类介绍】 + +🔊 空气喇叭 - 超大声的喇叭音效,吓人必备 +💨 放屁声 - 各种搞笑的放屁音效 +✂️ 理发器 - 逼真的理发器声音 +🤧 打喷嚏 - 夸张的打喷嚏音效 +🔫 枪声 - 各种枪械射击声 +😱 尖叫声 - 恐怖惊悚的尖叫 + + +【温馨提示】 + +• 请在合适的场合使用,注意他人感受 +• 请勿在公共场合大声播放,避免打扰他人 +• 建议在朋友间娱乐使用,切勿用于恶意骚扰 +• 部分音效可能较大声,请注意音量控制 + diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/assets/applogo.png b/assets/applogo.png new file mode 100644 index 0000000..88a15a3 Binary files /dev/null and b/assets/applogo.png differ diff --git a/assets/data.json b/assets/data.json new file mode 100644 index 0000000..a6e8dc3 --- /dev/null +++ b/assets/data.json @@ -0,0 +1,2098 @@ +[ + { + "categoryId": "625f83491fea07887e619063", + "categoryName": "Airhorn", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/3807ddc86891d2f6994cebcc82773f20.png", + "list": [ + { + "title": "Airhorn 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7247df90396f71742a19b17cd4b44007.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/18423e3b40a7abe5b13fef44a090279d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3e4d4574dc0ca65457ed1635d8d8a35f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b188a56dd6f4d96081dbdc55c9d8189e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b234c324d5ad721eb8d0ee8eb2ca6586.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c7a498cd8ebe972a0d9d290967b0c217.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a5f49085cfd96acf9af9ae3b0d40d767.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + }, + { + "title": "Airhorn 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/dd803e0943de2f23e345f7a333ef50f0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7111dbef323985fa5ce40cc001efc06b.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e61906b", + "categoryName": "Hair Clipper", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/01e97185a794005a5cd5a8ca6903d68d.png", + "list": [ + { + "title": "Hair Clipper 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/64a3a3936d9083c3fb0cb8af63b62db1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f4d989eca3644062185bd21f0a7eac98.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/48828fd5b702259e0bb4a31cb38c002d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7ac57b43913e8077e5e9db31426194fe.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/173c711dda00a1a683a3e64cb73a01a5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/76de9aeaa070bc2bb6010270ef7c91ef.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/df5e55461640aa6326bd1f27bc961abb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a3248ae7e08e69d499dbd50f99a39b22.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/df05f0cb432e9c3fddcc505d37bdc596.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ad5285afce500ae8b05d104cd70c16e0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + }, + { + "title": "Hair Clipper 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2d43e87e8d312bc0174814dacf15a2bc.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e40b8da118eb07fbd3c6de7fa6749e39.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e619065", + "categoryName": "Breaking", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/253556740e135a243df384d2bc216757.png", + "list": [ + { + "title": "Breaking 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/61bd13d8cbb5150a7a477bd28d70a4e3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9c34aa3d5c4d338958c71a25ca27f687.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c1d49295a8bd5d84fe7c1ce9e84e09fb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3b3c248b515e8c3a95114e43ff5a4d1a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e0f0d1f6a131699cbfd25c00192af3cd.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/777effb7b006cc507c54df2d3ae97956.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/12200195df885df378ab7097e3d5e8b5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d5e25e6c6f9bd1316067910ae3f07f96.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/95ea3be095fd6794270ed7dc5adf0da3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + }, + { + "title": "Breaking 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9512b4aa0bcf477b8b1ee9de6a50428b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3bc85e0c23dcb07546b098c3964da7.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e619067", + "categoryName": "Car", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/052d4199504f4fcb97b7cc9e07401c54.png", + "list": [ + { + "title": "Car 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ec59ac304495a098c3930ca4cf5f376f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a98205a6a5a837813a0161446baacadb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/43e740a0298fcb564abaebd3ae888f09.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6b72963c235449841157ff07d3110651.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a089153bbbaf1d0ea6b71fe94f02eb18.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6445a57d610fe55393f63409a383e62c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4adf39e09c07a08f9fa2e03108db395e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6ab888f3cd83e13da07fa38ecd586e82.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a2ad7ce685cc1baf74e7425c5ba4eb28.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9f32990305af872e1cd04316ea4dcc92.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0619759e8da1730d7ccaa0431221b072.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e5b05a82fab3e76d3d3a150ea7c524e0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f1696474e6482b97d58b2dc577c8d474.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + }, + { + "title": "Car 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/298d731cc3b0f698088227385549ffa3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18af2d20fca7882d644ac1745a63ea6d.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e619068", + "categoryName": "Door Bell", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/382fcff17bbe80ad45aed28c9d1ae26e.png", + "list": [ + { + "title": "Door Bell 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5bc2eeab953d604d4400ceaad1ac4809.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e926d86a2b234756af495542f020a4e1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/93a1fb12fbfd65419677c380cd1ceac3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9de866aeb7da2605341c3c69a3b1ee46.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8005cab6c5e7c0f64e243fd0960712ba.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e96b5d06eebb2d6001a17293942e4f83.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2a7ded6caaa4d0e601d8066bd5cab926.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0f4ec6a3a7844c3843f5013fd236cb03.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/038780ebadb3249009710b1781b24871.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + }, + { + "title": "Door Bell 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c7e489164f640e750671868b8d5cf177.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f337efcb0e67418bc4f40c67d9914b3d.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e61906a", + "categoryName": "Gun", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/e7500deb0a551a15118c87e5cddd8fe0.png", + "list": [ + { + "title": "Gun 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9ae299c7048214c816051d89b64e73e0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/54d7e3165add3b311cc52e42e2ac358e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/eca3917ea4bb05de3738e6d56992e068.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/10bf11c673df6ad35e2c0091c0274b75.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e41bcaab807dce68e4fdf0c8ad3050bd.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8217ef2b02efcc620a7693609e763272.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3adc00280653c1f3801ca604447e1ac2.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1b70d7932349c66053c18170fc34c483.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6b6a94f60770a0eed81e2a6cceac990e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/fab9360f83cd2adedbccf863eef4c00e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/06eb4dad128dc0b38fd9a894e330d18e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + }, + { + "title": "Gun 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8aa3109b806dd3af5a19e01cd92eedd7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0b502b9482b4983cea9d0016222eb151.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e61906c", + "categoryName": "Laughing & Clapping", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/f5f20f7b929d1895646fa53a11b6e713.png", + "list": [ + { + "title": "Laughing & Clapping 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/25e598b57e0b8b1c3577bc79a1f46d8d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d2660175f92e9d66c5ea2438c998f96b.png" + }, + { + "title": "Laughing & Clapping 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d2d86df37a19d3ba49ee576c9827507e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d2660175f92e9d66c5ea2438c998f96b.png" + }, + { + "title": "Laughing & Clapping 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4b0ad3c4370ef58c65eda79c4ed5da77.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d2660175f92e9d66c5ea2438c998f96b.png" + }, + { + "title": "Laughing & Clapping 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bf5865743949d55a2e60f76e54f406f3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d2660175f92e9d66c5ea2438c998f96b.png" + }, + { + "title": "Laughing & Clapping 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8ef8e563cbf9fd21d2d692f15e5872fa.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d2660175f92e9d66c5ea2438c998f96b.png" + } + ] + }, + { + "categoryId": "625f83491fea07887e61906f", + "categoryName": "Police", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/337c43b1284f89cd5fb01ba72b70bbe0.png", + "list": [ + { + "title": "Police 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/709c8dd0669775acff861c3833f1380f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b14f740e38a3027b0e07809ea3cd9e6a.png" + }, + { + "title": "Police 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2c0bafc776d3513f4cd84e30581673c6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b14f740e38a3027b0e07809ea3cd9e6a.png" + }, + { + "title": "Police 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/949fd589e776f0f497755b36b20725be.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b14f740e38a3027b0e07809ea3cd9e6a.png" + }, + { + "title": "Police 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6c1b0258ee9d8d1a8944fade13d299b9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b14f740e38a3027b0e07809ea3cd9e6a.png" + }, + { + "title": "Police 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/62fd647b38f9085b04388302ec6be903.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b14f740e38a3027b0e07809ea3cd9e6a.png" + }, + { + "title": "Police 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/00758055f21c7c847eb17111fbd4fde1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b14f740e38a3027b0e07809ea3cd9e6a.png" + } + ] + }, + { + "categoryId": "64b617f06d7b94ebbe2a20fa", + "categoryName": "Siren Head", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/66f62ff246444e7f216b3e3145436ba2.png", + "list": [ + { + "title": "Siren Head 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/39ea5814f83dad94fa03813765cd7be2.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/312a7a167f65006ae12a9c0835381a32.png" + }, + { + "title": "Siren Head 30", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/feb2a49dc93e4c615e564658550562a4.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/a4cd82ea68f707cb87681545786fe1fd.png" + }, + { + "title": "Siren Head 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/717fee29f9cb3771f40eb611fa68ddb7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bc39a8d7dc21405b4c9d90bcd4bb763d.png" + }, + { + "title": "Siren Head 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ea514c12f3c2d600acc25764294d0e36.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6336d43fda0f23102ed71ab253efd223.png" + }, + { + "title": "Siren Head 20", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cf4a85cff1bca293fc70ca99413ba3a3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1ea8ed30ad14f35b8c5414248e71168c.png" + }, + { + "title": "Siren Head 21", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/46b35ad55405ec55ab660f45ab342135.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bda071bed3d6a2f27b451a0e23529cb8.png" + }, + { + "title": "Siren Head 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/76142b5831d017ae2a79bf6f21701848.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1e2c6f0f9a02a7f16f101d2641dafdfc.png" + }, + { + "title": "Siren Head 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0d24bfb2863ecd141bf531f8c10f4825.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b16a10b771a10c6de7bbe6fc788ad29e.png" + }, + { + "title": "Siren Head 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7740dcc10a55fd19a9f535117267d167.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c3532129a7e0c7a90ff1d7f5c840a588.png" + }, + { + "title": "Siren Head 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4055968c7925dc385780e5085e87e668.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/11c95a75b76c58e0b7fe948619bf90d5.png" + }, + { + "title": "Siren Head 18", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7a5c47c0a3eee16839d5152cc2534b9a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/641a2ca25cab24bc625bf357ca068cf9.png" + } + ] + }, + { + "categoryId": "62be51874d4edd56b588d54d", + "categoryName": "Hair Dryer", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/0cbc3e7ca3f59e483987ada3bf66092b.png", + "list": [ + { + "title": "Hair Dryer 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/41e6c807cbc7a5121bd85e20c51e2dcf.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2c646ee341779cb9c6cbd333fa32d964.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/877dc85a9dfa2fb89a50d14ff78555c4.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e43c49428ea8d722e3f899fa751db5a4.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0bc4403a27bd81be77ca974858880814.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0bcfafc6a6cee193b81dc776ee8978a5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8fd15fe2cd50c03de4e2e9099b64b605.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2ccabf9031bcfa21d48551e79fc83415.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7fb10282eaf2abd213e5b0748c249c3f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + }, + { + "title": "Hair Dryer 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ab62180a31684ba85e6ae1ba49969105.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d923a0b99a094f3aa46706d7f4a1adcb.png" + } + ] + }, + { + "categoryId": "62be51cc4d4edd56b588d54e", + "categoryName": "Scissors", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/b5d48ccbd106fbd1d7c626f91727fa10.png", + "list": [ + { + "title": "Scissors 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f097fbde71b2d02a5fa7d82c80b2178f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/fb3004acf9a716bc01811fe575fc8fa4.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/010f00d576f839b749ea679de5071304.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1a58702466094a2e8f22c357cd6651b7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/383b87e66571b7d1d61e26559e78c1af.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9b4263d5ad2bae68cb5bec90119b1677.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1720a6fffea45b1e85960c0e2882e533.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/534eff4250e113d0b9c9c160f83e7daa.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/fd206198f0d10bafd81909ffb1948f7b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + }, + { + "title": "Scissors 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2ec031ff389789dad863624fbe0daa84.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ad58f8cfd6ddf45319b2c74c5ec3e338.png" + } + ] + }, + { + "categoryId": "62be51f84d4edd56b588d54f", + "categoryName": "Stun Gun", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/6dbc249836ba3c26eaea8a65246ba007.png", + "list": [ + { + "title": "Stun Gun 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5ea760c046e892a87572f6ff4b574b21.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/217cb15dd95d75de47be5ecc25903bc9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/14e0f7d9d2e90455332dbf1fc48f164b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/efb342b94e6705a542bf81b897884891.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3c445de6e2182f8bd84dc2013e0c92c6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b30e4e8b2f568e68fafe97f020f9cc03.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/36714df03c6662fe87bf66775b79e290.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3c57ac18cda86a1c64497c5bf71a5df9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/86525c1bb7cd3a5c32b8f75d1d246ca1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + }, + { + "title": "Stun Gun 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/71804861ad4c4b9a87cc55233cab13f1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93ca289c09f6940321e6649e36f1b4b8.png" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d802", + "categoryName": "Animal Sound", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/9eab1c832da8af19c8d8a965cb8dd9bb.png", + "list": [ + { + "title": "Animal Sound 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4396f666acdaaef21f5ccbfd881a3220.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/972d923d65fcb1d499d224e791c90965.png" + }, + { + "title": "Animal Sound 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cbbe804094b71741f94cd9f34ca1e3b3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/971fd2b266d2deaecf7999e5c5846adb.png" + }, + { + "title": "Animal Sound 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/995aa4e18e9c777fecbc6ff5aa9f2caf.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0dbd9f5c7825f8878f58011a8e5e2133.png" + }, + { + "title": "Animal Sound 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/76619d0d0eeea55767680c5a9557f747.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7cb7f14b4482d12ee09ff818f4af6bed.png" + }, + { + "title": "Animal Sound 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/72aa14cbcdd13418c388b20be652d03e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/adc4726c063a9025c5b236fefd80ce12.png" + }, + { + "title": "Animal Sound 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2d52f6367b0c76e4ce5b304905ce3b53.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4ea60f5da4fdd3d93315b875a3a0b8f3.png" + }, + { + "title": "Animal Sound 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1afe880865096daa30ac460e38d2dfb6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b00eb30b4074c81b8ee60c5128564f8b.png" + }, + { + "title": "Animal Sound 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/86239f77d6c4d8ccd17a788351251891.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3ef36af4f9497a71e375df758df8244d.png" + }, + { + "title": "Animal Sound 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f4bb28424bb7d75f0137a241db72dbe8.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/8a1b5251e46f583e4415c09cd49d51ea.png" + }, + { + "title": "Animal Sound 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/299eff3a880de444bbc8641a7dd65dbb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/22bbde4a6fc418fc9ef66750d0d5400e.png" + }, + { + "title": "Animal Sound 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/fcc01cdae98a746f30affbf1cd1deb28.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c66663eeadaa8a19b773d7d23718bddf.png" + }, + { + "title": "Animal Sound 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9da6c28275d3df58a24b68285a0e50f6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/8d6fc1569e50244255c50ee867d54086.png" + }, + { + "title": "Animal Sound 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/328f0baaf04f0279ae2747bc1351f07f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/423e1213b1c1c45257ec4b0cb62f654c.png" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d803", + "categoryName": "Business & Office", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/310d539f09087c633febe6bb47dcbe9d.png", + "list": [ + { + "title": "Business & Office 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/15bb74cacee7e2e6774b0486f6f119fd.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4d4295326110cbc8970c2d5b045fdddc.png" + }, + { + "title": "Business & Office 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/804f1003e1a900f0ed58fa855f6b74f5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/17e051287b5c7d6d2871d169f84b0120.png" + }, + { + "title": "Business & Office 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/dac34a1833dbc36e5485c9ad605186f9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f285409f669ec89b073aa32da7c689b5.png" + }, + { + "title": "Business & Office 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/30986c5ed073a225c4f2ecc4e18df94e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d3d198ec14f12000e8000e1e7ca3c2b2.png" + }, + { + "title": "Business & Office 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/89e347a79b3bdc50302fc921702bb656.wav", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ebf9fc1c3f19a38b04e48051190e98b9.png" + }, + { + "title": "Business & Office 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/de4c54a2e4734ce622e6c0650bee4e29.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0e2bdbf65f930c724f177379cf6e1433.png" + }, + { + "title": "Business & Office 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4dad8196b944eb9d7f4aa5ba9fafb1ea.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/02f87fce069b516fabc7cee0b8042380.png" + }, + { + "title": "Business & Office 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b9a2ba10a8c49185f81e9a098b7d8e9e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/a3b2eee907c7e17e2153d0278e844565.png" + }, + { + "title": "Business & Office 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/711b2bf9ef1f12f325a1e4a06b67e71a.wav", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/97d22c85cd7c616d6fa304cc24a2d4d2.png" + }, + { + "title": "Business & Office 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4de94407c7b019b4f28e7e47aeaba821.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7170defe4afbac8f2e3adc1c7786efe7.png" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d804", + "categoryName": "Doors", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/fc4acd4d2f4c93c94c65fa122e4bf945.png", + "list": [ + { + "title": "Doors 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/faea69992fb7827e14d58cbc11b48e5c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0996dfe242956c469972c799d5c29838.png" + }, + { + "title": "Doors 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5dd61ae1dcaf73548d6fa3b46630c94f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7eb41be957ec7d8b0ecd7584221cbd43.png" + }, + { + "title": "Doors 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4256003d4e427cad1a9d6c91e124c70e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9c1013485295e5f6d7e187b8dbf18d72.png" + }, + { + "title": "Doors 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bc1b8cad303726345b57d53875eb3829.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/87732e14f894bffe1e1037cfec2ab1bd.png" + }, + { + "title": "Doors 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/484faca48a560a2735e5f263c269dd85.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d526bec2aba09fcc2ef2ffc3d4be162d.png" + }, + { + "title": "Doors 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/253cd4367452afe514185d206c880da6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1d903b54414d65351897d1d3bc5931d1.png" + }, + { + "title": "Doors 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/467373a534d5828b3cfc40e7e15f4c29.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/97e82065e38da733e3873be883680045.png" + }, + { + "title": "Doors 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/61c804feb9791b324240794466bbecfb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b2748764ffb0b3f6adee8bec72bc23a7.png" + }, + { + "title": "Doors 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4d6021931f2cc965b8f4618518519825.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/870c966054eb8e5c8599c87760edf1a0.png" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d80a", + "categoryName": "Tools", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/b52b8ff860d9faa3f1ebfcce9674146a.png", + "list": [ + { + "title": "Tools 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3d2bb144b89a0f17694976d7c0752fbf.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bf4f23309c1e286ac774bd7ea905fec2.png" + }, + { + "title": "Tools 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c6b83c50a9ffa835f85a33fbd5456378.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/8236f1eb51b7c1664bc12576904c20dd.png" + }, + { + "title": "Tools 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f87a533bd42391c05919cf42217d0881.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d5dc76bec49925af9eddfae717771d21.png" + }, + { + "title": "Tools 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5ca71e456e6fc165ce80670096441054.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/313943eb3bca880b256eb60817bbe794.png" + }, + { + "title": "Tools 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/44d2fa94e973155b6eafc2ebd98a48b5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/31099ab082cf0c33257ba55b6f158d2d.png" + }, + { + "title": "Tools 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d598154f78de11d670556446024fe75c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e8e2c49b654cac07f1b9aa435e94a4fd.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd34", + "categoryName": "Boom", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/5b1491b8aaf758881c67c8c2b558c2dc.png", + "list": [ + { + "title": "Boom 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/289af25a549128d5283adad2beba9bab.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c9f3f6a9ffda61356fe9eaba57bbd4f6.png" + }, + { + "title": "Boom 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bee0244d6a055138352e20fc9e657fd1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f7de1f306d8688582603f28d3f1d2b5b.png" + }, + { + "title": "Boom 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5c5581b9ef71e552db551b817c6face0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/056e4e4bcedc33a049702bf2136ce246.png" + }, + { + "title": "Boom 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9aa4c5eea7cb1df76482151cfec7143b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/500c164ef2359970562876e7be6f3a69.png" + }, + { + "title": "Boom 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/68d1372b68af614f0d8a13088c5f997e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5d5f6d6ef003d5ac9aa219cf5e457f1d.png" + }, + { + "title": "Boom 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5a01d5adf7cda433c436825285c476c3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/2f36ab0b9b3c8d2f3ac825d4cf98ca40.png" + }, + { + "title": "Boom 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/319b39b164ee36a13d42add262409225.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b1e1e983e25f064323fffa945987ee39.png" + }, + { + "title": "Boom 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2ceff4497dd839813c8180e5b1e85daf.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9d3ff691c62a65fddd11b1971001387e.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd35", + "categoryName": "Clocking", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/e3541e200135977e948a25f3fa3cf9ae.png", + "list": [ + { + "title": "Clocking 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0ebcd92a879c0747ca396b7056fc0d77.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0072b82cbe704d382d94163e8a4d7ea5.png" + }, + { + "title": "Clocking 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/62120a53252484f25d5d137f1e414925.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1fe48f5bc261f2bc56bb74960af59fb0.png" + }, + { + "title": "Clocking 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/83d7123a865e59111c8e21c9e84d6f7d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/952339c7f8b628c0076aa67d3a91fe3c.png" + }, + { + "title": "Clocking 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ffeefb8ac458b79227bd16321bf6141d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ed63edf33b1729c9bda6b3d4cbaa6e95.png" + }, + { + "title": "Clocking 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/032d4c70e10ccc9a058784834525abf0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/455bb3313b0fbe49583f8d08342d7be9.png" + }, + { + "title": "Clocking 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b6bd31db371b35e3e0413b7a1bcaa526.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/2679e3065f4b7b1c53706bdbce5db3b7.png" + }, + { + "title": "Clocking 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/072cbbb01d6067011cd5661676c15bec.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3f1ac1219fbaee5a369325654a4236f3.png" + }, + { + "title": "Clocking 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d6364d7a241e6229efd69025f64ef4af.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1222c2c9548466ded15941e3ec870cff.png" + }, + { + "title": "Clocking 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6c3b8867d8dc5ddae8f6f4dfae2e161c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d1b160240044e24c4d70c1e6e9c13a08.png" + }, + { + "title": "Clocking 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/22a5efd130ecc59ae5b572e411383215.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/54708a377b13ca9220c98d67bb2b05b3.png" + }, + { + "title": "Clocking 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5a6bae02f1218a65bce425a394d359bd.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c810ed9b81a8d117e976595a79545a1f.png" + }, + { + "title": "Clocking 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/35267eb03b6c63b878287ea0a58b465d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f0b356181df23e939e48fd0dbfbde77c.png" + }, + { + "title": "Clocking 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/657cf0b4daad0b890dad532224eff264.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/58aa57c5a6a2145ef55a91eed36d94bb.png" + }, + { + "title": "Clocking 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e6ec30d7e2328312cec2f81aa4ee8cfd.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/09af64443514248717d999cd3de025a1.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd36", + "categoryName": "Fun Anime", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/aaeefafde067a8a581e092da1bded504.png", + "list": [ + { + "title": "Fun Anime 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/82e23478a39727b64319ea9a24305c44.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e531963223deb322b6c1cd82ca35e592.png" + }, + { + "title": "Fun Anime 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c6768509557bfa64aabf3a50ebec11a2.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/476fa332cc8aa7d52fdee4e7f09b9efe.png" + }, + { + "title": "Fun Anime 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d53fc0ae81afeac96df388f6a46b596d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/78a92bcb099672e7410382f5ffb96ebb.png" + }, + { + "title": "Fun Anime 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bc839deec4b513f5ff140d6f10399a82.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/eb251b99ea2a75bd894bba66b06eefa7.png" + }, + { + "title": "Fun Anime 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/abb51fb03ffff3df365a52e1a7909a6e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4ad9020fbea3aa257808155ab0126d4b.png" + }, + { + "title": "Fun Anime 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e19805327c2fef5e45d7980907e1bff3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7689e7a20fad1560264d4958ca171bb6.png" + }, + { + "title": "Fun Anime 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9e6efaa721456378dc7f2fd9a4b80431.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/fa29b5549d0dc2922ab022daf74d0618.png" + }, + { + "title": "Fun Anime 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f871f8a0248e4c72ec23eabe1c5a1c26.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1b74cfe553a4100f6a2880face866a9b.png" + }, + { + "title": "Fun Anime 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f39bc98cd9378aae577317073a83a292.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ef6b03b866a7403d1b866e844d2ea0e7.png" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d805", + "categoryName": "Meme sound 1", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/3f20b20d6eb55d2c150bfdaab3146d5b.png", + "list": [ + { + "title": "Meme sound 1 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cb1a3597611e266d9567e407e89c5805.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6b569aafac50aa1065d82218effbdd09.jpg" + }, + { + "title": "Meme sound 1 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/14893595f107aa2400451448d4657dce.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6201f052d753abc2a69ad0c2193b0021.jpg" + }, + { + "title": "Meme sound 1 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6812b5abf6e98ef65f8b9061baf3a0b3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4780f9b372215392caf39459ce3b499f.jpg" + }, + { + "title": "Meme sound 1 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/85eeb4bfb625a5925f4c93a981bbcdec.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9bb5966682457978dd2b13141d1c565b.jpg" + }, + { + "title": "Meme sound 1 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b483172e127951c58db64d47c9446a84.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/881be3402237e08c78e9afd5702ffc0d.jpg" + }, + { + "title": "Meme sound 1 19", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5192333458fb60fe9c5234d2f322f32b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/42b905a9bc320ae65ae0e8129bd793d0.jpg" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d806", + "categoryName": "Meme sound 2", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/4ce8347fa345ab501c9f3af2f10b2f72.png", + "list": [ + { + "title": "Meme sound 2 21", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0dc955a722a13654b1f9f4cd0f19fadc.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4fb6bf4fed2964f6ee424d9e5ad06ade.jpg" + }, + { + "title": "Meme sound 2 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9583852f8b38ff95c31362abd1b971eb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9b1ba9e18d100d573ec8eb4460537dd6.jpg" + }, + { + "title": "Meme sound 2 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4b3c0d029aaf8d89b144dad3282b3919.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c480137f6e71f38cafcdd03440c69901.jpg" + }, + { + "title": "Meme sound 2 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f0dfb8bbdcced07296c6245995cb7a76.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e9aa4066c75f80de11ad4df4f80849d5.jpg" + }, + { + "title": "Meme sound 2 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d3aba7a2f9224139f1b28b72d3afbf61.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4c9ef927a9222babeb120236f86d8703.jpg" + }, + { + "title": "Meme sound 2 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/00f68bdb9de929d4388975d2bb522e52.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/41039b3970942cb52a11ab1b00b1b82b.jpg" + }, + { + "title": "Meme sound 2 19", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2f5d347f0a8938e727d7b67e604810e9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/22645a92d965b54f0635924c7dd7a047.jpg" + }, + { + "title": "Meme sound 2 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/371d5e520c35b9d1d85f1422f3107e06.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/22eeccfd81d0c1250e815d1b7cfaeed0.jpg" + }, + { + "title": "Meme sound 2 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c38d6a583c7e23f8b054851e4b6fa37e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3ec03e51b2a71153a7af4a0e2e947e97.jpg" + }, + { + "title": "Meme sound 2 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cdefab3966d462745c1734a6b4c8d6bc.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/2a5d76c4c4485fbe8148c4d1d366fd74.jpg" + }, + { + "title": "Meme sound 2 18", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/833b37c1be0d7e45e02df03782045bc4.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0e80619eb10ab775ec48616ab695d597.jpg" + }, + { + "title": "Meme sound 2 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9a36ed578c106c63a5554b4d76429f57.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/211df0d52a525b827d6c188eefbf634a.jpg" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d807", + "categoryName": "Meme sound 3", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/991f4d7e0b8ce3ca9ebc5f9e7f5cf68f.png", + "list": [ + { + "title": "Meme sound 3 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4a376e86dfd73ae191757a9ee4e3336f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3f08146406c3ec54a260b36d99b70213.jpg" + }, + { + "title": "Meme sound 3 19", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/adb8153b33811cc86661adfba3b02a36.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/370af28996b90fb6998f0173e8e9d34a.jpg" + }, + { + "title": "Meme sound 3 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/66713b1c3d8306d0ff6b3f553b36c56c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/79d5d5fe3ab51fcbda216fd2b16c3caf.jpg" + }, + { + "title": "Meme sound 3 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/95fc6616ee24aa28012b08a26f22aa8a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bd39e5ae04c6f513d98d7ef7ab5e6fce.jpg" + }, + { + "title": "Meme sound 3 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/921b2c1bbc72295b480c3191f864c56d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b17746bbf7adad92b3903361864464e1.jpg" + }, + { + "title": "Meme sound 3 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/69de8ea564a97aedc05ea3de558e21f1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/060c0d5afba0eb61f48ab6ae3d1cfa94.jpg" + }, + { + "title": "Meme sound 3 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/956727fb2bfebb355f10c8b9076cf36d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/93731efe64afad808776b97c0aacbf5c.jpg" + }, + { + "title": "Meme sound 3 20", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9e63caaf95df5b1f01d6b5648c3824af.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7ebeaf99e3cc7df5442227efc7e1453c.jpg" + }, + { + "title": "Meme sound 3 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4f1e59550b0740b5121509f0ca14c53b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/faa047812fea681a7ca99c41eb26af0c.jpg" + }, + { + "title": "Meme sound 3 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a927e26b9e9b0f0d734249f42a43ca0e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/000a7d3d6afda260f4f60f8dcc9d3819.jpg" + }, + { + "title": "Meme sound 3 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c42f9de360823efa5f282cdaa8dcdfb2.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6a048ae07699d2b920be0ef461e2cb1f.jpg" + }, + { + "title": "Meme sound 3 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/79b6d68b0964b18b1ffd7a18d62f07c6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1a45d50ab697bbbd06d4d5dcee2e676b.jpg" + }, + { + "title": "Meme sound 3 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1d09fa4e130a83895110bacf9936bc08.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7a3c9d99c62804210d83a46c2ef483d9.jpg" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d808", + "categoryName": "Meme sound 4", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/9050e970de5939d5358be1e58cc139d6.png", + "list": [ + { + "title": "Meme sound 4 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5a67630338114fa5e6549add918255d0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1d7113c73fde73c318f3056d10194fac.jpg" + }, + { + "title": "Meme sound 4 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/40922d865af722072a2930634ee3deb4.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/022b3ad8abb7d4f7c9ce7e581f3eae35.jpg" + }, + { + "title": "Meme sound 4 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/97921af860a1b8a4608c93eaf698d7b5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bcfeb56c90258f205bb7c138e39e6686.jpg" + }, + { + "title": "Meme sound 4 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/fce825de32f3e45a25c2723bf77886a9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/25c365d77f0840c49fb062b65bb828c0.jpg" + }, + { + "title": "Meme sound 4 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/062e1014a3ce5f793bdfa6926d366782.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/02da4270d96b090050c6f5d12e7a3b92.jpg" + }, + { + "title": "Meme sound 4 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/39ebde0e167962507a6cc0a1b2b0a43e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f3c1b6225474f24e03b3cbffe09bad9.jpg" + } + ] + }, + { + "categoryId": "636b8e5415831ec42fc7d809", + "categoryName": "Meme sound 5", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/486bcff3b4204d11d27491f6a0396c32.png", + "list": [ + { + "title": "Meme sound 5 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/358ad1d838fce93140d2f734ae8e8c39.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7c0ee4c968cd91b0716854cf4ea40afa.jpg" + }, + { + "title": "Meme sound 5 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/98e9cb08552c2b37a58b87a9a8fd4016.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/eda73b290e6e36066093ade43f51e866.jpg" + }, + { + "title": "Meme sound 5 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b4816c8aaab1d38e4901a0612e93ed85.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/91ef63792e1798257b419417fff9085b.jpg" + }, + { + "title": "Meme sound 5 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/03b755d19aaf70298b0bde80d76697c0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/17de2a9f9d2ba2d00b811a73434fc39d.jpg" + }, + { + "title": "Meme sound 5 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/df1364d0cca16387a2ff6cca6657ac1f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/2248bf4fcf37993cc44cb82424db2657.jpg" + }, + { + "title": "Meme sound 5 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6d80d3382e19a88f7cb2758405aa8ec3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6b739bb2fd94ac6191179aebf9517cf7.jpg" + }, + { + "title": "Meme sound 5 20", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0c1f249ae7e908c19b3465cd81d094e3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/fe89c5bd836852a95636a87730674c4c.jpg" + }, + { + "title": "Meme sound 5 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a0a1302a9935730523c12d818d9f5c2c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/aab3694ae673abd0bb796a3be334ecc2.jpg" + }, + { + "title": "Meme sound 5 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e5c80db1cd021c350edacce011fa07ae.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/865a57b3178bb2d63871d2b969d02acc.jpg" + }, + { + "title": "Meme sound 5 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a37b517544de85a3b46926653c576ddb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f3f17c2449cc493230b4ce544edbed84.jpg" + }, + { + "title": "Meme sound 5 19", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1f1d09dcb6bfb6920f17bd2a0c154ce8.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9b67bf20689f3c9599f722c0683aa62f.jpg" + }, + { + "title": "Meme sound 5 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/4b27861df9e9bfa746fd086699a5bdac.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/69a0969d26e493eff313dda5f7596a2c.jpg" + }, + { + "title": "Meme sound 5 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/48c266caee8713b9ea8ecd5ae907e7ce.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/22462e07cac52085b88908ea0f52df96.jpg" + }, + { + "title": "Meme sound 5 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/68e04987c9d6146193d50924f32155d1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/515eabde6f14f99a3836d1d306ca7da4.jpg" + }, + { + "title": "Meme sound 5 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/28be734d0308fc1daa7b2b48633a005c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1dde0416ca1029f97af69f09b8fea308.jpg" + } + ] + }, + { + "categoryId": "636dc88cf512f266a311768d", + "categoryName": "Meme sound 6", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/e6936b3979a284fc32cfade30c6bf4b7.png", + "list": [ + { + "title": "Meme sound 6 26", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5fb1770c6a9d95453dd4055c08c7aee0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0a7d2e597715db7a9577ac21686c576b.jpg" + }, + { + "title": "Meme sound 6 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0509a6574615013c1b1b5e159762ff7a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/627b28437b4b2580161128213a8ca0c2.jpg" + }, + { + "title": "Meme sound 6 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f2313c970059bd82560b912e3e796cf3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e80f216e9be298a7ac73169403b71ee1.jpg" + }, + { + "title": "Meme sound 6 31", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8d4b16a2bb5c7923b990aad974d366de.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/195afbf628564ea641adb7942bfe3bf6.jpg" + }, + { + "title": "Meme sound 6 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/11bf03ddedc8132b325bacf036587433.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f494ceb2062cd947a3ee9fee5f7a98c8.jpg" + }, + { + "title": "Meme sound 6 21", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/dd972b4b9493dcd5f7670c2ebb8bcdf7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/58d469e7ea485dd84ea9daa1148002ea.jpg" + }, + { + "title": "Meme sound 6 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/675d7aa8adfbbd77a3907014a92a0350.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/486fac53d977b93150890e6a412b8e58.jpg" + }, + { + "title": "Meme sound 6 20", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f11e6556bf48d1d24b8ff040020e6f43.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b9a7ab2203e7a458eb00ae06a5be7090.jpg" + }, + { + "title": "Meme sound 6 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0d44d826d2e1aaa96b6bc8b7efbcfec3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e59535a07a4f3c49864dc7292952a2d0.jpg" + }, + { + "title": "Meme sound 6 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bd99b8121af03eb7ff7c656c1b17bf82.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/08660c22eb77ab2eed9720bf0f62dbab.jpg" + }, + { + "title": "Meme sound 6 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/14a7721964d399fb1ff14046aaa8a05f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/24b920a2609777defbccd5a672dbcb42.jpg" + }, + { + "title": "Meme sound 6 27", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a401d8a439641e01380944f5e9479631.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f313c74f55856f223f46df7081e3599e.jpg" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd47", + "categoryName": "Anime meme", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/e3b711902ebeab5aa59ba28c0d8239e5.png", + "list": [ + { + "title": "Anime meme 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b2f1a1f221a0ffa1986ef5ea109f3bd1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d0cefe5b4b205290c1958e5550f88075.png" + }, + { + "title": "Anime meme 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/065c97cdfa10eca952c862c561477e74.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/dba1d239bc0dda7d1d52d6537ba2b7b7.png" + }, + { + "title": "Anime meme 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ca3fc9fed78a2f4b9c4f1ff4a1b65b1e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3c1dceb38be61d063008b964f12d158d.png" + }, + { + "title": "Anime meme 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a0a4d785b7b1f3f30dc7bad4625e9b19.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e8dbec69a3906d4afcdd2e094a641e38.png" + }, + { + "title": "Anime meme 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/388a0f22fcab6261338b897a67cf18db.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f5cf1d7bce8c0ab1243a94e6004054c9.png" + }, + { + "title": "Anime meme 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/342ac706dd55e3d12fd56cda4f9a7d1a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/95c662aac956e395f1bdcdc0e0bbdf26.png" + }, + { + "title": "Anime meme 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0aeafdd0a4f706c5fb3f36f659ad1601.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d501f4d7bde34fbcaedb06520d876963.png" + }, + { + "title": "Anime meme 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5f057a0ef2f0d38436b17e6c0886e668.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/85c3f3ea2c28848336409c979be0fa64.png" + }, + { + "title": "Anime meme 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b22b46a0e6c64e42daace075aa58159a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/a6bbe5e5dfa3aa803463fe640e1149eb.png" + }, + { + "title": "Anime meme 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2056dbf4ed3fb5e869ff64325a242570.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5e189c0b758d1a3d50c1b181976098ba.png" + }, + { + "title": "Anime meme 18", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/114001c35080918434c4b982555d12f5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/91cc168e4b2769ed530aa937be13378b.png" + }, + { + "title": "Anime meme 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6f90dd5e43fb8d486830a97914d485db.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/65fe1c01b27186bd437633529baf5ee1.png" + }, + { + "title": "Anime meme 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/84defddcf3327f93c63f142e7ab37908.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6caa05b728c8a180cbcf5a1086761d24.png" + }, + { + "title": "Anime meme 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e06141603a431b19d9ae9af19badac64.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/56097d4a5ac7cd104d8c0d396db60c9c.png" + }, + { + "title": "Anime meme 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/181ffe52f8e7525b19196dc0eafbc6c0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/144bf1628d8649f985ff73aa7722b5aa.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd48", + "categoryName": "Baby sound meme", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/93355cc4b4d2108513e764041fd27720.png", + "list": [ + { + "title": "Baby sound meme 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/25394f67ceee104fa2b13d570267f45a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/554bdf27d13f4eca3564f02b841b761e.png" + }, + { + "title": "Baby sound meme 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/33af250f30a986ed24e2b498501d4883.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/30787227f36d39eebc9b378dd71293da.png" + }, + { + "title": "Baby sound meme 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d5601befe1763009a9397315f616a6f6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b927e628c418ef942ac79fa1e3a915a0.png" + }, + { + "title": "Baby sound meme 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8f090358f50150868b8ede696772b5cd.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/eae2a4c827d909ea990ef6cd158e6410.png" + }, + { + "title": "Baby sound meme 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d2e35dd452300450e4fe23453ae46360.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/44b211bd5bc16d7fdf600073a8dc230b.png" + }, + { + "title": "Baby sound meme 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b03bfb5804c059ae4c94e77be89f689d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9d6751d2636b4dba11653cb40ae05a7f.png" + }, + { + "title": "Baby sound meme 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d8649253668666bf2cca47187131e3df.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/29cdb07c669929fe22a32f56c5d5a5f2.png" + }, + { + "title": "Baby sound meme 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/166853db0ac561ffd0c83f3a0cb5e1bb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7e570711d2b6f07eda4d0b172e74aa68.png" + }, + { + "title": "Baby sound meme 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/697b6b673325d605cabdfc4521054f9b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/21f3ea470ef348105b659a9992068384.png" + }, + { + "title": "Baby sound meme 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8a359a498f9e84e684d77e7c2b02408b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/27c27d9a3884d7291eac041785b0fd78.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd49", + "categoryName": "Laughing meme", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/423099070cc5c92aaec95c5d7c090307.png", + "list": [ + { + "title": "Laughing meme 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0c2431340568d80e58aba6a07c41425f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7936b296c7f9c7e76ca6d9e2e8c5af28.png" + }, + { + "title": "Laughing meme 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0a7eaf35fa6aaaf62aa3f128fab8f04f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c227353b580998e4681d094d3dec78c6.png" + }, + { + "title": "Laughing meme 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1c7c99b1a63fb03a4ca4b68329ee814a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bcb252e4c0518a4f65ccc83daea498d1.png" + }, + { + "title": "Laughing meme 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f94aba6f1c0c8d93c2f6b1d928b27e12.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d94b52a7f791c078e2fad9abd0271e0b.png" + }, + { + "title": "Laughing meme 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9d2ea6b802b104c5fe2868c257cbfe31.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b551c5055a4efe19ecf521afeb953c6f.png" + }, + { + "title": "Laughing meme 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/92c8b2e7b99aaf7ee7c0e3f0948cd83b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3f34fb2705784bbd15253d6cc5ed8df0.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd50", + "categoryName": "Video effect", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/f30322429a15f99fafac651af6601a1e.png", + "list": [ + { + "title": "Video effect 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f76c37498bb9fca60563d8b2a67653c6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/be0edab4d77cb56d90db71b7a7d7fec8.png" + }, + { + "title": "Video effect 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f3e9cec93ce50e08a61324017e53474b.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/cb6fb89351ea96dad75fe012977e9a8d.png" + }, + { + "title": "Video effect 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3fbba72e271c7e245f95be440ae89502.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/affec1cd3b1acf3534f2b1dd54b6e11f.png" + }, + { + "title": "Video effect 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/be127a651be21c9d9543551427930e65.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/fb11cf86c9b4317187b2f8d20e813a52.png" + }, + { + "title": "Video effect 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/242ebe659af90fbb24b35a3de82c86d6.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ae2cfb2a5f2c291e5adc3ec1a6b86fd3.png" + }, + { + "title": "Video effect 16", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7e22a15803c6c18ba1020fb7a12c2ac9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/176f813f19d83391cc3a94714b3c33e3.png" + }, + { + "title": "Video effect 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bc09237302c352a08446a7cb194d076d.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f033ac2536cf4a0a341e2c00029afec6.png" + }, + { + "title": "Video effect 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/65003244adcad85bc4f866435208d856.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/55dfa8097e3554f3ff921d4bae1c6360.png" + }, + { + "title": "Video effect 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cbdc15cf69a945d0598dd8ac78325c5f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5f490886e570a860b89dfd7e26e4b7bc.png" + }, + { + "title": "Video effect 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/789cdce4f59c71ef84c32cac4896f00e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/82295cecfe039e891067bba2b9012fe3.png" + }, + { + "title": "Video effect 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cb8152a74bb4571725157bf40c8be677.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/776aace8ed0f04dd9957a6f3edd83925.png" + }, + { + "title": "Video effect 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a5f431d51547344c66ccdae1eebad93f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e5bb75fff945bac8b3c4070b831fb8bd.png" + }, + { + "title": "Video effect 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/382871ca218f1384a012850e610bd0f5.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d982297cd7148a9a8201a7e5db52e2dd.png" + }, + { + "title": "Video effect 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/380b993ecadff751c64a0fb622de439a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d3f15a89bfcfa46acdad754ca8b2d736.png" + }, + { + "title": "Video effect 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b1ce43dedf92ecf79663f064198d05c8.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e4efb19584a4c6df9292df3d171d96ed.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd40", + "categoryName": "Church Bell", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/2b0b47180f68099bd4e3f20f2738a553.png", + "list": [ + { + "title": "Church Bell 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/43663417104a737de0ad75058b3d7dd7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/00d1bf22be137338977a68288c1e39e3.png" + }, + { + "title": "Church Bell 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/362939d0d5d7139a5c64b1cf6c52016a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/cb702949346a19dbc4af662a21cd9dc5.png" + }, + { + "title": "Church Bell 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/849a9ab93006b3a6fbd462a38deca497.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bf37e5bb7c3c17e6814082204cbe49a2.png" + }, + { + "title": "Church Bell 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8be3c1a2dbd6ba2b8baa1ea3cdf48590.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6b2aa96e01e20f0fbfd9d3ad4b1d48da.png" + }, + { + "title": "Church Bell 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9905c68f7a6fac7d90d5075d12462f59.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f16b1bcf9bb12fc1773d7574d6e19198.png" + }, + { + "title": "Church Bell 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/21dff1513a841b9761bc972e4bdd45af.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/631574c422eae411794dfc0963fdb7d5.png" + }, + { + "title": "Church Bell 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6cfb5ecbb898054a1964aedb6894d926.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1ff22218aebe79a5294a8e86215062f7.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd44", + "categoryName": "Santa Claus", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/7c198c1a650d403d78f82665c68b6c10.png", + "list": [ + { + "title": "Santa Claus 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b2515f57a6e182491b361070b7d3b42f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f71619e0ecc447bca17360489536de86.png" + }, + { + "title": "Santa Claus 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/135a1932ccb6f7379fcb7cd6c7dffa21.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/710d6339285349d25493ded05b76d12c.png" + }, + { + "title": "Santa Claus 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/089d559947b2d8d7f79d6a462718438f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/7de8c9070ec88ea72aca544da1486627.png" + }, + { + "title": "Santa Claus 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/570176aa8386fc19c9c243328a84c6c7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/08f5c7bcba2efbb40cc091b8edcb34bf.png" + }, + { + "title": "Santa Claus 13", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/517437e69a1093e1ff1506a992080eef.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6caa8e7faed1fd1d2c6bbe4ffcf853e2.png" + }, + { + "title": "Santa Claus 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/0749b4d8f6a096363212509145aa1365.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/13013f0ad0780f8651127ffca1a79782.png" + }, + { + "title": "Santa Claus 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8c4b28e516d7fb8fef5284736f30a27c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/50b68f3447c91199dab40da541b12f65.png" + }, + { + "title": "Santa Claus 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a077b2859ade85edbeb83d73338f9c95.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/4aade06620b4a99f7d4d22acbff83a22.png" + }, + { + "title": "Santa Claus 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a5ac14d6e05101031dc318c8a6510eef.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c941a30c44283cdd239713c7c7819acd.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd45", + "categoryName": "Sleigh bell", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/d88b456a3b22b9c1c568607f8446f92d.png", + "list": [ + { + "title": "Sleigh bell 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/87ed63890b10af8775a76076e7b19d9c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/a296dde79632a1dc8bad83a2e6aca98d.png" + }, + { + "title": "Sleigh bell 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/85286cfb5ca935b92d4d2f6f680b75ca.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c3eb47e98691046d9dc6db9934dac8a6.png" + }, + { + "title": "Sleigh bell 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/cb8988e737058bdb81bc353ccbba9f47.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/44aba68f3f5a036addb2708702321cc2.png" + }, + { + "title": "Sleigh bell 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e40d7d4c5f3891aba402689eeab08445.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/507c32b9188a8909fa910fcad9133089.png" + }, + { + "title": "Sleigh bell 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c257e4f7dcb608cf75849eaf247554a0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1728c24ae7e0604a605c620f95870811.png" + }, + { + "title": "Sleigh bell 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/7894de3f5eccca96cda8b9255f6f1284.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f78569ffd9ec0812a33103abbe0ec93c.png" + }, + { + "title": "Sleigh bell 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a84b0cde9abf9afd7e597cf1986d76f9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/a119c0a9c5269ae468070c899f242174.png" + }, + { + "title": "Sleigh bell 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e7a8528fb0de921f38904173ce0d1d61.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/b3ff51059a4eafc54b2e761e0aa077a9.png" + }, + { + "title": "Sleigh bell 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/6dfaf2616c187903846f11dedc4cf722.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/05fcf016f07f7705aa43bc8b7d0196ae.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd46", + "categoryName": "Snowball", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/4357eecea1bf97ef0c4a6d102e514c69.png", + "list": [ + { + "title": "Snowball 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/88260c0a5d921f3b600d9dbb7e5d6624.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/19adc05bfcc6675fda6f9208eced3554.png" + }, + { + "title": "Snowball 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/163b7f2180088a2255cb6663a4be4cd0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bf230f005639a1a5cb33b4afaf50dda4.png" + }, + { + "title": "Snowball 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/aa943a901c024b3648a9adaaf253266f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/1fea260fa35939869c5063ec19e3915e.png" + }, + { + "title": "Snowball 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1895f3daf04e0febc26ff38e65c14aa7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/540ec445b80f705e46b9b02a12f9a801.png" + }, + { + "title": "Snowball 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/238fdb50ee43a3dc3c7ac95c5087430c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/91d6ecd77e0ea8f9c8c335c2c277684f.png" + }, + { + "title": "Snowball 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/50be9d65066fabbdf40ebe4d5844cfd9.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/48cc4f70fe792066a67ccbd22dbfe720.png" + }, + { + "title": "Snowball 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c154c0b0157a69a6e7913ba864af8ab8.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e87f1a6070d8e742f9c2a963404c1981.png" + }, + { + "title": "Snowball 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d5c047482bce95371040035fe99dccca.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c45b18100dc839e39e71dd2a6682b4f4.png" + }, + { + "title": "Snowball 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/257ea03978ff0d42528d4cb90b53467e.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/2c0b15565a008434a5447e09a47d2567.png" + }, + { + "title": "Snowball 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/16888d40f4c780d5a73da80101b3a79a.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c4df7d18244ab87a5f13d2db77f07785.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd41", + "categoryName": "Countdown", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/642d3042f0e7ae829988ee296750471a.png", + "list": [ + { + "title": "Countdown 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f32b6e6ee555ad5c6d29de13aa8062e1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/66609a323dbb9b10968349ff4991d14e.png" + }, + { + "title": "Countdown 15", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/a30c962da761aeca851a464cc9303ef1.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/258a9bc9932fa59771faec37ace6a33f.png" + }, + { + "title": "Countdown 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/74307f33d3a9132eab490aa5fe245b58.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/18169f46046cb22f46df892f1b477833.png" + }, + { + "title": "Countdown 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e37a733ed877f58b5eecf80a9215aadb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/d6e289cbfa828447f45c10a3740c3b41.png" + }, + { + "title": "Countdown 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/be45cfdcfeb775190645512f8b70cd91.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ec33ecf4b90fffedabeeb14ab677f3cf.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd42", + "categoryName": "Cuckoo Clock", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/775a7b80f8844b2a2e5a90f2602fd38d.png", + "list": [ + { + "title": "Cuckoo Clock 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/d595ccd6c056e78b1eaee3b9019c890f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5c1e5ee795a2ee958e09447ecf6b8c6e.png" + }, + { + "title": "Cuckoo Clock 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2d72953021e40478613543328c3648c3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/a4997b34c82a13cf22489b7aaa0933ce.png" + }, + { + "title": "Cuckoo Clock 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f741ff8869dd5e7ec39e5ad0b49c4ef7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f9793aa7a75f9f434b4259ef5a4712f0.png" + }, + { + "title": "Cuckoo Clock 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/99fd437069f69508827b2dd41ba8dec0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/fa25c9faa262645d4d850a10470a0afa.png" + }, + { + "title": "Cuckoo Clock 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1909035da699032a078fc26c6b67a9c3.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e9cfc34fc92a17f31972ee70f21d995b.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd43", + "categoryName": "Fireworks", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/f01dfac6dd9c7745ab80f274edaf7d34.png", + "list": [ + { + "title": "Fireworks 8", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e18a5052b273aad4a24baebacdb286e0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/f698e862d47dac00773f66006c925b9f.png" + }, + { + "title": "Fireworks 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/1e42b4d2061e93f0afda40089fa5fdca.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3702ce81c81d4a7c3c7add0b32bae7f2.png" + }, + { + "title": "Fireworks 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5a224b247ea78a0834dff359203f6802.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6ff3515f2df9c687c14ee550a88aaacc.png" + }, + { + "title": "Fireworks 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9fec8e8f803ccc8ae2d142d759ac6968.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/bb64c6f4b11f53feafe12503da099c04.png" + }, + { + "title": "Fireworks 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/24b2a5b37cb8136b59880f627498c848.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/8959fe87989b632fc85b8d1670a54814.png" + }, + { + "title": "Fireworks 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/071ae6eacc2497bfdb87e6960255e618.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e63ac1c1ff794746fbc8c4078be1c910.png" + } + ] + }, + { + "categoryId": "636dc40571a30811c821fd39", + "categoryName": "Champagne", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/23948c0777b58ea43ae231c3adb830c6.png", + "list": [ + { + "title": "Champagne 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/baad4340a6c42843d12556996100f05c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/fe2daef6052258c1b95d45aa649235d9.png" + }, + { + "title": "Champagne 4", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c26a6128efc5c4187fbd81e1acf0ab08.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/ae7b094815cd0b714a97c56e0e5c4dad.png" + }, + { + "title": "Champagne 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/3866cb7d6614d2139e78a19b234d7b14.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/8597fa7bce4191a8c3282b67632cae44.png" + }, + { + "title": "Champagne 9", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/02cfaa37687cd6d759aed04a03028742.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/9d8514f45a8e8ca845fbb16704cfb436.png" + }, + { + "title": "Champagne 5", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/5657320f06928bc20961043becc95e18.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/3c59aebc7c52aa99d8814411c8c7cc68.png" + }, + { + "title": "Champagne 1", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/e1cbcd284222ce6099da03810cc1c6b0.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/0cab054498349416ba07520ddb5d6ca8.png" + }, + { + "title": "Champagne 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/ff80172109053f601b406d552178c3ff.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/e689358c959b4cd68310070d0bfc5ec5.png" + }, + { + "title": "Champagne 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bbd5249f29ac098a21617918683c03cf.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/65a46b2626b4f28244ac3c654c89abb7.png" + } + ] + }, + { + "categoryId": "634e0d283a35295ff1e9d782", + "categoryName": "Halloween", + "categoryUrl": "https://resource-sg-public.lux-ad.com/prank/346541dfd63bb11359fecb4913bbbf13.png", + "list": [ + { + "title": "Halloween 19", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/f3dfe8797d1a13a88f9544d3fdc54425.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/300e9423f50ff7b81b7de33d847733d6.png" + }, + { + "title": "Halloween 7", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/2adbaf76aad03b5b59e338e7c547e65c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/df60f70ad97c86c77c828605dc106555.png" + }, + { + "title": "Halloween 12", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/00b800fbf34a148d2906aa01306e632f.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/02abab22836fea046ee1b121843aa1c4.png" + }, + { + "title": "Halloween 18", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/9b80fc87cab236dccfdeaabe4770eb50.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/92ab558d70e01ff40d3b12ff27acc6b1.png" + }, + { + "title": "Halloween 10", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/99a1127659c975822d7f0eff052c54b8.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/2b96582702253e5d88230621d9806ffd.png" + }, + { + "title": "Halloween 6", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/bcbc8fbaf653b3f8388ff25211015a18.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/5ac0c7f0469c99417fd12ae7e3fa07af.png" + }, + { + "title": "Halloween 3", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/54f1373123ee2d3c6eafcfd0ee1534fb.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/6a500627588ec7c8133cd2e8737a29ef.png" + }, + { + "title": "Halloween 14", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/c0545680e4d81d2040f8ab5be1036221.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/c4d236b50c018013b856d0d6f813f431.png" + }, + { + "title": "Halloween 11", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/b1f2bd4a4bab0c825367680b8f14580c.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/22eea4ddc2396a8459f8a82cc2fa41a7.png" + }, + { + "title": "Halloween 2", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/8dd4ab99f8fa228c05ddd8c36a1fb8ed.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/10de3be681254f26de6351c2ed683ea9.png" + }, + { + "title": "Halloween 17", + "mp3Url": "https://resource-sg-public.lux-ad.com/prank/09f13252d1db5a6b5294527c275fc9a7.mp3", + "preUrl": "https://resource-sg-public.lux-ad.com/prank/32d4680f4d064475e6ca4424829d9fd6.png" + } + ] + } +] \ No newline at end of file diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..1dc6cf7 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..6649374 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '15.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..db34658 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,62 @@ +PODS: + - audio_session (0.0.1): + - Flutter + - audioplayers_darwin (0.0.1): + - Flutter + - FlutterMacOS + - Flutter (1.0.0) + - just_audio (0.0.1): + - Flutter + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - share_plus (0.0.1): + - Flutter + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - audio_session (from `.symlinks/plugins/audio_session/ios`) + - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/darwin`) + - Flutter (from `Flutter`) + - just_audio (from `.symlinks/plugins/just_audio/darwin`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - share_plus (from `.symlinks/plugins/share_plus/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +EXTERNAL SOURCES: + audio_session: + :path: ".symlinks/plugins/audio_session/ios" + audioplayers_darwin: + :path: ".symlinks/plugins/audioplayers_darwin/darwin" + Flutter: + :path: Flutter + just_audio: + :path: ".symlinks/plugins/just_audio/darwin" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + share_plus: + :path: ".symlinks/plugins/share_plus/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0 + audioplayers_darwin: 4f9ca89d92d3d21cec7ec580e78ca888e5fb68bd + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 + share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + +PODFILE CHECKSUM: 53a6aebc29ccee84c41f92f409fc20cd4ca011f1 + +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..73c4896 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,764 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 9C1453E2FE4ACA9A52EEF028 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41BA2C1E8AFEC9791A68235C /* Pods_Runner.framework */; }; + D8D5AA612F0E4D83008C096F /* applogo.png in Resources */ = {isa = PBXBuildFile; fileRef = D8D5AA602F0E4D83008C096F /* applogo.png */; }; + F31C7348ED3F1E73BC5B93AE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF72E1DF8A7250E125088C47 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 090EFFE34D0C0A5EC01FF243 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 23BDB0A988E7E97A42948F2F /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 343DDB58C7D91199B90840B0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3FA61B4615C234D4CA9D6641 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 41BA2C1E8AFEC9791A68235C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AF72E1DF8A7250E125088C47 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CC23C1990D1A859C7AF6A5B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CE49155BE20A0E3AC9AC9ED4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + D8D5AA602F0E4D83008C096F /* applogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = applogo.png; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9C1453E2FE4ACA9A52EEF028 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C7317B177EB2ED3695AF0133 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F31C7348ED3F1E73BC5B93AE /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BD56A57C93653E9ED91919B /* Pods */ = { + isa = PBXGroup; + children = ( + CC23C1990D1A859C7AF6A5B5 /* Pods-Runner.debug.xcconfig */, + 343DDB58C7D91199B90840B0 /* Pods-Runner.release.xcconfig */, + CE49155BE20A0E3AC9AC9ED4 /* Pods-Runner.profile.xcconfig */, + 090EFFE34D0C0A5EC01FF243 /* Pods-RunnerTests.debug.xcconfig */, + 23BDB0A988E7E97A42948F2F /* Pods-RunnerTests.release.xcconfig */, + 3FA61B4615C234D4CA9D6641 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 8E33BA5B3E401A76F1427494 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 41BA2C1E8AFEC9791A68235C /* Pods_Runner.framework */, + AF72E1DF8A7250E125088C47 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 2BD56A57C93653E9ED91919B /* Pods */, + 8E33BA5B3E401A76F1427494 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + D8D5AA602F0E4D83008C096F /* applogo.png */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + A06B9D1D31D5ED4911597194 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + C7317B177EB2ED3695AF0133 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 0530B4CEB04275AA59BFF4FA /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 6D435E7F1245B588B5D9211E /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + preferredProjectObjectVersion = 77; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + D8D5AA612F0E4D83008C096F /* applogo.png in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0530B4CEB04275AA59BFF4FA /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 6D435E7F1245B588B5D9211E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + A06B9D1D31D5ED4911597194 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 7223AXXDS7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickcoloring.quickcoloring; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = devvzl; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 090EFFE34D0C0A5EC01FF243 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.prankSoundboard.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 23BDB0A988E7E97A42948F2F /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.prankSoundboard.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3FA61B4615C234D4CA9D6641 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.prankSoundboard.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 7223AXXDS7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickcoloring.quickcoloring; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = devvzl; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 7223AXXDS7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickcoloring.quickcoloring; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = devvzl; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..c68df94 --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,120 @@ +{ + "images": [ + { + "size": "20x20", + "idiom": "universal", + "filename": "icon-20@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "20x20", + "idiom": "universal", + "filename": "icon-20@3x.png", + "scale": "3x", + "platform": "ios" + }, + { + "size": "29x29", + "idiom": "universal", + "filename": "icon-29@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "29x29", + "idiom": "universal", + "filename": "icon-29@3x.png", + "scale": "3x", + "platform": "ios" + }, + { + "size": "38x38", + "idiom": "universal", + "filename": "icon-38@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "38x38", + "idiom": "universal", + "filename": "icon-38@3x.png", + "scale": "3x", + "platform": "ios" + }, + { + "size": "40x40", + "idiom": "universal", + "filename": "icon-40@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "40x40", + "idiom": "universal", + "filename": "icon-40@3x.png", + "scale": "3x", + "platform": "ios" + }, + { + "size": "60x60", + "idiom": "universal", + "filename": "icon-60@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "60x60", + "idiom": "universal", + "filename": "icon-60@3x.png", + "scale": "3x", + "platform": "ios" + }, + { + "size": "64x64", + "idiom": "universal", + "filename": "icon-64@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "64x64", + "idiom": "universal", + "filename": "icon-64@3x.png", + "scale": "3x", + "platform": "ios" + }, + { + "size": "68x68", + "idiom": "universal", + "filename": "icon-68@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "76x76", + "idiom": "universal", + "filename": "icon-76@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "83.5x83.5", + "idiom": "universal", + "filename": "icon-83.5@2x.png", + "scale": "2x", + "platform": "ios" + }, + { + "size": "1024x1024", + "idiom": "universal", + "filename": "icon-1024.png", + "scale": "1x", + "platform": "ios" + } + ], + "info": { + "version": 1, + "author": "icon.wuruihong.com" + } +} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000..3dff973 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png new file mode 100644 index 0000000..8de4ac9 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png new file mode 100644 index 0000000..2e373c1 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000..20054ab Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 0000000..4e82c2d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png new file mode 100644 index 0000000..f90f090 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png new file mode 100644 index 0000000..156b3c4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 0000000..7a99234 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png new file mode 100644 index 0000000..ab73b45 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000..ab73b45 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png new file mode 100644 index 0000000..f06efc0 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png new file mode 100644 index 0000000..b997879 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png new file mode 100644 index 0000000..9fe2356 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png new file mode 100644 index 0000000..ae436bb Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 0000000..47555bd Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png new file mode 100644 index 0000000..88a15a3 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..3334d39 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,52 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Prank Soundboard + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + prank_soundboard + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner/applogo.png b/ios/Runner/applogo.png new file mode 100644 index 0000000..88a15a3 Binary files /dev/null and b/ios/Runner/applogo.png differ diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart new file mode 100644 index 0000000..1fdaea8 --- /dev/null +++ b/lib/generated/assets.dart @@ -0,0 +1,8 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String assetsData = 'assets/data.json'; + static const String prankSoundboardAssetsData = 'assets/data.json'; + +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..3e56a72 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'managers/sound_manager.dart'; +import 'widgets/main_screen.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: Brightness.dark, + systemNavigationBarColor: Colors.transparent, + systemNavigationBarIconBrightness: Brightness.dark, + )); + runApp(const MyApp()); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + void initState() { + super.initState(); + SoundManager().init(); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Prank Sounds', + debugShowCheckedModeBanner: false, + theme: ThemeData( + useMaterial3: true, + fontFamily: 'Roboto', + colorScheme: ColorScheme.fromSeed( + seedColor: const Color(0xFF6C63FF), + brightness: Brightness.light, + surface: const Color(0xFFF4F6FD), + primary: const Color(0xFF6C63FF), + secondary: const Color(0xFF30B0C7), + ), + scaffoldBackgroundColor: const Color(0xFFF4F6FD), + appBarTheme: const AppBarTheme( + backgroundColor: Colors.transparent, + elevation: 0, + scrolledUnderElevation: 0, + centerTitle: false, + titleTextStyle: TextStyle( + color: Color(0xFF1D1D35), + fontSize: 24, + fontWeight: FontWeight.w900, + letterSpacing: -0.5, + ), + iconTheme: IconThemeData(color: Color(0xFF1D1D35)), + ), + ), + home: const MainScreen(), + ); + } +} diff --git a/lib/managers/data_manager.dart b/lib/managers/data_manager.dart new file mode 100644 index 0000000..0ce96f6 --- /dev/null +++ b/lib/managers/data_manager.dart @@ -0,0 +1,98 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../models/prank_sound.dart'; +import '../models/prank_category.dart'; + +class DataManager { + static final DataManager _instance = DataManager._internal(); + factory DataManager() => _instance; + DataManager._internal(); + + List categories = []; + bool isLoading = true; + + final ValueNotifier> favoritesNotifier = ValueNotifier([]); + + Future loadData() async { + if (categories.isNotEmpty) return; + + try { + try { + final String jsonString = await rootBundle.loadString('assets/data.json'); + final List jsonList = json.decode(jsonString); + categories = jsonList.asMap().entries.map((entry) { + return PrankCategory.fromJson(entry.value, entry.key); + }).toList(); + } catch (e) { + debugPrint("Assets not found, using dummy data."); + categories = _generateDummyData(); + } + + await _loadFavoritesFromPrefs(); + + } catch (e) { + categories = _generateDummyData(); + } finally { + isLoading = false; + } + } + + Future _loadFavoritesFromPrefs() async { + final prefs = await SharedPreferences.getInstance(); + final List favTitles = prefs.getStringList('fav_titles') ?? []; + + List tempFavs = []; + for (var cat in categories) { + for (var sound in cat.list) { + if (favTitles.contains(sound.title)) { + sound.isFavorite = true; + tempFavs.add(sound); + } + } + } + favoritesNotifier.value = List.from(tempFavs); + } + + Future toggleFavorite(PrankSound sound) async { + sound.isFavorite = !sound.isFavorite; + + final currentList = List.from(favoritesNotifier.value); + if (sound.isFavorite) { + if (!currentList.contains(sound)) currentList.add(sound); + } else { + currentList.remove(sound); + } + favoritesNotifier.value = currentList; + + final prefs = await SharedPreferences.getInstance(); + final List favTitles = currentList.map((e) => e.title).toList(); + await prefs.setStringList('fav_titles', favTitles); + } + + List _generateDummyData() { + const String sampleAudio = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"; + + return List.generate(6, (index) { + return PrankCategory( + categoryId: '$index', + categoryName: ['Air Horn', 'Fart', 'Hair Clipper', 'Sneeze', 'Gun', 'Scream'][index], + categoryUrl: 'https://via.placeholder.com/150', + themeColor: [ + const Color(0xFF6C63FF), + const Color(0xFFFF6584), + const Color(0xFF32D74B), + const Color(0xFFFF9F0A), + const Color(0xFF30B0C7), + const Color(0xFFFF453A) + ][index], + list: List.generate(5, (i) => PrankSound( + title: 'Effect ${index + 1}-${i + 1}', + mp3Url: sampleAudio, + preUrl: '' + )), + ); + }); + } +} diff --git a/lib/managers/sound_manager.dart b/lib/managers/sound_manager.dart new file mode 100644 index 0000000..b0043cd --- /dev/null +++ b/lib/managers/sound_manager.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:audioplayers/audioplayers.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../models/prank_sound.dart'; + +class SoundManager { + static final SoundManager _instance = SoundManager._internal(); + factory SoundManager() => _instance; + SoundManager._internal(); + + final AudioPlayer audioPlayer = AudioPlayer(); + + // 播放状态 Notifiers + final ValueNotifier currentSoundNotifier = ValueNotifier(null); + final ValueNotifier isPlayingNotifier = ValueNotifier(false); + final ValueNotifier positionNotifier = ValueNotifier(Duration.zero); + final ValueNotifier durationNotifier = ValueNotifier(Duration.zero); + + // 设置状态 Notifiers (支持 UI 监听) + final ValueNotifier volumeNotifier = ValueNotifier(1.0); // 默认 100% + final ValueNotifier loopNotifier = ValueNotifier(false); // 默认不循环 + + static const String KEY_VOLUME = 'app_volume'; + static const String KEY_LOOP = 'app_loop'; + + Future init() async { + // 监听播放器事件 + audioPlayer.onPlayerStateChanged.listen((state) { + isPlayingNotifier.value = state == PlayerState.playing; + }); + + audioPlayer.onDurationChanged.listen((d) { + durationNotifier.value = d; + }); + + audioPlayer.onPositionChanged.listen((p) { + positionNotifier.value = p; + }); + + audioPlayer.onPlayerComplete.listen((_) { + // 只有在非循环模式下,播放结束才停止 + if (!loopNotifier.value) { + isPlayingNotifier.value = false; + positionNotifier.value = Duration.zero; + } + }); + + // 加载本地设置 + final prefs = await SharedPreferences.getInstance(); + final double savedVolume = prefs.getDouble(KEY_VOLUME) ?? 1.0; + final bool savedLoop = prefs.getBool(KEY_LOOP) ?? false; + + // 更新内存状态 + volumeNotifier.value = savedVolume; + loopNotifier.value = savedLoop; + + // 应用到播放器 + await audioPlayer.setVolume(savedVolume); + await audioPlayer.setReleaseMode(savedLoop ? ReleaseMode.loop : ReleaseMode.stop); + } + + // 设置音量并保存 + Future setVolume(double volume) async { + volumeNotifier.value = volume; + await audioPlayer.setVolume(volume); + final prefs = await SharedPreferences.getInstance(); + await prefs.setDouble(KEY_VOLUME, volume); + } + + // 设置循环并保存 + Future setLooping(bool loop) async { + loopNotifier.value = loop; + await audioPlayer.setReleaseMode(loop ? ReleaseMode.loop : ReleaseMode.stop); + final prefs = await SharedPreferences.getInstance(); + await prefs.setBool(KEY_LOOP, loop); + } + + Future play(PrankSound sound) async { + try { + if (currentSoundNotifier.value == sound) { + if (isPlayingNotifier.value) { + await audioPlayer.pause(); + } else { + await audioPlayer.resume(); + } + } else { + await audioPlayer.stop(); + currentSoundNotifier.value = sound; + + // 播放前确保应用了当前的设置 + await audioPlayer.setVolume(volumeNotifier.value); + await audioPlayer.setReleaseMode(loopNotifier.value ? ReleaseMode.loop : ReleaseMode.stop); + + if (sound.mp3Url.isNotEmpty) { + await audioPlayer.play(UrlSource(sound.mp3Url)); + } + } + } catch (e) { + debugPrint("Play Error: $e"); + } + } + + Future stop() async { + await audioPlayer.stop(); + currentSoundNotifier.value = null; + isPlayingNotifier.value = false; + positionNotifier.value = Duration.zero; + } +} diff --git a/lib/models/prank_category.dart b/lib/models/prank_category.dart new file mode 100644 index 0000000..ad3f7d0 --- /dev/null +++ b/lib/models/prank_category.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'prank_sound.dart'; + +class PrankCategory { + final String categoryId; + final String categoryName; + final String categoryUrl; + final List list; + final Color themeColor; + + PrankCategory({ + required this.categoryId, + required this.categoryName, + required this.categoryUrl, + required this.list, + this.themeColor = const Color(0xFF6C63FF), + }); + + factory PrankCategory.fromJson(Map json, int index) { + final List colors = [ + const Color(0xFF6C63FF), // Purple + const Color(0xFFFF6584), // Pink + const Color(0xFF32D74B), // Green + const Color(0xFFFF9F0A), // Orange + const Color(0xFF30B0C7), // Teal + const Color(0xFFFF453A), // Red + ]; + + var listData = json['list'] as List? ?? []; + List soundList = listData.map((i) => PrankSound.fromJson(i)).toList(); + + return PrankCategory( + categoryId: json['categoryId'] ?? '', + categoryName: json['categoryName'] ?? 'Category', + categoryUrl: json['categoryUrl'] ?? '', + list: soundList, + themeColor: colors[index % colors.length], + ); + } +} diff --git a/lib/models/prank_sound.dart b/lib/models/prank_sound.dart new file mode 100644 index 0000000..f60e7c5 --- /dev/null +++ b/lib/models/prank_sound.dart @@ -0,0 +1,21 @@ +class PrankSound { + final String title; + final String mp3Url; + final String preUrl; + bool isFavorite; + + PrankSound({ + required this.title, + required this.mp3Url, + required this.preUrl, + this.isFavorite = false, + }); + + factory PrankSound.fromJson(Map json) { + return PrankSound( + title: json['title'] ?? 'Sound Effect', + mp3Url: json['mp3Url'] ?? '', + preUrl: json['preUrl'] ?? '', + ); + } +} diff --git a/lib/pages/category_detail_page.dart b/lib/pages/category_detail_page.dart new file mode 100644 index 0000000..9df521f --- /dev/null +++ b/lib/pages/category_detail_page.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import '../models/prank_category.dart'; +import '../models/prank_sound.dart'; +import '../managers/data_manager.dart'; +import '../managers/sound_manager.dart'; +import '../widgets/big_player_panel.dart'; + +class CategoryDetailPage extends StatefulWidget { + final PrankCategory category; + + const CategoryDetailPage({super.key, required this.category}); + + @override + State createState() => _CategoryDetailPageState(); +} + +class _CategoryDetailPageState extends State { + + @override + void dispose() { + SoundManager().stop(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + alignment: Alignment.bottomCenter, + children: [ + CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + SliverAppBar( + expandedHeight: 200, + pinned: true, + backgroundColor: widget.category.themeColor, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new, color: Colors.white), + onPressed: () => Navigator.pop(context), + ), + flexibleSpace: FlexibleSpaceBar( + title: Text(widget.category.categoryName), + background: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + widget.category.themeColor, + widget.category.themeColor.withOpacity(0.7), + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: Stack( + children: [ + Positioned( + right: -30, + bottom: -30, + child: Icon(Icons.music_note, size: 200, color: Colors.white.withOpacity(0.15)), + ), + Center( + child: Icon(Icons.play_circle_fill, size: 60, color: Colors.white.withOpacity(0.3)), + ) + ], + ), + ), + ), + ), + SliverPadding( + padding: const EdgeInsets.fromLTRB(0, 20, 0, 250), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final sound = widget.category.list[index]; + return _buildSoundTile(context, sound); + }, + childCount: widget.category.list.length, + ), + ), + ), + ], + ), + // 详情页覆盖整个屏幕,不需要避让 BottomBar,所以使用默认的 30 偏移 + BigPlayerPanel( + themeColor: widget.category.themeColor, + bottomOffset: 30, + ), + ], + ), + ); + } + + Widget _buildSoundTile(BuildContext context, PrankSound sound) { + final manager = SoundManager(); + return ValueListenableBuilder>( + valueListenable: DataManager().favoritesNotifier, + builder: (context, favorites, _) { + final isFav = sound.isFavorite; + + return ValueListenableBuilder( + valueListenable: manager.currentSoundNotifier, + builder: (context, currentSound, _) { + final bool isActive = currentSound == sound; + return Container( + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), + decoration: BoxDecoration( + color: isActive ? widget.category.themeColor.withOpacity(0.05) : Colors.white, + border: isActive ? Border.all(color: widget.category.themeColor, width: 2) : null, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.02), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () => manager.play(sound), + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: widget.category.themeColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(15), + ), + child: isActive + ? Icon(Icons.equalizer, color: widget.category.themeColor) + : Icon(Icons.music_note, color: widget.category.themeColor), + ), + const SizedBox(width: 16), + Expanded( + child: Text( + sound.title, + style: TextStyle( + fontWeight: isActive ? FontWeight.bold : FontWeight.normal, + fontSize: 16, + color: isActive ? widget.category.themeColor : const Color(0xFF1D1D35), + ), + ), + ), + IconButton( + icon: Icon( + isFav ? Icons.favorite_rounded : Icons.favorite_border_rounded, + color: isFav ? const Color(0xFFFF6584) : Colors.grey[300], + ), + onPressed: () { + DataManager().toggleFavorite(sound); + }, + ), + ], + ), + ), + ), + ), + ); + }, + ); + } + ); + } +} diff --git a/lib/pages/favorites_page.dart b/lib/pages/favorites_page.dart new file mode 100644 index 0000000..0c1b1e1 --- /dev/null +++ b/lib/pages/favorites_page.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import '../models/prank_sound.dart'; +import '../managers/data_manager.dart'; +import '../managers/sound_manager.dart'; +import '../widgets/big_player_panel.dart'; + +class FavoritesPage extends StatelessWidget { + const FavoritesPage({super.key}); + + final Color _favThemeColor = const Color(0xFF6C63FF); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder>( + valueListenable: DataManager().favoritesNotifier, + builder: (context, favorites, child) { + return Scaffold( + appBar: AppBar(title: const Text('My Favorites')), + body: Stack( + alignment: Alignment.bottomCenter, + children: [ + favorites.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(30), + decoration: BoxDecoration( + color: Colors.grey[100], + shape: BoxShape.circle, + ), + child: Icon(Icons.favorite_border_rounded, size: 60, color: Colors.grey[300]), + ), + const SizedBox(height: 20), + Text( + 'No favorites yet', + style: TextStyle(color: Colors.grey[400], fontSize: 16, fontWeight: FontWeight.bold), + ), + ], + ), + ) + : ListView.builder( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 320), // 列表底部留白更多,防止被高位置的播放器遮挡 + itemCount: favorites.length, + itemBuilder: (context, index) { + final sound = favorites[index]; + return Dismissible( + key: Key(sound.title), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: const EdgeInsets.only(right: 20), + decoration: BoxDecoration( + color: const Color(0xFFFF6584), + borderRadius: BorderRadius.circular(20), + ), + child: const Icon(Icons.delete_outline, color: Colors.white), + ), + onDismissed: (direction) { + DataManager().toggleFavorite(sound); + }, + child: _buildFavTile(sound), + ); + }, + ), + + // 在收藏页,底部偏移量设为 120 + BigPlayerPanel( + themeColor: _favThemeColor, + bottomOffset: 120, + ), + ], + ), + ); + }, + ); + } + + Widget _buildFavTile(PrankSound sound) { + final manager = SoundManager(); + return ValueListenableBuilder( + valueListenable: manager.currentSoundNotifier, + builder: (context, currentSound, _) { + final bool isActive = currentSound == sound; + return Container( + margin: const EdgeInsets.only(bottom: 12), + decoration: BoxDecoration( + color: isActive ? _favThemeColor.withOpacity(0.05) : Colors.white, + borderRadius: BorderRadius.circular(20), + border: isActive ? Border.all(color: _favThemeColor, width: 2) : null, + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 10, offset: const Offset(0, 4))], + ), + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + leading: CircleAvatar( + backgroundColor: _favThemeColor.withOpacity(0.1), + child: isActive + ? Icon(Icons.equalizer, color: _favThemeColor, size: 20) + : Icon(Icons.favorite, color: _favThemeColor, size: 20), + ), + title: Text(sound.title, style: TextStyle( + fontWeight: FontWeight.bold, + color: isActive ? _favThemeColor : Colors.black87 + )), + trailing: Icon( + isActive ? Icons.pause_circle_filled : Icons.play_circle_fill, + color: Colors.grey[300], + size: 30, + ), + onTap: () => manager.play(sound), + ), + ); + } + ); + } +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..e572a9e --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import '../models/prank_category.dart'; +import '../managers/data_manager.dart'; +import 'category_detail_page.dart'; + +class HomePage extends StatelessWidget { + const HomePage({super.key}); + + @override + Widget build(BuildContext context) { + final categories = DataManager().categories; + + return Scaffold( + body: CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + SliverAppBar( + pinned: true, + expandedHeight: 140.0, + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + surfaceTintColor: Colors.transparent, + flexibleSpace: FlexibleSpaceBar( + titlePadding: const EdgeInsets.only(left: 20, bottom: 16), + title: const Text( + 'Prank Sounds', + style: TextStyle( + color: Color(0xFF1D1D35), + fontWeight: FontWeight.w900, + fontSize: 24, + ), + ), + background: Container( + alignment: Alignment.topRight, + padding: const EdgeInsets.only(top: 60, right: 20), + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 4)), + ], + ), + child: const Icon(Icons.search, color: Color(0xFF1D1D35)), + ), + ), + ), + ), + SliverToBoxAdapter( + child: Container( + margin: const EdgeInsets.fromLTRB(20, 0, 20, 24), + height: 100, + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [Color(0xFF6C63FF), Color(0xFF8B85FF)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: const Color(0xFF6C63FF).withOpacity(0.3), + blurRadius: 15, + offset: const Offset(0, 8), + ), + ], + ), + child: Stack( + children: [ + Positioned( + right: -20, + top: -20, + child: Icon(Icons.music_note, size: 120, color: Colors.white.withOpacity(0.1)), + ), + const Padding( + padding: EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Trending Now', style: TextStyle(color: Colors.white70, fontSize: 12, fontWeight: FontWeight.bold)), + SizedBox(height: 4), + Text('Air Horn Prank 🔥', style: TextStyle(color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold)), + ], + ), + ) + ], + ), + ), + ), + SliverPadding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + sliver: SliverGrid( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 0.8, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + ), + delegate: SliverChildBuilderDelegate( + (context, index) { + return _buildCategoryCard(context, categories[index]); + }, + childCount: categories.length, + ), + ), + ), + const SliverToBoxAdapter(child: SizedBox(height: 120)), + ], + ), + ); + } + + Widget _buildCategoryCard(BuildContext context, PrankCategory category) { + return GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (_) => CategoryDetailPage(category: category)), + ); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: const Color(0xFFE0E5EC), + blurRadius: 15, + offset: const Offset(0, 8), + ), + ], + ), + child: Column( + children: [ + Expanded( + flex: 3, + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: category.themeColor.withOpacity(0.1), + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Image.network( + category.categoryUrl, + fit: BoxFit.contain, + errorBuilder: (c, e, s) => Center( + child: Icon(Icons.music_note_rounded, size: 48, color: category.themeColor.withOpacity(0.5)), + ), + ), + ), + ), + ), + Expanded( + flex: 2, + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + category.categoryName, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0xFF1D1D35), + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 4), + Row( + children: [ + Container( + width: 8, + height: 8, + decoration: BoxDecoration(color: category.themeColor, shape: BoxShape.circle), + ), + const SizedBox(width: 6), + Text( + '${category.list.length} sounds', + style: TextStyle( + fontSize: 12, + color: Colors.grey[500], + fontWeight: FontWeight.w500, + ), + ), + ], + ) + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/messages_page.dart b/lib/pages/messages_page.dart new file mode 100644 index 0000000..80aee8b --- /dev/null +++ b/lib/pages/messages_page.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; + +class MessagesPage extends StatelessWidget { + const MessagesPage({super.key}); + + @override + Widget build(BuildContext context) { + final List> notifications = [ + { + 'title': 'Welcome to Prank Sounds!', + 'body': 'Thanks for downloading! Start your prank journey with our hilarious sounds.', + 'time': 'Just now', + 'icon': Icons.waving_hand_rounded, + 'color': const Color(0xFF6C63FF), + }, + { + 'title': 'New Sounds Added! 📢', + 'body': 'We just updated the library with 10+ new "Air Horn" and "Fart" sounds. Check them out!', + 'time': '2h ago', + 'icon': Icons.new_releases_rounded, + 'color': const Color(0xFFFF6584), + }, + { + 'title': 'Unlock Pro Features 💎', + 'body': 'Remove ads and unlock exclusive sound effects by upgrading to Pro today.', + 'time': '1d ago', + 'icon': Icons.diamond_rounded, + 'color': const Color(0xFFFF9F0A), + }, + { + 'title': 'Enjoying the app?', + 'body': 'If you like Prank Sounds, please take a moment to rate us 5 stars on the store!', + 'time': '3d ago', + 'icon': Icons.star_rounded, + 'color': const Color(0xFF32D74B), + }, + { + 'title': 'Prank Tip #101', + 'body': 'Did you know you can loop sounds in Settings? Perfect for long pranks!', + 'time': '5d ago', + 'icon': Icons.lightbulb_rounded, + 'color': const Color(0xFF30B0C7), + }, + ]; + + return Scaffold( + appBar: AppBar(title: const Text('Inbox')), + body: ListView.separated( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 120), + itemCount: notifications.length, + separatorBuilder: (context, index) => const SizedBox(height: 16), + itemBuilder: (context, index) { + final item = notifications[index]; + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: const Color(0xFF6C63FF).withOpacity(0.05), + blurRadius: 15, + offset: const Offset(0, 5), + ) + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: (item['color'] as Color).withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon( + item['icon'] as IconData, + color: item['color'] as Color, + size: 22, + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + item['title'], + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + color: Color(0xFF1D1D35), + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + item['time'], + style: const TextStyle( + color: Colors.grey, + fontSize: 12, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + const SizedBox(height: 6), + Text( + item['body'], + style: const TextStyle( + color: Color(0xFF64748B), + fontSize: 13, + height: 1.5, + ), + ), + ], + ), + ), + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart new file mode 100644 index 0000000..7e65ad3 --- /dev/null +++ b/lib/pages/settings_page.dart @@ -0,0 +1,312 @@ +import 'package:flutter/material.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../managers/sound_manager.dart'; + +class SettingsPage extends StatelessWidget { + const SettingsPage({super.key}); + + void _showVolumeControl(BuildContext context) { + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (context) { + return ValueListenableBuilder( + valueListenable: SoundManager().volumeNotifier, + builder: (context, currentVolume, _) { + return Container( + padding: const EdgeInsets.all(24), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40, + height: 4, + margin: const EdgeInsets.only(bottom: 24), + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(2), + ), + ), + const Text( + 'Volume Control', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 30), + Row( + children: [ + Icon(Icons.volume_mute_rounded, color: Colors.grey[400]), + Expanded( + child: Slider( + value: currentVolume, + activeColor: const Color(0xFF6C63FF), + inactiveColor: Colors.grey[200], + onChanged: (value) { + SoundManager().setVolume(value); + }, + ), + ), + Icon(Icons.volume_up_rounded, color: const Color(0xFF6C63FF)), + ], + ), + const SizedBox(height: 10), + Text( + '${(currentVolume * 100).toInt()}%', + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Color(0xFF6C63FF), + ), + ), + const SizedBox(height: 30), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () => Navigator.pop(context), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF6C63FF), + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + elevation: 0, + ), + child: const Text('Done', style: TextStyle(fontWeight: FontWeight.bold)), + ), + ), + const SizedBox(height: 20), + ], + ), + ); + }, + ); + }, + ); + } + + void _shareApp(BuildContext context) async { + const String appUrl = "https://play.google.com/store/apps/details?id=com.example.pranksounds"; + const String message = "Check out this funny Prank Sounds app! 🤣\n$appUrl"; + try { + await Share.share(message); + } catch (e) { + if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Could not share: $e'))); + } + } + + void _openPrivacyPolicy(BuildContext context) async { + final Uri url = Uri.parse("https://www.google.com/policies/privacy/"); + try { + if (!await launchUrl(url, mode: LaunchMode.externalApplication)) { + throw Exception('Could not launch $url'); + } + } catch (e) { + if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Could not open link: $e'))); + } + } + + void _rateUs(BuildContext context) async { + final Uri url = Uri.parse("https://play.google.com/store/apps/details?id=com.example.pranksounds"); + try { + if (!await launchUrl(url, mode: LaunchMode.externalApplication)) { + throw Exception('Could not launch store'); + } + } catch (e) { + if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Could not open store'))); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + title: const Text('Settings'), + pinned: true, + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + ), + SliverToBoxAdapter( + child: Column( + children: [ + const SizedBox(height: 10), + _buildProfileCard(), + const SizedBox(height: 30), + _buildSettingsGroup('GENERAL', [ + // Volume Setting with Listener + ValueListenableBuilder( + valueListenable: SoundManager().volumeNotifier, + builder: (context, volume, _) { + return _buildSettingItem( + Icons.volume_up_rounded, + 'Volume', + trailing: '${(volume * 100).toInt()}%', + onTap: () => _showVolumeControl(context), + ); + }, + ), + // Loop Setting with Listener + ValueListenableBuilder( + valueListenable: SoundManager().loopNotifier, + builder: (context, isLooping, _) { + return _buildSettingItem( + Icons.loop_rounded, + 'Loop Sound', + isSwitch: true, + switchValue: isLooping, + onSwitchChanged: (val) { + SoundManager().setLooping(val); + }, + ); + }, + ), + ]), + _buildSettingsGroup('SUPPORT', [ + _buildSettingItem(Icons.star_rounded, 'Rate Us', onTap: () => _rateUs(context)), + _buildSettingItem(Icons.share_rounded, 'Share App', onTap: () => _shareApp(context)), + _buildSettingItem(Icons.privacy_tip_rounded, 'Privacy Policy', onTap: () => _openPrivacyPolicy(context)), + ]), + const SizedBox(height: 40), + Text('Version 2.0.1 (Build 102)', style: TextStyle(color: Colors.grey[400], fontSize: 12)), + const SizedBox(height: 120), + ], + ), + ) + ], + ), + ); + } + + Widget _buildProfileCard() { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [Color(0xFF6C63FF), Color(0xFF30B0C7)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: const Color(0xFF6C63FF).withOpacity(0.4), + blurRadius: 20, + offset: const Offset(0, 10), + ), + ], + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(3), + decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle), + child: const CircleAvatar( + radius: 26, + backgroundColor: Colors.grey, + child: Icon(Icons.person, color: Colors.white), + ), + ), + const SizedBox(width: 16), + const Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Prank Master', style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold)), + Text('Pro Member', style: TextStyle(color: Colors.white70, fontSize: 13)), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + borderRadius: BorderRadius.circular(100), + ), + child: const Text('PRO', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 12)), + ) + ], + ), + ); + } + + Widget _buildSettingsGroup(String title, List children) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10, bottom: 10), + child: Text( + title, + style: TextStyle(color: Colors.grey[500], fontWeight: FontWeight.bold, fontSize: 12, letterSpacing: 1.2), + ), + ), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.02), blurRadius: 10)], + ), + child: Column(children: children), + ), + ], + ), + ); + } + + Widget _buildSettingItem( + IconData icon, + String title, + { + String? trailing, + bool isSwitch = false, + bool switchValue = false, + ValueChanged? onSwitchChanged, + VoidCallback? onTap + }) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: isSwitch ? () => onSwitchChanged?.call(!switchValue) : onTap, + borderRadius: BorderRadius.circular(20), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: const Color(0xFFF4F6FD), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(icon, color: const Color(0xFF1D1D35), size: 20), + ), + const SizedBox(width: 16), + Expanded( + child: Text(title, style: const TextStyle(fontWeight: FontWeight.w600, color: Color(0xFF1D1D35))), + ), + if (isSwitch) + SizedBox( + height: 24, + child: Switch( + value: switchValue, + activeColor: const Color(0xFF6C63FF), + onChanged: onSwitchChanged, + ), + ) + else if (trailing != null) + Text(trailing, style: TextStyle(color: Colors.grey[400], fontWeight: FontWeight.bold)) + else + Icon(Icons.chevron_right_rounded, color: Colors.grey[300]), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/big_player_panel.dart b/lib/widgets/big_player_panel.dart new file mode 100644 index 0000000..b0f8d22 --- /dev/null +++ b/lib/widgets/big_player_panel.dart @@ -0,0 +1,164 @@ +import 'package:flutter/material.dart'; +import '../models/prank_sound.dart'; +import '../managers/sound_manager.dart'; + +class BigPlayerPanel extends StatelessWidget { + final Color themeColor; + final double bottomOffset; + + const BigPlayerPanel({ + super.key, + this.themeColor = const Color(0xFF6C63FF), + this.bottomOffset = 30.0, + }); + + @override + Widget build(BuildContext context) { + final manager = SoundManager(); + + return ValueListenableBuilder( + valueListenable: manager.currentSoundNotifier, + builder: (context, currentSound, child) { + if (currentSound == null) return const SizedBox.shrink(); + + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + margin: EdgeInsets.fromLTRB(16, 0, 16, bottomOffset), + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(32), + boxShadow: [ + BoxShadow( + color: themeColor.withOpacity(0.2), + blurRadius: 30, + offset: const Offset(0, 10), + spreadRadius: 0, + ), + ], + border: Border.all(color: Colors.white, width: 1), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 1. Title & Close + Row( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: themeColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(16), + ), + child: Icon(Icons.music_note_rounded, color: themeColor, size: 28), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + currentSound.title, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Color(0xFF1D1D35), + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 4), + const Text('Now Playing', style: TextStyle(color: Colors.grey, fontSize: 12)), + ], + ), + ), + IconButton( + onPressed: manager.stop, + icon: const Icon(Icons.keyboard_arrow_down_rounded, size: 30, color: Colors.grey), + ) + ], + ), + const SizedBox(height: 20), + + // 2. Progress Bar + ValueListenableBuilder( + valueListenable: manager.positionNotifier, + builder: (context, position, _) { + final duration = manager.durationNotifier.value; + double progress = 0.0; + if (duration.inMilliseconds > 0) { + progress = position.inMilliseconds / duration.inMilliseconds; + if (progress > 1.0) progress = 1.0; + } + + return Column( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(10), + child: LinearProgressIndicator( + value: progress, + backgroundColor: Colors.grey[100], + valueColor: AlwaysStoppedAnimation(themeColor), + minHeight: 8, + ), + ), + const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(_formatDuration(position), style: TextStyle(color: Colors.grey[400], fontSize: 12, fontWeight: FontWeight.bold)), + Text(_formatDuration(duration), style: TextStyle(color: Colors.grey[400], fontSize: 12, fontWeight: FontWeight.bold)), + ], + ) + ], + ); + }, + ), + const SizedBox(height: 10), + + // 3. Controls (Only Play/Pause as requested) + Center( + child: ValueListenableBuilder( + valueListenable: manager.isPlayingNotifier, + builder: (context, isPlaying, _) { + return GestureDetector( + onTap: () => manager.play(currentSound), + child: Container( + width: 70, + height: 70, + decoration: BoxDecoration( + color: themeColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: themeColor.withOpacity(0.4), + blurRadius: 20, + offset: const Offset(0, 10), + ) + ], + ), + child: Icon( + isPlaying ? Icons.pause_rounded : Icons.play_arrow_rounded, + color: Colors.white, + size: 38, + ), + ), + ); + }, + ), + ), + ], + ), + ); + }, + ); + } + + String _formatDuration(Duration duration) { + String twoDigits(int n) => n.toString().padLeft(2, "0"); + String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); + String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60)); + return "$twoDigitMinutes:$twoDigitSeconds"; + } +} diff --git a/lib/widgets/main_screen.dart b/lib/widgets/main_screen.dart new file mode 100644 index 0000000..17a4451 --- /dev/null +++ b/lib/widgets/main_screen.dart @@ -0,0 +1,128 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import '../managers/data_manager.dart'; +import '../managers/sound_manager.dart'; +import '../pages/home_page.dart'; +import '../pages/favorites_page.dart'; +import '../pages/messages_page.dart'; +import '../pages/settings_page.dart'; + +class MainScreen extends StatefulWidget { + const MainScreen({super.key}); + + @override + State createState() => _MainScreenState(); +} + +class _MainScreenState extends State { + int _currentIndex = 0; + bool _isDataLoaded = false; + + @override + void initState() { + super.initState(); + _initData(); + } + + void _initData() async { + await DataManager().loadData(); + if (mounted) { + setState(() { + _isDataLoaded = true; + }); + } + } + + @override + Widget build(BuildContext context) { + if (!_isDataLoaded) { + return const Scaffold( + body: Center( + child: CircularProgressIndicator(color: Color(0xFF6C63FF)), + ), + ); + } + + final List pages = [ + const HomePage(), + const FavoritesPage(), + const MessagesPage(), + const SettingsPage(), + ]; + + return Scaffold( + extendBody: true, + body: IndexedStack( + index: _currentIndex, + children: pages, + ), + bottomNavigationBar: SafeArea( + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 0, 24, 20), + child: Container( + height: 70, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.9), + borderRadius: BorderRadius.circular(35), + boxShadow: [ + BoxShadow( + color: const Color(0xFF6C63FF).withOpacity(0.15), + blurRadius: 20, + offset: const Offset(0, 8), + spreadRadius: 2, + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(35), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildCustomNavItem(0, Icons.grid_view_rounded, Icons.grid_view_outlined), + _buildCustomNavItem(1, Icons.favorite_rounded, Icons.favorite_border_rounded), + _buildCustomNavItem(2, Icons.notifications_rounded, Icons.notifications_none_rounded), + _buildCustomNavItem(3, Icons.settings_rounded, Icons.settings_outlined), + ], + ), + ), + ), + ), + ), + ), + ); + } + + Widget _buildCustomNavItem(int index, IconData activeIcon, IconData inactiveIcon) { + final bool isSelected = _currentIndex == index; + + return GestureDetector( + onTap: () { + if (_currentIndex != index) { + SoundManager().stop(); + HapticFeedback.lightImpact(); + setState(() => _currentIndex = index); + } + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + duration: const Duration(milliseconds: 250), + curve: Curves.easeOutBack, + padding: isSelected + ? const EdgeInsets.symmetric(horizontal: 20, vertical: 12) + : const EdgeInsets.all(12), + decoration: BoxDecoration( + color: isSelected ? const Color(0xFF6C63FF) : Colors.transparent, + borderRadius: BorderRadius.circular(25), + ), + child: Icon( + isSelected ? activeIcon : inactiveIcon, + color: isSelected ? Colors.white : const Color(0xFF9EA3B8), + size: 24, + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..56e98a3 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,658 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.13.0" + audio_session: + dependency: transitive + description: + name: audio_session + sha256: "8f96a7fecbb718cb093070f868b4cdcb8a9b1053dce342ff8ab2fde10eb9afb7" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.2" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: "5441fa0ceb8807a5ad701199806510e56afde2b4913d9d17c2f19f2902cf0ae4" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.5.1" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.2.1" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: "0811d6924904ca13f9ef90d19081e4a87f7297ddc19fc3d31f60af1aaafee333" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.0" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001 + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.2.1" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656" + url: "https://pub.flutter-io.cn" + source: hosted + version: "7.1.1" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: "1c0f17cec68455556775f1e50ca85c40c05c714a99c5eb1d2d57cc17ba5522d7" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.1.1" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: "4048797865105b26d47628e6abb49231ea5de84884160229251f37dfcbe52fd7" + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.2.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.2" + collection: + dependency: "direct main" + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.19.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.3.5+1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.flutter-io.cn" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.0.0" + flutter_staggered_grid_view: + dependency: "direct main" + description: + name: flutter_staggered_grid_view + sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.7.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: eefe5ee217f331627d8bbcf01f91b21c730bf66e225d6dc8a148370b0819168d + url: "https://pub.flutter-io.cn" + source: hosted + version: "7.0.0" + http: + dependency: transitive + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.6.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.1.2" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: "9694e4734f515f2a052493d1d7e0d6de219ee0427c7c29492e246ff32a219908" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.10.5" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.6.0" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.4.16" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.flutter-io.cn" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.22" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.5.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.1.5+1" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.28.0" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840" + url: "https://pub.flutter-io.cn" + source: hosted + version: "12.0.1" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.1.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.5.4" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.18" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.5.6" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.10.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.7.6" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.4.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.28" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.6" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.5.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.flutter-io.cn" + source: hosted + version: "15.0.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.15.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.0" +sdks: + dart: ">=3.9.2 <4.0.0" + flutter: ">=3.35.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..e7c63bd --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,64 @@ +name: prank_soundboard +description: "PrankSoundboard" +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + + +version: 1.0.0+1 + +environment: + sdk: ^3.9.2 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + provider: ^6.1.5+1 + just_audio: ^0.10.5 + flutter_staggered_grid_view: ^0.7.0 + google_fonts: ^7.0.0 + collection: ^1.19.1 + share_plus: ^12.0.1 + url_launcher: ^6.3.2 + audioplayers: ^6.5.1 + shared_preferences: ^2.5.4 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - assets/data.json + - assets/applogo.png + - assets/audio/ + - assets/lottie/ + diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..8246f16 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:prank_soundboard/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +}