Skip to content

Commit 988c535

Browse files
committed
[Re-architecture]
updated to room-viewModel-liveData structure
1 parent dc3861d commit 988c535

29 files changed

+1014
-648
lines changed

AAD-Preparation/.idea/workspace.xml

+543-421
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/Constants.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import android.os.Environment;
44

55
public class Constants {
6-
public final static String ALBUM_URL = "https://rallycoding.herokuapp.com/api/music_albums";
76
public static String ROOT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + MyApplication.INSTANCE.getPackageName() + "/";
87
public static String DIR_NAME = "MaterialDesignApp";
98
public static final String SD_CARD = "sdCard";
109
public static final String EXTERNAL_SD_CARD = "externalSdCard";
1110
public final static String FRESCO_DIR = "fresco";
11+
public static final int ROOM_DATABASE_VERSION = 1;
1212
}

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/FirebaseDB.java

-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package com.catherine.materialdesignapp;
22

3-
/**
4-
* Created by catherine_chen on 2019-05-31.
5-
* Trend Micro
6-
7-
*/
83
public class FirebaseDB {
94
public static String PLAYLIST = "playlists";
105
public static String SONGS = "songs";

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/adapters/AlbumAdapter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import com.catherine.materialdesignapp.R;
2020
import com.catherine.materialdesignapp.listeners.OnItemClickListener;
21-
import com.catherine.materialdesignapp.models.Album;
21+
import com.catherine.materialdesignapp.jetpack.entities.Album;
2222
import com.facebook.binaryresource.BinaryResource;
2323
import com.facebook.binaryresource.FileBinaryResource;
2424
import com.facebook.cache.common.CacheKey;

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/adapters/ArtistAdapter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import androidx.recyclerview.widget.RecyclerView;
1818

1919
import com.catherine.materialdesignapp.R;
20-
import com.catherine.materialdesignapp.models.Artist;
20+
import com.catherine.materialdesignapp.jetpack.entities.Artist;
2121
import com.catherine.materialdesignapp.utils.DisplayHelper;
2222
import com.facebook.drawee.view.SimpleDraweeView;
2323

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/components/ArtistItemKeyProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import androidx.annotation.Nullable;
55
import androidx.recyclerview.selection.ItemKeyProvider;
66

7-
import com.catherine.materialdesignapp.models.Artist;
7+
import com.catherine.materialdesignapp.jetpack.entities.Artist;
88

99
import java.util.List;
1010

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/components/PlaylistHelper.java

-5
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@
3333
import java.util.Locale;
3434
import java.util.Map;
3535

36-
/**
37-
* Created by catherine_chen on 2019-05-29.
38-
* Trend Micro
39-
40-
*/
4136
public class PlaylistHelper implements View.OnClickListener {
4237
private String TAG = "PlaylistHelper";
4338
private AddToPlaylistAdapter addToPlaylistAdapter;

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/fragments/AlbumsFragment.java

+15-38
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import androidx.core.app.ActivityCompat;
1515
import androidx.core.app.ActivityOptionsCompat;
1616
import androidx.core.util.Pair;
17+
import androidx.lifecycle.ViewModelProviders;
1718
import androidx.recyclerview.widget.LinearLayoutManager;
1819
import androidx.recyclerview.widget.RecyclerView;
1920
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@@ -22,10 +23,11 @@
2223
import com.catherine.materialdesignapp.R;
2324
import com.catherine.materialdesignapp.activities.AlbumDetailsActivity;
2425
import com.catherine.materialdesignapp.adapters.AlbumAdapter;
26+
import com.catherine.materialdesignapp.jetpack.entities.Album;
27+
import com.catherine.materialdesignapp.jetpack.view_models.AlbumViewModel;
2528
import com.catherine.materialdesignapp.listeners.OnItemClickListener;
2629
import com.catherine.materialdesignapp.listeners.OnSearchViewListener;
2730
import com.catherine.materialdesignapp.listeners.UIComponentsListener;
28-
import com.catherine.materialdesignapp.models.Album;
2931
import com.catherine.materialdesignapp.utils.PrefetchSubscriber;
3032
import com.catherine.materialdesignapp.utils.TextHelper;
3133
import com.facebook.binaryresource.BinaryResource;
@@ -46,12 +48,9 @@
4648
import java.util.ArrayList;
4749
import java.util.List;
4850

49-
import okhttp3.OkHttpClient;
50-
5151
public class AlbumsFragment extends ChildOfMusicFragment implements OnSearchViewListener {
5252
private final static String TAG = AlbumsFragment.class.getSimpleName();
5353
private AlbumAdapter adapter;
54-
private OkHttpClient okHttpClient;
5554
private List<Album> albums;
5655
private List<Album> filteredAlbums;
5756
private PrefetchSubscriber subscriber;
@@ -62,6 +61,8 @@ public class AlbumsFragment extends ChildOfMusicFragment implements OnSearchView
6261
private ValueEventListener firebaseValueEventListener;
6362
private String DB_PATH = FirebaseDB.ALBUMS;
6463

64+
private AlbumViewModel albumViewModel;
65+
6566
@Override
6667
public View onCreateView(LayoutInflater inflater, ViewGroup container,
6768
Bundle savedInstanceState) {
@@ -128,41 +129,20 @@ public void onItemLongClick(View view, int position) {
128129
}
129130
});
130131
recyclerView.setAdapter(adapter);
131-
okHttpClient = new OkHttpClient.Builder().build();
132132
subscriber = new PrefetchSubscriber();
133133
listener = (UIComponentsListener) getActivity();
134+
135+
albumViewModel = ViewModelProviders.of(this).get(AlbumViewModel.class);
136+
albumViewModel.getAlbumLiveData().observe(this, albums -> {
137+
filteredAlbums.clear();
138+
filteredAlbums.addAll(albums);
139+
adapter.setEntities(filteredAlbums);
140+
updateList();
141+
});
134142
fillInData();
135143
}
136144

137145
private void fillInData() {
138-
// // Retrieve data from https://rallycoding.herokuapp.com/api/music_albums
139-
// Request request = new Request.Builder()
140-
// .url(Constants.ALBUM_URL)
141-
// .build();
142-
//
143-
// okHttpClient.newCall(request).enqueue(new Callback() {
144-
// @Override
145-
// public void onFailure(Call call, IOException e) {
146-
// e.printStackTrace();
147-
// updateList();
148-
// }
149-
//
150-
// @Override
151-
// public void onResponse(Call call, Response response) throws IOException {
152-
// String returnMsg = String.format(Locale.ENGLISH, "connectSuccess code:%s\nisSuccessful:%b\nisRedirect:%b\ncache control:%s",
153-
// response.code(), response.isSuccessful(), response.isRedirect(), response.cacheControl().toString());
154-
// Log.i(TAG, returnMsg);
155-
// Gson gson = new Gson();
156-
// Type listType = new TypeToken<List<Album>>() {
157-
// }.getType();
158-
// albums = gson.fromJson(response.body().string(), listType);
159-
// filteredAlbums.clear();
160-
// filteredAlbums.addAll(albums);
161-
// adapter.setEntities(filteredAlbums);
162-
// updateList();
163-
// cacheItems();
164-
// }
165-
// });
166146

167147
// Retrieve data from firebase realtime database
168148
if (firebaseValueEventListener != null)
@@ -183,11 +163,8 @@ public void onDataChange(DataSnapshot dataSnapshot) {
183163
Album album = child.getValue(Album.class);
184164
Log.i(TAG, String.format("%s: %s", child.getKey(), album));
185165
albums.add(album);
166+
albumViewModel.insert(album);
186167
}
187-
filteredAlbums.clear();
188-
filteredAlbums.addAll(albums);
189-
adapter.setEntities(filteredAlbums);
190-
updateList();
191168
cacheItems();
192169
}
193170

@@ -257,7 +234,7 @@ public void onFragmentHide() {
257234
@Override
258235
public void onDestroy() {
259236
if (firebaseValueEventListener != null)
260-
myRef.removeEventListener(firebaseValueEventListener);
237+
myRef.removeEventListener(firebaseValueEventListener);
261238
super.onDestroy();
262239
}
263240
}

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/fragments/ArtistsFragment.java

+14-38
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import androidx.annotation.NonNull;
1010
import androidx.annotation.Nullable;
11+
import androidx.lifecycle.ViewModelProviders;
1112
import androidx.recyclerview.selection.SelectionTracker;
1213
import androidx.recyclerview.selection.StorageStrategy;
1314
import androidx.recyclerview.widget.GridLayoutManager;
@@ -18,9 +19,10 @@
1819
import com.catherine.materialdesignapp.adapters.ArtistAdapter;
1920
import com.catherine.materialdesignapp.components.ArtistItemDetailsLookup;
2021
import com.catherine.materialdesignapp.components.ArtistItemKeyProvider;
22+
import com.catherine.materialdesignapp.jetpack.entities.Artist;
23+
import com.catherine.materialdesignapp.jetpack.view_models.ArtistViewModel;
2124
import com.catherine.materialdesignapp.listeners.OnSearchViewListener;
2225
import com.catherine.materialdesignapp.listeners.UIComponentsListener;
23-
import com.catherine.materialdesignapp.models.Artist;
2426
import com.catherine.materialdesignapp.utils.TextHelper;
2527
import com.google.firebase.database.DataSnapshot;
2628
import com.google.firebase.database.DatabaseError;
@@ -36,11 +38,12 @@ public class ArtistsFragment extends ChildOfMusicFragment implements OnSearchVie
3638
private ArtistAdapter adapter;
3739
private List<Artist> artists;
3840
private List<Artist> filteredArtists;
39-
private RecyclerView recyclerView;
4041
private ArtistItemKeyProvider artistItemKeyProvider;
4142
private SelectionTracker<String> tracker;
4243
private UIComponentsListener listener;
4344

45+
private ArtistViewModel artistViewModel;
46+
4447
@Override
4548
public View onCreateView(LayoutInflater inflater, ViewGroup container,
4649
Bundle savedInstanceState) {
@@ -58,7 +61,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
5861
fillInData();
5962
swipeRefreshLayout.setRefreshing(false);
6063
});
61-
recyclerView = view.findViewById(R.id.rv_artist);
64+
RecyclerView recyclerView = view.findViewById(R.id.rv_artist);
6265
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), ArtistAdapter.MAX_COLUMNS));
6366

6467
artists = new ArrayList<>();
@@ -79,42 +82,17 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
7982
adapter.setSelectionTracker(tracker);
8083
tracker.addObserver(new SelectionObserver());
8184
listener = (UIComponentsListener) getActivity();
85+
86+
artistViewModel = ViewModelProviders.of(this).get(ArtistViewModel.class);
87+
artistViewModel.getArtistLiveData().observe(this, artists1 -> {
88+
filteredArtists.clear();
89+
filteredArtists.addAll(artists);
90+
updateList();
91+
});
8292
fillInData();
8393
}
8494

8595
private void fillInData() {
86-
// String mockData = "[\n" +
87-
// " {\n" +
88-
// " \"artist\": \"Taylor Swift\",\n" +
89-
// " \"url\": \"https://en.wikipedia.org/wiki/Taylor_Swift\",\n" +
90-
// " \"image\": \"https://images-na.ssl-images-amazon.com/images/I/71YCfdyMXsL.jpg\"\n" +
91-
// " },\n" +
92-
// " {\n" +
93-
// " \"artist\": \"Kanye West\",\n" +
94-
// " \"url\": \"https://en.wikipedia.org/wiki/Kanye_West\",\n" +
95-
// " \"image\": \"https://images-na.ssl-images-amazon.com/images/I/71w7GAs8SeL.jpg\"\n" +
96-
// " },\n" +
97-
// " {\n" +
98-
// " \"artist\": \"Beyoncé\",\n" +
99-
// " \"url\": \"https://en.wikipedia.org/wiki/Beyonc%C3%A9\",\n" +
100-
// " \"image\": \"https://images-na.ssl-images-amazon.com/images/I/51T6RpubiVL.jpg\"\n" +
101-
// " },\n" +
102-
// " {\n" +
103-
// " \"artist\": \"Ariana Grande\",\n" +
104-
// " \"url\": \"https://en.wikipedia.org/wiki/Ariana_Grande\",\n" +
105-
// " \"image\": \"https://images-na.ssl-images-amazon.com/images/I/7192dgpkzTL.jpg\"\n" +
106-
// " }\n" +
107-
// "]";
108-
//
109-
// Gson gson = new Gson();
110-
// Type listType = new TypeToken<List<Artist>>() {
111-
// }.getType();
112-
// artists = gson.fromJson(mockData, listType);
113-
//
114-
// filteredArtists.clear();
115-
// filteredArtists.addAll(artists);
116-
// updateList();
117-
11896
FirebaseDatabase database = FirebaseDatabase.getInstance();
11997
DatabaseReference myRef = database.getReference("artists");
12098
myRef.addValueEventListener(new ValueEventListener() {
@@ -128,10 +106,8 @@ public void onDataChange(DataSnapshot dataSnapshot) {
128106
Artist artist = child.getValue(Artist.class);
129107
Log.i(TAG, String.format("%s: %s", child.getKey(), artist));
130108
artists.add(artist);
109+
artistViewModel.insert(artist);
131110
}
132-
filteredArtists.clear();
133-
filteredArtists.addAll(artists);
134-
updateList();
135111
}
136112

137113
@Override

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/fragments/PlaylistFragment.java

-5
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import com.catherine.materialdesignapp.activities.UIComponentsActivity;
2323
import com.catherine.materialdesignapp.adapters.PlaylistAdapter;
2424
import com.catherine.materialdesignapp.components.RecyclerViewItemTouchHelper;
25-
import com.catherine.materialdesignapp.jetpack.daos.PlaylistDao;
26-
import com.catherine.materialdesignapp.jetpack.databases.PlaylistRoomDatabase;
2725
import com.catherine.materialdesignapp.jetpack.entities.Playlist;
2826
import com.catherine.materialdesignapp.jetpack.view_models.PlaylistViewModel;
2927
import com.catherine.materialdesignapp.listeners.OnPlaylistItemClickListener;
@@ -54,7 +52,6 @@ public class PlaylistFragment extends ChildOfMusicFragment implements OnSearchVi
5452

5553
// JetPack
5654
private PlaylistViewModel playlistViewModel;
57-
private PlaylistDao playlistDao;
5855

5956
@Override
6057
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -160,8 +157,6 @@ public void onSwiped(Playlist swipedPlaylist) {
160157
listener = (UIComponentsListener) getActivity();
161158

162159
// JetPack
163-
PlaylistRoomDatabase db = PlaylistRoomDatabase.getDatabase(getActivity());
164-
playlistDao = db.playlistDao();
165160
playlistViewModel = ViewModelProviders.of(this).get(PlaylistViewModel.class);
166161
playlistViewModel.getAllPlaylists().observe(this, playlists -> {
167162
filteredPlaylists.clear();

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/jetpack/MapConverter.java renamed to AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/jetpack/SongMapConverter.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@
1111
import java.util.Iterator;
1212
import java.util.Map;
1313

14-
/**
15-
* Created by catherine_chen on 2019-05-29.
16-
* Trend Micro
17-
18-
*/
19-
public class MapConverter {
14+
public class SongMapConverter {
2015
@TypeConverter
2116
public static Map<String, Song> fromString(String value) {
2217
try {
@@ -42,6 +37,9 @@ public static Map<String, Song> fromString(String value) {
4237

4338
@TypeConverter
4439
public static String fromStringMap(Map<String, Song> value) {
40+
if (value == null || value.size() == 0) {
41+
return new JSONObject().toString();
42+
}
4543
try {
4644
Iterator<String> keys = value.keySet().iterator();
4745
JSONObject jo = new JSONObject(value);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.catherine.materialdesignapp.jetpack;
2+
3+
import androidx.room.TypeConverter;
4+
5+
import org.json.JSONArray;
6+
import org.json.JSONException;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class StringListConverter {
12+
@TypeConverter
13+
public static List<String> fromString(String value) {
14+
try {
15+
JSONArray ja = new JSONArray(value);
16+
List<String> songList = new ArrayList<>();
17+
for (int i = 0; i < ja.length(); i++) {
18+
songList.add(ja.getString(i));
19+
}
20+
return songList;
21+
} catch (JSONException e) {
22+
e.printStackTrace();
23+
}
24+
return null;
25+
}
26+
27+
@TypeConverter
28+
public static String fromStringList(List<String> value) {
29+
if (value == null || value.size() == 0) {
30+
return new JSONArray().toString();
31+
}
32+
JSONArray ja = new JSONArray();
33+
for (int i = 0; i < value.size(); i++) {
34+
ja.put(value.get(i));
35+
}
36+
return ja.toString();
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.catherine.materialdesignapp.jetpack.daos;
2+
3+
import androidx.lifecycle.LiveData;
4+
import androidx.room.Dao;
5+
import androidx.room.Insert;
6+
import androidx.room.OnConflictStrategy;
7+
import androidx.room.Query;
8+
9+
import com.catherine.materialdesignapp.jetpack.entities.Album;
10+
11+
import java.util.List;
12+
13+
@Dao
14+
public interface AlbumDao {
15+
@Insert(onConflict = OnConflictStrategy.REPLACE)
16+
void insert(Album album);
17+
18+
@Query("DELETE FROM album_table")
19+
void deleteAll();
20+
21+
@Query("SELECT * from album_table ORDER BY `title` ASC")
22+
LiveData<List<Album>> getAllAlbums();
23+
}

0 commit comments

Comments
 (0)