project reformat, added twitter lists

This commit is contained in:
nuclearfog 2019-12-25 17:12:56 +01:00
parent 05104df9df
commit 1bd1acf383
No known key found for this signature in database
GPG Key ID: ED35E22099354A64
51 changed files with 1119 additions and 276 deletions

View File

@ -14,8 +14,8 @@
<option name="values">
<map>
<entry key="assetSourceType" value="FILE" />
<entry key="outputName" value="location" />
<entry key="sourceFile" value="$USER_HOME$/Dokumente/Rest/Entypo SVG/location-pin.svg" />
<entry key="outputName" value="subscriber" />
<entry key="sourceFile" value="$USER_HOME$/Dokumente/Rest/Entypo SVG/eye.svg" />
</map>
</option>
</PersistentState>

View File

@ -17,7 +17,7 @@
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:name=".activity.MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
@ -29,7 +29,7 @@
</activity>
<activity
android:name=".window.SearchPage"
android:name=".activity.SearchPage"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
@ -50,27 +50,27 @@
</activity>
<activity
android:name=".window.UserProfile"
android:name=".activity.UserProfile"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".window.TweetPopup"
android:name=".activity.TweetPopup"
android:screenOrientation="portrait"
android:theme="@style/Transparency" />
<activity
android:name=".window.MessagePopup"
android:name=".activity.MessagePopup"
android:screenOrientation="portrait"
android:theme="@style/Transparency" />
<activity
android:name=".window.AppSettings"
android:name=".activity.AppSettings"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".window.TweetDetail"
android:name=".activity.TweetDetail"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
@ -87,27 +87,32 @@
</activity>
<activity
android:name=".window.UserDetail"
android:name=".activity.UserDetail"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".window.LoginPage"
android:name=".activity.LoginPage"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".window.DirectMessage"
android:name=".activity.DirectMessage"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".window.MediaViewer"
android:name=".activity.MediaViewer"
android:screenOrientation="portrait"
android:theme="@style/HalfTransparency" />
<activity
android:name=".window.ProfileSettings"
android:name=".activity.ProfileSettings"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".activity.UserList"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.app.Dialog;
import android.content.Context;
@ -42,8 +42,8 @@ import org.nuclearfog.twidda.database.GlobalSettings;
import static android.os.AsyncTask.Status.RUNNING;
import static android.view.View.GONE;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.MainActivity.APP_LOGOUT;
import static org.nuclearfog.twidda.MainActivity.DB_CLEARED;
import static org.nuclearfog.twidda.activity.MainActivity.APP_LOGOUT;
import static org.nuclearfog.twidda.activity.MainActivity.DB_CLEARED;
public class AppSettings extends AppCompatActivity implements OnClickListener,

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.Intent;
import android.os.Bundle;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.Intent;
import android.net.ConnectivityManager;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda;
package org.nuclearfog.twidda.activity;
import android.content.Intent;
import android.os.Bundle;
@ -16,16 +16,12 @@ 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.adapter.FragmentAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.window.AppSettings;
import org.nuclearfog.twidda.window.LoginPage;
import org.nuclearfog.twidda.window.SearchPage;
import org.nuclearfog.twidda.window.TweetPopup;
import org.nuclearfog.twidda.window.UserProfile;
import static org.nuclearfog.twidda.window.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.window.UserProfile.KEY_PROFILE_ID;
import static org.nuclearfog.twidda.activity.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
/**
* Main Activity

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.graphics.Bitmap;
import android.graphics.Point;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.Manifest;
import android.content.DialogInterface;
@ -27,9 +27,9 @@ 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.widget.Toast.LENGTH_SHORT;
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.IMAGE_STORAGE;
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.MediaType.IMAGE_STORAGE;
public class MessagePopup extends AppCompatActivity implements OnClickListener {

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.DialogInterface;
import android.content.Intent;
@ -36,10 +36,10 @@ 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.widget.Toast.LENGTH_SHORT;
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.IMAGE;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.IMAGE_STORAGE;
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.MediaType.IMAGE;
import static org.nuclearfog.twidda.activity.MediaViewer.MediaType.IMAGE_STORAGE;
public class ProfileSettings extends AppCompatActivity implements OnClickListener {

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.Intent;
import android.net.Uri;
@ -19,14 +19,13 @@ import com.google.android.material.tabs.TabLayout.OnTabSelectedListener;
import com.google.android.material.tabs.TabLayout.Tab;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.MainActivity;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.FragmentAdapter;
import org.nuclearfog.twidda.adapter.FragmentAdapter.AdapterType;
import org.nuclearfog.twidda.database.GlobalSettings;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.window.TweetPopup.KEY_TWEETPOPUP_PREFIX;
import static org.nuclearfog.twidda.activity.TweetPopup.KEY_TWEETPOPUP_PREFIX;
/**
* Twitter search Activity

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.ClipData;
import android.content.ClipboardManager;
@ -37,8 +37,8 @@ import com.squareup.picasso.Picasso;
import org.nuclearfog.tag.Tagger;
import org.nuclearfog.tag.Tagger.OnTagClickListener;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.MainActivity;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.UserDetail.UserType;
import org.nuclearfog.twidda.adapter.FragmentAdapter;
import org.nuclearfog.twidda.adapter.FragmentAdapter.AdapterType;
import org.nuclearfog.twidda.backend.StatusLoader;
@ -47,7 +47,6 @@ import org.nuclearfog.twidda.backend.helper.StringTools;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.window.UserDetail.UserType;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
@ -60,16 +59,16 @@ import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_SHORT;
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;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.IMAGE;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.VIDEO;
import static org.nuclearfog.twidda.window.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.window.TweetPopup.KEY_TWEETPOPUP_PREFIX;
import static org.nuclearfog.twidda.window.TweetPopup.KEY_TWEETPOPUP_REPLYID;
import static org.nuclearfog.twidda.window.UserDetail.KEY_USERLIST_ID;
import static org.nuclearfog.twidda.window.UserDetail.KEY_USERLIST_MODE;
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.MediaType.ANGIF;
import static org.nuclearfog.twidda.activity.MediaViewer.MediaType.IMAGE;
import static org.nuclearfog.twidda.activity.MediaViewer.MediaType.VIDEO;
import static org.nuclearfog.twidda.activity.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.activity.TweetPopup.KEY_TWEETPOPUP_PREFIX;
import static org.nuclearfog.twidda.activity.TweetPopup.KEY_TWEETPOPUP_REPLYID;
import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_ID;
import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_MODE;
public class TweetDetail extends AppCompatActivity implements OnClickListener, OnTouchListener,
@ -252,15 +251,15 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
case R.id.tweet_retweet:
Intent userList = new Intent(this, UserDetail.class);
userList.putExtra(KEY_USERLIST_ID, tweetID);
userList.putExtra(KEY_USERLIST_MODE, UserType.RETWEETS);
userList.putExtra(KEY_USERDETAIL_ID, tweetID);
userList.putExtra(KEY_USERDETAIL_MODE, UserType.RETWEETS);
startActivity(userList);
break;
case R.id.tweet_favorit:
userList = new Intent(this, UserDetail.class);
userList.putExtra(KEY_USERLIST_ID, tweetID);
userList.putExtra(KEY_USERLIST_MODE, UserType.FAVORITS);
userList.putExtra(KEY_USERDETAIL_ID, tweetID);
userList.putExtra(KEY_USERDETAIL_MODE, UserType.FAVORITS);
startActivity(userList);
break;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.Context;
import android.content.DialogInterface;
@ -41,11 +41,11 @@ import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_LONG;
import static android.widget.Toast.LENGTH_SHORT;
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_STORAGE;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.IMAGE_STORAGE;
import static org.nuclearfog.twidda.window.MediaViewer.MediaType.VIDEO_STORAGE;
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.MediaType.ANGIF_STORAGE;
import static org.nuclearfog.twidda.activity.MediaViewer.MediaType.IMAGE_STORAGE;
import static org.nuclearfog.twidda.activity.MediaViewer.MediaType.VIDEO_STORAGE;
public class TweetPopup extends AppCompatActivity implements OnClickListener, LocationListener {

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.os.Bundle;
import android.view.View;
@ -7,7 +7,6 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.FragmentAdapter;
import org.nuclearfog.twidda.adapter.FragmentAdapter.AdapterType;
@ -15,14 +14,15 @@ import org.nuclearfog.twidda.database.GlobalSettings;
public class UserDetail extends AppCompatActivity {
public static final String KEY_USERLIST_MODE = "userlist_mode";
public static final String KEY_USERLIST_ID = "userlist_owner_id";
public static final String KEY_USERDETAIL_MODE = "userlist_mode";
public static final String KEY_USERDETAIL_ID = "userlist_owner_id";
public enum UserType {
FRIENDS,
FOLLOWERS,
RETWEETS,
FAVORITS,
SUBSCRIBER
}
private UserType mode;
@ -34,11 +34,9 @@ public class UserDetail extends AppCompatActivity {
setContentView(R.layout.page_userlist);
Bundle param = getIntent().getExtras();
if (param != null && param.containsKey(KEY_USERLIST_MODE) && param.containsKey(KEY_USERLIST_ID)) {
mode = (UserType) param.getSerializable(KEY_USERLIST_MODE);
id = param.getLong(KEY_USERLIST_ID);
} else if (BuildConfig.DEBUG) {
throw new AssertionError();
if (param != null && param.containsKey(KEY_USERDETAIL_MODE) && param.containsKey(KEY_USERDETAIL_ID)) {
mode = (UserType) param.getSerializable(KEY_USERDETAIL_MODE);
id = param.getLong(KEY_USERDETAIL_ID);
}
FragmentAdapter adapter;
@ -75,6 +73,11 @@ public class UserDetail extends AppCompatActivity {
adapter = new FragmentAdapter(getSupportFragmentManager(), AdapterType.FAVOR_PAGE, id, "");
pager.setAdapter(adapter);
break;
case SUBSCRIBER:
if (getSupportActionBar() != null)
getSupportActionBar().setTitle(R.string.user_list_subscr);
adapter = new FragmentAdapter(getSupportFragmentManager(), AdapterType.SUBSCRIBER_PAGE, id, "");
pager.setAdapter(adapter);
}
}
}

View File

@ -0,0 +1,44 @@
package org.nuclearfog.twidda.activity;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.FragmentAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import static org.nuclearfog.twidda.adapter.FragmentAdapter.AdapterType.LIST_PAGE;
public class UserList extends AppCompatActivity {
public static final String KEY_USERLIST_ID = "userlist-owner";
private long userId;
@Override
protected void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.page_list);
View root = findViewById(R.id.list_view);
ViewPager pager = findViewById(R.id.list_pager);
Toolbar toolbar = findViewById(R.id.list_toolbar);
Bundle param = getIntent().getExtras();
if (param != null)
userId = param.getLong(KEY_USERLIST_ID);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setTitle(R.string.list_appbar);
GlobalSettings settings = GlobalSettings.getInstance(this);
FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager(), LIST_PAGE, userId, "");
pager.setAdapter(adapter);
root.setBackgroundColor(settings.getBackgroundColor());
}
}

View File

@ -1,7 +1,8 @@
package org.nuclearfog.twidda.window;
package org.nuclearfog.twidda.activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Bundle;
@ -53,17 +54,18 @@ import static android.view.MotionEvent.ACTION_UP;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
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.MediaType.IMAGE;
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.TweetPopup.KEY_TWEETPOPUP_PREFIX;
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.FOLLOWERS;
import static org.nuclearfog.twidda.activity.UserDetail.UserType.FRIENDS;
import static org.nuclearfog.twidda.activity.UserList.KEY_USERLIST_ID;
import static org.nuclearfog.twidda.backend.ProfileLoader.Action.LDR_PROFILE;
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.IMAGE;
import static org.nuclearfog.twidda.window.MessagePopup.KEY_DM_PREFIX;
import static org.nuclearfog.twidda.window.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.window.TweetPopup.KEY_TWEETPOPUP_PREFIX;
import static org.nuclearfog.twidda.window.UserDetail.KEY_USERLIST_ID;
import static org.nuclearfog.twidda.window.UserDetail.KEY_USERLIST_MODE;
import static org.nuclearfog.twidda.window.UserDetail.UserType.FOLLOWERS;
import static org.nuclearfog.twidda.window.UserDetail.UserType.FRIENDS;
public class UserProfile extends AppCompatActivity implements OnClickListener,
@ -119,8 +121,8 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
txtCreated = findViewById(R.id.profile_date);
follow_back = findViewById(R.id.follow_back);
pager = findViewById(R.id.profile_pager);
tweetTabTxt = new TextView(getApplicationContext());
favorTabTxt = new TextView(getApplicationContext());
tweetTabTxt = new TextView(this);
favorTabTxt = new TextView(this);
setSupportActionBar(tool);
if (getSupportActionBar() != null)
@ -132,8 +134,8 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
bioTxt.setLinkTextColor(settings.getHighlightColor());
lnkTxt.setLinkTextColor(settings.getHighlightColor());
root.setBackgroundColor(settings.getBackgroundColor());
tweetTabTxt.setTextColor(settings.getFontColor());
favorTabTxt.setTextColor(settings.getFontColor());
tweetTabTxt.setTextColor(Color.WHITE);
favorTabTxt.setTextColor(Color.WHITE);
tweetTabTxt.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.home_profile, 0, 0);
favorTabTxt.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.favorite_profile, 0, 0);
tweetTabTxt.setGravity(CENTER);
@ -327,6 +329,12 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
startActivity(dmPage);
}
break;
case R.id.profile_lists:
Intent listPage = new Intent(this, UserList.class);
listPage.putExtra(KEY_USERLIST_ID, userId);
startActivity(listPage);
break;
}
}
return super.onOptionsItemSelected(item);
@ -358,8 +366,8 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
if (user != null && properties != null) {
if (!user.isLocked() || properties.isFriend()) {
Intent following = new Intent(this, UserDetail.class);
following.putExtra(KEY_USERLIST_ID, userId);
following.putExtra(KEY_USERLIST_MODE, FRIENDS);
following.putExtra(KEY_USERDETAIL_ID, userId);
following.putExtra(KEY_USERDETAIL_MODE, FRIENDS);
startActivity(following);
}
}
@ -369,8 +377,8 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
if (user != null && properties != null) {
if (!user.isLocked() || properties.isFriend()) {
Intent follower = new Intent(this, UserDetail.class);
follower.putExtra(KEY_USERLIST_ID, userId);
follower.putExtra(KEY_USERLIST_MODE, FOLLOWERS);
follower.putExtra(KEY_USERDETAIL_ID, userId);
follower.putExtra(KEY_USERDETAIL_MODE, FOLLOWERS);
startActivity(follower);
}
}
@ -392,7 +400,7 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
case R.id.profile_img:
if (user != null) {
Intent image = new Intent(getApplicationContext(), MediaViewer.class);
Intent image = new Intent(this, MediaViewer.class);
image.putExtra(KEY_MEDIA_LINK, new String[]{user.getImageLink()});
image.putExtra(KEY_MEDIA_TYPE, IMAGE);
startActivity(image);

View File

@ -7,21 +7,23 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import org.nuclearfog.twidda.fragment.MessageListFragment;
import org.nuclearfog.twidda.fragment.TrendListFragment;
import org.nuclearfog.twidda.fragment.TweetListFragment;
import org.nuclearfog.twidda.fragment.TweetListFragment.TweetType;
import org.nuclearfog.twidda.fragment.UserListFragment;
import org.nuclearfog.twidda.fragment.UserListFragment.UserType;
import org.nuclearfog.twidda.fragment.ListFragment;
import org.nuclearfog.twidda.fragment.MessageFragment;
import org.nuclearfog.twidda.fragment.TrendFragment;
import org.nuclearfog.twidda.fragment.TweetFragment;
import org.nuclearfog.twidda.fragment.TweetFragment.TweetType;
import org.nuclearfog.twidda.fragment.UserFragment;
import org.nuclearfog.twidda.fragment.UserFragment.UserType;
import static org.nuclearfog.twidda.fragment.TweetListFragment.KEY_FRAG_TWEET_FIX_LAYOUT;
import static org.nuclearfog.twidda.fragment.TweetListFragment.KEY_FRAG_TWEET_ID;
import static org.nuclearfog.twidda.fragment.TweetListFragment.KEY_FRAG_TWEET_MODE;
import static org.nuclearfog.twidda.fragment.TweetListFragment.KEY_FRAG_TWEET_SEARCH;
import static org.nuclearfog.twidda.fragment.UserListFragment.KEY_FRAG_USER_FIX_LAYOUT;
import static org.nuclearfog.twidda.fragment.UserListFragment.KEY_FRAG_USER_ID;
import static org.nuclearfog.twidda.fragment.UserListFragment.KEY_FRAG_USER_MODE;
import static org.nuclearfog.twidda.fragment.UserListFragment.KEY_FRAG_USER_SEARCH;
import static org.nuclearfog.twidda.fragment.ListFragment.KEY_FRAG_LIST;
import static org.nuclearfog.twidda.fragment.TweetFragment.KEY_FRAG_TWEET_FIX_LAYOUT;
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_SEARCH;
import static org.nuclearfog.twidda.fragment.UserFragment.KEY_FRAG_USER_FIX_LAYOUT;
import static org.nuclearfog.twidda.fragment.UserFragment.KEY_FRAG_USER_ID;
import static org.nuclearfog.twidda.fragment.UserFragment.KEY_FRAG_USER_MODE;
import static org.nuclearfog.twidda.fragment.UserFragment.KEY_FRAG_USER_SEARCH;
public class FragmentAdapter extends FragmentPagerAdapter {
@ -33,7 +35,9 @@ public class FragmentAdapter extends FragmentPagerAdapter {
FRIENDS_PAGE,
FOLLOWER_PAGE,
RETWEETER_PAGE,
FAVOR_PAGE
FAVOR_PAGE,
LIST_PAGE,
SUBSCRIBER_PAGE
}
private final Fragment[] fragments;
@ -48,9 +52,9 @@ public class FragmentAdapter extends FragmentPagerAdapter {
home_tl.putBoolean(KEY_FRAG_TWEET_FIX_LAYOUT, true);
ment_tl.putBoolean(KEY_FRAG_TWEET_FIX_LAYOUT, true);
fragments = new Fragment[3];
fragments[0] = new TweetListFragment();
fragments[1] = new TrendListFragment();
fragments[2] = new TweetListFragment();
fragments[0] = new TweetFragment();
fragments[1] = new TrendFragment();
fragments[2] = new TweetFragment();
fragments[0].setArguments(home_tl);
fragments[2].setArguments(ment_tl);
}
@ -69,8 +73,8 @@ public class FragmentAdapter extends FragmentPagerAdapter {
usr_tweet.putSerializable(KEY_FRAG_TWEET_MODE, TweetType.USER_TWEET);
usr_favor.putSerializable(KEY_FRAG_TWEET_MODE, TweetType.USER_FAVOR);
fragments = new Fragment[2];
fragments[0] = new TweetListFragment();
fragments[1] = new TweetListFragment();
fragments[0] = new TweetFragment();
fragments[1] = new TweetFragment();
fragments[0].setArguments(usr_tweet);
fragments[1].setArguments(usr_favor);
break;
@ -85,8 +89,8 @@ public class FragmentAdapter extends FragmentPagerAdapter {
tweetSearch.putBoolean(KEY_FRAG_TWEET_FIX_LAYOUT, true);
userSearch.putBoolean(KEY_FRAG_USER_FIX_LAYOUT, true);
fragments = new Fragment[2];
fragments[0] = new TweetListFragment();
fragments[1] = new UserListFragment();
fragments[0] = new TweetFragment();
fragments[1] = new UserFragment();
fragments[0].setArguments(tweetSearch);
fragments[1].setArguments(userSearch);
break;
@ -98,13 +102,13 @@ public class FragmentAdapter extends FragmentPagerAdapter {
param.putBoolean(KEY_FRAG_TWEET_FIX_LAYOUT, false);
param.putLong(KEY_FRAG_TWEET_ID, id);
fragments = new Fragment[1];
fragments[0] = new TweetListFragment();
fragments[0] = new TweetFragment();
fragments[0].setArguments(param);
break;
case MESSAGE_PAGE:
fragments = new Fragment[1];
fragments[0] = new MessageListFragment();
fragments[0] = new MessageFragment();
break;
case FRIENDS_PAGE:
@ -112,7 +116,7 @@ public class FragmentAdapter extends FragmentPagerAdapter {
uParam.putLong(KEY_FRAG_USER_ID, id);
uParam.putSerializable(KEY_FRAG_USER_MODE, UserType.FRIENDS);
fragments = new Fragment[1];
fragments[0] = new UserListFragment();
fragments[0] = new UserFragment();
fragments[0].setArguments(uParam);
break;
@ -121,7 +125,7 @@ public class FragmentAdapter extends FragmentPagerAdapter {
uParam.putLong(KEY_FRAG_USER_ID, id);
uParam.putSerializable(KEY_FRAG_USER_MODE, UserType.FOLLOWS);
fragments = new Fragment[1];
fragments[0] = new UserListFragment();
fragments[0] = new UserFragment();
fragments[0].setArguments(uParam);
break;
@ -130,7 +134,7 @@ public class FragmentAdapter extends FragmentPagerAdapter {
uParam.putLong(KEY_FRAG_USER_ID, id);
uParam.putSerializable(KEY_FRAG_USER_MODE, UserType.RETWEET);
fragments = new Fragment[1];
fragments[0] = new UserListFragment();
fragments[0] = new UserFragment();
fragments[0].setArguments(uParam);
break;
@ -139,7 +143,24 @@ public class FragmentAdapter extends FragmentPagerAdapter {
uParam.putLong(KEY_FRAG_USER_ID, id);
uParam.putSerializable(KEY_FRAG_USER_MODE, UserType.FAVORIT);
fragments = new Fragment[1];
fragments[0] = new UserListFragment();
fragments[0] = new UserFragment();
fragments[0].setArguments(uParam);
break;
case LIST_PAGE:
uParam = new Bundle();
uParam.putLong(KEY_FRAG_LIST, id);
fragments = new Fragment[1];
fragments[0] = new ListFragment();
fragments[0].setArguments(uParam);
break;
case SUBSCRIBER_PAGE:
uParam = new Bundle();
uParam.putLong(KEY_FRAG_USER_ID, id);
uParam.putSerializable(KEY_FRAG_USER_MODE, UserType.SUBSCR);
fragments = new Fragment[1];
fragments[0] = new UserFragment();
fragments[0].setArguments(uParam);
break;

View File

@ -0,0 +1,141 @@
package org.nuclearfog.twidda.adapter;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView.Adapter;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.squareup.picasso.Picasso;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.StringTools;
import org.nuclearfog.twidda.backend.items.TwitterList;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import java.lang.ref.WeakReference;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
public class ListAdapter extends Adapter<ListAdapter.ListHolder> {
private WeakReference<ListClickListener> listener;
private List<TwitterList> data;
private NumberFormat formatter;
private int fontColor;
public ListAdapter(ListClickListener l) {
data = new ArrayList<>();
listener = new WeakReference<>(l);
formatter = NumberFormat.getIntegerInstance();
fontColor = Color.WHITE;
}
public void setData(List<TwitterList> newData) {
data.clear();
data.addAll(newData);
notifyDataSetChanged();
}
public void updateItem(TwitterList newItem) {
int index = data.indexOf(newItem);
if (index != -1) {
data.set(index, newItem);
notifyItemChanged(index);
}
}
public void setColor(int fontColor) {
this.fontColor = fontColor;
}
@Override
public int getItemCount() {
return data.size();
}
@NonNull
@Override
public ListHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
return new ListHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ListHolder vh, final int index) {
final TwitterList item = data.get(index);
final TwitterUser owner = item.getListOwner();
vh.title.setText(item.getShortName());
vh.ownername.setText(owner.getScreenname());
vh.description.setText(item.getDescription());
vh.createdAt.setText(StringTools.getTimeString(item.getCreatedAt()));
vh.memberCount.setText(formatter.format(item.getMemberCount()));
vh.subscriberCount.setText(formatter.format(item.getSubscriberCount()));
vh.title.setTextColor(fontColor);
vh.ownername.setTextColor(fontColor);
vh.description.setTextColor(fontColor);
vh.createdAt.setTextColor(fontColor);
Picasso.get().load(owner.getImageLink() + "_mini").into(vh.pb_image);
vh.pb_image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener.get() != null)
listener.get().onClick(owner.getId(), ListClickListener.Action.PROFILE);
}
});
vh.followList.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener.get() != null)
listener.get().onClick(item.getId(), ListClickListener.Action.FOLLOW);
}
});
vh.subscriberCount.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener.get() != null)
listener.get().onClick(item.getId(), ListClickListener.Action.SUBSCRIBER);
}
});
}
class ListHolder extends ViewHolder {
final ImageView pb_image;
final Button followList;
final TextView title, ownername, description, createdAt;
final TextView memberCount, subscriberCount;
ListHolder(View v) {
super(v);
pb_image = v.findViewById(R.id.list_owner_profile);
followList = v.findViewById(R.id.list_follow);
title = v.findViewById(R.id.list_title);
ownername = v.findViewById(R.id.list_ownername);
description = v.findViewById(R.id.list_description);
createdAt = v.findViewById(R.id.list_createdat);
memberCount = v.findViewById(R.id.list_member);
subscriberCount = v.findViewById(R.id.list_subscriber);
}
}
public interface ListClickListener {
enum Action {
PROFILE,
FOLLOW,
SUBSCRIBER
}
void onClick(long id, Action action);
}
}

View File

@ -51,6 +51,19 @@ public class MessageAdapter extends Adapter<MessageAdapter.MessageHolder> {
}
public void remove(long id) {
int pos = -1;
for (int index = 0; index < messages.size() && pos < 0; index++) {
if (messages.get(index).getId() == id) {
messages.remove(index);
pos = index;
}
}
if (pos != -1)
notifyItemRemoved(pos);
}
public void setColor(int fontColor, int highlight) {
this.fontColor = fontColor;
this.highlight = highlight;
@ -96,7 +109,7 @@ public class MessageAdapter extends Adapter<MessageAdapter.MessageHolder> {
vh.message.setLinkTextColor(highlight);
vh.username.setText(message.getSender().getUsername());
vh.screenname.setText(message.getSender().getScreenname());
vh.createdAt.setText(StringTools.getString(message.getTime()));
vh.createdAt.setText(StringTools.getTimeString(message.getTime()));
vh.receivername.setText(message.getReceiver().getScreenname());
vh.message.setTextColor(fontColor);
vh.username.setTextColor(fontColor);

View File

@ -89,9 +89,8 @@ public class TweetAdapter extends Adapter<TweetAdapter.ItemHolder> {
index = pos;
}
}
if (index != -1) {
if (index != -1)
notifyItemRemoved(index);
}
}
@ -141,7 +140,7 @@ public class TweetAdapter extends Adapter<TweetAdapter.ItemHolder> {
vh.tweet.setText(text);
vh.retweet.setText(formatter.format(tweet.getRetweetCount()));
vh.favorite.setText(formatter.format(tweet.getFavorCount()));
vh.time.setText(StringTools.getString(tweet.getTime()));
vh.time.setText(StringTools.getTimeString(tweet.getTime()));
vh.username.setTextColor(font_color);
vh.screenname.setTextColor(font_color);
vh.tweet.setTextColor(font_color);

View File

@ -8,8 +8,8 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.MediaViewer;
import org.nuclearfog.twidda.adapter.ImageAdapter;
import org.nuclearfog.twidda.window.MediaViewer;
import java.io.InputStream;
import java.lang.ref.WeakReference;

View File

@ -0,0 +1,91 @@
package org.nuclearfog.twidda.backend;
import android.os.AsyncTask;
import android.widget.Toast;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.adapter.ListAdapter;
import org.nuclearfog.twidda.backend.items.TwitterList;
import org.nuclearfog.twidda.fragment.ListFragment;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import static android.widget.Toast.LENGTH_SHORT;
public class ListLoader extends AsyncTask<Long, Void, List<TwitterList>> {
public enum Action {
LOAD,
FOLLOW,
}
@Nullable
private TwitterEngine.EngineException twException;
private WeakReference<ListFragment> ui;
private TwitterEngine mTwitter;
private ListAdapter adapter;
private Action action;
public ListLoader(ListFragment frag, Action action) {
ui = new WeakReference<>(frag);
mTwitter = TwitterEngine.getInstance(frag.getContext());
adapter = frag.getAdapter();
this.action = action;
}
@Override
protected void onPreExecute() {
if (ui.get() != null)
ui.get().setRefresh(true);
}
@Override
protected List<TwitterList> doInBackground(Long[] param) {
try {
switch (action) {
case LOAD:
return mTwitter.getUserList(param[0]);
case FOLLOW:
TwitterList list = mTwitter.followUserList(param[0]);
List<TwitterList> result = new ArrayList<>(1);
result.add(list);
return result;
}
} catch (TwitterEngine.EngineException twException) {
this.twException = twException;
}
return null;
}
@Override
protected void onPostExecute(List<TwitterList> result) {
if (ui.get() != null) {
if (result != null) {
switch (action) {
case LOAD:
adapter.setData(result);
break;
case FOLLOW:
adapter.updateItem(result.get(0));
break;
}
}
if (twException != null)
Toast.makeText(ui.get().getContext(), twException.getMessageResource(), LENGTH_SHORT).show();
ui.get().setRefresh(false);
}
}
@Override
protected void onCancelled() {
if (ui.get() != null)
ui.get().setRefresh(false);
}
}

View File

@ -6,8 +6,8 @@ import android.widget.Toast;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.activity.AppSettings;
import org.nuclearfog.twidda.backend.items.TrendLocation;
import org.nuclearfog.twidda.window.AppSettings;
import java.lang.ref.WeakReference;
import java.util.List;

View File

@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.backend.items.Message;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.fragment.MessageListFragment;
import org.nuclearfog.twidda.fragment.MessageFragment;
import java.lang.ref.WeakReference;
import java.util.List;
@ -27,13 +27,14 @@ public class MessageLoader extends AsyncTask<Long, Void, List<Message>> {
@Nullable
private TwitterEngine.EngineException twException;
private Mode mode;
private WeakReference<MessageListFragment> ui;
private WeakReference<MessageFragment> ui;
private TwitterEngine mTwitter;
private AppDatabase db;
private MessageAdapter adapter;
private long id;
public MessageLoader(MessageListFragment fragment, Mode mode) {
public MessageLoader(MessageFragment fragment, Mode mode) {
ui = new WeakReference<>(fragment);
db = new AppDatabase(fragment.getContext());
mTwitter = TwitterEngine.getInstance(fragment.getContext());
@ -68,17 +69,15 @@ public class MessageLoader extends AsyncTask<Long, Void, List<Message>> {
case DEL:
messageId = param[0];
id = messageId;
mTwitter.deleteMessage(messageId);
db.deleteDm(messageId);
messages = db.getMessages();
break;
}
} catch (TwitterEngine.EngineException twException) {
this.twException = twException;
if (twException.statusNotFound()) {
if (twException.statusNotFound())
db.deleteDm(messageId);
messages = db.getMessages();
}
} catch (Exception exception) {
exception.printStackTrace();
}
@ -91,8 +90,12 @@ public class MessageLoader extends AsyncTask<Long, Void, List<Message>> {
if (ui.get() != null) {
if (messages != null)
adapter.replaceAll(messages);
if (twException != null)
if (twException != null) {
Toast.makeText(ui.get().getContext(), twException.getMessageResource(), LENGTH_SHORT).show();
if (twException.statusNotFound())
adapter.remove(id);
} else if (mode == Mode.DEL)
adapter.remove(id);
ui.get().setRefresh(false);
}
}

View File

@ -11,8 +11,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.MessagePopup;
import org.nuclearfog.twidda.backend.items.MessageHolder;
import org.nuclearfog.twidda.window.MessagePopup;
import java.lang.ref.WeakReference;

View File

@ -10,15 +10,15 @@ import android.widget.Toast;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.ProfileSettings;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.backend.items.UserHolder;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.window.ProfileSettings;
import java.lang.ref.WeakReference;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.window.UserProfile.RETURN_PROFILE_CHANGED;
import static org.nuclearfog.twidda.activity.UserProfile.RETURN_PROFILE_CHANGED;
public class ProfileEditor extends AsyncTask<Void, Void, TwitterUser> {

View File

@ -7,10 +7,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.backend.items.UserProperties;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.window.UserProfile;
import java.lang.ref.WeakReference;

View File

@ -7,7 +7,7 @@ import android.widget.Toast;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.window.LoginPage;
import org.nuclearfog.twidda.activity.LoginPage;
import java.lang.ref.WeakReference;

View File

@ -7,14 +7,14 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.TweetDetail;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.window.TweetDetail;
import java.lang.ref.WeakReference;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.fragment.TweetListFragment.RETURN_TWEET_CHANGED;
import static org.nuclearfog.twidda.fragment.TweetFragment.RETURN_TWEET_CHANGED;
public class StatusLoader extends AsyncTask<Long, Tweet, Tweet> {

View File

@ -12,8 +12,8 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.TweetPopup;
import org.nuclearfog.twidda.backend.items.TweetHolder;
import org.nuclearfog.twidda.window.TweetPopup;
import java.lang.ref.WeakReference;

View File

@ -8,8 +8,7 @@ import androidx.annotation.Nullable;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.fragment.TrendListFragment;
import org.nuclearfog.twidda.fragment.TrendFragment;
import java.lang.ref.WeakReference;
import java.util.List;
@ -17,23 +16,20 @@ import java.util.List;
import static android.widget.Toast.LENGTH_SHORT;
public class TrendLoader extends AsyncTask<Void, Void, List<String>> {
public class TrendLoader extends AsyncTask<Integer, Void, List<String>> {
@Nullable
private TwitterEngine.EngineException twException;
private WeakReference<TrendListFragment> ui;
private WeakReference<TrendFragment> ui;
private TwitterEngine mTwitter;
private AppDatabase db;
private TrendAdapter adapter;
private int woeId;
public TrendLoader(@NonNull TrendListFragment fragment) {
public TrendLoader(@NonNull TrendFragment fragment) {
ui = new WeakReference<>(fragment);
db = new AppDatabase(fragment.getContext());
mTwitter = TwitterEngine.getInstance(fragment.getContext());
GlobalSettings settings = GlobalSettings.getInstance(fragment.getContext());
woeId = settings.getTrendLocation().getWoeId();
adapter = fragment.getAdapter();
}
@ -46,8 +42,9 @@ public class TrendLoader extends AsyncTask<Void, Void, List<String>> {
@Override
protected List<String> doInBackground(Void[] v) {
protected List<String> doInBackground(Integer[] param) {
List<String> trends;
int woeId = param[0];
try {
if (adapter.isEmpty()) {
trends = db.getTrends(woeId);

View File

@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.fragment.TweetListFragment;
import org.nuclearfog.twidda.fragment.TweetFragment;
import java.lang.ref.WeakReference;
import java.util.List;
@ -34,13 +34,13 @@ public class TweetLoader extends AsyncTask<Object, Void, List<Tweet>> {
@Nullable
private TwitterEngine.EngineException twException;
private Mode mode;
private WeakReference<TweetListFragment> ui;
private WeakReference<TweetFragment> ui;
private TweetAdapter adapter;
private TwitterEngine mTwitter;
private AppDatabase db;
public TweetLoader(TweetListFragment fragment, Mode mode) {
public TweetLoader(TweetFragment fragment, Mode mode) {
ui = new WeakReference<>(fragment);
db = new AppDatabase(fragment.getContext());
mTwitter = TwitterEngine.getInstance(fragment.getContext());
@ -64,59 +64,63 @@ public class TweetLoader extends AsyncTask<Object, Void, List<Tweet>> {
try {
switch (mode) {
case TL_HOME:
int page = (int) param[0];
if (adapter.isEmpty()) {
tweets = db.getHomeTimeline();
if (tweets.isEmpty()) {
tweets = mTwitter.getHome(1, sinceId);
tweets = mTwitter.getHome(page, sinceId);
db.storeHomeTimeline(tweets);
}
} else {
sinceId = adapter.getItemId(0);
tweets = mTwitter.getHome(1, sinceId);
tweets = mTwitter.getHome(page, sinceId);
db.storeHomeTimeline(tweets);
}
break;
case TL_MENT:
page = (int) param[0];
if (adapter.isEmpty()) {
tweets = db.getMentions();
if (tweets.isEmpty()) {
tweets = mTwitter.getMention(1, sinceId);
tweets = mTwitter.getMention(page, sinceId);
db.storeMentions(tweets);
}
} else {
sinceId = adapter.getItemId(0);
tweets = mTwitter.getMention(1, sinceId);
tweets = mTwitter.getMention(page, sinceId);
db.storeMentions(tweets);
}
break;
case USR_TWEETS:
long tweetId = (long) param[0];
page = (int) param[1];
if (adapter.isEmpty()) {
tweets = db.getUserTweets(tweetId);
if (tweets.isEmpty()) {
tweets = mTwitter.getUserTweets(tweetId, sinceId, 1);
tweets = mTwitter.getUserTweets(tweetId, sinceId, page);
db.storeUserTweets(tweets);
}
} else {
sinceId = adapter.getItemId(0);
tweets = mTwitter.getUserTweets(tweetId, sinceId, 1);
tweets = mTwitter.getUserTweets(tweetId, sinceId, page);
db.storeUserTweets(tweets);
}
break;
case USR_FAVORS:
tweetId = (long) param[0];
page = (int) param[1];
if (adapter.isEmpty()) {
tweets = db.getUserFavs(tweetId);
if (tweets.isEmpty()) {
tweets = mTwitter.getUserFavs(tweetId, sinceId, 1);
tweets = mTwitter.getUserFavs(tweetId, sinceId, page);
db.storeUserFavs(tweets, tweetId);
}
} else {
sinceId = adapter.getItemId(0);
tweets = mTwitter.getUserFavs(tweetId, sinceId, 1);
tweets = mTwitter.getUserFavs(tweetId, sinceId, page);
db.storeUserFavs(tweets, tweetId);
}
break;

View File

@ -11,6 +11,7 @@ import org.nuclearfog.twidda.backend.items.MessageHolder;
import org.nuclearfog.twidda.backend.items.TrendLocation;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.backend.items.TweetHolder;
import org.nuclearfog.twidda.backend.items.TwitterList;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.backend.items.UserHolder;
import org.nuclearfog.twidda.backend.items.UserProperties;
@ -29,6 +30,7 @@ import twitter4j.Location;
import twitter4j.Paging;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.Trend;
@ -37,6 +39,7 @@ import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.UploadedMedia;
import twitter4j.User;
import twitter4j.UserList;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
@ -83,9 +86,8 @@ public class TwitterEngine {
* @return TwitterEngine Instance
*/
public static TwitterEngine getInstance(Context context) {
if (mTwitter == null) {
if (mTwitter == null)
mTwitter = new TwitterEngine(context);
}
mTwitter.setLoad();
return mTwitter;
}
@ -286,9 +288,9 @@ public class TwitterEngine {
* @return List of User Tweets
* @throws EngineException if access is unavailable
*/
List<Tweet> getUserTweets(long userId, long sinceId, long page) throws EngineException {
List<Tweet> getUserTweets(long userId, long sinceId, int page) throws EngineException {
try {
Paging paging = new Paging((int) page, load, sinceId);
Paging paging = new Paging(page, load, sinceId);
return convertStatusList(twitter.getUserTimeline(userId, paging));
} catch (TwitterException err) {
throw new EngineException(err);
@ -305,9 +307,9 @@ public class TwitterEngine {
* @return List of User Favs
* @throws EngineException if access is unavailable
*/
List<Tweet> getUserFavs(long userId, long sinceId, long page) throws EngineException {
List<Tweet> getUserFavs(long userId, long sinceId, int page) throws EngineException {
try {
Paging paging = new Paging((int) page, load, sinceId);
Paging paging = new Paging(page, load, sinceId);
List<Status> favorits = twitter.getFavorites(userId, paging);
return convertStatusList(favorits);
} catch (TwitterException err) {
@ -711,10 +713,14 @@ public class TwitterEngine {
* Delete Direct Message
*
* @param id Message ID
* @throws TwitterException if Access is unavailable
* @throws EngineException if Access is unavailable or message not found
*/
void deleteMessage(long id) throws TwitterException {
twitter.destroyDirectMessage(id);
void deleteMessage(long id) throws EngineException {
try {
twitter.destroyDirectMessage(id);
} catch (TwitterException err) {
throw new EngineException(err);
}
}
@ -743,7 +749,7 @@ public class TwitterEngine {
* Update user profile image_add
*
* @param path image path
* @throws EngineException if Access is unavailable
* @throws EngineException if access is unavailable
*/
void updateProfileImage(String path) throws EngineException {
try {
@ -755,6 +761,63 @@ public class TwitterEngine {
}
/**
* get user list
*
* @param userId id of the list owner
* @return list information
* @throws EngineException if access is unavailable
*/
List<TwitterList> getUserList(long userId) throws EngineException {
try {
List<TwitterList> result = new LinkedList<>();
ResponseList<UserList> lists = twitter.getUserLists(userId);
for (UserList list : lists)
result.add(new TwitterList(list, twitterID));
return result;
} catch (TwitterException err) {
throw new EngineException(err);
}
}
/**
* Follow action for twitter list
*
* @param listId ID of the list
* @return List information
* @throws EngineException if access is unavailable
*/
TwitterList followUserList(long listId) throws EngineException {
try {
UserList list = twitter.showUserList(listId);
if (list.isFollowing())
list = twitter.destroyUserListSubscription(listId);
else
list = twitter.createUserListSubscription(listId);
return new TwitterList(list, twitterID);
} catch (TwitterException err) {
throw new EngineException(err);
}
}
/**
* Get subscriber of a user list
*
* @param listId ID of the list
* @return list of users following the list
* @throws EngineException if access is unavailable
*/
List<TwitterUser> getListFollower(long listId) throws EngineException {
try {
return convertUserList(twitter.getUserListSubscribers(listId, -1));
} catch (TwitterException err) {
throw new EngineException(err);
}
}
/**
* convert #twitter4j.User to TwitterUser List
*
@ -923,15 +986,10 @@ public class TwitterEngine {
break;
default:
switch (error.getStatusCode()) {
case 401:
messageResource = R.string.not_authorized;
break;
default:
messageResource = R.string.error;
break;
}
if (error.getStatusCode() == 401)
messageResource = R.string.not_authorized;
else
messageResource = R.string.error;
break;
}
}

View File

@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.fragment.UserListFragment;
import org.nuclearfog.twidda.fragment.UserFragment;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
@ -26,18 +26,19 @@ public class UserLoader extends AsyncTask<Object, Void, List<TwitterUser>> {
FRIENDS,
RETWEET,
FAVORIT,
SEARCH
SEARCH,
SUBSCRIBER
}
@Nullable
private TwitterEngine.EngineException twException;
private Mode mode;
private WeakReference<UserListFragment> ui;
private WeakReference<UserFragment> ui;
private TwitterEngine mTwitter;
private UserAdapter adapter;
public UserLoader(UserListFragment fragment, Mode mode) {
public UserLoader(UserFragment fragment, Mode mode) {
ui = new WeakReference<>(fragment);
mTwitter = TwitterEngine.getInstance(fragment.getContext());
adapter = fragment.getAdapter();
@ -70,6 +71,9 @@ public class UserLoader extends AsyncTask<Object, Void, List<TwitterUser>> {
case SEARCH:
return mTwitter.searchUsers((String) param[0]);
case SUBSCRIBER:
return mTwitter.getListFollower((long) param[0]);
}
} catch (TwitterEngine.EngineException twException) {
this.twException = twException;

View File

@ -15,7 +15,7 @@ public abstract class StringTools {
NONE
}
public static String getString(long time) {
public static String getTimeString(long time) {
long diff = new Date().getTime() - time;
long seconds = diff / 1000;
long minutes = seconds / 60;

View File

@ -0,0 +1,151 @@
package org.nuclearfog.twidda.backend.items;
import androidx.annotation.NonNull;
import twitter4j.UserList;
/**
* Class for Twitter list information
*/
public class TwitterList {
private final long id;
private final long createdAt;
private final String shortName;
private final String fullName;
private final String description;
private final TwitterUser owner;
private final boolean isPrivate;
private final boolean isFollowing;
private final boolean enableFollow;
private final int memberCount;
private final int subscriberCnt;
public TwitterList(UserList list, long homeId) {
id = list.getId();
shortName = list.getName();
fullName = list.getFullName();
createdAt = list.getCreatedAt().getTime();
description = list.getDescription();
owner = new TwitterUser(list.getUser());
isFollowing = list.isFollowing();
isPrivate = !list.isPublic();
memberCount = list.getMemberCount();
subscriberCnt = list.getSubscriberCount();
enableFollow = homeId != owner.getId();
}
/**
* get List ID
*
* @return List ID
*/
public long getId() {
return id;
}
/**
* get date of Creation
*
* @return date long format
*/
public long getCreatedAt() {
return createdAt;
}
/**
* get short name of list
*
* @return name
*/
public String getShortName() {
return shortName;
}
/**
* get full name of list
*
* @return name
*/
public String getFullName() {
return fullName;
}
/**
* get description of list
*
* @return description
*/
public String getDescription() {
return description;
}
/**
* get owner
*
* @return twitter user
*/
public TwitterUser getListOwner() {
return owner;
}
/**
* get access information
*
* @return true is list is private
*/
public boolean isPrivate() {
return isPrivate;
}
/**
* get follow status of the current user
*
* @return true if current user is following
*/
public boolean isFollowing() {
return isFollowing;
}
/**
* get member count of the list
*
* @return member count
*/
public int getMemberCount() {
return memberCount;
}
/**
* get subscriber count of the list
*
* @return subscriber count
*/
public int getSubscriberCount() {
return subscriberCnt;
}
/**
* return if current user can follow list
*
* @return true if user can follow list
*/
public boolean enableFollow() {
return enableFollow;
}
@Override
@NonNull
public String toString() {
return shortName + " " + description;
}
@Override
public boolean equals(Object o) {
if (o instanceof TwitterList)
return ((TwitterList) o).id == id;
return false;
}
}

View File

@ -3,6 +3,8 @@ package org.nuclearfog.twidda.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import androidx.annotation.NonNull;
import org.nuclearfog.twidda.BuildConfig;
import java.io.File;
@ -70,7 +72,7 @@ public class DatabaseAdapter {
}
public static DatabaseAdapter getInstance(Context context) {
public static DatabaseAdapter getInstance(@NonNull Context context) {
if (instance == null)
instance = new DatabaseAdapter(context);
return instance;

View File

@ -4,6 +4,8 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import androidx.annotation.NonNull;
import org.nuclearfog.twidda.backend.items.TrendLocation;
import java.net.Authenticator;
@ -64,7 +66,7 @@ public class GlobalSettings {
* @param context Application Context needed for Shared preferences
* @return instance of this class
*/
public static GlobalSettings getInstance(Context context) {
public static GlobalSettings getInstance(@NonNull Context context) {
if (ourInstance == null) {
ourInstance = new GlobalSettings(context);
}

View File

@ -0,0 +1,140 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
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.activity.UserDetail;
import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.ListAdapter;
import org.nuclearfog.twidda.adapter.ListAdapter.ListClickListener;
import org.nuclearfog.twidda.backend.ListLoader;
import org.nuclearfog.twidda.database.GlobalSettings;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
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.FOLLOW;
import static org.nuclearfog.twidda.backend.ListLoader.Action.LOAD;
public class ListFragment extends Fragment implements OnRefreshListener, ListClickListener {
public static final String KEY_FRAG_LIST = "list_owner";
private SwipeRefreshLayout reloadLayout;
private ListAdapter adapter;
private ListLoader listTask;
private long userId;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
Bundle b = getArguments();
if (b != null)
userId = b.getLong(KEY_FRAG_LIST);
Context context = inflater.getContext();
GlobalSettings settings = GlobalSettings.getInstance(context);
adapter = new ListAdapter(this);
RecyclerView listView = new RecyclerView(inflater.getContext());
listView.setLayoutManager(new LinearLayoutManager(context));
listView.setHasFixedSize(true);
listView.setAdapter(adapter);
reloadLayout = new SwipeRefreshLayout(context);
reloadLayout.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reloadLayout.addView(listView);
reloadLayout.setOnRefreshListener(this);
return reloadLayout;
}
@Override
public void onStart() {
super.onStart();
if (listTask == null)
load();
}
@Override
public void onDestroy() {
if (listTask != null && listTask.getStatus() == RUNNING)
listTask.cancel(true);
super.onDestroy();
}
@Override
public void onRefresh() {
if (listTask != null && listTask.getStatus() != RUNNING)
load();
}
@Override
public void onClick(long id, Action action) {
switch (action) {
case PROFILE:
Intent profile = new Intent(getContext(), UserProfile.class);
profile.putExtra(KEY_PROFILE_ID, id);
startActivity(profile);
break;
case FOLLOW:
if (listTask != null && listTask.getStatus() != RUNNING) {
listTask = new ListLoader(this, FOLLOW);
listTask.execute(id);
}
break;
case SUBSCRIBER:
Intent following = new Intent(getContext(), UserDetail.class);
following.putExtra(KEY_USERDETAIL_ID, id);
following.putExtra(KEY_USERDETAIL_MODE, SUBSCRIBER);
startActivity(following);
break;
}
}
public ListAdapter getAdapter() {
return adapter;
}
public void setRefresh(boolean enable) {
if (enable) {
reloadLayout.postDelayed(new Runnable() {
@Override
public void run() {
if (listTask.getStatus() != FINISHED && !reloadLayout.isRefreshing())
reloadLayout.setRefreshing(true);
}
}, 500);
} else {
reloadLayout.setRefreshing(false);
}
}
private void load() {
listTask = new ListLoader(this, LOAD);
listTask.execute(userId);
}
}

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
@ -13,25 +14,24 @@ 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.MessagePopup;
import org.nuclearfog.twidda.activity.SearchPage;
import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.adapter.MessageAdapter.OnItemSelected;
import org.nuclearfog.twidda.backend.MessageLoader;
import org.nuclearfog.twidda.backend.MessageLoader.Mode;
import org.nuclearfog.twidda.backend.items.Message;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.window.MessagePopup;
import org.nuclearfog.twidda.window.SearchPage;
import org.nuclearfog.twidda.window.UserProfile;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.window.MessagePopup.KEY_DM_PREFIX;
import static org.nuclearfog.twidda.window.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.window.UserProfile.KEY_PROFILE_ID;
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 MessageListFragment extends Fragment implements OnRefreshListener, OnItemSelected {
public class MessageFragment extends Fragment implements OnRefreshListener, OnItemSelected {
private MessageLoader messageTask;
private SwipeRefreshLayout reload;
@ -39,23 +39,24 @@ public class MessageListFragment extends Fragment implements OnRefreshListener,
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
super.onCreateView(inflater, parent, param);
View v = inflater.inflate(R.layout.fragment_list, parent, false);
RecyclerView list = v.findViewById(R.id.fragment_list);
reload = v.findViewById(R.id.fragment_reload);
Context context = inflater.getContext();
GlobalSettings settings = GlobalSettings.getInstance(context);
reload.setOnRefreshListener(this);
adapter = new MessageAdapter(this);
list.setLayoutManager(new LinearLayoutManager(getContext()));
list.setHasFixedSize(true);
list.setAdapter(adapter);
GlobalSettings settings = GlobalSettings.getInstance(getContext());
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
adapter.setColor(settings.getFontColor(), settings.getHighlightColor());
adapter.setImage(settings.getImageLoad());
return v;
RecyclerView list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(true);
list.setAdapter(adapter);
reload = new SwipeRefreshLayout(context);
reload.addView(list);
reload.setOnRefreshListener(this);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
return reload;
}

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
@ -13,20 +14,19 @@ 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.SearchPage;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.TrendLoader;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.window.SearchPage;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.window.SearchPage.KEY_SEARCH_QUERY;
import static org.nuclearfog.twidda.activity.SearchPage.KEY_SEARCH_QUERY;
public class TrendListFragment extends Fragment implements OnRefreshListener, OnItemClickListener, FragmentChangeObserver {
public class TrendFragment extends Fragment implements OnRefreshListener, OnItemClickListener, FragmentChangeObserver {
private TrendLoader trendTask;
private SwipeRefreshLayout reload;
@ -36,20 +36,22 @@ public class TrendListFragment extends Fragment implements OnRefreshListener, On
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
super.onCreateView(inflater, parent, param);
View v = inflater.inflate(R.layout.fragment_list, parent, false);
list = v.findViewById(R.id.fragment_list);
reload = v.findViewById(R.id.fragment_reload);
Context context = inflater.getContext();
settings = GlobalSettings.getInstance(getContext());
reload.setOnRefreshListener(this);
settings = GlobalSettings.getInstance(context);
adapter = new TrendAdapter(this);
list.setLayoutManager(new LinearLayoutManager(getContext()));
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(true);
list.setAdapter(adapter);
reload = new SwipeRefreshLayout(context);
reload.addView(list);
reload.setOnRefreshListener(this);
setColors();
return v;
return reload;
}
@ -136,7 +138,7 @@ public class TrendListFragment extends Fragment implements OnRefreshListener, On
private void load() {
trendTask = new TrendLoader(this);
trendTask.execute();
trendTask.execute(settings.getTrendLocation().getWoeId());
}

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
@ -13,7 +14,7 @@ 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.TweetDetail;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TweetAdapter;
@ -21,15 +22,14 @@ import org.nuclearfog.twidda.backend.TweetLoader;
import org.nuclearfog.twidda.backend.TweetLoader.Mode;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.window.TweetDetail;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
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.activity.TweetDetail.KEY_TWEET_ID;
import static org.nuclearfog.twidda.activity.TweetDetail.KEY_TWEET_NAME;
public class TweetListFragment extends Fragment implements OnRefreshListener, OnItemClickListener, FragmentChangeObserver {
public class TweetFragment extends Fragment implements OnRefreshListener, OnItemClickListener, FragmentChangeObserver {
public static final String KEY_FRAG_TWEET_MODE = "tweet_mode";
public static final String KEY_FRAG_TWEET_SEARCH = "tweet_search";
@ -60,31 +60,30 @@ public class TweetListFragment extends Fragment implements OnRefreshListener, On
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
super.onCreateView(inflater, parent, param);
boolean fixSize;
boolean fixSize = false;
Bundle b = getArguments();
if (b != null && b.containsKey(KEY_FRAG_TWEET_MODE)) {
Context context = inflater.getContext();
if (b != null) {
mode = (TweetType) b.getSerializable(KEY_FRAG_TWEET_MODE);
id = b.getLong(KEY_FRAG_TWEET_ID, -1);
search = b.getString(KEY_FRAG_TWEET_SEARCH, "");
fixSize = b.getBoolean(KEY_FRAG_TWEET_FIX_LAYOUT, false);
} else {
throw new AssertionError();
}
View v = inflater.inflate(R.layout.fragment_list, parent, false);
reload = v.findViewById(R.id.fragment_reload);
list = v.findViewById(R.id.fragment_list);
settings = GlobalSettings.getInstance(getContext());
reload.setOnRefreshListener(this);
settings = GlobalSettings.getInstance(context);
adapter = new TweetAdapter(this);
list.setLayoutManager(new LinearLayoutManager(getContext()));
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(fixSize);
list.setAdapter(adapter);
reload = new SwipeRefreshLayout(context);
reload.addView(list);
reload.setOnRefreshListener(this);
setColors();
return v;
return reload;
}
@ -183,22 +182,22 @@ public class TweetListFragment extends Fragment implements OnRefreshListener, On
switch (mode) {
case HOME:
tweetTask = new TweetLoader(this, Mode.TL_HOME);
tweetTask.execute();
tweetTask.execute(1);
break;
case MENT:
tweetTask = new TweetLoader(this, Mode.TL_MENT);
tweetTask.execute();
tweetTask.execute(1);
break;
case USER_TWEET:
tweetTask = new TweetLoader(this, Mode.USR_TWEETS);
tweetTask.execute(id);
tweetTask.execute(id, 1);
break;
case USER_FAVOR:
tweetTask = new TweetLoader(this, Mode.USR_FAVORS);
tweetTask.execute(id);
tweetTask.execute(id, 1);
break;
case TWEET_ANSR:

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
@ -13,8 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.UserAdapter;
@ -22,14 +22,13 @@ import org.nuclearfog.twidda.backend.UserLoader;
import org.nuclearfog.twidda.backend.UserLoader.Mode;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.window.UserProfile;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.window.UserProfile.KEY_PROFILE_ID;
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
public class UserListFragment extends Fragment implements OnRefreshListener, OnItemClickListener, FragmentChangeObserver {
public class UserFragment extends Fragment implements OnRefreshListener, OnItemClickListener, FragmentChangeObserver {
public static final String KEY_FRAG_USER_MODE = "user_mode";
public static final String KEY_FRAG_USER_SEARCH = "user_search";
@ -41,7 +40,8 @@ public class UserListFragment extends Fragment implements OnRefreshListener, OnI
FRIENDS,
RETWEET,
FAVORIT,
USEARCH
USEARCH,
SUBSCR
}
private SwipeRefreshLayout reload;
@ -51,36 +51,35 @@ public class UserListFragment extends Fragment implements OnRefreshListener, OnI
private UserType mode;
private String search;
private long id;
private boolean fixLayout;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
super.onCreateView(inflater, parent, param);
Bundle b = getArguments();
if (b != null && b.containsKey(KEY_FRAG_USER_MODE)) {
Context context = inflater.getContext();
GlobalSettings settings = GlobalSettings.getInstance(context);
boolean fixLayout = false;
if (b != null) {
mode = (UserType) b.getSerializable(KEY_FRAG_USER_MODE);
id = b.getLong(KEY_FRAG_USER_ID, -1);
search = b.getString(KEY_FRAG_USER_SEARCH, "");
fixLayout = b.getBoolean(KEY_FRAG_USER_FIX_LAYOUT, true);
} else if (BuildConfig.DEBUG) {
throw new AssertionError("Bundle error!");
}
View v = inflater.inflate(R.layout.fragment_list, parent, false);
list = v.findViewById(R.id.fragment_list);
reload = v.findViewById(R.id.fragment_reload);
GlobalSettings settings = GlobalSettings.getInstance(getContext());
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
adapter = new UserAdapter(this);
adapter.setColor(settings.getFontColor());
adapter.setImage(settings.getImageLoad());
list.setLayoutManager(new LinearLayoutManager(getContext()));
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(fixLayout);
list.setAdapter(adapter);
return v;
reload = new SwipeRefreshLayout(context);
reload.addView(list);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
return reload;
}
@ -177,6 +176,11 @@ public class UserListFragment extends Fragment implements OnRefreshListener, OnI
userTask = new UserLoader(this, Mode.SEARCH);
userTask.execute(search);
break;
case SUBSCR:
userTask = new UserLoader(this, Mode.SUBSCRIBER);
userTask.execute(id);
break;
}
}
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="20.0"
android:viewportHeight="20.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M7.725,2.146c-1.016,0.756 -1.289,1.953 -1.239,2.59C6.55,5.515 6.708,6.529 6.708,6.529s-0.313,0.17 -0.313,0.854C6.504,9.1 7.078,8.359 7.196,9.112c0.284,1.814 0.933,1.491 0.933,2.481c0,1.649 -0.68,2.42 -2.803,3.334C3.196,15.845 1,17 1,19v1h18v-1c0,-2 -2.197,-3.155 -4.328,-4.072c-2.123,-0.914 -2.801,-1.684 -2.801,-3.334c0,-0.99 0.647,-0.667 0.932,-2.481c0.119,-0.753 0.692,-0.012 0.803,-1.729c0,-0.684 -0.314,-0.854 -0.314,-0.854s0.158,-1.014 0.221,-1.793c0.065,-0.817 -0.398,-2.561 -2.3,-3.096c-0.333,-0.34 -0.558,-0.881 0.466,-1.424C9.439,0.112 8.918,1.284 7.725,2.146z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M10,4.4C3.439,4.4 0,9.232 0,10c0,0.766 3.439,5.6 10,5.6c6.56,0 10,-4.834 10,-5.6C20,9.232 16.56,4.4 10,4.4zM10,14.307c-2.455,0 -4.445,-1.928 -4.445,-4.307S7.545,5.691 10,5.691s4.444,1.93 4.444,4.309S12.455,14.307 10,14.307zM10,10c-0.407,-0.447 0.663,-2.154 0,-2.154c-1.228,0 -2.223,0.965 -2.223,2.154S8.772,12.154 10,12.154c1.227,0 2.223,-0.965 2.223,-2.154C12.223,9.453 10.346,10.379 10,10z"
android:fillColor="#FFFFFF" />
</vector>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_reload"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/fragment_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/CardViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/list_padding">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_margin"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:layout_width="@dimen/profile_middle"
android:layout_height="@dimen/profile_middle">
<ImageView
android:id="@+id/list_owner_profile"
android:layout_width="@dimen/profile_middle"
android:layout_height="@dimen/profile_middle"
android:contentDescription="@string/item_list_pb_desc" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/list_padding"
android:orientation="vertical">
<TextView
android:id="@+id/list_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true" />
<TextView
android:id="@+id/list_ownername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/list_description"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/listitem_margin"
android:text="@string/list_created" />
<TextView
android:id="@+id/list_createdat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="@dimen/list_bar_padding">
<TextView
android:id="@+id/list_member"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/listitem_margin"
android:layout_weight="1"
android:drawablePadding="@dimen/padding_drawable"
android:singleLine="true"
app:drawableStartCompat="@drawable/member" />
<TextView
android:id="@+id/list_subscriber"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/listitem_margin"
android:layout_weight="1"
android:drawablePadding="@dimen/padding_drawable"
app:drawableStartCompat="@drawable/subscriber" />
<Button
android:id="@+id/list_follow"
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:singleLine="true"
android:text="@string/follow"
app:srcCompat="@drawable/follow" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/list_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/list_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

View File

@ -27,6 +27,9 @@
android:title="@string/directmessage"
android:visible="false"
app:showAsAction="ifRoom" />
<item
android:id="@+id/profile_lists"
android:title="@string/profile_lists" />
<item
android:id="@+id/profile_settings"
android:visible="false"

View File

@ -128,4 +128,9 @@
<string name="info_get_link">PIN muss erst von Twitter abgefragt werden! Bitte den ersten Button drücken!</string>
<string name="error_media_not_found">Datei wurde nicht gefunden!</string>
<string name="error_token_not_set">Bitte zuerst link anklicken!</string>
<string name="profile_lists">Listen</string>
<string name="item_list_pb_desc">Profile Listenbesitzer</string>
<string name="list_created">"erstellt am: "</string>
<string name="list_appbar">Listen</string>
<string name="user_list_subscr">Listenbeobachter</string>
</resources>

View File

@ -53,4 +53,8 @@
<dimen name="tweet_media_button_margin">5dp</dimen>
<dimen name="editprofile_upload_button_padding">12dp</dimen>
<dimen name="tweet_location_progress_size">30dp</dimen>
<dimen name="list_button_height">24dp</dimen>
<dimen name="listitem_margin">4dp</dimen>
<dimen name="list_padding">5dp</dimen>
<dimen name="list_bar_padding">24dp</dimen>
</resources>

View File

@ -129,4 +129,9 @@
<string name="info_get_link">Get Twitter PIN from browser first. Please press the first button!</string>
<string name="error_media_not_found">Media not found!</string>
<string name="error_token_not_set">Please get link first!</string>
<string name="item_list_pb_desc">owner profile</string>
<string name="profile_lists">Lists</string>
<string name="list_created">created:</string>
<string name="list_appbar">Lists</string>
<string name="user_list_subscr">List subscriber</string>
</resources>