From 5aeedfd9739dfb32c88c2ea3764e975e23b3080b Mon Sep 17 00:00:00 2001 From: Spaso1 Date: Wed, 26 Mar 2025 22:47:09 +0800 Subject: [PATCH] Second commit - VPN bugs fixed - custom background update - map bug fixed --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 55 ++++++ .../ui/ImagePickerListener.java | 6 + .../findmaimaiultra/ui/MainActivity.java | 136 ++++++++++++- .../ui/gallery/GalleryFragment.java | 11 +- .../findmaimaiultra/ui/home/HomeFragment.java | 130 ++++++++++++- .../ui/music/MusicFragment.java | 4 +- .../ui/slideshow/SlideshowFragment.java | 180 +++++++----------- .../main/res/layout/fragment_slideshow.xml | 1 + 9 files changed, 397 insertions(+), 128 deletions(-) create mode 100644 app/src/main/java/org/astral/findmaimaiultra/ui/ImagePickerListener.java diff --git a/app/build.gradle b/app/build.gradle index 39c290c..0083414 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { defaultConfig { applicationId "org.astral.findmaimaiultra" - minSdk 30 + minSdk 29 targetSdk 34 versionCode 1 versionName "1.6.0 Ultra" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d99f56c..e00a13f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/ImagePickerListener.java b/app/src/main/java/org/astral/findmaimaiultra/ui/ImagePickerListener.java new file mode 100644 index 0000000..7dd6af8 --- /dev/null +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/ImagePickerListener.java @@ -0,0 +1,6 @@ +// ImagePickerListener.java +package org.astral.findmaimaiultra.ui; + +public interface ImagePickerListener { + void openFileChooser(); +} diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/MainActivity.java b/app/src/main/java/org/astral/findmaimaiultra/ui/MainActivity.java index 6a8548f..f5b6da5 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/MainActivity.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/MainActivity.java @@ -1,7 +1,17 @@ package org.astral.findmaimaiultra.ui; -import android.content.Intent; +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.*; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.net.Uri; import android.os.Bundle; +import android.provider.MediaStore; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.Menu; import android.widget.Toast; @@ -14,13 +24,20 @@ import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; import androidx.drawerlayout.widget.DrawerLayout; import androidx.appcompat.app.AppCompatActivity; +import com.yalantis.ucrop.UCrop; import org.astral.findmaimaiultra.R; import org.astral.findmaimaiultra.databinding.ActivityMainBinding; -public class MainActivity extends AppCompatActivity { +import java.io.File; +import java.io.FileOutputStream; + +import static android.app.Activity.RESULT_OK; + +public class MainActivity extends AppCompatActivity implements ImagePickerListener { private AppBarConfiguration mAppBarConfiguration; private ActivityMainBinding binding; + private SharedPreferences settingProperties; @Override protected void onCreate(Bundle savedInstanceState) { @@ -28,6 +45,7 @@ public class MainActivity extends AppCompatActivity { binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + settingProperties = getSharedPreferences("setting", Context.MODE_PRIVATE); setSupportActionBar(binding.appBarMain.toolbar); DrawerLayout drawer = binding.drawerLayout; @@ -35,7 +53,7 @@ public class MainActivity extends AppCompatActivity { // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. mAppBarConfiguration = new AppBarConfiguration.Builder( - R.id.nav_home, R.id.nav_gallery, R.id.nav_music,R.id.nav_slideshow) + R.id.nav_home, R.id.nav_gallery, R.id.nav_music, R.id.nav_slideshow) .setOpenableLayout(drawer) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); @@ -60,18 +78,122 @@ public class MainActivity extends AppCompatActivity { }); menu.findItem(R.id.action_update).setOnMenuItemClickListener(item -> { Intent update = new Intent(this, UpdateActivity.class); - - Toast.makeText(this, "敬请期待", Toast.LENGTH_SHORT).show(); - //startActivity(update); + startActivity(update); return true; }); return false; } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + Log.d("SettingActivity", "onActivityResult called with requestCode: " + requestCode + ", resultCode: " + resultCode); + + if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) { + Uri uri = data.getData(); + startCropActivity(uri); + } else if (requestCode == UCrop.REQUEST_CROP && resultCode == RESULT_OK) { + handleCroppedImage(data); + } else if (requestCode == UCrop.REQUEST_CROP && resultCode == UCrop.RESULT_ERROR) { + final Throwable cropError = UCrop.getError(data); + Log.e("SettingActivity", "Cropping failed: ", cropError); + Toast.makeText(this, "裁剪失败: " + cropError.getMessage(), Toast.LENGTH_SHORT).show(); + } else { + Log.w("SettingActivity", "Unexpected result from image picker or cropper"); + Toast.makeText(this, "裁剪操作未成功", Toast.LENGTH_SHORT).show(); + } + } + + private void startCropActivity(Uri uri) { + Uri destinationUri = Uri.fromFile(new File(this.getCacheDir(), "cropped_image.jpg")); + + UCrop.Options options = new UCrop.Options(); + options.setCompressionQuality(90); + options.setCompressionFormat(Bitmap.CompressFormat.JPEG); + + // 计算屏幕宽高比 + float[] aspectRatio = getScreenAspectRatio(); + + UCrop uCrop = UCrop.of(uri, destinationUri) + .withAspectRatio(aspectRatio[0], aspectRatio[1]) // 设置裁剪比例为屏幕比例 + .withMaxResultSize(getScreenWidth(), getScreenHeight()) // 设置最大结果尺寸 + .withOptions(options); + + // 启动 UCrop 并使用 cropImageLauncher 处理结果 + uCrop.start(this); + } + + private void show(String text) { + if (this != null) { + this.runOnUiThread(() -> Toast.makeText(this, text, Toast.LENGTH_SHORT).show()); + } + } + + private void handleCroppedImage(Intent data) { + Uri croppedUri = UCrop.getOutput(data); + if (croppedUri != null) { + try { + Bitmap photo = MediaStore.Images.Media.getBitmap(this.getContentResolver(), croppedUri); + if (photo != null) { + File croppedFile = new File(this.getExternalFilesDir(null), "cropped_image.jpg"); + try (FileOutputStream out = new FileOutputStream(croppedFile)) { + photo.compress(Bitmap.CompressFormat.JPEG, 90, out); + SharedPreferences.Editor editor = settingProperties.edit(); + editor.putString("image_uri", croppedUri.toString()); + editor.apply(); + show("成功"); + Log.d("SettingActivity", "图片已保存到: " + croppedFile.getAbsolutePath()); + } catch (Exception e) { + e.printStackTrace(); + show("失败"); + Log.e("SettingActivity", "保存图片失败: ", e); + } + } else { + show("无法获取裁剪后的图片"); + Log.w("SettingActivity", "无法获取裁剪后的图片"); + } + } catch (Exception e) { + e.printStackTrace(); + show("无法获取裁剪后的图片"); + Log.e("SettingActivity", "无法获取裁剪后的图片: ", e); + } + } else { + show("无法找到裁剪后的图片"); + Log.w("SettingActivity", "无法找到裁剪后的图片"); + } + } + + private int getScreenWidth() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.widthPixels; + } + + private int getScreenHeight() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.heightPixels; + } + + private float[] getScreenAspectRatio() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + float width = displayMetrics.widthPixels; + float height = displayMetrics.heightPixels; + return new float[]{width, height}; + } + @Override public boolean onSupportNavigateUp() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp(); } -} \ No newline at end of file + + @Override + public void openFileChooser() { + Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + intent.setType("image/*"); + startActivityForResult(intent, 1); + } +} diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/gallery/GalleryFragment.java b/app/src/main/java/org/astral/findmaimaiultra/ui/gallery/GalleryFragment.java index 169b876..e97d438 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/gallery/GalleryFragment.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/gallery/GalleryFragment.java @@ -41,8 +41,15 @@ public class GalleryFragment extends Fragment { binding = FragmentGalleryBinding.inflate(inflater, container, false); View root = binding.getRoot(); sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); - double x = Double.parseDouble(Objects.requireNonNull(sharedViewModel.getSharedMap().getValue().get("x"))); - double y = Double.parseDouble(Objects.requireNonNull(sharedViewModel.getSharedMap().getValue().get("y"))); + double x = 116.3912757; + double y = 39.906217; + try { + x = Double.parseDouble(Objects.requireNonNull(sharedViewModel.getSharedMap().getValue().get("x"))); + y = Double.parseDouble(Objects.requireNonNull(sharedViewModel.getSharedMap().getValue().get("y"))); + }catch (Exception e) { + Toast.makeText(getContext(), "经纬度获取失败", Toast.LENGTH_SHORT).show(); + } + mapView = binding.bmapView; mapView.onCreate(getContext(),savedInstanceState); diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java b/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java index 07d102d..4b784b8 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java @@ -7,7 +7,8 @@ import android.app.AlertDialog; import android.content.*; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.graphics.Color; +import android.graphics.*; +import android.graphics.drawable.BitmapDrawable; import android.location.Address; import android.location.Geocoder; import android.location.Location; @@ -21,6 +22,7 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -80,6 +82,8 @@ public class HomeFragment extends Fragment { private boolean isFlag = true; private SharedPreferences shoucang; private SharedPreferences settingProperties; + private SharedPreferences settingProperties2; + private FragmentHomeBinding binding; private SharedViewModel sharedViewModel; @Override @@ -90,6 +94,8 @@ public class HomeFragment extends Fragment { if (context != null) { shoucang = context.getSharedPreferences("shoucang_prefs", Context.MODE_PRIVATE); settingProperties = context.getSharedPreferences("setting_prefs", Context.MODE_PRIVATE); + settingProperties2 = context.getSharedPreferences("setting", Context.MODE_PRIVATE); + } sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); } @@ -118,6 +124,124 @@ public class HomeFragment extends Fragment { // 使用 savedData } + if (settingProperties2.getString("image_uri", null) != null ) { + Uri uri = Uri.parse(settingProperties2.getString("image_uri", null)); + try { + Bitmap bitmap = BitmapFactory.decodeStream(getContext().getContentResolver().openInputStream(uri)); + if (bitmap != null) { + // 获取RecyclerView的尺寸 + int recyclerViewWidth = 0; + int recyclerViewHeight = 0; + recyclerViewWidth = recyclerView.getWidth(); + recyclerViewHeight = recyclerView.getHeight(); + if (recyclerViewWidth > 0 && recyclerViewHeight > 0) { + // 计算缩放比例 + float scaleWidth = ((float) recyclerViewWidth) / bitmap.getWidth(); + float scaleHeight = ((float) recyclerViewHeight) / bitmap.getHeight(); + + // 选择较大的缩放比例以保持图片的原始比例 + float scaleFactor = Math.max(scaleWidth, scaleHeight); + + // 计算新的宽度和高度 + int newWidth = (int) (bitmap.getWidth() * scaleFactor); + int newHeight = (int) (bitmap.getHeight() * scaleFactor); + + // 缩放图片 + Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); + + // 计算裁剪区域 + int x = (scaledBitmap.getWidth() - recyclerViewWidth) / 2; + int y = (scaledBitmap.getHeight() - recyclerViewHeight) / 2; + + // 处理x和y为负数的情况 + x = Math.max(x, 0); + y = Math.max(y, 0); + + // 裁剪图片 + Bitmap croppedBitmap = Bitmap.createBitmap(scaledBitmap, x, y, recyclerViewWidth, recyclerViewHeight); + + // 创建一个新的 Bitmap,与裁剪后的 Bitmap 大小相同 + Bitmap transparentBitmap = Bitmap.createBitmap(croppedBitmap.getWidth(), croppedBitmap.getHeight(), croppedBitmap.getConfig()); + + // 创建一个 Canvas 对象,用于在新的 Bitmap 上绘制 + Canvas canvas = new Canvas(transparentBitmap); + + // 创建一个 Paint 对象,并设置透明度 + Paint paint = new Paint(); + paint.setAlpha(128); // 设置透明度为 50% (255 * 0.5 = 128) + + // 将裁剪后的 Bitmap 绘制到新的 Bitmap 上,并应用透明度 + canvas.drawBitmap(croppedBitmap, 0, 0, paint); + + // 创建BitmapDrawable并设置其边界为RecyclerView的尺寸 + BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), transparentBitmap); + + // 设置recyclerView的背景 + recyclerView.setBackground(bitmapDrawable); + + } else { + // 如果RecyclerView的尺寸未确定,可以使用ViewTreeObserver来监听尺寸变化 + recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + int recyclerViewWidth = 0; + int recyclerViewHeight = 0; + recyclerViewWidth = recyclerView.getWidth(); + recyclerViewHeight = recyclerView.getHeight(); + + // 计算缩放比例 + float scaleWidth = ((float) recyclerViewWidth) / bitmap.getWidth(); + float scaleHeight = ((float) recyclerViewHeight) / bitmap.getHeight(); + + // 选择较大的缩放比例以保持图片的原始比例 + float scaleFactor = Math.max(scaleWidth, scaleHeight); + + // 计算新的宽度和高度 + int newWidth = (int) (bitmap.getWidth() * scaleFactor); + int newHeight = (int) (bitmap.getHeight() * scaleFactor); + + // 缩放图片 + Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); + + // 计算裁剪区域 + int x = (scaledBitmap.getWidth() - recyclerViewWidth) / 2; + int y = (scaledBitmap.getHeight() - recyclerViewHeight) / 2; + + // 处理x和y为负数的情况 + x = Math.max(x, 0); + y = Math.max(y, 0); + + // 裁剪图片 + Bitmap croppedBitmap = Bitmap.createBitmap(scaledBitmap, x, y, recyclerViewWidth, recyclerViewHeight); + + // 创建一个新的 Bitmap,与裁剪后的 Bitmap 大小相同 + Bitmap transparentBitmap = Bitmap.createBitmap(croppedBitmap.getWidth(), croppedBitmap.getHeight(), croppedBitmap.getConfig()); + + // 创建一个 Canvas 对象,用于在新的 Bitmap 上绘制 + Canvas canvas = new Canvas(transparentBitmap); + + // 创建一个 Paint 对象,并设置透明度 + Paint paint = new Paint(); + paint.setAlpha(128); // 设置透明度为 50% (255 * 0.5 = 128) + + // 将裁剪后的 Bitmap 绘制到新的 Bitmap 上,并应用透明度 + canvas.drawBitmap(croppedBitmap, 0, 0, paint); + + // 创建BitmapDrawable并设置其边界为RecyclerView的尺寸 + BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), transparentBitmap); + recyclerView.setBackground(bitmapDrawable); + + } + }); + } + } + + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(requireContext(), "图片加载失败,权限出错!", Toast.LENGTH_SHORT).show(); + } + } return root; } @@ -296,6 +420,7 @@ public class HomeFragment extends Fragment { // 调用高德地图 API 进行逆地理编码 reverseGeocode(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()); } else { + Toast.makeText(requireActivity().getApplicationContext(), "无法获取最新定位信息", Toast.LENGTH_SHORT).show(); Log.d("Location", "无法获取最新定位信息"); setDefaultLocation(); // 设置默认位置 } @@ -418,6 +543,9 @@ public class HomeFragment extends Fragment { private void setDefaultLocation() { x = String.valueOf(116.3912757); y = String.valueOf(39.906217); + tot = "北京"; + city = "北京市"; + extracted(); } //手动刷新定位 diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/music/MusicFragment.java b/app/src/main/java/org/astral/findmaimaiultra/ui/music/MusicFragment.java index cbbe4ca..3530a9e 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/music/MusicFragment.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/music/MusicFragment.java @@ -165,7 +165,9 @@ public class MusicFragment extends Fragment { ImageView musicTypeImageView = dialogView.findViewById(R.id.dialog_music_type); ImageView musicComboStatusTextView = dialogView.findViewById(R.id.dialog_music_combo_status); TextView musicPlayCountTextView = dialogView.findViewById(R.id.dialog_music_play_count); - + if (musicRating.getMusicName().equals("空-请去导入成绩")) { + return; + } // 设置图像曲绘 int id = musicRating.getMusicId(); if (id > 10000) { diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/slideshow/SlideshowFragment.java b/app/src/main/java/org/astral/findmaimaiultra/ui/slideshow/SlideshowFragment.java index f5b3b62..391f290 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/slideshow/SlideshowFragment.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/slideshow/SlideshowFragment.java @@ -1,16 +1,12 @@ package org.astral.findmaimaiultra.ui.slideshow; +import android.Manifest; import android.annotation.SuppressLint; -import android.app.AlertDialog; import android.content.*; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.net.Uri; import android.os.Bundle; -import android.provider.MediaStore; import android.provider.Settings; -import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -19,32 +15,33 @@ import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.google.android.material.button.MaterialButton; import com.google.android.material.radiobutton.MaterialRadioButton; import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.textfield.TextInputEditText; -import com.yalantis.ucrop.UCrop; import org.astral.findmaimaiultra.been.Release; import org.astral.findmaimaiultra.databinding.FragmentSlideshowBinding; import org.astral.findmaimaiultra.service.GitHubApiService; +import org.astral.findmaimaiultra.ui.ImagePickerListener; import org.astral.findmaimaiultra.ui.LinkQQBot; import org.astral.findmaimaiultra.utill.GitHubApiClient; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; -import java.io.File; -import java.io.FileOutputStream; import java.util.Objects; import static android.app.Activity.RESULT_OK; public class SlideshowFragment extends Fragment { private SharedPreferences settingProperties; - private static final int PICK_IMAGE_REQUEST = 1; private static final int REQUEST_CODE_PERMISSIONS = 1001; private TextInputEditText shuiyuEditText; private TextInputEditText luoxueEditText; @@ -52,16 +49,59 @@ public class SlideshowFragment extends Fragment { private String x; private String y; private FragmentSlideshowBinding binding; + private ImagePickerListener imagePickerListener; + + private static final String[] REQUIRED_PERMISSIONS = { + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + }; + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (context instanceof ImagePickerListener) { + imagePickerListener = (ImagePickerListener) context; + } else { + throw new RuntimeException(context.toString() + " must implement ImagePickerListener"); + } + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settingProperties = requireActivity().getSharedPreferences("setting", Context.MODE_PRIVATE); + + if (allPermissionsGranted()) { + // 初始化代码 + } else { + requestPermissions(); + } } + private void show(String text) { if (getActivity() != null) { getActivity().runOnUiThread(() -> Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show()); } } + + private boolean allPermissionsGranted() { + for (String permission : REQUIRED_PERMISSIONS) { + if (ContextCompat.checkSelfPermission(requireContext(), permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + private void requestPermissions() { + ActivityCompat.requestPermissions( + requireActivity(), + REQUIRED_PERMISSIONS, + REQUEST_CODE_PERMISSIONS + ); + } + + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { SlideshowViewModel slideshowViewModel = @@ -74,7 +114,7 @@ public class SlideshowFragment extends Fragment { switchMaterial.setOnCheckedChangeListener((buttonView, isChecked) -> { SharedPreferences.Editor editor = settingProperties.edit(); if (isChecked) { - show( "已开启实验性功能,可能并不起作用"); + show("已开启实验性功能,可能并不起作用"); editor.putBoolean("setting_autobeta1", true); } else { editor.putBoolean("setting_autobeta1", false); @@ -102,7 +142,7 @@ public class SlideshowFragment extends Fragment { saveSettings(switchMaterial.isChecked(), shuiyuEditText.getText().toString(), luoxueEditText.getText().toString(), userId.getText().toString()); }); MaterialButton changeButton = binding.changePhoto; - changeButton.setOnClickListener(v -> openFileChooser()); + changeButton.setOnClickListener(v -> imagePickerListener.openFileChooser()); TextView uuid = binding.uuid; @SuppressLint("HardwareIds") String androidId = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID); uuid.setText("Android ID:" + androidId); @@ -133,13 +173,6 @@ public class SlideshowFragment extends Fragment { webView.loadUrl(url); // 加载网页 return root; } - private void openFileChooser() { - Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - intent.setType("image/*"); - if (intent.resolveActivity(getContext().getPackageManager()) != null) { - startActivityForResult(intent, PICK_IMAGE_REQUEST); - } - } private String getAppVersionName() { try { @@ -151,75 +184,6 @@ public class SlideshowFragment extends Fragment { } } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - Log.d("SettingActivity", "onActivityResult called with requestCode: " + requestCode + ", resultCode: " + resultCode); - - if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { - Uri uri = data.getData(); - startCropActivity(uri); - } else if (requestCode == UCrop.REQUEST_CROP && resultCode == RESULT_OK) { - handleCroppedImage(data); - } else if (requestCode == UCrop.REQUEST_CROP && resultCode == UCrop.RESULT_ERROR) { - final Throwable cropError = UCrop.getError(data); - Log.e("SettingActivity", "Cropping failed: ", cropError); - } else { - Log.w("SettingActivity", "Unexpected result from image picker or cropper"); - } - } - - private void startCropActivity(Uri uri) { - Uri destinationUri = Uri.fromFile(new File(requireActivity().getCacheDir(), "cropped_image.jpg")); - - UCrop.Options options = new UCrop.Options(); - options.setCompressionQuality(90); - options.setCompressionFormat(Bitmap.CompressFormat.JPEG); - - // 计算屏幕宽高比 - float[] aspectRatio = getScreenAspectRatio(); - - UCrop.of(uri, destinationUri) - .withAspectRatio(aspectRatio[0], aspectRatio[1]) // 设置裁剪比例为屏幕比例 - .withMaxResultSize(getScreenWidth(), getScreenHeight()) // 设置最大结果尺寸 - .withOptions(options) - .start(getActivity()); - } - - private void handleCroppedImage(Intent data) { - Uri croppedUri = UCrop.getOutput(data); - if (croppedUri != null) { - try { - Bitmap photo = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), croppedUri); - if (photo != null) { - File croppedFile = new File(getContext().getExternalFilesDir(null), "cropped_image.jpg"); - try (FileOutputStream out = new FileOutputStream(croppedFile)) { - photo.compress(Bitmap.CompressFormat.JPEG, 90, out); - SharedPreferences.Editor editor = settingProperties.edit(); - editor.putString("image_uri", croppedUri.toString()); - editor.apply(); - show("成功"); - Log.d("SettingActivity", "图片已保存到: " + croppedFile.getAbsolutePath()); - } catch (Exception e) { - e.printStackTrace(); - show("失败"); - Log.e("SettingActivity", "保存图片失败: ", e); - } - } else { - show("无法获取裁剪后的图片"); - Log.w("SettingActivity", "无法获取裁剪后的图片"); - } - } catch (Exception e) { - e.printStackTrace(); - show("无法获取裁剪后的图片"); - Log.e("SettingActivity", "无法获取裁剪后的图片: ", e); - } - } else { - show("无法找到裁剪后的图片"); - Log.w("SettingActivity", "无法找到裁剪后的图片"); - } - } - private void saveSettings(boolean betaEnabled, String shuiyuUsername, String luoxueUsername, String userId) { SharedPreferences.Editor editor = settingProperties.edit(); MaterialRadioButton materialRadioButton = binding.radioButton1; @@ -278,6 +242,7 @@ public class SlideshowFragment extends Fragment { } } } + private void getLatestRelease() { GitHubApiService service = GitHubApiClient.getClient(); Call call = service.getLatestRelease("Spaso1", "FindMaimaiDX_Phone"); // 替换为你的仓库信息 @@ -289,16 +254,18 @@ public class SlideshowFragment extends Fragment { if (response.isSuccessful()) { Release release = response.body(); if (release != null) { - String tagName = release.getTagName(); - String name = release.getName(); - String body = release.getBody(); - String htmlUrl = release.getHtmlUrl(); - TextView textView = binding.vits; - textView.setText(textView.getText() + tagName + "\n" + name + "\n" + body); - //Toast.makeText(SettingActivity.this, "Latest Release:\nTag Name: " + tagName + "\nName: " + name + "\nBody: " + body + "\nHTML URL: " + htmlUrl, Toast.LENGTH_SHORT).show(); - } else { + try { + String tagName = release.getTagName(); + String name = release.getName(); + String body = release.getBody(); + String htmlUrl = release.getHtmlUrl(); + TextView textView = binding.vits; + textView.setText(textView.getText() + tagName + "\n" + name + "\n" + body); + //Toast.makeText(SettingActivity.this, "Latest Release:\nTag Name: " + tagName + "\nName: " + name + "\nBody: " + body + "\nHTML URL: " + htmlUrl, Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + Log.d("SettingActivity", "获取最新版本失败: ", e); + } } - } else { } } @@ -308,28 +275,9 @@ public class SlideshowFragment extends Fragment { }); } - private int getScreenWidth() { - DisplayMetrics displayMetrics = new DisplayMetrics(); - requireActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - return displayMetrics.widthPixels; - } - - private int getScreenHeight() { - DisplayMetrics displayMetrics = new DisplayMetrics(); - requireActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - return displayMetrics.heightPixels; - } - - private float[] getScreenAspectRatio() { - DisplayMetrics displayMetrics = new DisplayMetrics(); - getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - float width = displayMetrics.widthPixels; - float height = displayMetrics.heightPixels; - return new float[]{width, height}; - } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/fragment_slideshow.xml b/app/src/main/res/layout/fragment_slideshow.xml index b1de649..5264415 100644 --- a/app/src/main/res/layout/fragment_slideshow.xml +++ b/app/src/main/res/layout/fragment_slideshow.xml @@ -34,6 +34,7 @@ android:id="@+id/radioGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:visibility="gone" android:orientation="vertical">