* merge toolbar fragment * Fix store screenshot generator * Fix alert color * Fix #609 * Fix crash * bigger hitbox for chips * support mastodon languages * merge ui utils * merge stuff * fix icon * ensure 48dp touch target * init local prefs, add helper function for enum values * update compose action layout * merge compose-adj files * update extended footer * fix poll wrong option checked closes sk22#641 * no border when disabled closes sk22#640 * Fix #610 * Minor fixes * Fix alert color * Fix #609 * Fix crash * Fix #610 * Minor fixes * add resources * more compatible mastodon language * fix html parser * mark as read on refresh * update tab bar * tweak m3 buttons * update compose-adj files * tweak and update styles * m3 expand button * flag icon should be 18dp, actually * More minor fixes closes #612 * More minor fixes closes #612 * Bump version * fix no create status event when redrafting * add material 3 assets * New translations strings.xml (Greek) * New translations strings.xml (Greek) * New translations strings.xml (Italian) * New translations strings.xml (Greek) * New translations strings.xml (Italian) * New translations strings.xml (Thai) * New translations strings.xml (Thai) * New translations strings.xml (Italian) * New translations strings.xml (Thai) * use new buttons for profile fragment * merge compose fragment * merge all the styles! oh dear * New translations full_description.txt (Indonesian) * New translations full_description.txt (Chinese Simplified) * New translations strings.xml (Chinese Simplified) * New translations full_description.txt (Chinese Simplified) * Fix #615 * Minor fixes * Fix #611 * A bunch of crash fixes * New translations strings.xml (Greek) * Make the default server configurable * Pass the system timezone to server when signing up * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Japanese) * Fix #615 * Minor fixes * Fix #611 * A bunch of crash fixes * Make the default server configurable * Pass the system timezone to server when signing up * oops. accidentally pasted the commit message in the code * Remove unused code that caused a crash for some users ¯\_(ツ)_/¯ * New translations strings.xml (Japanese) * New translations strings.xml (Japanese) * Remove unused code that caused a crash for some users ¯\_(ツ)_/¯ * New translations strings.xml (Polish) * New translations strings.xml (Polish) * New translations strings.xml (Turkish) * New translations strings.xml (Belarusian) * prepare merging profile fragment * merge profile fragment * New translations strings.xml (Belarusian) * New translations strings.xml (Greek) * fix icon padding * apply post header changes * minor margin tweaks * fix footer buttons * fix header announcement buttons * New translations strings.xml (Japanese) * New translations strings.xml (Japanese) * New translations strings.xml (Japanese) * New translations strings.xml (Japanese) * New translations strings.xml (Japanese) * New translations strings.xml (Japanese) * New translations full_description.txt (Japanese) * New translations strings.xml (Icelandic) * New translations strings.xml (Icelandic) * New translations strings.xml (Icelandic) * fix replying * New translations strings.xml (Icelandic) * fix translate button * fix more button visibility * fix counts label styling * fix disabled boost button opacity * fix tab layouts * fix notification icon color crash * New translations strings.xml (Greek) * implement elevation listener in home tab * fix elevation and listener in home tab * add elevation scroll listener to notifications * New translations strings.xml (Scottish Gaelic) * Add editorconfig So that PRs like #625 don't happen again * Crash fix * 🤔 * New translations strings.xml (Greek) * New translations strings.xml (Japanese) * New translations strings.xml (French) * New translations strings.xml (French) * New translations strings.xml (French) * fix notification elevation and integrate divider * 🤔 * Crash fix * Add editorconfig So that PRs like #625 don't happen again * New translations strings.xml (Turkish) * save interactions in cache * New translations strings.xml (Turkish) * merge new discover/search * New translations strings.xml (Bengali) * New translations strings.xml (Scottish Gaelic) * New translations strings.xml (Bengali) * merge new settings fragments * fix no auth callback always being executed * allow opening server info from profile closes sk22#593 * fix hide boosts icon color closes sk22#676 * New translations strings.xml (Turkish) * New translations strings.xml (Turkish) * New translations strings.xml (Turkish) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Turkish) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (German) * New translations strings.xml (German) * New translations strings.xml (Turkish) * update fedinuke list from source; doesn't contain any modifications regarding a recent issue * New translations strings.xml (Turkish) * remove unused class * fix crash * darken m3 outline color a bit * use m3 outline again * fix misalignment closes sk22#682 * New translations strings.xml (Turkish) * New translations full_description.txt (Turkish) * New translations short_description.txt (Turkish) * fix crash * fix metadata sorting * show pronouns in header/account lists * fix broken divider line closes sk22#679 * trim pronouns * improve pronoun display * New translations strings.xml (French) * New translations strings.xml (Japanese) * fix broken federated timeline closes sk22#685 * fix broken -1 fallback behavior closes sk22#681 * don't display nothing if server about request fails closes sk22#678 * New translations strings.xml (Ukrainian) * migrate global prefs to local prefs * do confirm unfollow by default * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * New translations full_description.txt (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Russian) * New translations strings.xml (Vietnamese) * New translations strings.xml (Ukrainian) * New translations strings.xml (Vietnamese) * New translations full_description.txt (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Vietnamese) * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * make sure list in prefs are always mutable and nut null * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * New translations strings.xml (Russian) * fix pronouns edge case * add back fix for stretched images closes sk22#636 * fix null pointer on missing default posting language * fix default posting language not being applied * bigger username hitbox closes sk22#688 * fix rtl header username alignment closes sk22#689 * New translations strings.xml (Ukrainian) * New translations strings.xml (Ukrainian) * hopefully fix crashes closes sk22#692 * New translations strings.xml (Ukrainian) * New translations full_description.txt (Ukrainian) * fix pronoun crash * New translations strings.xml (Persian) * New translations strings.xml (Ukrainian) * re-add true black mode * asterisk can be a pronoun * New translations strings.xml (Persian) * true black mode fixes and clean-ups * material 3 button background for switcher * darker tab bar selected background * better align follow/following button widths * restore rainbow refresh colors * fix search transition * fix min width issue with switcher button * fix no elevation when true black is enabled in light theme * use statusForContent to determine spoilerRevealed closes sk22#694 * New translations strings.xml (Persian) * New translations strings.xml (Persian) * New translations strings.xml (Persian) * New translations strings.xml (Persian) * New translations strings.xml (Persian) * New translations strings.xml (Persian) * fix profile tab bar in true black theme * fix m3 default button style closes sk22#697 * prettier role badges closes sk22#663 * fix translate button spacing closes sk22#655 * use m3 switches in dialogs closes sk22#653 * implement color palette switcher * fix color palettes being overwritten * add display and notification settings * clean up code * per-account single notification setting * add missing items to notification types * add prefix replies setting * add show replies/boosts and reply visibility * add load/see new posts settings * fix spectator mode missing spoiler padding * add a bunch of display settings * update fedinuke * add content type settings * add settings for local-onlu * add missing settings items * fix visibility button icon tint * hopefully fix some crashes * normalize padding above edit text * apparently, some people don't like pills closes sk22#706 * fix play button color closes sk22#705
263 lines
9.8 KiB
Java
263 lines
9.8 KiB
Java
package org.joinmastodon.android;
|
|
|
|
import android.Manifest;
|
|
import android.app.Fragment;
|
|
import android.app.assist.AssistContent;
|
|
import android.content.Intent;
|
|
import android.content.pm.PackageManager;
|
|
import android.net.Uri;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import android.view.View;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.Toast;
|
|
|
|
import org.joinmastodon.android.api.ObjectValidationException;
|
|
import org.joinmastodon.android.api.requests.search.GetSearchResults;
|
|
import org.joinmastodon.android.api.session.AccountSession;
|
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
|
import org.joinmastodon.android.fragments.ComposeFragment;
|
|
import org.joinmastodon.android.fragments.HomeFragment;
|
|
import org.joinmastodon.android.fragments.ProfileFragment;
|
|
import org.joinmastodon.android.fragments.ThreadFragment;
|
|
import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
|
|
import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment;
|
|
import org.joinmastodon.android.model.Notification;
|
|
import org.joinmastodon.android.model.SearchResults;
|
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
|
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
|
import org.joinmastodon.android.utils.ProvidesAssistContent;
|
|
import org.parceler.Parcels;
|
|
|
|
import androidx.annotation.Nullable;
|
|
import me.grishka.appkit.FragmentStackActivity;
|
|
import me.grishka.appkit.Nav;
|
|
import me.grishka.appkit.api.Callback;
|
|
import me.grishka.appkit.api.ErrorResponse;
|
|
|
|
public class MainActivity extends FragmentStackActivity implements ProvidesAssistContent {
|
|
@Override
|
|
protected void onCreate(@Nullable Bundle savedInstanceState){
|
|
UiUtils.setUserPreferredTheme(this);
|
|
super.onCreate(savedInstanceState);
|
|
|
|
if(savedInstanceState==null){
|
|
if(AccountSessionManager.getInstance().getLoggedInAccounts().isEmpty()){
|
|
showFragmentClearingBackStack(new CustomWelcomeFragment());
|
|
}else{
|
|
AccountSession session;
|
|
Bundle args=new Bundle();
|
|
Intent intent=getIntent();
|
|
if(intent.hasExtra("fromExternalShare")) {
|
|
AccountSessionManager.getInstance()
|
|
.setLastActiveAccountID(intent.getStringExtra("account"));
|
|
AccountSessionManager.getInstance().maybeUpdateLocalInfo(
|
|
AccountSessionManager.getInstance().getLastActiveAccount());
|
|
showFragmentForExternalShare(intent.getExtras());
|
|
return;
|
|
}
|
|
|
|
boolean fromNotification = intent.getBooleanExtra("fromNotification", false);
|
|
boolean hasNotification = intent.hasExtra("notification");
|
|
if(fromNotification){
|
|
String accountID=intent.getStringExtra("accountID");
|
|
try{
|
|
session=AccountSessionManager.getInstance().getAccount(accountID);
|
|
if(!hasNotification) args.putString("tab", "notifications");
|
|
}catch(IllegalStateException x){
|
|
session=AccountSessionManager.getInstance().getLastActiveAccount();
|
|
}
|
|
}else{
|
|
session=AccountSessionManager.getInstance().getLastActiveAccount();
|
|
}
|
|
AccountSessionManager.getInstance().maybeUpdateLocalInfo(session);
|
|
args.putString("account", session.getID());
|
|
Fragment fragment=session.activated ? new HomeFragment() : new AccountActivationFragment();
|
|
fragment.setArguments(args);
|
|
if(fromNotification && hasNotification){
|
|
Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
|
|
showFragmentForNotification(notification, session.getID());
|
|
} else if (intent.getBooleanExtra("compose", false)){
|
|
showCompose();
|
|
} else if (Intent.ACTION_VIEW.equals(intent.getAction())){
|
|
handleURL(intent.getData(), null);
|
|
} else {
|
|
showFragmentClearingBackStack(fragment);
|
|
maybeRequestNotificationsPermission();
|
|
}
|
|
}
|
|
}
|
|
|
|
if(GithubSelfUpdater.needSelfUpdating()){
|
|
GithubSelfUpdater.getInstance().maybeCheckForUpdates();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onNewIntent(Intent intent){
|
|
super.onNewIntent(intent);
|
|
AccountSessionManager.getInstance().maybeUpdateLocalInfo();
|
|
if (intent.hasExtra("fromExternalShare")) showFragmentForExternalShare(intent.getExtras());
|
|
else if (intent.getBooleanExtra("fromNotification", false)) {
|
|
String accountID=intent.getStringExtra("accountID");
|
|
try{
|
|
AccountSessionManager.getInstance().getAccount(accountID);
|
|
}catch(IllegalStateException x){
|
|
return;
|
|
}
|
|
if(intent.hasExtra("notification")){
|
|
Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
|
|
showFragmentForNotification(notification, accountID);
|
|
}else{
|
|
AccountSessionManager.getInstance().setLastActiveAccountID(accountID);
|
|
Bundle args=new Bundle();
|
|
args.putString("account", accountID);
|
|
args.putString("tab", "notifications");
|
|
Fragment fragment=new HomeFragment();
|
|
fragment.setArguments(args);
|
|
showFragmentClearingBackStack(fragment);
|
|
}
|
|
}else if(intent.getBooleanExtra("compose", false)){
|
|
showCompose();
|
|
}else if(Intent.ACTION_VIEW.equals(intent.getAction())){
|
|
handleURL(intent.getData(), null);
|
|
}/*else if(intent.hasExtra(PackageInstaller.EXTRA_STATUS) && GithubSelfUpdater.needSelfUpdating()){
|
|
GithubSelfUpdater.getInstance().handleIntentFromInstaller(intent, this);
|
|
}*/
|
|
}
|
|
|
|
public void handleURL(Uri uri, String accountID){
|
|
if(uri==null)
|
|
return;
|
|
if(!"https".equals(uri.getScheme()) && !"http".equals(uri.getScheme()))
|
|
return;
|
|
AccountSession session;
|
|
if(accountID==null)
|
|
session=AccountSessionManager.getInstance().getLastActiveAccount();
|
|
else
|
|
session=AccountSessionManager.get(accountID);
|
|
if(session==null || !session.activated)
|
|
return;
|
|
openSearchQuery(uri.toString(), session.getID(), R.string.opening_link, false);
|
|
}
|
|
|
|
public void openSearchQuery(String q, String accountID, int progressText, boolean fromSearch){
|
|
new GetSearchResults(q, null, true)
|
|
.setCallback(new Callback<>(){
|
|
@Override
|
|
public void onSuccess(SearchResults result){
|
|
Bundle args=new Bundle();
|
|
args.putString("account", accountID);
|
|
if(result.statuses!=null && !result.statuses.isEmpty()){
|
|
args.putParcelable("status", Parcels.wrap(result.statuses.get(0)));
|
|
Nav.go(MainActivity.this, ThreadFragment.class, args);
|
|
}else if(result.accounts!=null && !result.accounts.isEmpty()){
|
|
args.putParcelable("profileAccount", Parcels.wrap(result.accounts.get(0)));
|
|
Nav.go(MainActivity.this, ProfileFragment.class, args);
|
|
}else{
|
|
Toast.makeText(MainActivity.this, fromSearch ? R.string.no_search_results : R.string.link_not_supported, Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onError(ErrorResponse error){
|
|
error.showToast(MainActivity.this);
|
|
}
|
|
})
|
|
.wrapProgress(this, progressText, true)
|
|
.exec(accountID);
|
|
}
|
|
|
|
private void showFragmentForNotification(Notification notification, String accountID){
|
|
try{
|
|
notification.postprocess();
|
|
}catch(ObjectValidationException x){
|
|
Log.w("MainActivity", x);
|
|
return;
|
|
}
|
|
Bundle args = new Bundle();
|
|
args.putBoolean("noTransition", true);
|
|
UiUtils.showFragmentForNotification(this, notification, accountID, args);
|
|
}
|
|
|
|
private void showFragmentForExternalShare(Bundle args) {
|
|
String className = args.getString("fromExternalShare");
|
|
Fragment fragment = switch (className) {
|
|
case "ThreadFragment" -> new ThreadFragment();
|
|
case "ProfileFragment" -> new ProfileFragment();
|
|
default -> null;
|
|
};
|
|
if (fragment == null) return;
|
|
args.putBoolean("_can_go_back", true);
|
|
fragment.setArguments(args);
|
|
showFragment(fragment);
|
|
}
|
|
|
|
private void showCompose(){
|
|
AccountSession session=AccountSessionManager.getInstance().getLastActiveAccount();
|
|
if(session==null || !session.activated)
|
|
return;
|
|
ComposeFragment compose=new ComposeFragment();
|
|
Bundle composeArgs=new Bundle();
|
|
composeArgs.putString("account", session.getID());
|
|
compose.setArguments(composeArgs);
|
|
showFragment(compose);
|
|
}
|
|
|
|
private void maybeRequestNotificationsPermission(){
|
|
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU && checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS)!=PackageManager.PERMISSION_GRANTED){
|
|
requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, 100);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* when opening app through a notification: if (thread) fragment "can go back", clear back stack
|
|
* and show home fragment. upstream's implementation doesn't require this as it opens home first
|
|
* and then immediately switches to the notification's ThreadFragment. this causes a black
|
|
* screen in megalodon, for some reason, so i'm working around this that way.
|
|
*/
|
|
@Override
|
|
public void onBackPressed() {
|
|
Fragment currentFragment = getFragmentManager().findFragmentById(
|
|
(fragmentContainers.get(fragmentContainers.size() - 1)).getId()
|
|
);
|
|
Bundle currentArgs = currentFragment.getArguments();
|
|
if (fragmentContainers.size() != 1
|
|
|| currentArgs == null
|
|
|| !currentArgs.getBoolean("_can_go_back", false)) {
|
|
super.onBackPressed();
|
|
return;
|
|
}
|
|
if (currentArgs.getBoolean("_finish_on_back", false)) {
|
|
finish();
|
|
} else if (currentArgs.containsKey("account")) {
|
|
Bundle args = new Bundle();
|
|
args.putString("account", currentArgs.getString("account"));
|
|
if (getIntent().getBooleanExtra("fromNotification", false)) {
|
|
args.putString("tab", "notifications");
|
|
}
|
|
Fragment fragment=new HomeFragment();
|
|
fragment.setArguments(args);
|
|
showFragmentClearingBackStack(fragment);
|
|
}
|
|
}
|
|
|
|
public Fragment getCurrentFragment() {
|
|
for (int i = fragmentContainers.size() - 1; i >= 0; i--) {
|
|
FrameLayout fl = fragmentContainers.get(i);
|
|
if (fl.getVisibility() == View.VISIBLE) {
|
|
return getFragmentManager().findFragmentById(fl.getId());
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void onProvideAssistContent(AssistContent assistContent) {
|
|
super.onProvideAssistContent(assistContent);
|
|
Fragment fragment = getCurrentFragment();
|
|
if (fragment != null) callFragmentToProvideAssistContent(fragment, assistContent);
|
|
}
|
|
}
|