Compare commits
11 Commits
b580eb5c3d
...
2786e620da
Author | SHA1 | Date | |
---|---|---|---|
|
2786e620da | ||
|
7c5f184cc8 | ||
|
d5fff14cb0 | ||
|
5cdda037b2 | ||
|
0942f7c5ec | ||
|
efe90d0030 | ||
|
2d45f337d7 | ||
|
70cf6f3340 | ||
|
6542859892 | ||
|
143bc5e1b6 | ||
|
6e51ea6ee7 |
BIN
.assets/google-play-badge.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
@ -8,7 +8,7 @@ steps:
|
|||||||
sign:
|
sign:
|
||||||
image: alvrme/alpine-android:android-33-jdk11
|
image: alvrme/alpine-android:android-33-jdk11
|
||||||
commands:
|
commands:
|
||||||
- ./scripts/apk-sign.sh LemmInfinity-signed.apk app/build/outputs/apk/release/app-release-unsigned.apk
|
- ./scripts/apk-sign.sh Eternity-signed.apk app/build/outputs/apk/release/app-release-unsigned.apk
|
||||||
secrets: [ APK_KS_PASS, APK_KS, APK_KS_ALIAS ]
|
secrets: [ APK_KS_PASS, APK_KS, APK_KS_ALIAS ]
|
||||||
when:
|
when:
|
||||||
event: [ tag ]
|
event: [ tag ]
|
||||||
@ -17,7 +17,7 @@ steps:
|
|||||||
settings:
|
settings:
|
||||||
base_url: https://codeberg.org
|
base_url: https://codeberg.org
|
||||||
files:
|
files:
|
||||||
- LemmInfinity-signed.apk
|
- Eternity-signed.apk
|
||||||
api_key:
|
api_key:
|
||||||
from_secret: GITEA_ACCESS_TOKEN
|
from_secret: GITEA_ACCESS_TOKEN
|
||||||
target: main
|
target: main
|
||||||
|
22
README.md
@ -10,22 +10,28 @@ A Lemmy client for Android written in Java. It's a fork of the [Infinity for Red
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/raw/branch/master/fastlane/metadata/android/en-US/images/icon.png" width=256>
|
<img src="https://codeberg.org/Bazsalanszky/Eternity/raw/branch/master/fastlane/metadata/android/en-US/images/icon.png" width=256>
|
||||||
|
|
||||||
[![status-badge](https://ci.codeberg.org/api/badges/12474/status.svg)](https://ci.codeberg.org/repos/12474)
|
[![status-badge](https://ci.codeberg.org/api/badges/12474/status.svg)](https://ci.codeberg.org/repos/12474)
|
||||||
[![Liberapay patrons](https://img.shields.io/liberapay/patrons/bazsalanszky)](https://liberapay.com/Bazsalanszky)
|
[![Liberapay patrons](https://img.shields.io/liberapay/patrons/bazsalanszky)](https://liberapay.com/Bazsalanszky)
|
||||||
|
|
||||||
<a href="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues">Report a Bug</a>
|
<a href="https://codeberg.org/Bazsalanszky/Eternity/issues">Report a Bug</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
<a href="https://play.google.com/store/apps/details?id=eu.toldi.infinityforlemmy">
|
||||||
|
<img src="./.assets/google-play-badge.png" height="80">
|
||||||
|
</a>
|
||||||
<a href="https://apt.izzysoft.de/fdroid/index/apk/eu.toldi.infinityforlemmy">
|
<a href="https://apt.izzysoft.de/fdroid/index/apk/eu.toldi.infinityforlemmy">
|
||||||
<img src="./.assets/IzzyOnDroid.png" height="80">
|
<img src="./.assets/IzzyOnDroid.png" height="80">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/releases/">
|
<a href="https://codeberg.org/Bazsalanszky/Eternity/releases/">
|
||||||
<img src="./.assets/codeberg.png" height="80">
|
<img src="./.assets/codeberg.png" height="80">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -66,19 +72,19 @@ Don't forget to give the project a star! Thanks again!
|
|||||||
|
|
||||||
### Translation
|
### Translation
|
||||||
|
|
||||||
You can alos help Eternity by translating it to your native langugage! Translations are done via [Weblate](https://translate.codeberg.org/projects/infinity-for-lemmy/app/)!
|
You can alos help Eternity by translating it to your native langugage! Translations are done via [Weblate](https://translate.codeberg.org/projects/Eternity/app/)!
|
||||||
|
|
||||||
[![Translation](https://translate.codeberg.org/widgets/infinity-for-lemmy/-/app/multi-auto.svg)](https://translate.codeberg.org/engage/infinity-for-lemmy/)
|
[![Translation](https://translate.codeberg.org/widgets/Eternity/-/app/multi-auto.svg)](https://translate.codeberg.org/engage/Eternity/)
|
||||||
|
|
||||||
### Reporting bugs
|
### Reporting bugs
|
||||||
|
|
||||||
You can also contribute by [reporting bugs](https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues)
|
You can also contribute by [reporting bugs](https://codeberg.org/Bazsalanszky/Eternity/issues)
|
||||||
|
|
||||||
<p align="right">(<a href="#top">back to top</a>)</p>
|
<p align="right">(<a href="#top">back to top</a>)</p>
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Distributed under the AGPL-3.0 License. See <a href="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/src/branch/master/LICENSE">LICENSE</a> for more information.
|
Distributed under the AGPL-3.0 License. See <a href="https://codeberg.org/Bazsalanszky/Eternity/src/branch/master/LICENSE">LICENSE</a> for more information.
|
||||||
|
|
||||||
<p align="right">(<a href="#top">back to top</a>)</p>
|
<p align="right">(<a href="#top">back to top</a>)</p>
|
||||||
|
|
||||||
@ -86,6 +92,6 @@ Distributed under the AGPL-3.0 License. See <a href="https://codeberg.org/Bazsal
|
|||||||
|
|
||||||
[@bazsalanszky@lemmy.toldi.eu](https://lemmy.toldi.eu/u/bazsalanszky) - (Owner)
|
[@bazsalanszky@lemmy.toldi.eu](https://lemmy.toldi.eu/u/bazsalanszky) - (Owner)
|
||||||
|
|
||||||
Project Link: [https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy](https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy)
|
Project Link: [https://codeberg.org/Bazsalanszky/Eternity](https://codeberg.org/Bazsalanszky/Eternity)
|
||||||
|
|
||||||
<p align="right">(<a href="#top">back to top</a>)</p>
|
<p align="right">(<a href="#top">back to top</a>)</p>
|
||||||
|
@ -21,8 +21,8 @@ android {
|
|||||||
applicationId "eu.toldi.infinityforlemmy"
|
applicationId "eu.toldi.infinityforlemmy"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 33
|
targetSdk 33
|
||||||
versionCode 129
|
versionCode 130
|
||||||
versionName "0.1.0"
|
versionName "0.1.1"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
javaCompileOptions {
|
javaCompileOptions {
|
||||||
annotationProcessorOptions {
|
annotationProcessorOptions {
|
||||||
|
@ -7,6 +7,7 @@ import android.content.pm.PackageManager;
|
|||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.webkit.URLUtil;
|
import android.webkit.URLUtil;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
@ -17,8 +18,11 @@ import androidx.browser.customtabs.CustomTabsService;
|
|||||||
|
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
@ -29,6 +33,7 @@ import eu.toldi.infinityforlemmy.RetrofitHolder;
|
|||||||
import eu.toldi.infinityforlemmy.comment.Comment;
|
import eu.toldi.infinityforlemmy.comment.Comment;
|
||||||
import eu.toldi.infinityforlemmy.comment.FetchComment;
|
import eu.toldi.infinityforlemmy.comment.FetchComment;
|
||||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||||
|
import eu.toldi.infinityforlemmy.post.FetchPost;
|
||||||
import eu.toldi.infinityforlemmy.post.ObjectResolver;
|
import eu.toldi.infinityforlemmy.post.ObjectResolver;
|
||||||
import eu.toldi.infinityforlemmy.post.Post;
|
import eu.toldi.infinityforlemmy.post.Post;
|
||||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||||
@ -75,6 +80,9 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
@Named("no_oauth")
|
@Named("no_oauth")
|
||||||
RetrofitHolder mRetrofit;
|
RetrofitHolder mRetrofit;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
Executor mExecutor;
|
||||||
|
|
||||||
private String mAccessToken;
|
private String mAccessToken;
|
||||||
|
|
||||||
private Uri getRedditUriByPath(String path) {
|
private Uri getRedditUriByPath(String path) {
|
||||||
@ -100,14 +108,14 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
String url = getIntent().getStringExtra(Intent.EXTRA_TEXT);
|
String url = getIntent().getStringExtra(Intent.EXTRA_TEXT);
|
||||||
if (!URLUtil.isValidUrl(url)) {
|
if (!URLUtil.isValidUrl(url)) {
|
||||||
Toast.makeText(this, R.string.invalid_link, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.invalid_link, Toast.LENGTH_SHORT).show();
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
uri = Uri.parse(url);
|
uri = Uri.parse(url);
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
Toast.makeText(this, R.string.invalid_link, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.invalid_link, Toast.LENGTH_SHORT).show();
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -115,7 +123,7 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
if (uri.getScheme() == null && uri.getHost() == null) {
|
if (uri.getScheme() == null && uri.getHost() == null) {
|
||||||
if (uri.toString().isEmpty()) {
|
if (uri.toString().isEmpty()) {
|
||||||
Toast.makeText(this, R.string.invalid_link, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.invalid_link, Toast.LENGTH_SHORT).show();
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -127,7 +135,7 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
private void handleUri(Uri uri) {
|
private void handleUri(Uri uri) {
|
||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
Toast.makeText(this, R.string.no_link_available, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.no_link_available, Toast.LENGTH_SHORT).show();
|
||||||
} else {
|
} else {
|
||||||
String path = uri.getPath();
|
String path = uri.getPath();
|
||||||
if (path == null) {
|
if (path == null) {
|
||||||
@ -201,6 +209,34 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
|
intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
} else {
|
} else {
|
||||||
|
boolean local = false;
|
||||||
|
try {
|
||||||
|
URL baseURL = new URL(mRetrofit.getBaseURL());
|
||||||
|
if (baseURL.getHost().equalsIgnoreCase(uri.getHost())) {
|
||||||
|
local = true;
|
||||||
|
FetchPost.fetchPost(mExecutor, new Handler(), mRetrofit.getRetrofit(), segments.get(segments.size() - 1), mAccessToken, new FetchPost.FetchPostListener() {
|
||||||
|
@Override
|
||||||
|
public void fetchPostSuccess(Post post) {
|
||||||
|
|
||||||
|
Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, post.getId());
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fetchPostFailed() {
|
||||||
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
if (!local) {
|
||||||
mObjectResolver.resolvePost(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
|
mObjectResolver.resolvePost(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onResolveObjectSuccess(Object p) {
|
public void onResolveObjectSuccess(Object p) {
|
||||||
@ -214,11 +250,12 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResolveObjectFailed() {
|
public void onResolveObjectFailed() {
|
||||||
Toast.makeText(LinkResolverActivity.this, R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (uri.toString().matches(COMMENT_PATTERN)) {
|
} else if (uri.toString().matches(COMMENT_PATTERN)) {
|
||||||
if (mAccessToken == null) {
|
if (mAccessToken == null) {
|
||||||
mRetrofit.setBaseURL(uri.getScheme() + "://" + uri.getHost() + "/");
|
mRetrofit.setBaseURL(uri.getScheme() + "://" + uri.getHost() + "/");
|
||||||
@ -237,11 +274,41 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFetchCommentFailed() {
|
public void onFetchCommentFailed() {
|
||||||
Toast.makeText(LinkResolverActivity.this, R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
boolean local = false;
|
||||||
|
try {
|
||||||
|
URL baseURL = new URL(mRetrofit.getBaseURL());
|
||||||
|
if (baseURL.getHost().equalsIgnoreCase(uri.getHost())) {
|
||||||
|
local = true;
|
||||||
|
FetchComment.fetchSingleComment(mRetrofit.getRetrofit(), mAccessToken, Integer.parseInt(segments.get(segments.size() - 1)), new FetchComment.FetchCommentListener() {
|
||||||
|
@Override
|
||||||
|
public void onFetchCommentSuccess(ArrayList<Comment> comments, Integer parentId, ArrayList<Integer> moreChildrenIds) {
|
||||||
|
Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
|
||||||
|
Comment comment = comments.get(0);
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, comment.getPostId());
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, comment.getId());
|
||||||
|
intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_PARENT_ID, comment.getParentId());
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFetchCommentFailed() {
|
||||||
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
if (!local) {
|
||||||
mObjectResolver.resolveComment(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
|
mObjectResolver.resolveComment(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onResolveObjectSuccess(Object c) {
|
public void onResolveObjectSuccess(Object c) {
|
||||||
@ -257,11 +324,12 @@ public class LinkResolverActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResolveObjectFailed() {
|
public void onResolveObjectFailed() {
|
||||||
Toast.makeText(LinkResolverActivity.this, R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (authority.equals("v.redd.it")) {
|
} else if (authority.equals("v.redd.it")) {
|
||||||
Intent intent = new Intent(this, ViewVideoActivity.class);
|
Intent intent = new Intent(this, ViewVideoActivity.class);
|
||||||
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_V_REDD_IT);
|
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_V_REDD_IT);
|
||||||
|
@ -365,7 +365,8 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
|
|||||||
super.onResume();
|
super.onResume();
|
||||||
if (mAccessToken == null) {
|
if (mAccessToken == null) {
|
||||||
String instancePreference = mSharedPreferences.getString(SharedPreferencesUtils.ANONYMOUS_ACCOUNT_INSTANCE, APIUtils.API_BASE_URI);
|
String instancePreference = mSharedPreferences.getString(SharedPreferencesUtils.ANONYMOUS_ACCOUNT_INSTANCE, APIUtils.API_BASE_URI);
|
||||||
if (!mRetrofit.getBaseURL().equalsIgnoreCase(instancePreference)) {
|
if (!instancePreference.startsWith(mRetrofit.getBaseURL())) {
|
||||||
|
mRetrofit.setBaseURL(instancePreference);
|
||||||
this.recreate();
|
this.recreate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -433,12 +433,14 @@ public class SearchActivity extends BaseActivity {
|
|||||||
if (resultCode == RESULT_OK && data != null) {
|
if (resultCode == RESULT_OK && data != null) {
|
||||||
if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE) {
|
if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE) {
|
||||||
communityData = data.getParcelableExtra(SubredditSelectionActivity.EXTRA_RETURN_COMMUNITY_DATA);
|
communityData = data.getParcelableExtra(SubredditSelectionActivity.EXTRA_RETURN_COMMUNITY_DATA);
|
||||||
subredditName = communityData.getName();
|
|
||||||
subredditIsUser = false;
|
subredditIsUser = false;
|
||||||
|
|
||||||
if (subredditName == null) {
|
if (communityData == null) {
|
||||||
subredditNameTextView.setText(R.string.all_communities);
|
subredditNameTextView.setText(R.string.all_communities);
|
||||||
} else {
|
} else {
|
||||||
|
subredditName = communityData.getName();
|
||||||
|
communityQualifiedName = communityData.getQualified_name();
|
||||||
subredditNameTextView.setText(subredditName);
|
subredditNameTextView.setText(subredditName);
|
||||||
}
|
}
|
||||||
} else if (requestCode == SUBREDDIT_SEARCH_REQUEST_CODE) {
|
} else if (requestCode == SUBREDDIT_SEARCH_REQUEST_CODE) {
|
||||||
|
@ -672,10 +672,12 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
|||||||
// mVisibleComments.get(parentPosition).removeMoreChildrenIds();
|
// mVisibleComments.get(parentPosition).removeMoreChildrenIds();
|
||||||
|
|
||||||
if (position != -1) {
|
if (position != -1) {
|
||||||
mVisibleComments.remove(position);
|
|
||||||
if (mIsSingleCommentThreadMode) {
|
if (mIsSingleCommentThreadMode) {
|
||||||
|
mVisibleComments.remove(position - 1);
|
||||||
notifyItemRemoved(position + 1);
|
notifyItemRemoved(position + 1);
|
||||||
} else {
|
} else {
|
||||||
|
mVisibleComments.remove(position);
|
||||||
notifyItemRemoved(position);
|
notifyItemRemoved(position);
|
||||||
}
|
}
|
||||||
List<Comment> trulyNewComments = new ArrayList<>();
|
List<Comment> trulyNewComments = new ArrayList<>();
|
||||||
|
@ -87,9 +87,9 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
return VIEW_TYPE_SUBREDDIT;
|
return VIEW_TYPE_SUBREDDIT;
|
||||||
} else if (position == 1) {
|
} else if (position == 1) {
|
||||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||||
} else if (position == mFavoriteSubscribedSubredditData.size() + 2) {
|
} else if (position == mFavoriteSubscribedSubredditData.size() + 1) {
|
||||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||||
} else if (position <= mFavoriteSubscribedSubredditData.size() + 1) {
|
} else if (position < mFavoriteSubscribedSubredditData.size() + 1) {
|
||||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||||
} else {
|
} else {
|
||||||
return VIEW_TYPE_SUBREDDIT;
|
return VIEW_TYPE_SUBREDDIT;
|
||||||
@ -98,12 +98,10 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
if (position == 0) {
|
if (position == 0) {
|
||||||
return VIEW_TYPE_SUBREDDIT;
|
return VIEW_TYPE_SUBREDDIT;
|
||||||
} else if (position == 1) {
|
} else if (position == 1) {
|
||||||
return VIEW_TYPE_SUBREDDIT;
|
|
||||||
} else if (position == 2) {
|
|
||||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||||
} else if (position == mFavoriteSubscribedSubredditData.size() + 3) {
|
} else if (position == mFavoriteSubscribedSubredditData.size() + 2) {
|
||||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||||
} else if (position <= mFavoriteSubscribedSubredditData.size() + 2) {
|
} else if (position < mFavoriteSubscribedSubredditData.size() + 2) {
|
||||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||||
} else {
|
} else {
|
||||||
return VIEW_TYPE_SUBREDDIT;
|
return VIEW_TYPE_SUBREDDIT;
|
||||||
@ -159,7 +157,7 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
if (hasClearSelectionRow) {
|
if (hasClearSelectionRow) {
|
||||||
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
||||||
mFavoriteSubscribedSubredditData.size() + 4 : 2;
|
mFavoriteSubscribedSubredditData.size() + 3 : 1;
|
||||||
} else {
|
} else {
|
||||||
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
||||||
mFavoriteSubscribedSubredditData.size() + 3 : 1;
|
mFavoriteSubscribedSubredditData.size() + 3 : 1;
|
||||||
@ -170,7 +168,7 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SubscribedSubredditData communityData = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset);
|
|
||||||
name = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
|
name = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
|
||||||
fullname = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset).getQualified_name();
|
fullname = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset).getQualified_name();
|
||||||
iconUrl = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset).getIconUrl();
|
iconUrl = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset).getIconUrl();
|
||||||
@ -195,6 +193,7 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
|
SubscribedSubredditData communityData = mSubscribedSubredditData.get(viewHolder.getBindingAdapterPosition() - offset);
|
||||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(communityData));
|
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(communityData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,7 +226,7 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
int offset;
|
int offset;
|
||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
if (hasClearSelectionRow) {
|
if (hasClearSelectionRow) {
|
||||||
offset = 3;
|
offset = 2;
|
||||||
} else {
|
} else {
|
||||||
offset = 2;
|
offset = 2;
|
||||||
}
|
}
|
||||||
@ -289,25 +288,16 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
if (mSubscribedSubredditData != null) {
|
if (mSubscribedSubredditData != null) {
|
||||||
if (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) {
|
if (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) {
|
||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
if (hasClearSelectionRow) {
|
|
||||||
return mSubscribedSubredditData.size() > 0 ?
|
|
||||||
mFavoriteSubscribedSubredditData.size() + mSubscribedSubredditData.size() + 4 : 0;
|
|
||||||
} else {
|
|
||||||
return mSubscribedSubredditData.size() > 0 ?
|
return mSubscribedSubredditData.size() > 0 ?
|
||||||
mFavoriteSubscribedSubredditData.size() + mSubscribedSubredditData.size() + 3 : 0;
|
mFavoriteSubscribedSubredditData.size() + mSubscribedSubredditData.size() + 3 : 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return mSubscribedSubredditData.size() > 0 ?
|
return mSubscribedSubredditData.size() > 0 ?
|
||||||
mFavoriteSubscribedSubredditData.size() + mSubscribedSubredditData.size() + 2 : 0;
|
mFavoriteSubscribedSubredditData.size() + mSubscribedSubredditData.size() + 2 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
if (hasClearSelectionRow) {
|
|
||||||
return mSubscribedSubredditData.size() > 0 ? mSubscribedSubredditData.size() + 2 : 0;
|
|
||||||
} else {
|
|
||||||
return mSubscribedSubredditData.size() > 0 ? mSubscribedSubredditData.size() + 1 : 0;
|
return mSubscribedSubredditData.size() > 0 ? mSubscribedSubredditData.size() + 1 : 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return mSubscribedSubredditData.size();
|
return mSubscribedSubredditData.size();
|
||||||
}
|
}
|
||||||
@ -356,7 +346,7 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
if (hasClearSelectionRow) {
|
if (hasClearSelectionRow) {
|
||||||
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
||||||
mFavoriteSubscribedSubredditData.size() + 4 : 0;
|
mFavoriteSubscribedSubredditData.size() + 3 : 0;
|
||||||
} else {
|
} else {
|
||||||
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
offset = (mFavoriteSubscribedSubredditData != null && mFavoriteSubscribedSubredditData.size() > 0) ?
|
||||||
mFavoriteSubscribedSubredditData.size() + 3 : 0;
|
mFavoriteSubscribedSubredditData.size() + 3 : 0;
|
||||||
@ -372,7 +362,7 @@ public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapte
|
|||||||
int offset;
|
int offset;
|
||||||
if (itemClickListener != null) {
|
if (itemClickListener != null) {
|
||||||
if (hasClearSelectionRow) {
|
if (hasClearSelectionRow) {
|
||||||
offset = 3;
|
offset = 2;
|
||||||
} else {
|
} else {
|
||||||
offset = 2;
|
offset = 2;
|
||||||
}
|
}
|
||||||
|
@ -118,25 +118,20 @@ public class InsertSubscribedThings {
|
|||||||
(List<SubscribedSubredditData> newSubscribedSubreddits,
|
(List<SubscribedSubredditData> newSubscribedSubreddits,
|
||||||
List<SubscribedSubredditData> oldSubscribedSubreddits,
|
List<SubscribedSubredditData> oldSubscribedSubreddits,
|
||||||
List<String> unsubscribedSubredditNames) {
|
List<String> unsubscribedSubredditNames) {
|
||||||
int newIndex = 0;
|
List<String> oldSubredditNames = new ArrayList<>();
|
||||||
for (int oldIndex = 0; oldIndex < oldSubscribedSubreddits.size(); oldIndex++) {
|
for (SubscribedSubredditData subredditData : oldSubscribedSubreddits) {
|
||||||
if (newIndex >= newSubscribedSubreddits.size()) {
|
oldSubredditNames.add(subredditData.getQualified_name());
|
||||||
for (; oldIndex < oldSubscribedSubreddits.size(); oldIndex++) {
|
|
||||||
unsubscribedSubredditNames.add(oldSubscribedSubreddits.get(oldIndex).getQualified_name());
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SubscribedSubredditData old = oldSubscribedSubreddits.get(oldIndex);
|
List<String> newSubredditNames = new ArrayList<>();
|
||||||
for (; newIndex < newSubscribedSubreddits.size(); newIndex++) {
|
for (SubscribedSubredditData subredditData : newSubscribedSubreddits) {
|
||||||
if (newSubscribedSubreddits.get(newIndex).getQualified_name().compareToIgnoreCase(old.getQualified_name()) == 0) {
|
newSubredditNames.add(subredditData.getQualified_name());
|
||||||
newIndex++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (newSubscribedSubreddits.get(newIndex).getQualified_name().compareToIgnoreCase(old.getQualified_name()) > 0) {
|
|
||||||
unsubscribedSubredditNames.add(old.getQualified_name());
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (String subredditName : oldSubredditNames) {
|
||||||
|
if (!newSubredditNames.contains(subredditName)) {
|
||||||
|
unsubscribedSubredditNames.add(subredditName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ public class DownloadMediaService extends Service {
|
|||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||||
File directory = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
|
File directory = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
|
||||||
if (directory != null) {
|
if (directory != null) {
|
||||||
String directoryPath = separateDownloadFolder && subredditName != null && !subredditName.equals("") ? directory.getAbsolutePath() + "/Infinity/" + subredditName + "/" : directory.getAbsolutePath() + "/Infinity/";
|
String directoryPath = separateDownloadFolder && subredditName != null && !subredditName.equals("") ? directory.getAbsolutePath() + "/Eternity/" + subredditName + "/" : directory.getAbsolutePath() + "/Eternity/";
|
||||||
File infinityDir = new File(directoryPath);
|
File infinityDir = new File(directoryPath);
|
||||||
if (!infinityDir.exists() && !infinityDir.mkdirs()) {
|
if (!infinityDir.exists() && !infinityDir.mkdirs()) {
|
||||||
downloadFinished(mediaType, randomNotificationIdOffset, mimeType,
|
downloadFinished(mediaType, randomNotificationIdOffset, mimeType,
|
||||||
@ -168,7 +168,7 @@ public class DownloadMediaService extends Service {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String dir = mediaType == EXTRA_MEDIA_TYPE_VIDEO ? Environment.DIRECTORY_MOVIES : Environment.DIRECTORY_PICTURES;
|
String dir = mediaType == EXTRA_MEDIA_TYPE_VIDEO ? Environment.DIRECTORY_MOVIES : Environment.DIRECTORY_PICTURES;
|
||||||
destinationFileUriString = separateDownloadFolder && subredditName != null && !subredditName.equals("") ? dir + "/Infinity/" + subredditName + "/" : dir + "/Infinity/";
|
destinationFileUriString = separateDownloadFolder && subredditName != null && !subredditName.equals("") ? dir + "/Eternity/" + subredditName + "/" : dir + "/Eternity/";
|
||||||
}
|
}
|
||||||
isDefaultDestination = true;
|
isDefaultDestination = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -31,7 +31,7 @@ public interface SubscribedSubredditDao {
|
|||||||
@Query("SELECT * from subscribed_subreddits WHERE qualified_name = :qualified_name COLLATE NOCASE AND username = :accountName COLLATE NOCASE LIMIT 1")
|
@Query("SELECT * from subscribed_subreddits WHERE qualified_name = :qualified_name COLLATE NOCASE AND username = :accountName COLLATE NOCASE LIMIT 1")
|
||||||
SubscribedSubredditData getSubscribedSubredditByQualifiedName(String qualified_name, String accountName);
|
SubscribedSubredditData getSubscribedSubredditByQualifiedName(String qualified_name, String accountName);
|
||||||
|
|
||||||
@Query("DELETE FROM subscribed_subreddits WHERE name = :subredditName COLLATE NOCASE AND username = :accountName COLLATE NOCASE")
|
@Query("DELETE FROM subscribed_subreddits WHERE qualified_name = :subredditName COLLATE NOCASE AND username = :accountName COLLATE NOCASE")
|
||||||
void deleteSubscribedSubreddit(String subredditName, String accountName);
|
void deleteSubscribedSubreddit(String subredditName, String accountName);
|
||||||
|
|
||||||
@Query("SELECT * from subscribed_subreddits WHERE username = :qualified_name AND name LIKE '%' || :searchQuery || '%' COLLATE NOCASE AND is_favorite = 1 ORDER BY name COLLATE NOCASE ASC")
|
@Query("SELECT * from subscribed_subreddits WHERE username = :qualified_name AND name LIKE '%' || :searchQuery || '%' COLLATE NOCASE AND is_favorite = 1 ORDER BY name COLLATE NOCASE ASC")
|
||||||
|
@ -129,13 +129,13 @@ public class SubscribedSubredditData implements Parcelable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return id;
|
return id + username.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(@Nullable Object obj) {
|
public boolean equals(@Nullable Object obj) {
|
||||||
if (obj instanceof SubscribedSubredditData) {
|
if (obj instanceof SubscribedSubredditData) {
|
||||||
return id == ((SubscribedSubredditData) obj).getId();
|
return id == ((SubscribedSubredditData) obj).getId() && username.equalsIgnoreCase(((SubscribedSubredditData) obj).getUsername());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.9 MiB |
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 402 KiB After Width: | Height: | Size: 1.8 MiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
Normal file
After Width: | Height: | Size: 865 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
Normal file
After Width: | Height: | Size: 1.8 MiB |