This commit is contained in:
NudeDude 2019-06-02 13:15:51 +02:00
parent e115828fb5
commit e920eb1547
18 changed files with 149 additions and 75 deletions

View File

@ -5,7 +5,7 @@
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
</configurations>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@ -12,6 +12,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.window.MessagePopup;
import java.lang.ref.WeakReference;

View File

@ -19,6 +19,7 @@ import androidx.annotation.NonNull;
import com.squareup.picasso.Picasso;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.window.MediaViewer;

View File

@ -16,6 +16,7 @@ import com.squareup.picasso.Picasso;
import org.nuclearfog.tag.Tagger;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;

View File

@ -18,6 +18,9 @@ import com.squareup.picasso.Picasso;
import org.nuclearfog.tag.Tagger;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.helper.FilenameTools;
import org.nuclearfog.twidda.backend.helper.FilenameTools.FileType;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
@ -32,6 +35,7 @@ import java.text.SimpleDateFormat;
import twitter4j.TwitterException;
import static android.view.View.VISIBLE;
import static org.nuclearfog.twidda.fragment.TweetListFragment.RETURN_TWEET_CHANGED;
import static org.nuclearfog.twidda.window.MediaViewer.KEY_MEDIA_LINK;
import static org.nuclearfog.twidda.window.MediaViewer.KEY_MEDIA_TYPE;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.ANGIF;
@ -39,7 +43,6 @@ import static org.nuclearfog.twidda.window.MediaViewer.MediaType.IMAGE;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.VIDEO;
import static org.nuclearfog.twidda.window.TweetDetail.KEY_TWEET_ID;
import static org.nuclearfog.twidda.window.TweetDetail.KEY_TWEET_NAME;
import static org.nuclearfog.twidda.window.TweetDetail.STAT_CHANGED;
public class StatusLoader extends AsyncTask<Long, Void, Void> {
@ -177,22 +180,10 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
scrName.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
if (tweet.hasMedia()) {
String ext = "";
String path = tweet.getMediaLinks()[0];
int start = path.lastIndexOf(".") + 1;
if (start > 0 && start < path.length()) {
int end = path.lastIndexOf("?");
if (end > 0)
ext = path.substring(start, end);
else
ext = path.substring(start);
ext = ext.toLowerCase();
}
String firstLink = tweet.getMediaLinks()[0];
FileType ext = FilenameTools.getFileType(firstLink);
switch (ext) {
case "png":
case "jpg":
case "jpeg":
case IMAGE:
View imageButton = ui.get().findViewById(R.id.image_attach);
imageButton.setVisibility(VISIBLE);
imageButton.setOnClickListener(new OnClickListener() {
@ -206,7 +197,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
});
break;
case "mp4":
case VIDEO:
View videoButton = ui.get().findViewById(R.id.video_attach);
videoButton.setVisibility(VISIBLE);
videoButton.setOnClickListener(new OnClickListener() {
@ -220,7 +211,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
});
break;
case "m3u8":
case STREAM:
videoButton = ui.get().findViewById(R.id.video_attach);
videoButton.setVisibility(VISIBLE);
videoButton.setOnClickListener(new OnClickListener() {
@ -274,7 +265,6 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
});
}
}
if (toggleImg) {
Picasso.get().load(tweet.getUser().getImageLink() + "_bigger").into(profile_img);
}
@ -289,7 +279,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
favoriteButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.favorite, 0, 0, 0);
}
if (tweet.getUser().getId() == homeId) {
ui.get().enableDelete();
ui.get().setIsHome();
}
}
@ -301,11 +291,14 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
if (!failure) {
if (mode == Mode.DELETE) {
Toast.makeText(ui.get(), R.string.tweet_removed, Toast.LENGTH_SHORT).show();
ui.get().setResult(STAT_CHANGED);
ui.get().setResult(RETURN_TWEET_CHANGED);
ui.get().finish();
}
} else {
if (err != null) {
int rCode = err.getErrorCode();
if (rCode == 144 || rCode == 34 || rCode == 63)
ui.get().setResult(RETURN_TWEET_CHANGED);
boolean killActivity = ErrorHandler.printError(ui.get(), err);
if (killActivity)
ui.get().finish();

View File

@ -14,6 +14,7 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.TweetHolder;
import org.nuclearfog.twidda.window.TweetPopup;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.backend;
package org.nuclearfog.twidda.backend.helper;
import android.content.Context;
import android.net.ConnectivityManager;
@ -21,7 +21,6 @@ public abstract class ErrorHandler {
* @return if Activity should shut down
*/
public static boolean printError(Context c, @NonNull TwitterException error) {
switch (error.getErrorCode()) {
case 88:
case 420: //
@ -50,10 +49,10 @@ public abstract class ErrorHandler {
Toast.makeText(c, R.string.cant_send_dm, Toast.LENGTH_SHORT).show();
break;
case 179:
case 136:
case 179:
Toast.makeText(c, R.string.not_authorized, Toast.LENGTH_SHORT).show();
break;
return true;
case 186:
Toast.makeText(c, R.string.status_too_long, Toast.LENGTH_SHORT).show();

View File

@ -0,0 +1,80 @@
package org.nuclearfog.twidda.backend.helper;
import androidx.annotation.NonNull;
public abstract class FilenameTools {
public enum FileType {
IMAGE,
VIDEO,
STREAM,
ANGIF,
NONE
}
public static String getExtension(@NonNull String path) {
String filename = getFilename(path);
String ext = "";
int start = lastIndexOf(filename, '.') + 1;
if (start > 0 && start < filename.length()) {
int end = lastIndexOf(filename, '?');
if (end > 0)
ext = filename.substring(start, end);
else
ext = filename.substring(start);
ext = asciiLowerCase(ext);
}
return ext;
}
public static String getFilename(@NonNull String path) {
String filename = "";
int end = lastIndexOf(path, '/') + 1;
if (end > 0 && end < path.length())
filename = path.substring(end);
return filename;
}
public static FileType getFileType(String path) {
String ext = getExtension(path);
switch (ext) {
case "png":
case "jpg":
case "jpeg":
return FileType.IMAGE;
case "mp4":
case "3gp":
return FileType.VIDEO;
case "m3u8":
return FileType.STREAM;
case "gif":
return FileType.ANGIF;
default:
return FileType.NONE;
}
}
private static String asciiLowerCase(String ext) {
StringBuilder result = new StringBuilder();
for (int index = 0; index < ext.length(); index++) {
char current = ext.charAt(index);
if (current >= 'A' && current <= 'Z')
current += 0x20;
result.append(current);
}
return result.toString();
}
private static int lastIndexOf(String text, char symbol) {
int position = 0;
for (int index = 0; index < text.length(); index++) {
if (text.charAt(index) == symbol)
position = index;
}
return position;
}
}

View File

@ -2,6 +2,10 @@ package org.nuclearfog.twidda.backend.items;
import androidx.annotation.NonNull;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.backend.helper.FilenameTools;
import org.nuclearfog.twidda.backend.helper.FilenameTools.FileType;
public class TweetHolder {
private final String text;
@ -18,28 +22,22 @@ public class TweetHolder {
}
public TweetHolder(String text, long replyId, @NonNull String[] mediaLinks) {
if (BuildConfig.DEBUG && mediaLinks.length == 0)
throw new AssertionError("media array is empty!");
this.text = text;
this.replyId = replyId;
String ext = "";
String path = mediaLinks[0];
int pos = path.lastIndexOf(".") + 1;
if (pos > 0 && pos < path.length()) {
ext = path.substring(pos);
ext = ext.toLowerCase();
}
FileType type = FilenameTools.getFileType(mediaLinks[0]);
switch (ext) {
case "mp4":
case "3gp":
switch (type) {
case VIDEO:
imageLink = new String[0];
videoLink = mediaLinks[0];
break;
case "jpg":
case "jpeg":
case "gif":
case "png":
case ANGIF:
case IMAGE:
videoLink = "";
imageLink = mediaLinks;
break;

View File

@ -60,8 +60,8 @@ public class MessageListFragment extends Fragment implements OnRefreshListener,
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
if (messageTask == null) {
messageTask = new MessageLoader(root, Mode.DB);
messageTask.execute();
@ -70,10 +70,10 @@ public class MessageListFragment extends Fragment implements OnRefreshListener,
@Override
public void onStop() {
super.onStop();
public void onPause() {
if (messageTask != null && messageTask.getStatus() == RUNNING)
messageTask.cancel(true);
super.onPause();
}

View File

@ -59,8 +59,8 @@ public class TrendListFragment extends Fragment implements OnRefreshListener, On
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
if (trendTask == null) {
trendTask = new TrendLoader(root, Mode.DB_TRND);
trendTask.execute();
@ -69,10 +69,10 @@ public class TrendListFragment extends Fragment implements OnRefreshListener, On
@Override
public void onStop() {
public void onPause() {
if (trendTask != null && trendTask.getStatus() == RUNNING)
trendTask.cancel(true);
super.onStop();
super.onPause();
}

View File

@ -34,6 +34,9 @@ public class TweetListFragment extends Fragment implements OnRefreshListener, On
public static final String KEY_FRAG_TWEET_ID = "ID";
public static final String KEY_FRAG_TWEET_FIX = "fix";
public static final int REQUEST_TWEET_CHANGED = 3;
public static final int RETURN_TWEET_CHANGED = 4;
public enum TweetType {
HOME,
MENT,
@ -89,8 +92,8 @@ public class TweetListFragment extends Fragment implements OnRefreshListener, On
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
if (tweetTask == null) {
switch (mode) {
@ -128,10 +131,18 @@ public class TweetListFragment extends Fragment implements OnRefreshListener, On
@Override
public void onStop() {
public void onPause() {
if (tweetTask != null && tweetTask.getStatus() == RUNNING)
tweetTask.cancel(true);
super.onStop();
super.onPause();
}
@Override
public void onActivityResult(int reqCode, int returnCode, Intent i) {
if (reqCode == REQUEST_TWEET_CHANGED && returnCode == RETURN_TWEET_CHANGED)
tweetTask = null;
super.onActivityResult(reqCode, returnCode, i);
}
@ -185,7 +196,7 @@ public class TweetListFragment extends Fragment implements OnRefreshListener, On
Intent tweetIntent = new Intent(getContext(), TweetDetail.class);
tweetIntent.putExtra("tweetID", tweet.getId());
tweetIntent.putExtra("username", tweet.getUser().getScreenname());
startActivity(tweetIntent);
startActivityForResult(tweetIntent, REQUEST_TWEET_CHANGED);
}
}

View File

@ -86,8 +86,8 @@ public class UserListFragment extends Fragment implements OnRefreshListener, OnI
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
if (userTask == null) {
load();
}
@ -95,10 +95,10 @@ public class UserListFragment extends Fragment implements OnRefreshListener, OnI
@Override
public void onStop() {
public void onPause() {
if (userTask != null && userTask.getStatus() == RUNNING)
userTask.cancel(true);
super.onStop();
super.onPause();
}

View File

@ -10,8 +10,8 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.Message;
import org.nuclearfog.twidda.database.DatabaseAdapter;

View File

@ -10,8 +10,8 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.Trend;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;

View File

@ -10,8 +10,8 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;

View File

@ -10,8 +10,8 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import java.lang.ref.WeakReference;

View File

@ -50,8 +50,6 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
public static final String KEY_TWEET_ID = "tweetID";
public static final String KEY_TWEET_NAME = "username";
public static final int STAT_CHANGED = 1;
private static final int TWEET = 2;
private ConnectivityManager mConnect;
private StatusLoader statusAsync;
@ -119,18 +117,9 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
@Override
protected void onStop() {
super.onStop();
if (statusAsync != null && statusAsync.getStatus() == RUNNING)
statusAsync.cancel(true);
super.onStop();
}
@Override
protected void onActivityResult(int reqCode, int returnCode, Intent i) {
if (reqCode == TWEET && returnCode == STAT_CHANGED) { // TODO reinitialize list
statusAsync = null;
}
super.onActivityResult(reqCode, returnCode, i);
}
@ -201,7 +190,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
Intent tweet = new Intent(this, TweetPopup.class);
tweet.putExtra(KEY_TWEETPOPUP_REPLYID, tweetID);
tweet.putExtra(KEY_TWEETPOPUP_ADDITION, username);
startActivityForResult(tweet, TWEET);
startActivity(tweet);
break;
case R.id.tweet_retweet:
@ -251,7 +240,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
}
public void enableDelete() {
public void setIsHome() {
isHome = true;
invalidateOptionsMenu();
}