From 8ff6d68d68dbe322b59185b238a6ec94cf001dcb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2019 05:30:55 +0000 Subject: [PATCH 1/4] Bump gradle from 3.5.1 to 3.5.2 Bumps gradle from 3.5.1 to 3.5.2. Signed-off-by: dependabot-preview[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 48947c3..fb516be 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:3.5.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From c147d699529c27e21011c7b413f3721b600de116 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 1 Jan 2020 07:24:04 +0000 Subject: [PATCH 2/4] Bump gradle from 3.5.2 to 3.5.3 Bumps gradle from 3.5.2 to 3.5.3. Signed-off-by: dependabot-preview[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fb516be..a5bb815 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:3.5.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 5068d078d002d8480309b84138f50afd3ed724f5 Mon Sep 17 00:00:00 2001 From: Fahad Saleem Date: Thu, 9 Jan 2020 19:58:21 +0500 Subject: [PATCH 3/4] added phrasebook and contentdescription for talkback --- app/build.gradle | 18 ++- app/src/main/AndroidManifest.xml | 1 + .../rocks/poopjournal/morse/DBHelper.java | 101 +++++++++++++ .../poopjournal/morse/EditTextTouch.java | 4 +- .../rocks/poopjournal/morse/MainActivity.java | 126 ++++++++++++++-- .../poopjournal/morse/PhraseBookActivity.java | 56 ++++++++ .../poopjournal/morse/PhrasebookAdapter.java | 89 ++++++++++++ .../poopjournal/morse/PhrasebookModel.java | 13 ++ .../morse/SwipeToDeleteCallback.java | 83 +++++++++++ app/src/main/res/drawable/bg_item_swipe.xml | 8 ++ .../res/drawable/ic_delete_black_24dp.xml | 9 ++ .../main/res/drawable/ic_star_black_24dp.xml | 9 ++ .../drawable/ic_star_border_black_24dp.xml | 9 ++ .../main/res/layout-land/activity_main.xml | 90 ++++++++---- app/src/main/res/layout/activity_main.xml | 134 +++++++++++------- .../main/res/layout/activity_phrasebook.xml | 43 ++++++ .../main/res/layout/item_list_phrasebook.xml | 30 ++++ gradle.properties | 2 + 18 files changed, 723 insertions(+), 102 deletions(-) create mode 100644 app/src/main/java/rocks/poopjournal/morse/DBHelper.java create mode 100644 app/src/main/java/rocks/poopjournal/morse/PhraseBookActivity.java create mode 100644 app/src/main/java/rocks/poopjournal/morse/PhrasebookAdapter.java create mode 100644 app/src/main/java/rocks/poopjournal/morse/PhrasebookModel.java create mode 100644 app/src/main/java/rocks/poopjournal/morse/SwipeToDeleteCallback.java create mode 100644 app/src/main/res/drawable/bg_item_swipe.xml create mode 100644 app/src/main/res/drawable/ic_delete_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_star_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_star_border_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_phrasebook.xml create mode 100644 app/src/main/res/layout/item_list_phrasebook.xml diff --git a/app/build.gradle b/app/build.gradle index 7aa2ac8..8250722 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { applicationId "rocks.poopjournal.morse" minSdkVersion 19 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 3 versionName "1.2" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -20,9 +20,13 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + + + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31fce57..4523616 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ + diff --git a/app/src/main/java/rocks/poopjournal/morse/DBHelper.java b/app/src/main/java/rocks/poopjournal/morse/DBHelper.java new file mode 100644 index 0000000..bbb224f --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/morse/DBHelper.java @@ -0,0 +1,101 @@ +package rocks.poopjournal.morse; + + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + + +import java.util.ArrayList; +import java.util.Calendar; + +public class DBHelper extends SQLiteOpenHelper { + + + private static final String DATABASE_NAME = "morse"; + private static final int DATABASE_VERSION = 1; + + // table name + private static final String TABLE_PHRASEBOOK = "phrasebook"; + + + private static final String KEY_ID = "id"; + private static final String TAG = "DBhandler"; + + public DBHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + + String CREATE_NOTES_PHRASEBOOK = "CREATE TABLE IF NOT EXISTS " + + TABLE_PHRASEBOOK + "(" + + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + + "sentence" + " TEXT," + + "morse" + " TEXT);"; + db.execSQL(CREATE_NOTES_PHRASEBOOK); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { + + } + public void addPhrase(String text, String morse){ + + for (PhrasebookModel model: getAllPhrases()){ + if (model.text.trim().equals(text.trim())){ + deleteNote(model.id); + Log.d("debug_star","deleted note, now returning"); + return; + } + } + + Log.d("debug_star","adding note, now returning"); + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put("sentence", text); + values.put("morse",morse); + + db.insert(TABLE_PHRASEBOOK, null,values); + db.close(); // Closing database connection + } + + + + + + public void deleteNote(int id){ + + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(TABLE_PHRASEBOOK,"id= " + id,null); + db.close(); // Closing database connection + + } + + public ArrayList getAllPhrases() { + String selectQuery = "SELECT * FROM " + TABLE_PHRASEBOOK; + ArrayList mList = new ArrayList(); + + try { + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + while (cursor.moveToNext()) { + mList.add(new PhrasebookModel(cursor.getInt(0),cursor.getString(1),cursor.getString(2))); + // Log.d(TAG, "title"+cursor.getString(3)+" notes="+cursor.getString(4)); + } + db.close(); + return mList; + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + +} diff --git a/app/src/main/java/rocks/poopjournal/morse/EditTextTouch.java b/app/src/main/java/rocks/poopjournal/morse/EditTextTouch.java index 47afa0f..f9264de 100644 --- a/app/src/main/java/rocks/poopjournal/morse/EditTextTouch.java +++ b/app/src/main/java/rocks/poopjournal/morse/EditTextTouch.java @@ -1,12 +1,14 @@ package rocks.poopjournal.morse; +import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.EditText; -public class EditTextTouch extends android.support.v7.widget.AppCompatEditText { +@SuppressLint("AppCompatCustomView") +public class EditTextTouch extends EditText { public EditTextTouch(Context context) { super(context); } diff --git a/app/src/main/java/rocks/poopjournal/morse/MainActivity.java b/app/src/main/java/rocks/poopjournal/morse/MainActivity.java index 1d9771a..656e828 100644 --- a/app/src/main/java/rocks/poopjournal/morse/MainActivity.java +++ b/app/src/main/java/rocks/poopjournal/morse/MainActivity.java @@ -2,42 +2,39 @@ import android.Manifest; import android.app.Activity; -import android.app.Dialog; -import android.app.ProgressDialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.graphics.Color; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.graphics.Typeface; import android.hardware.Camera; -import android.media.AudioManager; import android.media.MediaPlayer; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; -import android.os.PowerManager; import android.os.SystemClock; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; import android.os.Bundle; import android.text.Editable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; -import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; -import android.text.style.UnderlineSpan; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; @@ -79,12 +76,16 @@ public class MainActivity extends AppCompatActivity implements Camera.AutoFocusC HashMap popularMorseConversion = new HashMap<>(); HashMap popularMorseConversionText = new HashMap<>(); String flashText = null; + DBHelper helper; + ImageView star; + ArrayList arrayList; + final AtomicBoolean textToMorse = new AtomicBoolean(true); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - final AtomicBoolean textToMorse = new AtomicBoolean(true); + settings = findViewById(R.id.settings); mic = findViewById(R.id.input_mic_container); fullscreen = findViewById(R.id.input_fullscreen_container); @@ -100,6 +101,9 @@ protected void onCreate(Bundle savedInstanceState) { flash = findViewById(R.id.flash); popularMorseSuggestionContainer = findViewById(R.id.bottom_suggestion_container); + helper = new DBHelper(getApplicationContext()); + + star = findViewById(R.id.star); popularMorse.add("...---..."); popularMorse.add("-.-.--.--.."); popularMorse.add(".--.....--.....--....--.----...--.-.---..---.....-"); @@ -118,6 +122,13 @@ protected void onCreate(Bundle savedInstanceState) { flash.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + + int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA); + + if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(getApplicationContext(),"Please give camera permission to use flash",Toast.LENGTH_SHORT).show(); + return; + } turnOff(); if (textToMorse.get()){ if (!TextUtils.isEmpty(output.getText().toString())){ @@ -183,7 +194,8 @@ public void onClick(View view) { history.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Toast.makeText(getApplicationContext(),"To be implemented in a future release", Toast.LENGTH_SHORT).show(); + + startActivity(new Intent(MainActivity.this, PhraseBookActivity.class)); } }); mic.setOnClickListener(new View.OnClickListener() { @@ -248,6 +260,21 @@ public void run() { }; + star.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!TextUtils.isEmpty(output.getText().toString().trim()) && !TextUtils.isEmpty(input.getText().toString().trim())){ + if (textToMorse.get()) + helper.addPhrase(input.getText().toString(),output.getText().toString()); + else { + helper.addPhrase(output.getText().toString(),input.getText().toString()); + } + } + + arrayList = helper.getAllPhrases(); + checkForStarColor(); + } + }); flare.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -508,6 +535,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { output.setText(""); return; } + if (textToMorse.get()){ output.setText(""); String text = input.getText().toString(); @@ -515,6 +543,8 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { for (String letter : letters) { output.append(morseEncode(letter)+" "); } + + } else { if (popularMorse.contains(input.getText().toString())){ @@ -592,14 +622,68 @@ public void onClick(View view) { output.append(morseDecode(morse)); } } + + } @Override public void afterTextChanged(Editable s) { - + checkForStarColor(); } }); } + + private void checkForStarColor() { + boolean isTrue = false; + if (arrayList==null || arrayList.size()==0){ + star.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_star_border_black_24dp)); + star.setColorFilter(Color.parseColor("#7DD3D8")); + Log.d("debug_star","did not match new text: " + input.getText().toString() + ", setting star to off"); + return; + } + if (textToMorse.get()){ + for (PhrasebookModel model: arrayList){ + if (model.text.trim().equals(input.getText().toString().trim())){ + star.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_star_black_24dp)); + star.setColorFilter(Color.parseColor("#F9A825")); + Log.d("debug_star","matched new text: " + input.getText().toString() + ", setting star to on"); + return; + } + else { + + isTrue = true; + } + + } + if (isTrue){ + star.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_star_border_black_24dp)); + star.setColorFilter(Color.parseColor("#7DD3D8")); + Log.d("debug_star","did not match new text: " + input.getText().toString() + ", setting star to on"); + } + } + else { + for (PhrasebookModel model: arrayList){ + if (model.text.trim().equals(output.getText().toString().trim())){ + star.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_star_black_24dp)); + star.setColorFilter(Color.parseColor("#F9A825")); + Log.d("debug_star","matched new text: " + output.getText().toString() + ", setting star to on"); + return; + } + else { + + isTrue = true; + } + + } + if (isTrue){ + star.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_star_border_black_24dp)); + star.setColorFilter(Color.parseColor("#7DD3D8")); + Log.d("debug_star","did not match new text: " + output.getText().toString() + ", setting star to on"); + } + } + + } + private View.OnTouchListener otl = new View.OnTouchListener() { public boolean onTouch (View v, MotionEvent event) { return true; // the listener has consumed the event @@ -873,6 +957,7 @@ public interface KeyboardVisibilityCallback{ } public void turnOn() { + camera = Camera.open(); try { Camera.Parameters parameters = camera.getParameters(); @@ -1004,4 +1089,21 @@ void change(String s, String newSuggestion, TextView t){ sb.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getApplicationContext(),R.color.colorMorse)), k+1, k+popularMorseConversionText.get(input.getText().toString()).length() +1, 0); t.setText(sb); } + + + @Override + protected void onResume() { + super.onResume(); + + arrayList = helper.getAllPhrases(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + helper = new DBHelper(getApplicationContext()); + arrayList = helper.getAllPhrases(); + // Checks the orientation of the scree + } + } diff --git a/app/src/main/java/rocks/poopjournal/morse/PhraseBookActivity.java b/app/src/main/java/rocks/poopjournal/morse/PhraseBookActivity.java new file mode 100644 index 0000000..3846077 --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/morse/PhraseBookActivity.java @@ -0,0 +1,56 @@ +package rocks.poopjournal.morse; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; + +public class PhraseBookActivity extends AppCompatActivity { + + RecyclerView phrasebookRv; + PhrasebookAdapter phrasebookAdapter; + DBHelper helper; + ImageView back; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_phrasebook); + + helper =new DBHelper(getApplicationContext()); + + back = findViewById(R.id.back); + back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + ArrayList arrayList = helper.getAllPhrases(); + + + + phrasebookAdapter = new PhrasebookAdapter(this, helper); + + phrasebookRv = findViewById(R.id.rv_phrasebook); + phrasebookRv.setHasFixedSize(true);// same + RecyclerView.LayoutManager mLayoutManager = + new LinearLayoutManager(PhraseBookActivity.this); + phrasebookRv.setLayoutManager(mLayoutManager); + phrasebookRv.setAdapter(phrasebookAdapter); + + + phrasebookAdapter.setPhrasebookList(arrayList); + + ItemTouchHelper itemTouchHelper = new + ItemTouchHelper(new SwipeToDeleteCallback(phrasebookAdapter)); + itemTouchHelper.attachToRecyclerView(phrasebookRv); + + } +} diff --git a/app/src/main/java/rocks/poopjournal/morse/PhrasebookAdapter.java b/app/src/main/java/rocks/poopjournal/morse/PhrasebookAdapter.java new file mode 100644 index 0000000..9cd5d45 --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/morse/PhrasebookAdapter.java @@ -0,0 +1,89 @@ +package rocks.poopjournal.morse; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; + +public class PhrasebookAdapter extends RecyclerView.Adapter { + + + private Context context; + private ArrayList list = new ArrayList<>(); + + DBHelper helper; + public PhrasebookAdapter(Context context, DBHelper helper){ + this.context = context; + this.helper = helper; + } + // Overrides + @NonNull + @Override + public PhrasebookAdapter.ClientViewHolder onCreateViewHolder( + @NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater + .from(parent.getContext()) + .inflate(R.layout.item_list_phrasebook, parent, false); + return new PhrasebookAdapter.ClientViewHolder(view); + } + + + public Context getContext() { + return context; + } + + @Override + public void onBindViewHolder(@NonNull final PhrasebookAdapter.ClientViewHolder holder, final int position) { + + + holder.text.setText(list.get(position).text); + holder.morse.setText(list.get(position).morse); + + } + + @Override + public int getItemCount() { + return this.list.size(); + } + + + public void setPhrasebookList(ArrayList list){ + if (list==null || list.size()==0) + return; + + this.list = list; + notifyDataSetChanged(); + + } + // View Holders + public static class ClientViewHolder extends RecyclerView.ViewHolder { + + public TextView text, morse; + public RelativeLayout containerRl; + + public ClientViewHolder(View itemView) { + super(itemView); + this.text = itemView.findViewById(R.id.text); + this.morse = itemView.findViewById(R.id.morse); + this.containerRl = itemView.findViewById(R.id.containerRl); + } + } + + public void deleteItem(int position) { + Log.d("gotcalled","true" + list.get(position).id); + helper.deleteNote(list.get(position).id); + list.remove(position); + notifyItemRemoved(position); + Toast.makeText(context,"Deleted entry",Toast.LENGTH_SHORT).show(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/rocks/poopjournal/morse/PhrasebookModel.java b/app/src/main/java/rocks/poopjournal/morse/PhrasebookModel.java new file mode 100644 index 0000000..c422cfe --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/morse/PhrasebookModel.java @@ -0,0 +1,13 @@ +package rocks.poopjournal.morse; + +public class PhrasebookModel { + int id; + public String text; + public String morse; + + public PhrasebookModel(int id, String text, String morse) { + this.id = id; + this.text = text; + this.morse = morse; + } +} diff --git a/app/src/main/java/rocks/poopjournal/morse/SwipeToDeleteCallback.java b/app/src/main/java/rocks/poopjournal/morse/SwipeToDeleteCallback.java new file mode 100644 index 0000000..2adaad9 --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/morse/SwipeToDeleteCallback.java @@ -0,0 +1,83 @@ +package rocks.poopjournal.morse; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.view.View; +import android.widget.RelativeLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import static androidx.recyclerview.widget.ItemTouchHelper.ACTION_STATE_DRAG; +import static androidx.recyclerview.widget.ItemTouchHelper.ACTION_STATE_IDLE; + +public class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback { + private PhrasebookAdapter mAdapter; + private Drawable icon; + private final ColorDrawable background; + public SwipeToDeleteCallback(PhrasebookAdapter adapter) { + super(0, ItemTouchHelper.LEFT); + mAdapter = adapter; + icon = ContextCompat.getDrawable(mAdapter.getContext(), + R.drawable.ic_delete_black_24dp); + background = new ColorDrawable(Color.parseColor("#FD496C")); + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + + + return false; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + int position = viewHolder.getAdapterPosition(); + mAdapter.deleteItem(position); + + } + + + + + + @Override + public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, + dY, actionState, isCurrentlyActive); + View itemView = viewHolder.itemView; + int backgroundCornerOffset = 20; + + int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconBottom = iconTop + icon.getIntrinsicHeight(); + + if (dX > 0) { // Swiping to the right + /* int iconLeft = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth(); + int iconRight = itemView.getLeft() + iconMargin; + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + + background.setBounds(itemView.getLeft(), itemView.getTop(), + itemView.getLeft() + ((int) dX) + backgroundCornerOffset, + itemView.getBottom());*/ + } else if (dX < 0) { // Swiping to the left + int iconLeft = itemView.getRight() - iconMargin - icon.getIntrinsicWidth(); + int iconRight = itemView.getRight() - iconMargin; + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + + background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset, + itemView.getTop(), itemView.getRight(), itemView.getBottom()); + } else { // view is unSwiped + background.setBounds(0, 0, 0, 0); + } + + background.draw(c); + icon.draw(c); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_item_swipe.xml b/app/src/main/res/drawable/bg_item_swipe.xml new file mode 100644 index 0000000..3a75744 --- /dev/null +++ b/app/src/main/res/drawable/bg_item_swipe.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete_black_24dp.xml b/app/src/main/res/drawable/ic_delete_black_24dp.xml new file mode 100644 index 0000000..39e64d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_black_24dp.xml b/app/src/main/res/drawable/ic_star_black_24dp.xml new file mode 100644 index 0000000..01e5dfd --- /dev/null +++ b/app/src/main/res/drawable/ic_star_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_border_black_24dp.xml b/app/src/main/res/drawable/ic_star_border_black_24dp.xml new file mode 100644 index 0000000..b36536b --- /dev/null +++ b/app/src/main/res/drawable/ic_star_border_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index a717d49..913413e 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -23,6 +23,7 @@ android:layout_height="wrap_content" android:src="@drawable/ic_history" android:layout_marginStart="20dp" + android:contentDescription="Open Phrasebook" android:layout_alignParentStart="true" android:layout_centerVertical="true"/> @@ -42,6 +43,7 @@ android:layout_height="wrap_content" android:src="@drawable/ic_settings" android:layout_marginEnd="20dp" + android:contentDescription="Settings" android:layout_alignParentEnd="true" android:layout_centerVertical="true"/> @@ -91,6 +93,8 @@ @@ -203,47 +207,67 @@ android:textColor="@color/colorAccent" android:fontFamily="@font/overpass_regular"/> + android:layout_height="wrap_content"> - + + - - + android:layout_toRightOf="@id/star" + android:layout_height="42dp"> + + + + + @@ -268,6 +292,7 @@ android:id="@+id/input_dot" android:src="@drawable/input_dot" android:layout_width="36dp" + android:contentDescription="dot" android:layout_height="36dp" /> @@ -305,6 +331,7 @@ android:id="@+id/input_fullscreen" android:src="@drawable/fullscreen" android:layout_width="24dp" + android:contentDescription="full screen" android:layout_height="24dp" /> @@ -343,6 +371,7 @@ android:id="@+id/input_clear" android:src="@drawable/backspace" android:layout_width="24dp" + android:contentDescription="Clear input" android:layout_height="24dp" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fd9338..c36145a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -24,7 +24,8 @@ android:src="@drawable/ic_history" android:layout_marginStart="20dp" android:layout_alignParentStart="true" - android:layout_centerVertical="true"/> + android:layout_centerVertical="true" + android:contentDescription="Open Phrasebook" /> + android:layout_centerVertical="true" + android:contentDescription="Settings" /> + android:src="@drawable/ic_switch" + android:contentDescription="Switch Input" /> - - - - - - + + + + + + + + + + + @@ -271,7 +295,8 @@ android:id="@+id/input_dot" android:src="@drawable/input_dot" android:layout_width="36dp" - android:layout_height="36dp" /> + android:layout_height="36dp" + android:contentDescription="dot" /> + android:layout_height="8dp" + android:contentDescription="dash" /> + android:layout_height="24dp" + android:contentDescription="full screen" /> + android:layout_height="24dp" + android:contentDescription="Make keyboard for morse input visible" /> + android:layout_height="24dp" + android:contentDescription="Clear input" /> + android:layout_height="24dp" + android:contentDescription="Mic" /> diff --git a/app/src/main/res/layout/activity_phrasebook.xml b/app/src/main/res/layout/activity_phrasebook.xml new file mode 100644 index 0000000..c75d78d --- /dev/null +++ b/app/src/main/res/layout/activity_phrasebook.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_list_phrasebook.xml b/app/src/main/res/layout/item_list_phrasebook.xml new file mode 100644 index 0000000..613be45 --- /dev/null +++ b/app/src/main/res/layout/item_list_phrasebook.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 82618ce..d546dea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,8 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit From 681a7747005dca76227029c1f76952606baaf4a8 Mon Sep 17 00:00:00 2001 From: Jan Heinrich Reimer Date: Sat, 11 Jan 2020 13:50:23 +0100 Subject: [PATCH 4/4] Bump version --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8250722..71bb9ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "rocks.poopjournal.morse" minSdkVersion 19 targetSdkVersion 29 - versionCode 3 - versionName "1.2" + versionCode 4 + versionName "1.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes {