diff --git a/assets/images/change_voice/2.0x/about.png b/assets/images/change_voice/2.0x/about.png deleted file mode 100644 index 2e0830a..0000000 Binary files a/assets/images/change_voice/2.0x/about.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/arrow_down_back.png b/assets/images/change_voice/2.0x/arrow_down_back.png deleted file mode 100644 index f3b0056..0000000 Binary files a/assets/images/change_voice/2.0x/arrow_down_back.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb1_selected.png b/assets/images/change_voice/2.0x/bnb1_selected.png deleted file mode 100644 index 360553a..0000000 Binary files a/assets/images/change_voice/2.0x/bnb1_selected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb1_unselected.png b/assets/images/change_voice/2.0x/bnb1_unselected.png deleted file mode 100644 index ce2955d..0000000 Binary files a/assets/images/change_voice/2.0x/bnb1_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb2_selected.png b/assets/images/change_voice/2.0x/bnb2_selected.png deleted file mode 100644 index 6a99806..0000000 Binary files a/assets/images/change_voice/2.0x/bnb2_selected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb2_unselected.png b/assets/images/change_voice/2.0x/bnb2_unselected.png deleted file mode 100644 index fbd7d23..0000000 Binary files a/assets/images/change_voice/2.0x/bnb2_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb3_selected.png b/assets/images/change_voice/2.0x/bnb3_selected.png deleted file mode 100644 index 26dfaf7..0000000 Binary files a/assets/images/change_voice/2.0x/bnb3_selected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb3_unselected.png b/assets/images/change_voice/2.0x/bnb3_unselected.png deleted file mode 100644 index d9d4978..0000000 Binary files a/assets/images/change_voice/2.0x/bnb3_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb4_selected.png b/assets/images/change_voice/2.0x/bnb4_selected.png deleted file mode 100644 index 73cdb63..0000000 Binary files a/assets/images/change_voice/2.0x/bnb4_selected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/bnb4_unselected.png b/assets/images/change_voice/2.0x/bnb4_unselected.png deleted file mode 100644 index c6120f1..0000000 Binary files a/assets/images/change_voice/2.0x/bnb4_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/change_voice_bg.png b/assets/images/change_voice/2.0x/change_voice_bg.png deleted file mode 100644 index 57dfdf6..0000000 Binary files a/assets/images/change_voice/2.0x/change_voice_bg.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/change_voice_item_frame.png b/assets/images/change_voice/2.0x/change_voice_item_frame.png deleted file mode 100644 index 03400b8..0000000 Binary files a/assets/images/change_voice/2.0x/change_voice_item_frame.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/change_voice_item_selected.png b/assets/images/change_voice/2.0x/change_voice_item_selected.png deleted file mode 100644 index 67e9007..0000000 Binary files a/assets/images/change_voice/2.0x/change_voice_item_selected.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/favorite.png b/assets/images/change_voice/2.0x/favorite.png deleted file mode 100644 index cea2d8d..0000000 Binary files a/assets/images/change_voice/2.0x/favorite.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/home_bg.png b/assets/images/change_voice/2.0x/home_bg.png deleted file mode 100644 index d237f1f..0000000 Binary files a/assets/images/change_voice/2.0x/home_bg.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/home_bnb_bg.png b/assets/images/change_voice/2.0x/home_bnb_bg.png deleted file mode 100644 index 8c5385a..0000000 Binary files a/assets/images/change_voice/2.0x/home_bnb_bg.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/icon_chevron_right.png b/assets/images/change_voice/2.0x/icon_chevron_right.png deleted file mode 100644 index 2d431b1..0000000 Binary files a/assets/images/change_voice/2.0x/icon_chevron_right.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/more.png b/assets/images/change_voice/2.0x/more.png deleted file mode 100644 index 6c142b0..0000000 Binary files a/assets/images/change_voice/2.0x/more.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/not_favorite.png b/assets/images/change_voice/2.0x/not_favorite.png deleted file mode 100644 index 8c7a8b5..0000000 Binary files a/assets/images/change_voice/2.0x/not_favorite.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/not_played.png b/assets/images/change_voice/2.0x/not_played.png deleted file mode 100644 index 9920272..0000000 Binary files a/assets/images/change_voice/2.0x/not_played.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/not_played1.png b/assets/images/change_voice/2.0x/not_played1.png deleted file mode 100644 index b6c2b1f..0000000 Binary files a/assets/images/change_voice/2.0x/not_played1.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/play_sound_bg.png b/assets/images/change_voice/2.0x/play_sound_bg.png deleted file mode 100644 index 44cc30b..0000000 Binary files a/assets/images/change_voice/2.0x/play_sound_bg.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/playing.png b/assets/images/change_voice/2.0x/playing.png deleted file mode 100644 index f89e9cf..0000000 Binary files a/assets/images/change_voice/2.0x/playing.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/playing1.png b/assets/images/change_voice/2.0x/playing1.png deleted file mode 100644 index a2fa374..0000000 Binary files a/assets/images/change_voice/2.0x/playing1.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/privacy.png b/assets/images/change_voice/2.0x/privacy.png deleted file mode 100644 index ae9acc6..0000000 Binary files a/assets/images/change_voice/2.0x/privacy.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/settings_bg.png b/assets/images/change_voice/2.0x/settings_bg.png deleted file mode 100644 index d4d35cf..0000000 Binary files a/assets/images/change_voice/2.0x/settings_bg.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/subtract.png b/assets/images/change_voice/2.0x/subtract.png deleted file mode 100644 index 08d66a4..0000000 Binary files a/assets/images/change_voice/2.0x/subtract.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/the_monster.png b/assets/images/change_voice/2.0x/the_monster.png deleted file mode 100644 index 621f5f6..0000000 Binary files a/assets/images/change_voice/2.0x/the_monster.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/the_monster1.png b/assets/images/change_voice/2.0x/the_monster1.png deleted file mode 100644 index 2e98096..0000000 Binary files a/assets/images/change_voice/2.0x/the_monster1.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/the_monster2.png b/assets/images/change_voice/2.0x/the_monster2.png deleted file mode 100644 index 44b22d4..0000000 Binary files a/assets/images/change_voice/2.0x/the_monster2.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/upload_method_bg.png b/assets/images/change_voice/2.0x/upload_method_bg.png deleted file mode 100644 index f40b631..0000000 Binary files a/assets/images/change_voice/2.0x/upload_method_bg.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/upload_pick.png b/assets/images/change_voice/2.0x/upload_pick.png deleted file mode 100644 index 7b0472d..0000000 Binary files a/assets/images/change_voice/2.0x/upload_pick.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/upload_record_sound.png b/assets/images/change_voice/2.0x/upload_record_sound.png deleted file mode 100644 index 6aadc04..0000000 Binary files a/assets/images/change_voice/2.0x/upload_record_sound.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/user_agreement.png b/assets/images/change_voice/2.0x/user_agreement.png deleted file mode 100644 index ac69958..0000000 Binary files a/assets/images/change_voice/2.0x/user_agreement.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/voice_change.png b/assets/images/change_voice/2.0x/voice_change.png deleted file mode 100644 index 2d703d0..0000000 Binary files a/assets/images/change_voice/2.0x/voice_change.png and /dev/null differ diff --git a/assets/images/change_voice/2.0x/voice_default.png b/assets/images/change_voice/2.0x/voice_default.png deleted file mode 100644 index aaee93a..0000000 Binary files a/assets/images/change_voice/2.0x/voice_default.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/about.png b/assets/images/change_voice/3.0x/about.png deleted file mode 100644 index a2ae827..0000000 Binary files a/assets/images/change_voice/3.0x/about.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/arrow_down_back.png b/assets/images/change_voice/3.0x/arrow_down_back.png deleted file mode 100644 index cbd0c9b..0000000 Binary files a/assets/images/change_voice/3.0x/arrow_down_back.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb1_selected.png b/assets/images/change_voice/3.0x/bnb1_selected.png deleted file mode 100644 index f731a76..0000000 Binary files a/assets/images/change_voice/3.0x/bnb1_selected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb1_unselected.png b/assets/images/change_voice/3.0x/bnb1_unselected.png deleted file mode 100644 index c3b9ebc..0000000 Binary files a/assets/images/change_voice/3.0x/bnb1_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb2_selected.png b/assets/images/change_voice/3.0x/bnb2_selected.png deleted file mode 100644 index b67e9e5..0000000 Binary files a/assets/images/change_voice/3.0x/bnb2_selected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb2_unselected.png b/assets/images/change_voice/3.0x/bnb2_unselected.png deleted file mode 100644 index f9112af..0000000 Binary files a/assets/images/change_voice/3.0x/bnb2_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb3_selected.png b/assets/images/change_voice/3.0x/bnb3_selected.png deleted file mode 100644 index 7974e0b..0000000 Binary files a/assets/images/change_voice/3.0x/bnb3_selected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb3_unselected.png b/assets/images/change_voice/3.0x/bnb3_unselected.png deleted file mode 100644 index d2f74be..0000000 Binary files a/assets/images/change_voice/3.0x/bnb3_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb4_selected.png b/assets/images/change_voice/3.0x/bnb4_selected.png deleted file mode 100644 index 870869b..0000000 Binary files a/assets/images/change_voice/3.0x/bnb4_selected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/bnb4_unselected.png b/assets/images/change_voice/3.0x/bnb4_unselected.png deleted file mode 100644 index 80c8923..0000000 Binary files a/assets/images/change_voice/3.0x/bnb4_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/change_voice_bg.png b/assets/images/change_voice/3.0x/change_voice_bg.png deleted file mode 100644 index 489031c..0000000 Binary files a/assets/images/change_voice/3.0x/change_voice_bg.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/change_voice_item_frame.png b/assets/images/change_voice/3.0x/change_voice_item_frame.png deleted file mode 100644 index 34ac9ca..0000000 Binary files a/assets/images/change_voice/3.0x/change_voice_item_frame.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/change_voice_item_selected.png b/assets/images/change_voice/3.0x/change_voice_item_selected.png deleted file mode 100644 index 8d4a4d8..0000000 Binary files a/assets/images/change_voice/3.0x/change_voice_item_selected.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/favorite.png b/assets/images/change_voice/3.0x/favorite.png deleted file mode 100644 index b621f8e..0000000 Binary files a/assets/images/change_voice/3.0x/favorite.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/home_bg.png b/assets/images/change_voice/3.0x/home_bg.png deleted file mode 100644 index 8fff64a..0000000 Binary files a/assets/images/change_voice/3.0x/home_bg.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/home_bnb_bg.png b/assets/images/change_voice/3.0x/home_bnb_bg.png deleted file mode 100644 index c9b78b6..0000000 Binary files a/assets/images/change_voice/3.0x/home_bnb_bg.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/icon_chevron_right.png b/assets/images/change_voice/3.0x/icon_chevron_right.png deleted file mode 100644 index 01baaac..0000000 Binary files a/assets/images/change_voice/3.0x/icon_chevron_right.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/more.png b/assets/images/change_voice/3.0x/more.png deleted file mode 100644 index d6ddfd4..0000000 Binary files a/assets/images/change_voice/3.0x/more.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/not_favorite.png b/assets/images/change_voice/3.0x/not_favorite.png deleted file mode 100644 index 517a273..0000000 Binary files a/assets/images/change_voice/3.0x/not_favorite.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/not_played.png b/assets/images/change_voice/3.0x/not_played.png deleted file mode 100644 index 9dc0446..0000000 Binary files a/assets/images/change_voice/3.0x/not_played.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/not_played1.png b/assets/images/change_voice/3.0x/not_played1.png deleted file mode 100644 index c956d11..0000000 Binary files a/assets/images/change_voice/3.0x/not_played1.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/play_sound_bg.png b/assets/images/change_voice/3.0x/play_sound_bg.png deleted file mode 100644 index e47f0a6..0000000 Binary files a/assets/images/change_voice/3.0x/play_sound_bg.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/playing.png b/assets/images/change_voice/3.0x/playing.png deleted file mode 100644 index 8768bff..0000000 Binary files a/assets/images/change_voice/3.0x/playing.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/playing1.png b/assets/images/change_voice/3.0x/playing1.png deleted file mode 100644 index cba3593..0000000 Binary files a/assets/images/change_voice/3.0x/playing1.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/privacy.png b/assets/images/change_voice/3.0x/privacy.png deleted file mode 100644 index 0817b16..0000000 Binary files a/assets/images/change_voice/3.0x/privacy.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/settings_bg.png b/assets/images/change_voice/3.0x/settings_bg.png deleted file mode 100644 index 1356a5b..0000000 Binary files a/assets/images/change_voice/3.0x/settings_bg.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/subtract.png b/assets/images/change_voice/3.0x/subtract.png deleted file mode 100644 index e2b8941..0000000 Binary files a/assets/images/change_voice/3.0x/subtract.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/the_monster.png b/assets/images/change_voice/3.0x/the_monster.png deleted file mode 100644 index dae358d..0000000 Binary files a/assets/images/change_voice/3.0x/the_monster.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/the_monster1.png b/assets/images/change_voice/3.0x/the_monster1.png deleted file mode 100644 index c38e1c9..0000000 Binary files a/assets/images/change_voice/3.0x/the_monster1.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/the_monster2.png b/assets/images/change_voice/3.0x/the_monster2.png deleted file mode 100644 index a32cad8..0000000 Binary files a/assets/images/change_voice/3.0x/the_monster2.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/upload_method_bg.png b/assets/images/change_voice/3.0x/upload_method_bg.png deleted file mode 100644 index 633272c..0000000 Binary files a/assets/images/change_voice/3.0x/upload_method_bg.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/upload_pick.png b/assets/images/change_voice/3.0x/upload_pick.png deleted file mode 100644 index 92de659..0000000 Binary files a/assets/images/change_voice/3.0x/upload_pick.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/upload_record_sound.png b/assets/images/change_voice/3.0x/upload_record_sound.png deleted file mode 100644 index df06d12..0000000 Binary files a/assets/images/change_voice/3.0x/upload_record_sound.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/user_agreement.png b/assets/images/change_voice/3.0x/user_agreement.png deleted file mode 100644 index e9d7853..0000000 Binary files a/assets/images/change_voice/3.0x/user_agreement.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/voice_change.png b/assets/images/change_voice/3.0x/voice_change.png deleted file mode 100644 index 67c741d..0000000 Binary files a/assets/images/change_voice/3.0x/voice_change.png and /dev/null differ diff --git a/assets/images/change_voice/3.0x/voice_default.png b/assets/images/change_voice/3.0x/voice_default.png deleted file mode 100644 index d456712..0000000 Binary files a/assets/images/change_voice/3.0x/voice_default.png and /dev/null differ diff --git a/assets/images/change_voice/about.png b/assets/images/change_voice/about.png deleted file mode 100644 index c2b364b..0000000 Binary files a/assets/images/change_voice/about.png and /dev/null differ diff --git a/assets/images/change_voice/arrow_down_back.png b/assets/images/change_voice/arrow_down_back.png deleted file mode 100644 index 501737a..0000000 Binary files a/assets/images/change_voice/arrow_down_back.png and /dev/null differ diff --git a/assets/images/change_voice/bnb1_selected.png b/assets/images/change_voice/bnb1_selected.png deleted file mode 100644 index 03c05e7..0000000 Binary files a/assets/images/change_voice/bnb1_selected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb1_unselected.png b/assets/images/change_voice/bnb1_unselected.png deleted file mode 100644 index c76010f..0000000 Binary files a/assets/images/change_voice/bnb1_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb2_selected.png b/assets/images/change_voice/bnb2_selected.png deleted file mode 100644 index a2d30a5..0000000 Binary files a/assets/images/change_voice/bnb2_selected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb2_unselected.png b/assets/images/change_voice/bnb2_unselected.png deleted file mode 100644 index 60b4e03..0000000 Binary files a/assets/images/change_voice/bnb2_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb3_selected.png b/assets/images/change_voice/bnb3_selected.png deleted file mode 100644 index 092cada..0000000 Binary files a/assets/images/change_voice/bnb3_selected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb3_unselected.png b/assets/images/change_voice/bnb3_unselected.png deleted file mode 100644 index 6ef5b18..0000000 Binary files a/assets/images/change_voice/bnb3_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb4_selected.png b/assets/images/change_voice/bnb4_selected.png deleted file mode 100644 index 824f01e..0000000 Binary files a/assets/images/change_voice/bnb4_selected.png and /dev/null differ diff --git a/assets/images/change_voice/bnb4_unselected.png b/assets/images/change_voice/bnb4_unselected.png deleted file mode 100644 index fd128f9..0000000 Binary files a/assets/images/change_voice/bnb4_unselected.png and /dev/null differ diff --git a/assets/images/change_voice/change_voice.png b/assets/images/change_voice/change_voice.png deleted file mode 100644 index e62707c..0000000 Binary files a/assets/images/change_voice/change_voice.png and /dev/null differ diff --git a/assets/images/change_voice/change_voice_bg.png b/assets/images/change_voice/change_voice_bg.png deleted file mode 100644 index 88f3387..0000000 Binary files a/assets/images/change_voice/change_voice_bg.png and /dev/null differ diff --git a/assets/images/change_voice/change_voice_item_frame.png b/assets/images/change_voice/change_voice_item_frame.png deleted file mode 100644 index 282c870..0000000 Binary files a/assets/images/change_voice/change_voice_item_frame.png and /dev/null differ diff --git a/assets/images/change_voice/change_voice_item_selected.png b/assets/images/change_voice/change_voice_item_selected.png deleted file mode 100644 index ddb2128..0000000 Binary files a/assets/images/change_voice/change_voice_item_selected.png and /dev/null differ diff --git a/assets/images/change_voice/cover/DIY.jpeg b/assets/images/change_voice/cover/DIY.jpeg deleted file mode 100755 index b3fecd9..0000000 Binary files a/assets/images/change_voice/cover/DIY.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/Fast.jpeg b/assets/images/change_voice/cover/Fast.jpeg deleted file mode 100755 index 09526dd..0000000 Binary files a/assets/images/change_voice/cover/Fast.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/Flash.jpeg b/assets/images/change_voice/cover/Flash.jpeg deleted file mode 100755 index 18dca3a..0000000 Binary files a/assets/images/change_voice/cover/Flash.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/Original.jpeg b/assets/images/change_voice/cover/Original.jpeg deleted file mode 100755 index fb53c2a..0000000 Binary files a/assets/images/change_voice/cover/Original.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/Slow.jpeg b/assets/images/change_voice/cover/Slow.jpeg deleted file mode 100755 index 4c01fae..0000000 Binary files a/assets/images/change_voice/cover/Slow.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/boy.jpeg b/assets/images/change_voice/cover/boy.jpeg deleted file mode 100755 index 7be949a..0000000 Binary files a/assets/images/change_voice/cover/boy.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/child.png b/assets/images/change_voice/cover/child.png deleted file mode 100755 index 81eb50b..0000000 Binary files a/assets/images/change_voice/cover/child.png and /dev/null differ diff --git a/assets/images/change_voice/cover/elder.png b/assets/images/change_voice/cover/elder.png deleted file mode 100755 index afad274..0000000 Binary files a/assets/images/change_voice/cover/elder.png and /dev/null differ diff --git a/assets/images/change_voice/cover/girl.jpeg b/assets/images/change_voice/cover/girl.jpeg deleted file mode 100755 index c8cc102..0000000 Binary files a/assets/images/change_voice/cover/girl.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/man.png b/assets/images/change_voice/cover/man.png deleted file mode 100755 index 92ab77b..0000000 Binary files a/assets/images/change_voice/cover/man.png and /dev/null differ diff --git a/assets/images/change_voice/cover/monsters.png b/assets/images/change_voice/cover/monsters.png deleted file mode 100755 index 6d9eb39..0000000 Binary files a/assets/images/change_voice/cover/monsters.png and /dev/null differ diff --git a/assets/images/change_voice/cover/robot.jpeg b/assets/images/change_voice/cover/robot.jpeg deleted file mode 100755 index 0f3d960..0000000 Binary files a/assets/images/change_voice/cover/robot.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/sexy.jpeg b/assets/images/change_voice/cover/sexy.jpeg deleted file mode 100755 index f3dfc03..0000000 Binary files a/assets/images/change_voice/cover/sexy.jpeg and /dev/null differ diff --git a/assets/images/change_voice/cover/woman.png b/assets/images/change_voice/cover/woman.png deleted file mode 100755 index 4920617..0000000 Binary files a/assets/images/change_voice/cover/woman.png and /dev/null differ diff --git a/assets/images/change_voice/favorite.png b/assets/images/change_voice/favorite.png deleted file mode 100644 index 7c1ea2d..0000000 Binary files a/assets/images/change_voice/favorite.png and /dev/null differ diff --git a/assets/images/change_voice/home_bg.png b/assets/images/change_voice/home_bg.png deleted file mode 100644 index 180bc3d..0000000 Binary files a/assets/images/change_voice/home_bg.png and /dev/null differ diff --git a/assets/images/change_voice/home_bnb_bg.png b/assets/images/change_voice/home_bnb_bg.png deleted file mode 100644 index 891d327..0000000 Binary files a/assets/images/change_voice/home_bnb_bg.png and /dev/null differ diff --git a/assets/images/change_voice/icon_chevron_right.png b/assets/images/change_voice/icon_chevron_right.png deleted file mode 100644 index 1c3733b..0000000 Binary files a/assets/images/change_voice/icon_chevron_right.png and /dev/null differ diff --git a/assets/images/change_voice/img_error.png b/assets/images/change_voice/img_error.png deleted file mode 100644 index 7ef1e09..0000000 Binary files a/assets/images/change_voice/img_error.png and /dev/null differ diff --git a/assets/images/change_voice/img_placeholder.png b/assets/images/change_voice/img_placeholder.png deleted file mode 100644 index f7a5faf..0000000 Binary files a/assets/images/change_voice/img_placeholder.png and /dev/null differ diff --git a/assets/images/change_voice/more.png b/assets/images/change_voice/more.png deleted file mode 100644 index ac179f4..0000000 Binary files a/assets/images/change_voice/more.png and /dev/null differ diff --git a/assets/images/change_voice/not_favorite.png b/assets/images/change_voice/not_favorite.png deleted file mode 100644 index 9d4166e..0000000 Binary files a/assets/images/change_voice/not_favorite.png and /dev/null differ diff --git a/assets/images/change_voice/not_played.png b/assets/images/change_voice/not_played.png deleted file mode 100644 index cba9c9c..0000000 Binary files a/assets/images/change_voice/not_played.png and /dev/null differ diff --git a/assets/images/change_voice/not_played1.png b/assets/images/change_voice/not_played1.png deleted file mode 100644 index 161001a..0000000 Binary files a/assets/images/change_voice/not_played1.png and /dev/null differ diff --git a/assets/images/change_voice/play_sound_bg.png b/assets/images/change_voice/play_sound_bg.png deleted file mode 100644 index 09d5c8b..0000000 Binary files a/assets/images/change_voice/play_sound_bg.png and /dev/null differ diff --git a/assets/images/change_voice/playing.png b/assets/images/change_voice/playing.png deleted file mode 100644 index fceb125..0000000 Binary files a/assets/images/change_voice/playing.png and /dev/null differ diff --git a/assets/images/change_voice/playing1.png b/assets/images/change_voice/playing1.png deleted file mode 100644 index 3a7366f..0000000 Binary files a/assets/images/change_voice/playing1.png and /dev/null differ diff --git a/assets/images/change_voice/privacy.png b/assets/images/change_voice/privacy.png deleted file mode 100644 index 387de99..0000000 Binary files a/assets/images/change_voice/privacy.png and /dev/null differ diff --git a/assets/images/change_voice/settings_bg.png b/assets/images/change_voice/settings_bg.png deleted file mode 100644 index 3719821..0000000 Binary files a/assets/images/change_voice/settings_bg.png and /dev/null differ diff --git a/assets/images/change_voice/subtract.png b/assets/images/change_voice/subtract.png deleted file mode 100644 index aaa3f8d..0000000 Binary files a/assets/images/change_voice/subtract.png and /dev/null differ diff --git a/assets/images/change_voice/the_monster.png b/assets/images/change_voice/the_monster.png deleted file mode 100644 index 6bc7897..0000000 Binary files a/assets/images/change_voice/the_monster.png and /dev/null differ diff --git a/assets/images/change_voice/the_monster1.png b/assets/images/change_voice/the_monster1.png deleted file mode 100644 index 9f11978..0000000 Binary files a/assets/images/change_voice/the_monster1.png and /dev/null differ diff --git a/assets/images/change_voice/the_monster2.png b/assets/images/change_voice/the_monster2.png deleted file mode 100644 index a440183..0000000 Binary files a/assets/images/change_voice/the_monster2.png and /dev/null differ diff --git a/assets/images/change_voice/upload_method_bg.png b/assets/images/change_voice/upload_method_bg.png deleted file mode 100644 index 62d8e3f..0000000 Binary files a/assets/images/change_voice/upload_method_bg.png and /dev/null differ diff --git a/assets/images/change_voice/upload_pick.png b/assets/images/change_voice/upload_pick.png deleted file mode 100644 index 812446e..0000000 Binary files a/assets/images/change_voice/upload_pick.png and /dev/null differ diff --git a/assets/images/change_voice/upload_record_sound.png b/assets/images/change_voice/upload_record_sound.png deleted file mode 100644 index aef78b4..0000000 Binary files a/assets/images/change_voice/upload_record_sound.png and /dev/null differ diff --git a/assets/images/change_voice/user_agreement.png b/assets/images/change_voice/user_agreement.png deleted file mode 100644 index d1e5380..0000000 Binary files a/assets/images/change_voice/user_agreement.png and /dev/null differ diff --git a/assets/images/change_voice/voice_default.png b/assets/images/change_voice/voice_default.png deleted file mode 100644 index b495758..0000000 Binary files a/assets/images/change_voice/voice_default.png and /dev/null differ diff --git a/assets/images/musicoo/bnb1_selected.png b/assets/images/musicoo/bnb1_selected.png deleted file mode 100755 index 81c05cd..0000000 Binary files a/assets/images/musicoo/bnb1_selected.png and /dev/null differ diff --git a/assets/images/musicoo/bnb1_unselected.png b/assets/images/musicoo/bnb1_unselected.png deleted file mode 100755 index 2b60980..0000000 Binary files a/assets/images/musicoo/bnb1_unselected.png and /dev/null differ diff --git a/assets/images/musicoo/bnb2_selected.png b/assets/images/musicoo/bnb2_selected.png deleted file mode 100755 index 63d255c..0000000 Binary files a/assets/images/musicoo/bnb2_selected.png and /dev/null differ diff --git a/assets/images/musicoo/bnb2_unselected.png b/assets/images/musicoo/bnb2_unselected.png deleted file mode 100755 index b4c3a81..0000000 Binary files a/assets/images/musicoo/bnb2_unselected.png and /dev/null differ diff --git a/assets/images/musicoo/bnb3_selected.png b/assets/images/musicoo/bnb3_selected.png deleted file mode 100755 index a3a04ec..0000000 Binary files a/assets/images/musicoo/bnb3_selected.png and /dev/null differ diff --git a/assets/images/musicoo/bnb3_unselected.png b/assets/images/musicoo/bnb3_unselected.png deleted file mode 100755 index a676cf0..0000000 Binary files a/assets/images/musicoo/bnb3_unselected.png and /dev/null differ diff --git a/lib/components/navigation_bar/base_appbar.dart b/lib/components/navigation_bar/base_appbar.dart deleted file mode 100644 index 86abdf8..0000000 --- a/lib/components/navigation_bar/base_appbar.dart +++ /dev/null @@ -1,62 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/5/7 -// Description: BaseAppBar - -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; - -class BaseAppBar extends StatelessWidget implements PreferredSizeWidget { - const BaseAppBar( - this.title, { - super.key, - this.backgroundColor, - this.backWidget, - this.onBackTap, - }); - - final Color? backgroundColor; - final Widget? backWidget; - final String title; - final Function()? onBackTap; - - @override - Widget build(BuildContext context) { - return AppBar( - centerTitle: true, - backgroundColor: backgroundColor, - title: _buildTitle(), - leading: backWidget ?? _buildBackWidget(), - ); - } - - Widget _buildBackWidget() { - return ClipOval( - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: onBackTap ?? Get.back, - child: Icon( - Icons.arrow_back_rounded, - size: 32.w, - color: Colors.white, - ), - ), - ), - ); - } - - Widget _buildTitle() { - return Text( - title, - style: TextStyle( - color: Colors.white, - fontSize: 20.sp, - fontWeight: FontWeight.w600, - ), - ); - } - - @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); -} diff --git a/lib/components/private/head_label.dart b/lib/components/private/head_label.dart deleted file mode 100644 index bcab30b..0000000 --- a/lib/components/private/head_label.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/6/5 -// Description: 头部标签 - -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; - -class HeadLabel extends StatelessWidget { - const HeadLabel({ - super.key, - required this.assets, - required this.width, - required this.height, - }); - - final String assets; - final double width; - final double height; - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.fromLTRB(20.w, MediaQuery.of(context).padding.top + 24.h, 20.w, 14.h), - child: Align( - alignment: Alignment.topLeft, - child: Image.asset( - assets, - width: width, - height: height, - ), - ), - ); - } -} diff --git a/lib/components/private/my_voice_item.dart b/lib/components/private/my_voice_item.dart deleted file mode 100644 index 9daa011..0000000 --- a/lib/components/private/my_voice_item.dart +++ /dev/null @@ -1,94 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/6/5 -// Description: 我的音频item - -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:tone_snap/components/my_marquee_text.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/utils/obj_util.dart'; - -class MyVoiceItem extends StatelessWidget { - const MyVoiceItem({ - super.key, - required this.item, - required this.onTapItem, - required this.onReName, - required this.onDelete, - }); - - final VoiceModel item; - final Function() onTapItem; - final Function() onReName; - final Function() onDelete; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onTapItem, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 8.h), - child: Row( - children: [ - ClipOval( - child: Image.asset( - ObjUtil.isNotEmptyStr(item.cover) ? item.cover! : Assets.changeVoiceVoiceDefault, - width: 52.w, - height: 52.w, - fit: BoxFit.cover, - ), - ), - SizedBox(width: 12.w), - Expanded( - child: MyMarqueeText( - text: item.name, - textStyle: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - SizedBox(width: 12.w), - PopupMenuButton( - offset: Offset(0, 38.w), - color: Colors.white, - padding: EdgeInsets.zero, - itemBuilder: (context) { - return [ - PopupMenuItem( - onTap: onReName, - child: Center( - child: Text( - 'Rename', - style: TextStyle(fontSize: 15.sp, fontWeight: FontWeight.w500), - ), - ), - ), - PopupMenuItem( - onTap: onDelete, - child: Center( - child: Text( - 'Delete', - style: TextStyle(fontSize: 15.sp, fontWeight: FontWeight.w500), - ), - ), - ), - ]; - }, - child: Padding( - padding: const EdgeInsets.all(6).w, - child: Image.asset( - Assets.changeVoiceMore, - width: 32.w, - height: 32.w, - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/controllers/player_controller.dart b/lib/controllers/player_controller.dart deleted file mode 100644 index 72a1d01..0000000 --- a/lib/controllers/player_controller.dart +++ /dev/null @@ -1,182 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/5/30 -// Description: 播放器控制器 - -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter/services.dart'; -import 'package:get/get.dart'; -import 'package:just_audio/just_audio.dart'; -import 'package:tone_snap/components/base_easyloading.dart'; -import 'package:tone_snap/utils/audio_util.dart'; -import 'package:tone_snap/utils/log_print.dart'; - -class PlayerController extends GetxController { - static PlayerController get to => Get.put(PlayerController()); - - StreamSubscription? _playerStateSubscription; - StreamSubscription? _durationSubscription; - - final _player = AudioPlayer(); - var filePath = ''; - var isPlaying = false.obs; - var isCompleted = true.obs; - var positionValue = 0.0.obs; - var duration = const Duration().obs; - var positionDuration = const Duration().obs; - var isReady = false; - - @override - void onInit() { - super.onInit(); - AudioUtil.configAudioSession(); - } - - @override - void onClose() { - _stopListening(); - _player.dispose(); - super.onClose(); - } - - Future setFilePath(String filePath) async { - if (!filePath.contains('assets') && !await _fileExists(filePath)) return; - if (this.filePath != filePath) { - this.filePath = filePath; - try { - isReady = false; - if (filePath.contains('assets')) { - duration.value = await _player.setAsset(filePath) ?? Duration.zero; - } else { - duration.value = await _player.setFilePath(filePath) ?? Duration.zero; - } - isReady = true; - } on PlayerException catch (e) { - LogPrint.e("Error code: ${e.code}"); - LogPrint.e("Error message: ${e.message}"); - BaseEasyLoading.toast("Error message: ${e.message}"); - } on PlayerInterruptedException catch (e) { - LogPrint.e("Connection aborted: ${e.message}"); - BaseEasyLoading.toast("Connection aborted: ${e.message}"); - } catch (e) { - LogPrint.e('An error occured: $e'); - BaseEasyLoading.toast('An error occured: $e'); - } - } - } - - /// 监听 - void _startListening() { - _playerStateSubscription = _player.playerStateStream.listen((playerState) { - switch (playerState.processingState) { - case ProcessingState.idle: - break; - case ProcessingState.loading: - break; - case ProcessingState.buffering: - break; - case ProcessingState.ready: - break; - case ProcessingState.completed: - isCompleted.value = true; - _player.seek(Duration.zero); - pausePlay(); - break; - } - }); - - _durationSubscription = _player.positionStream.listen((position) { - if (_player.duration != null) { - duration.value = _player.duration!; - positionDuration.value = position; - positionValue.value = position.inMilliseconds.toDouble() / _player.duration!.inMilliseconds.toDouble(); - } - }, onError: (Object e, StackTrace st) { - if (e is PlatformException) { - LogPrint.e('Error code: ${e.code}'); - LogPrint.e('Error message: ${e.message}'); - LogPrint.e('AudioSource index: ${e.details?['index']}'); - BaseEasyLoading.toast('Error message: ${e.message}'); - } else { - LogPrint.e('An error occurred: $e'); - BaseEasyLoading.toast('An error occurred: $e'); - } - }); - } - - void _stopListening() { - _playerStateSubscription?.cancel(); - _playerStateSubscription = null; - _durationSubscription?.cancel(); - _durationSubscription = null; - } - - /// 开始播放 - Future startPlay() async { - if (!filePath.contains('assets') && !await _fileExists(filePath)) return; - if (!isReady) { - BaseEasyLoading.toast('Loading audio source'); - return; - } - _startListening(); - _player.play(); - isPlaying.value = true; - isCompleted.value = false; - } - - /// 暂停播放 - Future pausePlay() async { - await _player.pause(); - isPlaying.value = false; - _stopListening(); - } - - /// 停止播放并释放资源 - Future stopPlay() async { - await _player.stop(); - _stopListening(); - _player.seek(Duration.zero); - isPlaying.value = false; - isCompleted.value = true; - positionValue.value = 0.0; - // duration.value = Duration.zero; - positionDuration.value = Duration.zero; - } - - String getDuration() { - return printDuration(duration.value); - } - - String getPositionDuration() { - return printDuration(positionDuration.value); - } - - /// 打印持续时间 - String printDuration(Duration duration) { - String twoDigits(int n) => n.toString().padLeft(2, '0'); - final minutes = twoDigits(duration.inMinutes.remainder(60)); - final seconds = twoDigits(duration.inSeconds.remainder(60)); - return '$minutes:$seconds'; - } - - /// 判断文件是否存在 - Future _fileExists(String path) async { - if (await File(path).exists()) { - return true; - } else { - BaseEasyLoading.toast('Audio does not exist'); - return false; - } - } - - /// 设置声调 - Future setPitch(double setPitch) async { - await _player.setPitch(setPitch); - } - - /// 设置声速 - Future setSpeed(double speed) async { - await _player.setSpeed(speed); - } -} diff --git a/lib/data/models/voice_model.dart b/lib/data/models/voice_model.dart deleted file mode 100644 index 5773d49..0000000 --- a/lib/data/models/voice_model.dart +++ /dev/null @@ -1,54 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/6/4 -// Description: 音频实体类 - -import 'dart:convert'; - -import 'package:hive/hive.dart'; - -part 'voice_model.g.dart'; - -@HiveType(typeId: 0) -class VoiceModel extends HiveObject { - @HiveField(0) - String name; - - @HiveField(1) - String path; - - @HiveField(2) - String? cover; - - VoiceModel({ - required this.name, - required this.path, - this.cover, - }); - - VoiceModel voiceModelFromJson(String str) => VoiceModel.fromJson(json.decode(str)); - - String voiceModelToJson(VoiceModel data) => json.encode(data.toJson()); - - VoiceModel copyWith({ - String? name, - String? path, - String? cover, - }) => - VoiceModel( - name: name ?? this.name, - path: path ?? this.path, - cover: cover ?? this.cover, - ); - - factory VoiceModel.fromJson(Map json) => VoiceModel( - name: json["name"], - path: json["path"], - cover: json["cover"], - ); - - Map toJson() => { - "name": name, - "path": path, - "cover": cover, - }; -} diff --git a/lib/data/models/voice_model.g.dart b/lib/data/models/voice_model.g.dart deleted file mode 100644 index d0ba131..0000000 --- a/lib/data/models/voice_model.g.dart +++ /dev/null @@ -1,47 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'voice_model.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class VoiceModelAdapter extends TypeAdapter { - @override - final int typeId = 0; - - @override - VoiceModel read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return VoiceModel( - name: fields[0] as String, - path: fields[1] as String, - cover: fields[2] as String?, - ); - } - - @override - void write(BinaryWriter writer, VoiceModel obj) { - writer - ..writeByte(3) - ..writeByte(0) - ..write(obj.name) - ..writeByte(1) - ..write(obj.path) - ..writeByte(2) - ..write(obj.cover); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is VoiceModelAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/lib/data/storage/favorite_data.dart b/lib/data/storage/favorite_data.dart deleted file mode 100644 index d1b062c..0000000 --- a/lib/data/storage/favorite_data.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/5/8 -// Description: 收藏数据 - -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/data/storage/hive_storage.dart'; - -class FavoriteData { - /// 私有构造函数 - FavoriteData._(); - - /// 静态常量用于保存类的唯一实例 - static final FavoriteData _instance = FavoriteData._(); - - /// 工厂构造函数返回类的唯一实例 - factory FavoriteData() { - return _instance; - } - - /// 声明盒子 - /// 注意, main函数中这个盒子已经打开, 可以进行存储操作 - final _box = getFavoriteBox(); - - /// 获取数据 - List getList() { - return _box.values.toList(); - } - - /// 添加数据 - Future addData(VoiceModel voiceModel) async { - return await _box.add(voiceModel); - } - - /// 删除 - Future delete(int index) async { - await _box.deleteAt(index); - await _box.flush(); - } - - /// 清空所有数据 - Future clear() async { - await _box.clear(); - await _box.flush(); - } -} diff --git a/lib/data/storage/my_voice_data.dart b/lib/data/storage/my_voice_data.dart deleted file mode 100644 index 3157d08..0000000 --- a/lib/data/storage/my_voice_data.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/5/8 -// Description: 收藏数据 - -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/data/storage/hive_storage.dart'; - -class MyVoiceData { - /// 私有构造函数 - MyVoiceData._(); - - /// 静态常量用于保存类的唯一实例 - static final MyVoiceData _instance = MyVoiceData._(); - - /// 工厂构造函数返回类的唯一实例 - factory MyVoiceData() { - return _instance; - } - - /// 声明盒子 - /// 注意, main函数中这个盒子已经打开, 可以进行存储操作 - final _box = getMyVoiceBox(); - - /// 获取数据 - List getList() { - return _box.values.toList(); - } - - /// 添加数据 - Future addData(VoiceModel voiceModel) async { - return await _box.add(voiceModel); - } - - /// 删除 - Future delete(index) async { - await _box.deleteAt(index); - await _box.flush(); - } - - /// 清空所有数据 - Future clear() async { - await _box.clear(); - await _box.flush(); - } -} diff --git a/lib/modules/musicoo/home/home_binding.dart b/lib/modules/musicoo/home/home_binding.dart deleted file mode 100644 index 0905989..0000000 --- a/lib/modules/musicoo/home/home_binding.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:get/get.dart'; - -import 'home_controller.dart'; - -class HomeBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => HomeController()); - } -} diff --git a/lib/modules/musicoo/home/home_controller.dart b/lib/modules/musicoo/home/home_controller.dart deleted file mode 100644 index 9f5a6fc..0000000 --- a/lib/modules/musicoo/home/home_controller.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:get/get.dart'; - -class HomeController extends GetxController { - -} diff --git a/lib/modules/musicoo/initial/initial_binding.dart b/lib/modules/musicoo/initial/initial_binding.dart deleted file mode 100644 index 0f64e36..0000000 --- a/lib/modules/musicoo/initial/initial_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/musicoo/initial/initial_controller.dart'; - -class InitialBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => InitialController()); - } -} diff --git a/lib/modules/musicoo/initial/initial_controller.dart b/lib/modules/musicoo/initial/initial_controller.dart deleted file mode 100644 index b6551af..0000000 --- a/lib/modules/musicoo/initial/initial_controller.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/musicoo/home/home_view.dart'; -import 'package:tone_snap/modules/musicoo/me/me_view.dart'; -import 'package:tone_snap/modules/musicoo/search_music/search_music_view.dart'; - -class InitialController extends GetxController { - static InitialController get to => Get.find(); - late PageController pageController; - final pages = [ - PageItem([Assets.musicooBnb1Unselected, Assets.musicooBnb1Selected], const HomeView()), - PageItem([Assets.musicooBnb2Unselected, Assets.musicooBnb2Selected], const SearchMusicView()), - PageItem([Assets.musicooBnb3Unselected, Assets.musicooBnb3Selected], const MeView()), - ]; - var currentIndex = 0.obs; - - @override - void onInit() { - super.onInit(); - pageController = PageController(initialPage: currentIndex.value); - } - - @override - void onClose() { - pageController.dispose(); - super.onClose(); - } - - Future onBottomAppBarItemChanged(int index) async { - // if (index == 1) { - // await PlayerController.to.stopPlay(); - // Get.toNamed(AppRoutes.uploadMethod); - // } else { - // if (index == 2) _refreshMe(); - // currentIndex.value = index; - // pageController.jumpToPage(index); - // } - currentIndex.value = index; - pageController.jumpToPage(index); - } -} - -class PageItem { - late final List icons; - late final StatelessWidget widget; - - PageItem(this.icons, this.widget); -} - diff --git a/lib/modules/musicoo/me/me_binding.dart b/lib/modules/musicoo/me/me_binding.dart deleted file mode 100644 index f0135d6..0000000 --- a/lib/modules/musicoo/me/me_binding.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:get/get.dart'; - -import 'me_controller.dart'; - -class MeBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => MeController()); - } -} diff --git a/lib/modules/musicoo/me/me_controller.dart b/lib/modules/musicoo/me/me_controller.dart deleted file mode 100644 index 8666234..0000000 --- a/lib/modules/musicoo/me/me_controller.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:get/get.dart'; - -class MeController extends GetxController { - -} diff --git a/lib/modules/musicoo/me/me_view.dart b/lib/modules/musicoo/me/me_view.dart deleted file mode 100644 index e037294..0000000 --- a/lib/modules/musicoo/me/me_view.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import 'me_controller.dart'; - -class MeView extends GetView { - const MeView({super.key}); - - @override - Widget build(BuildContext context) { - final controller = Get.find(); - - return Container(); - } -} diff --git a/lib/modules/musicoo/search_music/search_music_binding.dart b/lib/modules/musicoo/search_music/search_music_binding.dart deleted file mode 100644 index bf3c06c..0000000 --- a/lib/modules/musicoo/search_music/search_music_binding.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:get/get.dart'; - -import 'search_music_controller.dart'; - -class SearchMusicBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => SearchMusicController()); - } -} diff --git a/lib/modules/musicoo/search_music/search_music_controller.dart b/lib/modules/musicoo/search_music/search_music_controller.dart deleted file mode 100644 index e6e4993..0000000 --- a/lib/modules/musicoo/search_music/search_music_controller.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:get/get.dart'; - -class SearchMusicController extends GetxController { - -} diff --git a/lib/modules/musicoo/search_music/search_music_view.dart b/lib/modules/musicoo/search_music/search_music_view.dart deleted file mode 100644 index 07cf49e..0000000 --- a/lib/modules/musicoo/search_music/search_music_view.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import 'search_music_controller.dart'; - -class SearchMusicView extends GetView { - const SearchMusicView({super.key}); - - @override - Widget build(BuildContext context) { - final controller = Get.find(); - - return Container(); - } -} diff --git a/lib/modules/sideb/play_music/play_music_binding.dart b/lib/modules/sideb/play_music/play_music_binding.dart new file mode 100644 index 0000000..13b41b6 --- /dev/null +++ b/lib/modules/sideb/play_music/play_music_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'play_music_controller.dart'; + +class PlayMusicBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => PlayMusicController()); + } +} diff --git a/lib/modules/sideb/play_music/play_music_controller.dart b/lib/modules/sideb/play_music/play_music_controller.dart new file mode 100644 index 0000000..67e16d8 --- /dev/null +++ b/lib/modules/sideb/play_music/play_music_controller.dart @@ -0,0 +1,136 @@ +import 'package:get/get.dart'; +import 'package:tone_snap/components/base_easyloading.dart'; +import 'package:tone_snap/data/sideb/api/music_api.dart'; +import 'package:tone_snap/data/sideb/models/next_model.dart'; +import 'package:tone_snap/data/sideb/models/play_list_model.dart'; +import 'package:tone_snap/data/sideb/models/player_model.dart'; +import 'package:tone_snap/modules/sideb/controllers/music_player_controller.dart'; +import 'package:tone_snap/utils/obj_util.dart'; + +class PlayMusicController extends GetxController { + var musicPlayerController = MusicPlayerController.to; + + /// 当前播放的歌曲信息 + late String videoId; + late String playlistId; + var thumbnail = Rx(null); + var title = Rx(null); + var subTitle = Rx(null); + + /// 播放列表 + List playList = []; + + /// 当前播放的歌曲下标 + int currentIndex = 0; + + @override + void onInit() { + super.onInit(); + playlistId = Get.arguments['playlistId']; + videoId = Get.arguments['videoId']; + } + + @override + void onReady() async { + super.onReady(); + _next(); + } + + Future _next() async { + BaseEasyLoading.loading(); + NextModel? model = await MusicApi.next(playlistId: playlistId, videoId: videoId); + BaseEasyLoading.dismiss(); + if (model != null) { + var tabs = model.contents?.singleColumnMusicWatchNextResultsRenderer?.tabbedRenderer?.watchNextTabbedResultsRenderer?.tabs; + if (tabs != null && tabs.isNotEmpty) { + for (var i = 0; i < tabs.length; ++i) { + var o = tabs[i]; + if (i == 0) { + var contents = o.tabRenderer?.content?.musicQueueRenderer?.content?.playlistPanelRenderer?.contents; + if (contents != null && contents.isNotEmpty) { + for (var j = 0; j < contents.length; ++j) { + var playListModel = PlayListModel(); + var content = contents[j]; + // 封面 + var thumbnails = content.playlistPanelVideoRenderer?.thumbnail?.thumbnails; + if (thumbnails != null) { + playListModel.thumbnail = thumbnails.last.url; + } + + // 标题 + var runs = content.playlistPanelVideoRenderer?.title?.runs; + if (runs != null && runs.isNotEmpty) { + playListModel.title = runs[0].text; + } + + // 副标题 + var subRuns = content.playlistPanelVideoRenderer?.longBylineText?.runs; + if (subRuns != null && subRuns.isNotEmpty) { + playListModel.subTitle = subRuns.map((e) => e.text).join(); + } + + // videoId, playlistId + var watchEndpoint = content.playlistPanelVideoRenderer?.navigationEndpoint?.watchEndpoint; + if (watchEndpoint != null) { + playListModel.videoId = watchEndpoint.videoId; + playListModel.playlistId = watchEndpoint.playlistId; + } + playList.add(playListModel); + } + } + } + } + } + _getCurrentMusicInfo(); + _player(); + } + } + + /// 获取当前下标的歌曲信息 + void _getCurrentMusicInfo() { + if (playList.isNotEmpty) { + thumbnail.value = playList[currentIndex].thumbnail; + title.value = playList[currentIndex].title; + subTitle.value = playList[currentIndex].subTitle; + } + } + + Future _player() async { + if (playList.isEmpty) return; + BaseEasyLoading.loading(); + PlayerModel? model = await MusicApi.player(videoId: playList[currentIndex].videoId); + BaseEasyLoading.dismiss(); + if (model != null && model.streamingData != null) { + var formats = model.streamingData?.formats; + if (formats != null && playList.isNotEmpty) { + playList[currentIndex].url = formats[0].url ?? ''; + + // 开始播放 + musicPlayerController.playNewUrl(playList[currentIndex].url!, ObjUtil.getStr(playList[currentIndex].videoId)); + } + } + } + + /// 继续/暂停 + void playPause() { + musicPlayerController.playPause(); + } + + /// 上一首 + Future previousTrack() async { + if (currentIndex > 0) { + currentIndex--; + } + _getCurrentMusicInfo(); + _player(); + } + + /// 下一首 + Future nextTrack() async { + if (currentIndex < playList.length - 1) { + currentIndex++; + } + _getCurrentMusicInfo(); + _player(); + } +} diff --git a/lib/modules/sideb/play_music/play_music_view.dart b/lib/modules/sideb/play_music/play_music_view.dart new file mode 100644 index 0000000..e247438 --- /dev/null +++ b/lib/modules/sideb/play_music/play_music_view.dart @@ -0,0 +1,317 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:tone_snap/components/full_width_track_shape.dart'; +import 'package:tone_snap/components/my_marquee_text.dart'; +import 'package:tone_snap/components/network_image_widget.dart'; +import 'package:tone_snap/generated/assets.dart'; +import 'package:tone_snap/modules/sideb/widgets/music_appbar.dart'; +import 'package:tone_snap/res/themes/app_colors.dart'; +import 'package:tone_snap/utils/obj_util.dart'; + +import 'play_music_controller.dart'; + +class PlayMusicView extends StatelessWidget { + PlayMusicView({super.key}); + + final controller = Get.find(); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Obx(() { + return Visibility( + visible: ObjUtil.isNotEmptyStr(controller.thumbnail.value), + child: NetworkImageWidget( + url: controller.thumbnail.value, + width: 1.sw, + height: 1.sh, + placeholder: Container(), + errorWidget: Container(), + ), + ); + }), + _buildPageBg(), + Scaffold( + backgroundColor: Colors.transparent, + body: Column( + children: [ + _buildHeader(), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20).w, + child: Column( + children: [ + SizedBox(height: 12.h), + _buildCover(), + SizedBox(height: 36.h), + _buildMusicName(), + SizedBox(height: 24.h), + _processBar(context), + SizedBox(height: 100.h), + _buildPlayController(), + ], + ), + ), + ), + ], + ), + ) + ], + ); + } + + /// 页面占位背景 + Widget _buildPageBg() { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 50.0, sigmaY: 50.0), + child: Container( + width: 1.sw, + height: 1.sh, + color: const Color(0x26000000), + ), + ); + } + + /// 头部 + Widget _buildHeader() { + return MusicAppbar( + isDownBack: true, + isBackBorder: true, + actionOnTap: (){}, + titleWidget: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildMenuText('SONG', true), + Container( + width: 1.w, + height: 14.h, + color: const Color(0x73FFFFFF), + ), + _buildMenuText('LYRICS', false), + ], + ), + action: Image.asset( + Assets.sideBCrossCircle, + width: 24.w, + height: 24.w, + ), + ); + } + + /// 播放页/歌词页 + Widget _buildMenuText(String label, bool selected) { + return InkWell( + onTap: (){}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 15.5.w, vertical: 8.h), + child: Text( + label, + style: TextStyle( + color: Color(selected ? 0xD9FFFFFF : 0x73FFFFFF), + fontSize: 15.sp, + ), + ), + ), + ); + } + + /// 封面 + Widget _buildCover() { + return Obx(() { + return NetworkImageWidget( + url: controller.thumbnail.value, + width: 1.sw, + height: 330.h, + radius: 16.r, + ); + }); + } + + /// 歌名/作者信息、收藏、下载 + Widget _buildMusicName() { + return Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Obx(() { + return MyMarqueeText( + text: ObjUtil.getStr(controller.title.value), + textStyle: TextStyle( + color: const Color(0xD9FFFFFF), + fontSize: 22.sp, + ), + ); + }), + SizedBox(height: 6.h), + Obx(() { + return MyMarqueeText( + text: ObjUtil.getStr(controller.subTitle.value), + textStyle: TextStyle( + color: const Color(0x99EEEEEE), + fontSize: 12.sp, + ), + ); + }), + ], + ), + ), + SizedBox(width: 10.w), + Image.asset( + Assets.sideBLove, + width: 24.w, + height: 24.w, + ), + SizedBox(width: 20.w), + Image.asset( + Assets.sideBDownload, + width: 24.w, + height: 24.w, + ), + ], + ); + } + + /// 进度条 + Widget _processBar(BuildContext context) { + return Column( + children: [ + SliderTheme( + data: SliderTheme.of(context).copyWith( + activeTrackColor: sideBSeedColor, + inactiveTrackColor: const Color(0x4DFFFFFF), + secondaryActiveTrackColor: sideBSeedColor.withOpacity(0.3), + trackHeight: 3.h, + thumbColor: Colors.white, + thumbShape: RoundSliderThumbShape( + disabledThumbRadius: 7.w, + enabledThumbRadius: 7.w, + ), + trackShape: FullWidthTrackShape(), + ), + child: SizedBox( + width: 1.sw, + height: 7.w, + child: Obx(() { + return Slider( + value: controller.musicPlayerController.positionDuration.value.inSeconds.toDouble(), + secondaryTrackValue: controller.musicPlayerController.bufferedDuration.value.inSeconds.toDouble(), + min: 0, + max: controller.musicPlayerController.totalDuration.value.inSeconds.toDouble(), + onChanged: (value) => controller.musicPlayerController.seekToPosition(value), + onChangeStart: (value) => controller.musicPlayerController.seekStartEnd(0), + onChangeEnd: (value) => controller.musicPlayerController.seekStartEnd(1), + ); + }), + ), + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Obx(() { + return Text( + controller.musicPlayerController.getPositionDuration(), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xD9FFFFFF), + fontSize: 12.sp, + fontWeight: FontWeight.w500, + ), + ); + }), + ), + Flexible( + child: Obx(() { + return Text( + controller.musicPlayerController.getTotalDuration(), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0x99FFFFFF), + fontSize: 12.sp, + fontWeight: FontWeight.w500, + ), + ); + }), + ), + ], + ), + ], + ); + } + + /// 播放控制器 + Widget _buildPlayController() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: (){}, + child: Image.asset( + Assets.sideBListLoop, + width: 24.w, + height: 24.w, + ), + ), + GestureDetector( + onTap: controller.nextTrack, + child: Padding( + padding: const EdgeInsets.only(left: 20).w, + child: Image.asset( + Assets.sideBPreviousSong, + width: 20.w, + height: 20.w, + ), + ), + ), + GestureDetector( + onTap: controller.playPause, + child: ClipOval( + child: Container( + width: 66.w, + height: 66.w, + color: Colors.white, + child: FittedBox( + fit: BoxFit.none, + child: Obx(() { + return Image.asset( + controller.musicPlayerController.isPlaying.value ? Assets.sideBPausePlay : Assets.sideBStartPlay, + width: 26.w, + height: 26.w, + ); + }), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(right: 20).w, + child: GestureDetector( + onTap: controller.nextTrack, + child: Image.asset( + Assets.sideBNextSong, + width: 20.w, + height: 20.w, + ), + ), + ), + GestureDetector( + onTap: (){}, + child: Image.asset( + Assets.sideBPlayList, + width: 24.w, + height: 24.w, + ), + ), + ], + ); + } +} diff --git a/lib/modules/splash/splash_binding.dart b/lib/modules/sideb/splash/splash_binding.dart similarity index 68% rename from lib/modules/splash/splash_binding.dart rename to lib/modules/sideb/splash/splash_binding.dart index d89f924..71f96fb 100644 --- a/lib/modules/splash/splash_binding.dart +++ b/lib/modules/sideb/splash/splash_binding.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:tone_snap/modules/splash/splash_controller.dart'; +import 'package:tone_snap/modules/sideb/splash/splash_controller.dart'; class SplashBinding extends Bindings { @override diff --git a/lib/modules/sideb/splash/splash_controller.dart b/lib/modules/sideb/splash/splash_controller.dart new file mode 100644 index 0000000..cfefa3e --- /dev/null +++ b/lib/modules/sideb/splash/splash_controller.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tone_snap/data/app_config.dart'; +import 'package:tone_snap/data/models/base_model.dart'; +import 'package:tone_snap/data/sideb/api/tikustok_api.dart'; +import 'package:tone_snap/data/sideb/models/isocode_model.dart'; +import 'package:tone_snap/routes/app_routes.dart'; + +class SplashController extends GetxController with GetSingleTickerProviderStateMixin { + var processValue = 0.0.obs; + late AnimationController _controller; + late Animation _animation; + + @override + void onInit() { + super.onInit(); + _controller = AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + ); + + // 创建 Tween 并绑定到 AnimationController + _animation = Tween(begin: 0, end: 1).animate(_controller) + ..addListener(() { + processValue.value = _animation.value; + if (processValue.value >= 1) { + _openInitial(); + } + }); + + // 启动动画 + _controller.forward(); + } + + @override + void onReady() { + super.onReady(); + _getIp(); + } + + /// 获取所在区域、ip + Future _getIp() async { + BaseModel? model = await TikUsTokApi.getIp(); + if (model != null && model.success && model.data?.isoCode != null) { + AppConfig.isoCode = model.data!.isoCode!; + } + } + + @override + void onClose() { + _controller.dispose(); + super.onClose(); + } + + /// 打开初始页面 + void _openInitial() { + Get.offNamed(AppRoutes.initialB); + } +} diff --git a/lib/modules/splash/splash_view.dart b/lib/modules/sideb/splash/splash_view.dart similarity index 50% rename from lib/modules/splash/splash_view.dart rename to lib/modules/sideb/splash/splash_view.dart index cf491e7..46deafa 100644 --- a/lib/modules/splash/splash_view.dart +++ b/lib/modules/sideb/splash/splash_view.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/splash/splash_controller.dart'; -import 'package:tone_snap/res/values/strings.dart'; +import 'package:tone_snap/modules/sideb/splash/splash_controller.dart'; +import 'package:tone_snap/res/themes/app_colors.dart'; class SplashView extends StatelessWidget { SplashView({super.key}); @@ -12,38 +12,22 @@ class SplashView extends StatelessWidget { @override Widget build(BuildContext context) { - Get.find(); return Scaffold( body: Stack( children: [ - _buildIconName(), + _buildImageBg(), _buildProgress(), ], ), ); } - Widget _buildIconName() { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - Assets.iconAppIcon, - width: 96.w, - height: 96.w, - ), - SizedBox(height: 20.h), - Text( - appName, - style: TextStyle( - color: Colors.white, - fontSize: 22.sp, - fontWeight: FontWeight.w600, - ), - ), - ], - ), + Widget _buildImageBg() { + return Image.asset( + Assets.sideBLaunchImage, + width: 1.sw, + height: 1.sh, + fit: BoxFit.cover, ); } @@ -56,18 +40,22 @@ class SplashView extends StatelessWidget { children: [ SizedBox( width: 0.5.sw, - child: LinearProgressIndicator( - backgroundColor: Colors.white, - valueColor: const AlwaysStoppedAnimation(Colors.grey), - borderRadius: BorderRadius.circular(8), - ), + child: Obx(() { + return LinearProgressIndicator( + value: controller.processValue.value, + backgroundColor: Colors.white, + valueColor: const AlwaysStoppedAnimation(sideBSeedColor), + borderRadius: BorderRadius.circular(8).r, + ); + }), ), SizedBox(height: 14.h), Text( 'Resource Loading...', style: TextStyle( color: Colors.white, - fontSize: 12.sp, + fontSize: 14.sp, + fontWeight: FontWeight.w500, ), ), ], diff --git a/lib/modules/splash/splash_controller.dart b/lib/modules/splash/splash_controller.dart deleted file mode 100644 index bb7e30e..0000000 --- a/lib/modules/splash/splash_controller.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:async'; -import 'package:get/get.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class SplashController extends GetxController { - Timer? _timer; - int _timeCount = 1; - - @override - void onInit() { - super.onInit(); - _startTimer(); - } - - @override - void onClose() { - _stopTimer(); - super.onClose(); - } - - /// 开始定时器 - void _startTimer() { - _timer = Timer.periodic(const Duration(seconds: 1), (Timer t) { - if (_timeCount <= 0) { - _openInitial(); - return; - } - _timeCount--; - }); - } - - /// 停止定时器 - void _stopTimer() { - _timer?.cancel(); - _timer = null; - } - - /// 打开初始页面 - void _openInitial() { - _stopTimer(); - Get.offNamed(AppRoutes.initial); - } -} diff --git a/lib/modules/voice/about/about_binding.dart b/lib/modules/voice/about/about_binding.dart deleted file mode 100644 index 52fdf9c..0000000 --- a/lib/modules/voice/about/about_binding.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:get/get.dart'; - -import 'about_controller.dart'; - -class AboutBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => AboutController()); - } -} diff --git a/lib/modules/voice/about/about_controller.dart b/lib/modules/voice/about/about_controller.dart deleted file mode 100644 index a939f51..0000000 --- a/lib/modules/voice/about/about_controller.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:get/get.dart'; -import 'package:package_info_plus/package_info_plus.dart'; - -class AboutController extends GetxController { - var versionName = ''.obs; - - @override - void onReady() { - super.onReady(); - _getVersion(); - } - - /// 获取版本号 - void _getVersion() async { - final packageInfo = await PackageInfo.fromPlatform(); - versionName.value = 'App Version:${packageInfo.version}'; - } -} diff --git a/lib/modules/voice/about/about_view.dart b/lib/modules/voice/about/about_view.dart deleted file mode 100644 index af37a10..0000000 --- a/lib/modules/voice/about/about_view.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/navigation_bar/base_appbar.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/about/about_controller.dart'; -import 'package:tone_snap/res/values/strings.dart'; - -class AboutView extends StatelessWidget { - AboutView({super.key}); - - final controller = Get.find(); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: const BaseAppBar('About'), - body: Container( - alignment: Alignment.topCenter, - child: Column( - children: [ - SizedBox(height: 60.h), - Image.asset( - Assets.iconAppIcon, - width: 120.w, - height: 120.w, - ), - SizedBox(height: 20.h), - Obx(() { - return RichText( - maxLines: 2, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.center, - text: TextSpan( - text: appName, - style: TextStyle( - color: Colors.white, - fontSize: 22.sp, - fontWeight: FontWeight.w600, - ), - children: [ - TextSpan( - text: '\n${controller.versionName.value}', - style: TextStyle( - color: Colors.white, - fontSize: 12.sp, - fontWeight: FontWeight.w600, - ), - ), - WidgetSpan( - child: SizedBox(height: 20.h), - ), - ], - ), - ); - }), - ], - ), - ), - ); - } -} diff --git a/lib/modules/voice/change_voice/change_voice_binding.dart b/lib/modules/voice/change_voice/change_voice_binding.dart deleted file mode 100644 index 137acc7..0000000 --- a/lib/modules/voice/change_voice/change_voice_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/change_voice/change_voice_controller.dart'; - -class ChangeVoiceBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => ChangeVoiceController()); - } -} diff --git a/lib/modules/voice/change_voice/change_voice_controller.dart b/lib/modules/voice/change_voice/change_voice_controller.dart deleted file mode 100644 index fc2701c..0000000 --- a/lib/modules/voice/change_voice/change_voice_controller.dart +++ /dev/null @@ -1,191 +0,0 @@ -import 'package:ffmpeg_kit_flutter_audio/ffmpeg_kit.dart'; -import 'package:ffmpeg_kit_flutter_audio/ffmpeg_session.dart'; -import 'package:ffmpeg_kit_flutter_audio/return_code.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/base_easyloading.dart'; -import 'package:tone_snap/controllers/player_controller.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/data/storage/my_voice_data.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; -import 'package:tone_snap/routes/app_routes.dart'; -import 'package:tone_snap/utils/date_util.dart'; -import 'package:tone_snap/utils/file_util.dart'; -import 'package:tone_snap/utils/local_path_util.dart'; -import 'package:tone_snap/utils/log_print.dart'; -import 'package:tone_snap/utils/obj_util.dart'; - -class ChangeVoiceController extends GetxController { - var timberList = [ - // Timber('Child', Assets.coverChild, 1.3, 1.1), - // Timber('Boy', Assets.coverBoy, 1.2, 1.1), - // Timber('Man', Assets.coverMan, 0.9, 1.1), - // Timber('Elder', Assets.coverElder, 0.75, 1.333), - // Timber('Robot', Assets.coverRobot, 1.0, 1.5), - // Timber('Girl', Assets.coverGirl, 1.5, 0.6667), - // Timber('Sexy', Assets.coverSexy, 1.25, 0.8), - // Timber('Woman', Assets.coverWoman, 1.25, 0.8), - // Timber('Monsters', Assets.coverMonsters, 0.7, 1.1), - - Timber('Original', Assets.coverOriginal, 1.0, 1.0, check: true), - Timber('Fast', Assets.coverFast, 1.0, 1.5), - Timber('Slow', Assets.coverSlow, 1.0, 0.5), - Timber('Flash', Assets.coverFlash, 1.0, 2.0), - Timber('Baby', Assets.coverChild, 1.3, 0.76), - Timber('Robot', Assets.coverRobot, 1.0, 1.25), - Timber('Monsters', Assets.coverMonsters, 0.60, 1.1), - Timber('DIY', Assets.coverDIY, 1.0, 1.0), - ].obs; - var currentIndex = 0.obs; - final playerController = PlayerController.to; - var toneValue = 1.0.obs; - var soundSpeedValue = 1.0.obs; - late String filePath; - - @override - void onInit() { - super.onInit(); - filePath = Get.arguments; - // playerController.setFilePath(filePath); - } - - @override - void onClose() async { - // if (Platform.isAndroid) await playerController.setPitch(1.0); - // await playerController.setSpeed(1.0); - // playerController.stopPlay(); - super.onClose(); - } - - void onTapItem(Timber item, int index) { - for (var e in timberList) { - // e == item ? item.check = !item.check : e.check = false; - e.check = false; - } - item.check = true; - currentIndex.value = index; - toneValue.value = item.check ? item.tone : 1.0; - soundSpeedValue.value = item.check ? item.soundSpeed : 1.0; - // if (Platform.isAndroid) playerController.setPitch(toneValue.value); - // playerController.setSpeed(soundSpeedValue.value); - timberList.refresh(); - } - - /// 开始/暂停播放 - Future togglePlayback() async { - if (playerController.isPlaying.value) { - await playerController.pausePlay(); - } else { - await playerController.startPlay(); - } - } - - void onChanged(double value, int type) { - // var item = timberList.firstWhereOrNull((e) => e.check); - if (type == 0) { - toneValue.value = value; - // if (Platform.isAndroid) playerController.setPitch(toneValue.value); - // if (item?.tone.toString() != NumUtil.formatNum(value)) { - // item?.check = false; - // timberList.refresh(); - // } - } else { - soundSpeedValue.value = value; - // playerController.setSpeed(soundSpeedValue.value); - // if (item?.soundSpeed.toString() != NumUtil.formatNum(value)) { - // item?.check = false; - // timberList.refresh(); - // } - } - } - - /// 保存 - Future save() async { - // 停止播放 - if (playerController.isPlaying.value) playerController.stopPlay(); - BaseEasyLoading.loading(); - - try { - // 若是assets路径,转换为文件路径 - if (filePath.contains('assets')) { - filePath = await FileUtil.getAssetsToFilePath(filePath); - } - - // 输出目录 - final outputDir = await LocalPathUtil.getVoiceChangeOutputDir(); - String fileName = '${DateUtil.getNowTimeStr().replaceAll(' ', '_')}_output.mp3'; - String outputPath = '${outputDir.path}/$fileName'; - - var filter = ""; - // var timber = timberList.firstWhereOrNull((e) => e.check); - // if (timber != null) { - // int index = timberList.indexOf(timber); - // if (index == 5) filter = ",afftdn=nf=-30"; - // } - - if (currentIndex.value == 5) filter = ",afftdn=nf=-30,aecho=0.8:0.88:60:0.4"; - - // 获取原始采样率 - String sampleRate = await _getSampleRate() ?? '24000'; - - // 构建 FFmpeg 命令 - final String command = '-i $filePath -af "asetrate=$sampleRate*${toneValue.value},atempo=${soundSpeedValue.value}$filter" $outputPath'; - - // 执行 FFmpeg 命令 - FFmpegSession session = await FFmpegKit.execute(command); - - // 获取执行结果 - final returnCode = await session.getReturnCode(); - if (ReturnCode.isSuccess(returnCode)) { - LogPrint.d('Audio processing successful'); - try { - await MyVoiceData().addData(VoiceModel(name: fileName, path: outputPath)); - BaseEasyLoading.toast('Save successful'); - - // 回到首页-我的页面 - Get.until((route) => route.settings.name == AppRoutes.changeVoiceInitial); - VoiceInitialController.to.onBottomAppBarItemChanged(2); - } catch (e) { - BaseEasyLoading.toast('Save failed'); - } - } else { - LogPrint.d('Audio processing failed'); - BaseEasyLoading.toast('Audio processing failed'); - } - } catch (e) { - BaseEasyLoading.toast('Audio processing failed'); - } - } - - /// 获取音频的采样率 - Future _getSampleRate() async { - String? sampleRate; - String ffmpegCommand = '-i $filePath'; - FFmpegSession session = await FFmpegKit.execute(ffmpegCommand); - final output = await session.getOutput(); - if (ObjUtil.isNotEmpty(output)) { - // 使用正则表达式提取采样率 - final regex = RegExp(r'(\d+) Hz'); - final match = regex.firstMatch(output!); - if (match != null) { - sampleRate = match.group(1); - LogPrint.d('采样率: $sampleRate Hz'); - } else { - LogPrint.e('未找到采样率'); - } - } else { - LogPrint.e('获取采样率失败'); - } - return sampleRate; - } -} - -class Timber { - late final String name; - late final String cover; - late final double tone; - late final double soundSpeed; - bool check; - - Timber(this.name, this.cover, this.tone, this.soundSpeed, {this.check = false}); -} \ No newline at end of file diff --git a/lib/modules/voice/change_voice/change_voice_view.dart b/lib/modules/voice/change_voice/change_voice_view.dart deleted file mode 100644 index 2241a4b..0000000 --- a/lib/modules/voice/change_voice/change_voice_view.dart +++ /dev/null @@ -1,321 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/my_marquee_text.dart'; -import 'package:tone_snap/components/navigation_bar/base_appbar.dart'; -import 'package:tone_snap/components/round_rect_slider_thumb_shape.dart'; -import 'package:tone_snap/components/round_rect_slider_track_shape.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/change_voice/change_voice_controller.dart'; -import 'package:tone_snap/utils/num_util.dart'; - -class ChangeVoiceView extends StatelessWidget { - ChangeVoiceView({super.key}); - - final controller = Get.find(); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - Image.asset( - Assets.changeVoiceChangeVoiceBg, - width: 1.sw, - height: 1.sh, - fit: BoxFit.fill, - ), - Scaffold( - backgroundColor: Colors.transparent, - appBar: const BaseAppBar('Change voice', backgroundColor: Colors.transparent), - body: Column( - children: [ - Expanded( - child: _buildTimber(), - ), - SizedBox(height: 20.h), - _buildSlider(context, 0), - SizedBox(height: 20.h), - _buildSlider(context, 1), - SizedBox(height: 20.h), - // _buildPlayer(), - _buildSave(), - ], - ), - ), - ], - ); - } - - Widget _buildTimber() { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 12.h), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24).w, - child: Text( - 'Timber', - style: TextStyle( - color: Colors.white, - fontSize: 20.sp, - fontWeight: FontWeight.w700, - ), - ), - ), - SizedBox(height: 16.h), - Obx(() { - return Expanded( - child: GridView.builder( - itemCount: controller.timberList.length, - padding: EdgeInsets.symmetric(horizontal: 24.w), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, - mainAxisSpacing: 10.h, - crossAxisSpacing: 0.w, - childAspectRatio: 102/130, - ), - itemBuilder: (context, index) { - return _buildItem(controller.timberList[index], index); - }, - ), - ); - }), - ], - ); - } - - Widget _buildItem(Timber item, int index) { - return GestureDetector( - onTap: () => controller.onTapItem(item, index), - child: Column( - children: [ - Stack( - alignment: Alignment.center, - clipBehavior: Clip.none, - children: [ - Visibility( - visible: item.check, - maintainState: true, - maintainAnimation: true, - maintainSize: true, - child: Image.asset( - Assets.changeVoiceChangeVoiceItemFrame, - width: 78.w, - height: 78.w, - fit: BoxFit.fill, - ), - ), - ClipRRect( - borderRadius: BorderRadius.circular(64.w/2), - child: Image.asset( - item.cover, - width: 64.w, - height: 64.w, - fit: BoxFit.cover, - ), - ), - Visibility( - visible: item.check, - child: Positioned( - right: 0.w, - bottom: 0.h, - child: Image.asset( - Assets.changeVoiceChangeVoiceItemSelected, - width: 23.w, - height: 23.w, - fit: BoxFit.fill, - ), - ), - ), - ], - ), - SizedBox(height: 4.h), - Expanded( - child: MyMarqueeText( - text: item.name.toString(), - textStyle: TextStyle( - color: Colors.white, - fontSize: 16.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ), - ); - } - - Widget _buildSlider(BuildContext context, int type) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 24).w, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - type == 0 ? 'Tone' : 'Sound speed', - style: TextStyle( - color: Colors.white, - fontSize: 20.sp, - fontWeight: FontWeight.w700, - ), - ), - SizedBox(height: 16.h), - Row( - children: [ - Expanded( - child: Obx(() { - return SliderTheme( - data: SliderTheme.of(context).copyWith( - activeTrackColor: const Color(0x33000000), - inactiveTrackColor: const Color(0x33000000), - trackShape: RoundRectSliderTrackShape( - trackHeight: 20.h, - trackRadius: 12.r, - ), - thumbShape: RoundRectSliderThumbShape( - thumbWidth: 32.w, - thumbHeight: 44.h, - thumbRadius: 12.r, - thumbColor: controller.currentIndex.value == controller.timberList.length - 1 ? Colors.black : const Color(0x33000000), - ), - ), - child: Slider( - min: 0.5, - max: 2, - value: type == 0 ? controller.toneValue.value : controller.soundSpeedValue.value, - onChanged: controller.currentIndex.value == controller.timberList.length - 1 ? (value) => controller.onChanged(value, type) : null, - ), - ); - }), - ), - SizedBox(width: 20.w), - Obx(() { - return SizedBox( - width: 40.w, - child: Text( - type == 0 ? NumUtil.formatNum(controller.toneValue.value) : NumUtil.formatNum(controller.soundSpeedValue.value), - style: TextStyle( - color: const Color(0x73000000), - fontSize: 16.sp, - fontWeight: FontWeight.w600, - ), - ), - ); - }), - ], - ), - ], - ), - ); - } - - Widget _buildPlayer() { - return Row( - children: [ - SizedBox(width: 24.w), - GestureDetector( - onTap: controller.togglePlayback, - child: ClipOval( - child: Container( - width: 54.w, - height: 54.w, - color: Colors.black, - child: Center( - child: Obx(() { - return Image.asset( - controller.playerController.isPlaying.value ? Assets.changeVoicePlaying1 : Assets.changeVoiceNotPlayed1, - width: 29.w, - height: 29.w, - ); - }), - ), - ), - ), - ), - SizedBox(width: 16.w), - Expanded( - child: Column( - children: [ - SizedBox(height: 17.h), - ClipRRect( - borderRadius: BorderRadius.circular(6.5), - child: Obx(() { - return LinearProgressIndicator( - value: controller.playerController.positionValue.value, - valueColor: const AlwaysStoppedAnimation(Colors.black), - backgroundColor: const Color(0x40000000), - borderRadius: BorderRadius.circular(6.5), - minHeight: 12.h, - ); - }), - ), - SizedBox(height: 8.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Obx(() { - return Text( - controller.playerController.getPositionDuration(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: const Color(0x73000000), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ); - }), - ), - Flexible( - child: Obx(() { - return Text( - controller.playerController.getDuration(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: const Color(0x73000000), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ); - }), - ), - ], - ), - ], - ), - ), - SizedBox(width: 34.w), - ], - ); - } - - Widget _buildSave() { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 24).h, - child: ClipRRect( - borderRadius: BorderRadius.circular(26.5), - child: Material( - color: Colors.black, - child: InkWell( - onTap: controller.save, - child: Container( - width: 229.w, - height: 53.h, - alignment: Alignment.center, - child: Text( - 'Save', - style: TextStyle( - color: Colors.white, - fontSize: 24.sp, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - ); - } -} \ No newline at end of file diff --git a/lib/modules/voice/favourite/favourite_binding.dart b/lib/modules/voice/favourite/favourite_binding.dart deleted file mode 100644 index ac01b4a..0000000 --- a/lib/modules/voice/favourite/favourite_binding.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:get/get.dart'; - -import 'favourite_controller.dart'; - -class FavouriteBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => FavouriteController()); - } -} diff --git a/lib/modules/voice/favourite/favourite_controller.dart b/lib/modules/voice/favourite/favourite_controller.dart deleted file mode 100644 index dfdcac9..0000000 --- a/lib/modules/voice/favourite/favourite_controller.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/base_easyloading.dart'; -import 'package:tone_snap/components/dialog/remind_dialog.dart'; -import 'package:tone_snap/components/dialog/rename_dialog.dart'; -import 'package:tone_snap/components/view_state_widget.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/data/storage/favorite_data.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class FavouriteController extends GetxController { - static FavouriteController get to => Get.find(); - var scrollController = ScrollController(); - var voiceList = [].obs; - var viewState = ViewState.loading.obs; - - @override - void onReady() { - super.onReady(); - getData(); - } - - void getData() { - voiceList.value = FavoriteData().getList().reversed.toList(); - _refreshList(); - } - - void _refreshList() { - viewState.value = voiceList.isNotEmpty ? ViewState.normal : ViewState.empty; - voiceList.refresh(); - } - - void onTapItem(VoiceModel item) { - VoiceInitialController.to.currentPlayVoiceModel.value = item; - Get.toNamed(AppRoutes.playSound, arguments: item); - } - - void onTapReName(VoiceModel item) { - Get.dialog( - barrierDismissible: true, - RenameDialog( - name: item.name, - confirmOnTap: (value) { - item.name = value; - item.save(); - voiceList.refresh(); - - // 若 item 和当前正播放的 item 是同个对象,则需要同步修改 - if (item.path == VoiceInitialController.to.currentPlayVoiceModel.value?.path) { - VoiceInitialController.to.currentPlayVoiceModel.update((e) => e?.name = value); - } - }, - ), - ); - } - - void onTapDelete(VoiceModel item) { - Get.dialog( - barrierDismissible: false, - RemindDialog( - content: 'Are you sure to delete it?', - confirmOnTap: () async { - BaseEasyLoading.loading(); - await item.delete(); - voiceList.remove(item); - BaseEasyLoading.toast('Removed'); - - // 若 item 和当前正播放的 item 是同个对象,则需要同步修改 - if (item.path == VoiceInitialController.to.currentPlayVoiceModel.value?.path) { - VoiceInitialController.to.isFavourite.value = false; - } - _refreshList(); - }, - ), - ); - } -} diff --git a/lib/modules/voice/favourite/favourite_view.dart b/lib/modules/voice/favourite/favourite_view.dart deleted file mode 100644 index 379493b..0000000 --- a/lib/modules/voice/favourite/favourite_view.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/private/my_voice_item.dart'; -import 'package:tone_snap/components/view_state_widget.dart'; -import 'package:tone_snap/modules/voice/favourite/favourite_controller.dart'; - -class FavouriteView extends GetView { - const FavouriteView({super.key}); - - @override - Widget build(BuildContext context) { - Get.put(FavouriteController()); - return Obx(() { - return ViewStateWidget( - viewState: controller.viewState.value, - child: MediaQuery.removePadding( - context: context, - removeTop: true, - child: Scrollbar( - controller: controller.scrollController, - child: ListView.builder( - controller: controller.scrollController, - itemCount: controller.voiceList.length, - padding: EdgeInsets.symmetric(vertical: 16.h), - itemBuilder: (context, index) { - var item = controller.voiceList[index]; - return MyVoiceItem( - item: item, - onTapItem: () => controller.onTapItem(item), - onReName: () => controller.onTapReName(item), - onDelete: () => controller.onTapDelete(item), - ); - }, - ), - ), - ), - ); - }); - } -} diff --git a/lib/modules/voice/my_voice/my_voice_binding.dart b/lib/modules/voice/my_voice/my_voice_binding.dart deleted file mode 100644 index 2851544..0000000 --- a/lib/modules/voice/my_voice/my_voice_binding.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:get/get.dart'; - -import 'my_voice_controller.dart'; - -class MyVoiceBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => MyVoiceController()); - } -} diff --git a/lib/modules/voice/my_voice/my_voice_controller.dart b/lib/modules/voice/my_voice/my_voice_controller.dart deleted file mode 100644 index 6509186..0000000 --- a/lib/modules/voice/my_voice/my_voice_controller.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/base_easyloading.dart'; -import 'package:tone_snap/components/dialog/remind_dialog.dart'; -import 'package:tone_snap/components/dialog/rename_dialog.dart'; -import 'package:tone_snap/components/view_state_widget.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/data/storage/my_voice_data.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class MyVoiceController extends GetxController { - static MyVoiceController get to => Get.find(); - var scrollController = ScrollController(); - var voiceList = [].obs; - var viewState = ViewState.loading.obs; - - @override - void onReady() { - super.onReady(); - getData(); - } - - void getData() { - voiceList.value = MyVoiceData().getList().reversed.toList(); - _refreshList(); - } - - void _refreshList() { - viewState.value = voiceList.isNotEmpty ? ViewState.normal : ViewState.empty; - voiceList.refresh(); - } - - void onTapItem(VoiceModel item) { - VoiceInitialController.to.currentPlayVoiceModel.value = item; - Get.toNamed(AppRoutes.playSound, arguments: item); - } - - void onTapReName(VoiceModel item) { - Get.dialog( - barrierDismissible: true, - RenameDialog( - name: item.name, - confirmOnTap: (value) { - item.name = value; - item.save(); - voiceList.refresh(); - - // 若 item 和当前正播放的 item 是同个对象,则需要同步改名 - if (identical(item, VoiceInitialController.to.currentPlayVoiceModel.value)) { - VoiceInitialController.to.currentPlayVoiceModel.update((e) => e?.name = value); - } - }, - ), - ); - } - - void onTapDelete(VoiceModel item) { - Get.dialog( - barrierDismissible: false, - RemindDialog( - content: 'Are you sure to delete it?', - confirmOnTap: () async { - BaseEasyLoading.loading(); - await item.delete(); - voiceList.remove(item); - BaseEasyLoading.toast('Removed'); - _refreshList(); - }, - ), - ); - } -} diff --git a/lib/modules/voice/my_voice/my_voice_view.dart b/lib/modules/voice/my_voice/my_voice_view.dart deleted file mode 100644 index 44d0b2e..0000000 --- a/lib/modules/voice/my_voice/my_voice_view.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/private/my_voice_item.dart'; -import 'package:tone_snap/components/view_state_widget.dart'; -import 'package:tone_snap/modules/voice/my_voice/my_voice_controller.dart'; - -class MyVoiceView extends GetView { - const MyVoiceView({super.key}); - - @override - Widget build(BuildContext context) { - Get.put(MyVoiceController()); - return Obx(() { - return ViewStateWidget( - viewState: controller.viewState.value, - child: MediaQuery.removePadding( - context: context, - removeTop: true, - child: Scrollbar( - controller: controller.scrollController, - child: ListView.builder( - controller: controller.scrollController, - itemCount: controller.voiceList.length, - padding: EdgeInsets.symmetric(vertical: 16.h), - itemBuilder: (context, index) { - var item = controller.voiceList[index]; - return MyVoiceItem( - item: item, - onTapItem: () => controller.onTapItem(item), - onReName: () => controller.onTapReName(item), - onDelete: () => controller.onTapDelete(item), - ); - }, - ), - ), - ), - ); - }); - } -} diff --git a/lib/modules/voice/play_sound/play_sound_binding.dart b/lib/modules/voice/play_sound/play_sound_binding.dart deleted file mode 100644 index ed6dde1..0000000 --- a/lib/modules/voice/play_sound/play_sound_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/play_sound/play_sound_controller.dart'; - -class PlaySoundBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => PlaySoundController()); - } -} diff --git a/lib/modules/voice/play_sound/play_sound_controller.dart b/lib/modules/voice/play_sound/play_sound_controller.dart deleted file mode 100644 index 49853a6..0000000 --- a/lib/modules/voice/play_sound/play_sound_controller.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'dart:async'; - -import 'package:get/get.dart'; -import 'package:tone_snap/controllers/player_controller.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class PlaySoundController extends GetxController { - var playerController = PlayerController.to; - late VoiceModel voiceModel; - - @override - void onInit() { - super.onInit(); - voiceModel = Get.arguments; - } - - @override - void onReady() { - super.onReady(); - VoiceInitialController.to.isFavourite.value = VoiceInitialController.to.getIsFavouriteModel() != null; - if (playerController.filePath != voiceModel.path || playerController.isCompleted.value) { - Future.delayed(const Duration(milliseconds: 200), () async { - // 初始化操作 - await playerController.setFilePath(voiceModel.path); - await playerController.startPlay(); - }); - } - } - - Future togglePlayback() async { - playerController.isPlaying.value - ? await playerController.pausePlay() - : await playerController.startPlay(); - } - - void goChangeVoice() async { - await PlayerController.to.stopPlay(); - Get.toNamed(AppRoutes.changeVoice, arguments: voiceModel.path); - } -} diff --git a/lib/modules/voice/play_sound/play_sound_view.dart b/lib/modules/voice/play_sound/play_sound_view.dart deleted file mode 100644 index 7f6fcbb..0000000 --- a/lib/modules/voice/play_sound/play_sound_view.dart +++ /dev/null @@ -1,230 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/my_marquee_text.dart'; -import 'package:tone_snap/components/navigation_bar/base_appbar.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/play_sound/play_sound_controller.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; -import 'package:tone_snap/utils/obj_util.dart'; - -class PlaySoundView extends StatelessWidget { - PlaySoundView({super.key}); - - final controller = Get.find(); - - @override - Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Image.asset( - Assets.changeVoicePlaySoundBg, - width: 1.sw, - height: 1.sh, - fit: BoxFit.fill, - ), - Scaffold( - backgroundColor: Colors.transparent, - appBar: BaseAppBar('', backWidget: _buildBackWidget(), backgroundColor: Colors.transparent), - body: SizedBox( - width: 1.sw, - child: Column( - children: [ - _buildCover(), - SizedBox(height: 60.h), - _buildVoiceName(), - SizedBox(height: 32.h), - _buildProgressBar(), - SizedBox(height: 50.h), - _buildControlMenu(), - SizedBox(height: 50.h), - ], - ), - ), - ), - ], - ); - } - - Widget _buildBackWidget() { - return ClipOval( - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: Get.back, - child: Padding( - padding: const EdgeInsets.all(10).w, - child: Image.asset( - Assets.changeVoiceArrowDownBack, - width: 24.w, - height: 24.w, - ), - ), - ), - ), - ); - } - - Widget _buildCover() { - return Expanded( - child: Visibility( - visible: ObjUtil.isNotEmptyStr(controller.voiceModel.cover), - replacement: SizedBox( - width: 296.w, - height: 296.w, - child: FittedBox( - fit: BoxFit.none, - child: Image.asset( - Assets.changeVoiceVoiceDefault, - width: 200.w, - height: 200.w, - fit: BoxFit.contain, - ), - ), - ), - child: FittedBox( - fit: BoxFit.none, - child: ClipRRect( - borderRadius: BorderRadius.circular(31), - child: Image.asset( - '${controller.voiceModel.cover}', - width: 296.w, - height: 296.w, - fit: BoxFit.cover, - ), - ), - ), - ), - ); - } - - Widget _buildVoiceName() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16).w, - child: MyMarqueeText( - text: controller.voiceModel.name, - textStyle: TextStyle( - color: Colors.black, - fontSize: 24.sp, - fontWeight: FontWeight.bold, - ), - ), - ); - } - - Widget _buildProgressBar() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16).w, - child: Column( - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(6.5), - child: Obx(() { - return LinearProgressIndicator( - value: controller.playerController.positionValue.value, - valueColor: const AlwaysStoppedAnimation(Colors.black), - backgroundColor: const Color(0x40000000), - borderRadius: BorderRadius.circular(6.5), - minHeight: 12.h, - ); - }), - ), - SizedBox(height: 6.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Obx(() { - return Text( - controller.playerController.getPositionDuration(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: const Color(0x73000000), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ); - }), - ), - Flexible( - child: Obx(() { - return Text( - controller.playerController.getDuration(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: const Color(0x73000000), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ); - }), - ), - ], - ), - ], - ), - ); - } - - Widget _buildControlMenu() { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: VoiceInitialController.to.onTapFavourite, - child: ClipOval( - child: Container( - width: 52.w, - height: 52.w, - color: Colors.black, - child: Obx(() { - return Image.asset( - VoiceInitialController.to.isFavourite.value ? Assets.changeVoiceFavorite : Assets.changeVoiceNotFavorite, - width: 28.w, - height: 28.w, - ); - }), - ), - ), - ), - SizedBox(width: 30.w), - GestureDetector( - onTap: controller.togglePlayback, - child: ClipOval( - child: Container( - width: 76.w, - height: 76.w, - color: Colors.black, - child: Obx(() { - return Image.asset( - controller.playerController.isPlaying.value ? Assets.changeVoicePlaying1 : Assets.changeVoiceNotPlayed1, - width: 38.w, - height: 38.w, - ); - }), - ), - ), - ), - SizedBox(width: 30.w), - GestureDetector( - onTap: controller.goChangeVoice, - child: ClipOval( - child: Container( - width: 52.w, - height: 52.w, - color: Colors.black, - child: Image.asset( - Assets.changeVoiceChangeVoice, - width: 28.w, - height: 28.w, - ), - ), - ), - ), - ], - ); - } -} diff --git a/lib/modules/voice/record_sound/record_sound_binding.dart b/lib/modules/voice/record_sound/record_sound_binding.dart deleted file mode 100644 index 008e1f1..0000000 --- a/lib/modules/voice/record_sound/record_sound_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/record_sound/record_sound_controller.dart'; - -class RecordSoundBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => RecordSoundController()); - } -} diff --git a/lib/modules/voice/record_sound/record_sound_controller.dart b/lib/modules/voice/record_sound/record_sound_controller.dart deleted file mode 100644 index 8ec2736..0000000 --- a/lib/modules/voice/record_sound/record_sound_controller.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter_sound/flutter_sound.dart'; -import 'package:get/get.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:tone_snap/routes/app_routes.dart'; -import 'package:tone_snap/utils/date_util.dart'; -import 'package:tone_snap/utils/local_path_util.dart'; -import 'package:tone_snap/utils/permission_util.dart'; - -class RecordSoundController extends GetxController { - final _recorder = FlutterSoundRecorder(); - - /// isStopped:0, isPaused:1, isRecording:2 - var recorderState = 0.obs; - - /// 录音文件路径 - var _filePath = ''; - - /// 计时器 - Timer? _timer; - var recordDuration = 0.obs; - - @override - void onInit() async { - super.onInit(); - await _recorder.openRecorder(); - } - - @override - void onClose() { - _stopTimer(); - _recorder.closeRecorder(); - super.onClose(); - } - - void onTapRecord() { - recorderState.value == 2 ? pauseRecording() : (recorderState.value == 1 ? resumeRecording() : startRecording()); - } - - /// 开始录音 - Future startRecording() async { - bool result = await PermissionUtil.checkPermission([Permission.microphone]); - if (!result) return; - - Directory dir = await LocalPathUtil.getRecordingsDir(); - String path = '${dir.path}/${DateUtil.getNowTimestamp()}${ext[Codec.pcm16WAV.index]}'; - - recordDuration.value = 0; - await _recorder.startRecorder( - toFile: path, - codec: Codec.pcm16WAV, - bitRate: 16000, - numChannels: 1, - sampleRate: 44100, - ); - _startTimer(); - recorderState.value = 2; - _filePath = path; - } - - /// 恢复暂停的录音 - Future resumeRecording() async { - await _recorder.resumeRecorder(); - _startTimer(); - recorderState.value = 2; - } - - /// 暂停录音 - Future pauseRecording() async { - await _recorder.pauseRecorder(); - _stopTimer(); - recorderState.value = 1; - } - - /// 停止录音 - Future stopRecording() async { - await _recorder.stopRecorder(); - _stopTimer(); - recorderState.value = 0; - } - - /// 开始定时器 - void _startTimer() { - _timer = Timer.periodic(const Duration(seconds: 1), (Timer t) { - recordDuration.value++; - // 设置最大录音时长 - if (recordDuration.value >= 3600000) { - stopRecording(); - return; - } - }); - } - - /// 停止定时器 - void _stopTimer() { - _timer?.cancel(); - _timer = null; - } - - /// 获取录制时长 - String getRecordDuration() { - final duration = Duration(seconds: recordDuration.value); - final minutes = duration.inMinutes.remainder(60); - final secs = duration.inSeconds.remainder(60); - return [ - if (minutes < 10) '0$minutes' else '$minutes', - if (secs < 10) '0$secs' else '$secs' - ].join(':'); - } - - String getRecordText() { - if (recorderState.value == 0) { - return 'Click to start'; - } else if (recorderState.value == 1) { - return 'Click to continue'; - } else if (recorderState.value == 2) { - return 'Click to pause'; - } - return ''; - } - - bool showChangeVoice() { - return (recorderState.value == 0 || recorderState.value == 1) && recordDuration.value > 0; - } - - Future goChangeVoice() async { - _stopTimer(); - _recorder.closeRecorder(); - Get.offNamed(AppRoutes.changeVoice, arguments: _filePath); - } -} \ No newline at end of file diff --git a/lib/modules/voice/record_sound/record_sound_view.dart b/lib/modules/voice/record_sound/record_sound_view.dart deleted file mode 100644 index 63d3cc2..0000000 --- a/lib/modules/voice/record_sound/record_sound_view.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/navigation_bar/base_appbar.dart'; -import 'package:tone_snap/modules/voice/record_sound/record_sound_controller.dart'; - -class RecordSoundView extends StatelessWidget { - RecordSoundView({super.key}); - - final controller = Get.find(); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: const BaseAppBar('Record Sound'), - body: SingleChildScrollView( - child: Center( - child: Column( - children: [ - SizedBox(height: 167.h), - _buildTime(), - SizedBox(height: 200.h), - Obx(() { - return _buildBtn( - controller.getRecordText(), - controller.onTapRecord, - ); - }), - Obx(() { - return Visibility( - visible: controller.recorderState.value == 2, - child: Padding( - padding: const EdgeInsets.only(top: 20).h, - child: _buildBtn('Click to stop', controller.stopRecording), - ), - ); - }), - Obx(() { - return Visibility( - visible: controller.showChangeVoice(), - child: Padding( - padding: const EdgeInsets.only(top: 20).h, - child: _buildBtn('Change voice', controller.goChangeVoice), - ), - ); - }), - ], - ), - ), - ), - ); - } - - Widget _buildTime() { - return Obx(() { - return Text( - controller.getRecordDuration(), - style: TextStyle( - color: Colors.white, - fontSize: 48.sp, - fontWeight: FontWeight.bold, - ), - ); - }); - } - - Widget _buildBtn(String text, Function() onTap) { - return ClipRRect( - borderRadius: BorderRadius.circular(22.5), - child: Material( - color: const Color(0xFF191919), - child: InkWell( - onTap: onTap, - child: Container( - width: 184.w, - height: 43.h, - alignment: Alignment.center, - child: Text( - text, - style: TextStyle( - color: Colors.white, - fontSize: 16.sp, - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ), - ); - } -} diff --git a/lib/modules/voice/upload_method/upload_mothod_binding.dart b/lib/modules/voice/upload_method/upload_mothod_binding.dart deleted file mode 100644 index da164e4..0000000 --- a/lib/modules/voice/upload_method/upload_mothod_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/upload_method/upload_mothod_controller.dart'; - -class UploadMethodBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => UploadMethodController()); - } -} diff --git a/lib/modules/voice/upload_method/upload_mothod_controller.dart b/lib/modules/voice/upload_method/upload_mothod_controller.dart deleted file mode 100644 index 278869e..0000000 --- a/lib/modules/voice/upload_method/upload_mothod_controller.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'dart:io'; - -import 'package:file_picker/file_picker.dart'; -import 'package:get/get.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:tone_snap/components/base_easyloading.dart'; -import 'package:tone_snap/routes/app_routes.dart'; -import 'package:tone_snap/utils/device_info_util.dart'; -import 'package:tone_snap/utils/permission_util.dart'; - -class UploadMethodController extends GetxController { - - Future goRecordSound() async { - Get.toNamed(AppRoutes.recordSound); - } - - void openFilePicker() async { - Permission permission; - if (Platform.isAndroid) { - int sdkInt = await DeviceInfoUtil.getAndroidSDKInt(); - if (sdkInt >= 33) { - permission = Permission.audio; - } else { - permission = Permission.storage; - } - } else { - permission = Permission.mediaLibrary; - } - bool result = await PermissionUtil.checkPermission([permission]); - if (!result) return; - - FilePickerResult? filePickerResult = await FilePicker.platform.pickFiles( - type: FileType.audio, - onFileLoading: (FilePickerStatus status) { - if (status == FilePickerStatus.picking) BaseEasyLoading.loading(); - if (status == FilePickerStatus.done) BaseEasyLoading.dismiss(); - }, - ); - if (filePickerResult != null) { - PlatformFile file = filePickerResult.files.first; - Get.toNamed(AppRoutes.changeVoice, arguments: file.path); - } - } -} diff --git a/lib/modules/voice/upload_method/upload_mothod_view.dart b/lib/modules/voice/upload_method/upload_mothod_view.dart deleted file mode 100644 index abb2966..0000000 --- a/lib/modules/voice/upload_method/upload_mothod_view.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/navigation_bar/base_appbar.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/upload_method/upload_mothod_controller.dart'; - -class UploadMethodView extends StatelessWidget { - UploadMethodView({super.key}); - - final controller = Get.find(); - - @override - Widget build(BuildContext context) { - Get.put(UploadMethodController()); - final labelTextStyle = TextStyle( - color: Colors.white, - fontSize: 20.sp, - fontWeight: FontWeight.bold, - ); - return Stack( - children: [ - Image.asset( - Assets.changeVoiceUploadMethodBg, - width: 1.sw, - height: 1.sh, - fit: BoxFit.fill, - ), - Scaffold( - backgroundColor: Colors.transparent, - appBar: const BaseAppBar('Upload method', backgroundColor: Colors.transparent), - body: SingleChildScrollView( - child: Center( - child: Column( - children: [ - SizedBox(height: 88.h), - GestureDetector( - onTap: controller.goRecordSound, - child: Image.asset( - Assets.changeVoiceUploadRecordSound, - width: 122.w, - height: 122.w, - ), - ), - SizedBox(height: 12.h), - Text( - 'Record Sound', - style: labelTextStyle, - ), - SizedBox(height: 94.h), - GestureDetector( - onTap: controller.openFilePicker, - child: Image.asset( - Assets.changeVoiceUploadPick, - width: 122.w, - height: 122.w, - ), - ), - SizedBox(height: 12.h), - Text( - 'Pick From Files', - style: labelTextStyle, - ), - ], - ), - ), - ), - ) - ], - ); - } -} diff --git a/lib/modules/voice/voice_home/voice_home_controller.dart b/lib/modules/voice/voice_home/voice_home_controller.dart deleted file mode 100644 index 679ca30..0000000 --- a/lib/modules/voice/voice_home/voice_home_controller.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/components/base_easyloading.dart'; -import 'package:tone_snap/controllers/player_controller.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class VoiceHomeController extends GetxController { - static VoiceHomeController get to => Get.find(); - var playerController = PlayerController.to; - var voiceList = [ - VoiceModel(name: 'Baby', path: Assets.audioChild, cover: Assets.coverChild), - VoiceModel(name: 'Boy', path: Assets.audioBoy, cover: Assets.coverBoy), - VoiceModel(name: 'Man', path: Assets.audioMan, cover: Assets.coverMan), - VoiceModel(name: 'Elder', path: Assets.audioElder, cover: Assets.coverElder), - VoiceModel(name: 'Robot', path: Assets.audioRobot, cover: Assets.coverRobot), - VoiceModel(name: 'Girl', path: Assets.audioGirl, cover: Assets.coverGirl), - VoiceModel(name: 'Sexy', path: Assets.audioSexy, cover: Assets.coverSexy), - VoiceModel(name: 'Woman', path: Assets.audioWoman, cover: Assets.coverWoman), - VoiceModel(name: 'Monsters', path: Assets.audioMonsters, cover: Assets.coverMonsters), - ]; - - void onTapItem(VoiceModel item) { - VoiceInitialController.to.currentPlayVoiceModel.value = item; - Get.toNamed(AppRoutes.playSound, arguments: item); - } - - Future onTapPlayBarPlay(VoiceModel item) async { - if (isPlayItem(item)) { - await playerController.pausePlay(); - } else { - if (!identical(item, VoiceInitialController.to.currentPlayVoiceModel.value)) { - BaseEasyLoading.loading(); - await playerController.setFilePath(item.path); - BaseEasyLoading.dismiss(); - VoiceInitialController.to.currentPlayVoiceModel.value = item; - VoiceInitialController.to.isFavourite.value = VoiceInitialController.to.getIsFavouriteModel() != null; - } - await playerController.startPlay(); - } - } - - bool isPlayItem(VoiceModel item) { - return playerController.isPlaying.value && identical(VoiceInitialController.to.currentPlayVoiceModel.value, item); - } -} \ No newline at end of file diff --git a/lib/modules/voice/voice_home/voice_home_view.dart b/lib/modules/voice/voice_home/voice_home_view.dart deleted file mode 100644 index 016bc6b..0000000 --- a/lib/modules/voice/voice_home/voice_home_view.dart +++ /dev/null @@ -1,128 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/circular_notch_clipper.dart'; -import 'package:tone_snap/components/my_marquee_text.dart'; -import 'package:tone_snap/components/private/head_label.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/voice_home/voice_home_controller.dart'; -import 'package:tone_snap/utils/obj_util.dart'; - -class VoiceHomeView extends GetView { - const VoiceHomeView({super.key}); - - @override - Widget build(BuildContext context) { - Get.find(); - return Column( - children: [ - HeadLabel( - assets: Assets.changeVoiceTheMonster, - width: 208.w, - height: 43.h, - ), - _buildGrid(context), - ], - ); - } - - Widget _buildGrid(BuildContext context) { - return Expanded( - child: GridView.builder( - padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 6.h), - itemCount: controller.voiceList.length, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - mainAxisSpacing: 20.h, - crossAxisSpacing: 15.w, - childAspectRatio: 102/130, - ), - itemBuilder: (context, index) { - return _buildItem(controller.voiceList[index], index); - }, - ), - ); - } - - Widget _buildItem(VoiceModel item, int index) { - return Column( - children: [ - GestureDetector( - onTap: () => controller.onTapItem(item), - child: Stack( - alignment: Alignment.center, - children: [ - Obx(() { - return Visibility( - visible: controller.isPlayItem(item), - maintainState: true, - maintainAnimation: true, - maintainSize: true, - child: Image.asset( - Assets.changeVoiceSubtract, - width: 100.w, - height: 100.w, - fit: BoxFit.fill, - ), - ); - }), - Stack( - clipBehavior: Clip.none, - children: [ - Visibility( - visible: ObjUtil.isNotEmptyStr(item.cover), - child: ClipPath( - clipper: CircularNotchClipper( - notchRadius: 20, - ), - child: ClipRRect( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(85.w/2), - topRight: Radius.circular(85.w/2), - bottomLeft: Radius.circular(85.w/2), - bottomRight: const Radius.circular(2), - ), - child: Image.asset( - '${item.cover}', - width: 85.w, - height: 85.w, - fit: BoxFit.cover, - ), - ), - ), - ), - Positioned( - right: -10.w, - bottom: -10.h, - child: Obx(() { - return GestureDetector( - onTap: () => controller.onTapPlayBarPlay(item), - child: Image.asset( - controller.isPlayItem(item) ? Assets.changeVoicePlaying : Assets.changeVoiceNotPlayed, - width: 30.w, - height: 30.w, - ), - ); - }), - ), - ], - ), - ], - ), - ), - SizedBox(height: 8.h), - Expanded( - child: MyMarqueeText( - text: item.name, - textStyle: TextStyle( - color: Colors.white, - fontSize: 16.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ); - } -} diff --git a/lib/modules/voice/voice_initial/voice_initial_controller.dart b/lib/modules/voice/voice_initial/voice_initial_controller.dart deleted file mode 100644 index 7d7fa07..0000000 --- a/lib/modules/voice/voice_initial/voice_initial_controller.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/controllers/player_controller.dart'; -import 'package:tone_snap/data/models/voice_model.dart'; -import 'package:tone_snap/data/storage/favorite_data.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/favourite/favourite_controller.dart'; -import 'package:tone_snap/modules/voice/my_voice/my_voice_controller.dart'; -import 'package:tone_snap/modules/voice/voice_home/voice_home_view.dart'; -import 'package:tone_snap/modules/voice/voice_me/voice_me_view.dart'; -import 'package:tone_snap/modules/voice/voice_settings/voice_settings_view.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class VoiceInitialController extends GetxController { - static VoiceInitialController get to => Get.find(); - late PageController pageController; - final pages = [ - PageItem([Assets.changeVoiceBnb1Selected, Assets.changeVoiceBnb1Unselected], const VoiceHomeView()), - PageItem([Assets.changeVoiceBnb2Selected, Assets.changeVoiceBnb2Unselected], Container()), - PageItem([Assets.changeVoiceBnb3Selected, Assets.changeVoiceBnb3Unselected], const VoiceMeView()), - PageItem([Assets.changeVoiceBnb4Selected, Assets.changeVoiceBnb4Unselected], const VoiceSettingsView()), - ]; - var currentIndex = 0.obs; - Rx currentPlayVoiceModel = Rx(null); - var playerController = PlayerController.to; - - /// 是否加入喜欢列表 - var isFavourite = false.obs; - - @override - void onInit() { - super.onInit(); - pageController = PageController(initialPage: currentIndex.value); - } - - @override - void onClose() { - pageController.dispose(); - super.onClose(); - } - - Future onBottomAppBarItemChanged(int index) async { - if (index == 1) { - await PlayerController.to.stopPlay(); - Get.toNamed(AppRoutes.uploadMethod); - } else { - if (index == 2) _refreshMe(); - currentIndex.value = index; - pageController.jumpToPage(index); - } - } - - void onTapPlayBar() { - Get.toNamed(AppRoutes.playSound, arguments: currentPlayVoiceModel.value); - } - - Future togglePlayback() async { - playerController.isPlaying.value - ? await playerController.pausePlay() - : await playerController.startPlay(); - } - - VoiceModel? getIsFavouriteModel() { - final list = FavoriteData().getList(); - return list.firstWhereOrNull((e) => e.path == currentPlayVoiceModel.value?.path); - } - - Future onTapFavourite() async { - if (isFavourite.value) { - getIsFavouriteModel()?.delete(); - isFavourite.value = false; - } else { - if (currentPlayVoiceModel.value != null) { - await FavoriteData().addData(currentPlayVoiceModel.value!.copyWith()); - isFavourite.value = true; - } - } - _refreshMe(); - } - - /// 刷新我的页面 - void _refreshMe() { - if (Get.isRegistered()) MyVoiceController.to.getData(); - if (Get.isRegistered()) FavouriteController.to.getData(); - } -} - -class PageItem { - late final List icons; - late final StatelessWidget widget; - - PageItem(this.icons, this.widget); -} diff --git a/lib/modules/voice/voice_initial/voice_initial_view.dart b/lib/modules/voice/voice_initial/voice_initial_view.dart deleted file mode 100644 index 9f5a959..0000000 --- a/lib/modules/voice/voice_initial/voice_initial_view.dart +++ /dev/null @@ -1,180 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/keep_alive_wrapper.dart'; -import 'package:tone_snap/components/my_marquee_text.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/voice_initial/voice_initial_controller.dart'; - -class VoiceInitialView extends StatelessWidget { - VoiceInitialView({super.key}); - - final controller = Get.find(); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - Obx(() { - return IndexedStack( - index: controller.currentIndex.value, - children: [ - Stack( - children: [ - Image.asset( - Assets.changeVoiceHomeBg, - width: 1.sw, - height: 1.sh, - fit: BoxFit.fill, - ), - Positioned( - bottom: 0, - child: Image.asset( - Assets.changeVoiceHomeBnbBg, - width: 1.sw, - height: 222.h, - fit: BoxFit.fill, - ), - ), - ], - ), - Container(), - Image.asset( - Assets.changeVoiceUploadMethodBg, - width: 1.sw, - height: 1.sh, - fit: BoxFit.fill, - ), - Image.asset( - Assets.changeVoiceSettingsBg, - width: 1.sw, - height: 1.sh, - fit: BoxFit.fill, - ), - ], - ); - }), - Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: Colors.transparent, - body: Column( - children: [ - Expanded( - child: PageView( - physics: const NeverScrollableScrollPhysics(), - controller: controller.pageController, - children: controller.pages.map((e) => KeepAliveWrapper(child: e.widget)).toList(), - ), - ), - _buildPlayBar(), - ], - ), - bottomNavigationBar: _buildBottomAppBar(), - ), - ], - ); - } - - Widget _buildPlayBar() { - return Obx(() { - return Visibility( - visible: controller.currentPlayVoiceModel.value != null && !controller.playerController.isCompleted.value, - child: GestureDetector( - onTap: controller.onTapPlayBar, - child: Container( - height: 72.h, - margin: EdgeInsets.fromLTRB(14.w, 0, 14.w, 7.h), - padding: const EdgeInsets.only(left: 34, right: 30).w, - decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(39), - ), - child: Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Obx(() { - return MyMarqueeText( - text: '${controller.currentPlayVoiceModel.value?.name}', - textStyle: TextStyle( - color: Colors.white, - fontSize: 16.sp, - fontWeight: FontWeight.bold, - ), - ); - }), - SizedBox(height: 4.h), - Obx(() { - return Text( - '${controller.playerController.getPositionDuration()}/${controller.playerController.getDuration()}', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: const Color(0x73FFFFFF), - fontSize: 12.sp, - ), - ); - }), - ], - ), - ), - SizedBox(width: 13.w), - Obx(() { - return GestureDetector( - onTap: controller.onTapFavourite, - child: Image.asset( - controller.isFavourite.value ? Assets.changeVoiceFavorite : Assets.changeVoiceNotFavorite, - width: 28.w, - height: 28.w, - ), - ); - }), - SizedBox(width: 13.w), - GestureDetector( - onTap: controller.togglePlayback, - child: Image.asset( - controller.playerController.isPlaying.value ? Assets.changeVoicePlaying1 : Assets.changeVoiceNotPlayed1, - width: 38.w, - height: 38.w, - ), - ), - ], - ), - ), - ), - ); - }); - } - - BottomAppBar _buildBottomAppBar() { - return BottomAppBar( - height: kBottomNavigationBarHeight, - padding: EdgeInsets.symmetric(horizontal: (1.sw - (28.w * 4)) / 8), - color: Colors.transparent, - child: SizedBox( - height: double.infinity, - child: Row( - children: controller.pages.asMap().entries.map((e) { - return Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - child: Obx(() { - return Image.asset( - e.value.icons[controller.currentIndex.value == e.key ? 1 : 0], - width: 28.w, - height: 28.w, - color: controller.currentIndex.value == e.key ? const Color(0xFF8602ED) : null, - ); - }), - onTap: () => controller.onBottomAppBarItemChanged(e.key), - ), - ); - }).toList(), - ), - ), - ); - } -} diff --git a/lib/modules/voice/voice_me/voice_me_binding.dart b/lib/modules/voice/voice_me/voice_me_binding.dart deleted file mode 100644 index 89dab6f..0000000 --- a/lib/modules/voice/voice_me/voice_me_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/voice_me/voice_me_controller.dart'; - -class VoiceMeBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => VoiceMeController()); - } -} diff --git a/lib/modules/voice/voice_me/voice_me_controller.dart b/lib/modules/voice/voice_me/voice_me_controller.dart deleted file mode 100644 index 2767b07..0000000 --- a/lib/modules/voice/voice_me/voice_me_controller.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/favourite/favourite_view.dart'; -import 'package:tone_snap/modules/voice/my_voice/my_voice_view.dart'; - -class VoiceMeController extends GetxController with GetTickerProviderStateMixin { - late TabController tabController; - final labels = ['My Voice', 'Favourite']; - final pages = [const MyVoiceView(), const FavouriteView()]; - - @override - void onInit() { - super.onInit(); - tabController = TabController(length: labels.length, vsync: this); - } - - @override - void onClose() { - tabController.dispose(); - super.onClose(); - } -} diff --git a/lib/modules/voice/voice_me/voice_me_view.dart b/lib/modules/voice/voice_me/voice_me_view.dart deleted file mode 100644 index 78296e4..0000000 --- a/lib/modules/voice/voice_me/voice_me_view.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/keep_alive_wrapper.dart'; -import 'package:tone_snap/components/my_custom_indicator.dart'; -import 'package:tone_snap/components/private/head_label.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/voice_me/voice_me_controller.dart'; - -class VoiceMeView extends GetView { - const VoiceMeView({super.key}); - - @override - Widget build(BuildContext context) { - Get.find(); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - HeadLabel( - assets: Assets.changeVoiceTheMonster1, - width: 135.w, - height: 51.h, - ), - _buildTabBar(), - _buildTabBarView(), - ], - ); - } - - Widget _buildTabBar() { - return TabBar( - controller: controller.tabController, - tabAlignment: TabAlignment.center, - dividerHeight: 0, - padding: const EdgeInsets.symmetric(horizontal: 8).w, - labelPadding: const EdgeInsets.symmetric(horizontal: 16).w, - labelStyle: TextStyle( - color: Colors.white, - fontSize: 20.sp, - fontWeight: FontWeight.w600, - ), - unselectedLabelStyle: TextStyle( - color: const Color(0x4DFFFFFF), - fontSize: 20.sp, - fontWeight: FontWeight.w600, - ), - indicatorPadding: EdgeInsets.fromLTRB(0, 4.h, 0, 0), - indicator: MyCustomIndicator( - indWidth: 16.w, - indHeight: 4.h, - radius: 3.5.r, - ), - tabs: controller.labels.map((e) => Tab(text: e)).toList(), - ); - } - - Widget _buildTabBarView() { - return Expanded( - child: TabBarView( - controller: controller.tabController, - children: controller.pages.map((e) => KeepAliveWrapper(child: e)).toList(), - ), - ); - } -} diff --git a/lib/modules/voice/voice_settings/voice_settings_binding.dart b/lib/modules/voice/voice_settings/voice_settings_binding.dart deleted file mode 100644 index 3b4a4de..0000000 --- a/lib/modules/voice/voice_settings/voice_settings_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/modules/voice/voice_settings/voice_settings_controller.dart'; - -class VoiceSettingsBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => VoiceSettingsController()); - } -} diff --git a/lib/modules/voice/voice_settings/voice_settings_controller.dart b/lib/modules/voice/voice_settings/voice_settings_controller.dart deleted file mode 100644 index 998ffee..0000000 --- a/lib/modules/voice/voice_settings/voice_settings_controller.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:get/get.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/routes/app_routes.dart'; - -class VoiceSettingsController extends GetxController { - final options = ['About', 'Privacy Policy', 'User Agreement']; - final optionIcons = [Assets.changeVoiceAbout, Assets.changeVoicePrivacy, Assets.changeVoiceUserAgreement]; - - void onTapItem(int index) async { - if (index == 0) { - Get.toNamed(AppRoutes.about); - } else if (index == 1) { - Get.toNamed(AppRoutes.privacy, arguments: { - 'title': options[index], - 'url': 'https://tonesnap-privacy.mystrikingly.com', - }); - } else if (index == 2) { - Get.toNamed(AppRoutes.terms, arguments: { - 'title': options[index], - 'url': 'https://tonesnap-terms.mystrikingly.com' - }); - } - } -} diff --git a/lib/modules/voice/voice_settings/voice_settings_view.dart b/lib/modules/voice/voice_settings/voice_settings_view.dart deleted file mode 100644 index c3189cf..0000000 --- a/lib/modules/voice/voice_settings/voice_settings_view.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:tone_snap/components/private/head_label.dart'; -import 'package:tone_snap/generated/assets.dart'; -import 'package:tone_snap/modules/voice/voice_settings/voice_settings_controller.dart'; - -class VoiceSettingsView extends GetView{ - const VoiceSettingsView({super.key}); - - @override - Widget build(BuildContext context) { - Get.find(); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - HeadLabel( - assets: Assets.changeVoiceTheMonster2, - width: 155.w, - height: 51.h, - ), - Expanded( - child: ListView.separated( - padding: EdgeInsets.zero, - itemCount: controller.options.length, - itemBuilder: (context, index) { - return _buildOptionItem(index); - }, - separatorBuilder: (context, index) { - return SizedBox(height: 10.h); - }, - ), - ), - ], - ); - } - - Widget _buildOptionItem(index) { - return Material( - color: Colors.transparent, - child: InkWell( - onTap: () => controller.onTapItem(index), - child: Container( - height: 56.h, - padding: const EdgeInsets.only(left: 24, right: 32).w, - child: Row( - children: [ - Image.asset(controller.optionIcons[index]), - SizedBox(width: 12.w), - Expanded( - child: Text( - controller.options[index], - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - Image.asset(Assets.changeVoiceIconChevronRight), - ], - ), - ), - ), - ); - } -} diff --git a/lib/utils/log_print.dart b/lib/utils/log_print.dart deleted file mode 100644 index 8374c8b..0000000 --- a/lib/utils/log_print.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Author: fengshengxiong -// Date: 2024/5/7 -// Description: 日志打印 - -import 'package:logger/logger.dart'; - -final _logger = Logger( - printer: PrettyPrinter( - // 要显示的方法调用的数量 - methodCount: 0, - // 如果提供了stacktrace,则方法调用的数量 - errorMethodCount: 8, - // 输出的宽度 - lineLength: 120, - // 丰富多彩的日志消息 - colors: true, - // 是否打印表情符号 - printEmojis: true, - // 是否打印时间 - printTime: false, - ), -); - -class LogPrint { - static const String _tag = 'LogPrint'; - - LogPrint.t(dynamic msg, {String tag = _tag}) { - _logger.t('[$tag]: $msg'); - } - - LogPrint.d(dynamic msg, {String tag = _tag}) { - _logger.d('[$tag]: $msg'); - } - - LogPrint.i(dynamic msg, {String tag = _tag}) { - _logger.i('[$tag]: $msg'); - } - - LogPrint.w(dynamic msg, {String tag = _tag}) { - _logger.w('[$tag]: $msg'); - } - - LogPrint.e(dynamic msg, {String tag = _tag}) { - _logger.e('[$tag]: $msg'); - } - - LogPrint.f(dynamic msg, {String tag = _tag}) { - _logger.f('[$tag]: $msg'); - } -} \ No newline at end of file