Make favorites and bookmarks a tab in profile (AND-135)
This commit is contained in:
parent
56a2510564
commit
9c95d5f6e5
9 changed files with 186 additions and 109 deletions
|
@ -1,43 +0,0 @@
|
||||||
package org.joinmastodon.android.fragments;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
|
|
||||||
import org.joinmastodon.android.R;
|
|
||||||
import org.joinmastodon.android.api.requests.statuses.GetBookmarkedStatuses;
|
|
||||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
|
||||||
import org.joinmastodon.android.model.HeaderPaginationList;
|
|
||||||
import org.joinmastodon.android.model.Status;
|
|
||||||
|
|
||||||
import me.grishka.appkit.api.SimpleCallback;
|
|
||||||
|
|
||||||
public class BookmarkedStatusListFragment extends StatusListFragment{
|
|
||||||
private String nextMaxID;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAttach(Activity activity){
|
|
||||||
super.onAttach(activity);
|
|
||||||
setTitle(R.string.bookmarks);
|
|
||||||
loadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void doLoadData(int offset, int count){
|
|
||||||
currentRequest=new GetBookmarkedStatuses(offset==0 ? null : nextMaxID, count)
|
|
||||||
.setCallback(new SimpleCallback<>(this){
|
|
||||||
@Override
|
|
||||||
public void onSuccess(HeaderPaginationList<Status> result){
|
|
||||||
if(result.nextPageUri!=null)
|
|
||||||
nextMaxID=result.nextPageUri.getQueryParameter("max_id");
|
|
||||||
else
|
|
||||||
nextMaxID=null;
|
|
||||||
onDataLoaded(result, nextMaxID!=null);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.exec(accountID);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){
|
|
||||||
// no-op
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
package org.joinmastodon.android.fragments;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
|
|
||||||
import org.joinmastodon.android.R;
|
|
||||||
import org.joinmastodon.android.api.requests.statuses.GetFavoritedStatuses;
|
|
||||||
import org.joinmastodon.android.model.HeaderPaginationList;
|
|
||||||
import org.joinmastodon.android.model.Status;
|
|
||||||
|
|
||||||
import me.grishka.appkit.api.SimpleCallback;
|
|
||||||
|
|
||||||
public class FavoritedStatusListFragment extends StatusListFragment{
|
|
||||||
private String nextMaxID;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAttach(Activity activity){
|
|
||||||
super.onAttach(activity);
|
|
||||||
setTitle(R.string.your_favorites);
|
|
||||||
loadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void doLoadData(int offset, int count){
|
|
||||||
currentRequest=new GetFavoritedStatuses(offset==0 ? null : nextMaxID, count)
|
|
||||||
.setCallback(new SimpleCallback<>(this){
|
|
||||||
@Override
|
|
||||||
public void onSuccess(HeaderPaginationList<Status> result){
|
|
||||||
if(result.nextPageUri!=null)
|
|
||||||
nextMaxID=result.nextPageUri.getQueryParameter("max_id");
|
|
||||||
else
|
|
||||||
nextMaxID=null;
|
|
||||||
onDataLoaded(result, nextMaxID!=null);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.exec(accountID);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -129,6 +129,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
private ProfileFeaturedFragment featuredFragment;
|
private ProfileFeaturedFragment featuredFragment;
|
||||||
private AccountTimelineFragment timelineFragment;
|
private AccountTimelineFragment timelineFragment;
|
||||||
private ProfileAboutFragment aboutFragment;
|
private ProfileAboutFragment aboutFragment;
|
||||||
|
private SavedPostsTimelineFragment savedFragment;
|
||||||
private TabLayout tabbar;
|
private TabLayout tabbar;
|
||||||
private SwipeRefreshLayout refreshLayout;
|
private SwipeRefreshLayout refreshLayout;
|
||||||
private View followersBtn, followingBtn;
|
private View followersBtn, followingBtn;
|
||||||
|
@ -254,13 +255,14 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
tabViews=new FrameLayout[3];
|
tabViews=new FrameLayout[4];
|
||||||
for(int i=0;i<tabViews.length;i++){
|
for(int i=0;i<tabViews.length;i++){
|
||||||
FrameLayout tabView=new FrameLayout(getActivity());
|
FrameLayout tabView=new FrameLayout(getActivity());
|
||||||
tabView.setId(switch(i){
|
tabView.setId(switch(i){
|
||||||
case 0 -> R.id.profile_featured;
|
case 0 -> R.id.profile_featured;
|
||||||
case 1 -> R.id.profile_timeline;
|
case 1 -> R.id.profile_timeline;
|
||||||
case 2 -> R.id.profile_about;
|
case 2 -> R.id.profile_about;
|
||||||
|
case 3 -> R.id.profile_saved;
|
||||||
default -> throw new IllegalStateException("Unexpected value: "+i);
|
default -> throw new IllegalStateException("Unexpected value: "+i);
|
||||||
});
|
});
|
||||||
tabView.setVisibility(View.GONE);
|
tabView.setVisibility(View.GONE);
|
||||||
|
@ -268,7 +270,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
tabViews[i]=tabView;
|
tabViews[i]=tabView;
|
||||||
}
|
}
|
||||||
|
|
||||||
pager.setOffscreenPageLimit(4);
|
pager.setOffscreenPageLimit(10);
|
||||||
pager.setAdapter(new ProfilePagerAdapter());
|
pager.setAdapter(new ProfilePagerAdapter());
|
||||||
pager.getLayoutParams().height=getResources().getDisplayMetrics().heightPixels;
|
pager.getLayoutParams().height=getResources().getDisplayMetrics().heightPixels;
|
||||||
|
|
||||||
|
@ -282,6 +284,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
case 0 -> R.string.profile_featured;
|
case 0 -> R.string.profile_featured;
|
||||||
case 1 -> R.string.profile_timeline;
|
case 1 -> R.string.profile_timeline;
|
||||||
case 2 -> R.string.profile_about;
|
case 2 -> R.string.profile_about;
|
||||||
|
case 3 -> R.string.profile_saved_posts;
|
||||||
default -> throw new IllegalStateException();
|
default -> throw new IllegalStateException();
|
||||||
}));
|
}));
|
||||||
tabbar.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
|
tabbar.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
|
||||||
|
@ -316,6 +319,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
featuredFragment=(ProfileFeaturedFragment) getChildFragmentManager().getFragment(savedInstanceState, "featured");
|
featuredFragment=(ProfileFeaturedFragment) getChildFragmentManager().getFragment(savedInstanceState, "featured");
|
||||||
timelineFragment=(AccountTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "timeline");
|
timelineFragment=(AccountTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "timeline");
|
||||||
aboutFragment=(ProfileAboutFragment) getChildFragmentManager().getFragment(savedInstanceState, "about");
|
aboutFragment=(ProfileAboutFragment) getChildFragmentManager().getFragment(savedInstanceState, "about");
|
||||||
|
savedFragment=(SavedPostsTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "saved");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(loaded){
|
if(loaded){
|
||||||
|
@ -433,6 +437,9 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
aboutFragment=new ProfileAboutFragment();
|
aboutFragment=new ProfileAboutFragment();
|
||||||
aboutFragment.setFields(fields);
|
aboutFragment.setFields(fields);
|
||||||
}
|
}
|
||||||
|
if(savedFragment==null && isOwnProfile){
|
||||||
|
savedFragment=SavedPostsTimelineFragment.newInstance(accountID, account, false);
|
||||||
|
}
|
||||||
pager.getAdapter().notifyDataSetChanged();
|
pager.getAdapter().notifyDataSetChanged();
|
||||||
pager.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
pager.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
||||||
@Override
|
@Override
|
||||||
|
@ -508,6 +515,8 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
getChildFragmentManager().putFragment(outState, "timeline", timelineFragment);
|
getChildFragmentManager().putFragment(outState, "timeline", timelineFragment);
|
||||||
if(aboutFragment.isAdded())
|
if(aboutFragment.isAdded())
|
||||||
getChildFragmentManager().putFragment(outState, "about", aboutFragment);
|
getChildFragmentManager().putFragment(outState, "about", aboutFragment);
|
||||||
|
if(savedFragment!=null && savedFragment.isAdded())
|
||||||
|
getChildFragmentManager().putFragment(outState, "saved", savedFragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -751,14 +760,6 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
})
|
})
|
||||||
.wrapProgress(getActivity(), R.string.loading, false)
|
.wrapProgress(getActivity(), R.string.loading, false)
|
||||||
.exec(accountID);
|
.exec(accountID);
|
||||||
}else if(id==R.id.bookmarks){
|
|
||||||
Bundle args=new Bundle();
|
|
||||||
args.putString("account", accountID);
|
|
||||||
Nav.go(getActivity(), BookmarkedStatusListFragment.class, args);
|
|
||||||
}else if(id==R.id.favorites){
|
|
||||||
Bundle args=new Bundle();
|
|
||||||
args.putString("account", accountID);
|
|
||||||
Nav.go(getActivity(), FavoritedStatusListFragment.class, args);
|
|
||||||
}else if(id==R.id.save){
|
}else if(id==R.id.save){
|
||||||
if(isInEditMode)
|
if(isInEditMode)
|
||||||
saveAndExitEditMode();
|
saveAndExitEditMode();
|
||||||
|
@ -930,6 +931,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
case 0 -> featuredFragment;
|
case 0 -> featuredFragment;
|
||||||
case 1 -> timelineFragment;
|
case 1 -> timelineFragment;
|
||||||
case 2 -> aboutFragment;
|
case 2 -> aboutFragment;
|
||||||
|
case 3 -> savedFragment;
|
||||||
default -> throw new IllegalStateException();
|
default -> throw new IllegalStateException();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -993,7 +995,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
pager.setUserInputEnabled(false);
|
pager.setUserInputEnabled(false);
|
||||||
actionButton.setText(R.string.save_changes);
|
actionButton.setText(R.string.save_changes);
|
||||||
pager.setCurrentItem(2);
|
pager.setCurrentItem(2);
|
||||||
for(int i=0;i<3;i++){
|
for(int i=0;i<4;i++){
|
||||||
tabbar.getTabAt(i).view.setEnabled(false);
|
tabbar.getTabAt(i).view.setEnabled(false);
|
||||||
}
|
}
|
||||||
Drawable overlay=getResources().getDrawable(R.drawable.edit_avatar_overlay).mutate();
|
Drawable overlay=getResources().getDrawable(R.drawable.edit_avatar_overlay).mutate();
|
||||||
|
@ -1070,7 +1072,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
|
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
actionButton.setText(R.string.edit_profile);
|
actionButton.setText(R.string.edit_profile);
|
||||||
for(int i=0;i<3;i++){
|
for(int i=0;i<4;i++){
|
||||||
tabbar.getTabAt(i).view.setEnabled(true);
|
tabbar.getTabAt(i).view.setEnabled(true);
|
||||||
}
|
}
|
||||||
pager.setUserInputEnabled(true);
|
pager.setUserInputEnabled(true);
|
||||||
|
@ -1339,7 +1341,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop,
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount(){
|
public int getItemCount(){
|
||||||
return loaded ? 3 : 0;
|
return loaded ? (isOwnProfile ? 4 : 3) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
package org.joinmastodon.android.fragments;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.HorizontalScrollView;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.R;
|
||||||
|
import org.joinmastodon.android.api.requests.statuses.GetBookmarkedStatuses;
|
||||||
|
import org.joinmastodon.android.api.requests.statuses.GetFavoritedStatuses;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||||
|
import org.joinmastodon.android.model.Account;
|
||||||
|
import org.joinmastodon.android.model.HeaderPaginationList;
|
||||||
|
import org.joinmastodon.android.model.Status;
|
||||||
|
import org.joinmastodon.android.ui.drawables.EmptyDrawable;
|
||||||
|
import org.joinmastodon.android.ui.views.FilterChipView;
|
||||||
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import me.grishka.appkit.api.SimpleCallback;
|
||||||
|
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
||||||
|
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
|
||||||
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
|
public class SavedPostsTimelineFragment extends StatusListFragment{
|
||||||
|
private Account user;
|
||||||
|
private Mode mode;
|
||||||
|
private HorizontalScrollView filtersBar;
|
||||||
|
private FilterChipView favoritesChip, bookmarksChip;
|
||||||
|
|
||||||
|
public SavedPostsTimelineFragment(){
|
||||||
|
setListLayoutId(R.layout.recycler_fragment_no_refresh);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SavedPostsTimelineFragment newInstance(String accountID, Account profileAccount, boolean load){
|
||||||
|
SavedPostsTimelineFragment f=new SavedPostsTimelineFragment();
|
||||||
|
Bundle args=new Bundle();
|
||||||
|
args.putString("account", accountID);
|
||||||
|
args.putParcelable("profileAccount", Parcels.wrap(profileAccount));
|
||||||
|
if(!load)
|
||||||
|
args.putBoolean("noAutoLoad", true);
|
||||||
|
args.putBoolean("__is_tab", true);
|
||||||
|
f.setArguments(args);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Activity activity){
|
||||||
|
user=Parcels.unwrap(getArguments().getParcelable("profileAccount"));
|
||||||
|
mode=Mode.FAVORITES;
|
||||||
|
super.onAttach(activity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doLoadData(int offset, int count){
|
||||||
|
currentRequest=(switch(mode){
|
||||||
|
case FAVORITES -> new GetFavoritedStatuses(offset>0 ? getMaxID() : null, count);
|
||||||
|
case BOOKMARKS -> new GetBookmarkedStatuses(offset>0 ? getMaxID() : null, count);
|
||||||
|
}).setCallback(new SimpleCallback<>(this){
|
||||||
|
@Override
|
||||||
|
public void onSuccess(HeaderPaginationList<Status> result){
|
||||||
|
if(getActivity()==null)
|
||||||
|
return;
|
||||||
|
onDataLoaded(result, result.nextPageUri!=null);
|
||||||
|
}
|
||||||
|
}).exec(accountID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
view.setBackground(null); // prevents unnecessary overdraw
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onShown(){
|
||||||
|
super.onShown();
|
||||||
|
if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading)
|
||||||
|
loadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onStatusCreated(Status status){
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected RecyclerView.Adapter getAdapter(){
|
||||||
|
filtersBar=new HorizontalScrollView(getActivity());
|
||||||
|
LinearLayout filtersLayout=new LinearLayout(getActivity());
|
||||||
|
filtersBar.addView(filtersLayout);
|
||||||
|
filtersLayout.setOrientation(LinearLayout.HORIZONTAL);
|
||||||
|
filtersLayout.setPadding(V.dp(16), 0, V.dp(16), V.dp(8));
|
||||||
|
filtersLayout.setDividerDrawable(new EmptyDrawable(V.dp(8), 1));
|
||||||
|
filtersLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
|
||||||
|
|
||||||
|
favoritesChip=new FilterChipView(getActivity());
|
||||||
|
favoritesChip.setText(R.string.your_favorites);
|
||||||
|
favoritesChip.setTag(Mode.FAVORITES);
|
||||||
|
favoritesChip.setSelected(mode==Mode.FAVORITES);
|
||||||
|
favoritesChip.setOnClickListener(this::onFilterClick);
|
||||||
|
filtersLayout.addView(favoritesChip);
|
||||||
|
|
||||||
|
bookmarksChip=new FilterChipView(getActivity());
|
||||||
|
bookmarksChip.setText(R.string.bookmarks);
|
||||||
|
bookmarksChip.setTag(Mode.BOOKMARKS);
|
||||||
|
bookmarksChip.setSelected(mode==Mode.BOOKMARKS);
|
||||||
|
bookmarksChip.setOnClickListener(this::onFilterClick);
|
||||||
|
filtersLayout.addView(bookmarksChip);
|
||||||
|
|
||||||
|
View banner=getActivity().getLayoutInflater().inflate(R.layout.discover_info_banner, list, false);
|
||||||
|
TextView text=banner.findViewById(R.id.banner_text);
|
||||||
|
text.setText(R.string.profile_saved_posts_explanation);
|
||||||
|
ImageView icon=banner.findViewById(R.id.icon);
|
||||||
|
icon.setImageResource(R.drawable.ic_lock_24px);
|
||||||
|
|
||||||
|
MergeRecyclerAdapter mergeAdapter=new MergeRecyclerAdapter();
|
||||||
|
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(banner));
|
||||||
|
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(filtersBar));
|
||||||
|
mergeAdapter.addAdapter(super.getAdapter());
|
||||||
|
return mergeAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private FilterChipView getViewForMode(Mode mode){
|
||||||
|
return switch(mode){
|
||||||
|
case FAVORITES -> favoritesChip;
|
||||||
|
case BOOKMARKS -> bookmarksChip;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onFilterClick(View v){
|
||||||
|
Mode newMode=(Mode) v.getTag();
|
||||||
|
if(newMode==mode)
|
||||||
|
return;
|
||||||
|
if(currentRequest!=null){
|
||||||
|
currentRequest.cancel();
|
||||||
|
currentRequest=null;
|
||||||
|
}
|
||||||
|
getViewForMode(mode).setSelected(false);
|
||||||
|
mode=newMode;
|
||||||
|
v.setSelected(true);
|
||||||
|
data.clear();
|
||||||
|
preloadedData.clear();
|
||||||
|
int size=displayItems.size();
|
||||||
|
displayItems.clear();
|
||||||
|
adapter.notifyItemRangeRemoved(0, size);
|
||||||
|
loaded=false;
|
||||||
|
dataLoading=true;
|
||||||
|
doLoadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum Mode{
|
||||||
|
FAVORITES,
|
||||||
|
BOOKMARKS
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24"
|
|
||||||
android:viewportHeight="24">
|
|
||||||
<path
|
|
||||||
android:fillColor="@android:color/white"
|
|
||||||
android:pathData="M7,17.95 L12,15.8 17,17.95V5Q17,5 17,5Q17,5 17,5H7Q7,5 7,5Q7,5 7,5ZM5,21V5Q5,4.175 5.588,3.587Q6.175,3 7,3H17Q17.825,3 18.413,3.587Q19,4.175 19,5V21L12,18ZM17,5H12H7Q7,5 7,5Q7,5 7,5H17Q17,5 17,5Q17,5 17,5Z"/>
|
|
||||||
</vector>
|
|
|
@ -1,7 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<item android:id="@+id/bookmarks" android:title="@string/bookmarks" android:icon="@drawable/ic_bookmark_24px" android:showAsAction="always"/>
|
|
||||||
<item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_star_24px" android:showAsAction="always"/>
|
|
||||||
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_share_24px" android:showAsAction="always"/>
|
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_share_24px" android:showAsAction="always"/>
|
||||||
<!-- TODO add to list -->
|
|
||||||
</menu>
|
</menu>
|
|
@ -3,8 +3,8 @@
|
||||||
<!-- light -->
|
<!-- light -->
|
||||||
<color name="masterialLight_primary">#4000DD</color>
|
<color name="masterialLight_primary">#4000DD</color>
|
||||||
<color name="masterialLight_onPrimary">#FFFFFF</color>
|
<color name="masterialLight_onPrimary">#FFFFFF</color>
|
||||||
<color name="masterialLight_primaryContainer">#6648FF</color>
|
<color name="masterialLight_primaryContainer">#EBDDFF</color>
|
||||||
<color name="masterialLight_onPrimaryContainer">#FFFFFF</color>
|
<color name="masterialLight_onPrimaryContainer">#230F46</color>
|
||||||
<color name="masterialLight_secondary">#5D51AF</color>
|
<color name="masterialLight_secondary">#5D51AF</color>
|
||||||
<color name="masterialLight_onSecondary">#FFFFFF</color>
|
<color name="masterialLight_onSecondary">#FFFFFF</color>
|
||||||
<color name="masterialLight_secondaryContainer">#B0A5FF</color>
|
<color name="masterialLight_secondaryContainer">#B0A5FF</color>
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
<item name="profile_featured" type="id"/>
|
<item name="profile_featured" type="id"/>
|
||||||
<item name="profile_timeline" type="id"/>
|
<item name="profile_timeline" type="id"/>
|
||||||
<item name="profile_about" type="id"/>
|
<item name="profile_about" type="id"/>
|
||||||
|
<item name="profile_saved" type="id"/>
|
||||||
|
|
||||||
<item name="discover_posts" type="id"/>
|
<item name="discover_posts" type="id"/>
|
||||||
<item name="discover_hashtags" type="id"/>
|
<item name="discover_hashtags" type="id"/>
|
||||||
|
|
|
@ -310,7 +310,7 @@
|
||||||
<string name="add_bookmark">Bookmark</string>
|
<string name="add_bookmark">Bookmark</string>
|
||||||
<string name="remove_bookmark">Remove bookmark</string>
|
<string name="remove_bookmark">Remove bookmark</string>
|
||||||
<string name="bookmarks">Bookmarks</string>
|
<string name="bookmarks">Bookmarks</string>
|
||||||
<string name="your_favorites">Your favorites</string>
|
<string name="your_favorites">Favorites</string>
|
||||||
<string name="login_title">Welcome back</string>
|
<string name="login_title">Welcome back</string>
|
||||||
<string name="login_subtitle">Log in with the server where you created your account.</string>
|
<string name="login_subtitle">Log in with the server where you created your account.</string>
|
||||||
<string name="server_url">Server URL</string>
|
<string name="server_url">Server URL</string>
|
||||||
|
@ -829,6 +829,8 @@
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="familiar_followers_one">Followed by %s</string>
|
<string name="familiar_followers_one">Followed by %s</string>
|
||||||
<string name="familiar_followers_two">Followed by %s and %s</string>
|
<string name="familiar_followers_two">Followed by %s and %s</string>
|
||||||
|
<string name="profile_saved_posts">Saved</string>
|
||||||
|
<string name="profile_saved_posts_explanation">Your saved posts are only visible to you.</string>
|
||||||
<plurals name="familiar_followers_many">
|
<plurals name="familiar_followers_many">
|
||||||
<item quantity="one">Followed by %1$s, %2$s, and %3$,d other</item>
|
<item quantity="one">Followed by %1$s, %2$s, and %3$,d other</item>
|
||||||
<item quantity="other">Followed by %1$s, %2$s, and %3$,d others</item>
|
<item quantity="other">Followed by %1$s, %2$s, and %3$,d others</item>
|
||||||
|
|
Loading…
Add table
Reference in a new issue