removed UI access from AsyncTask

This commit is contained in:
nuclearfog 2020-05-24 12:03:07 +02:00
parent 94dd7b64b5
commit e7077416b3
No known key found for this signature in database
GPG Key ID: ED35E22099354A64
17 changed files with 227 additions and 191 deletions

View File

@ -17,7 +17,7 @@ import android.widget.ProgressBar;
import android.widget.Toast;
import android.widget.VideoView;
import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -225,16 +225,23 @@ public class MediaViewer extends AppCompatActivity implements OnImageClickListen
}
public void setImage(@Nullable Bitmap image) {
if (image != null) {
if (adapter.isEmpty()) {
changeImage(image);
image_progress.setVisibility(View.INVISIBLE);
}
adapter.addLast(image);
} else {
adapter.disableLoading();
public void onSuccess() {
adapter.disableLoading();
}
public void onError() {
Toast.makeText(this, R.string.error_image_download, Toast.LENGTH_SHORT).show();
finish();
}
public void setImage(@NonNull Bitmap image) {
if (adapter.isEmpty()) {
changeImage(image);
image_progress.setVisibility(View.INVISIBLE);
}
adapter.addLast(image);
}

View File

@ -1,7 +1,9 @@
package org.nuclearfog.twidda.activity;
import android.Manifest;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.database.Cursor;
import android.os.Build;
@ -29,13 +31,14 @@ import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.AsyncTask.Status.RUNNING;
import static android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
import static android.view.Window.FEATURE_NO_TITLE;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_LINK;
import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_TYPE;
import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMG_STORAGE;
public class MessagePopup extends AppCompatActivity implements OnClickListener {
public class MessagePopup extends AppCompatActivity implements OnClickListener, OnDismissListener {
public static final String KEY_DM_PREFIX = "dm_prefix";
private static final String[] PERM_READ = {Manifest.permission.READ_EXTERNAL_STORAGE};
@ -44,6 +47,7 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener {
private MessageUploader messageAsync;
private EditText receiver, text;
private Dialog loadingCircle;
private String mediaPath = "";
@ -56,6 +60,9 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener {
View media = findViewById(R.id.dm_media);
receiver = findViewById(R.id.dm_receiver);
text = findViewById(R.id.dm_text);
loadingCircle = new Dialog(this, R.style.LoadingDialog);
View load = View.inflate(this, R.layout.item_load, null);
View cancelButton = load.findViewById(R.id.kill_button);
Bundle param = getIntent().getExtras();
if (param != null && param.containsKey(KEY_DM_PREFIX)) {
@ -67,8 +74,14 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener {
root.setBackgroundColor(settings.getPopupColor());
FontTool.setViewFontAndColor(settings, root);
loadingCircle.requestWindowFeature(FEATURE_NO_TITLE);
loadingCircle.setCanceledOnTouchOutside(false);
loadingCircle.setContentView(load);
send.setOnClickListener(this);
media.setOnClickListener(this);
cancelButton.setOnClickListener(this);
loadingCircle.setOnDismissListener(this);
}
@ -124,25 +137,53 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener {
@Override
public void onClick(View v) {
if (v.getId() == R.id.dm_send) {
String username = receiver.getText().toString();
String message = text.getText().toString();
if (!username.trim().isEmpty() && (!message.trim().isEmpty() || !mediaPath.isEmpty())) {
MessageHolder messageHolder = new MessageHolder(username, message, mediaPath);
messageAsync = new MessageUploader(this, messageHolder);
messageAsync.execute();
} else {
Toast.makeText(this, R.string.error_dm, LENGTH_SHORT).show();
}
} else if (v.getId() == R.id.dm_media) {
if (mediaPath.trim().isEmpty())
getMedia();
else {
Intent image = new Intent(this, MediaViewer.class);
image.putExtra(KEY_MEDIA_LINK, new String[]{mediaPath});
image.putExtra(KEY_MEDIA_TYPE, MEDIAVIEWER_IMG_STORAGE);
startActivity(image);
}
switch (v.getId()) {
case R.id.dm_send:
String username = receiver.getText().toString();
String message = text.getText().toString();
if (!username.trim().isEmpty() && (!message.trim().isEmpty() || !mediaPath.isEmpty())) {
MessageHolder messageHolder = new MessageHolder(username, message, mediaPath);
messageAsync = new MessageUploader(this, messageHolder);
messageAsync.execute();
} else {
Toast.makeText(this, R.string.error_dm, LENGTH_SHORT).show();
}
break;
case R.id.dm_media:
if (mediaPath.trim().isEmpty())
getMedia();
else {
Intent image = new Intent(this, MediaViewer.class);
image.putExtra(KEY_MEDIA_LINK, new String[]{mediaPath});
image.putExtra(KEY_MEDIA_TYPE, MEDIAVIEWER_IMG_STORAGE);
startActivity(image);
}
break;
case R.id.kill_button:
loadingCircle.dismiss();
break;
}
}
@Override
public void onDismiss(DialogInterface dialog) {
if (messageAsync != null && messageAsync.getStatus() == RUNNING) {
messageAsync.cancel(true);
}
}
/**
* enable or disable loading dialog
*
* @param enable true to enable dialog
*/
public void setLoading(boolean enable) {
if (enable) {
loadingCircle.show();
} else {
loadingCircle.dismiss();
}
}
@ -156,7 +197,6 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener {
/**
* called when an error occurs
*
* @param error Engine Exception
*/
public void onError(EngineException error) {

View File

@ -1,6 +1,8 @@
package org.nuclearfog.twidda.activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
@ -39,11 +41,12 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.AsyncTask.Status.RUNNING;
import static android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
import static android.view.View.INVISIBLE;
import static android.view.Window.FEATURE_NO_TITLE;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.activity.UserProfile.RETURN_PROFILE_CHANGED;
public class ProfileEditor extends AppCompatActivity implements OnClickListener {
public class ProfileEditor extends AppCompatActivity implements OnClickListener, OnDismissListener {
private static final String[] PERM_READ = {READ_EXTERNAL_STORAGE};
private static final String[] MEDIA_MODE = {MediaStore.Images.Media.DATA};
@ -55,6 +58,7 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener
private ImageView profile_image, profile_banner;
private EditText name, link, loc, bio;
private Button add_banner_btn;
private Dialog loadingCircle;
private String profileLink, bannerLink;
private boolean userSet = false;
@ -71,16 +75,27 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener
link = findViewById(R.id.edit_link);
loc = findViewById(R.id.edit_location);
bio = findViewById(R.id.edit_bio);
loadingCircle = new Dialog(this, R.style.LoadingDialog);
View load = View.inflate(this, R.layout.item_load, null);
View cancelButton = load.findViewById(R.id.kill_button);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setTitle(R.string.page_profile_edior);
GlobalSettings settings = GlobalSettings.getInstance(this);
FontTool.setViewFontAndColor(settings, root);
root.setBackgroundColor(settings.getBackgroundColor());
loadingCircle.requestWindowFeature(FEATURE_NO_TITLE);
loadingCircle.setCanceledOnTouchOutside(false);
loadingCircle.setContentView(load);
profile_image.setOnClickListener(this);
profile_banner.setOnClickListener(this);
add_banner_btn.setOnClickListener(this);
cancelButton.setOnClickListener(this);
loadingCircle.setOnDismissListener(this);
}
@ -192,6 +207,30 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener
case R.id.edit_banner:
getMedia(REQ_PROFILE_BANNER);
break;
case R.id.kill_button:
loadingCircle.dismiss();
break;
}
}
@Override
public void onDismiss(DialogInterface dialog) {
if (editorAsync != null && editorAsync.getStatus() == RUNNING) {
editorAsync.cancel(true);
}
}
/**
* enable or disable loading dialog
*
* @param enable true to enable dialog
*/
public void setLoading(boolean enable) {
if (enable) {
loadingCircle.show();
} else {
loadingCircle.dismiss();
}
}

View File

@ -1,7 +1,9 @@
package org.nuclearfog.twidda.activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.database.Cursor;
import android.location.Location;
@ -42,6 +44,7 @@ import static android.os.AsyncTask.Status.RUNNING;
import static android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.view.Window.FEATURE_NO_TITLE;
import static android.widget.Toast.LENGTH_LONG;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_LINK;
@ -51,7 +54,7 @@ import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMG_STORAGE
import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_VIDEO_STORAGE;
public class TweetPopup extends AppCompatActivity implements OnClickListener, LocationListener {
public class TweetPopup extends AppCompatActivity implements OnClickListener, LocationListener, OnDismissListener {
public static final String KEY_TWEETPOPUP_REPLYID = "tweet_replyID";
public static final String KEY_TWEETPOPUP_PREFIX = "tweet_prefix";
@ -76,6 +79,7 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo
private Location location;
private List<String> mediaPath;
private View mediaBtn, previewBtn, locationProg, locationBtn;
private Dialog loadingCircle;
private TextView imgCount;
private EditText tweetText;
private String addition = "";
@ -95,7 +99,13 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo
tweetText = findViewById(R.id.tweet_input);
imgCount = findViewById(R.id.imgcount);
locationProg = findViewById(R.id.location_progress);
loadingCircle = new Dialog(this, R.style.LoadingDialog);
View load = View.inflate(this, R.layout.item_load, null);
View cancelButton = load.findViewById(R.id.kill_button);
mLocation = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
GlobalSettings settings = GlobalSettings.getInstance(this);
mediaPath = new LinkedList<>();
Bundle param = getIntent().getExtras();
if (param != null) {
@ -103,8 +113,9 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo
addition = param.getString(KEY_TWEETPOPUP_PREFIX, "") + " ";
}
mediaPath = new LinkedList<>();
GlobalSettings settings = GlobalSettings.getInstance(this);
loadingCircle.requestWindowFeature(FEATURE_NO_TITLE);
loadingCircle.setCanceledOnTouchOutside(false);
loadingCircle.setContentView(load);
FontTool.setViewFontAndColor(settings, root);
root.setBackgroundColor(settings.getPopupColor());
tweetText.append(addition);
@ -114,6 +125,8 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo
mediaBtn.setOnClickListener(this);
previewBtn.setOnClickListener(this);
locationBtn.setOnClickListener(this);
cancelButton.setOnClickListener(this);
loadingCircle.setOnDismissListener(this);
}
@ -258,6 +271,10 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo
case R.id.tweet_add_location:
getLocation();
break;
case R.id.kill_button:
loadingCircle.dismiss();
break;
}
}
@ -289,6 +306,26 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo
locationBtn.setVisibility(VISIBLE);
}
@Override
public void onDismiss(DialogInterface dialog) {
if (uploaderAsync != null && uploaderAsync.getStatus() == RUNNING) {
uploaderAsync.cancel(true);
}
}
/**
* enable or disable loading dialog
*
* @param enable true to enable dialog
*/
public void setLoading(boolean enable) {
if (enable) {
loadingCircle.show();
} else {
loadingCircle.dismiss();
}
}
/**
* called after sending tweet
*/

View File

@ -3,11 +3,9 @@ package org.nuclearfog.twidda.backend;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.Toast;
import androidx.annotation.NonNull;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.MediaViewer;
import java.io.InputStream;
@ -26,7 +24,7 @@ public class ImageLoader extends AsyncTask<String, Bitmap, Boolean> {
}
private WeakReference<MediaViewer> ui;
private Action action;
private final Action action;
/**
@ -82,10 +80,9 @@ public class ImageLoader extends AsyncTask<String, Bitmap, Boolean> {
protected void onPostExecute(Boolean success) {
if (ui.get() != null) {
if (success) {
ui.get().setImage(null);
ui.get().onSuccess();
} else {
Toast.makeText(ui.get(), R.string.error_image_download, Toast.LENGTH_SHORT).show();
ui.get().finish();
ui.get().onError();
}
}
}

View File

@ -20,7 +20,7 @@ import java.util.List;
*/
public class MessageListLoader extends AsyncTask<Long, Void, List<Message>> {
public enum Mode {
public enum Action {
DB,
LOAD,
DEL
@ -28,18 +28,18 @@ public class MessageListLoader extends AsyncTask<Long, Void, List<Message>> {
@Nullable
private EngineException twException;
private Mode mode;
private WeakReference<MessageFragment> ui;
private TwitterEngine mTwitter;
private AppDatabase db;
private Action action;
private long id;
public MessageListLoader(MessageFragment fragment, Mode mode) {
public MessageListLoader(MessageFragment fragment, Action action) {
ui = new WeakReference<>(fragment);
db = new AppDatabase(fragment.getContext());
mTwitter = TwitterEngine.getInstance(fragment.getContext());
this.mode = mode;
this.action = action;
}
@ -55,7 +55,7 @@ public class MessageListLoader extends AsyncTask<Long, Void, List<Message>> {
protected List<Message> doInBackground(Long[] param) {
long messageId = 0;
try {
switch (mode) {
switch (action) {
case DB:
List<Message> messages = db.getMessages();
if (messages.isEmpty()) {
@ -98,7 +98,7 @@ public class MessageListLoader extends AsyncTask<Long, Void, List<Message>> {
if (twException.statusNotFound()) {
ui.get().removeItem(id);
}
} else if (mode == Mode.DEL) {
} else if (action == Action.DEL) {
ui.get().removeItem(id);
}
ui.get().setRefresh(false);

View File

@ -1,16 +1,10 @@
package org.nuclearfog.twidda.backend;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.view.View;
import android.view.Window;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.MessagePopup;
import org.nuclearfog.twidda.backend.engine.EngineException;
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
@ -27,7 +21,6 @@ public class MessageUploader extends AsyncTask<Void, Void, Boolean> {
@Nullable
private EngineException twException;
private WeakReference<MessagePopup> ui;
private WeakReference<Dialog> popup;
private TwitterEngine mTwitter;
private MessageHolder message;
@ -38,40 +31,16 @@ public class MessageUploader extends AsyncTask<Void, Void, Boolean> {
* @param message message to send
*/
public MessageUploader(@NonNull MessagePopup context, MessageHolder message) {
ui = new WeakReference<>(context);
popup = new WeakReference<>(new Dialog(context));
mTwitter = TwitterEngine.getInstance(context);
ui = new WeakReference<>(context);
this.message = message;
}
@Override
protected void onPreExecute() {
if (popup.get() != null && ui.get() != null) {
final Dialog window = popup.get();
window.requestWindowFeature(Window.FEATURE_NO_TITLE);
window.setCanceledOnTouchOutside(false);
if (window.getWindow() != null)
window.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
View load = View.inflate(ui.get(), R.layout.item_load, null);
View cancelButton = load.findViewById(R.id.kill_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
window.dismiss();
}
});
window.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (getStatus() == Status.RUNNING) {
Toast.makeText(ui.get(), android.R.string.cancel, Toast.LENGTH_SHORT).show();
cancel(true);
}
}
});
window.setContentView(load);
window.show();
if (ui.get() != null) {
ui.get().setLoading(true);
}
}
@ -92,8 +61,8 @@ public class MessageUploader extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPostExecute(Boolean success) {
if (ui.get() != null && popup.get() != null) {
popup.get().dismiss();
if (ui.get() != null) {
ui.get().setLoading(false);
if (success) {
ui.get().onSuccess();
} else if (twException != null) {
@ -101,11 +70,4 @@ public class MessageUploader extends AsyncTask<Void, Void, Boolean> {
}
}
}
@Override
protected void onCancelled() {
if (popup.get() != null)
popup.get().dismiss();
}
}

View File

@ -27,11 +27,12 @@ public class ProfileLoader extends AsyncTask<Long, TwitterUser, UserProperties>
ACTION_MUTE
}
private final Action action;
@Nullable
private EngineException twException;
private WeakReference<UserProfile> ui;
private TwitterEngine mTwitter;
private EngineException twException;
private AppDatabase db;
private final Action action;
public ProfileLoader(@NonNull UserProfile context, Action action) {

View File

@ -1,10 +1,6 @@
package org.nuclearfog.twidda.backend;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.view.Window;
import android.widget.ProgressBar;
import androidx.annotation.Nullable;
@ -17,7 +13,6 @@ import org.nuclearfog.twidda.database.AppDatabase;
import java.lang.ref.WeakReference;
/**
* Task for editing profile information and updating images
*
@ -25,17 +20,16 @@ import java.lang.ref.WeakReference;
*/
public class ProfileUpdater extends AsyncTask<Void, Void, TwitterUser> {
@Nullable
private EngineException twException;
private WeakReference<ProfileEditor> ui;
private WeakReference<Dialog> popup;
private UserHolder userHolder;
private TwitterEngine mTwitter;
private EngineException twException;
private AppDatabase db;
public ProfileUpdater(ProfileEditor context) {
ui = new WeakReference<>(context);
popup = new WeakReference<>(new Dialog(context));
mTwitter = TwitterEngine.getInstance(context);
db = new AppDatabase(ui.get());
}
@ -49,23 +43,8 @@ public class ProfileUpdater extends AsyncTask<Void, Void, TwitterUser> {
@Override
protected void onPreExecute() {
if (popup.get() != null && ui.get() != null) {
Dialog window = popup.get();
window.requestWindowFeature(Window.FEATURE_NO_TITLE);
window.setCanceledOnTouchOutside(false);
window.setContentView(new ProgressBar(ui.get()));
if (window.getWindow() != null)
window.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
window.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (getStatus() == Status.RUNNING) {
cancel(true);
ui.get().finish();
}
}
});
window.show();
if (ui.get() != null) {
ui.get().setLoading(true);
}
}
@ -90,8 +69,8 @@ public class ProfileUpdater extends AsyncTask<Void, Void, TwitterUser> {
@Override
protected void onPostExecute(@Nullable TwitterUser user) {
if (ui.get() != null && popup.get() != null) {
popup.get().dismiss();
if (ui.get() != null) {
ui.get().setLoading(false);
if (twException != null) {
ui.get().setError(twException);
} else if (user != null) {

View File

@ -13,6 +13,8 @@ import org.nuclearfog.twidda.fragment.TweetFragment;
import java.lang.ref.WeakReference;
import java.util.List;
import static org.nuclearfog.twidda.fragment.TweetFragment.LIST_EMPTY;
/**
* Background task to download a list of tweets from different sources
@ -21,7 +23,7 @@ import java.util.List;
*/
public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
public enum Mode {
public enum Action {
TL_HOME,
TL_MENT,
USR_TWEETS,
@ -37,16 +39,16 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
private WeakReference<TweetFragment> ui;
private TwitterEngine mTwitter;
private AppDatabase db;
private Mode mode;
private Action action;
private long sinceId;
public TweetListLoader(TweetFragment fragment, Mode mode) {
public TweetListLoader(TweetFragment fragment, Action action) {
ui = new WeakReference<>(fragment);
db = new AppDatabase(fragment.getContext());
mTwitter = TwitterEngine.getInstance(fragment.getContext());
sinceId = fragment.getTopId();
this.mode = mode;
this.action = action;
}
@ -62,10 +64,10 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
protected List<Tweet> doInBackground(Object[] param) {
List<Tweet> tweets = null;
try {
switch (mode) {
switch (action) {
case TL_HOME:
int page = (int) param[0];
if (sinceId == 0) {
if (sinceId == LIST_EMPTY) {
tweets = db.getHomeTimeline();
if (tweets.isEmpty()) {
tweets = mTwitter.getHome(page, sinceId);
@ -79,7 +81,7 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
case TL_MENT:
page = (int) param[0];
if (sinceId == 0) {
if (sinceId == LIST_EMPTY) {
tweets = db.getMentions();
if (tweets.isEmpty()) {
tweets = mTwitter.getMention(page, sinceId);
@ -94,7 +96,7 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
case USR_TWEETS:
long id = (long) param[0];
page = (int) param[1];
if (sinceId == 0) {
if (sinceId == LIST_EMPTY) {
tweets = db.getUserTweets(id);
if (tweets.isEmpty()) {
tweets = mTwitter.getUserTweets(id, sinceId, page);
@ -109,7 +111,7 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
case USR_FAVORS:
id = (long) param[0];
page = (int) param[1];
if (sinceId == 0) {
if (sinceId == LIST_EMPTY) {
tweets = db.getUserFavs(id);
if (tweets.isEmpty()) {
tweets = mTwitter.getUserFavs(id, page);
@ -129,7 +131,7 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
case TWEET_ANS:
id = (long) param[0];
String search = (String) param[1];
if (sinceId == 0) {
if (sinceId == LIST_EMPTY) {
tweets = db.getAnswers(id);
if (tweets.isEmpty()) {
tweets = mTwitter.getAnswers(search, id, sinceId);
@ -168,7 +170,7 @@ public class TweetListLoader extends AsyncTask<Object, Void, List<Tweet>> {
if (ui.get() != null) {
ui.get().setRefresh(false);
if (tweets != null) {
if (mode == Mode.USR_FAVORS)
if (action == Action.USR_FAVORS)
ui.get().add(tweets);
else
ui.get().addTop(tweets);

View File

@ -1,15 +1,10 @@
package org.nuclearfog.twidda.backend;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.TweetPopup;
import org.nuclearfog.twidda.backend.engine.EngineException;
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
@ -17,9 +12,6 @@ import org.nuclearfog.twidda.backend.items.TweetHolder;
import java.lang.ref.WeakReference;
import static android.os.AsyncTask.Status.RUNNING;
import static android.view.Window.FEATURE_NO_TITLE;
/**
* Background task for uploading tweet
* @see TweetPopup
@ -29,7 +21,6 @@ public class TweetUploader extends AsyncTask<Void, Void, Boolean> {
@Nullable
private EngineException twException;
private WeakReference<TweetPopup> ui;
private WeakReference<Dialog> popup;
private TwitterEngine mTwitter;
private TweetHolder tweet;
@ -41,7 +32,6 @@ public class TweetUploader extends AsyncTask<Void, Void, Boolean> {
*/
public TweetUploader(@NonNull TweetPopup context, TweetHolder tweet) {
ui = new WeakReference<>(context);
popup = new WeakReference<>(new Dialog(context));
mTwitter = TwitterEngine.getInstance(context);
this.tweet = tweet;
}
@ -49,32 +39,8 @@ public class TweetUploader extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPreExecute() {
if (popup.get() != null && ui.get() != null) {
final Dialog loadingCircle = popup.get();
loadingCircle.requestWindowFeature(FEATURE_NO_TITLE);
loadingCircle.setCanceledOnTouchOutside(false);
if (loadingCircle.getWindow() != null)
loadingCircle.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
View load = View.inflate(ui.get(), R.layout.item_load, null);
View cancelButton = load.findViewById(R.id.kill_button);
loadingCircle.setContentView(load);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadingCircle.dismiss();
}
});
loadingCircle.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (ui.get() != null && getStatus() == RUNNING) {
Toast.makeText(ui.get(), android.R.string.cancel, Toast.LENGTH_SHORT).show();
cancel(true);
}
}
});
loadingCircle.show();
if (ui.get() != null) {
ui.get().setLoading(true);
}
}
@ -96,8 +62,8 @@ public class TweetUploader extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPostExecute(Boolean success) {
if (ui.get() != null && popup.get() != null) {
popup.get().dismiss();
if (ui.get() != null) {
ui.get().setLoading(false);
if (success) {
ui.get().onSuccess();
} else {

View File

@ -31,7 +31,7 @@ public class TwitterListLoader extends AsyncTask<Long, Void, List<TwitterList>>
private EngineException twException;
private WeakReference<ListFragment> ui;
private TwitterEngine mTwitter;
private Action action;
private final Action action;
public TwitterListLoader(ListFragment frag, Action action) {
mTwitter = TwitterEngine.getInstance(frag.getContext());

View File

@ -33,13 +33,13 @@ public class UserListLoader extends AsyncTask<Object, Void, List<TwitterUser>> {
private EngineException twException;
private WeakReference<UserFragment> ui;
private TwitterEngine mTwitter;
private Mode mode;
private final Mode action;
public UserListLoader(UserFragment fragment, Mode mode) {
public UserListLoader(UserFragment fragment, Mode action) {
ui = new WeakReference<>(fragment);
mTwitter = TwitterEngine.getInstance(fragment.getContext());
this.mode = mode;
this.action = action;
}
@ -53,7 +53,7 @@ public class UserListLoader extends AsyncTask<Object, Void, List<TwitterUser>> {
@Override
protected List<TwitterUser> doInBackground(Object[] param) {
try {
switch (mode) {
switch (action) {
case FOLLOWS:
return mTwitter.getFollower((long) param[0]);

View File

@ -26,7 +26,6 @@ import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.adapter.MessageAdapter.OnItemSelected;
import org.nuclearfog.twidda.backend.MessageListLoader;
import org.nuclearfog.twidda.backend.MessageListLoader.Mode;
import org.nuclearfog.twidda.backend.TrendListLoader;
import org.nuclearfog.twidda.backend.engine.EngineException;
import org.nuclearfog.twidda.backend.items.Message;
@ -71,7 +70,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
public void onStart() {
super.onStart();
if (messageTask == null)
load(Mode.DB);
load(MessageListLoader.Action.DB);
}
@ -86,7 +85,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
@Override
public void onRefresh() {
if (messageTask != null && messageTask.getStatus() != RUNNING)
load(Mode.LOAD);
load(MessageListLoader.Action.LOAD);
}
@ -136,7 +135,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
confirmDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
messageTask = new MessageListLoader(MessageFragment.this, Mode.DEL);
messageTask = new MessageListLoader(MessageFragment.this, MessageListLoader.Action.DEL);
messageTask.execute(message.getId());
}
});
@ -209,7 +208,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
}
private void load(Mode m) {
private void load(MessageListLoader.Action m) {
messageTask = new MessageListLoader(this, m);
messageTask.execute();
}

View File

@ -21,7 +21,7 @@ import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter.TweetClickListener;
import org.nuclearfog.twidda.backend.TweetListLoader;
import org.nuclearfog.twidda.backend.TweetListLoader.Mode;
import org.nuclearfog.twidda.backend.TweetListLoader.Action;
import org.nuclearfog.twidda.backend.engine.EngineException;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
@ -49,6 +49,7 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
public static final int TWEET_FRAG_ANSWER = 4;
public static final int TWEET_FRAG_SEARCH = 5;
public static final int TWEET_FRAG_LIST = 6;
public static final int LIST_EMPTY = 1;
private static final int REQUEST_TWEET_CHANGED = 3;
public static final int RETURN_TWEET_CHANGED = 4;
@ -162,13 +163,12 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
/**
* get Id of the first Tweet
*
* @return ID of the first tweet or zero if list is empty
* @return ID of the first tweet or {@link #LIST_EMPTY} if list is empty
*/
public long getTopId() {
if (adapter != null && !adapter.isEmpty())
return adapter.getItemId(0);
return 0;
return LIST_EMPTY;
}
/**
@ -230,41 +230,41 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
private void load() {
switch (mode) {
case TWEET_FRAG_HOME:
tweetTask = new TweetListLoader(this, Mode.TL_HOME);
tweetTask = new TweetListLoader(this, TweetListLoader.Action.TL_HOME);
tweetTask.execute(1);
break;
case TWEET_FRAG_MENT:
tweetTask = new TweetListLoader(this, Mode.TL_MENT);
tweetTask = new TweetListLoader(this, Action.TL_MENT);
tweetTask.execute(1);
break;
case TWEET_FRAG_TWEETS:
tweetTask = new TweetListLoader(this, Mode.USR_TWEETS);
tweetTask = new TweetListLoader(this, TweetListLoader.Action.USR_TWEETS);
tweetTask.execute(id, 1);
break;
case TWEET_FRAG_FAVORS:
tweetTask = new TweetListLoader(this, Mode.USR_FAVORS);
tweetTask = new TweetListLoader(this, Action.USR_FAVORS);
tweetTask.execute(id, 1);
break;
case TWEET_FRAG_ANSWER:
boolean loadAnswer = settings.getAnswerLoad();
if (tweetTask != null || loadAnswer)
tweetTask = new TweetListLoader(this, Mode.TWEET_ANS);
tweetTask = new TweetListLoader(this, Action.TWEET_ANS);
else
tweetTask = new TweetListLoader(this, Mode.DB_ANS);
tweetTask = new TweetListLoader(this, Action.DB_ANS);
tweetTask.execute(id, search);
break;
case TWEET_FRAG_SEARCH:
tweetTask = new TweetListLoader(this, Mode.TWEET_SEARCH);
tweetTask = new TweetListLoader(this, Action.TWEET_SEARCH);
tweetTask.execute(search);
break;
case TWEET_FRAG_LIST:
tweetTask = new TweetListLoader(this, Mode.LIST);
tweetTask = new TweetListLoader(this, TweetListLoader.Action.LIST);
tweetTask.execute(id, 1);
break;
}

View File

@ -9,7 +9,8 @@
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:layout_gravity="center" />
<ImageView
android:id="@+id/kill_button"

View File

@ -28,6 +28,12 @@
<item name="android:backgroundDimEnabled">true</item>
</style>
<style name="LoadingDialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
<style name="TransactionPending" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
<item name="android:windowExitAnimation">@android:anim/fade_out</item>