From c81ef797276eb0f608658abe69c3ef6d457e0012 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 22 Dec 2016 17:15:51 +0300 Subject: [PATCH] fix old phones --- .../activities/MainActivity.java | 16 ++-- .../activities/RecordingActivity.java | 4 + .../activities/SettingsActivity.java | 2 + .../axet/audiorecorder/app/Storage.java | 10 +-- .../axet/audiorecorder/widgets/PitchView.java | 78 +++++++++++++++---- app/src/main/res/layout/recording.xml | 6 +- app/src/main/res/values-ru/strings.xml | 4 + 7 files changed, 88 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java index bec381b..d5b2a88 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java @@ -1,7 +1,6 @@ package com.github.axet.audiorecorder.activities; import android.Manifest; -import android.app.ActionBar; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -9,8 +8,8 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Color; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.drawable.ColorDrawable; import android.media.MediaPlayer; import android.net.Uri; @@ -39,14 +38,15 @@ import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; +import com.github.axet.androidlibrary.animations.RemoveItemAnimation; import com.github.axet.androidlibrary.widgets.OpenFileDialog; -import com.github.axet.androidlibrary.widgets.ThemeUtils; +import com.github.axet.androidlibrary.widgets.PopupShareActionProvider; import com.github.axet.audiorecorder.R; import com.github.axet.audiorecorder.animations.RecordingAnimation; -import com.github.axet.androidlibrary.animations.RemoveItemAnimation; import com.github.axet.audiorecorder.app.MainApplication; +import com.github.axet.audiorecorder.app.RawSamples; import com.github.axet.audiorecorder.app.Storage; -import com.github.axet.androidlibrary.widgets.PopupShareActionProvider; +import com.github.axet.audiorecorder.widgets.PitchView; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; @@ -638,6 +638,8 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr public static final String[] PERMISSIONS = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; boolean permitted(String[] ss) { + if (Build.VERSION.SDK_INT < 11) + return true; for (String s : ss) { if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED) { return false; @@ -647,6 +649,8 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr } boolean permitted() { + if (Build.VERSION.SDK_INT < 11) + return true; for (String s : PERMISSIONS) { if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, PERMISSIONS, 1); diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java index e1920c7..b4efb2c 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java @@ -738,6 +738,8 @@ public class RecordingActivity extends AppCompatActivity { }; boolean permitted(String[] ss) { + if (Build.VERSION.SDK_INT < 11) + return true; for (String s : ss) { if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED) { return false; @@ -747,6 +749,8 @@ public class RecordingActivity extends AppCompatActivity { } boolean permitted() { + if (Build.VERSION.SDK_INT < 11) + return true; for (String s : PERMISSIONS) { if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, PERMISSIONS, 1); diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java index f23ae06..9bb048b 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java @@ -208,6 +208,8 @@ public class SettingsActivity extends AppCompatPreferenceActivity implements Sha public static final String[] PERMISSIONS = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; public static boolean permitted(Context context, String[] ss) { + if (Build.VERSION.SDK_INT < 11) + return true; for (String s : ss) { if (ContextCompat.checkSelfPermission(context, s) != PackageManager.PERMISSION_GRANTED) { return false; diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java b/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java index 457d351..313a783 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java @@ -1,7 +1,6 @@ package com.github.axet.audiorecorder.app; import android.Manifest; -import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -10,13 +9,8 @@ import android.os.Build; import android.os.StatFs; import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; -import android.util.Log; -import android.widget.Toast; import com.github.axet.audiorecorder.R; -import com.github.axet.audiorecorder.activities.RecordingActivity; -import com.github.axet.audiorecorder.encoders.FormatM4A; -import com.github.axet.audiorecorder.encoders.FormatWAV; import java.io.File; import java.io.FileInputStream; @@ -42,6 +36,8 @@ public class Storage { public static final String[] PERMISSIONS = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; public boolean permitted(String[] ss) { + if (Build.VERSION.SDK_INT < 11) + return true; for (String s : ss) { if (ContextCompat.checkSelfPermission(context, s) != PackageManager.PERMISSION_GRANTED) { return false; @@ -227,7 +223,7 @@ public class Storage { StatFs fsi = new StatFs(f.getPath()); if (Build.VERSION.SDK_INT < 18) - return fsi.getBlockSize() * fsi.getAvailableBlocks(); + return fsi.getBlockSize() * (long) fsi.getAvailableBlocks(); else return fsi.getBlockSizeLong() * fsi.getAvailableBlocksLong(); } diff --git a/app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java b/app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java index 01456b3..43ce578 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java +++ b/app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java @@ -1,24 +1,18 @@ package com.github.axet.audiorecorder.widgets; import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; -import android.os.Build; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; -import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import com.github.axet.androidlibrary.widgets.ThemeUtils; import com.github.axet.audiorecorder.R; -import com.github.axet.audiorecorder.app.MainApplication; import com.github.axet.audiorecorder.app.RawSamples; import java.util.LinkedList; @@ -83,8 +77,7 @@ public class PitchView extends ViewGroup { Handler handler; Runnable run; - public static HandlerUpdate start(Handler handler, Runnable run, long updateSpeed) { - HandlerUpdate r = new HandlerUpdate(); + public static HandlerUpdate start(HandlerUpdate r, Handler handler, Runnable run, long updateSpeed) { r.run = run; r.start = System.currentTimeMillis(); r.updateSpeed = updateSpeed; @@ -94,14 +87,18 @@ public class PitchView extends ViewGroup { return r; } + public static HandlerUpdate start(Handler handler, Runnable run, long updateSpeed) { + HandlerUpdate r = new HandlerUpdate(); + return start(r, handler, run, updateSpeed); + } + + public static void stop(Handler handler, Runnable run) { handler.removeCallbacks(run); } @Override public void run() { - this.run.run(); - long cur = System.currentTimeMillis(); long diff = cur - start; @@ -112,6 +109,40 @@ public class PitchView extends ViewGroup { if (delay > updateSpeed) delay = updateSpeed; + post(delay); + } + + void post(long delay) { + this.run.run(); + + if (delay > 0) + this.handler.postDelayed(this, delay); + else + this.handler.post(this); + } + } + + // if CPU speed not enough skip frames + public static class FallbackUpdate extends HandlerUpdate { + Runnable fallback; + long slow; + + public static FallbackUpdate start(Handler handler, Runnable run, Runnable fallback, long updateSpeed) { + FallbackUpdate r = new FallbackUpdate(); + r.fallback = fallback; + r.slow = updateSpeed / 4; + return (FallbackUpdate) start(r, handler, run, updateSpeed); + } + + @Override + void post(long delay) { + if (delay < slow) { + Log.d(TAG, "fallback " + delay + " " + slow); + this.fallback.run(); + } else { + Log.d(TAG, "run " + delay + " " + slow); + this.run.run(); + } if (delay > 0) this.handler.postDelayed(this, delay); else @@ -421,11 +452,12 @@ public class PitchView extends ViewGroup { } public void fit(int max) { + if (max < 0) // -1 + return; if (data.size() > max) { int cut = data.size() - max; data.subList(0, cut).clear(); samples += cut; - int m = data.size() - 1; // screen rotate may cause play/edit offsets off screen if (editPos > m) @@ -571,13 +603,18 @@ public class PitchView extends ViewGroup { public void edit() { if (edit == null) { editFlash = true; - - edit = HandlerUpdate.start(handler, new Runnable() { + edit = FallbackUpdate.start(handler, new Runnable() { @Override public void run() { draw(); editFlash = !editFlash; } + }, new Runnable() { + @Override + public void run() { + graph.calc(); + editFlash = !editFlash; + } }, EDIT_UPDATE_SPEED); } } @@ -595,12 +632,16 @@ public class PitchView extends ViewGroup { if (draw == null) { time = System.currentTimeMillis(); - - draw = HandlerUpdate.start(handler, new Runnable() { + draw = FallbackUpdate.start(handler, new Runnable() { @Override public void run() { drawCalc(); } + }, new Runnable() { + @Override + public void run() { + graph.calc(); + } }, UPDATE_SPEED); } } @@ -638,11 +679,16 @@ public class PitchView extends ViewGroup { if (play == null) { time = System.currentTimeMillis(); - play = HandlerUpdate.start(handler, new Runnable() { + play = FallbackUpdate.start(handler, new Runnable() { @Override public void run() { draw(); } + }, new Runnable() { + @Override + public void run() { + graph.calc(); + } }, UPDATE_SPEED); } } diff --git a/app/src/main/res/layout/recording.xml b/app/src/main/res/layout/recording.xml index a470301..39c9e40 100644 --- a/app/src/main/res/layout/recording.xml +++ b/app/src/main/res/layout/recording.xml @@ -123,7 +123,7 @@ android:src="@drawable/play" android:tint="?attr/colorAccent" /> - @@ -135,7 +135,7 @@ android:src="@drawable/ic_create_black_24dp" android:tint="?attr/colorAccent" /> - @@ -148,7 +148,7 @@ android:src="@drawable/share" android:tint="?attr/colorAccent" /> - diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 974634f..7b85bf3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -61,23 +61,27 @@ %d день %d дня %d дней + %d дней %d час %d часа %d часов + %d часов %d минута %d минуты %d минут + %d минут %d секунда %d секунды %d секунд + %d секунд