├── .classpath ├── .github └── FUNDING.yml ├── .gitignore ├── .gitmodules ├── .project ├── .settings └── org.eclipse.jdt.core.prefs ├── AndroidManifest.xml ├── README.md ├── project.properties ├── res ├── drawable-hdpi │ ├── album24.png │ ├── album48.png │ ├── album48_active.png │ ├── artist24.png │ ├── artist48.png │ ├── artist48_active.png │ ├── back48.png │ ├── blank_album_art.png │ ├── cancel24.png │ ├── dice48.png │ ├── dice48_active.png │ ├── dir24.png │ ├── dir48.png │ ├── dir48_active.png │ ├── folder48.png │ ├── fs_scan_pause48.png │ ├── fs_scan_start48.png │ ├── fs_scan_stop48.png │ ├── fs_scan_unpause48.png │ ├── genre24.png │ ├── genre48.png │ ├── genre48_active.png │ ├── header_bg100.png │ ├── ic_launcher.png │ ├── list64.png │ ├── list64_active.png │ ├── logo128.png │ ├── logo128_active.png │ ├── menubow_bottom_290.png │ ├── menubow_bottom_290_active.png │ ├── menubow_left_290.png │ ├── menubow_left_290_active.png │ ├── menubow_right_290.png │ ├── menubow_right_290_active.png │ ├── menubow_top_290.png │ ├── menubow_top_290_active.png │ ├── next48.png │ ├── pause96.png │ ├── play24.png │ ├── play96.png │ ├── pointer120.png │ ├── progress72.png │ ├── progress72_bg.png │ ├── row_bg30.png │ ├── separator.png │ ├── settings48.png │ ├── settings48_active.png │ ├── track24.png │ ├── track48.png │ ├── track48_active.png │ └── trans_bg.png ├── drawable-ldpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ └── ic_launcher.png ├── drawable-xxhdpi │ └── ic_launcher.png ├── drawable │ ├── progress_bar_bg.xml │ ├── progress_bar_full.xml │ └── transparent_black.xml ├── layout │ ├── album_art.xml │ ├── bow_menu.xml │ ├── dir_chooser.xml │ ├── file_list_entry.xml │ ├── filter_list_entry.xml │ ├── header.xml │ ├── item.xml │ ├── list_entry.xml │ ├── list_entry_label.xml │ ├── main.xml │ ├── now_playing.xml │ ├── playlist.xml │ └── settings.xml └── values │ └── strings.xml ├── src └── com │ ├── mpatric │ └── mp3agic │ │ ├── AbstractID3v2FrameData.java │ │ ├── AbstractID3v2Tag.java │ │ ├── BaseException.java │ │ ├── BufferTools.java │ │ ├── ByteBufferUtils.java │ │ ├── EncodedText.java │ │ ├── FileWrapper.java │ │ ├── ID3Wrapper.java │ │ ├── ID3v1.java │ │ ├── ID3v1Genres.java │ │ ├── ID3v1Tag.java │ │ ├── ID3v2.java │ │ ├── ID3v22Tag.java │ │ ├── ID3v23Tag.java │ │ ├── ID3v24Frame.java │ │ ├── ID3v24Tag.java │ │ ├── ID3v2ChapterFrameData.java │ │ ├── ID3v2ChapterTOCFrameData.java │ │ ├── ID3v2CommentFrameData.java │ │ ├── ID3v2Frame.java │ │ ├── ID3v2FrameSet.java │ │ ├── ID3v2ObseleteFrame.java │ │ ├── ID3v2ObseletePictureFrameData.java │ │ ├── ID3v2PictureFrameData.java │ │ ├── ID3v2TagFactory.java │ │ ├── ID3v2TextFrameData.java │ │ ├── ID3v2UrlFrameData.java │ │ ├── InvalidDataException.java │ │ ├── Mp3File.java │ │ ├── MpegFrame.java │ │ ├── MutableInteger.java │ │ ├── NoSuchTagException.java │ │ ├── NotSupportedException.java │ │ ├── UnsupportedTagException.java │ │ ├── Version.java │ │ └── app │ │ ├── BaseApp.java │ │ ├── Example.java │ │ ├── Mp3Catalog.java │ │ ├── Mp3Details.java │ │ ├── Mp3Move.java │ │ ├── Mp3Pics.java │ │ ├── Mp3Rename.java │ │ └── Mp3Retag.java │ └── turtleplayer │ ├── Player.java │ ├── Stats.java │ ├── TurtlePlayer.java │ ├── common │ ├── MatchFilterVisitor.java │ └── filefilter │ │ ├── AccessableFileFilter.java │ │ ├── FileFilters.java │ │ └── NameFilter.java │ ├── controller │ ├── BroadcastsHandler.java │ ├── Observer.java │ ├── PhoneStateHandler.java │ └── TouchHandler.java │ ├── dirchooser │ ├── DirChooser.java │ ├── DirChooserConstants.java │ ├── FileAdapter.java │ └── FileSorter.java │ ├── model │ ├── Album.java │ ├── AlbumArtLocation.java │ ├── AlbumDigest.java │ ├── Artist.java │ ├── ArtistDigest.java │ ├── FSobject.java │ ├── Genre.java │ ├── GenreDigest.java │ ├── Instance.java │ ├── InstanceCreator.java │ ├── InstanceVisitor.java │ ├── Song.java │ ├── SongDigest.java │ ├── Track.java │ └── TrackBundle.java │ ├── persistance │ ├── framework │ │ ├── UniqueFieldGetter.java │ │ ├── creator │ │ │ ├── Creator.java │ │ │ ├── CreatorForList.java │ │ │ └── ResultCreator.java │ │ ├── db │ │ │ ├── Database.java │ │ │ └── ObservableDatabase.java │ │ ├── executor │ │ │ └── OperationExecutor.java │ │ ├── filter │ │ │ ├── FieldFilter.java │ │ │ ├── Filter.java │ │ │ ├── FilterSet.java │ │ │ ├── FilterVisitor.java │ │ │ ├── FilterVisitorGenerified.java │ │ │ ├── NotFilter.java │ │ │ ├── Operator.java │ │ │ └── ResultFilter.java │ │ ├── mapping │ │ │ ├── Mapping.java │ │ │ └── QueryGenerator.java │ │ ├── paging │ │ │ ├── Paging.java │ │ │ └── PagingFilterBuilder.java │ │ ├── query │ │ │ ├── OperationDelete.java │ │ │ ├── OperationInsert.java │ │ │ ├── OperationRead.java │ │ │ └── Query.java │ │ └── sort │ │ │ ├── FieldOrder.java │ │ │ ├── Order.java │ │ │ ├── OrderSet.java │ │ │ ├── OrderVisitor.java │ │ │ ├── OrderVisitorGenerified.java │ │ │ ├── RandomOrder.java │ │ │ └── SortOrder.java │ ├── source │ │ ├── relational │ │ │ ├── Field.java │ │ │ ├── FieldPersistable.java │ │ │ ├── Table.java │ │ │ ├── View.java │ │ │ └── fieldtype │ │ │ │ ├── FieldPersistableAsDouble.java │ │ │ │ ├── FieldPersistableAsInteger.java │ │ │ │ ├── FieldPersistableAsString.java │ │ │ │ ├── FieldVisitor.java │ │ │ │ └── ToStringFieldVisitor.java │ │ ├── sql │ │ │ ├── Counter.java │ │ │ ├── First.java │ │ │ ├── Limited.java │ │ │ ├── MappingDistinct.java │ │ │ ├── MappingTable.java │ │ │ ├── QueryGeneratorTable.java │ │ │ └── query │ │ │ │ ├── BoolOperator.java │ │ │ │ ├── FieldsPart.java │ │ │ │ ├── Helper.java │ │ │ │ ├── Limit.java │ │ │ │ ├── Operator.java │ │ │ │ ├── OrderClause.java │ │ │ │ ├── OrderClauseFields.java │ │ │ │ ├── OrderClausePart.java │ │ │ │ ├── OrderClausePartField.java │ │ │ │ ├── OrderClauseRandom.java │ │ │ │ ├── Select.java │ │ │ │ ├── Sql.java │ │ │ │ ├── SqlFragment.java │ │ │ │ ├── SqlOrder.java │ │ │ │ ├── SqlPart.java │ │ │ │ ├── TablesPart.java │ │ │ │ ├── WhereClause.java │ │ │ │ ├── WhereClauseField.java │ │ │ │ └── WhereClausePart.java │ │ └── sqlite │ │ │ ├── CounterSqlite.java │ │ │ ├── CreatorForListSqlite.java │ │ │ ├── DeleteTableContentSqlLite.java │ │ │ ├── InsertOperationSqlLite.java │ │ │ └── QuerySqlite.java │ └── turtle │ │ ├── FileBase.java │ │ ├── FsReader.java │ │ ├── db │ │ ├── TurtleDatabase.java │ │ ├── TurtleDatabaseImpl.java │ │ └── structure │ │ │ ├── Tables.java │ │ │ └── Views.java │ │ ├── filter │ │ ├── DirFilter.java │ │ └── TurtleFilterVisitor.java │ │ └── mapping │ │ ├── AlbumArtLoactionToDbMapper.java │ │ ├── AlbumArtLocationCreator.java │ │ ├── AlbumCreator.java │ │ ├── ArtistCreator.java │ │ ├── DirCreator.java │ │ ├── FsObjectToDbMapper.java │ │ ├── GenreCreator.java │ │ ├── SongCreator.java │ │ ├── StringCreator.java │ │ ├── TrackCreator.java │ │ └── TrackToDbMapper.java │ ├── player │ ├── ObservableOutput.java │ ├── Output.java │ ├── OutputAccess.java │ ├── OutputCommand.java │ ├── OutputUsingOnClickListener.java │ ├── PlayerService.java │ └── PlayerServiceConnector.java │ ├── playlist │ ├── Playlist.java │ └── playorder │ │ ├── DefaultOrder.java │ │ ├── LimitedStack.java │ │ ├── PlayOrderHistory.java │ │ ├── PlayOrderRandom.java │ │ ├── PlayOrderSorted.java │ │ └── PlayOrderStrategy.java │ ├── preferences │ ├── AbstractKey.java │ ├── Key.java │ ├── Keys.java │ ├── ObjectKey.java │ ├── Preferences.java │ ├── PreferencesObserver.java │ └── SharedPreferencesAccess.java │ ├── presentation │ ├── AlbumArtResolver.java │ ├── InstanceFormatter.java │ ├── OverAllFormatter.java │ ├── ShortInstanceFormatter.java │ └── ShortWithNumberInstanceFormatter.java │ ├── util │ ├── AndroidUtils.java │ ├── DefaultAdapter.java │ ├── FormattedInstanceComparator.java │ ├── Shorty.java │ ├── TurtleUtil.java │ └── dev │ │ └── PerformanceMeasure.java │ └── view │ ├── AlbumArt.java │ ├── AlbumArtView.java │ ├── FileChooser.java │ ├── FilterListAdapter.java │ └── VerticalTextView.java └── test ├── TROUBLESHOOTING └── com └── turtleplayer └── persistance └── turtle └── FsReaderTest.java /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: https://paypal.me/eddturtle # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | bin/ 13 | gen/ 14 | 15 | # Local configuration file (sdk path, etc) 16 | local.properties 17 | 18 | #sh 19 | *.iml 20 | .idea 21 | classes/ 22 | .git* 23 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "mp3agic"] 2 | path = mp3agic 3 | url = git@github.com:Hoene84/mp3agic.git 4 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | TurtlePlayer 4 | 5 | 6 | 7 | 8 | 9 | com.android.ide.eclipse.adt.ResourceManagerBuilder 10 | 11 | 12 | 13 | 14 | com.android.ide.eclipse.adt.PreCompilerBuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.jdt.core.javabuilder 20 | 21 | 22 | 23 | 24 | com.android.ide.eclipse.adt.ApkBuilder 25 | 26 | 27 | 28 | 29 | 30 | com.android.ide.eclipse.adt.AndroidNature 31 | org.eclipse.jdt.core.javanature 32 | 33 | 34 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.6 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.6 12 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Turtle Player](http://www.turtle-player.co.uk/ "Turtle Player") 2 | 3 | 4 | 5 | ### Free, Fully Fledged & Open-Source. The Music Player for Android. 6 | 7 | Turtle Player is designed to be a fun and unique app for playing your music on the move, while in a advertisment-free app. Originally developed by Edd Turtle, it is now a community driven app with help from developers (namely Simon Honegger) on Github. Give it a go today! 8 | 9 | ##### *Warning! Due to other commitments I haven't had the time to maintain and keep this project up-to-date. It should work fine on modern android phones, but the visuals and code are bit old - that's all.* 10 | 11 | ## How to Contribute 12 | 13 | 1) First, pull the source code from this git repository to your local machine: 14 | 15 | git clone git@github.com:eddturtle/TurtlePlayer.git 16 | cd TurtlePlayer 17 | 18 | 2) Initialise the submodule dependency for mp3agic. 19 | 20 | git submodule update --init 21 | 22 | 3) Copy the mp3agic source folder (inside mp3agic/src/main/java/com/mpatric) into the Turtle Player src/com folder. 23 | 24 | 4) Import the project in Eclipse (or your chosen Android IDE). 25 | 26 | 5) Make super-awesome improvements... 27 | 28 | 6) Create a Pull Request back to this repository. 29 | 30 | ### License 31 | Source is licenced under the [MIT](http://www.opensource.org/licenses/mit-license.php "MIT License") & [GPL](http://www.gnu.org/copyleft/gpl.html "General Public License"). 32 | 33 | [1]: http://www.turtle-player.co.uk/img/logo-medium.png 34 | -------------------------------------------------------------------------------- /project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-19 15 | -------------------------------------------------------------------------------- /res/drawable-hdpi/album24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/album24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/album48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/album48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/album48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/album48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/artist24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/artist24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/artist48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/artist48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/artist48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/artist48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/back48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/back48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/blank_album_art.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/blank_album_art.png -------------------------------------------------------------------------------- /res/drawable-hdpi/cancel24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/cancel24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/dice48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/dice48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/dice48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/dice48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/dir24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/dir24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/dir48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/dir48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/dir48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/dir48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/folder48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/folder48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/fs_scan_pause48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/fs_scan_pause48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/fs_scan_start48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/fs_scan_start48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/fs_scan_stop48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/fs_scan_stop48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/fs_scan_unpause48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/fs_scan_unpause48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/genre24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/genre24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/genre48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/genre48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/genre48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/genre48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/header_bg100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/header_bg100.png -------------------------------------------------------------------------------- /res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-hdpi/list64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/list64.png -------------------------------------------------------------------------------- /res/drawable-hdpi/list64_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/list64_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/logo128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/logo128.png -------------------------------------------------------------------------------- /res/drawable-hdpi/logo128_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/logo128_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_bottom_290.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_bottom_290.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_bottom_290_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_bottom_290_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_left_290.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_left_290.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_left_290_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_left_290_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_right_290.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_right_290.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_right_290_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_right_290_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_top_290.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_top_290.png -------------------------------------------------------------------------------- /res/drawable-hdpi/menubow_top_290_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/menubow_top_290_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/next48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/next48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/pause96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/pause96.png -------------------------------------------------------------------------------- /res/drawable-hdpi/play24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/play24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/play96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/play96.png -------------------------------------------------------------------------------- /res/drawable-hdpi/pointer120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/pointer120.png -------------------------------------------------------------------------------- /res/drawable-hdpi/progress72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/progress72.png -------------------------------------------------------------------------------- /res/drawable-hdpi/progress72_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/progress72_bg.png -------------------------------------------------------------------------------- /res/drawable-hdpi/row_bg30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/row_bg30.png -------------------------------------------------------------------------------- /res/drawable-hdpi/separator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/separator.png -------------------------------------------------------------------------------- /res/drawable-hdpi/settings48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/settings48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/settings48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/settings48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/track24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/track24.png -------------------------------------------------------------------------------- /res/drawable-hdpi/track48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/track48.png -------------------------------------------------------------------------------- /res/drawable-hdpi/track48_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/track48_active.png -------------------------------------------------------------------------------- /res/drawable-hdpi/trans_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-hdpi/trans_bg.png -------------------------------------------------------------------------------- /res/drawable-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eddturtle/TurtlePlayer/a55a3142dc24fc95c21aca4e913722643fa2d5d6/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable/progress_bar_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /res/drawable/progress_bar_full.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 34 | 35 | 36 | 37 | 38 | 41 | 42 | -------------------------------------------------------------------------------- /res/drawable/transparent_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /res/layout/file_list_entry.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /res/layout/header.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 17 | 18 | 25 | 33 | 34 | 40 | 41 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /res/layout/item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /res/layout/list_entry.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /res/layout/list_entry_label.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/AbstractID3v2FrameData.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public abstract class AbstractID3v2FrameData { 4 | 5 | boolean unsynchronisation; 6 | 7 | public AbstractID3v2FrameData(boolean unsynchronisation) { 8 | this.unsynchronisation = unsynchronisation; 9 | } 10 | 11 | protected void synchroniseAndUnpackFrameData(byte[] bytes) throws InvalidDataException { 12 | if (unsynchronisation && BufferTools.sizeSynchronisationWouldSubtract(bytes) > 0) { 13 | byte[] synchronisedBytes = BufferTools.synchroniseBuffer(bytes); 14 | unpackFrameData(synchronisedBytes); 15 | } else { 16 | unpackFrameData(bytes); 17 | } 18 | } 19 | 20 | protected byte[] packAndUnsynchroniseFrameData() { 21 | byte[] bytes = packFrameData(); 22 | if (unsynchronisation && BufferTools.sizeUnsynchronisationWouldAdd(bytes) > 0) { 23 | return BufferTools.unsynchroniseBuffer(bytes); 24 | } 25 | return bytes; 26 | } 27 | 28 | protected byte[] toBytes() { 29 | return packAndUnsynchroniseFrameData(); 30 | } 31 | 32 | public boolean equals(Object obj) { 33 | if (! (obj instanceof AbstractID3v2FrameData)) return false; 34 | AbstractID3v2FrameData other = (AbstractID3v2FrameData) obj; 35 | if (unsynchronisation != other.unsynchronisation) return false; 36 | return true; 37 | } 38 | 39 | protected abstract void unpackFrameData(byte[] bytes) throws InvalidDataException; 40 | protected abstract byte[] packFrameData(); 41 | protected abstract int getLength(); 42 | } 43 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/BaseException.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class BaseException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public BaseException() { 8 | super(); 9 | } 10 | 11 | public BaseException(String message) { 12 | super(message); 13 | } 14 | 15 | public BaseException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | 19 | public String getDetailedMessage() { 20 | Throwable t = this; 21 | StringBuffer s = new StringBuffer(); 22 | while (true) { 23 | s.append('['); 24 | s.append(t.getClass().getName()); 25 | if (t.getMessage() != null && t.getMessage().length() > 0) { 26 | s.append(": "); 27 | s.append(t.getMessage()); 28 | } 29 | s.append(']'); 30 | t = t.getCause(); 31 | if (t != null) { 32 | s.append(" caused by "); 33 | } else { 34 | break; 35 | } 36 | } 37 | return s.toString(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ByteBufferUtils.java: -------------------------------------------------------------------------------- 1 | 2 | package com.mpatric.mp3agic; 3 | 4 | import java.nio.ByteBuffer; 5 | 6 | public class ByteBufferUtils { 7 | 8 | public static String extractNullTerminatedString(ByteBuffer bb) { 9 | int start = bb.position(); 10 | 11 | byte[] buffer = new byte[bb.remaining()]; 12 | 13 | bb.get(buffer); 14 | 15 | String s = new String(buffer); 16 | int nullPos = s.indexOf(0); 17 | 18 | s = s.substring(0, nullPos); 19 | 20 | bb.position(start + s.length() + 1); 21 | 22 | return s; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/FileWrapper.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | import java.io.File; 4 | import java.io.FileNotFoundException; 5 | import java.io.IOException; 6 | 7 | public class FileWrapper { 8 | 9 | protected File file; 10 | protected String filename; 11 | protected long length; 12 | protected long lastModified; 13 | 14 | protected FileWrapper() { 15 | } 16 | 17 | public FileWrapper(String filename) throws IOException { 18 | this.filename = filename; 19 | init(); 20 | length = file.length(); 21 | lastModified = file.lastModified(); 22 | } 23 | 24 | private void init() throws IOException { 25 | file = new File(filename); 26 | if (!file.exists()) throw new FileNotFoundException("File not found " + filename); 27 | if (!file.canRead()) throw new IOException("File not readable"); 28 | } 29 | 30 | public String getFilename() { 31 | return filename; 32 | } 33 | 34 | public long getLength() { 35 | return length; 36 | } 37 | 38 | public long getLastModified() { 39 | return lastModified; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v1.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public interface ID3v1 { 4 | 5 | String getVersion(); 6 | 7 | String getTrack(); 8 | void setTrack(String track); 9 | 10 | String getArtist(); 11 | void setArtist(String artist); 12 | 13 | String getTitle(); 14 | void setTitle(String title); 15 | 16 | String getAlbum(); 17 | void setAlbum(String album); 18 | 19 | String getYear(); 20 | void setYear(String year); 21 | 22 | int getGenre(); 23 | void setGenre(int genre); 24 | String getGenreDescription(); 25 | 26 | String getComment(); 27 | void setComment(String comment); 28 | 29 | byte[] toBytes() throws NotSupportedException; 30 | } 31 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v2.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Map; 5 | 6 | public interface ID3v2 extends ID3v1 { 7 | 8 | boolean getPadding(); 9 | void setPadding(boolean padding); 10 | 11 | boolean hasFooter(); 12 | void setFooter(boolean footer); 13 | 14 | boolean hasUnsynchronisation(); 15 | void setUnsynchronisation(boolean unsynchronisation); 16 | 17 | String getComposer(); 18 | void setComposer(String composer); 19 | 20 | String getPublisher(); 21 | void setPublisher(String publisher); 22 | 23 | String getOriginalArtist(); 24 | void setOriginalArtist(String originalArtist); 25 | 26 | String getAlbumArtist(); 27 | void setAlbumArtist(String albumArtist); 28 | 29 | String getCopyright(); 30 | void setCopyright(String copyright); 31 | 32 | String getUrl(); 33 | void setUrl(String url); 34 | 35 | ArrayList getChapters(); 36 | void setChapters(ArrayList chapters); 37 | 38 | ArrayList getChapterTOC(); 39 | void setChapterTOC(ArrayList ctoc); 40 | 41 | String getEncoder(); 42 | void setEncoder(String encoder); 43 | 44 | byte[] getAlbumImage(); 45 | void setAlbumImage(byte[] albumImage, String mimeType); 46 | String getAlbumImageMimeType(); 47 | 48 | String getItunesComment(); 49 | void setItunesComment(String itunesComment); 50 | 51 | int getDataLength(); 52 | int getLength(); 53 | boolean getObseleteFormat(); 54 | 55 | Map getFrameSets(); 56 | void clearFrameSet(String id); 57 | } 58 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v22Tag.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v22Tag extends AbstractID3v2Tag { 4 | 5 | public static final String VERSION = "2.0"; 6 | 7 | public ID3v22Tag() { 8 | super(); 9 | version = VERSION; 10 | } 11 | 12 | public ID3v22Tag(byte[] buffer) throws NoSuchTagException, UnsupportedTagException, InvalidDataException { 13 | super(buffer); 14 | } 15 | 16 | public ID3v22Tag(byte[] buffer, boolean obseleteFormat) throws NoSuchTagException, UnsupportedTagException, InvalidDataException { 17 | super(buffer, obseleteFormat); 18 | } 19 | 20 | protected void unpackFlags(byte[] bytes) { 21 | unsynchronisation = BufferTools.checkBit(bytes[FLAGS_OFFSET], UNSYNCHRONISATION_BIT); 22 | compression = BufferTools.checkBit(bytes[FLAGS_OFFSET], COMPRESSION_BIT); 23 | } 24 | 25 | protected void packFlags(byte[] bytes, int offset) { 26 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], UNSYNCHRONISATION_BIT, unsynchronisation); 27 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], COMPRESSION_BIT, compression); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v23Tag.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v23Tag extends AbstractID3v2Tag { 4 | 5 | public static final String VERSION = "3.0"; 6 | 7 | public ID3v23Tag() { 8 | super(); 9 | version = VERSION; 10 | } 11 | 12 | public ID3v23Tag(byte[] buffer) throws NoSuchTagException, UnsupportedTagException, InvalidDataException { 13 | super(buffer); 14 | } 15 | 16 | protected void unpackFlags(byte[] buffer) { 17 | unsynchronisation = BufferTools.checkBit(buffer[FLAGS_OFFSET], UNSYNCHRONISATION_BIT); 18 | extendedHeader = BufferTools.checkBit(buffer[FLAGS_OFFSET], EXTENDED_HEADER_BIT); 19 | experimental = BufferTools.checkBit(buffer[FLAGS_OFFSET], EXPERIMENTAL_BIT); 20 | } 21 | 22 | protected void packFlags(byte[] bytes, int offset) { 23 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], UNSYNCHRONISATION_BIT, unsynchronisation); 24 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], EXTENDED_HEADER_BIT, extendedHeader); 25 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], EXPERIMENTAL_BIT, experimental); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v24Frame.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v24Frame extends ID3v2Frame { 4 | 5 | public ID3v24Frame(byte[] buffer, int offset) throws InvalidDataException { 6 | super(buffer, offset); 7 | } 8 | 9 | public ID3v24Frame(String id, byte[] data) { 10 | super(id, data); 11 | } 12 | 13 | protected void unpackDataLength(byte[] buffer, int offset) { 14 | dataLength = BufferTools.unpackSynchsafeInteger(buffer[offset + DATA_LENGTH_OFFSET], buffer[offset + DATA_LENGTH_OFFSET + 1], buffer[offset + DATA_LENGTH_OFFSET + 2], buffer[offset + DATA_LENGTH_OFFSET + 3]); 15 | } 16 | 17 | protected byte[] packDataLength() { 18 | return BufferTools.packSynchsafeInteger(dataLength); 19 | } 20 | 21 | public boolean equals(Object obj) { 22 | if (! (obj instanceof ID3v24Frame)) return false; 23 | return super.equals(obj); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v24Tag.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v24Tag extends AbstractID3v2Tag { 4 | 5 | public static final String VERSION = "4.0"; 6 | 7 | public ID3v24Tag() { 8 | super(); 9 | version = VERSION; 10 | } 11 | 12 | public ID3v24Tag(byte[] buffer) throws NoSuchTagException, UnsupportedTagException, InvalidDataException { 13 | super(buffer); 14 | } 15 | 16 | protected void unpackFlags(byte[] buffer) { 17 | unsynchronisation = BufferTools.checkBit(buffer[FLAGS_OFFSET], UNSYNCHRONISATION_BIT); 18 | extendedHeader = BufferTools.checkBit(buffer[FLAGS_OFFSET], EXTENDED_HEADER_BIT); 19 | experimental = BufferTools.checkBit(buffer[FLAGS_OFFSET], EXPERIMENTAL_BIT); 20 | footer = BufferTools.checkBit(buffer[FLAGS_OFFSET], FOOTER_BIT); 21 | } 22 | 23 | protected void packFlags(byte[] bytes, int offset) { 24 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], UNSYNCHRONISATION_BIT, unsynchronisation); 25 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], EXTENDED_HEADER_BIT, extendedHeader); 26 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], EXPERIMENTAL_BIT, experimental); 27 | bytes[offset + FLAGS_OFFSET] = BufferTools.setBit(bytes[offset + FLAGS_OFFSET], FOOTER_BIT, footer); 28 | } 29 | 30 | protected boolean useFrameUnsynchronisation() { 31 | return unsynchronisation; 32 | } 33 | 34 | protected ID3v2Frame createFrame(byte[] buffer, int currentOffset) throws InvalidDataException { 35 | return new ID3v24Frame(buffer, currentOffset); 36 | } 37 | 38 | protected ID3v2Frame createFrame(String id, byte[] data) { 39 | return new ID3v24Frame(id, data); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v2FrameSet.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ID3v2FrameSet { 7 | 8 | private String id; 9 | private ArrayList frames; 10 | 11 | public ID3v2FrameSet(String id) { 12 | this.id = id; 13 | frames = new ArrayList(); 14 | } 15 | 16 | public String getId() { 17 | return id; 18 | } 19 | 20 | public void clear() { 21 | frames.clear(); 22 | } 23 | 24 | public void addFrame(ID3v2Frame frame) { 25 | frames.add(frame); 26 | } 27 | 28 | public List getFrames() { 29 | return frames; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return this.id + ": " + frames.size(); 35 | } 36 | 37 | public boolean equals(Object obj) { 38 | if (! (obj instanceof ID3v2FrameSet)) return false; 39 | if (super.equals(obj)) return true; 40 | ID3v2FrameSet other = (ID3v2FrameSet) obj; 41 | if (id == null) { 42 | if (other.id != null) return false; 43 | } else if (other.id == null) return false; 44 | else if (! id.equals(other.id)) return false; 45 | if (frames == null) { 46 | if (other.frames != null) return false; 47 | } else if (other.frames == null) return false; 48 | else if (! frames.equals(other.frames)) return false; 49 | return true; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v2ObseleteFrame.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v2ObseleteFrame extends ID3v2Frame { 4 | 5 | private static final int HEADER_LENGTH = 6; 6 | private static final int ID_OFFSET = 0; 7 | private static final int ID_LENGTH = 3; 8 | protected static final int DATA_LENGTH_OFFSET = 3; 9 | 10 | public ID3v2ObseleteFrame(byte[] buffer, int offset) throws InvalidDataException { 11 | super(buffer, offset); 12 | } 13 | 14 | public ID3v2ObseleteFrame(String id, byte[] data) { 15 | super(id, data); 16 | } 17 | 18 | protected int unpackHeader(byte[] buffer, int offset) { 19 | id = BufferTools.byteBufferToStringIgnoringEncodingIssues(buffer, offset + ID_OFFSET, ID_LENGTH); 20 | unpackDataLength(buffer, offset); 21 | return offset + HEADER_LENGTH; 22 | } 23 | 24 | protected void unpackDataLength(byte[] buffer, int offset) { 25 | dataLength = BufferTools.unpackInteger((byte)0, buffer[offset + DATA_LENGTH_OFFSET], buffer[offset + DATA_LENGTH_OFFSET + 1], buffer[offset + DATA_LENGTH_OFFSET + 2]); 26 | } 27 | 28 | public void packFrame(byte[] bytes, int offset) throws NotSupportedException { 29 | throw(new NotSupportedException("Packing Obselete frames is not supported")); 30 | } 31 | 32 | public int getLength() { 33 | return dataLength + HEADER_LENGTH; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v2ObseletePictureFrameData.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | 5 | public class ID3v2ObseletePictureFrameData extends ID3v2PictureFrameData { 6 | 7 | public ID3v2ObseletePictureFrameData(boolean unsynchronisation) { 8 | super(unsynchronisation); 9 | } 10 | 11 | public ID3v2ObseletePictureFrameData(boolean unsynchronisation, String mimeType, byte pictureType, EncodedText description, byte[] imageData) { 12 | super(unsynchronisation, mimeType, pictureType, description, imageData); 13 | } 14 | 15 | public ID3v2ObseletePictureFrameData(boolean unsynchronisation, byte[] bytes) throws InvalidDataException { 16 | super(unsynchronisation, bytes); 17 | } 18 | 19 | @Override 20 | protected void unpackFrameData(byte[] bytes) throws InvalidDataException { 21 | String filetype; 22 | try { 23 | filetype = BufferTools.byteBufferToString(bytes, 1, 3); 24 | } catch (UnsupportedEncodingException e) { 25 | filetype = "unknown"; 26 | } 27 | mimeType = "image/" + filetype.toLowerCase(); 28 | pictureType = bytes[4]; 29 | int marker = BufferTools.indexOfTerminatorForEncoding(bytes, 5, bytes[0]); 30 | if (marker >= 0) { 31 | description = new EncodedText(bytes[0], BufferTools.copyBuffer(bytes, 5, marker - 5)); 32 | marker += description.getTerminator().length; 33 | } else { 34 | description = new EncodedText(bytes[0], ""); 35 | marker = 1; 36 | } 37 | imageData = BufferTools.copyBuffer(bytes, marker, bytes.length - marker); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v2TagFactory.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v2TagFactory { 4 | 5 | public static AbstractID3v2Tag createTag(byte[] bytes) throws NoSuchTagException, UnsupportedTagException, InvalidDataException { 6 | sanityCheckTag(bytes); 7 | int majorVersion = bytes[AbstractID3v2Tag.MAJOR_VERSION_OFFSET]; 8 | switch (majorVersion) { 9 | case 2: return createID3v22Tag(bytes); 10 | case 3: return new ID3v23Tag(bytes); 11 | case 4: return new ID3v24Tag(bytes); 12 | } 13 | throw new UnsupportedTagException("Tag version not supported"); 14 | } 15 | 16 | private static AbstractID3v2Tag createID3v22Tag(byte[] bytes) throws NoSuchTagException, UnsupportedTagException, InvalidDataException { 17 | ID3v22Tag tag = new ID3v22Tag(bytes); 18 | if (tag.getFrameSets().size() == 0) { 19 | tag = new ID3v22Tag(bytes, true); 20 | } 21 | return tag; 22 | } 23 | 24 | public static void sanityCheckTag(byte[] bytes) throws NoSuchTagException, UnsupportedTagException { 25 | if (bytes.length < AbstractID3v2Tag.HEADER_LENGTH) { 26 | throw new NoSuchTagException("Buffer too short"); 27 | } 28 | if (! AbstractID3v2Tag.TAG.equals(BufferTools.byteBufferToStringIgnoringEncodingIssues(bytes, 0, AbstractID3v2Tag.TAG.length()))) { 29 | throw new NoSuchTagException(); 30 | } 31 | int majorVersion = bytes[AbstractID3v2Tag.MAJOR_VERSION_OFFSET]; 32 | if (majorVersion != 2 && majorVersion != 3 && majorVersion != 4) { 33 | int minorVersion = bytes[AbstractID3v2Tag.MINOR_VERSION_OFFSET]; 34 | throw new UnsupportedTagException("Unsupported version 2." + majorVersion + "." + minorVersion); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/ID3v2TextFrameData.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class ID3v2TextFrameData extends AbstractID3v2FrameData { 4 | 5 | protected EncodedText text; 6 | 7 | public ID3v2TextFrameData(boolean unsynchronisation) { 8 | super(unsynchronisation); 9 | } 10 | 11 | public ID3v2TextFrameData(boolean unsynchronisation, EncodedText text) { 12 | super(unsynchronisation); 13 | this.text = text; 14 | } 15 | 16 | public ID3v2TextFrameData(boolean unsynchronisation, byte[] bytes) throws InvalidDataException { 17 | super(unsynchronisation); 18 | synchroniseAndUnpackFrameData(bytes); 19 | } 20 | 21 | protected void unpackFrameData(byte[] bytes) throws InvalidDataException { 22 | text = new EncodedText(bytes[0], BufferTools.copyBuffer(bytes, 1, bytes.length - 1)); 23 | } 24 | 25 | protected byte[] packFrameData() { 26 | byte[] bytes = new byte[getLength()]; 27 | if (text != null) bytes[0] = text.getTextEncoding(); 28 | else bytes[0] = 0; 29 | byte[] textBytes = text.toBytes(true, false); 30 | if (textBytes.length > 0) { 31 | BufferTools.copyIntoByteBuffer(textBytes, 0, textBytes.length, bytes, 1); 32 | } 33 | return bytes; 34 | } 35 | 36 | protected int getLength() { 37 | int length = 1; 38 | if (text != null) length += text.toBytes(true, false).length; 39 | return length; 40 | } 41 | 42 | public EncodedText getText() { 43 | return text; 44 | } 45 | 46 | public void setText(EncodedText text) { 47 | this.text = text; 48 | } 49 | 50 | public boolean equals(Object obj) { 51 | if (! (obj instanceof ID3v2TextFrameData)) return false; 52 | if (! super.equals(obj)) return false; 53 | ID3v2TextFrameData other = (ID3v2TextFrameData) obj; 54 | if (text == null) { 55 | if (other.text != null) return false; 56 | } else if (other.text == null) return false; 57 | else if (! text.equals(other.text)) return false; 58 | return true; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/InvalidDataException.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class InvalidDataException extends BaseException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public InvalidDataException() { 8 | super(); 9 | } 10 | 11 | public InvalidDataException(String message) { 12 | super(message); 13 | } 14 | 15 | public InvalidDataException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/MutableInteger.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class MutableInteger { 4 | 5 | private int value; 6 | 7 | public MutableInteger(int value) { 8 | this.value = value; 9 | } 10 | 11 | public void increment() { 12 | value++; 13 | } 14 | 15 | public int getValue() { 16 | return value; 17 | } 18 | 19 | public void setValue(int value) { 20 | this.value = value; 21 | } 22 | 23 | public boolean equals(Object obj) { 24 | if (! (obj instanceof MutableInteger)) return false; 25 | if (super.equals(obj)) return true; 26 | MutableInteger other = (MutableInteger) obj; 27 | if (value != other.value) return false; 28 | return true; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/NoSuchTagException.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class NoSuchTagException extends BaseException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public NoSuchTagException() { 8 | super(); 9 | } 10 | 11 | public NoSuchTagException(String message) { 12 | super(message); 13 | } 14 | 15 | public NoSuchTagException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/NotSupportedException.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class NotSupportedException extends BaseException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public NotSupportedException() { 8 | super(); 9 | } 10 | 11 | public NotSupportedException(String message) { 12 | super(message); 13 | } 14 | 15 | public NotSupportedException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/UnsupportedTagException.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class UnsupportedTagException extends BaseException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public UnsupportedTagException() { 8 | super(); 9 | } 10 | 11 | public UnsupportedTagException(String message) { 12 | super(message); 13 | } 14 | 15 | public UnsupportedTagException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/Version.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic; 2 | 3 | public class Version { 4 | private static final int MAJOR_VERSION = 0; 5 | private static final int MINOR_VERSION = 8; 6 | private static final String URL = "http://github.com/mpatric/mp3agic"; 7 | 8 | public static String asString() { 9 | return getVersion() + " - " + Version.getUrl(); 10 | } 11 | public static int getMajorVersion() { 12 | return MAJOR_VERSION; 13 | } 14 | public static int getMinorVersion() { 15 | return MINOR_VERSION; 16 | } 17 | public static String getVersion() { 18 | return MAJOR_VERSION + "." + MINOR_VERSION; 19 | } 20 | public static String getUrl() { 21 | return URL; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/mpatric/mp3agic/app/BaseApp.java: -------------------------------------------------------------------------------- 1 | package com.mpatric.mp3agic.app; 2 | 3 | public class BaseApp { 4 | 5 | protected String extractFilename(String filename) { 6 | int bsPos = filename.lastIndexOf('\\'); 7 | int fsPos = filename.lastIndexOf('/'); 8 | if (bsPos >= 0 || fsPos >= 0) { 9 | if (fsPos == -1 || bsPos > fsPos) { 10 | return filename.substring(bsPos + 1); 11 | } 12 | return filename.substring(fsPos + 1); 13 | } 14 | return filename; 15 | } 16 | 17 | protected String extractPath(String filename) { 18 | int bsPos = filename.lastIndexOf('\\'); 19 | int fsPos = filename.lastIndexOf('/'); 20 | if (bsPos >= 0 || fsPos >= 0) { 21 | if (fsPos == -1 || bsPos > fsPos) { 22 | return filename.substring(0, bsPos + 1); 23 | } 24 | return filename.substring(0, fsPos + 1); 25 | } 26 | return ""; 27 | } 28 | 29 | protected String extractExtension(String filename) { 30 | int dPos = filename.lastIndexOf('.'); 31 | if (dPos >= 0) { 32 | return filename.substring(dPos); 33 | } 34 | return ""; 35 | } 36 | 37 | protected String formatExceptionMessage(Exception e) { 38 | String message = "[" + e.getClass().getName(); 39 | if (e.getMessage() != null) message += ": " + e.getMessage(); 40 | message += "]"; 41 | return message; 42 | } 43 | 44 | protected void printError(String message) { 45 | System.err.println(message); 46 | } 47 | 48 | protected void printOut(String message) { 49 | System.out.println(message); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/com/turtleplayer/Stats.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * Created by Edd Turtle (www.eddturtle.co.uk) 15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | */ 18 | 19 | // Package 20 | package com.turtleplayer; 21 | 22 | 23 | public class Stats 24 | { 25 | // ========================================= // 26 | // Attributes 27 | // ========================================= // 28 | 29 | private int totalPlayCount; 30 | 31 | 32 | // ========================================= // 33 | // Constructor 34 | // ========================================= // 35 | 36 | public Stats() 37 | { 38 | totalPlayCount = 0; 39 | } 40 | 41 | 42 | // ========================================= // 43 | // TotalPlayCount 44 | // ========================================= // 45 | 46 | public int GetTotalPlayCount() 47 | { 48 | return totalPlayCount; 49 | } 50 | 51 | public void SetTotalPlayCount(int nTotalPlayCount) 52 | { 53 | totalPlayCount = nTotalPlayCount; 54 | } 55 | 56 | public void IncrementPlayCount() 57 | { 58 | totalPlayCount++; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/com/turtleplayer/TurtlePlayer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * Created by Edd Turtle (www.eddturtle.co.uk) 15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | */ 18 | 19 | // Package 20 | package com.turtleplayer; 21 | 22 | import android.app.Application; 23 | import com.turtleplayer.persistance.turtle.db.TurtleDatabase; 24 | import com.turtleplayer.player.ObservableOutput; 25 | import com.turtleplayer.player.PlayerServiceConnector; 26 | import com.turtleplayer.playlist.Playlist; 27 | 28 | public class TurtlePlayer extends Application 29 | { 30 | public final ObservableOutput player; 31 | public Playlist playlist; 32 | public TurtleDatabase db; 33 | 34 | private static TurtlePlayer instance = null; 35 | 36 | public TurtlePlayer() 37 | { 38 | player = new PlayerServiceConnector(this); 39 | /*mp = new MediaPlayer(); 40 | playlist = new Playlist(); 41 | isPaused = true; 42 | isInitialised = false; 43 | currentlyPlaying = new Track();*/ 44 | } 45 | 46 | @Override 47 | public void onCreate() 48 | { 49 | instance = this; 50 | } 51 | 52 | public static TurtlePlayer getStaticInstance() 53 | { 54 | if(instance == null){ 55 | throw new IllegalStateException("Not initialized yet"); 56 | } 57 | return instance; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/com/turtleplayer/common/filefilter/AccessableFileFilter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.common.filefilter; 20 | 21 | 22 | import java.io.File; 23 | import java.io.FilenameFilter; 24 | 25 | public abstract class AccessableFileFilter implements FilenameFilter 26 | { 27 | public boolean accept(File dir, 28 | String filename) 29 | { 30 | return true; //TODO; accept readable 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/turtleplayer/common/filefilter/FileFilters.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.common.filefilter; 20 | 21 | import java.io.FilenameFilter; 22 | import java.util.Arrays; 23 | import java.util.List; 24 | 25 | public interface FileFilters 26 | { 27 | final static List PLAYABLE_FILES_FILTER = Arrays.asList( 28 | new NameFilter(".*.mp3", ".*.ogg") 29 | ); 30 | 31 | final static List folderArtFilters = Arrays.asList( 32 | new NameFilter("folder.jpg"), 33 | new NameFilter(".*front.*.jpg", ".*front.*.jpeg", ".*front.*.gif"), 34 | new NameFilter(".*cover.*.jpg", ".*cover.*.jpeg", ".*cover.*.gif"), 35 | new NameFilter(".*.jpg", ".*.jpeg", ".*.gif") 36 | ); 37 | } -------------------------------------------------------------------------------- /src/com/turtleplayer/common/filefilter/NameFilter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.common.filefilter; 20 | 21 | import java.io.File; 22 | 23 | public class NameFilter extends AccessableFileFilter 24 | { 25 | final String[] patterns; 26 | 27 | public NameFilter(String... patterns) 28 | { 29 | this.patterns = patterns; 30 | } 31 | 32 | @Override 33 | public boolean accept(File dir, 34 | String name) 35 | { 36 | if (super.accept(dir, name)) 37 | { 38 | for (String pattern : patterns) 39 | { 40 | if (name.toLowerCase().matches(pattern)) 41 | { 42 | return true; 43 | } 44 | } 45 | } 46 | return false; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/com/turtleplayer/controller/Observer.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.controller; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface Observer 21 | { 22 | String getId(); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/turtleplayer/dirchooser/DirChooserConstants.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.dirchooser; 20 | 21 | 22 | public class DirChooserConstants 23 | { 24 | 25 | //input/output 26 | public final static String ACTIVITY_PARAM_KEY_DIR_CHOOSER_INITIAL_DIR = "initialDir"; 27 | public final static String ACTIVITY_RETURN_KEY_DIR_CHOOSER_CHOOSED_DIR = "choosedDir"; 28 | 29 | public static final String PATH_SEPERATOR = "/"; 30 | } 31 | -------------------------------------------------------------------------------- /src/com/turtleplayer/dirchooser/FileSorter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.dirchooser; 20 | 21 | import java.io.File; 22 | import java.text.Collator; 23 | import java.util.Comparator; 24 | 25 | /** 26 | * Compares Files and sort it like: 27 | * 1.) Dir (alphabetical order) 28 | * 2.) Files (alphabetical order) 29 | */ 30 | public class FileSorter implements Comparator 31 | { 32 | @Override 33 | public int compare(File lhs, 34 | File rhs) 35 | { 36 | if (lhs == null) 37 | { 38 | return -1; 39 | } 40 | if (rhs == null) 41 | { 42 | return 1; 43 | } 44 | 45 | if (lhs.isDirectory()) 46 | { 47 | if (rhs.isDirectory()) 48 | { 49 | return nameCompare(lhs, rhs); 50 | } else 51 | { 52 | return -1; 53 | } 54 | } else 55 | { 56 | if (rhs.isDirectory()) 57 | { 58 | return 1; 59 | } else 60 | { 61 | return nameCompare(lhs, rhs); 62 | } 63 | } 64 | } 65 | 66 | private int nameCompare(File lhs, 67 | File rhs) 68 | { 69 | return Collator.getInstance().compare(lhs.getAbsolutePath(), rhs.getAbsolutePath()); 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/Album.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | public interface Album extends Instance 22 | { 23 | public String getAlbumId(); 24 | 25 | public String getAlbumName(); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/AlbumArtLocation.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.model; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class AlbumArtLocation 21 | { 22 | private final String path; 23 | private final String albumArtpath; 24 | 25 | public AlbumArtLocation(String path, 26 | String albumArtpath) 27 | { 28 | this.path = path; 29 | this.albumArtpath = albumArtpath; 30 | } 31 | 32 | public String getPath() 33 | { 34 | return path; 35 | } 36 | 37 | public String getAlbumArtpath() 38 | { 39 | return albumArtpath; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/AlbumDigest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | import com.turtleplayer.util.Shorty; 22 | 23 | public class AlbumDigest implements Album 24 | { 25 | private static final String EMPTY_REPLACMENT= "Unknown"; 26 | public static final AlbumDigest NO_ALBUM = new AlbumDigest(null); 27 | 28 | private final String id; 29 | 30 | public AlbumDigest(String id) 31 | { 32 | this.id = Shorty.avoidNull(id); 33 | } 34 | 35 | public String getAlbumId() 36 | { 37 | return id; 38 | } 39 | 40 | public String getAlbumName() 41 | { 42 | return Shorty.isVoid(id) ? EMPTY_REPLACMENT : id; 43 | } 44 | 45 | public R accept(InstanceVisitor visitor) 46 | { 47 | return visitor.visit(this); 48 | } 49 | 50 | @Override 51 | public boolean equals(Object o) 52 | { 53 | if (this == o) return true; 54 | if (o == null || getClass() != o.getClass()) return false; 55 | 56 | AlbumDigest album = (AlbumDigest) o; 57 | 58 | return id.equals(album.id); 59 | 60 | } 61 | 62 | @Override 63 | public int hashCode() 64 | { 65 | return id.hashCode(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/Artist.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | public interface Artist extends Instance 22 | { 23 | public String getArtistId(); 24 | 25 | public String getArtistName(); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/ArtistDigest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | import com.turtleplayer.util.Shorty; 22 | 23 | public class ArtistDigest implements Artist 24 | { 25 | private static final String EMPTY_REPLACMENT= "Unknown"; 26 | public static final ArtistDigest NO_ARTIST = new ArtistDigest(null); 27 | 28 | private final String id; 29 | 30 | public ArtistDigest(String id) 31 | { 32 | this.id = Shorty.avoidNull(id); 33 | } 34 | 35 | public String getArtistId() 36 | { 37 | return id; 38 | } 39 | 40 | public String getArtistName() 41 | { 42 | return Shorty.isVoid(id) ? EMPTY_REPLACMENT : id; 43 | } 44 | 45 | public R accept(InstanceVisitor visitor) 46 | { 47 | return visitor.visit(this); 48 | } 49 | 50 | @Override 51 | public boolean equals(Object o) 52 | { 53 | if (this == o) return true; 54 | if (o == null || getClass() != o.getClass()) return false; 55 | 56 | ArtistDigest artist = (ArtistDigest) o; 57 | 58 | return id.equals(artist.id); 59 | 60 | } 61 | 62 | @Override 63 | public int hashCode() 64 | { 65 | return id.hashCode(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/Genre.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | public interface Genre extends Instance 22 | { 23 | public String getGenreId(); 24 | 25 | public String getGenreName(); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/GenreDigest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | import com.turtleplayer.util.Shorty; 22 | import com.turtleplayer.util.TurtleUtil; 23 | 24 | public class GenreDigest implements Genre 25 | { 26 | private final String id; 27 | public static final GenreDigest NO_GENRE = new GenreDigest(null); 28 | 29 | public GenreDigest(String id) 30 | { 31 | this.id = Shorty.avoidNull(id); 32 | } 33 | 34 | public String getGenreId() 35 | { 36 | return id; 37 | } 38 | 39 | public String getGenreName() 40 | { 41 | return TurtleUtil.translateGenreId(id); 42 | } 43 | 44 | public R accept(InstanceVisitor visitor) 45 | { 46 | return visitor.visit(this); 47 | } 48 | 49 | @Override 50 | public boolean equals(Object o) 51 | { 52 | if (this == o) return true; 53 | if (o == null || getClass() != o.getClass()) return false; 54 | 55 | GenreDigest genre = (GenreDigest) o; 56 | 57 | return id.equals(genre.id); 58 | 59 | } 60 | 61 | @Override 62 | public int hashCode() 63 | { 64 | return id.hashCode(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/Instance.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | import java.io.Serializable; 22 | 23 | public interface Instance extends Serializable 24 | { 25 | R accept(InstanceVisitor visitor); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/InstanceCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.model; 2 | 3 | import com.turtleplayer.persistance.framework.creator.Creator; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public interface InstanceCreator extends Creator 23 | { 24 | T create(S source); 25 | } 26 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/InstanceVisitor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | public interface InstanceVisitor 22 | { 23 | R visit(Track track); 24 | 25 | R visit(SongDigest track); 26 | 27 | R visit(Album album); 28 | 29 | R visit(GenreDigest genre); 30 | 31 | R visit(ArtistDigest artist); 32 | 33 | R visit(FSobject FSobject); 34 | } 35 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/Song.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | public interface Song extends Instance 22 | { 23 | public String getSongId(); 24 | 25 | public String getSongName(); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/model/SongDigest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.model; 20 | 21 | 22 | import com.turtleplayer.util.Shorty; 23 | 24 | public class SongDigest implements Song 25 | { 26 | 27 | private static final String EMPTY_REPLACMENT= "Unknown"; 28 | private final String id; 29 | 30 | public SongDigest(String id) 31 | { 32 | this.id = id; 33 | } 34 | 35 | public String getSongId() 36 | { 37 | return id; 38 | } 39 | 40 | public String getSongName() 41 | { 42 | return Shorty.isVoid(id) ? EMPTY_REPLACMENT : id; 43 | } 44 | 45 | @Override 46 | public boolean equals(Object o) 47 | { 48 | if (this == o) return true; 49 | if (!(o instanceof SongDigest)) return false; 50 | 51 | SongDigest that = (SongDigest) o; 52 | 53 | if (id != null ? !id.equals(that.id) : that.id != null) return false; 54 | 55 | return true; 56 | } 57 | 58 | @Override 59 | public int hashCode() 60 | { 61 | return id != null ? id.hashCode() : 0; 62 | } 63 | 64 | public R accept(InstanceVisitor visitor) 65 | { 66 | return visitor.visit(this); 67 | } 68 | } -------------------------------------------------------------------------------- /src/com/turtleplayer/model/TrackBundle.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.model; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class TrackBundle 21 | { 22 | private final Track track; 23 | private final Track trackAfter; 24 | private final Track trackBefore; 25 | 26 | /** 27 | * Empty Track Bundle 28 | */ 29 | public TrackBundle() 30 | { 31 | this.track = null; 32 | this.trackAfter = null; 33 | this.trackBefore = null; 34 | } 35 | 36 | /** 37 | * @param track can be null 38 | * @param trackAfter can be null 39 | * @param trackBefore can be null 40 | */ 41 | public TrackBundle(Track track, 42 | Track trackAfter, 43 | Track trackBefore) 44 | { 45 | this.track = track; 46 | this.trackAfter = trackAfter; 47 | this.trackBefore = trackBefore; 48 | } 49 | 50 | /** 51 | * @return null if not available 52 | */ 53 | public Track getTrackBefore() 54 | { 55 | return trackBefore; 56 | } 57 | 58 | /** 59 | * @return null if not available 60 | */ 61 | public Track getTrack() 62 | { 63 | return track; 64 | } 65 | 66 | /** 67 | * @return null if not available 68 | */ 69 | public Track getTrackAfter() 70 | { 71 | return trackAfter; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/UniqueFieldGetter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework; 2 | 3 | import com.turtleplayer.persistance.source.relational.Field; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public interface UniqueFieldGetter 23 | { 24 | Field getUniqueFields(); 25 | } 26 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/creator/Creator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.creator; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface Creator 21 | { 22 | RESULT create(SOURCE source); 23 | } -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/creator/CreatorForList.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.creator; 2 | 3 | import java.util.*; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | /** 23 | * @param Instance type 24 | * @param Source type of row 25 | * @param Source type of table 26 | */ 27 | public abstract class CreatorForList implements ResultCreator, M> 28 | { 29 | private final Creator creator; 30 | 31 | protected CreatorForList(Creator creator) 32 | { 33 | this.creator = creator; 34 | } 35 | 36 | public List create(M queryResult) 37 | { 38 | List result = new ArrayList(); 39 | 40 | while(hasNext(queryResult)) 41 | { 42 | result.add(creator.create(next(queryResult))); 43 | } 44 | 45 | return result; 46 | } 47 | 48 | protected abstract boolean hasNext(M queryResult); 49 | 50 | protected abstract S next(M queryResult); 51 | } 52 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/creator/ResultCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.creator; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface ResultCreator extends Creator 21 | { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/db/Database.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.db; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * @param eg Cursor 22 | * @param eg sql as String 23 | * @param DB object for write operations 24 | */ 25 | public interface Database 26 | { 27 | abstract I read(Q query, DbReadOp readOp); 28 | abstract int write(DbWriteOp writer, I instance); 29 | 30 | interface DbReadOp 31 | { 32 | public I read(C db); 33 | } 34 | 35 | interface DbWriteOp 36 | { 37 | public int write(D target, I instance); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/db/ObservableDatabase.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.db; 2 | 3 | import com.turtleplayer.controller.Observer; 4 | import com.turtleplayer.model.Instance; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | public abstract class ObservableDatabase implements Database 27 | { 28 | 29 | //--------------------------------------------- Observable 30 | 31 | private final Map observers = new HashMap(); 32 | 33 | public void notifyUpdate(Instance instance){ 34 | for(DbObserver observer : observers.values()){ 35 | observer.updated(instance); 36 | } 37 | } 38 | 39 | public void notifyCleared(){ 40 | for(DbObserver observer : observers.values()){ 41 | observer.cleared(); 42 | } 43 | } 44 | 45 | public interface DbObserver extends Observer 46 | { 47 | void updated(Instance instance); 48 | void cleared(); 49 | } 50 | 51 | public void addObserver(DbObserver observer) 52 | { 53 | observers.put(observer.getId(), observer); 54 | } 55 | 56 | public void removeObserver(DbObserver observer) 57 | { 58 | observers.remove(observer); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/filter/Filter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.filter; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public interface Filter extends Serializable 23 | { 24 | public abstract R accept(FilterVisitor visitor); 25 | } 26 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/filter/FilterVisitor.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.filter; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * @param What the Visitor Produces (can be {@link Void} if nothing gets produced) 22 | */ 23 | public interface FilterVisitor 24 | { 25 | R visit(FieldFilter fieldFilter); 26 | 27 | R visit(FilterSet filterSet); 28 | 29 | R visit(NotFilter notFilter); 30 | } 31 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/filter/FilterVisitorGenerified.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.filter; 2 | 3 | import com.turtleplayer.persistance.source.relational.FieldPersistable; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public abstract class FilterVisitorGenerified implements FilterVisitor 23 | { 24 | public abstract R visit(FieldFilter fieldFilter, 25 | FieldPersistable field); 26 | 27 | final public R visit(FieldFilter fieldFilter) 28 | { 29 | return visit((FieldFilter) fieldFilter, (FieldPersistable) fieldFilter.getField()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/filter/NotFilter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.filter; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class NotFilter implements Filter 21 | { 22 | private final Filter filter; 23 | 24 | public NotFilter(Filter filter) 25 | { 26 | this.filter = filter; 27 | } 28 | 29 | public R accept(FilterVisitor visitor) 30 | { 31 | return visitor.visit(this); 32 | } 33 | 34 | public Filter getFilter() 35 | { 36 | return filter; 37 | } 38 | 39 | @Override 40 | public String toString() 41 | { 42 | return " NOT (" + filter.toString() + ") "; 43 | } 44 | 45 | @Override 46 | public boolean equals(Object o) 47 | { 48 | if (this == o) return true; 49 | if (!(o instanceof NotFilter)) return false; 50 | 51 | NotFilter notFilter = (NotFilter) o; 52 | 53 | if (filter != null ? !filter.equals(notFilter.filter) : notFilter.filter != null) return false; 54 | 55 | return true; 56 | } 57 | 58 | @Override 59 | public int hashCode() 60 | { 61 | return filter != null ? filter.hashCode() : 0; 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/filter/Operator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.filter; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public enum Operator 21 | { 22 | GT, 23 | LT, 24 | GE, 25 | LE, 26 | EQ, 27 | NEQ, 28 | LIKE, 29 | NOT_LIKE 30 | } 31 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/filter/ResultFilter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.filter; 2 | 3 | import java.util.Set; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | /** 23 | * @param eg Instance 24 | */ 25 | public interface ResultFilter 26 | { 27 | Set apply(Set results); 28 | } 29 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/mapping/Mapping.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.mapping; 2 | 3 | import com.turtleplayer.persistance.framework.creator.Creator; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | * 21 | * Knows how to create I's from C's which are dependent from Q 22 | * Eg: Knows How to create an Instance I from Query result Cursor C from Sql Q 23 | * 24 | * @param eg sql String 25 | * @param resulting instance 26 | * @param eg cursor 27 | */ 28 | public interface Mapping extends Creator, QueryGenerator 29 | { 30 | Q get(); 31 | I create(C queryResult); 32 | } 33 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/mapping/QueryGenerator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.mapping; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface QueryGenerator 21 | { 22 | Q get(); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/paging/Paging.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.paging; 2 | 3 | import com.turtleplayer.persistance.framework.filter.*; 4 | import com.turtleplayer.persistance.framework.sort.*; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public abstract class Paging 24 | { 25 | 26 | public static Filter getFilter(Filter oldFilters, 27 | RESULT instance, 28 | Order order) 29 | { 30 | if(instance != null) 31 | { 32 | return new FilterSet(order.accept(new PagingFilterBuilder(instance)), oldFilters); 33 | } 34 | else 35 | { 36 | return oldFilters; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/query/OperationDelete.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface OperationDelete 21 | { 22 | int delete(D db, T target); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/query/OperationInsert.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * @param write target eg SQLiteDb 22 | * @param Object Type of the write information 23 | */ 24 | public interface OperationInsert 25 | { 26 | int insert(D db, I instance); 27 | } 28 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/query/OperationRead.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * @param write target eg SQLiteDb 22 | * @param Object type that knows how to do the operation 23 | * @param Object Type of the write information 24 | */ 25 | public interface OperationRead 26 | { 27 | I map(R dbResult); 28 | 29 | Q get(); 30 | } 31 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/sort/Order.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.sort; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * @param eg sql as String 22 | */ 23 | public interface Order 24 | { 25 | R accept(OrderVisitor visitor); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/sort/OrderSet.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.sort; 2 | 3 | import java.util.*; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public class OrderSet implements Order 23 | { 24 | private final List> orders = new ArrayList>(); 25 | 26 | public OrderSet(Order... order) 27 | { 28 | Collections.addAll(orders, order); 29 | } 30 | 31 | public OrderSet(List> orders) 32 | { 33 | this.orders.addAll(orders); 34 | } 35 | 36 | /** 37 | * @return never null, Set can be empty 38 | */ 39 | public List> getOrders() 40 | { 41 | return orders; 42 | } 43 | 44 | public R accept(OrderVisitor visitor) 45 | { 46 | return visitor.visit(this); 47 | } 48 | 49 | public OrderSet removeLast() 50 | { 51 | if(orders.size() > 1) 52 | { 53 | return new OrderSet(orders.subList(0, orders.size()-1)); 54 | } 55 | else 56 | { 57 | return new OrderSet(new ArrayList>()); 58 | } 59 | } 60 | 61 | public boolean isEmpty() 62 | { 63 | return orders.isEmpty(); 64 | } 65 | 66 | @Override 67 | public String toString() 68 | { 69 | return Arrays.deepToString(orders.toArray()); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/sort/OrderVisitor.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.sort; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface OrderVisitor 21 | { 22 | R visit(FieldOrder fieldOrder); 23 | 24 | R visit(RandomOrder orderFilter); 25 | 26 | R visit(OrderSet orderFilter); 27 | } 28 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/sort/OrderVisitorGenerified.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.sort; 2 | 3 | import com.turtleplayer.persistance.source.relational.FieldPersistable; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public abstract class OrderVisitorGenerified implements OrderVisitor 23 | { 24 | public abstract R visit(FieldOrder fieldOrder, 25 | FieldPersistable field); 26 | 27 | final public R visit(FieldOrder fieldOrder) 28 | { 29 | return visit((FieldOrder)fieldOrder, (FieldPersistable)fieldOrder.getField()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/sort/RandomOrder.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.sort; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class RandomOrder implements Order 21 | { 22 | 23 | public R accept(OrderVisitor visitor) 24 | { 25 | return visitor.visit(this); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/framework/sort/SortOrder.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.framework.sort; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public enum SortOrder 21 | { 22 | ASC, 23 | DESC 24 | } 25 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/Field.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public class Field implements Serializable 23 | { 24 | private final String name; 25 | 26 | public Field(String name) 27 | { 28 | this.name = name; 29 | } 30 | 31 | public String getName() 32 | { 33 | return name; 34 | } 35 | 36 | @Override 37 | public boolean equals(Object o) 38 | { 39 | if (this == o) return true; 40 | if (o == null || getClass() != o.getClass()) return false; 41 | 42 | Field field = (Field) o; 43 | 44 | if (!name.equals(field.name)) return false; 45 | 46 | return true; 47 | } 48 | 49 | @Override 50 | public int hashCode() 51 | { 52 | return name.hashCode(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/FieldPersistable.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational; 2 | 3 | import com.turtleplayer.persistance.framework.creator.Creator; 4 | import com.turtleplayer.persistance.source.relational.fieldtype.FieldVisitor; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public abstract class FieldPersistable extends Field 24 | { 25 | private final Creator mapping; 26 | 27 | protected FieldPersistable(String name, 28 | Creator mapping) 29 | { 30 | super(name); 31 | this.mapping = mapping; 32 | } 33 | 34 | public FieldPersistable(FieldPersistable fieldPersistable) 35 | { 36 | this(fieldPersistable.getName(), fieldPersistable.mapping); 37 | } 38 | 39 | public TYPE get(RESULT type) 40 | { 41 | return mapping.create(type); 42 | } 43 | 44 | public abstract R accept(FieldVisitor visitor); 45 | } 46 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/Table.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational; 2 | 3 | import com.turtleplayer.util.Shorty; 4 | 5 | import java.util.Set; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public abstract class Table implements View 25 | { 26 | final String name; 27 | 28 | public Table(String name) 29 | { 30 | this.name = name; 31 | } 32 | 33 | public String getName() 34 | { 35 | return name; 36 | } 37 | 38 | public Set getTables() 39 | { 40 | return Shorty.oneElementSet(this); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/View.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | import java.util.Set; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public interface View extends Serializable 25 | { 26 | public Set getTables(); 27 | 28 | public List getFields(); 29 | } 30 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/fieldtype/FieldPersistableAsDouble.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational.fieldtype; 2 | 3 | import com.turtleplayer.persistance.framework.creator.Creator; 4 | import com.turtleplayer.persistance.source.relational.FieldPersistable; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public class FieldPersistableAsDouble extends FieldPersistable 24 | { 25 | public FieldPersistableAsDouble(String name, 26 | Creator mapping) 27 | { 28 | super(name, mapping); 29 | } 30 | 31 | public FieldPersistableAsDouble(FieldPersistable fieldPersistable) 32 | { 33 | super(fieldPersistable); 34 | } 35 | 36 | @Override 37 | public R accept(FieldVisitor visitor) 38 | { 39 | return visitor.visit(this); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/fieldtype/FieldPersistableAsInteger.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational.fieldtype; 2 | 3 | import com.turtleplayer.persistance.framework.creator.Creator; 4 | import com.turtleplayer.persistance.source.relational.FieldPersistable; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public class FieldPersistableAsInteger extends FieldPersistable 24 | { 25 | public FieldPersistableAsInteger(String name, 26 | Creator mapping) 27 | { 28 | super(name, mapping); 29 | } 30 | 31 | public FieldPersistableAsInteger(FieldPersistable fieldPersistable) 32 | { 33 | super(fieldPersistable); 34 | } 35 | 36 | @Override 37 | public R accept(FieldVisitor visitor) 38 | { 39 | return visitor.visit(this); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/fieldtype/FieldPersistableAsString.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational.fieldtype; 2 | 3 | import com.turtleplayer.persistance.framework.creator.Creator; 4 | import com.turtleplayer.persistance.source.relational.FieldPersistable; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public class FieldPersistableAsString extends FieldPersistable 24 | { 25 | public FieldPersistableAsString(String name, 26 | Creator mapping) 27 | { 28 | super(name, mapping); 29 | } 30 | 31 | public FieldPersistableAsString(FieldPersistable fieldPersistable) 32 | { 33 | super(fieldPersistable); 34 | } 35 | 36 | @Override 37 | public R accept(FieldVisitor visitor) 38 | { 39 | return visitor.visit(this); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/fieldtype/FieldVisitor.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational.fieldtype; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * @param What the Visitor Produces (can be {@link Void} if nothing gets produced) 22 | */ 23 | public interface FieldVisitor 24 | { 25 | R visit(FieldPersistableAsString field); 26 | 27 | R visit(FieldPersistableAsDouble field); 28 | 29 | R visit(FieldPersistableAsInteger field); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/relational/fieldtype/ToStringFieldVisitor.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.relational.fieldtype; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class ToStringFieldVisitor implements FieldVisitor 21 | { 22 | final RESULT result; 23 | 24 | public ToStringFieldVisitor(RESULT result) 25 | { 26 | this.result = result; 27 | } 28 | 29 | public String visit(FieldPersistableAsString field) 30 | { 31 | return field.get(result); 32 | } 33 | 34 | public String visit(FieldPersistableAsDouble field) 35 | { 36 | return field.get(result).toString(); 37 | } 38 | 39 | public String visit(FieldPersistableAsInteger field) 40 | { 41 | return field.get(result).toString(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/Counter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.framework.mapping.Mapping; 5 | import com.turtleplayer.persistance.source.relational.Table; 6 | import com.turtleplayer.persistance.source.sql.query.Select; 7 | import com.turtleplayer.persistance.source.sql.query.Sql; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | public abstract class Counter implements Mapping 27 | { 28 | private final Table table; 29 | 30 | public Counter(Table table) 31 | { 32 | this.table = table; 33 | } 34 | 35 | public Select get() 36 | { 37 | return new Select(table, Select.SelectMethod.COUNT, Sql.FIELD_PSEUDO_STAR); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/First.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.framework.creator.Creator; 5 | import com.turtleplayer.persistance.framework.mapping.Mapping; 6 | import com.turtleplayer.persistance.source.relational.Table; 7 | import com.turtleplayer.persistance.source.sql.query.Limit; 8 | import com.turtleplayer.persistance.source.sql.query.Select; 9 | 10 | /** 11 | * TURTLE PLAYER 12 | *

13 | * Licensed under MIT & GPL 14 | *

15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 16 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 17 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 19 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 20 | * OR OTHER DEALINGS IN THE SOFTWARE. 21 | *

22 | * More Information @ www.turtle-player.co.uk 23 | * 24 | * @author Simon Honegger (Hoene84) 25 | */ 26 | 27 | public class First implements Mapping 28 | { 29 | private final Table table; 30 | private final Creator creator; 31 | 32 | public First(Table table, 33 | Creator creator) 34 | { 35 | this.table = table; 36 | this.creator = creator; 37 | } 38 | 39 | public Select get() 40 | { 41 | Select select = new Select(table); 42 | select.setLimit(new Limit(1)); 43 | return select; 44 | } 45 | 46 | public I create(Cursor queryResult) 47 | { 48 | if(queryResult.moveToFirst()){ 49 | return creator.create(queryResult); 50 | } 51 | else 52 | { 53 | return null; 54 | } 55 | 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/Limited.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.framework.creator.Creator; 5 | import com.turtleplayer.persistance.source.relational.Table; 6 | import com.turtleplayer.persistance.source.sql.query.Limit; 7 | import com.turtleplayer.persistance.source.sql.query.Select; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | /** 13 | * TURTLE PLAYER 14 | *

15 | * Licensed under MIT & GPL 16 | *

17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 19 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 22 | * OR OTHER DEALINGS IN THE SOFTWARE. 23 | *

24 | * More Information @ www.turtle-player.co.uk 25 | * 26 | * @author Simon Honegger (Hoene84) 27 | */ 28 | 29 | public class Limited extends First> 30 | { 31 | private final int limit; 32 | 33 | public Limited(Table table, 34 | Creator, Cursor> creator, 35 | int limit) 36 | { 37 | super(table, creator); 38 | this.limit = limit; 39 | } 40 | 41 | public Select get() 42 | { 43 | Select select = super.get(); 44 | select.setLimit(new Limit(limit)); 45 | return select; 46 | } 47 | 48 | public List create(Cursor queryResult) 49 | { 50 | List result = super.create(queryResult); 51 | return result == null ? new ArrayList() : result; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/MappingTable.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.framework.creator.CreatorForList; 5 | import com.turtleplayer.persistance.framework.mapping.Mapping; 6 | import com.turtleplayer.persistance.source.relational.Table; 7 | import com.turtleplayer.persistance.source.sql.query.Select; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * TURTLE PLAYER 13 | *

14 | * Licensed under MIT & GPL 15 | *

16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 17 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 18 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 21 | * OR OTHER DEALINGS IN THE SOFTWARE. 22 | *

23 | * More Information @ www.turtle-player.co.uk 24 | * 25 | * @author Simon Honegger (Hoene84) 26 | */ 27 | 28 | public class MappingTable implements Mapping, Cursor> 29 | { 30 | private final Table table; 31 | private final CreatorForList creator; 32 | 33 | public MappingTable(Table table, CreatorForList creator) 34 | { 35 | this.table = table; 36 | this.creator = creator; 37 | } 38 | 39 | public Select get() 40 | { 41 | return new Select(table); 42 | } 43 | 44 | public List create(Cursor queryResult) 45 | { 46 | return creator.create(queryResult); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/QueryGeneratorTable.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql; 2 | 3 | import android.content.ContentValues; 4 | import com.turtleplayer.persistance.framework.mapping.Mapping; 5 | import com.turtleplayer.persistance.source.relational.Table; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public abstract class QueryGeneratorTable implements Mapping 25 | { 26 | final Table table; 27 | 28 | public QueryGeneratorTable(Table table) 29 | { 30 | this.table = table; 31 | } 32 | 33 | public Table get() 34 | { 35 | return table; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/BoolOperator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public enum BoolOperator implements SqlFragment 21 | { 22 | AND(" and "), 23 | OR(" and "); 24 | 25 | private final String sql; 26 | 27 | private BoolOperator(String sql) 28 | { 29 | this.sql = sql; 30 | } 31 | 32 | 33 | public String toSql() 34 | { 35 | return sql; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/FieldsPart.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import com.turtleplayer.persistance.source.relational.Field; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public class FieldsPart implements SqlFragment 25 | { 26 | private final List fields; 27 | 28 | public FieldsPart(List fields) 29 | { 30 | this.fields = fields; 31 | } 32 | 33 | public String toSql() 34 | { 35 | String[] fieldNames = new String[fields.size()]; 36 | int i = 0; 37 | for(Field field : fields) 38 | { 39 | fieldNames[i++] = field.getName(); 40 | } 41 | return Helper.getSeparatedList(", ", fieldNames); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/Helper.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public abstract class Helper 21 | { 22 | public static String getSeparatedList(String separator, String... values){ 23 | 24 | String result = ""; 25 | 26 | for(String value : values) 27 | { 28 | result += value + separator; 29 | } 30 | return removeLast(result, separator); 31 | } 32 | 33 | public static String getSeparatedList(String separator, SqlFragment... fragments){ 34 | 35 | String result = ""; 36 | 37 | for(SqlFragment fragment : fragments) 38 | { 39 | result += fragment.toSql() + separator; 40 | } 41 | return removeLast(result, separator); 42 | } 43 | 44 | public static String removeLast(String s, String pattern){ 45 | return s.endsWith(pattern) ? 46 | s.substring(0, s.length() - pattern.length()) : 47 | s; //cut off last pattern 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/Limit.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class Limit implements SqlFragment 21 | { 22 | final int limit; 23 | 24 | public Limit(int limit) 25 | { 26 | this.limit = limit; 27 | } 28 | 29 | public String toSql() 30 | { 31 | return " LIMIT " + limit + " "; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/Operator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public enum Operator 21 | { 22 | GT(" > "), 23 | LT(" < "), 24 | GE(" >= "), 25 | LE(" <= "), 26 | EQ(" = "), 27 | NEQ(" != "), 28 | LIKE(" LIKE "), 29 | NOT_LIKE(" NOT LIKE "); 30 | 31 | final String string; 32 | 33 | private Operator(String op) 34 | { 35 | this.string = op; 36 | } 37 | 38 | @Override 39 | public String toString() 40 | { 41 | return string; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/OrderClause.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | /** 21 | * Marker Interface 22 | */ 23 | public interface OrderClause extends SqlFragment, OrderClausePart 24 | { 25 | OrderClause apply(OrderClause orderClause); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/OrderClauseFields.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class OrderClauseFields implements OrderClause 21 | { 22 | private final String sql; 23 | 24 | public OrderClauseFields(OrderClausePart... parts) 25 | { 26 | sql = Helper.getSeparatedList(" , ", parts); 27 | } 28 | 29 | private OrderClauseFields(OrderClause orderClause, OrderClause orderClause2) 30 | { 31 | sql = orderClause.toSql() + " , " + orderClause2.toSql(); 32 | } 33 | 34 | public String toSql(){ 35 | return sql; 36 | } 37 | 38 | public OrderClause apply(OrderClause orderClause) 39 | { 40 | return new OrderClauseFields(this, orderClause); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/OrderClausePart.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface OrderClausePart extends SqlFragment 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/OrderClausePartField.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import com.turtleplayer.persistance.framework.sort.SortOrder; 4 | import com.turtleplayer.persistance.source.relational.Field; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public class OrderClausePartField implements OrderClausePart 24 | { 25 | final Field field; 26 | final SqlOrder order; 27 | 28 | public OrderClausePartField(Field field, 29 | SortOrder order) 30 | { 31 | this.field = field; 32 | 33 | switch (order) 34 | { 35 | case ASC: 36 | this.order = SqlOrder.ASC; 37 | break; 38 | case DESC: 39 | this.order = SqlOrder.DESC; 40 | break; 41 | default: 42 | this.order = SqlOrder.ASC; 43 | } 44 | } 45 | 46 | public String toSql() 47 | { 48 | return " " + field.getName() + " " + order.toSql() + " "; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/OrderClauseRandom.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPLS 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class OrderClauseRandom implements OrderClause 21 | { 22 | public String toSql() 23 | { 24 | return " RANDOM() "; 25 | } 26 | 27 | public OrderClause apply(OrderClause orderClause) 28 | { 29 | throw new RuntimeException("random order cant be chained"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/Sql.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import com.turtleplayer.persistance.source.relational.Field; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | * 21 | * Marker Interface for a complete, executable Sql 22 | */ 23 | 24 | public interface Sql extends SqlPart 25 | { 26 | public static final Field FIELD_PSEUDO_STAR = new Field("*"); 27 | } 28 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/SqlFragment.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface SqlFragment 21 | { 22 | String toSql(); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/SqlOrder.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public enum SqlOrder 21 | { 22 | ASC(" ASC "), 23 | DESC(" DESC "); 24 | 25 | final String sql; 26 | 27 | private SqlOrder(String sql) 28 | { 29 | this.sql = sql; 30 | } 31 | 32 | 33 | public String toSql() 34 | { 35 | return sql; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/SqlPart.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public interface SqlPart extends SqlFragment 23 | { 24 | List getParams(); 25 | } 26 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/TablesPart.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import com.turtleplayer.persistance.source.relational.Table; 4 | 5 | import java.util.Set; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public class TablesPart implements SqlFragment 25 | { 26 | private final Set tables; 27 | 28 | public TablesPart(Set tables) 29 | { 30 | this.tables = tables; 31 | } 32 | 33 | public String toSql() 34 | { 35 | String[] tableNames = new String[tables.size()]; 36 | int i = 0; 37 | for(Table table : tables) 38 | { 39 | tableNames[i++] = table.getName(); 40 | } 41 | return Helper.getSeparatedList(", ", tableNames); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/WhereClause.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | /** 25 | * Immutable 26 | */ 27 | public class WhereClause implements WhereClausePart 28 | { 29 | private List params = new ArrayList(); 30 | private final String sql; 31 | 32 | public WhereClause(WhereClauseField part) 33 | { 34 | sql = part.toSql(); 35 | params.addAll(part.getParams()); 36 | } 37 | 38 | private WhereClause(String sql, List params) 39 | { 40 | this.sql = sql; 41 | this.params = params; 42 | } 43 | 44 | public WhereClause apply(BoolOperator op, WhereClausePart part){ 45 | 46 | if(part == null) 47 | { 48 | return this; 49 | } 50 | List newParams = new ArrayList(params); 51 | newParams.addAll(part.getParams()); 52 | 53 | String newSql = " (" + sql + ") " + op + " (" + part.toSql() + ") "; 54 | return new WhereClause(newSql, newParams); 55 | } 56 | 57 | public String toSql(){ 58 | return sql; 59 | } 60 | 61 | public List getParams() 62 | { 63 | return Collections.unmodifiableList(params); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/WhereClauseField.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | import com.turtleplayer.persistance.source.relational.Field; 4 | 5 | import java.util.Arrays; 6 | import java.util.List; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class WhereClauseField implements WhereClausePart 26 | { 27 | 28 | final Field field; 29 | final Object value; 30 | final Operator op; 31 | 32 | public WhereClauseField(Field field, 33 | Object value, 34 | Operator op) 35 | { 36 | this.field = field; 37 | this.value = value; 38 | this.op = op; 39 | } 40 | 41 | public String toSql() 42 | { 43 | return " " + field.getName() + op + " ? "; 44 | } 45 | 46 | public List getParams() 47 | { 48 | return Arrays.asList(value); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sql/query/WhereClausePart.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sql.query; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface WhereClausePart extends SqlPart 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sqlite/CounterSqlite.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sqlite; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.source.relational.Table; 5 | import com.turtleplayer.persistance.source.sql.Counter; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public class CounterSqlite extends Counter 25 | { 26 | public CounterSqlite(Table table) 27 | { 28 | super(table); 29 | } 30 | 31 | public Integer create(Cursor queryResult) 32 | { 33 | queryResult.moveToFirst(); 34 | return queryResult.getInt(0); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sqlite/CreatorForListSqlite.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sqlite; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.framework.creator.CreatorForList; 5 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | /** 25 | * @param resulting set contains instance I 26 | */ 27 | public class CreatorForListSqlite extends CreatorForList 28 | { 29 | public CreatorForListSqlite(ResultCreator creator) 30 | { 31 | super(creator); 32 | } 33 | 34 | @Override 35 | public boolean hasNext(Cursor queryResult) 36 | { 37 | return !queryResult.isLast() && !queryResult.isAfterLast(); 38 | } 39 | 40 | @Override 41 | public Cursor next(Cursor queryResult) 42 | { 43 | queryResult.moveToNext(); 44 | return queryResult; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sqlite/DeleteTableContentSqlLite.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sqlite; 2 | 3 | import android.database.sqlite.SQLiteDatabase; 4 | import com.turtleplayer.persistance.framework.query.OperationDelete; 5 | import com.turtleplayer.persistance.source.relational.Table; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public class DeleteTableContentSqlLite implements OperationDelete 25 | { 26 | public int delete(SQLiteDatabase db, 27 | Table target) 28 | { 29 | return db.delete(target.getName(), null, null); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/source/sqlite/InsertOperationSqlLite.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.source.sqlite; 2 | 3 | import android.content.ContentValues; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import com.turtleplayer.persistance.framework.query.OperationInsert; 6 | import com.turtleplayer.persistance.framework.mapping.Mapping; 7 | import com.turtleplayer.persistance.source.relational.Table; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | public class InsertOperationSqlLite implements OperationInsert 27 | { 28 | private final Mapping mapping; 29 | 30 | public InsertOperationSqlLite(Mapping mapping) 31 | { 32 | this.mapping = mapping; 33 | } 34 | 35 | public int insert(final SQLiteDatabase db, I instance) 36 | { 37 | long newRowId = db.insert(mapping.get().getName(), null, mapping.create(instance)); 38 | return (newRowId < 0) ? 0 : 1; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/FileBase.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle; 2 | 3 | import com.turtleplayer.model.*; 4 | import com.turtleplayer.persistance.framework.filter.Filter; 5 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 6 | 7 | import java.util.Collection; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | /** 27 | * @param eg sql as String 28 | */ 29 | public interface FileBase 30 | { 31 | Collection getTracks(Filter filter); 32 | 33 | Collection getAlbums(Filter filter); 34 | 35 | Collection getArtists(Filter filter); 36 | 37 | Collection getGenres(Filter filter); 38 | 39 | Collection getSongs(Filter filter); 40 | } 41 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/filter/DirFilter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.filter; 2 | 3 | import com.turtleplayer.model.Track; 4 | import com.turtleplayer.persistance.framework.filter.*; 5 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 6 | 7 | /** 8 | * TURTLE PLAYER 9 | *

10 | * Licensed under MIT & GPL 11 | *

12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 15 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 17 | * OR OTHER DEALINGS IN THE SOFTWARE. 18 | *

19 | * More Information @ www.turtle-player.co.uk 20 | * 21 | * @author Simon Honegger (Hoene84) 22 | */ 23 | 24 | public class DirFilter extends FieldFilter 25 | { 26 | /** 27 | * @param operator 28 | * @param value should be in form /dir1/dir2/ 29 | */ 30 | public DirFilter(Operator operator, 31 | String value) 32 | { 33 | super(Tables.Dirs.PATH, operator, value); 34 | } 35 | 36 | public boolean filtersInPath(String filter) 37 | { 38 | return value.startsWith(filter); 39 | } 40 | 41 | @Override 42 | public R accept(FilterVisitor visitor) 43 | { 44 | return visitor instanceof TurtleFilterVisitor ? ((TurtleFilterVisitor)visitor) .visit(this) : visitor.visit(this); 45 | } 46 | 47 | public String getValueWithoutWildcards() 48 | { 49 | String result = getValue(); 50 | if (result.length() > 0 && result.charAt(result.length() - 1) == '%') { 51 | result = result.substring(0, result.length()-1); 52 | } 53 | if (result.length() > 0 && result.charAt(0) == '%') { 54 | result = result.substring(1, result.length()); 55 | } 56 | return result; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/filter/TurtleFilterVisitor.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.filter; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | import com.turtleplayer.persistance.framework.filter.FilterVisitor; 21 | 22 | /** 23 | * @param What the Visitor Produces (can be {@link Void} if nothing gets produced) 24 | */ 25 | public interface TurtleFilterVisitor extends FilterVisitor 26 | { 27 | R visit(DirFilter dirFilter); 28 | } 29 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/AlbumArtLoactionToDbMapper.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.content.ContentValues; 4 | import com.turtleplayer.model.AlbumArtLocation; 5 | import com.turtleplayer.persistance.source.sql.QueryGeneratorTable; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class AlbumArtLoactionToDbMapper extends QueryGeneratorTable 26 | { 27 | public AlbumArtLoactionToDbMapper() 28 | { 29 | super(Tables.ALBUM_ART_LOCATIONS); 30 | } 31 | 32 | public ContentValues create(AlbumArtLocation albumArtLocation) 33 | { 34 | final ContentValues values = new ContentValues(); 35 | 36 | values.put(Tables.AlbumArtLocations.PATH.getName(), albumArtLocation.getPath()); 37 | values.put(Tables.AlbumArtLocations.ALBUM_ART_PATH.getName(), albumArtLocation.getAlbumArtpath()); 38 | 39 | return values; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/AlbumArtLocationCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.*; 5 | import com.turtleplayer.persistance.framework.creator.Creator; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class AlbumArtLocationCreator implements Creator 26 | { 27 | public AlbumArtLocation create(Cursor cursor) 28 | { 29 | return new AlbumArtLocation( 30 | cursor.getString(cursor.getColumnIndex(Tables.AlbumArtLocations.PATH.getName())), 31 | cursor.getString(cursor.getColumnIndex(Tables.AlbumArtLocations.ALBUM_ART_PATH.getName())) 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/AlbumCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.Album; 5 | import com.turtleplayer.model.AlbumDigest; 6 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 7 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | public class AlbumCreator implements ResultCreator 27 | { 28 | public Album create(Cursor source) 29 | { 30 | return new AlbumDigest(source.getString(source.getColumnIndex(Tables.AlbumsReadable.ALBUM.getName()))); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/ArtistCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.ArtistDigest; 5 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | import com.turtleplayer.persistance.turtle.db.structure.Views; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | public class ArtistCreator implements ResultCreator 27 | { 28 | public ArtistDigest create(Cursor source) 29 | { 30 | return new ArtistDigest(source.getString(source.getColumnIndex(Tables.ArtistsReadable.ARTIST.getName()))); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/DirCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.FSobject; 5 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class DirCreator implements ResultCreator 26 | { 27 | public FSobject create(Cursor source) 28 | { 29 | return new FSobject( 30 | source.getString(source.getColumnIndex(Tables.Dirs.PATH.getName())), 31 | source.getString(source.getColumnIndex(Tables.Dirs.NAME.getName())) 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/FsObjectToDbMapper.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.content.ContentValues; 4 | import com.turtleplayer.model.FSobject; 5 | import com.turtleplayer.persistance.source.sql.QueryGeneratorTable; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class FsObjectToDbMapper extends QueryGeneratorTable 26 | { 27 | public FsObjectToDbMapper() 28 | { 29 | super(Tables.DIRS); 30 | } 31 | 32 | public ContentValues create(FSobject fsObject) 33 | { 34 | final ContentValues values = new ContentValues(); 35 | 36 | values.put(Tables.Dirs.NAME.getName(), fsObject.getName()); 37 | values.put(Tables.Dirs.PATH.getName(), fsObject.getPath()); 38 | 39 | return values; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/GenreCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.GenreDigest; 5 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class GenreCreator implements ResultCreator 26 | { 27 | public GenreDigest create(Cursor source) 28 | { 29 | return new GenreDigest(source.getString(source.getColumnIndex(Tables.GenresReadable.GENRE.getName()))); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/SongCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.SongDigest; 5 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class SongCreator implements ResultCreator 26 | { 27 | 28 | public SongDigest create(Cursor source) 29 | { 30 | return new SongDigest(source.getString(source.getColumnIndex(Tables.SongsReadable.TITLE.getName()))); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/StringCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.persistance.framework.creator.Creator; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | /** 24 | * Creates a String based on a table entry, fields separated by the given separator 25 | */ 26 | public class StringCreator implements Creator 27 | { 28 | final String separator; 29 | 30 | public StringCreator(String separator) 31 | { 32 | this.separator = separator; 33 | } 34 | 35 | public String create(Cursor source) 36 | { 37 | String string = ""; 38 | 39 | for(int i = 0; i < source.getColumnCount(); i++){ 40 | string += source.getString(i) + separator; 41 | } 42 | return string.length() > 0 ? string.substring(0, string.length() - separator.length()) : ""; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/TrackCreator.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.database.Cursor; 4 | import com.turtleplayer.model.*; 5 | import com.turtleplayer.persistance.framework.creator.ResultCreator; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class TrackCreator implements ResultCreator 26 | { 27 | public Track create(Cursor cursor) 28 | { 29 | return new Track( 30 | new SongDigest(cursor.getString(cursor.getColumnIndex(Tables.SongsReadable.TITLE.getName()))), 31 | new ArtistDigest(cursor.getString(cursor.getColumnIndex(Tables.ArtistsReadable.ARTIST.getName()))), 32 | new AlbumDigest(cursor.getString(cursor.getColumnIndex(Tables.AlbumsReadable.ALBUM.getName()))), 33 | new GenreDigest(cursor.getString(cursor.getColumnIndex(Tables.GenresReadable.GENRE.getName()))), 34 | cursor.getInt(cursor.getColumnIndex(Tables.Tracks.NUMBER.getName())), 35 | cursor.getString(cursor.getColumnIndex(Tables.FsObjects.PATH.getName())), 36 | cursor.getString(cursor.getColumnIndex(Tables.FsObjects.NAME.getName())) 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/turtleplayer/persistance/turtle/mapping/TrackToDbMapper.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.persistance.turtle.mapping; 2 | 3 | import android.content.ContentValues; 4 | import com.turtleplayer.model.Track; 5 | import com.turtleplayer.persistance.source.sql.QueryGeneratorTable; 6 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public class TrackToDbMapper extends QueryGeneratorTable 26 | { 27 | public TrackToDbMapper() 28 | { 29 | super(Tables.TRACKS); 30 | } 31 | 32 | public ContentValues create(Track track) 33 | { 34 | final ContentValues values = new ContentValues(); 35 | 36 | values.put(Tables.SongsReadable.TITLE.getName(), track.getSongName()); 37 | values.put(Tables.Tracks.NUMBER.getName(), track.GetNumber()); 38 | values.put(Tables.ArtistsReadable.ARTIST.getName(), track.getArtistId()); 39 | values.put(Tables.AlbumsReadable.ALBUM.getName(), track.getAlbumId()); 40 | values.put(Tables.GenresReadable.GENRE.getName(), track.getGenreId()); 41 | values.put(Tables.FsObjects.PATH.getName(), track.getPath()); 42 | values.put(Tables.FsObjects.NAME.getName(), track.getName()); 43 | 44 | return values; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/com/turtleplayer/player/ObservableOutput.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.player; 2 | 3 | import com.turtleplayer.controller.Observer; 4 | import com.turtleplayer.model.Track; 5 | 6 | import java.util.HashMap; 7 | 8 | /** 9 | * TURTLE PLAYER 10 | *

11 | * Licensed under MIT & GPL 12 | *

13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 16 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 17 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 18 | * OR OTHER DEALINGS IN THE SOFTWARE. 19 | *

20 | * More Information @ www.turtle-player.co.uk 21 | * 22 | * @author Simon Honegger (Hoene84) 23 | */ 24 | 25 | public abstract class ObservableOutput implements OutputAccess 26 | { 27 | //---------------------------------- Observable 28 | 29 | HashMap observers = new HashMap(); 30 | 31 | protected void notifyTrackChanged(Track track, int lengthInMillis){ 32 | for(PlayerObserver observer : observers.values()){ 33 | observer.trackChanged(track, lengthInMillis); 34 | } 35 | } 36 | 37 | protected void notifyStarted(){ 38 | for(PlayerObserver observer : observers.values()){ 39 | observer.started(); 40 | } 41 | } 42 | 43 | protected void notifyStopped(){ 44 | for(PlayerObserver observer : observers.values()){ 45 | observer.stopped(); 46 | } 47 | } 48 | 49 | public void addObserver(PlayerObserver observer) 50 | { 51 | observers.put(observer.getId(), observer); 52 | } 53 | 54 | public void removeObserver(Observer observer) 55 | { 56 | observers.remove(observer); 57 | } 58 | 59 | public interface PlayerObserver extends Observer 60 | { 61 | void trackChanged(Track track, int lengthInMillis); 62 | void started(); 63 | void stopped(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/com/turtleplayer/player/Output.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.player; 2 | 3 | import android.media.MediaPlayer; 4 | import com.turtleplayer.model.Track; 5 | 6 | /** 7 | * TURTLE PLAYER 8 | *

9 | * Licensed under MIT & GPL 10 | *

11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 13 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 14 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 15 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 16 | * OR OTHER DEALINGS IN THE SOFTWARE. 17 | *

18 | * More Information @ www.turtle-player.co.uk 19 | * 20 | * @author Simon Honegger (Hoene84) 21 | */ 22 | 23 | public interface Output 24 | { 25 | 26 | void change(Track t); 27 | 28 | void play(Track t); 29 | 30 | void toggle(); 31 | 32 | /** 33 | * @return true if this call had an effect 34 | */ 35 | boolean pause(); 36 | 37 | /** 38 | * @return true if this call had an effect 39 | */ 40 | boolean play(); 41 | 42 | void goToMillis(int millis); 43 | 44 | int getCurrentMillis(); 45 | 46 | Track getCurrTrack(); 47 | 48 | void setOnCompletionListener(MediaPlayer.OnCompletionListener listener); 49 | } 50 | -------------------------------------------------------------------------------- /src/com/turtleplayer/player/OutputAccess.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.player; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface OutputAccess 21 | { 22 | public void connectPlayer(final OutputCommand outputCommand); 23 | 24 | public void releasePlayer(); 25 | } 26 | -------------------------------------------------------------------------------- /src/com/turtleplayer/player/OutputCommand.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.player; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public interface OutputCommand 21 | { 22 | void connected(Output output); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/turtleplayer/player/OutputUsingOnClickListener.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.player; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public abstract class OutputUsingOnClickListener implements View.OnClickListener 23 | { 24 | final OutputAccess outputAccess; 25 | 26 | public OutputUsingOnClickListener(OutputAccess outputAccess) 27 | { 28 | this.outputAccess = outputAccess; 29 | } 30 | 31 | public void onClick(final View v) 32 | { 33 | outputAccess.connectPlayer(new OutputCommand() 34 | { 35 | public void connected(Output output) 36 | { 37 | onClick(v, output); 38 | } 39 | }); 40 | } 41 | 42 | public abstract void onClick(View v, Output output); 43 | } 44 | -------------------------------------------------------------------------------- /src/com/turtleplayer/playlist/playorder/DefaultOrder.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.playlist.playorder; 2 | 3 | import com.turtleplayer.model.Track; 4 | import com.turtleplayer.persistance.framework.sort.FieldOrder; 5 | import com.turtleplayer.persistance.framework.sort.OrderSet; 6 | import com.turtleplayer.persistance.framework.sort.SortOrder; 7 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 8 | 9 | /** 10 | * TURTLE PLAYER 11 | *

12 | * Licensed under MIT & GPL 13 | *

14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | * OR OTHER DEALINGS IN THE SOFTWARE. 20 | *

21 | * More Information @ www.turtle-player.co.uk 22 | * 23 | * @author Simon Honegger (Hoene84) 24 | */ 25 | 26 | public class DefaultOrder extends OrderSet 27 | { 28 | public DefaultOrder(SortOrder sortOrder) 29 | { 30 | super(new FieldOrder(Tables.ArtistsReadable.ARTIST, sortOrder), 31 | new FieldOrder(Tables.AlbumsReadable.ALBUM, sortOrder), 32 | new FieldOrder(Tables.Tracks.NUMBER, sortOrder), 33 | new FieldOrder(Tables.SongsReadable.TITLE, sortOrder) 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/com/turtleplayer/playlist/playorder/LimitedStack.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.playlist.playorder; 2 | 3 | 4 | import java.util.ArrayList; 5 | import java.util.Collection; 6 | 7 | /** 8 | * A Stack With a max size. Old Object gets dropped. 9 | * Avoids Memory Overflow by e.g. keeping play history 10 | * @param The Content Type 11 | */ 12 | public class LimitedStack extends ArrayList { 13 | 14 | private final int maxSize; 15 | private final static double CLEAR_PERCENT = 0.1; 16 | 17 | public LimitedStack(int maxSize) { 18 | super(maxSize); 19 | this.maxSize = maxSize; 20 | } 21 | 22 | @Override 23 | public boolean add(T object) 24 | { 25 | boolean returnValue = super.add(object); 26 | keepMaxSize(); 27 | return returnValue; 28 | } 29 | 30 | @Override 31 | public void add(int index, T object) 32 | { 33 | super.add(index, object); 34 | keepMaxSize(); 35 | } 36 | 37 | @Override 38 | public boolean addAll(Collection collection) 39 | { 40 | boolean returnValue = super.addAll(collection); //To change body of overridden methods use File | Settings | File Templates. 41 | keepMaxSize(); 42 | return returnValue; 43 | } 44 | 45 | @Override 46 | public boolean addAll(int index, Collection collection) 47 | { 48 | boolean returnValue = super.addAll(index, collection); //To change body of overridden methods use File | Settings | File Templates. 49 | keepMaxSize(); 50 | return returnValue; 51 | } 52 | 53 | /** 54 | * @return last addded item. Dont call when empty 55 | */ 56 | public T pop(){ 57 | T poppedipop = get(size() - 1); 58 | remove(size() - 1); 59 | return poppedipop; 60 | } 61 | 62 | private void keepMaxSize() 63 | { 64 | if(size() > maxSize) 65 | { 66 | subList((int)(maxSize * CLEAR_PERCENT), size()); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/com/turtleplayer/playlist/playorder/PlayOrderRandom.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.playlist.playorder; 2 | 3 | import com.turtleplayer.model.Track; 4 | import com.turtleplayer.persistance.framework.executor.OperationExecutor; 5 | import com.turtleplayer.persistance.framework.sort.RandomOrder; 6 | import com.turtleplayer.persistance.source.sql.First; 7 | import com.turtleplayer.persistance.source.sqlite.QuerySqlite; 8 | import com.turtleplayer.persistance.turtle.db.TurtleDatabase; 9 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 10 | import com.turtleplayer.persistance.turtle.mapping.TrackCreator; 11 | import com.turtleplayer.playlist.Playlist; 12 | 13 | public class PlayOrderRandom implements PlayOrderStrategy 14 | { 15 | 16 | private final Playlist playlist; 17 | private final TurtleDatabase db; 18 | 19 | public PlayOrderRandom(TurtleDatabase db, 20 | Playlist playlist) 21 | { 22 | this.playlist = playlist; 23 | this.db = db; 24 | } 25 | 26 | public Track getNext(Track currTrack) 27 | { 28 | return get(); 29 | } 30 | 31 | public Track getPrevious(Track currTrack) 32 | { 33 | return get(); 34 | } 35 | 36 | private Track get() 37 | { 38 | return OperationExecutor.execute(db, 39 | new QuerySqlite( 40 | playlist.getCompressedFilter(), 41 | new RandomOrder(), 42 | new First(Tables.TRACKS, new TrackCreator()))); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/com/turtleplayer/playlist/playorder/PlayOrderStrategy.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.playlist.playorder; 2 | 3 | import com.turtleplayer.model.Track; 4 | 5 | public interface PlayOrderStrategy { 6 | 7 | /* 8 | * @return null if strategy has no next song for this config and tracklist 9 | */ 10 | Track getNext(Track currTrack); 11 | 12 | /** 13 | * @return null if strategy has no previous song for this config and tracklist 14 | */ 15 | Track getPrevious(Track currTrack); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/com/turtleplayer/preferences/AbstractKey.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.preferences; 20 | 21 | /** 22 | * @param object type to store 23 | * @param stored type 24 | */ 25 | public abstract class AbstractKey 26 | { 27 | 28 | private final String key; 29 | private final O defaultValue; 30 | 31 | AbstractKey(String key, 32 | O defaultValue) 33 | { 34 | this.defaultValue = defaultValue; 35 | this.key = key; 36 | } 37 | 38 | public String getKey() 39 | { 40 | return key; 41 | } 42 | 43 | public O getDefaultValue() 44 | { 45 | return defaultValue; 46 | } 47 | 48 | public abstract S marshall(O object); 49 | 50 | public abstract O unmarshall(S object) throws UnmarshallExcpetion; 51 | 52 | public static class UnmarshallExcpetion extends Exception{ 53 | 54 | public UnmarshallExcpetion(Throwable throwable) 55 | { 56 | super(throwable); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/com/turtleplayer/preferences/Key.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.preferences; 2 | 3 | /** 4 | * TURTLE PLAYER 5 | *

6 | * Licensed under MIT & GPL 7 | *

8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 9 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 10 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 12 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 13 | * OR OTHER DEALINGS IN THE SOFTWARE. 14 | *

15 | * More Information @ www.turtle-player.co.uk 16 | * 17 | * @author Simon Honegger (Hoene84) 18 | */ 19 | 20 | public class Key extends AbstractKey 21 | { 22 | Key(String key, 23 | T defaultValue) 24 | { 25 | super(key, defaultValue); 26 | } 27 | 28 | @Override 29 | public T marshall(T object) 30 | { 31 | return object; 32 | } 33 | 34 | @Override 35 | public T unmarshall(T object) 36 | { 37 | return object; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/turtleplayer/preferences/Keys.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.preferences; 20 | 21 | import android.os.Environment; 22 | import com.turtleplayer.persistance.framework.filter.Filter; 23 | import com.turtleplayer.persistance.turtle.db.structure.Tables; 24 | 25 | import java.util.HashSet; 26 | import java.util.Set; 27 | 28 | public abstract class Keys 29 | { 30 | 31 | public final static Key SHUFFLE = new Key("shuffle", false); 32 | public final static Key MEDIA_DIR = new Key("mediaDir", 33 | Environment.getExternalStorageDirectory().getPath()); 34 | 35 | public final static Key LAST_TRACK_PLAYED = new Key("lastTrackPlayed", null); 36 | public final static Key EXIT_PLAY_TIME = new Key("exitPlayTime", 0); 37 | 38 | public final static Key FS_SCAN_INTERRUPT_PATH = new Key("fsScanInterruptPath", null); 39 | public final static Key FS_SCAN_INTERRUPT_COUNT_ALL = new Key("fsScanInterruptCountAll", 0); 40 | public final static Key FS_SCAN_INTERRUPT_COUNT_PROCESSED = new Key("fsSancInterruptCountProcessed", 0); 41 | 42 | public final static ObjectKey>> FILTERS = new ObjectKey>>("filters", new HashSet>()); 43 | } 44 | -------------------------------------------------------------------------------- /src/com/turtleplayer/preferences/PreferencesObserver.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.preferences; 20 | 21 | import com.turtleplayer.controller.Observer; 22 | 23 | public interface PreferencesObserver extends Observer 24 | { 25 | void changed(AbstractKey key); 26 | } 27 | -------------------------------------------------------------------------------- /src/com/turtleplayer/presentation/InstanceFormatter.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.presentation; 2 | 3 | import com.turtleplayer.model.InstanceVisitor; 4 | 5 | public abstract class InstanceFormatter implements InstanceVisitor 6 | { 7 | final static String DELIMITER = " - "; 8 | 9 | public final static InstanceFormatter SHORT = new ShortInstanceFormatter(); 10 | public final static InstanceFormatter SHORT_WITH_NUMBER = new ShortWithNumberInstanceFormatter(); 11 | public final static InstanceFormatter LIST = new OverAllFormatter(); 12 | } 13 | -------------------------------------------------------------------------------- /src/com/turtleplayer/presentation/ShortInstanceFormatter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.presentation; 20 | 21 | import com.turtleplayer.model.*; 22 | 23 | class ShortInstanceFormatter extends InstanceFormatter 24 | { 25 | public String visit(Track track) 26 | { 27 | return track.getSongName(); 28 | } 29 | 30 | public String visit(SongDigest track) 31 | { 32 | return track.getSongName(); 33 | } 34 | 35 | public String visit(Album album) 36 | { 37 | return album.getAlbumName(); 38 | } 39 | 40 | public String visit(GenreDigest genre) 41 | { 42 | return genre.getGenreName(); 43 | } 44 | 45 | public String visit(ArtistDigest artist) 46 | { 47 | return artist.getArtistName(); 48 | } 49 | 50 | public String visit(FSobject FSobject) 51 | { 52 | return FSobject.getName(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/com/turtleplayer/presentation/ShortWithNumberInstanceFormatter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.presentation; 20 | 21 | import com.turtleplayer.model.Track; 22 | import com.turtleplayer.util.Shorty; 23 | 24 | class ShortWithNumberInstanceFormatter extends ShortInstanceFormatter 25 | { 26 | @Override 27 | public String visit(Track track) 28 | { 29 | String trackName = track.getSongName(); 30 | 31 | int number = track.GetNumber(); 32 | 33 | if(!Shorty.isVoid(number)) 34 | { 35 | return number + DELIMITER + trackName; 36 | } 37 | return trackName; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/turtleplayer/util/AndroidUtils.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.util; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public class AndroidUtils 23 | { 24 | 25 | /** 26 | * @return null if not existing 27 | */ 28 | public static String getResourceString(Context context, String name) { 29 | 30 | int nameResourceID = context.getResources().getIdentifier(name, "string", context.getApplicationInfo().packageName); 31 | 32 | if (nameResourceID == 0) 33 | { 34 | return null; 35 | } 36 | else 37 | { 38 | return context.getString(nameResourceID); 39 | } 40 | } 41 | 42 | /** 43 | * @return string of fallBackRessource param if not existing 44 | */ 45 | public static String getResourceString(Context context, String name, int fallBackRessource) { 46 | String string = getResourceString(context, name); 47 | return string == null ? context.getString(fallBackRessource) : string; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/com/turtleplayer/util/Shorty.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | package com.turtleplayer.util; 20 | 21 | import java.util.*; 22 | 23 | public class Shorty 24 | { 25 | public static boolean isVoid(String string) 26 | { 27 | return string == null || string.length() == 0; 28 | } 29 | 30 | public static boolean isVoid(Integer integer) 31 | { 32 | return integer == null || integer == 0; 33 | } 34 | 35 | public static > boolean isVoid(T collection) 36 | { 37 | return collection == null || collection.size() == 0; 38 | } 39 | 40 | public static String avoidNull(String s) 41 | { 42 | return isVoid(s) ? "" : s; 43 | } 44 | 45 | public static > T avoidNull(T collection, T emptyCollections) 46 | { 47 | return isVoid(collection) ? emptyCollections : collection; 48 | } 49 | 50 | public static Set oneElementSet(E element) 51 | { 52 | final Set result = new HashSet(); 53 | result.add(element); 54 | return result; 55 | } 56 | 57 | @SuppressWarnings({"unchecked"}) 58 | public static List concat(List... lists) 59 | { 60 | List result = new ArrayList(); 61 | for(List list : lists) 62 | { 63 | result.addAll(list); 64 | } 65 | 66 | return result; 67 | } 68 | 69 | public static List concatWith(List arrays, T... elements) 70 | { 71 | return concat(arrays, Arrays.asList(elements)); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/com/turtleplayer/util/TurtleUtil.java: -------------------------------------------------------------------------------- 1 | package com.turtleplayer.util; 2 | 3 | import com.turtleplayer.TurtlePlayer; 4 | 5 | /** 6 | * TURTLE PLAYER 7 | *

8 | * Licensed under MIT & GPL 9 | *

10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 11 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 12 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 13 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 14 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 15 | * OR OTHER DEALINGS IN THE SOFTWARE. 16 | *

17 | * More Information @ www.turtle-player.co.uk 18 | * 19 | * @author Simon Honegger (Hoene84) 20 | */ 21 | 22 | public class TurtleUtil 23 | { 24 | private static final String RES_GENRE_PREFIX = "tag.genre."; 25 | 26 | public static String translateGenreId(String id){ 27 | 28 | if(Shorty.isVoid(id.trim())){ 29 | return TurtlePlayer.getStaticInstance().getString(com.turtleplayerv2.R.string.tag_genre_unknown); 30 | } 31 | 32 | try 33 | { 34 | return AndroidUtils.getResourceString( 35 | TurtlePlayer.getStaticInstance(), 36 | RES_GENRE_PREFIX + Integer.parseInt(id), 37 | com.turtleplayerv2.R.string.tag_genre_unknown); 38 | } 39 | catch (NumberFormatException nfe) 40 | { 41 | return id.trim(); 42 | } 43 | } 44 | 45 | public static String getLastPartOfPath(String path) 46 | { 47 | // "/path/path/file/" 48 | 49 | if(path.lastIndexOf('/') == path.length()-1) 50 | { 51 | path = path.substring(0, path.length()-1); 52 | } 53 | 54 | // "/path/path/file" 55 | 56 | return path.substring(path.lastIndexOf('/')+1); 57 | 58 | // "file" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /test/TROUBLESHOOTING: -------------------------------------------------------------------------------- 1 | Problem: !!! JUnit version 3.8 or later expected: 2 | 3 | Solution: 4 | This problem happens because Android Platform (android.jar) already contains JUnit classes. IDEA test runner loads 5 | these classes and sees that they are from the old JUnit, while you are trying to use annotated tests which 6 | is a feature of the new JUnit, therefore you get the error from the test runner. 7 | The solution is simple, open the Project Structure | Modules | Dependencies, and move the junit-4.7.jar up, 8 | so that it comes before Android 1.6 Platform in the classpath. Now the test runner will be happy as it loads the 9 | new JUnit version. 10 | (http://stackoverflow.com/questions/2422378/intellij-idea-with-junit-4-7-junit-version-3-8-or-later-expected) 11 | ---------------------------------------------- -------------------------------------------------------------------------------- /test/com/turtleplayer/persistance/turtle/FsReaderTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * TURTLE PLAYER 4 | * 5 | * Licensed under MIT & GPL 6 | * 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 10 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 11 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 12 | * OR OTHER DEALINGS IN THE SOFTWARE. 13 | * 14 | * More Information @ www.turtle-player.co.uk 15 | * 16 | * @author Simon Honegger (Hoene84) 17 | */ 18 | 19 | 20 | package com.turtleplayer.persistance.turtle; 21 | 22 | import org.junit.Test; 23 | 24 | import static junit.framework.Assert.assertEquals; 25 | 26 | public class FsReaderTest 27 | { 28 | @Test 29 | public void testParseTrackNumber() throws Exception 30 | { 31 | assertEquals(1, FsReader.parseTrackNumber("1")); 32 | assertEquals(1, FsReader.parseTrackNumber("01")); 33 | assertEquals(1, FsReader.parseTrackNumber("1/2")); 34 | assertEquals(1, FsReader.parseTrackNumber("1,2")); 35 | assertEquals(1, FsReader.parseTrackNumber("1;2")); 36 | assertEquals(0, FsReader.parseTrackNumber("00")); 37 | assertEquals(0, FsReader.parseTrackNumber("0")); 38 | assertEquals(0, FsReader.parseTrackNumber("0/0")); 39 | assertEquals(0, FsReader.parseTrackNumber("")); 40 | assertEquals(0, FsReader.parseTrackNumber("asdad")); 41 | assertEquals(10, FsReader.parseTrackNumber("10")); 42 | assertEquals(10, FsReader.parseTrackNumber("010")); 43 | } 44 | } 45 | --------------------------------------------------------------------------------