mirror of
				https://codeberg.org/tom79/Fedilab.git
				synced 2025-10-20 11:20:16 +03:00 
			
		
		
		
	Merge branch 'develop'
This commit is contained in:
		
						commit
						5766bfce32
					
				
					 18 changed files with 124 additions and 50 deletions
				
			
		| 
						 | 
					@ -13,8 +13,8 @@ android {
 | 
				
			||||||
    defaultConfig {
 | 
					    defaultConfig {
 | 
				
			||||||
        minSdk 21
 | 
					        minSdk 21
 | 
				
			||||||
        targetSdk 33
 | 
					        targetSdk 33
 | 
				
			||||||
        versionCode 455
 | 
					        versionCode 456
 | 
				
			||||||
        versionName "3.13.1"
 | 
					        versionName "3.13.2"
 | 
				
			||||||
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
					        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    flavorDimensions "default"
 | 
					    flavorDimensions "default"
 | 
				
			||||||
| 
						 | 
					@ -109,7 +109,7 @@ dependencies {
 | 
				
			||||||
    implementation("com.vanniktech:android-image-cropper:4.3.3")
 | 
					    implementation("com.vanniktech:android-image-cropper:4.3.3")
 | 
				
			||||||
    annotationProcessor "com.github.bumptech.glide:compiler:4.12.0"
 | 
					    annotationProcessor "com.github.bumptech.glide:compiler:4.12.0"
 | 
				
			||||||
    implementation 'jp.wasabeef:glide-transformations:4.3.0'
 | 
					    implementation 'jp.wasabeef:glide-transformations:4.3.0'
 | 
				
			||||||
    implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.24.0'
 | 
					    implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.23.0'
 | 
				
			||||||
    implementation 'com.google.android.exoplayer:exoplayer:2.18.1'
 | 
					    implementation 'com.google.android.exoplayer:exoplayer:2.18.1'
 | 
				
			||||||
    implementation "androidx.viewpager2:viewpager2:1.0.0"
 | 
					    implementation "androidx.viewpager2:viewpager2:1.0.0"
 | 
				
			||||||
    implementation 'com.github.piasy:rxandroidaudio:1.7.0'
 | 
					    implementation 'com.github.piasy:rxandroidaudio:1.7.0'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,9 @@
 | 
				
			||||||
[
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "version": "3.13.2",
 | 
				
			||||||
 | 
					    "code": "456",
 | 
				
			||||||
 | 
					    "note": "Changed:\n- Hidden media smaller with preview images\n\nFixed:\n- Issue with Media for Android 11+\n- Crash when not setting a translation key\n- Fix DeepL for API pro\n- Crash when visiting a profile with a lot of media\n- Home muted accounts not working without filters\n- Animated custom emoji not displayed"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "version": "3.13.1",
 | 
					    "version": "3.13.1",
 | 
				
			||||||
    "code": "455",
 | 
					    "code": "455",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,7 @@ import static app.fedilab.android.helper.Helper.PREF_USER_TOKEN;
 | 
				
			||||||
import static app.fedilab.android.helper.Helper.displayReleaseNotesIfNeeded;
 | 
					import static app.fedilab.android.helper.Helper.displayReleaseNotesIfNeeded;
 | 
				
			||||||
import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction;
 | 
					import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.Manifest;
 | 
				
			||||||
import android.annotation.SuppressLint;
 | 
					import android.annotation.SuppressLint;
 | 
				
			||||||
import android.content.BroadcastReceiver;
 | 
					import android.content.BroadcastReceiver;
 | 
				
			||||||
import android.content.Context;
 | 
					import android.content.Context;
 | 
				
			||||||
| 
						 | 
					@ -51,12 +52,15 @@ import android.widget.LinearLayout;
 | 
				
			||||||
import android.widget.TextView;
 | 
					import android.widget.TextView;
 | 
				
			||||||
import android.widget.Toast;
 | 
					import android.widget.Toast;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import androidx.activity.result.ActivityResultLauncher;
 | 
				
			||||||
 | 
					import androidx.activity.result.contract.ActivityResultContracts;
 | 
				
			||||||
import androidx.annotation.NonNull;
 | 
					import androidx.annotation.NonNull;
 | 
				
			||||||
import androidx.annotation.Nullable;
 | 
					import androidx.annotation.Nullable;
 | 
				
			||||||
import androidx.appcompat.app.ActionBar;
 | 
					import androidx.appcompat.app.ActionBar;
 | 
				
			||||||
import androidx.appcompat.app.AlertDialog;
 | 
					import androidx.appcompat.app.AlertDialog;
 | 
				
			||||||
import androidx.appcompat.widget.PopupMenu;
 | 
					import androidx.appcompat.widget.PopupMenu;
 | 
				
			||||||
import androidx.appcompat.widget.SearchView;
 | 
					import androidx.appcompat.widget.SearchView;
 | 
				
			||||||
 | 
					import androidx.core.app.ActivityCompat;
 | 
				
			||||||
import androidx.core.app.ActivityOptionsCompat;
 | 
					import androidx.core.app.ActivityOptionsCompat;
 | 
				
			||||||
import androidx.core.view.GravityCompat;
 | 
					import androidx.core.view.GravityCompat;
 | 
				
			||||||
import androidx.fragment.app.Fragment;
 | 
					import androidx.fragment.app.Fragment;
 | 
				
			||||||
| 
						 | 
					@ -290,6 +294,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    private NetworkStateReceiver networkStateReceiver;
 | 
					    private NetworkStateReceiver networkStateReceiver;
 | 
				
			||||||
    private boolean headerMenuOpen;
 | 
					    private boolean headerMenuOpen;
 | 
				
			||||||
 | 
					    private static final int REQUEST_CODE = 5415;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
					    protected void onCreate(Bundle savedInstanceState) {
 | 
				
			||||||
| 
						 | 
					@ -304,6 +309,15 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            BaseMainActivity.currentToken = sharedpreferences.getString(Helper.PREF_USER_TOKEN, null);
 | 
					            BaseMainActivity.currentToken = sharedpreferences.getString(Helper.PREF_USER_TOKEN, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
 | 
				
			||||||
 | 
					            ActivityResultLauncher<String> permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
 | 
				
			||||||
 | 
					                if (!isGranted) {
 | 
				
			||||||
 | 
					                    ActivityCompat.requestPermissions(BaseMainActivity.this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_CODE);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        filteredAccounts = new ArrayList<>();
 | 
					        filteredAccounts = new ArrayList<>();
 | 
				
			||||||
        mamageNewIntent(getIntent());
 | 
					        mamageNewIntent(getIntent());
 | 
				
			||||||
        filterFetched = false;
 | 
					        filterFetched = false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -243,8 +243,17 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload
 | 
				
			||||||
            int position = binding.mediaViewpager.getCurrentItem();
 | 
					            int position = binding.mediaViewpager.getCurrentItem();
 | 
				
			||||||
            Attachment attachment = attachments.get(position);
 | 
					            Attachment attachment = attachments.get(position);
 | 
				
			||||||
            if (Build.VERSION.SDK_INT >= 23) {
 | 
					            if (Build.VERSION.SDK_INT >= 23) {
 | 
				
			||||||
                if (ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 | 
					                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
				
			||||||
                    ActivityCompat.requestPermissions(MediaActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Helper.EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE);
 | 
					                    if (ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
 | 
					                        ActivityCompat.requestPermissions(MediaActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Helper.EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE);
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        if (attachment.type.compareTo("image") == 0) {
 | 
				
			||||||
 | 
					                            MediaHelper.manageMove(MediaActivity.this, attachment.url, false);
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url);
 | 
				
			||||||
 | 
					                            downloadID = -1;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    if (attachment.type.compareTo("image") == 0) {
 | 
					                    if (attachment.type.compareTo("image") == 0) {
 | 
				
			||||||
                        MediaHelper.manageMove(MediaActivity.this, attachment.url, false);
 | 
					                        MediaHelper.manageMove(MediaActivity.this, attachment.url, false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,28 +94,29 @@ public class CustomEmoji extends ReplacementSpan {
 | 
				
			||||||
            @Override
 | 
					            @Override
 | 
				
			||||||
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
 | 
					            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
 | 
				
			||||||
                View view = viewWeakReference.get();
 | 
					                View view = viewWeakReference.get();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (animate && resource instanceof Animatable) {
 | 
					                if (animate && resource instanceof Animatable) {
 | 
				
			||||||
                    Drawable.Callback callback = resource.getCallback();
 | 
					                    Drawable.Callback drawableCallBack = resource.getCallback();
 | 
				
			||||||
                    resource.setCallback(new Drawable.Callback() {
 | 
					                    resource.setCallback(new Drawable.Callback() {
 | 
				
			||||||
                        @Override
 | 
					                        @Override
 | 
				
			||||||
                        public void invalidateDrawable(@NonNull Drawable drawable) {
 | 
					                        public void invalidateDrawable(@NonNull Drawable drawable) {
 | 
				
			||||||
                            if (callback != null) {
 | 
					                            if (drawableCallBack != null) {
 | 
				
			||||||
                                callback.invalidateDrawable(drawable);
 | 
					                                drawableCallBack.invalidateDrawable(drawable);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            view.invalidate();
 | 
					                            view.invalidate();
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        @Override
 | 
					                        @Override
 | 
				
			||||||
                        public void scheduleDrawable(@NonNull Drawable drawable, @NonNull Runnable runnable, long l) {
 | 
					                        public void scheduleDrawable(@NonNull Drawable drawable, @NonNull Runnable runnable, long l) {
 | 
				
			||||||
                            if (callback != null) {
 | 
					                            if (drawableCallBack != null) {
 | 
				
			||||||
                                callback.scheduleDrawable(drawable, runnable, l);
 | 
					                                drawableCallBack.scheduleDrawable(drawable, runnable, l);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        @Override
 | 
					                        @Override
 | 
				
			||||||
                        public void unscheduleDrawable(@NonNull Drawable drawable, @NonNull Runnable runnable) {
 | 
					                        public void unscheduleDrawable(@NonNull Drawable drawable, @NonNull Runnable runnable) {
 | 
				
			||||||
                            if (callback != null) {
 | 
					                            if (drawableCallBack != null) {
 | 
				
			||||||
                                callback.unscheduleDrawable(drawable, runnable);
 | 
					                                drawableCallBack.unscheduleDrawable(drawable, runnable);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,7 +156,8 @@ public class TimelineHelper {
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (statuses != null && statuses.size() > 0) {
 | 
				
			||||||
            SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
 | 
					            SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
 | 
				
			||||||
            boolean groupReblogs = sharedpreferences.getBoolean(context.getString(R.string.SET_GROUP_REBLOGS), true);
 | 
					            boolean groupReblogs = sharedpreferences.getBoolean(context.getString(R.string.SET_GROUP_REBLOGS), true);
 | 
				
			||||||
            if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
 | 
					            if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
 | 
				
			||||||
| 
						 | 
					@ -172,6 +173,7 @@ public class TimelineHelper {
 | 
				
			||||||
                                filterCustom.title = "Fedilab";
 | 
					                                filterCustom.title = "Fedilab";
 | 
				
			||||||
                                filterCustom.context = contextCustom;
 | 
					                                filterCustom.context = contextCustom;
 | 
				
			||||||
                                statuses.get(i).filteredByApp = filterCustom;
 | 
					                                statuses.get(i).filteredByApp = filterCustom;
 | 
				
			||||||
 | 
					                                break;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,9 @@ public class TranslateHelper {
 | 
				
			||||||
            String translatorVersion = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_VERSION), "PRO");
 | 
					            String translatorVersion = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_VERSION), "PRO");
 | 
				
			||||||
            params.setPro(translatorVersion.equals("PRO"));
 | 
					            params.setPro(translatorVersion.equals("PRO"));
 | 
				
			||||||
            String apikey = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_API_KEY), null);
 | 
					            String apikey = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_API_KEY), null);
 | 
				
			||||||
            myTransL.setDeeplAPIKey(apikey.trim());
 | 
					            if (apikey != null) {
 | 
				
			||||||
 | 
					                myTransL.setDeeplAPIKey(apikey.trim());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        String translate = sharedpreferences.getString(context.getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale());
 | 
					        String translate = sharedpreferences.getString(context.getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@ import android.graphics.Bitmap;
 | 
				
			||||||
import android.graphics.BitmapFactory;
 | 
					import android.graphics.BitmapFactory;
 | 
				
			||||||
import android.graphics.Typeface;
 | 
					import android.graphics.Typeface;
 | 
				
			||||||
import android.net.Uri;
 | 
					import android.net.Uri;
 | 
				
			||||||
 | 
					import android.os.Build;
 | 
				
			||||||
import android.os.Bundle;
 | 
					import android.os.Bundle;
 | 
				
			||||||
import android.provider.MediaStore;
 | 
					import android.provider.MediaStore;
 | 
				
			||||||
import android.view.MotionEvent;
 | 
					import android.view.MotionEvent;
 | 
				
			||||||
| 
						 | 
					@ -252,7 +253,7 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void saveImage() {
 | 
					    private void saveImage() {
 | 
				
			||||||
        if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
 | 
					        if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) || Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
 | 
				
			||||||
            showLoading(getString(R.string.saving));
 | 
					            showLoading(getString(R.string.saving));
 | 
				
			||||||
            File file = new File(path);
 | 
					            File file = new File(path);
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
| 
						 | 
					@ -263,13 +264,16 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList
 | 
				
			||||||
                        .setClearViewsEnabled(true)
 | 
					                        .setClearViewsEnabled(true)
 | 
				
			||||||
                        .setTransparencyEnabled(true)
 | 
					                        .setTransparencyEnabled(true)
 | 
				
			||||||
                        .build();
 | 
					                        .build();
 | 
				
			||||||
                if (ContextCompat.checkSelfPermission(EditImageActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
 | 
					                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
				
			||||||
                        PackageManager.PERMISSION_GRANTED) {
 | 
					                    if (ContextCompat.checkSelfPermission(EditImageActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
 | 
				
			||||||
                    ActivityCompat.requestPermissions(EditImageActivity.this,
 | 
					                            PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
 | 
					                        ActivityCompat.requestPermissions(EditImageActivity.this,
 | 
				
			||||||
                            STORE_REQUEST);
 | 
					                                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
 | 
				
			||||||
                    return;
 | 
					                                STORE_REQUEST);
 | 
				
			||||||
 | 
					                        return;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                mPhotoEditor.saveAsFile(file.getAbsolutePath(), saveSettings, new PhotoEditor.OnSaveListener() {
 | 
					                mPhotoEditor.saveAsFile(file.getAbsolutePath(), saveSettings, new PhotoEditor.OnSaveListener() {
 | 
				
			||||||
                    @Override
 | 
					                    @Override
 | 
				
			||||||
                    public void onSuccess(@NonNull String imagePath) {
 | 
					                    public void onSuccess(@NonNull String imagePath) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -390,12 +390,14 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
 | 
				
			||||||
     * @param position - int position of the media in the message
 | 
					     * @param position - int position of the media in the message
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private void pickupMedia(ComposeActivity.mediaType type, int position) {
 | 
					    private void pickupMedia(ComposeActivity.mediaType type, int position) {
 | 
				
			||||||
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) !=
 | 
					        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
				
			||||||
                PackageManager.PERMISSION_GRANTED) {
 | 
					            if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) !=
 | 
				
			||||||
            ActivityCompat.requestPermissions((Activity) context,
 | 
					                    PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
 | 
					                ActivityCompat.requestPermissions((Activity) context,
 | 
				
			||||||
                    MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
 | 
					                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
 | 
				
			||||||
            return;
 | 
					                        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Intent intent;
 | 
					        Intent intent;
 | 
				
			||||||
        intent = new Intent(Intent.ACTION_GET_CONTENT);
 | 
					        intent = new Intent(Intent.ACTION_GET_CONTENT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,11 +78,9 @@ public class ImageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
				
			||||||
        holder.binding.media.setOnClickListener(v -> {
 | 
					        holder.binding.media.setOnClickListener(v -> {
 | 
				
			||||||
            Intent mediaIntent = new Intent(context, MediaActivity.class);
 | 
					            Intent mediaIntent = new Intent(context, MediaActivity.class);
 | 
				
			||||||
            Bundle b = new Bundle();
 | 
					            Bundle b = new Bundle();
 | 
				
			||||||
            b.putInt(Helper.ARG_MEDIA_POSITION, position + 1);
 | 
					            b.putInt(Helper.ARG_MEDIA_POSITION, 1);
 | 
				
			||||||
            ArrayList<Attachment> attachmentsTmp = new ArrayList<>();
 | 
					            ArrayList<Attachment> attachmentsTmp = new ArrayList<>();
 | 
				
			||||||
            for (Status status1 : statuses) {
 | 
					            attachmentsTmp.add(status.art_attachment);
 | 
				
			||||||
                attachmentsTmp.add(status1.art_attachment);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            b.putSerializable(Helper.ARG_STATUS, status);
 | 
					            b.putSerializable(Helper.ARG_STATUS, status);
 | 
				
			||||||
            b.putSerializable(Helper.ARG_MEDIA_ARRAY, new ArrayList<>(attachmentsTmp));
 | 
					            b.putSerializable(Helper.ARG_MEDIA_ARRAY, new ArrayList<>(attachmentsTmp));
 | 
				
			||||||
            mediaIntent.putExtras(b);
 | 
					            mediaIntent.putExtras(b);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1201,7 +1201,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
				
			||||||
                boolean singleMedia = statusToDeal.media_attachments.size() == 1;
 | 
					                boolean singleMedia = statusToDeal.media_attachments.size() == 1;
 | 
				
			||||||
                for (Attachment attachment : statusToDeal.media_attachments) {
 | 
					                for (Attachment attachment : statusToDeal.media_attachments) {
 | 
				
			||||||
                    LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context));
 | 
					                    LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context));
 | 
				
			||||||
                    if (fullAttachement) {
 | 
					                    if (fullAttachement && !statusToDeal.sensitive) {
 | 
				
			||||||
                        float ratio = 1.0f;
 | 
					                        float ratio = 1.0f;
 | 
				
			||||||
                        float mediaH = -1.0f;
 | 
					                        float mediaH = -1.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1240,13 +1240,13 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
				
			||||||
                        loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, -1.f, statusToDeal, attachment, singleMedia);
 | 
					                        loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, -1.f, statusToDeal, attachment, singleMedia);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    mediaPosition++;
 | 
					                    mediaPosition++;
 | 
				
			||||||
                    if (fullAttachement || singleMedia) {
 | 
					                    if ((fullAttachement && !statusToDeal.sensitive) || singleMedia) {
 | 
				
			||||||
                        holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot());
 | 
					                        holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot());
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        holder.binding.attachmentsList.addView(layoutMediaBinding.getRoot());
 | 
					                        holder.binding.attachmentsList.addView(layoutMediaBinding.getRoot());
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!fullAttachement && !singleMedia) {
 | 
					                if ((!fullAttachement || statusToDeal.sensitive) && !singleMedia) {
 | 
				
			||||||
                    holder.binding.mediaContainer.setVisibility(View.GONE);
 | 
					                    holder.binding.mediaContainer.setVisibility(View.GONE);
 | 
				
			||||||
                    holder.binding.attachmentsListContainer.setVisibility(View.VISIBLE);
 | 
					                    holder.binding.attachmentsListContainer.setVisibility(View.VISIBLE);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
| 
						 | 
					@ -2018,7 +2018,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
				
			||||||
        boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false);
 | 
					        boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        LinearLayout.LayoutParams lp;
 | 
					        LinearLayout.LayoutParams lp;
 | 
				
			||||||
        if (fullAttachement && mediaH > 0) {
 | 
					        if (fullAttachement && mediaH > 0 && !statusToDeal.sensitive) {
 | 
				
			||||||
            lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (mediaH * ratio));
 | 
					            lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (mediaH * ratio));
 | 
				
			||||||
            layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER);
 | 
					            layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
| 
						 | 
					@ -2040,7 +2040,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
				
			||||||
            focusY = statusToDeal.media_attachments.get(0).meta.focus.y;
 | 
					            focusY = statusToDeal.media_attachments.get(0).meta.focus.y;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        layoutMediaBinding.count.setVisibility(View.VISIBLE);
 | 
					        layoutMediaBinding.count.setVisibility(View.VISIBLE);
 | 
				
			||||||
        if (!fullAttachement && !singleImage) {
 | 
					        if ((!fullAttachement || statusToDeal.sensitive) && !singleImage) {
 | 
				
			||||||
            layoutMediaBinding.count.setText(String.format(Locale.getDefault(), "%d/%d", mediaPosition, statusToDeal.media_attachments.size()));
 | 
					            layoutMediaBinding.count.setText(String.format(Locale.getDefault(), "%d/%d", mediaPosition, statusToDeal.media_attachments.size()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        String finalUrl;
 | 
					        String finalUrl;
 | 
				
			||||||
| 
						 | 
					@ -2132,7 +2132,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
				
			||||||
            adapter.notifyItemChanged(holder.getBindingAdapterPosition());
 | 
					            adapter.notifyItemChanged(holder.getBindingAdapterPosition());
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (fullAttachement || singleImage) {
 | 
					        if (!statusToDeal.sensitive && (fullAttachement || singleImage)) {
 | 
				
			||||||
            layoutMediaBinding.getRoot().setPadding(0, 0, 0, 10);
 | 
					            layoutMediaBinding.getRoot().setPadding(0, 0, 0, 10);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            layoutMediaBinding.getRoot().setPadding(0, 0, 10, 0);
 | 
					            layoutMediaBinding.getRoot().setPadding(0, 0, 10, 0);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@ import android.Manifest;
 | 
				
			||||||
import android.content.Intent;
 | 
					import android.content.Intent;
 | 
				
			||||||
import android.content.pm.PackageManager;
 | 
					import android.content.pm.PackageManager;
 | 
				
			||||||
import android.net.Uri;
 | 
					import android.net.Uri;
 | 
				
			||||||
 | 
					import android.os.Build;
 | 
				
			||||||
import android.os.Bundle;
 | 
					import android.os.Bundle;
 | 
				
			||||||
import android.text.Editable;
 | 
					import android.text.Editable;
 | 
				
			||||||
import android.text.TextWatcher;
 | 
					import android.text.TextWatcher;
 | 
				
			||||||
| 
						 | 
					@ -86,16 +87,7 @@ public class FragmentLoginMain extends Fragment {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
 | 
					        permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
 | 
				
			||||||
            if (isGranted) {
 | 
					            if (isGranted) {
 | 
				
			||||||
                Intent openFileIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
 | 
					                proceed();
 | 
				
			||||||
                openFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
 | 
					 | 
				
			||||||
                openFileIntent.setType("application/zip");
 | 
					 | 
				
			||||||
                String[] mimeTypes = new String[]{"application/zip"};
 | 
					 | 
				
			||||||
                openFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
 | 
					 | 
				
			||||||
                //noinspection deprecation
 | 
					 | 
				
			||||||
                startActivityForResult(
 | 
					 | 
				
			||||||
                        Intent.createChooser(
 | 
					 | 
				
			||||||
                                openFileIntent,
 | 
					 | 
				
			||||||
                                getString(R.string.load_settings)), PICK_IMPORT);
 | 
					 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
 | 
					                ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -233,13 +225,30 @@ public class FragmentLoginMain extends Fragment {
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            } else if (itemId == R.id.action_import_data) {
 | 
					            } else if (itemId == R.id.action_import_data) {
 | 
				
			||||||
                permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 | 
					                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
				
			||||||
 | 
					                    permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    proceed();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        popupMenu.show();
 | 
					        popupMenu.show();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void proceed() {
 | 
				
			||||||
 | 
					        Intent openFileIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
 | 
				
			||||||
 | 
					        openFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
 | 
				
			||||||
 | 
					        openFileIntent.setType("application/zip");
 | 
				
			||||||
 | 
					        String[] mimeTypes = new String[]{"application/zip"};
 | 
				
			||||||
 | 
					        openFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
 | 
				
			||||||
 | 
					        //noinspection deprecation
 | 
				
			||||||
 | 
					        startActivityForResult(
 | 
				
			||||||
 | 
					                Intent.createChooser(
 | 
				
			||||||
 | 
					                        openFileIntent,
 | 
				
			||||||
 | 
					                        getString(R.string.load_settings)), PICK_IMPORT);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void retrievesClientId(String instance) {
 | 
					    private void retrievesClientId(String instance) {
 | 
				
			||||||
        String oldInstance = instance;
 | 
					        String oldInstance = instance;
 | 
				
			||||||
        if (!instance.startsWith("http://") && !instance.startsWith("https://")) {
 | 
					        if (!instance.startsWith("http://") && !instance.startsWith("https://")) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ import android.Manifest;
 | 
				
			||||||
import android.app.Activity;
 | 
					import android.app.Activity;
 | 
				
			||||||
import android.content.Intent;
 | 
					import android.content.Intent;
 | 
				
			||||||
import android.content.pm.PackageManager;
 | 
					import android.content.pm.PackageManager;
 | 
				
			||||||
 | 
					import android.os.Build;
 | 
				
			||||||
import android.os.Bundle;
 | 
					import android.os.Bundle;
 | 
				
			||||||
import android.webkit.URLUtil;
 | 
					import android.webkit.URLUtil;
 | 
				
			||||||
import android.widget.Toast;
 | 
					import android.widget.Toast;
 | 
				
			||||||
| 
						 | 
					@ -135,7 +136,15 @@ public class FragmentSettingsCategories extends PreferenceFragmentCompat {
 | 
				
			||||||
        Preference pref_export_settings = findPreference(getString(R.string.pref_export_settings));
 | 
					        Preference pref_export_settings = findPreference(getString(R.string.pref_export_settings));
 | 
				
			||||||
        if (pref_export_settings != null) {
 | 
					        if (pref_export_settings != null) {
 | 
				
			||||||
            pref_export_settings.setOnPreferenceClickListener(preference -> {
 | 
					            pref_export_settings.setOnPreferenceClickListener(preference -> {
 | 
				
			||||||
                permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 | 
					                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
				
			||||||
 | 
					                    permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    try {
 | 
				
			||||||
 | 
					                        ZipHelper.exportData(requireActivity());
 | 
				
			||||||
 | 
					                    } catch (IOException e) {
 | 
				
			||||||
 | 
					                        e.printStackTrace();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ public class Helper {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final String YANDEX_BASE_URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?";
 | 
					    private static final String YANDEX_BASE_URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?";
 | 
				
			||||||
    private static final String DEEPL_BASE_URL = "https://free.deepl.com/v2/translate?";
 | 
					    private static final String DEEPL_BASE_URL = "https://api.deepl.com/v2/translate?";
 | 
				
			||||||
    private static final String DEEPL_BASE_FREE_URL = "https://api-free.deepl.com/v2/translate?";
 | 
					    private static final String DEEPL_BASE_FREE_URL = "https://api-free.deepl.com/v2/translate?";
 | 
				
			||||||
    private static final String SYSTRAN_BASE_URL = "https://api-platform.systran.net/translation/text/translate?";
 | 
					    private static final String SYSTRAN_BASE_URL = "https://api-platform.systran.net/translation/text/translate?";
 | 
				
			||||||
    private static final String[] deeplAvailableLang = {"EN", "DE", "FR", "ES", "IT", "NL", "PL"};
 | 
					    private static final String[] deeplAvailableLang = {"EN", "DE", "FR", "ES", "IT", "NL", "PL"};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/fdroid/fastlane/metadata/android/en/changelogs/456.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/fdroid/fastlane/metadata/android/en/changelogs/456.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					Changed:
 | 
				
			||||||
 | 
					- Hidden media smaller with preview images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Fixed:
 | 
				
			||||||
 | 
					- Issue with Media for Android 11+
 | 
				
			||||||
 | 
					- Crash when not setting a translation key
 | 
				
			||||||
 | 
					- Fix DeepL for API pro
 | 
				
			||||||
 | 
					- Crash when visiting a profile with a lot of media
 | 
				
			||||||
 | 
					- Home muted accounts not working without filters
 | 
				
			||||||
 | 
					- Animated custom emoji not displayed
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					Nova versão do Fedilab com nova funcionalidade.
 | 
				
			||||||
 | 
					- Agora é possível compor threads
 | 
				
			||||||
 | 
					- Vê o thread completo ao responder
 | 
				
			||||||
 | 
					- Suporte de cache
 | 
				
			||||||
 | 
					- Novo design
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					- Algumas correcções de bugs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Melhorar as linhas de tempo fixadas
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					‐ Correcção de crashes para algumas instâncias do pleroma
 | 
				
			||||||
		Loading…
	
		Reference in a new issue