parent
2c00ea6514
commit
a03eea1f85
|
@ -8,8 +8,8 @@ android {
|
|||
applicationId 'org.nuclearfog.twidda'
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 29
|
||||
versionCode 9
|
||||
versionName '1.7.1'
|
||||
versionCode 10
|
||||
versionName '1.7.2'
|
||||
vectorDrawables.useSupportLibrary true
|
||||
}
|
||||
|
||||
|
@ -44,5 +44,5 @@ dependencies {
|
|||
implementation 'com.squareup.picasso:picasso:2.71828'
|
||||
implementation 'com.github.QuadFlask:colorpicker:0.0.13'
|
||||
implementation 'com.github.nuclearfog:ZoomView:1.0.2'
|
||||
implementation 'com.github.nuclearfog:Tagger:01c1ae0'
|
||||
implementation 'com.github.nuclearfog:Tagger:2.0'
|
||||
}
|
|
@ -26,7 +26,7 @@ import java.text.NumberFormat;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static androidx.recyclerview.widget.RecyclerView.NO_POSITION;
|
||||
|
||||
|
@ -64,6 +64,20 @@ public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
|
|||
}
|
||||
|
||||
|
||||
@MainThread
|
||||
public void removeItem(long id) {
|
||||
int pos = -1;
|
||||
for (int index = 0; index < data.size() && pos < 0; index++) {
|
||||
if (data.get(index).getId() == id) {
|
||||
data.remove(index);
|
||||
pos = index;
|
||||
}
|
||||
}
|
||||
if (pos != -1)
|
||||
notifyItemRemoved(pos);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return data.size();
|
||||
|
@ -108,6 +122,17 @@ public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
|
|||
}
|
||||
}
|
||||
});
|
||||
vh.deleteList.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (listener.get() != null) {
|
||||
int position = vh.getLayoutPosition();
|
||||
if (position != NO_POSITION) {
|
||||
listener.get().onClick(data.get(position), ListClickListener.Action.DELETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
vh.subscriberCount.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
|
@ -150,10 +175,13 @@ public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
|
|||
vh.followList.setText(R.string.unfollow);
|
||||
else
|
||||
vh.followList.setText(R.string.follow);
|
||||
if (item.enableFollow())
|
||||
if (item.isListOwner()) {
|
||||
vh.followList.setVisibility(VISIBLE);
|
||||
else
|
||||
vh.followList.setVisibility(INVISIBLE);
|
||||
vh.deleteList.setVisibility(GONE);
|
||||
} else {
|
||||
vh.followList.setVisibility(GONE);
|
||||
vh.deleteList.setVisibility(VISIBLE);
|
||||
}
|
||||
if (item.isPrivate())
|
||||
vh.title.setCompoundDrawablesWithIntrinsicBounds(R.drawable.lock, 0, 0, 0);
|
||||
else
|
||||
|
@ -163,7 +191,7 @@ public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
|
|||
|
||||
class ListHolder extends ViewHolder {
|
||||
final ImageView pb_image;
|
||||
final Button followList;
|
||||
final Button followList, deleteList;
|
||||
final TextView title, ownername, description, createdAt;
|
||||
final TextView memberCount, subscriberCount;
|
||||
|
||||
|
@ -171,6 +199,7 @@ public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
|
|||
super(v);
|
||||
pb_image = v.findViewById(R.id.list_owner_profile);
|
||||
followList = v.findViewById(R.id.list_follow);
|
||||
deleteList = v.findViewById(R.id.list_delete);
|
||||
title = v.findViewById(R.id.list_title);
|
||||
ownername = v.findViewById(R.id.list_ownername);
|
||||
description = v.findViewById(R.id.list_description);
|
||||
|
@ -187,7 +216,8 @@ public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
|
|||
PROFILE,
|
||||
FOLLOW,
|
||||
SUBSCRIBER,
|
||||
MEMBER
|
||||
MEMBER,
|
||||
DELETE
|
||||
}
|
||||
|
||||
void onClick(TwitterList listItem, Action action);
|
||||
|
|
|
@ -22,6 +22,7 @@ public class ListLoader extends AsyncTask<Long, Void, List<TwitterList>> {
|
|||
public enum Action {
|
||||
LOAD,
|
||||
FOLLOW,
|
||||
DELETE
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
@ -46,18 +47,23 @@ public class ListLoader extends AsyncTask<Long, Void, List<TwitterList>> {
|
|||
|
||||
@Override
|
||||
protected List<TwitterList> doInBackground(Long[] param) {
|
||||
List<TwitterList> result;
|
||||
try {
|
||||
switch (action) {
|
||||
case LOAD:
|
||||
return mTwitter.getUserList(param[0]);
|
||||
result = mTwitter.getUserList(param[0]);
|
||||
return result;
|
||||
|
||||
case FOLLOW:
|
||||
TwitterList list = mTwitter.followUserList(param[0]);
|
||||
List<TwitterList> result = new ArrayList<>(1);
|
||||
result.add(list);
|
||||
result = new ArrayList<>(1);
|
||||
result.add(mTwitter.followUserList(param[0]));
|
||||
return result;
|
||||
|
||||
case DELETE:
|
||||
result = new ArrayList<>(1);
|
||||
result.add(mTwitter.deleteUserList(param[0]));
|
||||
return result;
|
||||
}
|
||||
|
||||
} catch (TwitterEngine.EngineException twException) {
|
||||
this.twException = twException;
|
||||
}
|
||||
|
@ -81,6 +87,12 @@ public class ListLoader extends AsyncTask<Long, Void, List<TwitterList>> {
|
|||
else
|
||||
Toast.makeText(ui.get().getContext(), R.string.info_unfollowed, LENGTH_SHORT).show();
|
||||
break;
|
||||
|
||||
case DELETE:
|
||||
list = result.get(0);
|
||||
adapter.removeItem(list.getId());
|
||||
Toast.makeText(ui.get().getContext(), R.string.info_list_removed, LENGTH_SHORT).show();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (twException != null)
|
||||
|
|
|
@ -57,8 +57,10 @@ public class MessageLoader extends AsyncTask<Long, Void, List<Message>> {
|
|||
switch (mode) {
|
||||
case DB:
|
||||
List<Message> messages = db.getMessages();
|
||||
if (messages.isEmpty())
|
||||
if (messages.isEmpty()) {
|
||||
messages = mTwitter.getMessages();
|
||||
db.storeMessage(messages);
|
||||
}
|
||||
return messages;
|
||||
|
||||
case LOAD:
|
||||
|
|
|
@ -803,6 +803,20 @@ public class TwitterEngine {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete User list
|
||||
*
|
||||
* @param listId ID of the list
|
||||
* @return List information
|
||||
* @throws EngineException if access is unavailable
|
||||
*/
|
||||
TwitterList deleteUserList(long listId) throws EngineException {
|
||||
try {
|
||||
return new TwitterList(twitter.destroyUserList(listId), twitterID);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get subscriber of a user list
|
||||
|
|
|
@ -17,7 +17,7 @@ public class TwitterList {
|
|||
private final TwitterUser owner;
|
||||
private final boolean isPrivate;
|
||||
private final boolean isFollowing;
|
||||
private final boolean enableFollow;
|
||||
private final boolean isOwner;
|
||||
private final int memberCount;
|
||||
private final int subscriberCnt;
|
||||
|
||||
|
@ -30,7 +30,7 @@ public class TwitterList {
|
|||
isPrivate = !list.isPublic();
|
||||
memberCount = list.getMemberCount();
|
||||
subscriberCnt = list.getSubscriberCount();
|
||||
enableFollow = homeId != owner.getId();
|
||||
isOwner = homeId != owner.getId();
|
||||
this.isFollowing = isFollowing;
|
||||
}
|
||||
|
||||
|
@ -120,12 +120,12 @@ public class TwitterList {
|
|||
}
|
||||
|
||||
/**
|
||||
* return if current user can follow list
|
||||
* check if list is owned by current user
|
||||
*
|
||||
* @return true if user can follow list
|
||||
* @return true if current user is owner
|
||||
*/
|
||||
public boolean enableFollow() {
|
||||
return enableFollow;
|
||||
public boolean isListOwner() {
|
||||
return isOwner;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.nuclearfog.twidda.fragment;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -8,12 +9,14 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog.Builder;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
|
||||
|
||||
import org.nuclearfog.twidda.R;
|
||||
import org.nuclearfog.twidda.activity.ListDetail;
|
||||
import org.nuclearfog.twidda.activity.UserDetail;
|
||||
import org.nuclearfog.twidda.activity.UserProfile;
|
||||
|
@ -31,6 +34,7 @@ import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_ID;
|
|||
import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_MODE;
|
||||
import static org.nuclearfog.twidda.activity.UserDetail.UserType.SUBSCRIBER;
|
||||
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
|
||||
import static org.nuclearfog.twidda.backend.ListLoader.Action.DELETE;
|
||||
import static org.nuclearfog.twidda.backend.ListLoader.Action.FOLLOW;
|
||||
import static org.nuclearfog.twidda.backend.ListLoader.Action.LOAD;
|
||||
|
||||
|
@ -92,7 +96,7 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli
|
|||
|
||||
|
||||
@Override
|
||||
public void onClick(TwitterList listItem, Action action) {
|
||||
public void onClick(final TwitterList listItem, Action action) {
|
||||
if (!reloadLayout.isRefreshing()) {
|
||||
switch (action) {
|
||||
case PROFILE:
|
||||
|
@ -102,7 +106,21 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli
|
|||
break;
|
||||
|
||||
case FOLLOW:
|
||||
if (listTask != null && listTask.getStatus() != RUNNING) {
|
||||
if (listItem.isFollowing()) {
|
||||
if (getContext() != null) {
|
||||
Builder confirmDialog = new Builder(getContext());
|
||||
confirmDialog.setMessage(R.string.confirm_unfollow_list);
|
||||
confirmDialog.setNegativeButton(R.string.no_confirm, null);
|
||||
confirmDialog.setPositiveButton(R.string.yes_confirm, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
listTask = new ListLoader(ListFragment.this, FOLLOW);
|
||||
listTask.execute(listItem.getId());
|
||||
}
|
||||
});
|
||||
confirmDialog.show();
|
||||
}
|
||||
} else {
|
||||
listTask = new ListLoader(this, FOLLOW);
|
||||
listTask.execute(listItem.getId());
|
||||
}
|
||||
|
@ -121,6 +139,22 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli
|
|||
list.putExtra(KEY_LISTDETAIL_NAME, listItem.getTitle());
|
||||
startActivity(list);
|
||||
break;
|
||||
|
||||
case DELETE:
|
||||
if (getContext() != null) {
|
||||
Builder confirmDialog = new Builder(getContext());
|
||||
confirmDialog.setMessage(R.string.confirm_delete_list);
|
||||
confirmDialog.setNegativeButton(R.string.no_confirm, null);
|
||||
confirmDialog.setPositiveButton(R.string.yes_confirm, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
listTask = new ListLoader(ListFragment.this, DELETE);
|
||||
listTask.execute(listItem.getId());
|
||||
}
|
||||
});
|
||||
confirmDialog.show();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.nuclearfog.twidda.fragment;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
@ -10,6 +11,7 @@ import android.view.ViewGroup;
|
|||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog.Builder;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
@ -34,7 +36,6 @@ import static org.nuclearfog.twidda.activity.MessagePopup.KEY_DM_PREFIX;
|
|||
import static org.nuclearfog.twidda.activity.SearchPage.KEY_SEARCH_QUERY;
|
||||
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
|
||||
|
||||
|
||||
public class MessageFragment extends Fragment implements OnRefreshListener, OnItemSelected {
|
||||
|
||||
private MessageLoader messageTask;
|
||||
|
@ -107,7 +108,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
|
|||
|
||||
|
||||
@Override
|
||||
public void onClick(Message message, Action action) {
|
||||
public void onClick(final Message message, Action action) {
|
||||
if (reload != null && !reload.isRefreshing()) {
|
||||
switch (action) {
|
||||
case ANSWER:
|
||||
|
@ -117,8 +118,19 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
|
|||
break;
|
||||
|
||||
case DELETE:
|
||||
messageTask = new MessageLoader(this, Mode.DEL);
|
||||
messageTask.execute(message.getId());
|
||||
if (getContext() != null) {
|
||||
Builder confirmDialog = new Builder(getContext());
|
||||
confirmDialog.setMessage(R.string.confirm_delete_message);
|
||||
confirmDialog.setNegativeButton(R.string.no_confirm, null);
|
||||
confirmDialog.setPositiveButton(R.string.yes_confirm, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
messageTask = new MessageLoader(MessageFragment.this, Mode.DEL);
|
||||
messageTask.execute(message.getId());
|
||||
}
|
||||
});
|
||||
confirmDialog.show();
|
||||
}
|
||||
break;
|
||||
|
||||
case PROFILE:
|
||||
|
|
|
@ -127,6 +127,21 @@
|
|||
android:singleLine="true"
|
||||
android:text="@string/follow"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/list_delete"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/list_button_height"
|
||||
android:layout_margin="@dimen/listitem_margin"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button"
|
||||
android:drawablePadding="@dimen/padding_drawable"
|
||||
android:singleLine="true"
|
||||
android:text="@string/delete_list"
|
||||
android:textSize="12sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -142,4 +142,9 @@
|
|||
<string name="error_no_card_app">Keine Karten App gefunden!</string>
|
||||
<string name="error_no_media_app">Keine Galerie App gefunden!</string>
|
||||
<string name="error_wrong_ip">Falsche IP Adresse!</string>
|
||||
<string name="info_list_removed">Liste gelöscht!</string>
|
||||
<string name="delete_list">Liste löschen</string>
|
||||
<string name="confirm_delete_list">Listelöschen?</string>
|
||||
<string name="confirm_delete_message">Nachricht löschen?</string>
|
||||
<string name="confirm_unfollow_list">Liste entfolgen?</string>
|
||||
</resources>
|
|
@ -143,4 +143,9 @@
|
|||
<string name="error_no_card_app">No card app installed!</string>
|
||||
<string name="error_no_media_app">No media app found!</string>
|
||||
<string name="error_wrong_ip">wrong IP address!</string>
|
||||
<string name="info_list_removed">List removed!</string>
|
||||
<string name="delete_list">delete list</string>
|
||||
<string name="confirm_delete_list">Delete list?</string>
|
||||
<string name="confirm_delete_message">Delete message?</string>
|
||||
<string name="confirm_unfollow_list">Unfollow list?</string>
|
||||
</resources>
|
Loading…
Reference in New Issue