diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 551d2b5d..978dc3dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -44,8 +44,12 @@ android:parentActivityName=".MainActivity" /> + android:parentActivityName=".MainActivity" + android:theme="@style/AppTheme.NoActionBarWithTranslucentStatusBar" /> + \ No newline at end of file diff --git a/app/src/main/java/User/UserData.java b/app/src/main/java/User/UserData.java new file mode 100644 index 00000000..2846cfb6 --- /dev/null +++ b/app/src/main/java/User/UserData.java @@ -0,0 +1,4 @@ +package User; + +public class UserData { +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostPaginationScrollListener.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostPaginationScrollListener.java index 39d26a5d..a6cbf578 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostPaginationScrollListener.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostPaginationScrollListener.java @@ -27,7 +27,6 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener { private PostRecyclerViewAdapter mAdapter; private ArrayList mPostData; private PaginationSynchronizer mPaginationSynchronizer; - private PaginationRetryNotifier mPaginationRetryNotifier; private LastItemSynchronizer mLastItemSynchronizer; private String mSubredditName; @@ -54,17 +53,17 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener { this.loadSuccess = loadSuccess; this.locale = locale; - mPaginationRetryNotifier = new PaginationRetryNotifier() { + PaginationRetryNotifier paginationRetryNotifier = new PaginationRetryNotifier() { @Override public void retry() { - if(isBestPost) { + if (isBestPost) { fetchBestPost(1); } else { fetchPost(subredditName, 1); } } }; - mPaginationSynchronizer.setPaginationRetryNotifier(mPaginationRetryNotifier); + mPaginationSynchronizer.setPaginationRetryNotifier(paginationRetryNotifier); mLastItemSynchronizer = mPaginationSynchronizer.getLastItemSynchronizer(); } } @@ -117,8 +116,8 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener { clipboard.setPrimaryClip(clip); ParsePost.parsePost(response.body(), mPostData, locale, new ParsePost.ParsePostListener() { @Override - public void onParsePostSuccess(ArrayList bestPostData, String lastItem) { - mAdapter.notifyDataSetChanged(); + public void onParsePostSuccess(ArrayList postData, String lastItem) { + mAdapter.notifyItemRangeInserted(mPostData.size(), postData.size()); mLastItem = lastItem; mLastItemSynchronizer.lastItemChanged(mLastItem); @@ -188,8 +187,8 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener { clipboard.setPrimaryClip(clip); ParsePost.parsePost(response.body(), mPostData, locale, new ParsePost.ParsePostListener() { @Override - public void onParsePostSuccess(ArrayList bestPostData, String lastItem) { - mAdapter.notifyDataSetChanged(); + public void onParsePostSuccess(ArrayList postData, String lastItem) { + mAdapter.notifyItemRangeInserted(mPostData.size(), postData.size()); mLastItem = lastItem; mLastItemSynchronizer.lastItemChanged(mLastItem); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index f2e5d200..3292852b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -136,13 +136,36 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter getPost(@Path("subredditName") String subredditName, @Query("after") String lastItem); + + @GET("user/{username}/about.json/raw_json=1") + Call getUserData(@Path("username") String username); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDao.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDao.java index 8fb1593c..2e1b0bb7 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDao.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDao.java @@ -15,7 +15,10 @@ public interface SubredditDao { void deleteAllSubreddits(); @Query("SELECT * from subreddits WHERE id = :id") - LiveData getSubredditLiveData(String id); + LiveData getSubredditLiveDataById(String id); + + @Query("SELECT * from subreddits WHERE name = :namePrefixed") + LiveData getSubredditLiveDataByNamePrefixed(String namePrefixed); @Query("SELECT * from subreddits WHERE name = :namePrefixed") SubredditData getSubredditData(String namePrefixed); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditRepository.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditRepository.java index a104fed7..deb68806 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditRepository.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditRepository.java @@ -8,10 +8,14 @@ public class SubredditRepository { private SubredditDao mSubredditDao; private LiveData mSubredditLiveData; - SubredditRepository(Application application, String id) { + SubredditRepository(Application application, String value, boolean isId) { SubredditRoomDatabase db = SubredditRoomDatabase.getDatabase(application); mSubredditDao = db.subredditDao(); - mSubredditLiveData = mSubredditDao.getSubredditLiveData(id); + if(isId) { + mSubredditLiveData = mSubredditDao.getSubredditLiveDataById(value); + } else { + mSubredditLiveData = mSubredditDao.getSubredditLiveDataByNamePrefixed(value); + } } LiveData getSubredditLiveData() { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditViewModel.java index 6d9e20fc..ee636b43 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditViewModel.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditViewModel.java @@ -11,9 +11,9 @@ public class SubredditViewModel extends AndroidViewModel { private SubredditRepository mSubredditRepository; private LiveData mSubredditLiveData; - SubredditViewModel(Application application, String id) { + SubredditViewModel(Application application, String id, boolean isId) { super(application); - mSubredditRepository = new SubredditRepository(application, id); + mSubredditRepository = new SubredditRepository(application, id, isId); mSubredditLiveData = mSubredditRepository.getSubredditLiveData(); } @@ -30,17 +30,19 @@ public class SubredditViewModel extends AndroidViewModel { @NonNull private final Application mApplication; - private final String id; + private final String value; + private final boolean isId; - public Factory(@NonNull Application application, String id) { + public Factory(@NonNull Application application, String value, boolean isId) { mApplication = application; - this.id = id; + this.value = value; + this.isId = isId; } @Override public T create(Class modelClass) { //noinspection unchecked - return (T) new SubredditViewModel(mApplication, id); + return (T) new SubredditViewModel(mApplication, value, isId); } } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditRecyclerViewAdapter.java index ebc316e5..72e860be 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditRecyclerViewAdapter.java @@ -39,7 +39,8 @@ class SubscribedSubredditRecyclerViewAdapter extends RecyclerView.Adapter 0) { + statusBarHeight = getResources().getDimensionPixelSize(resourceId); + } + + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); + params.topMargin = statusBarHeight; + final String subredditName = getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME_KEY); final String title = "r/" + subredditName; - setTitle(title); - final CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.collapsing_toolbar_layout_view_subreddit_detail_activity); - AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout_view_subreddit_detail_activity); + final AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout_view_subreddit_detail_activity); + appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - boolean isShow = true; + int previousVerticalOffset = 0; int scrollRange = -1; @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (scrollRange == -1) { + /*collapsingToolbarLayout.setExpandedTitleColor(Color.BLACK); + collapsingToolbarLayout.setCollapsedTitleTextColor(Color.BLACK);*/ + if(scrollRange == -1) { scrollRange = appBarLayout.getTotalScrollRange(); - } - if (scrollRange + verticalOffset == 0) { - collapsingToolbarLayout.setTitle(title); - isShow = true; - } else if(isShow) { - collapsingToolbarLayout.setTitle(" ");//carefull there should a space between double quote otherwise it wont work - isShow = false; + } else { + if(verticalOffset < previousVerticalOffset) { + //Scroll down + if(scrollRange - Math.abs(verticalOffset) <= toolbar.getHeight()) { + collapsingToolbarLayout.setTitle(title); + } + } else { + //Scroll up + if(scrollRange - Math.abs(verticalOffset) > toolbar.getHeight()) { + collapsingToolbarLayout.setTitle(" ");//carefull there should a space between double quote otherwise it wont work + } + } + previousVerticalOffset = verticalOffset; } } }); @@ -74,8 +93,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { final TextView descriptionTextView = findViewById(R.id.description_text_view_view_subreddit_detail_activity); final RequestManager glide = Glide.with(ViewSubredditDetailActivity.this); - String id = getIntent().getExtras().getString(EXTRA_SUBREDDIT_ID_KEY); - SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), id); + String value = getIntent().getExtras().getString(EXTRA_SUBREDDIT_VALUE_KEY); + boolean queryById = getIntent().getExtras().getBoolean(EXTRA_QUERY_BY_ID_KEY); + SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), value, queryById); mSubredditViewModel = ViewModelProviders.of(this, factory).get(SubredditViewModel.class); mSubredditViewModel.getSubredditLiveData().observe(this, new Observer() { @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java new file mode 100644 index 00000000..0ec59030 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java @@ -0,0 +1,20 @@ +package ml.docilealligator.infinityforreddit; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; + +public class ViewUserDetailActivity extends AppCompatActivity { + + static final String EXTRA_USER_NAME_KEY = "EUNK"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_user_detail); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + + } +} diff --git a/app/src/main/res/layout/activity_view_subreddit_detail.xml b/app/src/main/res/layout/activity_view_subreddit_detail.xml index ed05ebf1..67bf3928 100644 --- a/app/src/main/res/layout/activity_view_subreddit_detail.xml +++ b/app/src/main/res/layout/activity_view_subreddit_detail.xml @@ -5,21 +5,18 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/coordinator_layout_view_subreddit_detail_activity" - android:fitsSystemWindows="true" tools:context=".ViewSubredditDetailActivity"> diff --git a/app/src/main/res/layout/activity_view_user_detail.xml b/app/src/main/res/layout/activity_view_user_detail.xml new file mode 100644 index 00000000..76dbba91 --- /dev/null +++ b/app/src/main/res/layout/activity_view_user_detail.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_view_user_detail.xml b/app/src/main/res/layout/content_view_user_detail.xml new file mode 100644 index 00000000..c708ae9e --- /dev/null +++ b/app/src/main/res/layout/content_view_user_detail.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_view_user_detail.xml b/app/src/main/res/menu/menu_view_user_detail.xml new file mode 100644 index 00000000..ec7d65b8 --- /dev/null +++ b/app/src/main/res/menu/menu_view_user_detail.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 344848b5..00000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b98acbb..34ac12f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,4 +26,94 @@ Online: %1$d x%1$d + ViewUserDetailActivity + + "Material is the metaphor.\n\n" + + "A material metaphor is the unifying theory of a rationalized space and a system of motion." + "The material is grounded in tactile reality, inspired by the study of paper and ink, yet " + "technologically advanced and open to imagination and magic.\n" + "Surfaces and edges of the material provide visual cues that are grounded in reality. The " + "use of familiar tactile attributes helps users quickly understand affordances. Yet the " + "flexibility of the material creates new affordances that supercede those in the physical " + "world, without breaking the rules of physics.\n" + "The fundamentals of light, surface, and movement are key to conveying how objects move, " + "interact, and exist in space and in relation to each other. Realistic lighting shows " + "seams, divides space, and indicates moving parts.\n\n" + + "Bold, graphic, intentional.\n\n" + + "The foundational elements of print based design typography, grids, space, scale, color, " + "and use of imagery guide visual treatments. These elements do far more than please the " + "eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge " + "imagery, large scale typography, and intentional white space create a bold and graphic " + "interface that immerse the user in the experience.\n" + "An emphasis on user actions makes core functionality immediately apparent and provides " + "waypoints for the user.\n\n" + + "Motion provides meaning.\n\n" + + "Motion respects and reinforces the user as the prime mover. Primary user actions are " + "inflection points that initiate motion, transforming the whole design.\n" + "All action takes place in a single environment. Objects are presented to the user without " + "breaking the continuity of experience even as they transform and reorganize.\n" + "Motion is meaningful and appropriate, serving to focus attention and maintain continuity. " + "Feedback is subtle yet clear. Transitions are efficient yet coherent.\n\n" + + "3D world.\n\n" + + "The material environment is a 3D space, which means all objects have x, y, and z " + "dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the " + "positive z-axis extending towards the viewer. Every sheet of material occupies a single " + "position along the z-axis and has a standard 1dp thickness.\n" + "On the web, the z-axis is used for layering and not for perspective. The 3D world is " + "emulated by manipulating the y-axis.\n\n" + + "Light and shadow.\n\n" + + "Within the material environment, virtual lights illuminate the scene. Key lights create " + "directional shadows, while ambient light creates soft shadows from all angles.\n" + "Shadows in the material environment are cast by these two light sources. In Android " + "development, shadows occur when light sources are blocked by sheets of material at " + "various positions along the z-axis. On the web, shadows are depicted by manipulating the " + "y-axis only. The following example shows the card with a height of 6dp.\n\n" + + "Resting elevation.\n\n" + + "All material objects, regardless of size, have a resting elevation, or default elevation " + "that does not change. If an object changes elevation, it should return to its resting " + "elevation as soon as possible.\n\n" + + "Component elevations.\n\n" + + "The resting elevation for a component type is consistent across apps (e.g., FAB elevation " + "does not vary from 6dp in one app to 16dp in another app).\n" + "Components may have different resting elevations across platforms, depending on the depth " + "of the environment (e.g., TV has a greater depth than mobile or desktop).\n\n" + + "Responsive elevation and dynamic elevation offsets.\n\n" + + "Some component types have responsive elevation, meaning they change elevation in response " + "to user input (e.g., normal, focused, and pressed) or system events. These elevation " + "changes are consistently implemented using dynamic elevation offsets.\n" + "Dynamic elevation offsets are the goal elevation that a component moves towards, relative " + "to the component’s resting state. They ensure that elevation changes are consistent " + "across actions and component types. For example, all components that lift on press have " + "the same elevation change relative to their resting elevation.\n" + "Once the input event is completed or cancelled, the component will return to its resting " + "elevation.\n\n" + + "Avoiding elevation interference.\n\n" + + "Components with responsive elevations may encounter other components as they move between " + "their resting elevations and dynamic elevation offsets. Because material cannot pass " + "through other material, components avoid interfering with one another any number of ways, " + "whether on a per component basis or using the entire app layout.\n" + "On a component level, components can move or be removed before they cause interference. " + "For example, a floating action button (FAB) can disappear or move off screen before a " + "user picks up a card, or it can move if a snackbar appears.\n" + "On the layout level, design your app layout to minimize opportunities for interference. " + "For example, position the FAB to one side of stream of a cards so the FAB won’t interfere " + "when a user tries to pick up one of cards.\n\n" + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index abb0cb8a..b22e23e3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -9,15 +9,19 @@ + +