From bcf76eaae05afd4a0cfdfd62aa20cf7f6f1d432b Mon Sep 17 00:00:00 2001 From: NamBD Date: Tue, 9 Jan 2018 23:55:15 +0700 Subject: [PATCH 1/2] tach pull 1 --- .gitignore | 1 + app.iml | 146 +++++++++++++++++++++++++++++++++++++++++++++ build.gradle | 39 ++++++++++++ proguard-rules.pro | 21 +++++++ 4 files changed, 207 insertions(+) create mode 100644 .gitignore create mode 100644 app.iml create mode 100644 build.gradle create mode 100644 proguard-rules.pro diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app.iml b/app.iml new file mode 100644 index 0000000..967c1fe --- /dev/null +++ b/app.iml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7d6cd2a --- /dev/null +++ b/build.gradle @@ -0,0 +1,39 @@ +apply plugin: 'com.android.application' +apply from: '../checkci.gradle' +android { + dataBinding { + enabled = true + } + compileSdkVersion 26 + defaultConfig { + buildConfigField "String", "API_KEY", "\"${API_KEY}\"" + applicationId "com.framgia.soundclound" + minSdkVersion 18 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:support-v4:26.1.0' + compile 'com.android.support.constraint:constraint-layout:1.1.0-beta4' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + compile 'com.google.code.gson:gson:2.8.1' + compile 'com.android.support:cardview-v7:26.1.0' + compile 'com.android.support:appcompat-v7:26.1.0' + compile 'com.android.support:design:26.1.0' + + +} diff --git a/proguard-rules.pro b/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile From d52680bee616021345218cc676329a7bae65d822 Mon Sep 17 00:00:00 2001 From: NamBD Date: Wed, 10 Jan 2018 00:05:49 +0700 Subject: [PATCH 2/2] pull 3 --- .../framgia/soundclound/data/model/Album.java | 58 +++++ .../soundclound/data/model/Collection.java | 33 +++ .../data/model/CollectionResult.java | 80 ++++++ .../soundclound/data/model/Genres.java | 54 ++++ .../data/model/PublisherMetadata.java | 67 +++++ .../framgia/soundclound/data/model/Track.java | 212 +++++++++++++++ .../data/source/AlbumDataSource.java | 30 +++ .../data/source/TrackDataSource.java | 23 ++ .../data/source/TrackRepository.java | 26 ++ .../local/Sqlite/AlbumLocalDataSource.java | 246 ++++++++++++++++++ .../data/source/local/Sqlite/DBType.java | 41 +++ .../data/source/remote/LoadAsync.java | 74 ++++++ .../source/remote/TrackRemoteDataSource.java | 76 ++++++ .../source/repository/AlbumRepository.java | 71 +++++ .../source/repository/GenresRepository.java | 81 ++++++ .../soundclound/screen/home/HomeAdapter.java | 68 +++++ .../soundclound/screen/home/HomeFragment.java | 41 +++ .../screen/home/HomeViewModel.java | 35 +++ .../screen/home/OnItemClickListener.java | 11 + .../soundclound/screen/main/MainActivity.java | 32 +++ .../screen/main/MainPagerAdapter.java | 42 +++ .../screen/main/MainViewModel.java | 52 ++++ .../soundclound/screen/main/TabType.java | 21 ++ .../screen/playlist/OnItemAlbumClick.java | 15 ++ .../screen/playlist/PlaylistAdapter.java | 73 ++++++ .../screen/playlist/PlaylistFragment.java | 37 +++ .../screen/playlist/PlaylistModelView.java | 176 +++++++++++++ .../framgia/soundclound/util/BindingUtil.java | 124 +++++++++ .../framgia/soundclound/util/Constant.java | 18 ++ .../soundclound/util/HomeBindingUtils.java | 79 ++++++ .../framgia/soundclound/util/StringUtil.java | 27 ++ .../util/designhelper/GridSpacingItem.java | 56 ++++ .../soundclound/widget/IsSwipeViewPager.java | 41 +++ 33 files changed, 2120 insertions(+) create mode 100644 main/java/com/framgia/soundclound/data/model/Album.java create mode 100644 main/java/com/framgia/soundclound/data/model/Collection.java create mode 100644 main/java/com/framgia/soundclound/data/model/CollectionResult.java create mode 100644 main/java/com/framgia/soundclound/data/model/Genres.java create mode 100644 main/java/com/framgia/soundclound/data/model/PublisherMetadata.java create mode 100644 main/java/com/framgia/soundclound/data/model/Track.java create mode 100644 main/java/com/framgia/soundclound/data/source/AlbumDataSource.java create mode 100644 main/java/com/framgia/soundclound/data/source/TrackDataSource.java create mode 100644 main/java/com/framgia/soundclound/data/source/TrackRepository.java create mode 100644 main/java/com/framgia/soundclound/data/source/local/Sqlite/AlbumLocalDataSource.java create mode 100644 main/java/com/framgia/soundclound/data/source/local/Sqlite/DBType.java create mode 100644 main/java/com/framgia/soundclound/data/source/remote/LoadAsync.java create mode 100644 main/java/com/framgia/soundclound/data/source/remote/TrackRemoteDataSource.java create mode 100644 main/java/com/framgia/soundclound/data/source/repository/AlbumRepository.java create mode 100644 main/java/com/framgia/soundclound/data/source/repository/GenresRepository.java create mode 100644 main/java/com/framgia/soundclound/screen/home/HomeAdapter.java create mode 100644 main/java/com/framgia/soundclound/screen/home/HomeFragment.java create mode 100644 main/java/com/framgia/soundclound/screen/home/HomeViewModel.java create mode 100644 main/java/com/framgia/soundclound/screen/home/OnItemClickListener.java create mode 100644 main/java/com/framgia/soundclound/screen/main/MainActivity.java create mode 100644 main/java/com/framgia/soundclound/screen/main/MainPagerAdapter.java create mode 100644 main/java/com/framgia/soundclound/screen/main/MainViewModel.java create mode 100644 main/java/com/framgia/soundclound/screen/main/TabType.java create mode 100644 main/java/com/framgia/soundclound/screen/playlist/OnItemAlbumClick.java create mode 100644 main/java/com/framgia/soundclound/screen/playlist/PlaylistAdapter.java create mode 100644 main/java/com/framgia/soundclound/screen/playlist/PlaylistFragment.java create mode 100644 main/java/com/framgia/soundclound/screen/playlist/PlaylistModelView.java create mode 100644 main/java/com/framgia/soundclound/util/BindingUtil.java create mode 100644 main/java/com/framgia/soundclound/util/Constant.java create mode 100644 main/java/com/framgia/soundclound/util/HomeBindingUtils.java create mode 100644 main/java/com/framgia/soundclound/util/StringUtil.java create mode 100644 main/java/com/framgia/soundclound/util/designhelper/GridSpacingItem.java create mode 100644 main/java/com/framgia/soundclound/widget/IsSwipeViewPager.java diff --git a/main/java/com/framgia/soundclound/data/model/Album.java b/main/java/com/framgia/soundclound/data/model/Album.java new file mode 100644 index 0000000..734c7e6 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/model/Album.java @@ -0,0 +1,58 @@ +package com.framgia.soundclound.data.model; + +import java.util.List; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public class Album { + private String mName; + private int mId; + private int mNumberSong; + private String mImage; + public List mTracks; + + public Album() { + } + + public String getName() { + return mName; + } + + public void setName(String name) { + mName = name; + } + + public int getId() { + return mId; + } + + public void setId(int id) { + mId = id; + } + + public int getNumberSong() { + return mNumberSong; + } + + public void setNumberSong(int numberSong) { + mNumberSong = numberSong; + } + + public String getImage() { + return mImage; + } + + public void setImage(String image) { + mImage = image; + } + + public List getTracks() { + return mTracks; + } + + public void setTracks(List tracks) { + mTracks = tracks; + } +} diff --git a/main/java/com/framgia/soundclound/data/model/Collection.java b/main/java/com/framgia/soundclound/data/model/Collection.java new file mode 100644 index 0000000..8356b38 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/model/Collection.java @@ -0,0 +1,33 @@ +package com.framgia.soundclound.data.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Created by Sony on 1/5/2018. + */ + +public class Collection { + @SerializedName("track") + @Expose + private Track mTrack; + @SerializedName("score") + @Expose + private int mScore; + + public Track getTrack() { + return mTrack; + } + + public void setTrack(Track track) { + mTrack = track; + } + + public int getScore() { + return mScore; + } + + public void setScore(int score) { + mScore = score; + } +} diff --git a/main/java/com/framgia/soundclound/data/model/CollectionResult.java b/main/java/com/framgia/soundclound/data/model/CollectionResult.java new file mode 100644 index 0000000..0d4d4c6 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/model/CollectionResult.java @@ -0,0 +1,80 @@ +package com.framgia.soundclound.data.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * Created by Sony on 1/5/2018. + */ + +public class CollectionResult { + + @SerializedName("genre") + @Expose + private String mGenre; + @SerializedName("kind") + @Expose + private String mKind; + @SerializedName("last_updated") + @Expose + private String mLastUpdated; + @SerializedName("collection") + @Expose + private List mCollection; + @SerializedName("query_urn") + @Expose + private String mQueryUrn; + @SerializedName("next_href") + @Expose + private String mNextHref; + + public String getGenre() { + return mGenre; + } + + public void setGenre(String genre) { + mGenre = genre; + } + + public String getKind() { + return mKind; + } + + public void setKind(String kind) { + mKind = kind; + } + + public String getLastUpdated() { + return mLastUpdated; + } + + public void setLastUpdated(String lastUpdated) { + mLastUpdated = lastUpdated; + } + + public List getCollection() { + return mCollection; + } + + public void setCollection(List collection) { + mCollection = collection; + } + + public String getQueryUrn() { + return mQueryUrn; + } + + public void setQueryUrn(String queryUrn) { + mQueryUrn = queryUrn; + } + + public String getNextHref() { + return mNextHref; + } + + public void setNextHref(String nextHref) { + mNextHref = nextHref; + } +} diff --git a/main/java/com/framgia/soundclound/data/model/Genres.java b/main/java/com/framgia/soundclound/data/model/Genres.java new file mode 100644 index 0000000..8acccc9 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/model/Genres.java @@ -0,0 +1,54 @@ +package com.framgia.soundclound.data.model; + + +import java.io.Serializable; + +/** + * Created by Bui Danh Nam on 5/1/2018. + */ + +public class Genres implements Serializable { + private int mName; + private int mImage; + private String mKeyname; + private int mIcon; + + public Genres(int name, int image, String keyname, int icon) { + mName = name; + mImage = image; + mKeyname = keyname; + mIcon = icon; + } + + public int getName() { + return mName; + } + + public void setName(int name) { + mName = name; + } + + public int getImage() { + return mImage; + } + + public void setImage(int image) { + mImage = image; + } + + public String getKeyname() { + return mKeyname; + } + + public void setKeyname(String keyname) { + mKeyname = keyname; + } + + public int getIcon() { + return mIcon; + } + + public void setIcon(int icon) { + mIcon = icon; + } +} diff --git a/main/java/com/framgia/soundclound/data/model/PublisherMetadata.java b/main/java/com/framgia/soundclound/data/model/PublisherMetadata.java new file mode 100644 index 0000000..8986647 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/model/PublisherMetadata.java @@ -0,0 +1,67 @@ +package com.framgia.soundclound.data.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Created by Sony on 1/5/2018. + */ + +public class PublisherMetadata { + + @SerializedName("id") + @Expose + private int mId; + @SerializedName("urn") + @Expose + private String mUrn; + @SerializedName("artist") + @Expose + private String mArtist; + @SerializedName("album_title") + @Expose + private String mAlbumTitle; + @SerializedName("contains_music") + @Expose + private boolean mContainsMusic; + + public int getId() { + return mId; + } + + public void setId(int id) { + mId = id; + } + + public String getUrn() { + return mUrn; + } + + public void setUrn(String urn) { + mUrn = urn; + } + + public String getArtist() { + return mArtist; + } + + public void setArtist(String artist) { + mArtist = artist; + } + + public String getAlbumTitle() { + return mAlbumTitle; + } + + public void setAlbumTitle(String albumTitle) { + mAlbumTitle = albumTitle; + } + + public boolean isContainsMusic() { + return mContainsMusic; + } + + public void setContainsMusic(boolean containsMusic) { + mContainsMusic = containsMusic; + } +} diff --git a/main/java/com/framgia/soundclound/data/model/Track.java b/main/java/com/framgia/soundclound/data/model/Track.java new file mode 100644 index 0000000..98e573b --- /dev/null +++ b/main/java/com/framgia/soundclound/data/model/Track.java @@ -0,0 +1,212 @@ +package com.framgia.soundclound.data.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Created by Sony on 1/5/2018. + */ + +public class Track { + @SerializedName("artwork_url") + @Expose + private String mArtworkUrl; + @SerializedName("comment_count") + @Expose + private int mCommentCount; + @SerializedName("description") + @Expose + private String mDescription; + @SerializedName("download_count") + @Expose + private int mDownloadCount; + @SerializedName("download_url") + @Expose + private String mDownloadUrl; + @SerializedName("full_duration") + @Expose + private int mFullDuration; + @SerializedName("genre") + @Expose + private String mGenre; + @SerializedName("id") + @Expose + private int mId; + @SerializedName("likes_count") + @Expose + private int mLikesCount; + @SerializedName("permalink_url") + @Expose + private String mPermalinkUrl; + @SerializedName("playback_count") + @Expose + private int mPlaybackCount; + @SerializedName("publisher_metadata") + @Expose + private PublisherMetadata mPublisherMetadata; + @SerializedName("title") + @Expose + private String mTitle; + @SerializedName("uri") + @Expose + private String mUri; + @SerializedName("user_id") + @Expose + private int mUserId; + @SerializedName("display_date") + @Expose + private String mDisplayDate; + + public Track(String title) { + mTitle = title; + } + + public Track() { + } + + public String getArtworkUrl() { + return mArtworkUrl; + } + + public void setArtworkUrl(String artworkUrl) { + mArtworkUrl = artworkUrl; + } + + public int getCommentCount() { + return mCommentCount; + } + + public void setCommentCount(int commentCount) { + mCommentCount = commentCount; + } + + public String getDescription() { + return mDescription; + } + + public void setDescription(String description) { + mDescription = description; + } + + public int getDownloadCount() { + return mDownloadCount; + } + + public void setDownloadCount(int downloadCount) { + mDownloadCount = downloadCount; + } + + + public String getDownloadUrl() { + return mDownloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + mDownloadUrl = downloadUrl; + } + + public int getFullDuration() { + return mFullDuration; + } + + public void setFullDuration(int fullDuration) { + mFullDuration = fullDuration; + } + + public String getGenre() { + return mGenre; + } + + public void setGenre(String genre) { + mGenre = genre; + } + + public int getId() { + return mId; + } + + public void setId(int id) { + mId = id; + } + + public int getLikesCount() { + return mLikesCount; + } + + public void setLikesCount(int likesCount) { + mLikesCount = likesCount; + } + + public String getPermalinkUrl() { + return mPermalinkUrl; + } + + public void setPermalinkUrl(String permalinkUrl) { + mPermalinkUrl = permalinkUrl; + } + + public int getPlaybackCount() { + return mPlaybackCount; + } + + public void setPlaybackCount(int playbackCount) { + mPlaybackCount = playbackCount; + } + + + public PublisherMetadata getPublisherMetadata() { + return mPublisherMetadata; + } + + public void setPublisherMetadata(PublisherMetadata publisherMetadata) { + mPublisherMetadata = publisherMetadata; + } + + public String getTitle() { + return mTitle; + } + + public void setTitle(String title) { + mTitle = title; + } + + public String getUri() { + return mUri; + } + + public void setUri(String uri) { + mUri = uri; + } + + public int getUserId() { + return mUserId; + } + + public void setUserId(int userId) { + mUserId = userId; + } + + public String getDisplayDate() { + return mDisplayDate; + } + + public void setDisplayDate(String displayDate) { + mDisplayDate = displayDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Track track = (Track) o; + + return mId == track.mId; + } + + @Override + public int hashCode() { + return mId; + } +} + diff --git a/main/java/com/framgia/soundclound/data/source/AlbumDataSource.java b/main/java/com/framgia/soundclound/data/source/AlbumDataSource.java new file mode 100644 index 0000000..4970540 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/AlbumDataSource.java @@ -0,0 +1,30 @@ +package com.framgia.soundclound.data.source; + +import com.framgia.soundclound.data.model.Album; +import com.framgia.soundclound.data.model.Track; + +import java.util.List; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public interface AlbumDataSource { + List getAllAlbum(); + + boolean addAlbum(Album album); + + boolean deleteAlbum(Album album); + + Album getAlbumById(int idAlbum); + + boolean updateAlbum(Album album); + + Album getAlbumByName(String nameAlbum); + + boolean addTrackinAlbum(Album album, Track track); + + boolean remoteTrack(Album album, Track track); + + boolean renameAlbum(Album album); +} diff --git a/main/java/com/framgia/soundclound/data/source/TrackDataSource.java b/main/java/com/framgia/soundclound/data/source/TrackDataSource.java new file mode 100644 index 0000000..b8a429e --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/TrackDataSource.java @@ -0,0 +1,23 @@ +package com.framgia.soundclound.data.source; + +import com.framgia.soundclound.data.model.Track; + +import java.util.List; + +/** + * Created by Sony on 1/5/2018. + */ +public interface TrackDataSource { + /** + * @return specified type of object + */ + interface Callback { + void onStartLoading(); + void onGetSuccess(T data); + void onGetFailure(String message); + void onComplete(); + } + + void getListTrack(String url, String genre, int limit, int offSet, + Callback> callback); +} diff --git a/main/java/com/framgia/soundclound/data/source/TrackRepository.java b/main/java/com/framgia/soundclound/data/source/TrackRepository.java new file mode 100644 index 0000000..26d8a74 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/TrackRepository.java @@ -0,0 +1,26 @@ +package com.framgia.soundclound.data.source; + +import android.support.annotation.NonNull; + +import com.framgia.soundclound.data.model.Track; + +import java.util.List; + +/** + * Created by Sony on 1/5/2018. + */ + +public class TrackRepository implements TrackDataSource { + + private TrackDataSource mRemoteDataSource; + + public TrackRepository(TrackDataSource trackDataSource) { + mRemoteDataSource = trackDataSource; + } + + @Override + public void getListTrack(String url, String genre, int limit, @NonNull int offSet, + Callback> callback) { + mRemoteDataSource.getListTrack(url, genre, limit, offSet, callback); + } +} diff --git a/main/java/com/framgia/soundclound/data/source/local/Sqlite/AlbumLocalDataSource.java b/main/java/com/framgia/soundclound/data/source/local/Sqlite/AlbumLocalDataSource.java new file mode 100644 index 0000000..eb2e493 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/local/Sqlite/AlbumLocalDataSource.java @@ -0,0 +1,246 @@ +package com.framgia.soundclound.data.source.local.Sqlite; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import com.framgia.soundclound.data.model.Album; +import com.framgia.soundclound.data.model.Track; +import com.framgia.soundclound.data.source.AlbumDataSource; +import com.framgia.soundclound.util.BindingUtil; + +import java.util.ArrayList; +import java.util.List; + +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.ID_ALBUM; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.IMAGE_ALBUM; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.LIST_TRACK; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.NAME_ALBUM; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.NUMBER_SONG; +import static com.framgia.soundclound.data.source.local.Sqlite.DatabseType.DATABASE_NAME; +import static com.framgia.soundclound.data.source.local.Sqlite.TableName.TABLE_ALBUM; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public class AlbumLocalDataSource extends SQLiteOpenHelper implements AlbumDataSource { + private static int VERSION = 1; + private static AlbumLocalDataSource sInstance; + + public static AlbumLocalDataSource getInstance(Context context) { + if (sInstance == null) { + sInstance = new AlbumLocalDataSource(context); + } + return sInstance; + } + + public AlbumLocalDataSource(Context context) { + super(context, DATABASE_NAME, null, VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + String sqlQuery = "CREATE TABLE " + TABLE_ALBUM + " (" + + NAME_ALBUM + " TEXT, " + + ID_ALBUM + " INTEGER primary key," + + IMAGE_ALBUM + " TEXT, " + + NUMBER_SONG + " INTEGER," + + LIST_TRACK + " TEXT)"; + db.execSQL(sqlQuery); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + + @Override + public List getAllAlbum() { + List albums = new ArrayList<>(); + SQLiteDatabase sqLiteDatabase = getReadableDatabase(); + Cursor cursor = sqLiteDatabase.query(TABLE_ALBUM, + null, null, null, + null, null, null); + + try { + if (cursor != null && cursor.moveToFirst()) { + do { + albums.add(parseCursorToAlbum(cursor)); + } while (cursor.moveToNext()); + } + } finally { + cursor.close(); + } + return albums; + } + + + @Override + public boolean addAlbum(Album album) { + if (album == null) { + return false; + } + if (checkNameAlbumExist(album.getName())) { + return false; + } + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(NAME_ALBUM, album.getName()); +// contentValues.put(ID_ALBUM, album.getId()); + contentValues.put(NUMBER_SONG, album.getNumberSong()); + contentValues.put(IMAGE_ALBUM, album.getImage()); + String listTrack = BindingUtil.getToList(album.getTracks()); + contentValues.put(LIST_TRACK, listTrack); + long result = sqLiteDatabase.insert(TABLE_ALBUM, null, contentValues); + return result != -1; + } + + @Override + public Album getAlbumById(int idAlbum) { + SQLiteDatabase database = sInstance.getReadableDatabase(); + Cursor cursor = database.query(TABLE_ALBUM, + new String[]{ID_ALBUM, NAME_ALBUM, NUMBER_SONG, IMAGE_ALBUM, LIST_TRACK}, + ID_ALBUM + "=?", + new String[]{String.valueOf(idAlbum)}, + null, null, null, null); + if (cursor.getCount() > 0) { + cursor.close(); + return parseCursorToAlbum(cursor); + } + return null; + } + + + @Override + public Album getAlbumByName(String nameAlbum) { + SQLiteDatabase database = getReadableDatabase(); + Cursor cursor = database.query(TABLE_ALBUM, + new String[]{ID_ALBUM, NAME_ALBUM, NUMBER_SONG, IMAGE_ALBUM, LIST_TRACK}, + NAME_ALBUM + "=?", + new String[]{String.valueOf(nameAlbum)}, + null, null, null, null); + if (cursor.getCount() > 0) { + cursor.close(); + return parseCursorToAlbum(cursor); + } + return null; + } + + @Override + public boolean addTrackinAlbum(Album album, Track track) { + if (album == null) { + return false; + } + if (track == null) { + return false; + } + List tracksOld = album.getTracks(); + if (tracksOld == null) { + return false; + } + if (tracksOld.contains(track)) { + return false; + } + tracksOld.add(track); + List tracksNew = new ArrayList<>(tracksOld); + album.setTracks(tracksNew); + return updateAlbum(album); + } + + @Override + public boolean remoteTrack(Album album, Track track) { + if (album == null) { + return false; + } + if (track == null) { + return false; + } + List tracksOld = album.getTracks(); + if (tracksOld == null) { + return false; + } + if (tracksOld.remove(track)) { + List tracksNew = new ArrayList<>(tracksOld); + album.setTracks(tracksNew); + return updateAlbum(album); + } + return false; + } + + @Override + public boolean renameAlbum(Album album) { + if (album == null) { + return false; + } + if (checkNameAlbumExist(album.getName())) { + return false; + } + SQLiteDatabase writableDatabase = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(NUMBER_SONG, album.getName()); + String where = ID_ALBUM + " = " + album.getId(); + int numRow = writableDatabase.update(TABLE_ALBUM, contentValues, where, null); + return numRow > 0; + } + + @Override + public boolean updateAlbum(Album album) { + if (album == null) { + return false; + } + SQLiteDatabase writableDatabase = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(NAME_ALBUM, album.getName()); + contentValues.put(NUMBER_SONG, album.getNumberSong()); + contentValues.put(IMAGE_ALBUM, album.getImage()); + String listTrack = BindingUtil.getToList(album.getTracks()); + contentValues.put(LIST_TRACK, listTrack); + String where = ID_ALBUM + " = " + album.getId(); + int numRow = writableDatabase.update(TABLE_ALBUM, contentValues, where, null); + return numRow > 0; + } + + public boolean checkNameAlbumExist(String nameAlbum) { + SQLiteDatabase database = getReadableDatabase(); + Cursor cursor = database.query(TABLE_ALBUM, + new String[]{ID_ALBUM,}, NAME_ALBUM + "=?", + new String[]{String.valueOf(nameAlbum)}, + null, null, null, null); + int count = cursor.getCount(); + cursor.close(); + return count > 0; + } + + @Override + public boolean deleteAlbum(Album album) { + if (album == null) { + return false; + } + SQLiteDatabase dbWrite = this.getWritableDatabase(); + int index = dbWrite.delete(TABLE_ALBUM, ID_ALBUM + " = ?", + new String[]{String.valueOf(album.getId())}); + return index > 0; + } + + private Album parseCursorToAlbum(Cursor cursor) { + int indexNameAlbum = cursor.getColumnIndex(NAME_ALBUM); + int indexKeyName = cursor.getColumnIndex(ID_ALBUM); + int indexImage = cursor.getColumnIndex(IMAGE_ALBUM); + int indexNumberSong = cursor.getColumnIndex(NUMBER_SONG); + int indexListTrack = cursor.getColumnIndex(LIST_TRACK); + + Album album = new Album(); + album.setId(cursor.getInt(indexKeyName)); + album.setName(cursor.getString(indexNameAlbum)); + album.setImage(cursor.getString(indexImage)); + album.setNumberSong(cursor.getInt(indexNumberSong)); + List tracks = BindingUtil.getToJson(cursor.getString(indexListTrack)); + album.setTracks(tracks); + return album; + } + +} diff --git a/main/java/com/framgia/soundclound/data/source/local/Sqlite/DBType.java b/main/java/com/framgia/soundclound/data/source/local/Sqlite/DBType.java new file mode 100644 index 0000000..adec563 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/local/Sqlite/DBType.java @@ -0,0 +1,41 @@ +package com.framgia.soundclound.data.source.local.Sqlite; + +import android.support.annotation.IntDef; +import android.support.annotation.StringDef; + +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.NAME_ALBUM; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.ID_ALBUM; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.NUMBER_SONG; +import static com.framgia.soundclound.data.source.local.Sqlite.AlbumType.LIST_TRACK; +import static com.framgia.soundclound.data.source.local.Sqlite.DatabseType.DATABASE_NAME; +import static com.framgia.soundclound.data.source.local.Sqlite.TableName.TABLE_ALBUM; +import static com.framgia.soundclound.data.source.local.Sqlite.VERSION.VERSION_DB; + +/** + * TabType in Tablayout + */ + +@StringDef({ NAME_ALBUM, ID_ALBUM, NUMBER_SONG, LIST_TRACK}) +@interface AlbumType { + String NAME_ALBUM = "name"; + String ID_ALBUM = "nam_key"; + String NUMBER_SONG = "number_song"; + String LIST_TRACK = "list_track"; + String IMAGE_ALBUM = "image"; +} + +@StringDef({DATABASE_NAME}) +@interface DatabseType { + String DATABASE_NAME = "DB_SOUNDCLOUND"; + +} +@StringDef({TABLE_ALBUM}) +@interface TableName{ + String TABLE_ALBUM = "album"; +} + +@IntDef({VERSION_DB}) +@interface VERSION{ + int VERSION_DB = 1 ; +} + diff --git a/main/java/com/framgia/soundclound/data/source/remote/LoadAsync.java b/main/java/com/framgia/soundclound/data/source/remote/LoadAsync.java new file mode 100644 index 0000000..6b26052 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/remote/LoadAsync.java @@ -0,0 +1,74 @@ +package com.framgia.soundclound.data.source.remote; + +import android.os.AsyncTask; + +import com.framgia.soundclound.data.source.TrackDataSource; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import javax.net.ssl.HttpsURLConnection; + +/** + * Created by Sony on 1/5/2018. + */ + +public class LoadAsync extends AsyncTask { + private TrackDataSource.Callback mCallback; + + public LoadAsync(TrackDataSource.Callback callback) { + mCallback = callback; + } + + @Override + protected void onPreExecute() { + mCallback.onStartLoading(); + } + + @Override + protected String doInBackground(String... strings) { + String urlStr = strings[0]; + String result = null; + try { + URL url = new URL(urlStr); + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setConnectTimeout(3000); + connection.setReadTimeout(3000); + connection.setRequestMethod("GET"); + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new IOException("HTTP Code" + responseCode); + } + InputStream inputStream = connection.getInputStream(); + result = readStream(inputStream); + } catch (IOException e) { + mCallback.onGetFailure(e.getMessage()); + } + return result; + } + + private String readStream(InputStream inputStream) throws IOException { + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader reader = new BufferedReader(inputStreamReader); + StringBuffer builder = new StringBuffer(); + String line; + try { + while ((line = reader.readLine()) != null) { + builder.append(line).append('\n'); + } + } finally { + inputStream.close(); + } + return builder.toString(); + } + + @Override + protected void onPostExecute(String result) { + mCallback.onGetSuccess(result); + mCallback.onComplete(); + } +} diff --git a/main/java/com/framgia/soundclound/data/source/remote/TrackRemoteDataSource.java b/main/java/com/framgia/soundclound/data/source/remote/TrackRemoteDataSource.java new file mode 100644 index 0000000..0222aee --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/remote/TrackRemoteDataSource.java @@ -0,0 +1,76 @@ +package com.framgia.soundclound.data.source.remote; + +import com.framgia.soundclound.data.model.Collection; +import com.framgia.soundclound.data.model.CollectionResult; +import com.framgia.soundclound.data.model.Track; +import com.framgia.soundclound.data.source.TrackDataSource; +import com.framgia.soundclound.util.Constant; +import com.framgia.soundclound.util.StringUtil; +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +/** + * Created by Sony on 1/5/2018. + */ + +public class TrackRemoteDataSource implements TrackDataSource { + + private static TrackRemoteDataSource sTrackRemoteDataSource; + + public TrackRemoteDataSource() { + } + + public static TrackRemoteDataSource getInstance() { + return sTrackRemoteDataSource; + } + + public static void init() { + if (sTrackRemoteDataSource == null) { + sTrackRemoteDataSource = new TrackRemoteDataSource(); + } + } + + @Override + public void getListTrack(String url, String genre, int limit, int offSet, + final Callback> callback) { + new LoadAsync(new TrackDataSource.Callback() { + @Override + public void onStartLoading() { + callback.onStartLoading(); + } + + @Override + public void onGetSuccess(String data) { + if (data == null) { + callback.onGetFailure(Constant.ERROR_NULL); + return; + } + CollectionResult collectionResult = + new Gson().fromJson(data, CollectionResult.class); + if (collectionResult == null) { + callback.onGetFailure(Constant.ERROR_NULL); + return; + } + List result = new ArrayList<>(); + for (Collection collection : collectionResult.getCollection()) { + result.add(collection.getTrack()); + } + callback.onGetSuccess(result); + } + + @Override + public void onGetFailure(String message) { + callback.onGetFailure(message); + } + + @Override + public void onComplete() { + callback.onComplete(); + } + }).execute(StringUtil.convertUrl(url, genre, limit, offSet)); + + } +} diff --git a/main/java/com/framgia/soundclound/data/source/repository/AlbumRepository.java b/main/java/com/framgia/soundclound/data/source/repository/AlbumRepository.java new file mode 100644 index 0000000..b78f578 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/repository/AlbumRepository.java @@ -0,0 +1,71 @@ +package com.framgia.soundclound.data.source.repository; + +import android.content.Context; + +import com.framgia.soundclound.data.model.Album; +import com.framgia.soundclound.data.model.Track; +import com.framgia.soundclound.data.source.AlbumDataSource; +import com.framgia.soundclound.data.source.local.Sqlite.AlbumLocalDataSource; + +import java.util.List; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public class AlbumRepository implements AlbumDataSource { + private AlbumDataSource mLocalDataSource; + + public static AlbumRepository getInstance(Context context) { + return new AlbumRepository(AlbumLocalDataSource.getInstance(context)); + } + + public AlbumRepository(AlbumDataSource localDataSource) { + mLocalDataSource = localDataSource; + } + + @Override + public List getAllAlbum() { + return mLocalDataSource.getAllAlbum(); + } + + @Override + public boolean addAlbum(Album album) { + return mLocalDataSource.addAlbum(album); + } + + @Override + public boolean deleteAlbum(Album album) { + return mLocalDataSource.deleteAlbum(album); + } + + @Override + public Album getAlbumById(int idAlbum) { + return mLocalDataSource.getAlbumById(idAlbum); + } + + @Override + public boolean updateAlbum(Album album) { + return mLocalDataSource.updateAlbum(album); + } + + @Override + public Album getAlbumByName(String nameAlbum) { + return mLocalDataSource.getAlbumByName(nameAlbum); + } + + @Override + public boolean addTrackinAlbum(Album album, Track track) { + return mLocalDataSource.addTrackinAlbum(album, track); + } + + @Override + public boolean remoteTrack(Album album, Track track) { + return mLocalDataSource.remoteTrack(album, track); + } + + @Override + public boolean renameAlbum(Album album) { + return mLocalDataSource.renameAlbum(album); + } +} diff --git a/main/java/com/framgia/soundclound/data/source/repository/GenresRepository.java b/main/java/com/framgia/soundclound/data/source/repository/GenresRepository.java new file mode 100644 index 0000000..414f457 --- /dev/null +++ b/main/java/com/framgia/soundclound/data/source/repository/GenresRepository.java @@ -0,0 +1,81 @@ +package com.framgia.soundclound.data.source.repository; + +import android.support.annotation.StringDef; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.data.model.Genres; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; + +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_ALL; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_CLASSIC; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_COUNTRY; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_DEEP_HOUSE; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_EDM; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_ELECTRONIC; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_POP; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_POP_BLAS; +import static com.framgia.soundclound.data.source.repository.GenresRepository.ServiceName.GENRES_ROCK; + + +/** + * Created by Bui Danh Nam on 5/1/2018. + */ +public class GenresRepository { + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + GENRES_ALL, GENRES_POP, GENRES_CLASSIC, + GENRES_POP_BLAS, GENRES_DEEP_HOUSE, GENRES_COUNTRY, + GENRES_ROCK, GENRES_EDM, GENRES_ELECTRONIC + }) + +public @interface ServiceName { + String GENRES_ALL = "all-music"; + String GENRES_POP = "pop"; + String GENRES_COUNTRY = "country"; + String GENRES_POP_BLAS = "jazzblues"; + String GENRES_DEEP_HOUSE = "deephouse"; + String GENRES_ROCK = "rock"; + String GENRES_EDM = "danceedm"; + String GENRES_CLASSIC = "classical"; + String GENRES_ELECTRONIC = "electronic"; + } + + public GenresRepository() { + } + + public static List getListGenres() { + List genres = new ArrayList<>(); + genres.add(new Genres(R.string.genres_all, R.drawable.img_background_genres, + GENRES_ALL, + R.drawable.icon_music_all)); + genres.add(new Genres(R.string.genres_pop, R.drawable.img_background_genres, + GENRES_POP, + R.drawable.icon_music_pop)); + genres.add(new Genres(R.string.genres_country, R.drawable.img_background_genres, + GENRES_COUNTRY, + R.drawable.icon_music_country)); + genres.add(new Genres(R.string.genres_classic, R.drawable.img_background_genres, + GENRES_CLASSIC, + R.drawable.icon_music_classic)); + genres.add(new Genres(R.string.genres_depp_house, R.drawable.img_background_genres, + GENRES_DEEP_HOUSE, + R.drawable.icon_music_deephouse)); + genres.add(new Genres(R.string.genres_popblas, R.drawable.img_background_genres, + GENRES_POP_BLAS, + R.drawable.icon_music_popblast)); + genres.add(new Genres(R.string.genres_rock, R.drawable.ic_favorite_gray_24dp, + GENRES_ROCK, + R.drawable.icon_music_roock)); + genres.add(new Genres(R.string.genres_edm, R.drawable.ic_favorite_gray_24dp, + GENRES_EDM, + R.drawable.icon_musicedm)); + genres.add(new Genres(R.string.genres_electronic, R.drawable.ic_favorite_gray_24dp, + GENRES_ELECTRONIC, + R.drawable.icon_musicedm)); + return genres; + } +} diff --git a/main/java/com/framgia/soundclound/screen/home/HomeAdapter.java b/main/java/com/framgia/soundclound/screen/home/HomeAdapter.java new file mode 100644 index 0000000..a07838e --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/home/HomeAdapter.java @@ -0,0 +1,68 @@ +package com.framgia.soundclound.screen.home; + +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.data.model.Genres; +import com.framgia.soundclound.databinding.ItemHomeGenresBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Bui Danh Nam on 5/1/2018. + */ + +public class HomeAdapter extends RecyclerView.Adapter { + + private List mGenres; + + + public HomeAdapter(List genres) { + mGenres = genres; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ItemHomeGenresBinding itemHomeGenresBinding = DataBindingUtil.inflate( + LayoutInflater.from(parent.getContext()), + R.layout.item_home_genres, parent, false); + return new ViewHolder(itemHomeGenresBinding); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.bindingdata(mGenres.get(position)); + } + + @Override + public int getItemCount() { + + if (mGenres == null) { + mGenres = new ArrayList<>(); + } + return mGenres.size(); + } + + /** + * Created by Bui Danh Nam on 5/1/2018. + */ + + public class ViewHolder extends RecyclerView.ViewHolder { + + private ItemHomeGenresBinding mItemHomeGenresBinding; + + public ViewHolder(ItemHomeGenresBinding itemHomeGenresBinding) { + super(itemHomeGenresBinding.getRoot()); + mItemHomeGenresBinding = itemHomeGenresBinding; + } + + public void bindingdata(Genres genres) { + mItemHomeGenresBinding.setGenres(genres); + mItemHomeGenresBinding.executePendingBindings(); + } + } +} diff --git a/main/java/com/framgia/soundclound/screen/home/HomeFragment.java b/main/java/com/framgia/soundclound/screen/home/HomeFragment.java new file mode 100644 index 0000000..aa04b70 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/home/HomeFragment.java @@ -0,0 +1,41 @@ +package com.framgia.soundclound.screen.home; + + +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.databinding.FragmentHomeBinding; + +/** + * Created by Bui Danh Nam on 5/1/2018. + */ + +public class HomeFragment extends Fragment { + + public HomeFragment() { + } + + + public static HomeFragment newInstance() { + + return new HomeFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + Bundle savedInstanceState) { + FragmentHomeBinding fragmentHomeBinding = DataBindingUtil.inflate(inflater, + R.layout.fragment_home, container, false); + HomeViewModel homeViewModel = new HomeViewModel(); + fragmentHomeBinding.setViewmodelHome(homeViewModel); + return fragmentHomeBinding.getRoot(); + } + +} diff --git a/main/java/com/framgia/soundclound/screen/home/HomeViewModel.java b/main/java/com/framgia/soundclound/screen/home/HomeViewModel.java new file mode 100644 index 0000000..e06d76d --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/home/HomeViewModel.java @@ -0,0 +1,35 @@ +package com.framgia.soundclound.screen.home; + +import android.databinding.BaseObservable; +import android.databinding.Bindable; + +import com.framgia.soundclound.BR; +import com.framgia.soundclound.data.model.Genres; +import com.framgia.soundclound.data.source.repository.GenresRepository; + +/** + * Created by Bui Danh Nam on 5/1/2018. + */ + +public class HomeViewModel extends BaseObservable implements OnItemClickListener { + private HomeAdapter mHomeAdapter; + + public HomeViewModel() { + mHomeAdapter = new HomeAdapter(GenresRepository.getListGenres()); + } + + @Bindable + public HomeAdapter getHomeAdapter() { + return mHomeAdapter; + } + + public void setHomeAdapter(HomeAdapter homeAdapter) { + mHomeAdapter = homeAdapter; + notifyPropertyChanged(BR.homeAdapter); + } + + @Override + public void onClick(Genres genres) { + // handle click item + } +} diff --git a/main/java/com/framgia/soundclound/screen/home/OnItemClickListener.java b/main/java/com/framgia/soundclound/screen/home/OnItemClickListener.java new file mode 100644 index 0000000..7fd01eb --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/home/OnItemClickListener.java @@ -0,0 +1,11 @@ +package com.framgia.soundclound.screen.home; + +import com.framgia.soundclound.data.model.Genres; + +/** + * Created by Bui Danh Nam on 5/1/2018. + */ + +public interface OnItemClickListener { + void onClick(Genres genres); +} diff --git a/main/java/com/framgia/soundclound/screen/main/MainActivity.java b/main/java/com/framgia/soundclound/screen/main/MainActivity.java new file mode 100644 index 0000000..2443c04 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/main/MainActivity.java @@ -0,0 +1,32 @@ +package com.framgia.soundclound.screen.main; + +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.databinding.ActivityMainBinding; + +/** + * Created by Sony on 1/4/2018. + */ + + +public class MainActivity extends AppCompatActivity { + + private MainViewModel mViewModel; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + mViewModel = new MainViewModel(this); + ActivityMainBinding binding = DataBindingUtil + .setContentView(this, R.layout.activity_main); + binding.setViewModel((MainViewModel) mViewModel); + getSupportActionBar().hide(); + } + + +} diff --git a/main/java/com/framgia/soundclound/screen/main/MainPagerAdapter.java b/main/java/com/framgia/soundclound/screen/main/MainPagerAdapter.java new file mode 100644 index 0000000..cf1fc0b --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/main/MainPagerAdapter.java @@ -0,0 +1,42 @@ +package com.framgia.soundclound.screen.main; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import com.framgia.soundclound.screen.home.HomeFragment; +import com.framgia.soundclound.screen.playlist.PlaylistFragment; + +/** + * Created by Sony on 1/4/2018. + */ + +public class MainPagerAdapter extends FragmentPagerAdapter { + + private static final int TAB_COUNT = 4; + + public MainPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + switch (position) { + case TabType.HOME: + return PlaylistFragment.newInstance(); + case TabType.PLAY_LIST: + return PlaylistFragment.newInstance(); + case TabType.LOCAL: + return new Fragment(); + case TabType.FAVORITE: + return new Fragment(); + default: + return null; + } + } + + @Override + public int getCount() { + return TAB_COUNT; + } +} diff --git a/main/java/com/framgia/soundclound/screen/main/MainViewModel.java b/main/java/com/framgia/soundclound/screen/main/MainViewModel.java new file mode 100644 index 0000000..3bea7a5 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/main/MainViewModel.java @@ -0,0 +1,52 @@ +package com.framgia.soundclound.screen.main; + +import android.content.Context; +import android.databinding.BaseObservable; +import android.databinding.Bindable; + + +import com.framgia.soundclound.BR; +import com.framgia.soundclound.R; + +/** + * Created by Sony on 1/4/2018. + */ + +public class MainViewModel extends BaseObservable { + private Context mContext; + private MainActivity mActivity; + private MainPagerAdapter mPagerAdapter; + + public MainViewModel(Context context) { + mContext = context; + mActivity = (MainActivity) context; + mPagerAdapter = new MainPagerAdapter(mActivity.getSupportFragmentManager()); + } + + @Bindable + public MainPagerAdapter getPagerAdapter() { + return mPagerAdapter; + } + + public void setPagerAdapter(MainPagerAdapter pagerAdapter) { + mPagerAdapter = pagerAdapter; + notifyPropertyChanged(BR.pagerAdapter); + } + + @Bindable + public int getTabSelectedColor() { + return R.color.color_orange; + } + + @Bindable + public int getTabUnSelectedColor() { + return R.color.color_gray; + } + + @Bindable + public int getTabSelectedHome() { + return R.color.color_orange; + } + + +} diff --git a/main/java/com/framgia/soundclound/screen/main/TabType.java b/main/java/com/framgia/soundclound/screen/main/TabType.java new file mode 100644 index 0000000..8a86c45 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/main/TabType.java @@ -0,0 +1,21 @@ +package com.framgia.soundclound.screen.main; + +import android.support.annotation.IntDef; + +import static com.framgia.soundclound.screen.main.TabType.FAVORITE; +import static com.framgia.soundclound.screen.main.TabType.HOME; +import static com.framgia.soundclound.screen.main.TabType.LOCAL; +import static com.framgia.soundclound.screen.main.TabType.PLAY_LIST; + + +/** + * TabType in Tablayout + */ + +@IntDef({HOME, PLAY_LIST, LOCAL, FAVORITE}) +public @interface TabType { + int HOME = 0; + int PLAY_LIST = 1; + int LOCAL = 2; + int FAVORITE = 3; +} diff --git a/main/java/com/framgia/soundclound/screen/playlist/OnItemAlbumClick.java b/main/java/com/framgia/soundclound/screen/playlist/OnItemAlbumClick.java new file mode 100644 index 0000000..f75feb2 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/playlist/OnItemAlbumClick.java @@ -0,0 +1,15 @@ +package com.framgia.soundclound.screen.playlist; + +import android.widget.ImageView; + +import com.framgia.soundclound.data.model.Album; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public interface OnItemAlbumClick { + void onItemClick(Album album); + + void onItemMoreClick(ImageView imageView, Album album); +} diff --git a/main/java/com/framgia/soundclound/screen/playlist/PlaylistAdapter.java b/main/java/com/framgia/soundclound/screen/playlist/PlaylistAdapter.java new file mode 100644 index 0000000..33d5823 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/playlist/PlaylistAdapter.java @@ -0,0 +1,73 @@ +package com.framgia.soundclound.screen.playlist; + +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.data.model.Album; +import com.framgia.soundclound.databinding.ItemAlbumBinding; + +import java.util.List; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public class PlaylistAdapter extends RecyclerView.Adapter { + private List mAlbums; + private OnItemAlbumClick mOnItemAlbumClick; + + public PlaylistAdapter(List albums) { + mAlbums = albums; + } + + public List getAlbums() { + return mAlbums; + } + + public void updateAlbums(List albums) { + mAlbums = albums; + notifyDataSetChanged(); + } + + public void setOnItemAlbumClick(OnItemAlbumClick onItemAlbumClick) { + mOnItemAlbumClick = onItemAlbumClick; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ItemAlbumBinding itemAlbumBinding = DataBindingUtil.inflate( + LayoutInflater.from( + parent.getContext()), R.layout.item_album, parent, false); + + return new ViewHolder(itemAlbumBinding); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.bindData(mAlbums.get(position)); + } + + @Override + public int getItemCount() { + return mAlbums != null ? mAlbums.size() : 0; + } + + public class ViewHolder extends RecyclerView.ViewHolder { + private ItemAlbumBinding mItemAlbumBinding; + + public ViewHolder(ItemAlbumBinding itemAlbumBinding) { + super(itemAlbumBinding.getRoot()); + mItemAlbumBinding = itemAlbumBinding; + } + + public void bindData(Album album) { + mItemAlbumBinding.setAlbum(album); + mItemAlbumBinding.setListener(mOnItemAlbumClick); + mItemAlbumBinding.executePendingBindings(); + } + } + +} diff --git a/main/java/com/framgia/soundclound/screen/playlist/PlaylistFragment.java b/main/java/com/framgia/soundclound/screen/playlist/PlaylistFragment.java new file mode 100644 index 0000000..49b9074 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/playlist/PlaylistFragment.java @@ -0,0 +1,37 @@ +package com.framgia.soundclound.screen.playlist; + +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.databinding.FragmentPlaylistBinding; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public class PlaylistFragment extends Fragment { + public PlaylistFragment() { + } + + public static PlaylistFragment newInstance() { + return new PlaylistFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + Bundle savedInstanceState) { + FragmentPlaylistBinding fragmentPlaylistBinding = DataBindingUtil.inflate(inflater, + R.layout.fragment_playlist, container, false); + PlaylistModelView playlistModelView = new PlaylistModelView(this.getContext()); + fragmentPlaylistBinding.setPlaylistModelview(playlistModelView); + return fragmentPlaylistBinding.getRoot(); + } + +} diff --git a/main/java/com/framgia/soundclound/screen/playlist/PlaylistModelView.java b/main/java/com/framgia/soundclound/screen/playlist/PlaylistModelView.java new file mode 100644 index 0000000..4f01517 --- /dev/null +++ b/main/java/com/framgia/soundclound/screen/playlist/PlaylistModelView.java @@ -0,0 +1,176 @@ +package com.framgia.soundclound.screen.playlist; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.databinding.BaseObservable; +import android.databinding.Bindable; +import android.util.Log; +import android.view.MenuItem; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.PopupMenu; +import android.widget.Toast; + +import com.framgia.soundclound.BR; +import com.framgia.soundclound.R; +import com.framgia.soundclound.data.model.Album; +import com.framgia.soundclound.data.source.repository.AlbumRepository; + +/** + * Created by Bui Danh Nam on 8/1/2018. + */ + +public class PlaylistModelView extends BaseObservable implements OnItemAlbumClick { + private PlaylistAdapter mPlaylistAdapter; + private Context mContext; + + public PlaylistModelView(Context context) { + mContext = context; + mPlaylistAdapter = new PlaylistAdapter( + AlbumRepository.getInstance(mContext).getAllAlbum()); + mPlaylistAdapter.setOnItemAlbumClick(this); + } + + @Bindable + public PlaylistAdapter getPlaylistAdapter() { + return mPlaylistAdapter; + } + + public void setPlaylistAdapter(PlaylistAdapter playlistAdapter) { + mPlaylistAdapter = playlistAdapter; + notifyPropertyChanged(BR.playlistAdapter); + } + + public void onFabAddAlbumClick() { + showInputDialog(); + } + + private void showInputDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(mContext); + builder.setTitle(R.string.add_album); + builder.setMessage(R.string.name_album); + final EditText input = new EditText(builder.getContext()); + builder.setView(input); + builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String nameAlbum = input.getText().toString(); + if (!nameAlbum.isEmpty()) { + Album album = new Album(); + album.setName(nameAlbum); + boolean result = AlbumRepository.getInstance(mContext).addAlbum(album); + if (result) { + mPlaylistAdapter.updateAlbums( + AlbumRepository.getInstance(mContext).getAllAlbum()); + } else { + dialog.cancel(); + Toast.makeText( + mContext, R.string.err_name_exist, Toast.LENGTH_SHORT).show(); + } + } else { + Toast.makeText( + mContext, R.string.err_name_null, Toast.LENGTH_SHORT).show(); + } + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + builder.show(); + } + + + @Override + public void onItemClick(Album album) { + Log.i("", "onItemClick: "); + } + + @Override + public void onItemMoreClick(ImageView imageView, final Album album) { + if (album == null) { + return; + } + final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); + PopupMenu popupMenu = new PopupMenu(mContext, imageView); + popupMenu.getMenuInflater().inflate(R.menu.popup_menu_album, popupMenu.getMenu()); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.delete_album: + builder.setTitle(R.string.delele_album); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + boolean result = AlbumRepository.getInstance(mContext).deleteAlbum(album); + if (result) { + mPlaylistAdapter.updateAlbums( + AlbumRepository.getInstance(mContext).getAllAlbum()); + } + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + break; + case R.id.rename_album: + + builder.setTitle(R.string.rename_album); + builder.setMessage(R.string.name_album); + final EditText inputNameAlbum = new EditText(builder.getContext()); + builder.setView(inputNameAlbum); + inputNameAlbum.setText(album.getName()); + builder.setPositiveButton( + R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String nameAlbum = inputNameAlbum.getText().toString(); + if (!nameAlbum.isEmpty()) { + album.setName(nameAlbum); + boolean result = AlbumRepository + .getInstance(mContext).renameAlbum(album); + if (result) { + mPlaylistAdapter.updateAlbums( + AlbumRepository + .getInstance(mContext) + .getAllAlbum()); + } else { + dialog.cancel(); + Toast.makeText( + mContext + , R.string.err_name_exist + , Toast.LENGTH_SHORT).show(); + } + } else { + Toast.makeText(mContext + , R.string.err_name_null + , Toast.LENGTH_SHORT) + .show(); + } + } + }); + builder.setNegativeButton( + R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + break; + } + builder.show(); + return true; + } + }); + popupMenu.show(); + } +} diff --git a/main/java/com/framgia/soundclound/util/BindingUtil.java b/main/java/com/framgia/soundclound/util/BindingUtil.java new file mode 100644 index 0000000..7bd04cc --- /dev/null +++ b/main/java/com/framgia/soundclound/util/BindingUtil.java @@ -0,0 +1,124 @@ +package com.framgia.soundclound.util; + +import android.databinding.BindingAdapter; +import android.graphics.PorterDuff; +import android.support.design.widget.TabLayout; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.widget.ImageView; +import android.widget.TextView; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.data.model.Track; +import com.framgia.soundclound.screen.main.TabType; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Sony on 1/4/2018. + */ + +public class BindingUtil { + + @BindingAdapter({"pagerAdapter"}) + public static void setViewPagerAdapter(ViewPager viewPager, PagerAdapter adapter) { + viewPager.setAdapter(adapter); + } + + @BindingAdapter({"selectedColor", "unSelectedColor", "viewPager"}) + public static void setupTabIndicatorListener(final TabLayout tabLayout, final int selectedColor, + final int unSelectedColor, + final ViewPager viewPager) { + tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + if (tab.getIcon() == null) { + return; + } + tab.getIcon().setColorFilter(ContextCompat.getColor(tabLayout.getContext(), + selectedColor), PorterDuff.Mode.SRC_ATOP); + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + if (tab.getIcon() == null) { + return; + } + tab.getIcon().setColorFilter(ContextCompat.getColor(tabLayout.getContext(), + unSelectedColor), PorterDuff.Mode.SRC_ATOP); + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + // noops + } + }); + } + + @BindingAdapter({"setTabHome"}) + public static void setUpColorFilterHome(final TabLayout tabLayout, final int selectedHome) { + if (tabLayout.getTabAt(TabType.HOME).getIcon() != null) { + int selectedColor = ContextCompat.getColor(tabLayout.getContext(), selectedHome); + tabLayout.getTabAt(TabType.HOME).getIcon().setColorFilter(selectedColor, + PorterDuff.Mode.SRC_ATOP); + } + } + + + public static List getToJson(String jsonTrack) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + return gson.fromJson(jsonTrack, type); + } + + public static String getToList(List listObj) { + if (listObj == null) { + return null; + } + Gson gson = new Gson(); + return gson.toJson(listObj); + + } + + @BindingAdapter("playlist_adapter") + public static void setPlaylistAdapter(RecyclerView view, RecyclerView.Adapter adapter) { + view.setAdapter(adapter); + view.setItemAnimator(new DefaultItemAnimator()); + view.addItemDecoration(new DividerItemDecoration(view.getContext() , LinearLayoutManager.VERTICAL)); + } + + @BindingAdapter("settext") + public static void setNumberSong(TextView textView, int numberSong) { + textView.setText(String.valueOf(numberSong) + " " + + textView.getResources().getString(R.string.song)); + } + @BindingAdapter("set_image") + public static void setImage(ImageView view, int resource) { + if (String.valueOf(resource).isEmpty()) { + view.setImageResource(R.drawable.img_background_genres); + } + view.setImageResource(resource); + } + @BindingAdapter("set_image") + public static void setImage(ImageView view, String url) { + if (url == null) { + view.setImageResource(R.mipmap.ic_launcher); + } + else { + view.setImageResource(R.drawable.ic_favorite_gray_24dp); + } + } + +} + diff --git a/main/java/com/framgia/soundclound/util/Constant.java b/main/java/com/framgia/soundclound/util/Constant.java new file mode 100644 index 0000000..2de0197 --- /dev/null +++ b/main/java/com/framgia/soundclound/util/Constant.java @@ -0,0 +1,18 @@ +package com.framgia.soundclound.util; + + +/** + * Created by Sony on 1/8/2018. + */ + +public class Constant { + public static final String BASE_URL = "https://api-v2.soundcloud.com/"; + public static final String PARA = "charts?kind=top&genre=soundcloud%3Agenres%3A"; + public static final String CLIENT_ID = "client_id"; + public static final String OFF_SET = "offset"; + public static final String LIMIT = "limit"; + public static final String ERROR_NULL = "null_data"; + public static final int NUM_COLUMN_GRID = 3; + public static final int NUM_ROW_GIRD = 3; + +} diff --git a/main/java/com/framgia/soundclound/util/HomeBindingUtils.java b/main/java/com/framgia/soundclound/util/HomeBindingUtils.java new file mode 100644 index 0000000..177c403 --- /dev/null +++ b/main/java/com/framgia/soundclound/util/HomeBindingUtils.java @@ -0,0 +1,79 @@ +package com.framgia.soundclound.util; + +import android.content.Context; +import android.databinding.BindingAdapter; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.widget.ImageView; + +import com.framgia.soundclound.R; +import com.framgia.soundclound.util.designhelper.GridSpacingItem; + + +/** + * Created by Bui Danh Nam on 29/12/2017. + */ + +public class HomeBindingUtils { + + @BindingAdapter("src") + public static void setImage(ImageView view, int resource) { + view.setImageResource(resource); + } + +// @BindingAdapter("config_size") +// public static void resize(ConstraintLayout viewLayout, String resource) { +// int h_view = calculateItemHight(viewLayout.getContext()); +// int w_view = calculateItemWith(viewLayout.getContext()); +// viewLayout.requestLayout(); +// viewLayout.setLayoutParams(new ConstraintLayout.LayoutParams(w_view, h_view)); +// +// } + + @BindingAdapter("adapter") + public static void setReccyclerAdapter(RecyclerView view, RecyclerView.Adapter adapter) { + view.setAdapter(adapter); + view.setItemAnimator(new DefaultItemAnimator()); + } + + @BindingAdapter("config") + public static void configRecycleView(RecyclerView recyclerView, String c) { + Context context = recyclerView.getContext(); + RecyclerView.LayoutManager layoutManager = new GridLayoutManager(context, + Constant.NUM_COLUMN_GRID); + recyclerView.setLayoutManager(layoutManager); + + int wItemPx = context.getResources().getDimensionPixelSize(R.dimen.item_genres_w); + int hItemPx = context.getResources().getDimensionPixelSize(R.dimen.item_genres_h); + int spacingItemWidth = calculatSpacingItemWidth(context, wItemPx); + int spacingItemHight = calculatSpacingItemHight(context, hItemPx); + + recyclerView.addItemDecoration(new GridSpacingItem(Constant.NUM_COLUMN_GRID, + spacingItemWidth, spacingItemWidth, true)); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + } + + public static int calculatSpacingItemWidth(Context context, int wItemPx) { + DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); + float displayWidthPx = displayMetrics.widthPixels; + return (int) + + ((displayWidthPx - + (wItemPx * Constant.NUM_COLUMN_GRID)) / Constant.NUM_COLUMN_GRID); + + } + + public static int calculatSpacingItemHight(Context context, int hItemPx) { + DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); + float displayHightPx = displayMetrics.heightPixels; + + return (int) + ((displayHightPx - + (hItemPx * Constant.NUM_ROW_GIRD)) / Constant.NUM_ROW_GIRD); + + } + + +} diff --git a/main/java/com/framgia/soundclound/util/StringUtil.java b/main/java/com/framgia/soundclound/util/StringUtil.java new file mode 100644 index 0000000..f5bc63f --- /dev/null +++ b/main/java/com/framgia/soundclound/util/StringUtil.java @@ -0,0 +1,27 @@ +package com.framgia.soundclound.util; + +import com.framgia.soundclound.BuildConfig; + +/** + * Created by Sony on 1/5/2018. + */ + +public class StringUtil { + public static String convertUrl(String url, String genre, int limit, int offSet) { + StringBuffer stringBuffer = new StringBuffer(url); + stringBuffer.append(genre) + .append('&') + .append(Constant.CLIENT_ID) + .append('=') + .append(BuildConfig.API_KEY) + .append('&') + .append(Constant.LIMIT) + .append('=') + .append(limit) + .append('&') + .append(Constant.OFF_SET) + .append('=').append(offSet); + return stringBuffer.toString(); + + } +} diff --git a/main/java/com/framgia/soundclound/util/designhelper/GridSpacingItem.java b/main/java/com/framgia/soundclound/util/designhelper/GridSpacingItem.java new file mode 100644 index 0000000..17a627b --- /dev/null +++ b/main/java/com/framgia/soundclound/util/designhelper/GridSpacingItem.java @@ -0,0 +1,56 @@ +package com.framgia.soundclound.util.designhelper; + + +import android.graphics.Rect; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +/** + * Created by Bui Danh Nam on 6/1/2018. + */ + +public class GridSpacingItem extends RecyclerView.ItemDecoration { + + + private int mSpanCount; + private int mSpacingWidth; + private int mSpacingHight; + private boolean mIncludeEdge; + + public GridSpacingItem(int spanCount, int spacingW, int spacingH, boolean includeEdge) { + this.mSpanCount = spanCount; + this.mSpacingWidth = spacingW; + this.mSpacingHight = spacingH; + this.mIncludeEdge = includeEdge; + + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, + RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); + + int column = position % mSpanCount; + + if (mIncludeEdge) { + outRect.left = mSpacingWidth - column * mSpacingWidth / mSpanCount; + outRect.right = (column + 1) * mSpacingWidth / mSpanCount; + + if (position < mSpanCount) { + outRect.top = mSpacingHight; + } + outRect.bottom = mSpacingHight; + } else { + outRect.left = column * mSpacingWidth / mSpanCount; + outRect.right = mSpacingWidth - (column + 1) * mSpacingWidth / mSpanCount; + if (position >= mSpanCount) { + outRect.top = mSpacingHight; + + } + } + } +} + + + + diff --git a/main/java/com/framgia/soundclound/widget/IsSwipeViewPager.java b/main/java/com/framgia/soundclound/widget/IsSwipeViewPager.java new file mode 100644 index 0000000..e28ffbb --- /dev/null +++ b/main/java/com/framgia/soundclound/widget/IsSwipeViewPager.java @@ -0,0 +1,41 @@ +package com.framgia.soundclound.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import com.framgia.soundclound.R; + +/** + * Created by Sony on 1/4/2018. + */ + +public class IsSwipeViewPager extends ViewPager { + private boolean isEnableSwipe; + + public IsSwipeViewPager(Context context) { + super(context); + } + + public IsSwipeViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray a = context.getTheme().obtainStyledAttributes( + attrs, + R.styleable.IsSwipeViewPager, + 0, 0); + try { + isEnableSwipe = a.getBoolean(R.styleable.IsSwipeViewPager_isEnableSwipe, false); + + } finally { + a.recycle(); + } + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + return isEnableSwipe && super.onInterceptTouchEvent(event); + } + +}