diff options
Diffstat (limited to '')
18 files changed, 278 insertions, 62 deletions
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" /> <activity android:name=".ViewSubredditDetailActivity" - android:theme="@style/AppTheme.NoActionBar" - android:parentActivityName=".MainActivity" /> + android:parentActivityName=".MainActivity" + android:theme="@style/AppTheme.NoActionBarWithTranslucentStatusBar" /> + <activity + android:name=".ViewUserDetailActivity" + android:label="@string/title_activity_view_user_detail" + android:theme="@style/AppTheme.NoActionBar" /> </application> </manifest>
\ 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<PostData> 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<PostData> bestPostData, String lastItem) { - mAdapter.notifyDataSetChanged(); + public void onParsePostSuccess(ArrayList<PostData> 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<PostData> bestPostData, String lastItem) { - mAdapter.notifyDataSetChanged(); + public void onParsePostSuccess(ArrayList<PostData> 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<RecyclerView.ViewHold ((DataViewHolder) holder).subredditIconCircleImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, - mPostData.get(adapterPosition).getSubredditNamePrefixed().substring(2)); + if(canStartActivity) { + canStartActivity = false; + Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, + mPostData.get(adapterPosition).getSubredditNamePrefixed().substring(2)); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY, + mPostData.get(adapterPosition).getSubredditNamePrefixed()); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false); + mContext.startActivity(intent); + } } }); ((DataViewHolder) holder).subredditNameTextView.setText(subredditName); + + ((DataViewHolder) holder).subredditNameTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(canStartActivity) { + canStartActivity = false; + Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, + mPostData.get(adapterPosition).getSubredditNamePrefixed().substring(2)); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY, + mPostData.get(adapterPosition).getSubredditNamePrefixed()); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false); + mContext.startActivity(intent); + } + } + }); ((DataViewHolder) holder).postTimeTextView.setText(postTime); ((DataViewHolder) holder).titleTextView.setText(title); ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(mPostData.get(position).getScore())); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java index 7b29693c..e150ab26 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java @@ -38,4 +38,7 @@ public interface RedditAPI { @GET("r/{subredditName}.json?raw_json=1") Call<String> getPost(@Path("subredditName") String subredditName, @Query("after") String lastItem); + + @GET("user/{username}/about.json/raw_json=1") + Call<String> 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<SubredditData> getSubredditLiveData(String id); + LiveData<SubredditData> getSubredditLiveDataById(String id); + + @Query("SELECT * from subreddits WHERE name = :namePrefixed") + LiveData<SubredditData> 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<SubredditData> 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<SubredditData> 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<SubredditData> 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 extends ViewModel> T create(Class<T> 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<Recycl public void onClick(View view) { Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName()); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_ID_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId()); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId()); + intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, true); mContext.startActivity(intent); } }); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java index d754b5af..af367793 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java @@ -13,6 +13,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -25,7 +26,8 @@ import de.hdodenhof.circleimageview.CircleImageView; public class ViewSubredditDetailActivity extends AppCompatActivity { static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN"; - static final String EXTRA_SUBREDDIT_ID_KEY = "ESI"; + static final String EXTRA_SUBREDDIT_VALUE_KEY = "ESV"; + static final String EXTRA_QUERY_BY_ID_KEY = "EQBI"; private static final String FRAGMENT_OUT_STATE_KEY = "FOSK"; @@ -37,31 +39,48 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_subreddit_detail); - Toolbar toolbar = findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + //Get status bar height + int statusBarHeight = 0; + int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 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<SubredditData>() { @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"> <android.support.design.widget.AppBarLayout android:id="@+id/app_bar_layout_view_subreddit_detail_activity" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fitsSystemWindows="true" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout_view_subreddit_detail_activity" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" app:toolbarId="@+id/toolbar"> 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="true" + tools:context=".ViewUserDetailActivity"> + + <android.support.design.widget.AppBarLayout + android:id="@+id/app_bar" + android:layout_width="match_parent" + android:layout_height="@dimen/app_bar_height" + android:fitsSystemWindows="true" + android:theme="@style/AppTheme.AppBarOverlay"> + + <android.support.design.widget.CollapsingToolbarLayout + android:id="@+id/toolbar_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="true" + app:contentScrim="?attr/colorPrimary" + app:layout_scrollFlags="scroll|exitUntilCollapsed" + app:toolbarId="@+id/toolbar"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + app:layout_collapseMode="pin" + app:popupTheme="@style/AppTheme.PopupOverlay" /> + + </android.support.design.widget.CollapsingToolbarLayout> + </android.support.design.widget.AppBarLayout> + + <include layout="@layout/content_view_user_detail" /> + +</android.support.design.widget.CoordinatorLayout>
\ 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/frame_layout_view_user_detail_activity" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:context=".ViewUserDetailActivity" + tools:showIn="@layout/activity_view_user_detail" />
\ 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 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="ml.docilealligator.infinityforreddit.ViewUserDetailActivity"> + <item + android:id="@+id/action_settings" + android:orderInCategory="100" + android:title="@string/action_settings" + app:showAsAction="never" /> +</menu> 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 @@ -<resources> - - <style name="AppTheme.NoActionBar"> - <item name="windowActionBar">false</item> - <item name="windowNoTitle">true</item> - <item name="android:statusBarColor">@android:color/transparent</item> - </style> - - <style name="AppTheme.ActionBar.Transparent" parent="AppTheme"> - <!--<item name="colorPrimary">@android:color/transparent</item>--> - <item name="colorPrimary">@color/transparentActionBarColor</item> - <item name="android:windowTranslucentStatus">true</item> - <item name="android:windowTranslucentNavigation">true</item> - </style> - -</resources> 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 @@ <string name="online_subscribers_number_detail">Online: %1$d</string> <string name="gilded">x%1$d</string> + <string name="title_activity_view_user_detail">ViewUserDetailActivity</string> + <string name="large_text"> + "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" + </string> </resources> 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 @@ </style> <style name="AppTheme.NoActionBar"> - <item name="android:windowContentOverlay">@null</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> + <item name="android:statusBarColor">@android:color/transparent</item> + </style> + + <style name="AppTheme.NoActionBarWithTranslucentStatusBar" parent="AppTheme.NoActionBar"> + <item name="android:windowTranslucentStatus">true</item> </style> <style name="AppTheme.ActionBar.Transparent" parent="AppTheme"> - <item name="android:windowContentOverlay">@null</item> - <item name="windowActionBarOverlay">true</item> - <item name="colorPrimary">@android:color/transparent</item> + <item name="colorPrimary">@color/transparentActionBarColor</item> + <item name="android:windowTranslucentStatus">true</item> + <item name="android:windowTranslucentNavigation">true</item> </style> <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> |