From cf796fe695fa9497b1d97b68586908fdcc5039c7 Mon Sep 17 00:00:00 2001 From: Olga Miller Date: Mon, 9 Jan 2017 22:37:17 +0100 Subject: [PATCH] New Thread and additional ProgressBar for saving of wave file, ProgressBarWrapper now with text --- app/src/main/java/om/sstvencoder/Encoder.java | 47 ++++++++++++++----- .../java/om/sstvencoder/MainActivity.java | 32 ++++++++++--- .../om/sstvencoder/MainActivityMessenger.java | 39 +++++++++++++++ .../om/sstvencoder/ProgressBarWrapper.java | 25 ++++++---- app/src/main/res/layout/activity_main.xml | 35 ++++++++++++-- 5 files changed, 147 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/om/sstvencoder/MainActivityMessenger.java diff --git a/app/src/main/java/om/sstvencoder/Encoder.java b/app/src/main/java/om/sstvencoder/Encoder.java index 141cb96..2dda182 100644 --- a/app/src/main/java/om/sstvencoder/Encoder.java +++ b/app/src/main/java/om/sstvencoder/Encoder.java @@ -29,14 +29,19 @@ import om.sstvencoder.Output.OutputFactory; // Creates IMode instance class Encoder { + private final MainActivityMessenger mMessenger; private final Thread mThread; + private Thread mSaveWaveThread; private final List mQueue; - private final ProgressBarWrapper mProgressBar; + private final ProgressBarWrapper mProgressBar, mProgressBar2; private boolean mQuit, mStop; private Class mModeClass; - Encoder(ProgressBarWrapper progressBar) { + Encoder(MainActivityMessenger messenger, + ProgressBarWrapper progressBar, ProgressBarWrapper progressBar2) { + mMessenger = messenger; mProgressBar = progressBar; + mProgressBar2 = progressBar2; mQueue = new LinkedList<>(); mQuit = false; mStop = false; @@ -61,7 +66,7 @@ class Encoder { mode = mQueue.remove(0); } mode.init(); - mProgressBar.begin(mode.getProcessCount()); + mProgressBar.begin(mode.getProcessCount(), "Sending..."); while (mode.process()) { mProgressBar.step(); @@ -103,19 +108,37 @@ class Encoder { enqueue(mode); } - boolean save(Bitmap bitmap, File file) { + void save(Bitmap bitmap, File file) { + if (mSaveWaveThread != null && mSaveWaveThread.isAlive()) + return; IOutput output = OutputFactory.createOutputForSavingAsWave(file); IMode mode = ModeFactory.CreateMode(mModeClass, bitmap, output); - if (mode != null) { - mode.init(); + if (mode != null) + save(mode, file); + } - while (mode.process()) { - if (mQuit) - break; + private void save(final IMode mode, final File file) { + mSaveWaveThread = new Thread() { + @Override + public void run() { + mode.init(); + mProgressBar2.begin(mode.getProcessCount(), file.getName() + " saving..."); + + while (mode.process()) { + mProgressBar2.step(); + + synchronized (this) { + if (mQuit) + break; + } + } + mode.finish(mQuit); + mProgressBar2.end(); + if (!mQuit) + mMessenger.carrySaveAsWaveIsDoneMessage(file); } - mode.finish(mQuit); - } - return !mQuit; + }; + mSaveWaveThread.start(); } void stop() { diff --git a/app/src/main/java/om/sstvencoder/MainActivity.java b/app/src/main/java/om/sstvencoder/MainActivity.java index 613001f..343dcc7 100644 --- a/app/src/main/java/om/sstvencoder/MainActivity.java +++ b/app/src/main/java/om/sstvencoder/MainActivity.java @@ -40,6 +40,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.widget.ProgressBar; +import android.widget.TextView; import android.widget.Toast; import java.io.File; @@ -65,7 +66,7 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCropView = (CropView) findViewById(R.id.cropView); - mEncoder = new Encoder(new ProgressBarWrapper((ProgressBar) findViewById(R.id.progressBar))); + mEncoder = new Encoder(new MainActivityMessenger(this), getProgressBar(), getProgressBar2()); IModeInfo mode = mEncoder.getModeInfo(); mCropView.setModeSize(mode.getModeSize()); setTitle(mode.getModeName()); @@ -76,6 +77,18 @@ public class MainActivity extends AppCompatActivity { loadImage(getIntent()); } + private ProgressBarWrapper getProgressBar() { + ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); + TextView progressBarText = (TextView) findViewById(R.id.progressBarText); + return new ProgressBarWrapper(progressBar, progressBarText); + } + + private ProgressBarWrapper getProgressBar2() { + ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar2); + TextView progressBarText = (TextView) findViewById(R.id.progressBarText2); + return new ProgressBarWrapper(progressBar, progressBarText); + } + @Override protected void onNewIntent(Intent intent) { loadImage(intent); @@ -401,12 +414,17 @@ public class MainActivity extends AppCompatActivity { private void save() { File file = Utility.createWaveFilePath(); - if (mEncoder.save(mCropView.getBitmap(), file)) { - ContentValues values = Utility.getWavContentValues(file); - Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); - getContentResolver().insert(uri, values); - Toast.makeText(this, file.getName() + " saved.", Toast.LENGTH_SHORT).show(); - } + mEncoder.save(mCropView.getBitmap(), file); + } + + public void completeSaving(File file) { + addFileToContentResolver(file); + } + + private void addFileToContentResolver(File file) { + ContentValues values = Utility.getWavContentValues(file); + Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); + getContentResolver().insert(uri, values); } @Override diff --git a/app/src/main/java/om/sstvencoder/MainActivityMessenger.java b/app/src/main/java/om/sstvencoder/MainActivityMessenger.java new file mode 100644 index 0000000..e7216e8 --- /dev/null +++ b/app/src/main/java/om/sstvencoder/MainActivityMessenger.java @@ -0,0 +1,39 @@ +/* +Copyright 2017 Olga Miller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package om.sstvencoder; + +import android.os.Handler; + +import java.io.File; + +class MainActivityMessenger { + private final MainActivity mMainActivity; + private final Handler mHandler; + + MainActivityMessenger(MainActivity activity) { + mMainActivity = activity; + mHandler = new Handler(); + } + + void carrySaveAsWaveIsDoneMessage(final File file) { + mHandler.post(new Runnable() { + @Override + public void run() { + mMainActivity.completeSaving(file); + } + }); + } +} diff --git a/app/src/main/java/om/sstvencoder/ProgressBarWrapper.java b/app/src/main/java/om/sstvencoder/ProgressBarWrapper.java index ec003a0..c905a46 100644 --- a/app/src/main/java/om/sstvencoder/ProgressBarWrapper.java +++ b/app/src/main/java/om/sstvencoder/ProgressBarWrapper.java @@ -18,37 +18,45 @@ package om.sstvencoder; import android.os.Handler; import android.view.View; import android.widget.ProgressBar; +import android.widget.TextView; class ProgressBarWrapper { private final ProgressBar mProgressBar; + private final TextView mText; private final Handler mHandler; private final int mSteps; private int mLastStep; private int mPosition, mMaxPosition; - ProgressBarWrapper(ProgressBar progressBar) { + ProgressBarWrapper(ProgressBar progressBar, TextView text) { mProgressBar = progressBar; - mProgressBar.setVisibility(View.INVISIBLE); + mProgressBar.setVisibility(View.GONE); + mText = text; + mText.setVisibility(View.GONE); mHandler = new Handler(); mSteps = 10; } - private void startProgressBar(final int max) { + private void startProgressBar(final int max, final String text) { mHandler.post(new Runnable() { @Override public void run() { mProgressBar.setMax(max); mProgressBar.setProgress(0); mProgressBar.setVisibility(View.VISIBLE); + if (text != null) { + mText.setText(text); + mText.setVisibility(View.VISIBLE); + } } }); } - private void stepProgressBar(final int state) { + private void stepProgressBar(final int progress) { mHandler.post(new Runnable() { @Override public void run() { - mProgressBar.setProgress(state); + mProgressBar.setProgress(progress); } }); } @@ -57,16 +65,17 @@ class ProgressBarWrapper { mHandler.post(new Runnable() { @Override public void run() { - mProgressBar.setVisibility(View.INVISIBLE); + mProgressBar.setVisibility(View.GONE); + mText.setVisibility(View.GONE); } }); } - void begin(int max) { + void begin(int max, String text) { mLastStep = 0; mPosition = 0; mMaxPosition = max; - startProgressBar(mSteps); + startProgressBar(mSteps, text); } void step() { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index edc2a51..a826577 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -17,11 +17,38 @@ android:layout_alignParentStart="true" android:layout_alignParentTop="true"/> - + android:orientation="vertical"> + + + + + + + + + +