├── .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 extends FilenameFilter> PLAYABLE_FILES_FILTER = Arrays.asList(
28 | new NameFilter(".*.mp3", ".*.ogg")
29 | );
30 |
31 | final static List extends FilenameFilter> 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 extends RESULT, S> creator;
30 |
31 | protected CreatorForList(Creator extends RESULT, S> 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 extends PROJECTION, R> 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 super PROJECTION, Z, T> fieldFilter);
26 |
27 | R visit(FilterSet super PROJECTION> filterSet);
28 |
29 | R visit(NotFilter super PROJECTION> 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 super TARGET, Z, T> 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 super PROJECTION> filter;
23 |
24 | public NotFilter(Filter super PROJECTION> filter)
25 | {
26 | this.filter = filter;
27 | }
28 |
29 | public R accept(FilterVisitor extends PROJECTION, R> visitor)
30 | {
31 | return visitor.visit(this);
32 | }
33 |
34 | public Filter super PROJECTION> 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 super PROJECTION> getFilter(Filter super PROJECTION> oldFilters,
27 | RESULT instance,
28 | Order super PROJECTION> 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 extends PROJECTION, R> 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 super PROJECTION>... order)
27 | {
28 | Collections.addAll(orders, order);
29 | }
30 |
31 | public OrderSet(List extends Order super PROJECTION>> 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 extends PROJECTION, R> visitor)
45 | {
46 | return visitor.visit(this);
47 | }
48 |
49 | public OrderSet super PROJECTION> 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 super PROJECTION, Z, T> fieldOrder);
23 |
24 | R visit(RandomOrder super PROJECTION> orderFilter);
25 |
26 | R visit(OrderSet super PROJECTION> 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 super TARGET, Z, T> 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 extends PROJECTION, R> 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 extends Table> 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 super RESULT> field);
26 |
27 | R visit(FieldPersistableAsDouble super RESULT> field);
28 |
29 | R visit(FieldPersistableAsInteger super RESULT> 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 super RESULT> field)
30 | {
31 | return field.get(result);
32 | }
33 |
34 | public String visit(FieldPersistableAsDouble super RESULT> field)
35 | {
36 | return field.get(result).toString();
37 | }
38 |
39 | public String visit(FieldPersistableAsInteger super RESULT> 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