From 90478c881d47f8095fdf325f983566e7d55052be Mon Sep 17 00:00:00 2001 From: icewithcola Date: Fri, 31 May 2024 11:04:43 +0800 Subject: [PATCH] Stage Change For page 5 --- .idea/deploymentTargetDropDown.xml | 15 +-- app/build.gradle.kts | 5 +- .../java/uk/kagurach/android101/Page3.java | 1 + .../java/uk/kagurach/android101/Page5.java | 78 ++++++++++++- .../AbstractAutoCompleteHelper.java | 77 ++++++++++++ .../AnimalTypeAutoCompleteHelper.java | 49 ++++++++ app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/layout/activity_page5.xml | 110 ++++++++++++++++++ app/src/main/res/values-zh-rCN/strings.xml | 18 +++ app/src/main/res/values/strings.xml | 28 +++-- app/src/main/res/values/themes.xml | 6 +- gradle/libs.versions.toml | 12 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 13 files changed, 366 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AbstractAutoCompleteHelper.java create mode 100644 app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AnimalTypeAutoCompleteHelper.java diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index e0bb9b3..828dc84 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -22,20 +22,7 @@ - - - - - - - - - - - - - - + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bfcb44d..b59ee59 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "uk.kagurach.android101" minSdk = 31 targetSdk = 34 - versionCode = 153 - versionName = "1.5.3" + versionCode = 155 + versionName = "1.5.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -68,6 +68,7 @@ dependencies { implementation(libs.androidx.annotation) implementation(libs.androidx.lifecycle.livedata.ktx) implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.datastore.rxjava3) testImplementation(libs.junit) diff --git a/app/src/main/java/uk/kagurach/android101/Page3.java b/app/src/main/java/uk/kagurach/android101/Page3.java index 098c32b..8abb09c 100644 --- a/app/src/main/java/uk/kagurach/android101/Page3.java +++ b/app/src/main/java/uk/kagurach/android101/Page3.java @@ -116,6 +116,7 @@ public class Page3 extends AppCompatActivity { Button dot = findViewById(R.id.P3Dot); switch (o) { case "退格": + case "BackSpace": if (!s.isEmpty()) { if (s.length() == 1) { s = ""; diff --git a/app/src/main/java/uk/kagurach/android101/Page5.java b/app/src/main/java/uk/kagurach/android101/Page5.java index f7e4b6f..d1bbcbb 100644 --- a/app/src/main/java/uk/kagurach/android101/Page5.java +++ b/app/src/main/java/uk/kagurach/android101/Page5.java @@ -1,15 +1,32 @@ package uk.kagurach.android101; +import android.content.Context; import android.os.Bundle; +import android.preference.Preference; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.TextView; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.datastore.rxjava3.RxDataStore; + +import java.io.IOException; +import java.util.Objects; + +import uk.kagurach.android101.misc.AutoCompleHelper.AnimalTypeAutoCompleteHelper; public class Page5 extends AppCompatActivity { + AnimalTypeAutoCompleteHelper completeHelper = null; + RxDataStore mDataStore = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -20,5 +37,64 @@ public class Page5 extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + + // Set auto-suggestions for animals + AutoCompleteTextView autoCompleteTextView = findViewById(R.id.AnimalTypeAutoCompleteInput); + try { + completeHelper = new AnimalTypeAutoCompleteHelper(this); + completeHelper.Load(); + autoCompleteTextView.setAdapter( + completeHelper.GetArrayAdapter( + this,android.R.layout.simple_list_item_1 + )); + } catch (IOException e){ + Log.e("P5IOException", Objects.requireNonNull(e.getMessage())); + } + + // Set Button Handler + Button P5AddAnimalButton = findViewById(R.id.P5AddAnimalButton); + P5AddAnimalButton.setOnClickListener(new AddAminalButtonHander()); } -} \ No newline at end of file + + + + class AddAminalButtonHander implements View.OnClickListener { + @Override + public void onClick(View v) { + TextView name = findViewById(R.id.P5AnimalNameInput); + AutoCompleteTextView type = findViewById(R.id.AnimalTypeAutoCompleteInput); + + if (name.getText().toString().isEmpty()||type.getText().toString().isEmpty()){ + ToastHelper.SmartToast.ShowToast("Please input all fields",v.getContext()); + } + + try { + completeHelper.AddEntry(type.getText().toString()); + } catch (IOException e) { + throw new RuntimeException(e); + } + + try { + completeHelper.Sync(); + } catch (IOException e) { + throw new RuntimeException(e); + } + type.setAdapter( + completeHelper.GetArrayAdapter( + v.getContext(),android.R.layout.simple_list_item_1 + )); + } + } + + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (getCurrentFocus() != null) { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } + return super.dispatchTouchEvent(ev); + } +} + diff --git a/app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AbstractAutoCompleteHelper.java b/app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AbstractAutoCompleteHelper.java new file mode 100644 index 0000000..cb8a67b --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AbstractAutoCompleteHelper.java @@ -0,0 +1,77 @@ +package uk.kagurach.android101.misc.AutoCompleHelper; + +import android.content.Context; +import android.widget.ArrayAdapter; + +import androidx.annotation.LayoutRes; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Scanner; +import java.util.Set; + +public abstract class AbstractAutoCompleteHelper { + List data = null; + public String dataFile = null; + boolean loaded = false; + + abstract void AddEntry(String name) throws IOException; + abstract void DeleteEntry(String name); + public void Load() throws IOException { + if (dataFile==null){ + throw new RuntimeException("dataFile not specified"); + } + File _data = new File(dataFile); + if (!_data.isFile()){ + _data.createNewFile(); + } + if (!_data.canRead() || !_data.canWrite()){ + throw new RuntimeException("File permission denied"); + } + loaded = true; + Scanner scanner = new Scanner(_data); + + if (data == null) { + data = new ArrayList<>(); + }else { + // 去重 + Set set = new LinkedHashSet<>(data); + data = new ArrayList<>(set); + } + while (scanner.hasNextLine()){ + data.add(scanner.nextLine()); + } + + } + public void Sync() throws IOException { + if (dataFile==null){ + throw new RuntimeException("dataFile not specified"); + } + File _data = new File(dataFile); + if (!_data.isFile()){ + _data.createNewFile(); + } + if (!_data.canRead() || !_data.canWrite()){ + throw new RuntimeException("File permission denied"); + } + + StringBuilder stringBuilder = new StringBuilder(); + for (String name:data) { + stringBuilder.append(name); + stringBuilder.append('\n'); + } + try (FileWriter fileWriter = new FileWriter(_data,false)) { + fileWriter.write(stringBuilder.toString()); + } + catch (IOException e){ + throw new IOException(e); + } + } + + public abstract ArrayAdapter GetArrayAdapter( + Context ctx, @LayoutRes int resource); +} diff --git a/app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AnimalTypeAutoCompleteHelper.java b/app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AnimalTypeAutoCompleteHelper.java new file mode 100644 index 0000000..01f747d --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/misc/AutoCompleHelper/AnimalTypeAutoCompleteHelper.java @@ -0,0 +1,49 @@ +package uk.kagurach.android101.misc.AutoCompleHelper; + +import android.content.Context; +import android.widget.ArrayAdapter; + +import androidx.annotation.DrawableRes; +import androidx.annotation.LayoutRes; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +public class AnimalTypeAutoCompleteHelper extends AbstractAutoCompleteHelper { + public AnimalTypeAutoCompleteHelper(Context ctx) throws IOException { + dataFile = ctx.getFilesDir().getAbsolutePath() + File.separator + "animalTypes.dat"; + Load(); + } + + + @Override + public void AddEntry(String name) throws IOException { + if (!loaded){ + throw new RuntimeException("Haven't loaded"); + } + if (data.contains(name)){ + return; + } + data.add(name); + Sync(); + } + + @Override + public void DeleteEntry(String name) { + + } + + @Override + public ArrayAdapter GetArrayAdapter( + Context ctx, @LayoutRes int resource) { + if (data == null) { + return new ArrayAdapter<>(ctx, resource, + new String[]{ + "cat","dog","喵喵" + } + ); + } + return new ArrayAdapter<>(ctx, resource, data); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 80020c9..43522d8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -32,6 +32,7 @@ android:layout_weight="1" android:text="@string/next_page" android:enabled="false" + android:backgroundTint="#81D4FA" /> diff --git a/app/src/main/res/layout/activity_page5.xml b/app/src/main/res/layout/activity_page5.xml index 530c183..5a7835c 100644 --- a/app/src/main/res/layout/activity_page5.xml +++ b/app/src/main/res/layout/activity_page5.xml @@ -7,4 +7,114 @@ android:layout_height="match_parent" tools:context=".Page5"> + + + + + + + + + + + + + + + + +