From d191a1cfc5ec76fd9985a0878b42775dbe1eddf8 Mon Sep 17 00:00:00 2001 From: Maksymilian Jopek Date: Thu, 22 Sep 2022 20:25:19 +0200 Subject: All / settings logic --- app/src/main/AndroidManifest.xml | 3 + .../java/com/jopek/lectordecodi/MainActivity.java | 16 ++-- .../lectordecodi/SharedPreferencesManager.java | 44 ++++++++++ .../ui/barcode_gen/BarcodeGenFragment.java | 81 +++++++++++++++--- .../ui/qrcode_gen/QRCodeGenFragment.java | 98 ++++++++++++++++++++-- .../lectordecodi/ui/settings/SettingsFragment.java | 54 ++++++++++++ .../ui/settings/SettingsViewModel.java | 7 ++ .../main/res/drawable/ic_baseline_settings_24.xml | 5 ++ app/src/main/res/layout/fragment_barcode_gen.xml | 10 ++- app/src/main/res/layout/fragment_qrcode_gen.xml | 44 +++++++++- app/src/main/res/layout/fragment_settings.xml | 55 ++++++++++++ app/src/main/res/menu/activity_main_drawer.xml | 8 ++ app/src/main/res/menu/main.xml | 10 +-- app/src/main/res/navigation/mobile_navigation.xml | 6 ++ app/src/main/res/values/strings.xml | 1 + 15 files changed, 408 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/jopek/lectordecodi/SharedPreferencesManager.java create mode 100644 app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsFragment.java create mode 100644 app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsViewModel.java create mode 100644 app/src/main/res/drawable/ic_baseline_settings_24.xml create mode 100644 app/src/main/res/layout/fragment_settings.xml (limited to 'app/src/main') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 56d55cb..c652fe6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + + + T getFromPrefs(Context context, String key, T def) { + SharedPreferences prefs = getPrefs(context); + Map map = prefs.getAll(); + T fromPrefs = (T) map.getOrDefault(key, def); + + return fromPrefs; + } + public static String getWhereSave(Context context) { + String def = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/lector-de-codi"; + return getFromPrefs(context, "whereSave", def); + } + public static boolean setWhereSave(Context context, String whereSave) { + SharedPreferences prefs = getPrefs(context); + return prefs.edit().putString("whereSave", whereSave).commit(); + } + public static int getSaveWidth(Context context) { + int def = 400; + return getFromPrefs(context, "saveWidth", def); + } + public static boolean setSaveWidth(Context context, int saveWidth) { + SharedPreferences prefs = getPrefs(context); + return prefs.edit().putInt("saveWidth", saveWidth).commit(); + } + public static int getSaveHeight(Context context) { + int def = 400; + return getFromPrefs(context, "saveHeight", def); + } + public static boolean setSaveHeight(Context context, int saveHeight) { + SharedPreferences prefs = getPrefs(context); + return prefs.edit().putInt("saveHeight", saveHeight).commit(); + } +} diff --git a/app/src/main/java/com/jopek/lectordecodi/ui/barcode_gen/BarcodeGenFragment.java b/app/src/main/java/com/jopek/lectordecodi/ui/barcode_gen/BarcodeGenFragment.java index 7ccda24..f13edee 100644 --- a/app/src/main/java/com/jopek/lectordecodi/ui/barcode_gen/BarcodeGenFragment.java +++ b/app/src/main/java/com/jopek/lectordecodi/ui/barcode_gen/BarcodeGenFragment.java @@ -1,6 +1,14 @@ package com.jopek.lectordecodi.ui.barcode_gen; +import static com.jopek.lectordecodi.MainActivity.TAG; +import static com.jopek.lectordecodi.SharedPreferencesManager.getSaveHeight; +import static com.jopek.lectordecodi.SharedPreferencesManager.getSaveWidth; +import static com.jopek.lectordecodi.SharedPreferencesManager.getWhereSave; + +import android.Manifest; +import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.media.MediaScannerConnection; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -9,9 +17,10 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; -import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -19,17 +28,20 @@ import com.google.zxing.BarcodeFormat; import com.jopek.lectordecodi.databinding.FragmentBarcodeGenBinding; import com.journeyapps.barcodescanner.BarcodeEncoder; -public class BarcodeGenFragment extends Fragment { +import java.io.File; +import java.io.FileOutputStream; +import java.util.Random; +public class BarcodeGenFragment extends Fragment { private FragmentBarcodeGenBinding binding; private EditText etInput; private ImageView img; private Button btnGen; + private Button btnSave; + private Bitmap code; - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - BarcodeGenViewModel barcodeGenViewModel = - new ViewModelProvider(this).get(BarcodeGenViewModel.class); + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + BarcodeGenViewModel barcodeGenViewModel = new ViewModelProvider(this).get(BarcodeGenViewModel.class); binding = FragmentBarcodeGenBinding.inflate(inflater, container, false); View root = binding.getRoot(); @@ -37,21 +49,68 @@ public class BarcodeGenFragment extends Fragment { etInput = binding.plainTextInput; img = binding.barcodeImg; btnGen = binding.btnGenBarcode; + btnSave = binding.btnSaveBarcode; btnGen.setOnClickListener(v -> { try { BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); - Bitmap bitmap = barcodeEncoder.encodeBitmap(String.valueOf(etInput.getText()), BarcodeFormat.EAN_13, 400, 400); - Log.d("maks", "onCreateView: " + bitmap); - img.setImageBitmap(bitmap); - } catch(Exception e) { - + code = barcodeEncoder.encodeBitmap(String.valueOf(etInput.getText()), BarcodeFormat.CODE_128, getSaveWidth(getActivity()), getSaveHeight(getActivity())); + img.setImageBitmap(code); + } catch (Exception e) { + Log.d(TAG, "onCreateView: ", e); + } + }); + btnSave.setOnClickListener(v -> { + if (getActivity().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); + } else { + saveBitmap(); } }); return root; } + private void saveBitmap() { + //MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), code, "UwU" , "OwO"); + File myDir = new File(getWhereSave(getActivity())); + Log.d(TAG, "onCreateView: " + myDir.getAbsolutePath()); + myDir.mkdir(); + Random generator = new Random(); + + int n = 10000; + n = generator.nextInt(n); + String fname = "image-" + n + ".jpg"; + File file = new File(myDir, fname); + try { + Log.d(TAG, file.getAbsolutePath()); + Log.d(TAG, String.valueOf(file.createNewFile())); + FileOutputStream out = new FileOutputStream(file); + code.compress(Bitmap.CompressFormat.JPEG, 90, out); + // sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, + // Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + return; + } + MediaScannerConnection.scanFile(getActivity(), new String[]{file.toString()}, null, (path, uri) -> { + Log.i("ExternalStorage", "Scanned " + path + ":"); + Log.i("ExternalStorage", "-> uri=" + uri); + }); + Toast.makeText(getActivity(), "Barcode saved", Toast.LENGTH_LONG).show(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.v(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]); + saveBitmap(); + } + } + @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app/src/main/java/com/jopek/lectordecodi/ui/qrcode_gen/QRCodeGenFragment.java b/app/src/main/java/com/jopek/lectordecodi/ui/qrcode_gen/QRCodeGenFragment.java index c3ec155..b2d7e6c 100644 --- a/app/src/main/java/com/jopek/lectordecodi/ui/qrcode_gen/QRCodeGenFragment.java +++ b/app/src/main/java/com/jopek/lectordecodi/ui/qrcode_gen/QRCodeGenFragment.java @@ -1,34 +1,118 @@ package com.jopek.lectordecodi.ui.qrcode_gen; +import static com.jopek.lectordecodi.MainActivity.TAG; +import static com.jopek.lectordecodi.SharedPreferencesManager.getSaveHeight; +import static com.jopek.lectordecodi.SharedPreferencesManager.getSaveWidth; +import static com.jopek.lectordecodi.SharedPreferencesManager.getWhereSave; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.media.MediaScannerConnection; import android.os.Bundle; +import android.os.Environment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import com.google.zxing.BarcodeFormat; import com.jopek.lectordecodi.databinding.FragmentQrcodeGenBinding; +import com.journeyapps.barcodescanner.BarcodeEncoder; -public class QRCodeGenFragment extends Fragment { +import java.io.File; +import java.io.FileOutputStream; +import java.util.Random; +public class QRCodeGenFragment extends Fragment { private FragmentQrcodeGenBinding binding; + private EditText etInput; + private ImageView img; + private Button btnGen; + private Button btnSave; + private Bitmap code; - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - QRCodeGenViewModel QRCodeGenViewModel = - new ViewModelProvider(this).get(QRCodeGenViewModel.class); + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + QRCodeGenViewModel qrCodeGenViewModel = new ViewModelProvider(this).get(QRCodeGenViewModel.class); binding = FragmentQrcodeGenBinding.inflate(inflater, container, false); View root = binding.getRoot(); - final TextView textView = binding.textSlideshow; - QRCodeGenViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); + etInput = binding.plainTextInputt; + img = binding.barcodeImg; + btnGen = binding.btnGenBarcode; + btnSave = binding.btnSaveBarcode; + + btnGen.setOnClickListener(v -> { + try { + BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); + code = barcodeEncoder.encodeBitmap(String.valueOf(etInput.getText()), BarcodeFormat.QR_CODE, getSaveWidth(getActivity()), getSaveHeight(getActivity())); + img.setImageBitmap(code); + } catch (Exception e) { + Log.d(TAG, "onCreateView: ", e); + } + }); + btnSave.setOnClickListener(v -> { + if (getActivity().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); + } else { + saveBitmap(); + } + }); + return root; } + private void saveBitmap() { + //MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), code, "UwU" , "OwO"); + File myDir = new File(getWhereSave(getActivity())); + Log.d(TAG, "onCreateView: " + myDir.getAbsolutePath()); + myDir.mkdir(); + Random generator = new Random(); + + int n = 10000; + n = generator.nextInt(n); + String fname = "image-" + n + ".jpg"; + File file = new File(myDir, fname); + try { + Log.d(TAG, file.getAbsolutePath()); + Log.d(TAG, String.valueOf(file.createNewFile())); + FileOutputStream out = new FileOutputStream(file); + code.compress(Bitmap.CompressFormat.JPEG, 90, out); + // sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, + // Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + return; + } + MediaScannerConnection.scanFile(getActivity(), new String[]{file.toString()}, null, (path, uri) -> { + Log.i("ExternalStorage", "Scanned " + path + ":"); + Log.i("ExternalStorage", "-> uri=" + uri); + }); + Toast.makeText(getActivity(), "QRCode saved", Toast.LENGTH_LONG).show(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.v(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]); + saveBitmap(); + } + } + @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsFragment.java b/app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsFragment.java new file mode 100644 index 0000000..0f68cf5 --- /dev/null +++ b/app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsFragment.java @@ -0,0 +1,54 @@ +package com.jopek.lectordecodi.ui.settings; + +import static com.jopek.lectordecodi.SharedPreferencesManager.getWhereSave; + +import androidx.lifecycle.ViewModelProvider; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import android.os.Environment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.jopek.lectordecodi.R; +import com.jopek.lectordecodi.databinding.FragmentReaderBinding; +import com.jopek.lectordecodi.databinding.FragmentSettingsBinding; + +import java.io.File; + +public class SettingsFragment extends Fragment { + + private SettingsViewModel mViewModel; + private FragmentSettingsBinding binding; + + public static SettingsFragment newInstance() { + return new SettingsFragment(); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + + binding = FragmentSettingsBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + binding.etWhereSave.setText(getWhereSave(getActivity())); + + return root; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mViewModel = new ViewModelProvider(this).get(SettingsViewModel.class); + // TODO: Use the ViewModel + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsViewModel.java b/app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsViewModel.java new file mode 100644 index 0000000..1347766 --- /dev/null +++ b/app/src/main/java/com/jopek/lectordecodi/ui/settings/SettingsViewModel.java @@ -0,0 +1,7 @@ +package com.jopek.lectordecodi.ui.settings; + +import androidx.lifecycle.ViewModel; + +public class SettingsViewModel extends ViewModel { + // TODO: Implement the ViewModel +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml new file mode 100644 index 0000000..298a5a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_settings_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_barcode_gen.xml b/app/src/main/res/layout/fragment_barcode_gen.xml index caec265..c90f4a7 100644 --- a/app/src/main/res/layout/fragment_barcode_gen.xml +++ b/app/src/main/res/layout/fragment_barcode_gen.xml @@ -39,7 +39,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - +