From ce08d77e00872404e121560c1183e177f2b23da1 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 17:49:52 +0700 Subject: [PATCH 01/39] Add realm --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index c2eea8e..9538f0d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' + classpath "io.realm:realm-gradle-plugin:3.7.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 093fb3de6c552675a5d8a565c9fe13221a21ec05 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 17:51:31 +0700 Subject: [PATCH 02/39] Add picasso, circleimageview, and fix conflict dependency --- app/build.gradle | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 97f9ac0..1a818a5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,18 +9,12 @@ buildscript { } apply plugin: 'com.android.application' apply plugin: 'io.fabric' +apply plugin: 'realm-android' repositories { maven { url 'https://maven.fabric.io/public' } } - -repositories { - maven { url 'https://maven.fabric.io/public' } -} - -apply plugin: 'io.fabric' - android { compileSdkVersion 26 buildToolsVersion '26.0.1' @@ -40,6 +34,14 @@ android { } productFlavors { } + + configurations.all { + resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' + } + + realm { + syncEnabled = true; + } } dependencies { @@ -64,7 +66,6 @@ dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') { transitive = true; } + compile 'de.hdodenhof:circleimageview:2.1.0' + compile "com.squareup.picasso:picasso:2.4.0" } - - - From 57abb675c1556aafbe490b5af44e3db1163ce426 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:07:01 +0700 Subject: [PATCH 03/39] Change to usercontroller when navigate --- .../devsummit/android/Activities/MainActivity.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/devsummit/android/Activities/MainActivity.java b/app/src/main/java/io/devsummit/android/Activities/MainActivity.java index 2d0b980..9f506ec 100644 --- a/app/src/main/java/io/devsummit/android/Activities/MainActivity.java +++ b/app/src/main/java/io/devsummit/android/Activities/MainActivity.java @@ -15,18 +15,19 @@ import android.widget.FrameLayout; import android.widget.ProgressBar; - -import io.devsummit.android.Helpers.ExitAppHelper; -import io.devsummit.android.R; +import io.devsummit.android.Controllers.UserFeedController; import io.devsummit.android.Controllers.UserTicketController; -import io.devsummit.android.Fragments.FeedFragment; +import io.devsummit.android.Helpers.ExitAppHelper; import io.devsummit.android.Helpers.UserAuthenticationHelper; +import io.devsummit.android.R; +import io.realm.Realm; public class MainActivity extends AppCompatActivity { private UserAuthenticationHelper authHelper; private UserTicketController userTicketController; private ProgressBar mProgressView; private BottomNavigationView navigation; + private UserFeedController userFeedController; @Override public void onBackPressed() { @@ -45,7 +46,7 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { String token = authHelper.getAccessToken(); switch (item.getItemId()) { case R.id.navigation_home: - frag = FeedFragment.newInstance(); + userFeedController.getUserFeed(token, MainActivity.this, 1); break; case R.id.tickets: userTicketController.getUserTickets(token, MainActivity.this); @@ -71,6 +72,8 @@ protected void onCreate(Bundle savedInstanceState) { navigation = (BottomNavigationView) findViewById(R.id.navigation); userTicketController = new UserTicketController(MainActivity.this); mContainer = (FrameLayout) findViewById(R.id.container); + userFeedController = new UserFeedController(MainActivity.this); + Realm.init(getApplicationContext()); } @Override @@ -78,6 +81,7 @@ protected void onResume() { super.onResume(); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); userTicketController.getUserTickets(authHelper.getAccessToken(), MainActivity.this); + //userFeedController.getUserFeed(authHelper.getAccessToken(), MainActivity.this); } /** From 3a53c6737bfcad04da8e42f2faa95e0eee92543c Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:07:24 +0700 Subject: [PATCH 04/39] Delete unnecessary --- .../main/java/io/devsummit/android/Activities/MainActivity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/io/devsummit/android/Activities/MainActivity.java b/app/src/main/java/io/devsummit/android/Activities/MainActivity.java index 9f506ec..1a03c49 100644 --- a/app/src/main/java/io/devsummit/android/Activities/MainActivity.java +++ b/app/src/main/java/io/devsummit/android/Activities/MainActivity.java @@ -81,7 +81,6 @@ protected void onResume() { super.onResume(); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); userTicketController.getUserTickets(authHelper.getAccessToken(), MainActivity.this); - //userFeedController.getUserFeed(authHelper.getAccessToken(), MainActivity.this); } /** From 8d3207f123cee93e8a9187663ca093b384f25a3f Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:08:09 +0700 Subject: [PATCH 05/39] Add user feed controller --- .../Controllers/UserFeedController.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Controllers/UserFeedController.java diff --git a/app/src/main/java/io/devsummit/android/Controllers/UserFeedController.java b/app/src/main/java/io/devsummit/android/Controllers/UserFeedController.java new file mode 100644 index 0000000..29a443f --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Controllers/UserFeedController.java @@ -0,0 +1,80 @@ +package io.devsummit.android.Controllers; + +import android.content.Context; +import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; + +import io.devsummit.android.Activities.MainActivity; +import io.devsummit.android.Fragments.FeedFragment; +import io.devsummit.android.Helpers.InetConnectionHelper; +import io.devsummit.android.Helpers.RealmHelper; +import io.devsummit.android.Models.UserFeedModel; +import io.devsummit.android.R; +import io.devsummit.android.Remote.APIService; +import io.devsummit.android.Remote.ApiUtils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * Created by wlisrausr on 04/10/17. + */ + +public class UserFeedController { + private APIService mAPIService; + private MainActivity mMainActivity; + private UserFeedModel userFeedResponse; + + public UserFeedController(MainActivity act) { + mMainActivity = act; + userFeedResponse = new UserFeedModel(); + mAPIService = ApiUtils.getAPIService(); + } + + public void getUserFeed(String token, final Context context, final int page) { + if (mMainActivity != null) { + mMainActivity.showProgress(true); + } + + if (InetConnectionHelper.isNetworkAvailable(context)) { + mAPIService.fetchUserFeed(token, page).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + userFeedResponse = response.body(); + + if (userFeedResponse.getMeta().getSuccess().booleanValue()) { + RealmHelper rh = new RealmHelper(); + + for (int i = 0; i < userFeedResponse.getData().size(); i++) { + rh.receiveData(userFeedResponse.getData().get(i)); + } + + callFragment(context, page); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + callFragment(context, page); + } + }); + } else { + callFragment(context, page); + } + } + + private void callFragment(Context context, int page) { + if (page < 2) { + AppCompatActivity activity = (AppCompatActivity) context; + Fragment frag = FeedFragment.newInstance(); + android.support.v4.app.FragmentTransaction ft + = activity.getSupportFragmentManager().beginTransaction(); + ft.add(R.id.container, frag, frag.getTag()); + ft.commit(); + + if (mMainActivity != null) { + mMainActivity.showProgress(false); + } + } + } +} From 4ec0ea0b4af7d2030df7a4e1415862f2419de405 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:09:23 +0700 Subject: [PATCH 06/39] Handle recycler view --- .../android/Fragments/FeedFragment.java | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/devsummit/android/Fragments/FeedFragment.java b/app/src/main/java/io/devsummit/android/Fragments/FeedFragment.java index 0585a3a..29a0bbf 100644 --- a/app/src/main/java/io/devsummit/android/Fragments/FeedFragment.java +++ b/app/src/main/java/io/devsummit/android/Fragments/FeedFragment.java @@ -3,45 +3,93 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import java.util.List; + +import io.devsummit.android.Controllers.UserFeedController; +import io.devsummit.android.Helpers.EndlessRecyclerViewScrollListener; +import io.devsummit.android.Helpers.UserAuthenticationHelper; +import io.devsummit.android.Models.userfeed.FeedData; import io.devsummit.android.R; +import io.devsummit.android.ViewAdapters.FeedListViewAdapter; +import io.realm.Realm; +import io.realm.Sort; /** * Created by ganesh on 27/09/17. */ public class FeedFragment extends Fragment { - private static final String ARG_TEXT = "arg_text"; - private static final String ARG_COLOR = "arg_color"; - + private static final String USER_FEED = "user_feed_model"; private View mContent; + private UserAuthenticationHelper authHelper; + private RecyclerView mRecyclerView; + private LinearLayoutManager mLayoutManager; + private RecyclerView.Adapter mAdapter; + private EndlessRecyclerViewScrollListener scrollListener; + private UserFeedController userFeedController; + private List feedData; public static Fragment newInstance() { Fragment frag = new FeedFragment(); - Bundle args = new Bundle(); - frag.setArguments(args); return frag; } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + Realm realm = Realm.getDefaultInstance(); + feedData = realm.where(FeedData.class).findAllSorted("createdAt", Sort.DESCENDING); + // Inflate the layout for this fragment - return inflater.inflate(R.layout.feed_fragment, container, false); + View layout = inflater.inflate(R.layout.feed_fragment, container, false); + + authHelper = new UserAuthenticationHelper(getActivity()); + userFeedController = new UserFeedController(null); + + if (feedData.size() > 0) { + mRecyclerView = (RecyclerView) layout.findViewById(R.id.feeds_recycler_view); + + // use a linear layout manager + mLayoutManager = new LinearLayoutManager(getContext()); + mRecyclerView.setLayoutManager(mLayoutManager); + + // specify an adapter + mAdapter = new FeedListViewAdapter(getContext(), feedData); + mRecyclerView.setAdapter(mAdapter); + + scrollListener = new EndlessRecyclerViewScrollListener(mLayoutManager) { + @Override + public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { + loadNextDataFromApi(page); + } + }; + + mRecyclerView.addOnScrollListener(scrollListener); + } + + return layout; + } + + public void loadNextDataFromApi(int offset) { + // Send an API request to retrieve appropriate paginated data + String token = authHelper.getAccessToken(); + + userFeedController.getUserFeed(token, getContext(), offset + 1); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - // initialize views mContent = view.findViewById(R.id.feed_content); - } @Override From b6536eecb5210e926fdc1b3e333845a5166b9f58 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:10:08 +0700 Subject: [PATCH 07/39] Add scroll listener to feed --- .../EndlessRecyclerViewScrollListener.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Helpers/EndlessRecyclerViewScrollListener.java diff --git a/app/src/main/java/io/devsummit/android/Helpers/EndlessRecyclerViewScrollListener.java b/app/src/main/java/io/devsummit/android/Helpers/EndlessRecyclerViewScrollListener.java new file mode 100644 index 0000000..d67e05f --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Helpers/EndlessRecyclerViewScrollListener.java @@ -0,0 +1,109 @@ +package io.devsummit.android.Helpers; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; + +/** + * Created by wlisrausr on 09/10/17. + */ + +public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener { + // The minimum amount of items to have below your current scroll position + // before loading more. + private int visibleThreshold = 5; + // The current offset index of data you have loaded + private int currentPage = 0; + // The total number of items in the dataset after the last load + private int previousTotalItemCount = 0; + // True if we are still waiting for the last set of data to load. + private boolean loading = true; + // Sets the starting page index + private int startingPageIndex = 0; + + RecyclerView.LayoutManager mLayoutManager; + + public EndlessRecyclerViewScrollListener(LinearLayoutManager layoutManager) { + this.mLayoutManager = layoutManager; + } + + public EndlessRecyclerViewScrollListener(GridLayoutManager layoutManager) { + this.mLayoutManager = layoutManager; + visibleThreshold = visibleThreshold * layoutManager.getSpanCount(); + } + + public EndlessRecyclerViewScrollListener(StaggeredGridLayoutManager layoutManager) { + this.mLayoutManager = layoutManager; + visibleThreshold = visibleThreshold * layoutManager.getSpanCount(); + } + + public int getLastVisibleItem(int[] lastVisibleItemPositions) { + int maxSize = 0; + for (int i = 0; i < lastVisibleItemPositions.length; i++) { + if (i == 0) { + maxSize = lastVisibleItemPositions[i]; + } + else if (lastVisibleItemPositions[i] > maxSize) { + maxSize = lastVisibleItemPositions[i]; + } + } + return maxSize; + } + + // This happens many times a second during a scroll, so be wary of the code you place here. + // We are given a few useful parameters to help us work out if we need to load some more data, + // but first we check if we are waiting for the previous load to finish. + @Override + public void onScrolled(RecyclerView view, int dx, int dy) { + int lastVisibleItemPosition = 0; + int totalItemCount = mLayoutManager.getItemCount(); + + if (mLayoutManager instanceof StaggeredGridLayoutManager) { + int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) mLayoutManager).findLastVisibleItemPositions(null); + // get maximum element within the list + lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions); + } else if (mLayoutManager instanceof GridLayoutManager) { + lastVisibleItemPosition = ((GridLayoutManager) mLayoutManager).findLastVisibleItemPosition(); + } else if (mLayoutManager instanceof LinearLayoutManager) { + lastVisibleItemPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition(); + } + + // If the total item count is zero and the previous isn't, assume the + // list is invalidated and should be reset back to initial state + if (totalItemCount < previousTotalItemCount) { + this.currentPage = this.startingPageIndex; + this.previousTotalItemCount = totalItemCount; + if (totalItemCount == 0) { + this.loading = true; + } + } + // If it’s still loading, we check to see if the dataset count has + // changed, if so we conclude it has finished loading and update the current page + // number and total item count. + if (loading && (totalItemCount > previousTotalItemCount)) { + loading = false; + previousTotalItemCount = totalItemCount; + } + + // If it isn’t currently loading, we check to see if we have breached + // the visibleThreshold and need to reload more data. + // If we do need to reload some more data, we execute onLoadMore to fetch the data. + // threshold should reflect how many total columns there are too + if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) { + currentPage++; + onLoadMore(currentPage, totalItemCount, view); + loading = true; + } + } + + // Call this method whenever performing new searches + public void resetState() { + this.currentPage = this.startingPageIndex; + this.previousTotalItemCount = 0; + this.loading = true; + } + + // Defines the process for actually loading more data based on page + public abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view); +} From aada49cdf72b447ca12d94b58568b83ef36e93de Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:10:29 +0700 Subject: [PATCH 08/39] Add inet connection helper --- .../android/Helpers/InetConnectionHelper.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Helpers/InetConnectionHelper.java diff --git a/app/src/main/java/io/devsummit/android/Helpers/InetConnectionHelper.java b/app/src/main/java/io/devsummit/android/Helpers/InetConnectionHelper.java new file mode 100644 index 0000000..2b9373a --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Helpers/InetConnectionHelper.java @@ -0,0 +1,19 @@ +package io.devsummit.android.Helpers; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +/** + * Created by wlisrausr on 07/10/17. + */ + +public class InetConnectionHelper { + public static boolean isNetworkAvailable(Context context) { + ConnectivityManager connectivityManager + = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); + + return activeNetworkInfo != null && activeNetworkInfo.isConnected(); + } +} From 2392a847516344dd5fffeaae01ca4ff37740d0de Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:10:47 +0700 Subject: [PATCH 09/39] Add realm helper --- .../android/Helpers/RealmHelper.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Helpers/RealmHelper.java diff --git a/app/src/main/java/io/devsummit/android/Helpers/RealmHelper.java b/app/src/main/java/io/devsummit/android/Helpers/RealmHelper.java new file mode 100644 index 0000000..0739863 --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Helpers/RealmHelper.java @@ -0,0 +1,24 @@ +package io.devsummit.android.Helpers; + +import io.realm.Realm; +import io.realm.RealmModel; + +/** + * Created by ganesh on 06/10/17. + */ + +public class RealmHelper { + public void receiveData(Object responseData) { + Realm realm = Realm.getDefaultInstance(); + + try { + realm.beginTransaction(); + realm.copyToRealmOrUpdate((RealmModel) responseData); + realm.commitTransaction(); + realm.close(); + } catch (Exception e) { + e.printStackTrace(); + realm.cancelTransaction(); + } + } +} From 73a607d5246ed7b1b7cf60ffa5bbeed5a1396bae Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:11:19 +0700 Subject: [PATCH 10/39] Add text helper --- .../devsummit/android/Helpers/TextHelper.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Helpers/TextHelper.java diff --git a/app/src/main/java/io/devsummit/android/Helpers/TextHelper.java b/app/src/main/java/io/devsummit/android/Helpers/TextHelper.java new file mode 100644 index 0000000..b0817ae --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Helpers/TextHelper.java @@ -0,0 +1,38 @@ +package io.devsummit.android.Helpers; + +import java.text.NumberFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by wlisrausr on 04/10/17. + */ + +public class TextHelper { + public static String capitalizeFirstLetter(String input) { + return input.substring(0, 1).toUpperCase() + input.substring(1); + } + + public static String toRupiahFormat(Number nominal) { + NumberFormat format = NumberFormat.getInstance(); + + return "Rp " + format.format(nominal); + } + + public static String dateFormat(String inputDate) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + Date formattedDate = null; + + try { + formattedDate = format.parse(inputDate); + } catch (ParseException e) { + e.printStackTrace(); + } + + format = new SimpleDateFormat("MMM dd, yyyy (hh:mm)"); + String outputDate = format.format(formattedDate); + + return outputDate; + } +} From 3154ba2242e1dae1647166c835984e68135adc52 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:11:36 +0700 Subject: [PATCH 11/39] Add user feed model --- .../android/Models/UserFeedModel.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Models/UserFeedModel.java diff --git a/app/src/main/java/io/devsummit/android/Models/UserFeedModel.java b/app/src/main/java/io/devsummit/android/Models/UserFeedModel.java new file mode 100644 index 0000000..b284721 --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Models/UserFeedModel.java @@ -0,0 +1,63 @@ +package io.devsummit.android.Models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.List; + +import io.devsummit.android.Models.basemodel.Included; +import io.devsummit.android.Models.basemodel.Meta; +import io.devsummit.android.Models.userfeed.FeedData; +import io.devsummit.android.Models.userfeed.Links; + +/** + * Created by wlisrausr on 04/10/17. + */ + +public class UserFeedModel implements Serializable { + @SerializedName("data") + @Expose + private List data = null; + @SerializedName("included") + @Expose + private Included included; + @SerializedName("links") + @Expose + private Links links; + @SerializedName("meta") + @Expose + private Meta meta; + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public Included getIncluded() { + return included; + } + + public void setIncluded(Included included) { + this.included = included; + } + + public Links getLinks() { + return links; + } + + public void setLinks(Links links) { + this.links = links; + } + + public Meta getMeta() { + return meta; + } + + public void setMeta(Meta meta) { + this.meta = meta; + } +} From 263f93ab9c726eefcf451b1fd404baba67459357 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:11:52 +0700 Subject: [PATCH 12/39] Add feed data model --- .../android/Models/userfeed/FeedData.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Models/userfeed/FeedData.java diff --git a/app/src/main/java/io/devsummit/android/Models/userfeed/FeedData.java b/app/src/main/java/io/devsummit/android/Models/userfeed/FeedData.java new file mode 100644 index 0000000..83dca5e --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Models/userfeed/FeedData.java @@ -0,0 +1,124 @@ +package io.devsummit.android.Models.userfeed; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +import io.realm.RealmObject; +import io.realm.annotations.PrimaryKey; + +public class FeedData extends RealmObject implements Serializable { + + @SerializedName("attachment") + @Expose + private String attachment; + @SerializedName("created_at") + @Expose + private String createdAt; + @SerializedName("id") + @Expose + @PrimaryKey + private Integer id; + @SerializedName("message") + @Expose + private String message; + @SerializedName("redirect_url") + @Expose + private String redirectUrl; + @SerializedName("sponsor_id") + @Expose + private Integer sponsorId; + @SerializedName("type") + @Expose + private String type; + @SerializedName("updated_at") + @Expose + private String updatedAt; + @SerializedName("user") + @Expose + private User user; + @SerializedName("user_id") + @Expose + private Integer userId; + + public String getAttachment() { + return attachment; + } + + public void setAttachment(String attachment) { + this.attachment = attachment; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + public Integer getSponsorId() { + return sponsorId; + } + + public void setSponsorId(Integer sponsorId) { + this.sponsorId = sponsorId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } +} \ No newline at end of file From a64f6ff8c9406e892bb26a3308b01a4a28c7cd39 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:12:07 +0700 Subject: [PATCH 13/39] Add links user feed model --- .../android/Models/userfeed/Links.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Models/userfeed/Links.java diff --git a/app/src/main/java/io/devsummit/android/Models/userfeed/Links.java b/app/src/main/java/io/devsummit/android/Models/userfeed/Links.java new file mode 100644 index 0000000..a8a8b15 --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Models/userfeed/Links.java @@ -0,0 +1,52 @@ +package io.devsummit.android.Models.userfeed; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class Links { + + @SerializedName("curr") + @Expose + private String curr; + @SerializedName("next") + @Expose + private Object next; + @SerializedName("prev") + @Expose + private String prev; + @SerializedName("total_items") + @Expose + private Integer totalItems; + + public String getCurr() { + return curr; + } + + public void setCurr(String curr) { + this.curr = curr; + } + + public Object getNext() { + return next; + } + + public void setNext(Object next) { + this.next = next; + } + + public String getPrev() { + return prev; + } + + public void setPrev(String prev) { + this.prev = prev; + } + + public Integer getTotalItems() { + return totalItems; + } + + public void setTotalItems(Integer totalItems) { + this.totalItems = totalItems; + } +} \ No newline at end of file From c387237148332337b24813b0c9b5b37fe6b4dc87 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:12:20 +0700 Subject: [PATCH 14/39] Add photo user feed model --- .../android/Models/userfeed/Photo.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Models/userfeed/Photo.java diff --git a/app/src/main/java/io/devsummit/android/Models/userfeed/Photo.java b/app/src/main/java/io/devsummit/android/Models/userfeed/Photo.java new file mode 100644 index 0000000..76f6717 --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Models/userfeed/Photo.java @@ -0,0 +1,69 @@ +package io.devsummit.android.Models.userfeed; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +import io.realm.RealmObject; +import io.realm.annotations.PrimaryKey; + +public class Photo extends RealmObject implements Serializable { + + @SerializedName("created_at") + @Expose + private String createdAt; + @SerializedName("id") + @Expose + @PrimaryKey + private Integer id; + @SerializedName("updated_at") + @Expose + private String updatedAt; + @SerializedName("url") + @Expose + private String url; + @SerializedName("user_id") + @Expose + private Integer userId; + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } +} \ No newline at end of file From db66829e125fb9bc03dbb3039ab33890c28f1982 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:13:09 +0700 Subject: [PATCH 15/39] Add user feed model --- .../android/Models/userfeed/User.java | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/Models/userfeed/User.java diff --git a/app/src/main/java/io/devsummit/android/Models/userfeed/User.java b/app/src/main/java/io/devsummit/android/Models/userfeed/User.java new file mode 100644 index 0000000..c15bb89 --- /dev/null +++ b/app/src/main/java/io/devsummit/android/Models/userfeed/User.java @@ -0,0 +1,159 @@ +package io.devsummit.android.Models.userfeed; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +import io.realm.RealmList; +import io.realm.RealmObject; +import io.realm.annotations.PrimaryKey; + +public class User extends RealmObject implements Serializable { + + @SerializedName("created_at") + @Expose + private String createdAt; + @SerializedName("email") + @Expose + private String email; + @SerializedName("fcmtoken") + @Expose + private String fcmtoken; + @SerializedName("first_name") + @Expose + private String firstName; + @SerializedName("id") + @Expose + @PrimaryKey + private Integer id; + @SerializedName("last_name") + @Expose + private String lastName; + @SerializedName("photos") + @Expose + private RealmList photos = null; + @SerializedName("points") + @Expose + private Integer points; + @SerializedName("referer") + @Expose + private String referer; + @SerializedName("role_id") + @Expose + private Integer roleId; + @SerializedName("social_id") + @Expose + private String socialId; + @SerializedName("updated_at") + @Expose + private String updatedAt; + @SerializedName("username") + @Expose + private String username; + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getFcmtoken() { + return fcmtoken; + } + + public void setFcmtoken(String fcmtoken) { + this.fcmtoken = fcmtoken; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public RealmList getPhotos() { + return photos; + } + + public void setPhotos(RealmList photos) { + this.photos = photos; + } + + public Integer getPoints() { + return points; + } + + public void setPoints(Integer points) { + this.points = points; + } + + public String getReferer() { + return referer; + } + + public void setReferer(String referer) { + this.referer = referer; + } + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public String getSocialId() { + return socialId; + } + + public void setSocialId(String socialId) { + this.socialId = socialId; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + +} \ No newline at end of file From c629d779618ac77e9a096a0f43f2d064963d2011 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:13:37 +0700 Subject: [PATCH 16/39] Add feed endpoint --- .../main/java/io/devsummit/android/Remote/APIService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/io/devsummit/android/Remote/APIService.java b/app/src/main/java/io/devsummit/android/Remote/APIService.java index 2829e1e..3060d93 100644 --- a/app/src/main/java/io/devsummit/android/Remote/APIService.java +++ b/app/src/main/java/io/devsummit/android/Remote/APIService.java @@ -4,6 +4,7 @@ import io.devsummit.android.Models.NotificationModel; import io.devsummit.android.Models.OrderedTicketModel; import io.devsummit.android.Models.RegisterModel; +import io.devsummit.android.Models.UserFeedModel; import io.devsummit.android.Models.UserTicketModel; import io.devsummit.android.Models.authmodel.RefreshTokenModel; import io.devsummit.android.Models.login.Credentials; @@ -16,6 +17,7 @@ import retrofit2.http.Header; import retrofit2.http.Headers; import retrofit2.http.POST; +import retrofit2.http.Query; import retrofit2.http.Url; /** @@ -49,6 +51,9 @@ public interface APIService { @Headers("Content-Type: application/json") Call fetchNotification(@Header("Authorization") String token, @Url String url); + @GET("api/v1/feeds") + Call fetchUserFeed(@Header("Authorization") String token, @Query("page") int page); + @POST("auth/refreshtoken") @Headers("Content-Type:application/json") Call refreshToken(@Body String refresh_token); From 18650b744e98e67e02aee3c08658b700e71c9143 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:13:55 +0700 Subject: [PATCH 17/39] Add feed list view adapter --- .../ViewAdapters/FeedListViewAdapter.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 app/src/main/java/io/devsummit/android/ViewAdapters/FeedListViewAdapter.java diff --git a/app/src/main/java/io/devsummit/android/ViewAdapters/FeedListViewAdapter.java b/app/src/main/java/io/devsummit/android/ViewAdapters/FeedListViewAdapter.java new file mode 100644 index 0000000..c2e9588 --- /dev/null +++ b/app/src/main/java/io/devsummit/android/ViewAdapters/FeedListViewAdapter.java @@ -0,0 +1,105 @@ +package io.devsummit.android.ViewAdapters; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import java.util.List; + +import de.hdodenhof.circleimageview.CircleImageView; +import io.devsummit.android.Helpers.TextHelper; +import io.devsummit.android.Models.userfeed.FeedData; +import io.devsummit.android.R; + +/** + * Created by wlisrausr on 04/10/17. + */ + +public class FeedListViewAdapter extends RecyclerView.Adapter { + private List mDataset; + private Context context; + + // Provide a suitable constructor (depends on the kind of dataset) + public FeedListViewAdapter(Context context, List myDataset) { + mDataset = myDataset; + this.context = context; + } + + @Override + public FeedListViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + // TODO: inflate your view and create viewholder, most likely looks like this though + View v = LayoutInflater.from(viewGroup.getContext()).inflate( + R.layout.user_feed_row, + viewGroup, + false); + + FeedListViewHolder vh = new FeedListViewHolder(v); + return vh; + } + + @Override + public void onBindViewHolder(final FeedListViewHolder viewHolder, int i) { + // TODO: all your bind operations + viewHolder.firstName.setText(TextHelper.capitalizeFirstLetter( + mDataset.get(i).getUser().getFirstName().toString() + )); + viewHolder.lastName.setText(TextHelper.capitalizeFirstLetter( + mDataset.get(i).getUser().getLastName().toString() + )); + viewHolder.createdAt.setText(TextHelper.dateFormat(mDataset.get(i).getCreatedAt().toString())); + viewHolder.feedMessage.setText(mDataset.get(i).getMessage().toString()); + + Object attachmentUrl = mDataset.get(i).getAttachment(); + List imgProfileUrl = mDataset.get(i).getUser().getPhotos(); + + viewHolder.feedAttachment.setVisibility(View.GONE); + + if (attachmentUrl != null) { + viewHolder.feedAttachment.setVisibility(View.VISIBLE); + + Picasso.with(context) + .load(mDataset.get(i).getAttachment().toString()) + .into(viewHolder.feedAttachment); + } + + if (imgProfileUrl.size() > 0) { + Picasso.with(context) + .load(mDataset.get(i).getUser().getPhotos().get(0).getUrl().toString()) + .placeholder(R.drawable.empty_profile_grey) + .into(viewHolder.imageProfile); + } + } + + @Override + public int getItemCount() { + // TODO: return total item count of your views + return mDataset.size(); + } + + public static class FeedListViewHolder extends RecyclerView.ViewHolder { + // TODO: whatever views you need to bind + public TextView feedMessage; + public TextView firstName; + public TextView lastName; + public TextView createdAt; + public ImageView feedAttachment; + public CircleImageView imageProfile; + + public FeedListViewHolder(View v) { + super(v); // done this way instead of view tagging + + feedMessage = (TextView) v.findViewById(R.id.feedMessage); + firstName = (TextView) v.findViewById(R.id.firstNameText); + lastName = (TextView) v.findViewById(R.id.lastNameText); + createdAt = (TextView) v.findViewById(R.id.createdAtText); + feedAttachment = (ImageView) v.findViewById(R.id.feedAttachment); + imageProfile = (CircleImageView) v.findViewById(R.id.imageProfile); + } + } +} From 6b189cf32854a839588f3ea0263ab3dfac8d897d Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:16:06 +0700 Subject: [PATCH 18/39] Move method to helper --- .../OrderedTicketListViewAdapter.java | 31 ++----------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/io/devsummit/android/ViewAdapters/OrderedTicketListViewAdapter.java b/app/src/main/java/io/devsummit/android/ViewAdapters/OrderedTicketListViewAdapter.java index 11dd0b0..262b50d 100644 --- a/app/src/main/java/io/devsummit/android/ViewAdapters/OrderedTicketListViewAdapter.java +++ b/app/src/main/java/io/devsummit/android/ViewAdapters/OrderedTicketListViewAdapter.java @@ -7,13 +7,10 @@ import android.widget.LinearLayout; import android.widget.TextView; -import java.text.NumberFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.List; import io.devsummit.android.Helpers.OrderStatusHelper; +import io.devsummit.android.Helpers.TextHelper; import io.devsummit.android.Models.orderedtickets.Datum; import io.devsummit.android.R; @@ -30,28 +27,6 @@ public OrderedTicketListViewAdapter(List myDataset) { mDataset = myDataset; } - public String toRupiahFormat(Number nominal) { - NumberFormat format = NumberFormat.getInstance(); - - return "Rp " + format.format(nominal); - } - - public String dateFormat(String inputDate) { - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - Date formattedDate = null; - - try { - formattedDate = format.parse(inputDate); - } catch (ParseException e) { - e.printStackTrace(); - } - - format = new SimpleDateFormat("MMM dd, yyyy (hh:mm)"); - String outputDate = format.format(formattedDate); - - return outputDate; - } - @Override public OrderedTicketListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // TODO: inflate your view and create viewholder, most likely looks like this though @@ -75,8 +50,8 @@ public void onBindViewHolder(OrderedTicketListViewHolder holder, int position) { // TODO: all your bind operations holder.orderId.setText(mDataset.get(position).getId().toString()); - holder.orderDate.setText(dateFormat(mDataset.get(position).getCreatedAt().toString())); - holder.orderAmount.setText(toRupiahFormat(mDataset.get(position).getAmount())); + holder.orderDate.setText(TextHelper.dateFormat(mDataset.get(position).getCreatedAt().toString())); + holder.orderAmount.setText(TextHelper.toRupiahFormat(mDataset.get(position).getAmount())); holder.orderStatus.setText(orderStatus); } From e0cb840a96da6aa50aa9da3a7f7c2ec3a67cd289 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:16:28 +0700 Subject: [PATCH 19/39] Add user feed default image --- app/src/main/res/drawable/empty_profile_grey.jpg | Bin 0 -> 3444 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/main/res/drawable/empty_profile_grey.jpg diff --git a/app/src/main/res/drawable/empty_profile_grey.jpg b/app/src/main/res/drawable/empty_profile_grey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8830fbc0cef565030342e362dc0d348e9d50603a GIT binary patch literal 3444 zcmb_ec|6ox8$Yv{nQJUF_AvHjHxo&{%2>;m!K4+F8&Psei%7;&B*~g3E<;>e2qjC) z$d)x(5~UO+k;oG2UhnyhmiP1ieV^ZNp7Z@a=bYzx=6ue1&TskI@(>_dTUuEH6bb+o ze8BQ^UQ*B`Qpkke8H_k)cp1 zWC;Z&d08cCS&HoPLqH^;hTwxDgXMZ413jZLNQ|F?K)@TqNW=Q)9&HQBYFWWfTqaDBSbQZ4aiNIYc&px}tW^|QO+ z^s`bBqJs4SATJ`WQ4ct?0MJatkRe*Wbin6=_yCd;bU@H&AyA?s9pE&_rVtF${VTyC zUal}`|86$_Knc$-cGydM zqjbK&3^46tuot9+yodTECkATY_Xbd7+>Eb4y-9!#33+h>>O1970cR$htIT->Ax3uA z4*<7T#7tI$?mZ^y5aQH0Y(QLOK?u�oeNf2m%EHo^XN0JPW~^8gR9BkQD&ZRXN}{ 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 LpJwkvm;3(<9M_Eg literal 0 HcmV?d00001 From 6db71567a2dfed0d9c38404ad4fe2a2baf087184 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:18:05 +0700 Subject: [PATCH 20/39] Add needed strings --- app/src/main/res/values/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f292df..4ec3156 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,7 +40,8 @@ Order List MainActivity - Home + Feed + News Feed Schedule Setting Tickets From 781c11794c698b3dbeeeb59811821f93689c7c78 Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:18:29 +0700 Subject: [PATCH 21/39] Change title --- app/src/main/res/menu/navigation.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation.xml index fd5417e..ddd7128 100644 --- a/app/src/main/res/menu/navigation.xml +++ b/app/src/main/res/menu/navigation.xml @@ -9,7 +9,7 @@ + android:title="@string/title_feed" /> From 68b2022f1af4de30fca3eb45e0e74f7dd4eeb18c Mon Sep 17 00:00:00 2001 From: Wanda Ichsanul Isra Date: Mon, 9 Oct 2017 18:18:58 +0700 Subject: [PATCH 22/39] Add feed row style --- app/src/main/res/layout/user_feed_row.xml | 130 ++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 app/src/main/res/layout/user_feed_row.xml diff --git a/app/src/main/res/layout/user_feed_row.xml b/app/src/main/res/layout/user_feed_row.xml new file mode 100644 index 0000000..d13d316 --- /dev/null +++ b/app/src/main/res/layout/user_feed_row.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +