added subscriber list, new list layout

This commit is contained in:
nuclearfog 2020-10-22 18:47:50 +02:00
parent a9e1018861
commit 2b616bfed6
No known key found for this signature in database
GPG Key ID: D5490E4A81F97B14
10 changed files with 178 additions and 29 deletions

View File

@ -20,8 +20,8 @@
<map> <map>
<entry key="assetSourceType" value="FILE" /> <entry key="assetSourceType" value="FILE" />
<entry key="autoMirrored" value="true" /> <entry key="autoMirrored" value="true" />
<entry key="outputName" value="edit_list" /> <entry key="outputName" value="list_subscribe" />
<entry key="sourceFile" value="$USER_HOME$/Dokumente/Rest/Entypo SVG/new-message.svg" /> <entry key="sourceFile" value="$USER_HOME$/Schreibtisch/2.svg" />
</map> </map>
</option> </option>
</PersistentState> </PersistentState>

View File

@ -117,11 +117,11 @@ public class ListDetail extends AppCompatActivity implements OnTabSelectedListen
isPublic = param.getBoolean(KEY_LISTDETAIL_VISIB, false); isPublic = param.getBoolean(KEY_LISTDETAIL_VISIB, false);
belongsToCurrentUser = param.getBoolean(KEY_CURRENT_USER_OWNS, false); belongsToCurrentUser = param.getBoolean(KEY_CURRENT_USER_OWNS, false);
adapter.setupListContentPage(listId); adapter.setupListContentPage(listId);
Tab tlTab = tablayout.getTabAt(0); Tab tweetTab = tablayout.getTabAt(0);
Tab trTab = tablayout.getTabAt(1); Tab userTab = tablayout.getTabAt(1);
if (tlTab != null && trTab != null) { if (tweetTab != null && userTab != null) {
tlTab.setIcon(R.drawable.list); tweetTab.setIcon(R.drawable.list);
trTab.setIcon(R.drawable.user); userTab.setIcon(R.drawable.user);
} }
toolbar.setTitle(title); toolbar.setTitle(title);
toolbar.setSubtitle(description); toolbar.setSubtitle(description);

View File

@ -12,6 +12,9 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayout.Tab;
import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.FragmentAdapter; import org.nuclearfog.twidda.adapter.FragmentAdapter;
import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.backend.utils.FontTool;
@ -20,10 +23,10 @@ import org.nuclearfog.twidda.database.GlobalSettings;
/** /**
* Activity to show user lists of a twitter user * Activity to show user lists of a twitter user
*/ */
public class TwitterList extends AppCompatActivity { public class TwitterList extends AppCompatActivity implements TabLayout.OnTabSelectedListener {
/** /**
* request code for {@link ListPopup} * request code for {@link ListPopup}OnTabSelectedListener
*/ */
public static final int REQ_CREATE_LIST = 1; public static final int REQ_CREATE_LIST = 1;
@ -44,6 +47,9 @@ public class TwitterList extends AppCompatActivity {
private FragmentAdapter adapter; private FragmentAdapter adapter;
private ViewPager pager;
private TabLayout mTab;
private boolean currentUsersLists = false; private boolean currentUsersLists = false;
@ -53,16 +59,23 @@ public class TwitterList extends AppCompatActivity {
setContentView(R.layout.page_list); setContentView(R.layout.page_list);
View root = findViewById(R.id.list_view); View root = findViewById(R.id.list_view);
Toolbar toolbar = findViewById(R.id.list_toolbar); Toolbar toolbar = findViewById(R.id.list_toolbar);
ViewPager pager = findViewById(R.id.list_pager); pager = findViewById(R.id.list_pager);
mTab = findViewById(R.id.list_tab);
toolbar.setTitle(R.string.list_appbar); toolbar.setTitle(R.string.list_appbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
adapter = new FragmentAdapter(getSupportFragmentManager()); adapter = new FragmentAdapter(getSupportFragmentManager());
pager.setAdapter(adapter); mTab.setupWithViewPager(pager);
GlobalSettings settings = GlobalSettings.getInstance(this); GlobalSettings settings = GlobalSettings.getInstance(this);
FontTool.setViewFontAndColor(settings, root); FontTool.setViewFontAndColor(settings, root);
root.setBackgroundColor(settings.getBackgroundColor()); root.setBackgroundColor(settings.getBackgroundColor());
pager.setAdapter(adapter);
pager.setOffscreenPageLimit(2);
pager.setAdapter(adapter);
mTab.setupWithViewPager(pager);
mTab.setSelectedTabIndicatorColor(settings.getHighlightColor());
mTab.addOnTabSelectedListener(this);
Bundle param = getIntent().getExtras(); Bundle param = getIntent().getExtras();
if (param != null) { if (param != null) {
@ -74,6 +87,12 @@ public class TwitterList extends AppCompatActivity {
String ownerName = param.getString(KEY_USERLIST_OWNER_NAME); String ownerName = param.getString(KEY_USERLIST_OWNER_NAME);
adapter.setupListPage(ownerName); adapter.setupListPage(ownerName);
} }
Tab userList = mTab.getTabAt(0);
Tab userSub = mTab.getTabAt(1);
if (userList != null && userSub != null) {
userList.setIcon(R.drawable.list_owner);
userSub.setIcon(R.drawable.list_subscribe);
}
} }
} }
@ -87,6 +106,16 @@ public class TwitterList extends AppCompatActivity {
} }
@Override
public void onBackPressed() {
if (mTab.getSelectedTabPosition() > 0) {
pager.setCurrentItem(0);
} else {
super.onBackPressed();
}
}
@Override @Override
public boolean onCreateOptionsMenu(Menu m) { public boolean onCreateOptionsMenu(Menu m) {
getMenuInflater().inflate(R.menu.lists, m); getMenuInflater().inflate(R.menu.lists, m);
@ -105,4 +134,20 @@ public class TwitterList extends AppCompatActivity {
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override
public void onTabSelected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
adapter.scrollToTop(tab.getPosition());
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
} }

View File

@ -13,8 +13,11 @@ import org.nuclearfog.twidda.fragment.TrendFragment;
import org.nuclearfog.twidda.fragment.TweetFragment; import org.nuclearfog.twidda.fragment.TweetFragment;
import org.nuclearfog.twidda.fragment.UserFragment; import org.nuclearfog.twidda.fragment.UserFragment;
import static org.nuclearfog.twidda.fragment.ListFragment.KEY_FRAG_LIST_LIST_TYPE;
import static org.nuclearfog.twidda.fragment.ListFragment.KEY_FRAG_LIST_OWNER_ID; import static org.nuclearfog.twidda.fragment.ListFragment.KEY_FRAG_LIST_OWNER_ID;
import static org.nuclearfog.twidda.fragment.ListFragment.KEY_FRAG_LIST_OWNER_NAME; import static org.nuclearfog.twidda.fragment.ListFragment.KEY_FRAG_LIST_OWNER_NAME;
import static org.nuclearfog.twidda.fragment.ListFragment.LIST_USER_OWNS;
import static org.nuclearfog.twidda.fragment.ListFragment.LIST_USER_SUBSCR_TO;
import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_ID; import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_ID;
import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_MODE; import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_MODE;
import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_SEARCH; import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_SEARCH;
@ -236,11 +239,17 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
* @param userId ID of the user * @param userId ID of the user
*/ */
public void setupListPage(long userId) { public void setupListPage(long userId) {
Bundle param = new Bundle(); Bundle userListParam = new Bundle();
param.putLong(KEY_FRAG_LIST_OWNER_ID, userId); Bundle subscriberParam = new Bundle();
fragments = new Fragment[1]; userListParam.putLong(KEY_FRAG_LIST_OWNER_ID, userId);
userListParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_OWNS);
subscriberParam.putLong(KEY_FRAG_LIST_OWNER_ID, userId);
subscriberParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_SUBSCR_TO);
fragments = new Fragment[2];
fragments[0] = new ListFragment(); fragments[0] = new ListFragment();
fragments[0].setArguments(param); fragments[1] = new ListFragment();
fragments[0].setArguments(userListParam);
fragments[1].setArguments(subscriberParam);
notifyDataSetChanged(); notifyDataSetChanged();
} }
@ -250,11 +259,17 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
* @param ownerName screen name of the owner * @param ownerName screen name of the owner
*/ */
public void setupListPage(String ownerName) { public void setupListPage(String ownerName) {
Bundle param = new Bundle(); Bundle userListParam = new Bundle();
param.putString(KEY_FRAG_LIST_OWNER_NAME, ownerName); Bundle subscriberParam = new Bundle();
fragments = new Fragment[1]; userListParam.putString(KEY_FRAG_LIST_OWNER_NAME, ownerName);
userListParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_OWNS);
subscriberParam.putString(KEY_FRAG_LIST_OWNER_NAME, ownerName);
subscriberParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_SUBSCR_TO);
fragments = new Fragment[2];
fragments[0] = new ListFragment(); fragments[0] = new ListFragment();
fragments[0].setArguments(param); fragments[1] = new ListFragment();
fragments[0].setArguments(userListParam);
fragments[1].setArguments(subscriberParam);
notifyDataSetChanged(); notifyDataSetChanged();
} }

View File

@ -23,7 +23,8 @@ public class TwitterListLoader extends AsyncTask<Long, Void, UserListList> {
public static final long NO_CURSOR = -1; public static final long NO_CURSOR = -1;
public enum Action { public enum Action {
LOAD, LOAD_USERLISTS,
LOAD_MEMBERSHIPS,
FOLLOW, FOLLOW,
DELETE DELETE
} }
@ -52,7 +53,7 @@ public class TwitterListLoader extends AsyncTask<Long, Void, UserListList> {
protected UserListList doInBackground(Long[] param) { protected UserListList doInBackground(Long[] param) {
try { try {
switch (action) { switch (action) {
case LOAD: case LOAD_USERLISTS:
long cursor = param[0]; long cursor = param[0];
if (id > 0) { if (id > 0) {
return mTwitter.getUserList(id, cursor); return mTwitter.getUserList(id, cursor);
@ -60,6 +61,14 @@ public class TwitterListLoader extends AsyncTask<Long, Void, UserListList> {
return mTwitter.getUserList(ownerName, cursor); return mTwitter.getUserList(ownerName, cursor);
} }
case LOAD_MEMBERSHIPS:
cursor = param[0];
if (id > 0) {
return mTwitter.getUserListMemberships(id, "", cursor);
} else {
return mTwitter.getUserListMemberships(0, ownerName, cursor);
}
case FOLLOW: case FOLLOW:
return new UserListList(mTwitter.followUserList(id)); return new UserListList(mTwitter.followUserList(id));
@ -80,7 +89,8 @@ public class TwitterListLoader extends AsyncTask<Long, Void, UserListList> {
if (callback.get() != null) { if (callback.get() != null) {
if (result != null) { if (result != null) {
switch (action) { switch (action) {
case LOAD: case LOAD_USERLISTS:
case LOAD_MEMBERSHIPS:
callback.get().setData(result); callback.get().setData(result);
break; break;

View File

@ -913,7 +913,7 @@ public class TwitterEngine {
List<UserList> lists = twitter.getUserLists(userId); List<UserList> lists = twitter.getUserLists(userId);
long prevCursor = cursor > 0 ? cursor : 0; long prevCursor = cursor > 0 ? cursor : 0;
long nextCursor = 0; long nextCursor = 0;
UserListList result = new UserListList(0, 0); // todo add paging system UserListList result = new UserListList(prevCursor, nextCursor); // todo add paging system
for (UserList list : lists) for (UserList list : lists)
result.add(new TwitterList(list, twitterID)); result.add(new TwitterList(list, twitterID));
return result; return result;
@ -949,14 +949,19 @@ public class TwitterEngine {
* get the lists the user has been added to * get the lists the user has been added to
* *
* @param userId ID of the user * @param userId ID of the user
* @param username alternative to userId if id is '0'
* @param cursor list cursor * @param cursor list cursor
* @return a list of user lists * @return a list of user lists
* @throws EngineException if access is unavailable * @throws EngineException if access is unavailable
*/ */
public UserListList getUserListMemberships(long userId, long cursor) throws EngineException { public UserListList getUserListMemberships(long userId, String username, long cursor) throws EngineException {
try { try {
int count = settings.getListSize(); int count = settings.getListSize();
PagableResponseList<UserList> lists = twitter.getUserListMemberships(userId, count, cursor); PagableResponseList<UserList> lists;
if (userId > 0)
lists = twitter.getUserListMemberships(userId, count, cursor);
else
lists = twitter.getUserListMemberships(username, count, cursor);
long prevCursor = cursor > 0 ? cursor : 0; long prevCursor = cursor > 0 ? cursor : 0;
long nextCursor = lists.getNextCursor(); long nextCursor = lists.getNextCursor();
UserListList result = new UserListList(prevCursor, nextCursor); UserListList result = new UserListList(prevCursor, nextCursor);

View File

@ -46,7 +46,8 @@ import static org.nuclearfog.twidda.activity.UserDetail.USERLIST_SUBSCRBR;
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID; import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.DELETE; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.DELETE;
import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.FOLLOW; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.FOLLOW;
import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.LOAD; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.LOAD_MEMBERSHIPS;
import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.LOAD_USERLISTS;
import static org.nuclearfog.twidda.backend.TwitterListLoader.NO_CURSOR; import static org.nuclearfog.twidda.backend.TwitterListLoader.NO_CURSOR;
/** /**
@ -65,6 +66,22 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli
*/ */
public static final String KEY_FRAG_LIST_OWNER_NAME = "list_owner_name"; public static final String KEY_FRAG_LIST_OWNER_NAME = "list_owner_name";
/**
* key to define the type of the list
* {@link #LIST_USER_OWNS} or {@link #LIST_USER_SUBSCR_TO}
*/
public static final String KEY_FRAG_LIST_LIST_TYPE = "list_type";
/**
* setup for lists of an user
*/
public static final int LIST_USER_OWNS = 1;
/**
* setup for list an user is subscribed to
*/
public static final int LIST_USER_SUBSCR_TO = 2;
private TwitterListLoader listTask; private TwitterListLoader listTask;
private GlobalSettings settings; private GlobalSettings settings;
@ -291,7 +308,11 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli
if (param != null) { if (param != null) {
long id = param.getLong(KEY_FRAG_LIST_OWNER_ID, 0); long id = param.getLong(KEY_FRAG_LIST_OWNER_ID, 0);
String ownerName = param.getString(KEY_FRAG_LIST_OWNER_NAME, ""); String ownerName = param.getString(KEY_FRAG_LIST_OWNER_NAME, "");
listTask = new TwitterListLoader(this, LOAD, id, ownerName); int type = param.getInt(KEY_FRAG_LIST_LIST_TYPE);
if (type == LIST_USER_OWNS)
listTask = new TwitterListLoader(this, LOAD_USERLISTS, id, ownerName);
else if (type == LIST_USER_SUBSCR_TO)
listTask = new TwitterListLoader(this, LOAD_MEMBERSHIPS, id, ownerName);
listTask.execute(cursor); listTask.execute(cursor);
} }
} }

View File

@ -0,0 +1,24 @@
<vector android:autoMirrored="true"
android:height="30dp"
android:width="45dp"
android:viewportHeight="1000"
android:viewportWidth="1500"
xmlns:android="http://schemas.android.com/apk/res/android">
<group>
<clip-path android:pathData="M0,0h1500v1000h-1500z" />
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M743,500L514,310 514,424 248,424 248,576 514,576 514,690 743,500 743,500ZM133,233L438,233 438,157 133,157C91,157 57,191 57,233L57,767C57,809 91,843 133,843L438,843 438,767 133,767 133,233 133,233Z"
android:strokeColor="#00000000"
android:strokeLineJoin="round"
android:strokeWidth="28.222" />
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M1150,238C1197,238 1236,199 1236,152 1236,105 1197,66 1150,66 1103,66 1064,105 1064,152 1064,199 1103,238 1150,238L1150,238ZM1406,563C1390,487 1361,362 1319,310 1278,260 1195,258 1150,258L1150,258C1105,258 1022,260 981,310 939,362 910,487 894,563 885,605 943,620 959,578 981,515 999,462 1037,418 1058,543 983,759 979,881 979,904 998,924 1021,924 1040,924 1055,912 1061,896 1081,828 1150,639 1150,639L1150,639 1150,639C1150,639 1219,828 1239,896 1245,912 1260,924 1279,924 1302,924 1321,904 1321,881 1317,759 1242,543 1263,418 1301,462 1319,515 1341,578 1357,620 1415,605 1406,563L1406,563Z"
android:strokeColor="#00000000"
android:strokeLineJoin="round"
android:strokeWidth="28.222" />
</group>
</vector>

View File

@ -0,0 +1,24 @@
<vector android:autoMirrored="true"
android:height="30dp"
android:width="45dp"
android:viewportHeight="1000"
android:viewportWidth="1500"
xmlns:android="http://schemas.android.com/apk/res/android">
<group>
<clip-path android:pathData="M0,0h1500v1000h-1500z" />
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M350,238C397,238 436,199 436,152 436,105 397,66 350,66 303,66 264,105 264,152 264,199 303,238 350,238L350,238ZM606,563C590,487 561,362 519,310 478,260 395,258 350,258L350,258C305,258 222,260 181,310 139,362 110,487 94,563 85,605 143,620 159,578 181,515 199,462 237,418 258,543 183,759 179,881 179,904 198,924 221,924 240,924 255,912 261,896 281,828 350,639 350,639L350,639 350,639C350,639 419,828 439,896 445,912 460,924 479,924 502,924 521,904 521,881 517,759 442,543 463,418 501,462 519,515 541,578 557,620 615,605 606,563L606,563Z"
android:strokeColor="#00000000"
android:strokeLineJoin="round"
android:strokeWidth="28.222" />
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M1207,500L979,310 979,424 712,424 712,576 979,576 979,690 1207,500 1207,500ZM1322,767L1017,767 1017,843 1322,843C1364,843 1398,809 1398,767L1398,233C1398,191 1364,157 1322,157L1017,157 1017,233 1322,233 1322,767 1322,767Z"
android:strokeColor="#00000000"
android:strokeLineJoin="round"
android:strokeWidth="28.222" />
</group>
</vector>

View File

@ -11,6 +11,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/listpage_toolbar_height" /> android:layout_height="@dimen/listpage_toolbar_height" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/list_tab"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager <androidx.viewpager.widget.ViewPager
android:id="@+id/list_pager" android:id="@+id/list_pager"
android:layout_width="match_parent" android:layout_width="match_parent"