From 1009bfd5905b340606f927cecc5b5ad1d7fc3573 Mon Sep 17 00:00:00 2001 From: Simon Robinson Date: Tue, 1 Aug 2023 15:28:26 +0100 Subject: [PATCH] Additional modernisation and lint fixes --- .idea/inspectionProfiles/Project_Default.xml | 7 ++ .../ac/robinson/mediaphone/MediaPhone.java | 5 +- .../mediaphone/MediaPhoneActivity.java | 63 +++++----------- .../mediaphone/MediaPhoneApplication.java | 1 - .../mediaphone/activity/AudioActivity.java | 46 ++++-------- .../mediaphone/activity/CameraActivity.java | 57 +++------------ .../activity/FrameEditorActivity.java | 37 ++-------- .../activity/NarrativeBrowserActivity.java | 26 +++---- .../mediaphone/activity/PlaybackActivity.java | 15 ++-- .../activity/PreferencesActivity.java | 22 ++---- .../activity/SaveNarrativeActivity.java | 30 +++++--- .../activity/TemplateBrowserActivity.java | 29 +++----- .../mediaphone/activity/TextActivity.java | 28 +------ .../importing/BluetoothObserver.java | 8 +- .../mediaphone/provider/FrameAdapter.java | 5 +- .../mediaphone/provider/FrameItem.java | 23 ++---- .../mediaphone/provider/FramesManager.java | 73 ++++--------------- .../mediaphone/provider/MediaItem.java | 8 -- .../mediaphone/provider/MediaManager.java | 63 +++------------- .../provider/MediaPhoneProvider.java | 25 ++----- .../mediaphone/provider/NarrativeAdapter.java | 11 +-- .../mediaphone/provider/NarrativeItem.java | 4 - .../provider/NarrativesManager.java | 34 ++------- .../mediaphone/provider/UpgradeManager.java | 7 +- .../robinson/mediaphone/view/CameraView.java | 5 +- .../mediaphone/view/HorizontalListView.java | 24 +++--- .../mediaphone/view/SeekBarPreference.java | 10 ++- .../ac/robinson/mediaphone/view/VUMeter.java | 4 +- .../main/res/layout/audio_view_preview.xml | 9 --- ...audio_view_recording_controls_portrait.xml | 9 --- .../layout/audio_view_recording_landscape.xml | 7 -- .../src/main/res/layout/camera_view.xml | 18 ----- .../res/layout/frame_editor_components.xml | 9 --- MediaPhone/src/main/res/layout/text_view.xml | 9 --- .../main/res/menu/back_without_editing.xml | 11 --- MediaPhone/src/main/res/values-es/strings.xml | 2 +- MediaPhone/src/main/res/values-fr/strings.xml | 2 +- MediaPhone/src/main/res/values-nl/strings.xml | 1 - MediaPhone/src/main/res/values-pl/strings.xml | 1 - MediaPhone/src/main/res/values-pt/strings.xml | 2 +- MediaPhone/src/main/res/values-ru/strings.xml | 1 - MediaPhone/src/main/res/values/attrs.xml | 4 - MediaPhone/src/main/res/values/colors.xml | 4 +- MediaPhone/src/main/res/values/strings.xml | 1 - MediaUtilities | 2 +- .../metadata/android/en-US/changelogs/55.txt | 2 + 46 files changed, 201 insertions(+), 563 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 MediaPhone/src/main/res/menu/back_without_editing.xml create mode 100644 fastlane/metadata/android/en-US/changelogs/55.txt diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..a116d917 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhone.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhone.java index 7779e5c6..ee84e1f8 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhone.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhone.java @@ -40,7 +40,7 @@ public class MediaPhone { public static final int MAX_AUDIO_ITEMS = 3; // we can pause/resume recording only in AAC (M4A) formats - get extensions from MediaUtilities - public static String[] EDITABLE_AUDIO_EXTENSIONS; + public static final String[] EDITABLE_AUDIO_EXTENSIONS; static { String[] tempExtensions = new String[MediaUtilities.M4A_FILE_EXTENSIONS.length]; @@ -95,7 +95,6 @@ public class MediaPhone { // in milliseconds: duration of the frame icon fade in; time to wait after finishing scrolling before showing icons public static int ANIMATION_FADE_TRANSITION_DURATION = 175; - public static int ANIMATION_ICON_SHOW_DELAY = 350; public static int ANIMATION_ICON_REFRESH_DELAY = 250; public static int ANIMATION_POPUP_SHOW_DELAY = 250; public static int ANIMATION_POPUP_HIDE_DELAY = 600; @@ -113,7 +112,7 @@ public class MediaPhone { // in milliseconds, the length of time to show an image (if audio is not longer), and the minimum text duration public static int PLAYBACK_EXPORT_MINIMUM_FRAME_DURATION = 2500; - public static int PLAYBACK_EXPORT_WORD_DURATION = 200; + public static int PLAYBACK_EXPORT_WORD_DURATION = 200; // note: always overridden in MediaPhoneActivity.loadAllPreferences() // ----------------------------------------------------------------------------------------------------------------- // The following are globals that should eventually be moved to preferences, detected, or overridden at startup diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneActivity.java index 9f8907b5..f6961cf5 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneActivity.java @@ -22,7 +22,6 @@ import android.Manifest; import android.annotation.SuppressLint; -import android.app.Activity; import android.app.ActivityManager; import android.app.Dialog; import android.app.PendingIntent; @@ -219,11 +218,6 @@ protected void onPause() { ((MediaPhoneApplication) getApplication()).removeActivityHandle(this); } - @Override - protected void onDestroy() { - super.onDestroy(); - } - @Override public Object onRetainCustomNonConfigurationInstance() { // called before screen change - have to remove the parent activity @@ -247,10 +241,6 @@ protected void registerForSwipeEvents() { } } - protected void setSwipeEventsEnabled(boolean enabled) { - mCanSwipe = enabled; - } - // see: http://stackoverflow.com/a/7767610 private class SwipeDetector extends SimpleOnGestureListener { @Override @@ -373,7 +363,8 @@ protected Dialog onCreateDialog(int id) { if (ActivityCompat.shouldShowRequestPermissionRationale(MediaPhoneActivity.this, Manifest.permission.POST_NOTIFICATIONS)) { UIUtilities.showFormattedToast(MediaPhoneActivity.this, - R.string.permission_notification_rationale, getString(R.string.app_name)); + R.string.permission_notification_rationale, + getString(R.string.app_name)); } ActivityCompat.requestPermissions(MediaPhoneActivity.this, new String[]{ Manifest.permission.POST_NOTIFICATIONS }, PERMISSION_POST_NOTIFICATIONS); @@ -461,16 +452,12 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - protected void createMediaMenuNavigationButtons(MenuInflater inflater, Menu menu, boolean edited) { + protected void createMediaMenuNavigationButtons(MenuInflater inflater, Menu menu) { inflater.inflate(R.menu.add_frame, menu); inflater.inflate(R.menu.copy_media, menu); inflater.inflate(R.menu.paste_media, menu); - // if (edited) { inflater.inflate(R.menu.finished_editing, menu); - // } else { - // inflater.inflate(R.menu.back_without_editing, menu); - // } } protected void prepareMediaMenuNavigationButtons(Menu menu, String mediaId) { @@ -486,8 +473,7 @@ protected void prepareMediaMenuNavigationButtons(Menu menu, String mediaId) { menu.findItem(R.id.menu_copy_media).setVisible(true); menu.findItem(R.id.menu_paste_media).setVisible(false); } else { - SharedPreferences copyFrameSettings = getSharedPreferences(MediaPhone.APPLICATION_NAME, - Context.MODE_PRIVATE); + SharedPreferences copyFrameSettings = getSharedPreferences(MediaPhone.APPLICATION_NAME, Context.MODE_PRIVATE); String copiedFrameId = copyFrameSettings.getString(getString(R.string.key_copied_frame), null); menu.findItem(R.id.menu_copy_media).setVisible(false); menu.findItem(R.id.menu_paste_media).setVisible(!TextUtils.isEmpty(copiedFrameId)); @@ -665,18 +651,6 @@ public void run() { }; } - protected void setBackButtonIcons(Activity activity, int button1, int button2, boolean isEdited) { - //if (button1 != 0) { - // ((CenteredImageTextButton) findViewById(button1)).setCompoundDrawablesWithIntrinsicBounds(0, (isEdited ? R.drawable - // .ic_menu_accept : R.drawable.ic_menu_back), 0, 0); - //} - //if (button2 != 0) { - // ((CenteredImageTextButton) findViewById(button2)).setCompoundDrawablesWithIntrinsicBounds(0, (isEdited ? R.drawable - // .ic_menu_accept : R.drawable.ic_menu_back), 0, 0); - //} - //UIUtilities.refreshActionBar(activity); - } - @Override public void onActivityResult(int requestCode, int resultCode, Intent resultIntent) { if (requestCode == MediaPhone.R_id_intent_preferences) { @@ -770,7 +744,7 @@ private void loadAllPreferences() { try { String requestedOrientationString = mediaPhoneSettings.getString(getString(R.string.key_screen_orientation), null); if (requestedOrientationString != null) { - requestedOrientation = Integer.valueOf(requestedOrientationString); + requestedOrientation = Integer.parseInt(requestedOrientationString); } } catch (Exception e) { requestedOrientation = res.getInteger(R.integer.default_screen_orientation); @@ -1064,7 +1038,7 @@ protected String insertFrameAfterMedia(MediaItem existingMedia) { /** * Switch from one frame to another. Will call onBackPressed() on the calling activity */ - protected boolean switchFrames(String currentFrameId, int buttonId, String newFrameId, boolean showOptionsMenu) { + protected boolean switchFrames(String currentFrameId, int buttonId, String newFrameId) { if (currentFrameId == null) { return false; } @@ -1794,8 +1768,7 @@ protected void deleteNarrativeDialog(final String narrativeInternalId) { AlertDialog.Builder builder1 = new AlertDialog.Builder(MediaPhoneActivity.this); builder1.setTitle(R.string.delete_narrative_second_confirmation); builder1.setMessage( - getResources().getQuantityString(R.plurals.delete_narrative_second_hint, numFramesDeleted, - numFramesDeleted)); + getResources().getQuantityString(R.plurals.delete_narrative_second_hint, numFramesDeleted, numFramesDeleted)); builder1.setNegativeButton(R.string.button_cancel, null); builder1.setPositiveButton(R.string.button_delete, (dialog1, whichButton1) -> { ContentResolver contentResolver = getContentResolver(); @@ -1822,8 +1795,7 @@ protected void exportContent(final String narrativeId, final boolean isTemplate) UIUtilities.showFormattedToast(MediaPhoneActivity.this, R.string.permission_storage_rationale, getString(R.string.app_name)); } - ActivityCompat.requestPermissions(MediaPhoneActivity.this, - new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE }, + ActivityCompat.requestPermissions(MediaPhoneActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE }, PERMISSION_EXPORT_STORAGE); } @@ -1880,13 +1852,13 @@ protected void exportContent(final String narrativeId, final boolean isTemplate) settings.put(MediaUtilities.KEY_TEXT_BACKGROUND_COLOUR, res.getColor(R.color.export_text_background)); // TODO: do we want to do getDimensionPixelSize for export? - settings.put(MediaUtilities.KEY_TEXT_BACKGROUND_SPAN_WIDTH, Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB); + settings.put(MediaUtilities.KEY_TEXT_BACKGROUND_SPAN_WIDTH, true); settings.put(MediaUtilities.KEY_MAX_TEXT_FONT_SIZE, res.getDimensionPixelSize(R.dimen.export_maximum_text_size)); settings.put(MediaUtilities.KEY_MAX_TEXT_PERCENTAGE_HEIGHT_WITH_IMAGE, res.getInteger(R.integer.export_maximum_text_percentage_height_with_image)); settings.put(MediaUtilities.KEY_TEXT_SPACING, res.getDimensionPixelSize(R.dimen.export_icon_text_padding)); settings.put(MediaUtilities.KEY_TEXT_CORNER_RADIUS, - res.getDimensionPixelSize(R.dimen.export_icon_text_corner_radius)); +res.getDimensionPixelSize(R.dimen.export_icon_text_corner_radius)); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MediaPhoneActivity.this); @@ -1905,7 +1877,7 @@ protected void exportContent(final String narrativeId, final boolean isTemplate) int outputSize; try { String requestedExportSize = preferences.getString(getString(R.string.key_video_quality), null); - outputSize = Integer.valueOf(requestedExportSize); + outputSize = Integer.parseInt(requestedExportSize); } catch (Exception e) { outputSize = res.getInteger(R.integer.default_video_quality); } @@ -1926,9 +1898,10 @@ protected void exportContent(final String narrativeId, final boolean isTemplate) // set audio resampling rate: -1 = automatically selected (default); 0 = none int newBitrate; try { - String requestedBitrateString = preferences.getString( - getString(R.string.key_audio_resampling_bitrate), null); - newBitrate = Integer.valueOf(requestedBitrateString); + String requestedBitrateString = + preferences.getString(getString(R.string.key_audio_resampling_bitrate), + null); + newBitrate = Integer.parseInt(requestedBitrateString); } catch (Exception e) { newBitrate = res.getInteger(R.integer.default_resampling_bitrate); } @@ -2961,8 +2934,7 @@ public void run() { contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/" + appName); contentUri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL); } else if (Environment.DIRECTORY_MUSIC.equals(outputDirectoryType)) { - contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, - Environment.DIRECTORY_MUSIC + "/" + appName); + contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_MUSIC + "/" + appName); contentUri = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL); } if (contentUri != null) { @@ -2995,8 +2967,7 @@ public void run() { File outputFile = IOUtilities.newDatedFileName(outputDirectory, IOUtilities.getFileExtension(mediaFile.getName())); IOUtilities.copyFile(mediaFile, outputFile); - MediaScannerConnection.scanFile(MediaPhoneActivity.this, - new String[]{ outputFile.getAbsolutePath() }, + MediaScannerConnection.scanFile(MediaPhoneActivity.this, new String[]{ outputFile.getAbsolutePath() }, null, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneApplication.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneApplication.java index 84eb40ce..8a68bd55 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneApplication.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/MediaPhoneApplication.java @@ -172,7 +172,6 @@ private void initialiseParameters() { Resources res = getResources(); MediaPhone.ANIMATION_FADE_TRANSITION_DURATION = res.getInteger(R.integer.animation_fade_transition_duration); - MediaPhone.ANIMATION_ICON_SHOW_DELAY = res.getInteger(R.integer.animation_icon_show_delay); MediaPhone.ANIMATION_ICON_REFRESH_DELAY = res.getInteger(R.integer.animation_icon_refresh_delay); MediaPhone.ANIMATION_POPUP_SHOW_DELAY = res.getInteger(R.integer.animation_popup_show_delay); MediaPhone.ANIMATION_POPUP_HIDE_DELAY = res.getInteger(R.integer.animation_popup_hide_delay); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/AudioActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/AudioActivity.java index dc5fad97..a14c1ac4 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/AudioActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/AudioActivity.java @@ -140,9 +140,6 @@ protected void onCreate(Bundle savedInstanceState) { mMediaItemInternalId = savedInstanceState.getString(getString(R.string.extra_internal_id)); mHasEditedMedia = savedInstanceState.getBoolean(getString(R.string.extra_media_edited), true); mAudioPickerShown = savedInstanceState.getBoolean(getString(R.string.extra_external_chooser_shown), false); - if (mHasEditedMedia) { - setBackButtonIcons(AudioActivity.this, R.id.button_finished_audio, R.id.button_cancel_recording, true); - } } // prevent spanning if appropriate @@ -228,8 +225,6 @@ public void onBackPressed() { // update this frame's icon to show audio; propagate to following frames if applicable // TODO: we could just update when the audio is added or removed; edits not needed updateMediaFrameIcons(audioMediaItem, null); - setBackButtonIcons(AudioActivity.this, R.id.button_finished_audio, R.id.button_cancel_recording, - true); // if we do this then we can't tell whether to change icons on screen rotation; disabled // mHasEditedMedia = false; // we've saved the icon, so are no longer in edit mode @@ -262,7 +257,7 @@ public void onBackPressed() { @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); - createMediaMenuNavigationButtons(inflater, menu, mHasEditedMedia); + createMediaMenuNavigationButtons(inflater, menu); return super.onCreateOptionsMenu(menu); } @@ -306,7 +301,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } return true; - } else if (itemId == R.id.menu_back_without_editing || itemId == R.id.menu_finished_editing) { + } else if (itemId == R.id.menu_finished_editing) { onBackPressed(); return true; } @@ -350,17 +345,6 @@ protected void loadPreferences(SharedPreferences mediaPhoneSettings) { @Override protected void configureInterfacePreferences(SharedPreferences mediaPhoneSettings) { - // the soft done/back button - // TODO: remove this to fit with new styling (Toolbar etc) - int newVisibility = View.VISIBLE; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB || - !mediaPhoneSettings.getBoolean(getString(R.string.key_show_back_button), - getResources().getBoolean(R.bool.default_show_back_button))) { - newVisibility = View.GONE; - } - findViewById(R.id.button_finished_audio).setVisibility(newVisibility); - findViewById(R.id.button_cancel_recording).setVisibility(newVisibility); - // to enable or disable spanning, all we do is show/hide the interface - eg., items that already span will not be removed findViewById(R.id.button_toggle_mode_audio).setVisibility( mediaPhoneSettings.getBoolean(getString(R.string.key_spanning_media), @@ -500,8 +484,6 @@ private boolean switchToRecording(File currentFile) { return initialised; } - // @TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1) is for AAC/HE_AAC audio recording - @TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1) private boolean initialiseAudioRecording(File currentFile) { // where to record the new audio @@ -516,9 +498,10 @@ private boolean initialiseAudioRecording(File currentFile) { try { CheapSoundFile existingFile = CheapSoundFile.create(currentFile.getAbsolutePath(), true, null); - enforcedSampleRate = existingFile.getSampleRate(); - } catch (Exception e) { - enforcedSampleRate = -1; + if (existingFile != null) { + enforcedSampleRate = existingFile.getSampleRate(); + } + } catch (Exception ignored) { } } @@ -582,7 +565,6 @@ private void startRecording() { // if (MediaPhone.DEBUG) Log.d(DebugUtilities.getLogTag(this), "Recording - what: " + what + ", ex: " + extra); }); mMediaRecorder.start(); - setBackButtonIcons(AudioActivity.this, R.id.button_finished_audio, R.id.button_cancel_recording, true); } catch (Throwable t) { UIUtilities.showToast(AudioActivity.this, R.string.error_recording_audio); if (MediaPhone.DEBUG) { @@ -1008,12 +990,18 @@ public void seekTo(int pos) { @Override public boolean isPlaying() { - return mMediaPlayer != null ? mMediaPlayer.isPlaying() : false; + if (mMediaPlayer != null) { + return mMediaPlayer.isPlaying(); + } + return false; } @Override public boolean isLoading() { - return mMediaPlayer != null ? mMediaPlayer.isPlaying() : false; + if (mMediaPlayer != null) { + return mMediaPlayer.isPlaying(); + } + return false; } @Override @@ -1047,10 +1035,7 @@ public void handleButtonClicks(View currentButton) { } int buttonId = currentButton.getId(); - if (buttonId == R.id.button_cancel_recording || buttonId == R.id.button_finished_audio) { - onBackPressed(); - - } else if (buttonId == R.id.button_record_audio) { + if (buttonId == R.id.button_record_audio) { currentButton.setEnabled(false); // don't let them press twice if (mAudioRecordingInProgress) { stopRecording(AfterRecordingMode.DO_NOTHING); // don't switch to playback afterwards (can continue) @@ -1072,7 +1057,6 @@ public void handleButtonClicks(View currentButton) { mMediaItemInternalId); if (spanningAudioMediaItem != null && spanningAudioMediaItem.getFile().length() > 0) { mHasEditedMedia = true; // so we update/inherit on exit and show the media edited icon - setBackButtonIcons(AudioActivity.this, R.id.button_finished_audio, R.id.button_cancel_recording, true); boolean frameSpanning = toggleFrameSpanningMedia(spanningAudioMediaItem); updateSpanFramesButtonIcon(R.id.button_toggle_mode_audio, frameSpanning, true); UIUtilities.showToast(AudioActivity.this, diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/CameraActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/CameraActivity.java index 107a4532..25a936fc 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/CameraActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/CameraActivity.java @@ -141,9 +141,6 @@ protected void onCreate(Bundle savedInstanceState) { mHasEditedMedia = savedInstanceState.getBoolean(getString(R.string.extra_media_edited), true); mSwitchToLandscape = savedInstanceState.getInt(getString(R.string.extra_switch_to_landscape_camera), -1); mImagePickerShown = savedInstanceState.getBoolean(getString(R.string.extra_external_chooser_shown), false); - if (mHasEditedMedia) { - setBackButtonIcons(CameraActivity.this, R.id.button_finished_picture, 0, true); - } } // fix fullscreen margin layout issues @@ -265,7 +262,6 @@ public void onBackPressed() { if (mHasEditedMedia) { // update this frame's icon with the new image; propagate to following frames if applicable updateMediaFrameIcons(imageMediaItem, null); - setBackButtonIcons(CameraActivity.this, R.id.button_finished_picture, 0, true); // if we do this then we can't tell whether to change icons on screen rotation; disabled // mHasEditedMedia = false; // we've saved the icon, so are no longer in edit mode @@ -315,7 +311,7 @@ public boolean dispatchKeyEvent(KeyEvent event) { // TODO: onKeyDown instead? @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); - createMediaMenuNavigationButtons(inflater, menu, mHasEditedMedia); + createMediaMenuNavigationButtons(inflater, menu); return super.onCreateOptionsMenu(menu); } @@ -359,7 +355,7 @@ public boolean onOptionsItemSelected(MenuItem item) { // we don't allow pasting to replace existing items return true; - } else if (itemId == R.id.menu_back_without_editing || itemId == R.id.menu_finished_editing) { + } else if (itemId == R.id.menu_finished_editing) { onBackPressed(); return true; } @@ -379,17 +375,6 @@ protected void loadPreferences(SharedPreferences mediaPhoneSettings) { @Override protected void configureInterfacePreferences(SharedPreferences mediaPhoneSettings) { - // the soft done/back button - // TODO: remove this to fit with new styling (Toolbar etc) - int newVisibility = View.VISIBLE; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB || - !mediaPhoneSettings.getBoolean(getString(R.string.key_show_back_button), - getResources().getBoolean(R.bool.default_show_back_button))) { - newVisibility = View.GONE; - } - findViewById(R.id.button_cancel_camera).setVisibility(newVisibility); - findViewById(R.id.button_finished_picture).setVisibility(newVisibility); - // to enable or disable spanning, all we do is show/hide the interface - eg., items that already span will not be removed findViewById(R.id.button_toggle_mode_picture).setVisibility( mediaPhoneSettings.getBoolean(getString(R.string.key_spanning_media), @@ -519,11 +504,6 @@ private boolean configurePreCameraView() { importButton.setLayoutParams(new LinearLayout.LayoutParams(matchParent, matchParent, 1)); controlsLayout.addView(importButton); - View cancelButton = findViewById(R.id.button_cancel_camera); - controlsLayout.removeView(cancelButton); - cancelButton.setLayoutParams(new LinearLayout.LayoutParams(matchParent, matchParent, 1)); - controlsLayout.addView(cancelButton); - // move the flash and switch camera buttons to the right places RelativeLayout.LayoutParams flashLayoutParams = new RelativeLayout.LayoutParams(buttonHeight, LayoutParams.WRAP_CONTENT); @@ -559,11 +539,6 @@ private boolean configurePreCameraView() { View importButton = findViewById(R.id.button_import_image); controlsLayout.removeView(importButton); controlsLayout.addView(importButton); - - View cancelButton = findViewById(R.id.button_cancel_camera); - controlsLayout.removeView(cancelButton); - controlsLayout.addView(cancelButton); - // move the flash and switch camera buttons to the right places RelativeLayout.LayoutParams flashLayoutParams = new RelativeLayout.LayoutParams(buttonHeight, LayoutParams.WRAP_CONTENT); @@ -594,11 +569,6 @@ private boolean configurePreCameraView() { controlsLayout.setOrientation(LinearLayout.HORIZONTAL); // re-order the buttons - View cancelButton = findViewById(R.id.button_cancel_camera); - controlsLayout.removeView(cancelButton); - cancelButton.setLayoutParams(new LinearLayout.LayoutParams(matchParent, matchParent, 1)); - controlsLayout.addView(cancelButton); - View importButton = findViewById(R.id.button_import_image); controlsLayout.removeView(importButton); importButton.setLayoutParams(new LinearLayout.LayoutParams(matchParent, matchParent, 1)); @@ -855,8 +825,7 @@ protected Boolean doInBackground(byte[]... params) { if (mAddToMediaLibrary) { runImmediateBackgroundTask( - getMediaLibraryAdderRunnable(imageMediaItem.getFile().getAbsolutePath(), - Environment.DIRECTORY_DCIM)); + getMediaLibraryAdderRunnable(imageMediaItem.getFile().getAbsolutePath(), Environment.DIRECTORY_DCIM)); } return true; @@ -1002,11 +971,10 @@ protected void onBackgroundTaskCompleted(int taskId) { } else if (taskId == R.id.image_rotate_completed) { mStopImageRotationAnimation = true; mHasEditedMedia = true; // to force an icon update - setBackButtonIcons(CameraActivity.this, R.id.button_finished_picture, 0, true); // changed the image MediaItem imageMediaItem = MediaManager.findMediaByInternalId(getContentResolver(), mMediaItemInternalId); if (imageMediaItem != null) { // reload image - loadScreenSizedImageInBackground((ImageView) findViewById(R.id.camera_result), - imageMediaItem.getFile().getAbsolutePath(), true, FadeType.FADE_IN); + loadScreenSizedImageInBackground(findViewById(R.id.camera_result), imageMediaItem.getFile().getAbsolutePath(), + true, FadeType.FADE_IN); } findViewById(R.id.button_rotate_clockwise).setEnabled(true); findViewById(R.id.button_rotate_anticlockwise).setEnabled(true); @@ -1038,16 +1006,14 @@ public void handleButtonClicks(View currentButton) { } int buttonId = currentButton.getId(); - if (buttonId == R.id.button_cancel_camera || buttonId == R.id.button_finished_picture) { - onBackPressed(); - - } else if (buttonId == R.id.button_switch_camera) { + if (buttonId == R.id.button_switch_camera) { if (mCameraConfiguration.hasFrontCamera && mCameraConfiguration.numberOfCameras > 1) { currentButton.setEnabled(false); // don't let them press twice switchToCamera(!mCameraConfiguration.usingFrontCamera, false); } } else if (buttonId == R.id.button_toggle_flash) { + //noinspection StatementWithEmptyBody if (mCameraView != null) { String newFlashMode = mCameraView.toggleFlashMode(); SharedPreferences flashSettings = getSharedPreferences(MediaPhone.APPLICATION_NAME, Context.MODE_PRIVATE); @@ -1063,6 +1029,7 @@ public void handleButtonClicks(View currentButton) { handleRotateImageClick(currentButton); } else if (buttonId == R.id.button_take_picture) { + //noinspection StatementWithEmptyBody if (mCameraView != null) { currentButton.setEnabled(false); // don't let them press twice synchronized (mSavingInProgress) { @@ -1093,7 +1060,6 @@ public void handleButtonClicks(View currentButton) { final MediaItem imageMediaItem = MediaManager.findMediaByInternalId(getContentResolver(), mMediaItemInternalId); if (imageMediaItem != null && imageMediaItem.getFile().length() > 0) { mHasEditedMedia = true; // so we update/inherit on exit and show the media edited icon - setBackButtonIcons(CameraActivity.this, R.id.button_finished_picture, 0, true); boolean frameSpanning = toggleFrameSpanningMedia(imageMediaItem); updateSpanFramesButtonIcon(R.id.button_toggle_mode_picture, frameSpanning, true); UIUtilities.showToast(CameraActivity.this, @@ -1129,8 +1095,7 @@ private void handleRotateImageClick(View currentButton) { currentButton.setEnabled(false); // don't let them press twice int currentButtonId = currentButton.getId(); int otherButtonId = - currentButtonId == R.id.button_rotate_clockwise ? R.id.button_rotate_anticlockwise : - R.id.button_rotate_clockwise; + currentButtonId == R.id.button_rotate_clockwise ? R.id.button_rotate_anticlockwise : R.id.button_rotate_clockwise; findViewById(otherButtonId).setEnabled(false); // don't let them press the other button MediaItem imageMediaItem = MediaManager.findMediaByInternalId(getContentResolver(), mMediaItemInternalId); @@ -1261,10 +1226,6 @@ public void onDisplayOrientationChanged(int newScreenOrientationDegrees) { animateButtonRotation(res, animation, R.id.button_take_picture, R.drawable.ic_frame_image, mIconRotation); animateButtonRotation(res, animation, R.id.button_import_image, R.drawable.ic_menu_import_picture, mIconRotation); - if (findViewById(R.id.button_cancel_camera).getVisibility() == View.VISIBLE) { - animateButtonRotation(res, animation, R.id.button_cancel_camera, ac.robinson.mediautilities.R.drawable.ic_menu_back, mIconRotation); - } - if (findViewById(R.id.button_switch_camera).getVisibility() == View.VISIBLE) { animateButtonRotation(res, animation, R.id.button_switch_camera, R.drawable.ic_image_switch_camera, mIconRotation); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/FrameEditorActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/FrameEditorActivity.java index f1fcf9d0..7753a481 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/FrameEditorActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/FrameEditorActivity.java @@ -34,7 +34,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; -import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.TypedValue; @@ -109,9 +108,6 @@ protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mFrameInternalId = savedInstanceState.getString(getString(R.string.extra_internal_id)); mHasEditedMedia = savedInstanceState.getBoolean(getString(R.string.extra_media_edited)); - if (mHasEditedMedia) { - setBackButtonIcons(FrameEditorActivity.this, R.id.button_finished_editing, 0, true); - } } // load the frame elements themselves @@ -225,7 +221,7 @@ public boolean onPrepareOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(MenuItem item) { final int itemId = item.getItemId(); if (itemId == R.id.menu_previous_frame || itemId == R.id.menu_next_frame) { - switchFrames(mFrameInternalId, itemId, null, true); + switchFrames(mFrameInternalId, itemId, null); return true; } else if (itemId == R.id.menu_copy_media) { if (MediaManager.countMediaByParentId(getContentResolver(), mFrameInternalId, false) > 0) { @@ -296,7 +292,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } return true; - } else if (itemId == R.id.menu_back_without_editing || itemId == R.id.menu_finished_editing) { + } else if (itemId == R.id.menu_finished_editing) { onBackPressed(); return true; } @@ -311,16 +307,6 @@ protected void loadPreferences(SharedPreferences mediaPhoneSettings) { @Override protected void configureInterfacePreferences(SharedPreferences mediaPhoneSettings) { - // the soft done/back button - // TODO: remove this to fit with new styling (Toolbar etc) - int newVisibility = View.VISIBLE; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB || - !mediaPhoneSettings.getBoolean(getString(R.string.key_show_back_button), - getResources().getBoolean(R.bool.default_show_back_button))) { - newVisibility = View.GONE; - } - findViewById(R.id.button_finished_editing).setVisibility(newVisibility); - CenteredImageTextButton textButton = findViewById(R.id.button_add_text); if (mediaPhoneSettings.getBoolean(getString(R.string.key_custom_font), false)) { File customFontFile = new File(MediaPhone.DIRECTORY_THUMBS, getString(R.string.key_custom_font)); @@ -374,8 +360,7 @@ private void cleanupFrameMedia() { } else if (numFrames > 1 && nextFrameId != null) { // otherwise we need to delete our media from subsequent frames; always update the next frame's icon - ArrayList frameComponents = MediaManager.findMediaIdsByParentId(contentResolver, mFrameInternalId, - false); + ArrayList frameComponents = MediaManager.findMediaIdsByParentId(contentResolver, mFrameInternalId, false); inheritMediaAndDeleteItemLinks(nextFrameId, null, frameComponents); } } @@ -606,9 +591,8 @@ private void changeFrames(String newFrameId) { setIntent(launchingIntent); } - // assume they've edited (maybe not, but we can't get the result, so don't know) - refreshes action bar too + // assume they've edited (maybe not, but we can't get the result, so don't know) mHasEditedMedia = true; - setBackButtonIcons(FrameEditorActivity.this, R.id.button_finished_editing, 0, true); // load the new frame elements loadFrameElements(); @@ -618,7 +602,6 @@ private void changeFrames(String newFrameId) { private void setAndUpdateEditedMedia() { loadFrameElements(); mHasEditedMedia = true; - setBackButtonIcons(FrameEditorActivity.this, R.id.button_finished_editing, 0, true); } @Override @@ -637,12 +620,12 @@ protected void onBackgroundTaskCompleted(int taskId) { @Override protected boolean swipeNext() { - return switchFrames(mFrameInternalId, R.id.menu_next_frame, null, false); + return switchFrames(mFrameInternalId, R.id.menu_next_frame, null); } @Override protected boolean swipePrevious() { - return switchFrames(mFrameInternalId, R.id.menu_previous_frame, null, false); + return switchFrames(mFrameInternalId, R.id.menu_previous_frame, null); } private int getAudioIndex(int buttonId) { @@ -705,8 +688,7 @@ private void editAudio(String parentId, int selectedAudioIndex, boolean preventS mPermissionsItemClicked = parentId; mPermissionsSelectedAudioIndex = selectedAudioIndex; mPermissionsPreventSpanning = preventSpanning; - if (ActivityCompat.shouldShowRequestPermissionRationale(FrameEditorActivity.this, - Manifest.permission.RECORD_AUDIO)) { + if (ActivityCompat.shouldShowRequestPermissionRationale(FrameEditorActivity.this, Manifest.permission.RECORD_AUDIO)) { UIUtilities.showFormattedToast(FrameEditorActivity.this, R.string.permission_audio_rationale, getString(R.string.app_name)); } @@ -727,10 +709,7 @@ public void handleButtonClicks(View currentButton) { } final int buttonId = currentButton.getId(); - if (buttonId == R.id.button_finished_editing) { - onBackPressed(); - - } else if (buttonId == R.id.button_take_picture_video) { + if (buttonId == R.id.button_take_picture_video) { if (mImageInherited != null) { AlertDialog.Builder builder = new AlertDialog.Builder(FrameEditorActivity.this); builder.setTitle(R.string.span_media_edit_image_title); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/NarrativeBrowserActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/NarrativeBrowserActivity.java index c8ef93b1..4f36c35b 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/NarrativeBrowserActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/NarrativeBrowserActivity.java @@ -57,6 +57,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -110,7 +111,6 @@ public class NarrativeBrowserActivity extends BrowserActivity { private final Handler mScrollHandler = new ScrollHandler(); private int mScrollState = ScrollManager.SCROLL_STATE_IDLE; private boolean mPendingIconsUpdate; - private boolean mFingerUp = true; private PopupWindow mPopup; private boolean mPopupWillShow; private View mPopupPosition; @@ -165,8 +165,8 @@ public void onSaveInstanceState(Bundle savedInstanceState) { // save horizontal scroll positions HashMap scrollPositions = mNarrativeAdapter.getAdapterScrollPositions(); if (scrollPositions != null) { - for (String narrativeId : scrollPositions.keySet()) { - savedInstanceState.putInt(narrativeId, scrollPositions.get(narrativeId)); + for (Map.Entry entry : scrollPositions.entrySet()) { + savedInstanceState.putInt(entry.getKey(), entry.getValue()); } } } @@ -218,11 +218,6 @@ protected void onDestroy() { super.onDestroy(); } - @Override - public void onBackPressed() { - super.onBackPressed(); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.narrative_browser, menu); @@ -274,8 +269,7 @@ private void initialiseNarrativesView() { ((ViewGroup) mNarratives.getParent()).addView(emptyView); mNarratives.setEmptyView(emptyView); - // originally used to fix selection highlights when using hardware button to select - // now done by overriding isEnabled in NarrativeAdapter + // originally to fix selection highlights when using hardware button to select; now done via isEnabled in NarrativeAdapter // mNarratives.setFocusable(false); // mNarratives.setFocusableInTouchMode(false); @@ -323,6 +317,7 @@ public void onLoadFinished(Loader loader, Cursor cursor) { @Override public void onLoaderReset(@NonNull Loader loader) { + //noinspection resource // no need for try-with-resources on a null cursor mNarrativeAdapter.swapCursor(null); // data now unavailable for some reason - remove cursor } @@ -375,9 +370,8 @@ public void onScrollStateChanged(AbsListView view, int scrollState) { if (mScrollState == ScrollManager.SCROLL_STATE_FLING && scrollState != ScrollManager.SCROLL_STATE_FLING) { mPendingIconsUpdate = true; mScrollHandler.removeMessages(R.id.msg_update_narrative_icons); - final Message message = mScrollHandler.obtainMessage(R.id.msg_update_narrative_icons, NarrativeBrowserActivity - .this); - mScrollHandler.sendMessageDelayed(message, mFingerUp ? 0 : MediaPhone.ANIMATION_ICON_SHOW_DELAY); + Message message = mScrollHandler.obtainMessage(R.id.msg_update_narrative_icons, NarrativeBrowserActivity.this); + mScrollHandler.sendMessage(message); } else if (scrollState == ScrollManager.SCROLL_STATE_FLING) { mPendingIconsUpdate = false; mScrollHandler.removeMessages(R.id.msg_update_narrative_icons); @@ -547,8 +541,8 @@ private class FingerTracker implements View.OnTouchListener { // in layout - see: http://stackoverflow.com/questions/5938970/ public boolean onTouch(View view, MotionEvent event) { final int action = event.getAction(); - mFingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; - if (mFingerUp && mScrollState != ScrollManager.SCROLL_STATE_FLING) { + boolean fingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; + if (fingerUp && mScrollState != ScrollManager.SCROLL_STATE_FLING) { postUpdateNarrativeIcons(); } return false; @@ -587,6 +581,7 @@ public void onItemClick(AdapterView parent, View view, int position, long ins getAndSaveNarrativeId(parent); final FrameViewHolder holder = (FrameViewHolder) view.getTag(); if (FrameItem.LOADING_FRAME_ID.equals(holder.frameInternalId)) { + //noinspection UnnecessaryReturnStatement return; // don't allow clicking on the loading frame } else if (FrameItem.KEY_FRAME_ID_START.equals(holder.frameInternalId) || FrameItem.KEY_FRAME_ID_END.equals(holder.frameInternalId)) { @@ -819,6 +814,7 @@ public void run() { if (tempFile.exists()) { // we used to continue here to avoid resending failed imports, but since the import // process relies on FileObserver.CLOSE_WRITE, we now remove existing files and re-import + //noinspection ResultOfMethodCallIgnored // we don't mind if this fails tempFile.delete(); } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PlaybackActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PlaybackActivity.java index 1d8678d4..f9eed892 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PlaybackActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PlaybackActivity.java @@ -395,8 +395,8 @@ public void handleButtonClicks(View view) { if (mRecordIndicator != null) { Drawable progressDrawable = mRecordIndicator.getIndeterminateDrawable().mutate(); progressDrawable.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat( - ContextCompat.getColor(PlaybackActivity.this, ac.robinson.mediautilities.R.color.media_controller_recording), - BlendModeCompat.SRC_IN)); + ContextCompat.getColor(PlaybackActivity.this, + ac.robinson.mediautilities.R.color.media_controller_recording), BlendModeCompat.SRC_IN)); mRecordIndicator.setIndeterminateDrawable(progressDrawable); } @@ -575,8 +575,7 @@ private void setupUI() { UIUtilities.addFullscreenMarginsCorrectorListener(PlaybackActivity.this, R.id.playback_root, new UIUtilities.MarginCorrectorHolder[]{ new UIUtilities.MarginCorrectorHolder(R.id.playback_controls_wrapper), - new UIUtilities.MarginCorrectorHolder(R.id.playback_text_with_image, true, false, true, false, - textMargin, + new UIUtilities.MarginCorrectorHolder(R.id.playback_text_with_image, true, false, true, false, textMargin, textMargin, textMargin, textMargin), new UIUtilities.MarginCorrectorHolder(R.id.timing_editor_minimised) }); @@ -1092,12 +1091,13 @@ private void refreshPlayback(boolean timingModeSkipFrame) { if (!hasImage && hasAudio) { if (mAudioPictureBitmap == null) { try { - mAudioPictureBitmap = SVGParser.getSVGFromResource(getResources(), ac.robinson.mediautilities.R.raw.ic_audio_playback) - .getBitmap(mScreenSize.x, mScreenSize.y); + mAudioPictureBitmap = SVGParser.getSVGFromResource(getResources(), + ac.robinson.mediautilities.R.raw.ic_audio_playback).getBitmap(mScreenSize.x, mScreenSize.y); } catch (Throwable t) { // out of memory, or parse error... } } - mCurrentPlaybackImagePath = String.valueOf(ac.robinson.mediautilities.R.raw.ic_audio_playback); // now the current image + mCurrentPlaybackImagePath = String.valueOf( + ac.robinson.mediautilities.R.raw.ic_audio_playback); // now the current image mCurrentPlaybackImage.setImageBitmap(mAudioPictureBitmap); } } @@ -1214,6 +1214,7 @@ private boolean adjustMediaDurations(int direction) { "Updating subsequent media times (" + holder.mParentFrameId + "): " + holderStartTime + " to " + (holderStartTime - offset) + ", offset: " + offset); } + //noinspection ManualMinMaxCalculation if (holderStartTime - offset >= maximumFrameEndTime) { // TODO: we did try to give these frames a minimum duration here, but it ended up being too confusing in the // interface - for now we have a reset button to restore the original frame/media timings diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PreferencesActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PreferencesActivity.java index 5a33130a..76e59c01 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PreferencesActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/PreferencesActivity.java @@ -76,7 +76,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -118,10 +117,6 @@ public ActionBar getSupportActionBar() { return getDelegate().getSupportActionBar(); } - public void setSupportActionBar(@Nullable Toolbar toolbar) { - getDelegate().setSupportActionBar(toolbar); - } - @NonNull @Override public MenuInflater getMenuInflater() { @@ -275,8 +270,7 @@ private void setupPreferences() { } else { SharedPreferences mediaPhoneSettings = preference.getSharedPreferences(); File currentDirectory = null; - String selectedOutputDirectory = mediaPhoneSettings.getString(getString(R.string.key_export_directory), - null); + String selectedOutputDirectory = mediaPhoneSettings.getString(getString(R.string.key_export_directory), null); if (!TextUtils.isEmpty(selectedOutputDirectory)) { File outputFile = new File(selectedOutputDirectory); if (outputFile.exists()) { @@ -284,8 +278,8 @@ private void setupPreferences() { } } if (currentDirectory == null) { - currentDirectory = new File( - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + currentDirectory = + new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), getString(R.string.export_local_directory)); } @@ -462,8 +456,7 @@ private void setupPreferences() { aboutPreference.setTitle( getString(R.string.preferences_about_app_title, getString(R.string.app_name), info.versionName)); aboutPreference.setSummary( - getString(R.string.preferences_about_app_summary, info.versionCode, - dateFormat.format(BuildConfig.BUILD_TIME), + getString(R.string.preferences_about_app_summary, info.versionCode, dateFormat.format(BuildConfig.BUILD_TIME), DebugUtilities.getDeviceDebugSummary(getWindowManager(), getResources()))); } catch (Exception e) { PreferenceCategory aboutCategory = (PreferenceCategory) preferenceScreen.findPreference( @@ -618,8 +611,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent resultInten File fontCacheFile = new File(MediaPhone.DIRECTORY_THUMBS, getString(R.string.key_custom_font)); IOUtilities.copyFile(inputStream, fontCacheFile); if (fontCacheFile.length() > 0) { - fontPreference.setSummaryOn(getString(R.string.preferences_custom_font_summary_on, - fontFileName)); + fontPreference.setSummaryOn(getString(R.string.preferences_custom_font_summary_on, fontFileName)); SharedPreferences mediaPhoneSettings = PreferenceManager.getDefaultSharedPreferences( PreferencesActivity.this); @@ -680,8 +672,8 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { UIUtilities.showFormattedToast(PreferencesActivity.this, R.string.permission_storage_error, getString(R.string.app_name)); - CheckBoxPreference preference = (CheckBoxPreference) findPreference( - getString(R.string.key_pictures_to_media)); + CheckBoxPreference preference = + (CheckBoxPreference) findPreference(getString(R.string.key_pictures_to_media)); preference.setChecked(false); preference = (CheckBoxPreference) findPreference(getString(R.string.key_audio_to_media)); preference.setChecked(false); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/SaveNarrativeActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/SaveNarrativeActivity.java index 5d729714..7ee6228a 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/SaveNarrativeActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/SaveNarrativeActivity.java @@ -37,6 +37,7 @@ import android.text.InputFilter; import android.text.TextUtils; import android.view.Gravity; +import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.EditText; @@ -107,10 +108,12 @@ protected void onCreate(Bundle savedInstanceState) { } else if ("content".equals(fileScheme)) { try { Cursor cursor = getContentResolver().query(singleFile, null, null, null, null); - int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); - cursor.moveToFirst(); - mSelectedFileName = cursor.getString(nameIndex); - cursor.close(); + if (cursor != null) { + int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); + cursor.moveToFirst(); + mSelectedFileName = cursor.getString(nameIndex); + cursor.close(); + } } catch (Exception ignored) { } } @@ -145,9 +148,9 @@ protected void loadPreferences(SharedPreferences mediaPhoneSettings) { String selectedOutputDirectory = mediaPhoneSettings.getString(settingsKey, null); if (!TextUtils.isEmpty(selectedOutputDirectory)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - DocumentFile pickedDir = DocumentFile.fromTreeUri(SaveNarrativeActivity.this, - Uri.parse(selectedOutputDirectory)); + DocumentFile pickedDir = DocumentFile.fromTreeUri(SaveNarrativeActivity.this, Uri.parse(selectedOutputDirectory)); // note: pickedDir is not actually nullable as Q is >= 21 (see null return in DocumentFile.fromTreeUri) + //noinspection DataFlowIssue if (pickedDir.exists() && pickedDir.isDirectory() && pickedDir.canWrite()) { mOutputUri = pickedDir.getUri(); mUsingDefaultOutputDirectory = false; @@ -241,7 +244,10 @@ private void displayFileNameDialog(int errorMessage) { final AlertDialog createdDialog = nameDialog.create(); createdDialog.setCanceledOnTouchOutside(false); // so we don't leave the activity in the background by mistake - createdDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + Window dialogWindow = createdDialog.getWindow(); + if (dialogWindow != null) { + dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } fileInput.setOnEditorActionListener((v, actionId, event) -> { if (actionId == EditorInfo.IME_ACTION_DONE) { @@ -377,7 +383,12 @@ public void run() { movieCursor.close(); } } else { - File mediaFile = new File(mediaUri.getPath()); + String mediaUriPath = mediaUri.getPath(); + if (mediaUriPath == null) { + failure = true; + break; + } + File mediaFile = new File(mediaUriPath); String fileName = chosenName == null ? mediaFile.getName() : chosenName + "." + IOUtilities.getFileExtension(mediaFile.getName()); @@ -391,8 +402,7 @@ public void run() { mTaskResult = R.id.export_save_sd_file_exists; return; } - DocumentFile file = outputDocumentFile.createFile(getString(R.string.export_mime_type), - fileName); + DocumentFile file = outputDocumentFile.createFile(getString(R.string.export_mime_type), fileName); outputUri = file.getUri(); } else { ContentValues contentValues = new ContentValues(); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TemplateBrowserActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TemplateBrowserActivity.java index de0bba4d..95ed5e3b 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TemplateBrowserActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TemplateBrowserActivity.java @@ -25,7 +25,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -71,7 +70,6 @@ public class TemplateBrowserActivity extends BrowserActivity { private final Handler mScrollHandler = new ScrollHandler(); private int mScrollState = ScrollManager.SCROLL_STATE_IDLE; private boolean mPendingIconsUpdate; - private boolean mFingerUp = true; private View mFrameAdapterEmptyView = null; @@ -156,19 +154,11 @@ protected void loadPreferences(SharedPreferences mediaPhoneSettings) { @Override protected void configureInterfacePreferences(SharedPreferences mediaPhoneSettings) { - // the soft back button (necessary in some circumstances) - // TODO: remove this to fit with new styling (Toolbar etc) - int newVisibility = View.VISIBLE; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB || - !mediaPhoneSettings.getBoolean(getString(R.string.key_show_back_button), - getResources().getBoolean(R.bool.default_show_back_button))) { - newVisibility = View.GONE; - } - findViewById(R.id.button_finished_templates).setVisibility(newVisibility); + // nothing to do } private void initialiseTemplatesView() { - mTemplates = (NarrativesListView) findViewById(R.id.list_templates); + mTemplates = findViewById(R.id.list_templates); // initial empty list placeholder - add manually as the < v11 version includes the header row TextView emptyView = new TextView(TemplateBrowserActivity.this); @@ -212,6 +202,7 @@ public void onLoadFinished(Loader loader, Cursor cursor) { @Override public void onLoaderReset(@NonNull Loader loader) { + //noinspection resource // no need for try-with-resources on a null cursor mTemplateAdapter.swapCursor(null); // data now unavailable for some reason - remove cursor } @@ -256,8 +247,7 @@ public void onScrollStateChanged(AbsListView view, int scrollState) { mPendingIconsUpdate = true; final Handler handler = mScrollHandler; handler.removeMessages(R.id.msg_update_template_icons); - final Message message = handler.obtainMessage(R.id.msg_update_template_icons, TemplateBrowserActivity.this); - handler.sendMessageDelayed(message, mFingerUp ? 0 : MediaPhone.ANIMATION_ICON_SHOW_DELAY); + handler.sendMessage(handler.obtainMessage(R.id.msg_update_template_icons, TemplateBrowserActivity.this)); } else if (scrollState == ScrollManager.SCROLL_STATE_FLING) { mPendingIconsUpdate = false; mScrollHandler.removeMessages(R.id.msg_update_template_icons); @@ -300,15 +290,14 @@ private void postUpdateTemplateIcons() { mPendingIconsUpdate = true; Handler handler = mScrollHandler; handler.removeMessages(R.id.msg_update_template_icons); - Message message = handler.obtainMessage(R.id.msg_update_template_icons, TemplateBrowserActivity.this); - handler.sendMessage(message); + handler.sendMessage(handler.obtainMessage(R.id.msg_update_template_icons, TemplateBrowserActivity.this)); } private class FingerTracker implements View.OnTouchListener { public boolean onTouch(View view, MotionEvent event) { final int action = event.getAction(); - mFingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; - if (mFingerUp && mScrollState != ScrollManager.SCROLL_STATE_FLING) { + boolean fingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; + if (fingerUp && mScrollState != ScrollManager.SCROLL_STATE_FLING) { postUpdateTemplateIcons(); } return false; @@ -345,8 +334,8 @@ private class FrameClickListener implements AdapterView.OnItemClickListener { public void onItemClick(AdapterView parent, View view, int position, long id) { // sometimes we get the event without the view (they released at the last minute?) if (view != null && parent != null) { - runQueuedBackgroundTask(getNarrativeTemplateRunnable( - ((FrameAdapter) ((HorizontalListView) parent).getAdapter()).getParentFilter(), false)); + FrameAdapter parentAdapter = (FrameAdapter) ((HorizontalListView) parent).getAdapter(); + runQueuedBackgroundTask(getNarrativeTemplateRunnable(parentAdapter.getParentFilter(), false)); } } } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TextActivity.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TextActivity.java index a3182826..795dde24 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TextActivity.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/activity/TextActivity.java @@ -26,7 +26,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Typeface; -import android.os.Build; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; @@ -80,9 +79,6 @@ protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mMediaItemInternalId = savedInstanceState.getString(getString(R.string.extra_internal_id)); mHasEditedMedia = savedInstanceState.getBoolean(getString(R.string.extra_media_edited)); - if (mHasEditedMedia) { - setBackButtonIcons(TextActivity.this, R.id.button_finished_text, 0, true); - } } // load the media itself @@ -113,10 +109,6 @@ protected void onPause() { private final TextWatcher mTextWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - if (!mHasEditedMedia) { - mHasEditedMedia = true; // so we keep the same icon on rotation - setBackButtonIcons(TextActivity.this, R.id.button_finished_text, 0, true); - } mHasEditedMedia = true; } @@ -208,7 +200,7 @@ public boolean dispatchKeyEvent(KeyEvent event) { @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); - createMediaMenuNavigationButtons(inflater, menu, mHasEditedMedia); + createMediaMenuNavigationButtons(inflater, menu); return super.onCreateOptionsMenu(menu); } @@ -259,7 +251,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } return true; - } else if (itemId == R.id.menu_back_without_editing || itemId == R.id.menu_finished_editing) { + } else if (itemId == R.id.menu_finished_editing) { onBackPressed(); return true; } @@ -274,16 +266,6 @@ protected void loadPreferences(SharedPreferences mediaPhoneSettings) { @Override protected void configureInterfacePreferences(SharedPreferences mediaPhoneSettings) { - // the soft done/back button - // TODO: remove this to fit with new styling (Toolbar etc) - int newVisibility = View.VISIBLE; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB || - !mediaPhoneSettings.getBoolean(getString(R.string.key_show_back_button), - getResources().getBoolean(R.bool.default_show_back_button))) { - newVisibility = View.GONE; - } - findViewById(R.id.button_finished_text).setVisibility(newVisibility); - // to enable or disable spanning, all we do is show/hide the interface - eg., items that already span will not be removed findViewById(R.id.button_toggle_mode_text).setVisibility( mediaPhoneSettings.getBoolean(getString(R.string.key_spanning_media), @@ -362,17 +344,13 @@ public void handleButtonClicks(View currentButton) { } int buttonId = currentButton.getId(); - if (buttonId == R.id.button_finished_text) { - onBackPressed(); - - } else if (buttonId == R.id.button_toggle_mode_text) { + if (buttonId == R.id.button_toggle_mode_text) { // TODO: only relevant for text, but if the user updates text, sets spanning, then updates text again we end up // updating all following frame icons twice, which is unnecessary. Could track whether they've entered text after // toggling frame spanning, but this may be overkill for a situation that rarely happens? final MediaItem textMediaItem = MediaManager.findMediaByInternalId(getContentResolver(), mMediaItemInternalId); if (textMediaItem != null && !TextUtils.isEmpty(mEditText.getText())) { mHasEditedMedia = true; // so we update/inherit on exit and show the media edited icon - setBackButtonIcons(TextActivity.this, R.id.button_finished_text, 0, true); boolean frameSpanning = toggleFrameSpanningMedia(textMediaItem); updateSpanFramesButtonIcon(R.id.button_toggle_mode_text, frameSpanning, true); UIUtilities.showToast(TextActivity.this, diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/importing/BluetoothObserver.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/importing/BluetoothObserver.java index 810391cb..a5da0958 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/importing/BluetoothObserver.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/importing/BluetoothObserver.java @@ -70,8 +70,8 @@ public class BluetoothObserver extends FileObserver { */ public BluetoothObserver(String path, int mask, Handler handler) { // path *MUST* end with '/' - super((path.endsWith(File.separator) ? path : path + File.separator), FileObserver.CLOSE_WRITE); - mBluetoothDirectoryPath = (path.endsWith(File.separator) ? path : path + File.separator); + super(ensureTrailingSeparator(path), FileObserver.CLOSE_WRITE); + mBluetoothDirectoryPath = ensureTrailingSeparator(path); mHandler = handler; } @@ -82,6 +82,10 @@ public BluetoothObserver(String path, Handler handler) { this(path, FileObserver.ALL_EVENTS, handler); } + private static String ensureTrailingSeparator(String path) { + return path.endsWith(File.separator) ? path : path + File.separator; + } + private void sendMessage(int messageId, String storyFilePath) { Message msg = mHandler.obtainMessage(messageId); Bundle bundle = new Bundle(); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameAdapter.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameAdapter.java index f691d8d3..0bbef2ba 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameAdapter.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameAdapter.java @@ -70,8 +70,9 @@ public class FrameAdapter extends CursorAdapter implements FilterQueryProvider { private boolean mSelectAllFramesAsOne = false; public FrameAdapter(BrowserActivity activity, String parentId) { - super(activity, activity.managedQuery(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ROW_AND_INTERNAL_ID, "1=?", - new String[]{ "0" },null), true); // hack to show no data initially + super(activity, + activity.managedQuery(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ROW_AND_INTERNAL_ID, "1=?", new String[]{ "0" }, + null), true); // hack to show no data initially mActivity = activity; mInflater = LayoutInflater.from(activity); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameItem.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameItem.java index 4506a29b..312c44a2 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameItem.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FrameItem.java @@ -32,7 +32,6 @@ import android.graphics.RectF; import android.graphics.Typeface; import android.net.Uri; -import android.os.Build; import android.provider.BaseColumns; import android.util.TypedValue; @@ -190,15 +189,6 @@ public static String getImageContentId(ContentResolver contentResolver, String p return null; } - /** - * Equivalent to loadIcon(resources, contentResolver, null, true); - * - * @return The icon, or null if there is no media content in this frame - */ - public Bitmap loadIcon(Resources resources, ContentResolver contentResolver) { - return loadIcon(resources, contentResolver, null, true); - } - /** * @param frameIsInDatabase whether the frame has already been added to database * @return The icon, or null if there is no media content in this frame @@ -257,8 +247,7 @@ public Bitmap loadIcon(Resources res, ContentResolver contentResolver, BitmapUti // make sure we always have an icon, regardless of media if (frameBitmap == null) { - frameBitmap = Bitmap.createBitmap(iconWidth, iconHeight, - ImageCacheUtilities.mBitmapFactoryOptions.inPreferredConfig); + frameBitmap = Bitmap.createBitmap(iconWidth, iconHeight, ImageCacheUtilities.mBitmapFactoryOptions.inPreferredConfig); frameBitmap.eraseColor(res.getColor(R.color.frame_icon_background)); } TypedValue resourceValue = new TypedValue(); @@ -302,8 +291,7 @@ public Bitmap loadIcon(Resources res, ContentResolver contentResolver, BitmapUti textTypeface = Typeface.createFromFile(customFontFile); } BitmapUtilities.drawScaledText(textString, frameBitmapCanvas, frameBitmapPaint, textColour, textBackgroundColour, - textPadding, textCornerRadius, imageLoaded, leftOffset, - Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB, maxTextHeight, + textPadding, textCornerRadius, imageLoaded, leftOffset, true, maxTextHeight, res.getDimensionPixelSize(R.dimen.frame_icon_maximum_text_size), textTypeface); // add border if there's no image (looks much tidier) @@ -430,10 +418,9 @@ public static NavigationMode getNavigationAllowed(ContentResolver contentResolve } else { return NavigationMode.PREVIOUS; } - } else if (i < framesSize) { + } else { return NavigationMode.NEXT; } - break; } i += 1; } @@ -479,7 +466,7 @@ public static FrameItem fromCursor(Cursor c) { @NonNull @Override public String toString() { - return this.getClass().getName() + "[" + mInternalId + "," + mParentId + "," + mNarrativeSequenceId + "," + - mCreationDate + "," + mDeleted + "]"; + return this.getClass().getName() + "[" + mInternalId + "," + mParentId + "," + mNarrativeSequenceId + "," + mCreationDate + + "," + mDeleted + "]"; } } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FramesManager.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FramesManager.java index af60336f..b710f341 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FramesManager.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/FramesManager.java @@ -141,8 +141,7 @@ public static boolean updateFrame(ContentResolver contentResolver, FrameItem fra return updateFrame(null, contentResolver, frame, false); } - public static boolean updateFrame(Resources resources, ContentResolver contentResolver, FrameItem frame, - boolean reloadIcon) { + public static boolean updateFrame(Resources resources, ContentResolver contentResolver, FrameItem frame, boolean reloadIcon) { final String[] arguments1 = mArguments1; arguments1[0] = frame.getInternalId(); int count = contentResolver.update(FrameItem.CONTENT_URI, frame.getContentValues(), mFrameInternalIdSelection, @@ -164,17 +163,11 @@ public static FrameItem findFrameByInternalId(ContentResolver contentResolver, S } private static FrameItem findFrame(ContentResolver contentResolver, String clause, String[] arguments) { - Cursor c = null; - try { + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ALL, clause, arguments, null)) { // could add sort order here, but we assume no duplicates... - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ALL, clause, arguments, null); if (c != null && c.moveToFirst()) { return FrameItem.fromCursor(c); } - } finally { - if (c != null) { - c.close(); - } } return null; } @@ -183,20 +176,15 @@ public static ArrayList findFramesByParentId(ContentResolver contentR final String[] arguments1 = mArguments1; arguments1[0] = parentId; final ArrayList frames = new ArrayList<>(); - Cursor c = null; - try { - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ALL, mFrameParentIdSelection, arguments1, - FrameItem.DEFAULT_SORT_ORDER); + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ALL, mFrameParentIdSelection, + arguments1, + FrameItem.DEFAULT_SORT_ORDER)) { if (c != null && c.getCount() > 0) { while (c.moveToNext()) { final FrameItem frame = FrameItem.fromCursor(c); frames.add(frame); } } - } finally { - if (c != null) { - c.close(); - } } return frames; @@ -207,11 +195,8 @@ public static ArrayList findFrameIdsByParentId(ContentResolver contentRe arguments = mArguments1; arguments[0] = parentId; final ArrayList frameIds = new ArrayList<>(); - Cursor c = null; - try { - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mFrameParentIdSelection, - arguments, - FrameItem.DEFAULT_SORT_ORDER); + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mFrameParentIdSelection, + arguments, FrameItem.DEFAULT_SORT_ORDER)) { if (c != null && c.getCount() > 0) { final int columnIndex = c.getColumnIndexOrThrow(FrameItem.INTERNAL_ID); while (c.moveToNext()) { @@ -219,10 +204,6 @@ public static ArrayList findFrameIdsByParentId(ContentResolver contentRe frameIds.add(index); } } - } finally { - if (c != null) { - c.close(); - } } return frameIds; @@ -231,17 +212,12 @@ public static ArrayList findFrameIdsByParentId(ContentResolver contentRe public static FrameItem findFirstFrameByParentId(ContentResolver contentResolver, String parentId) { final String[] arguments1 = mArguments1; arguments1[0] = parentId; - Cursor c = null; - try { - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ALL, mFrameParentIdSelection, arguments1, - FrameItem.DEFAULT_SORT_ORDER); + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_ALL, mFrameParentIdSelection, + arguments1, + FrameItem.DEFAULT_SORT_ORDER)) { if (c != null && c.moveToFirst()) { return FrameItem.fromCursor(c); } - } finally { - if (c != null) { - c.close(); - } } return null; } @@ -249,18 +225,12 @@ public static FrameItem findFirstFrameByParentId(ContentResolver contentResolver public static String findLastFrameByParentId(ContentResolver contentResolver, String parentId) { final String[] arguments1 = mArguments1; arguments1[0] = parentId; - Cursor c = null; - try { - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mFrameParentIdSelection, - arguments1, FrameItem.DEFAULT_SORT_ORDER); + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mFrameParentIdSelection, + arguments1, FrameItem.DEFAULT_SORT_ORDER)) { if (c != null && c.moveToLast()) { // for speed, don't get the whole FrameItem return c.getString(c.getColumnIndexOrThrow(FrameItem.INTERNAL_ID)); } - } finally { - if (c != null) { - c.close(); - } } return null; // no existing frames (but should not happen) } @@ -268,26 +238,19 @@ public static String findLastFrameByParentId(ContentResolver contentResolver, St public static int countFramesByParentId(ContentResolver contentResolver, String parentId) { final String[] arguments1 = mArguments1; arguments1[0] = parentId; - Cursor c = null; - try { - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mFrameParentIdSelection, - arguments1, FrameItem.DEFAULT_SORT_ORDER); + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mFrameParentIdSelection, + arguments1, FrameItem.DEFAULT_SORT_ORDER)) { if (c != null) { return c.getCount(); } - } finally { - if (c != null) { - c.close(); - } } return 0; } public static ArrayList findDeletedFrames(ContentResolver contentResolver) { final ArrayList frameIds = new ArrayList<>(); - Cursor c = null; - try { - c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mDeletedSelection, null, null); + try (Cursor c = contentResolver.query(FrameItem.CONTENT_URI, FrameItem.PROJECTION_INTERNAL_ID, mDeletedSelection, null, + null)) { assert c != null; if (c.getCount() > 0) { final int columnIndex = c.getColumnIndexOrThrow(FrameItem.INTERNAL_ID); @@ -295,10 +258,6 @@ public static ArrayList findDeletedFrames(ContentResolver contentResolve frameIds.add(c.getString(columnIndex)); } } - } finally { - if (c != null) { - c.close(); - } } return frameIds; } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaItem.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaItem.java index 8710d69b..b1a3c82c 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaItem.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaItem.java @@ -102,14 +102,6 @@ public String getParentId() { return mParentId; } - public void setParentId(String parentId) { - mParentId = parentId; - } - - public long getCreationDate() { - return mCreationDate; - } - public String getFileExtension() { return mFileExtension; } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaManager.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaManager.java index ea65cc08..92ee97e6 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaManager.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaManager.java @@ -122,8 +122,7 @@ public static int deleteMediaLinks(ContentResolver contentResolver, String media arguments1[0] = mediaId; final ContentValues contentValues = new ContentValues(); contentValues.put(MediaItem.DELETED, 1); - return contentResolver.update(MediaItem.CONTENT_URI_LINK, contentValues, mMediaInternalIdNotDeletedSelection, - arguments1); + return contentResolver.update(MediaItem.CONTENT_URI_LINK, contentValues, mMediaInternalIdNotDeletedSelection, arguments1); } /** @@ -179,18 +178,12 @@ public static MediaItem findMediaByInternalId(ContentResolver contentResolver, S } private static MediaItem findMedia(ContentResolver contentResolver, String clause, String[] arguments) { - Cursor c = null; - try { + try (Cursor c = contentResolver.query(MediaItem.CONTENT_URI, MediaItem.PROJECTION_ALL, clause, arguments, + MediaItem.DEFAULT_SORT_ORDER)) { // could add sort order here, but we assume no duplicates... - c = contentResolver.query(MediaItem.CONTENT_URI, MediaItem.PROJECTION_ALL, clause, arguments, - MediaItem.DEFAULT_SORT_ORDER); if (c != null && c.moveToFirst()) { return MediaItem.fromCursor(c); } - } finally { - if (c != null) { - c.close(); - } } return null; } @@ -221,10 +214,8 @@ public static ArrayList findLinkedParentIdsByMediaId(ContentResolver con final ArrayList parentIds = new ArrayList<>(); final String[] arguments1 = mArguments1; arguments1[0] = mediaId; - Cursor c = null; - try { - c = contentResolver.query(MediaItem.CONTENT_URI_LINK, MediaItem.PROJECTION_PARENT_ID, - mMediaInternalIdNotDeletedSelection, arguments1, null); + try (Cursor c = contentResolver.query(MediaItem.CONTENT_URI_LINK, MediaItem.PROJECTION_PARENT_ID, + mMediaInternalIdNotDeletedSelection, arguments1, null)) { if (c != null && c.getCount() > 0) { final int columnIndex = c.getColumnIndexOrThrow(MediaItem.PARENT_ID); @@ -233,10 +224,6 @@ public static ArrayList findLinkedParentIdsByMediaId(ContentResolver con parentIds.add(linkId); } } - } finally { - if (c != null) { - c.close(); - } } return parentIds; } @@ -247,17 +234,11 @@ public static ArrayList findLinkedParentIdsByMediaId(ContentResolver con public static int countLinkedParentIdsByMediaId(ContentResolver contentResolver, String mediaId) { final String[] arguments1 = mArguments1; arguments1[0] = mediaId; - Cursor c = null; - try { - c = contentResolver.query(MediaItem.CONTENT_URI_LINK, MediaItem.PROJECTION_PARENT_ID, - mMediaInternalIdNotDeletedSelection, arguments1, null); + try (Cursor c = contentResolver.query(MediaItem.CONTENT_URI_LINK, MediaItem.PROJECTION_PARENT_ID, + mMediaInternalIdNotDeletedSelection, arguments1, null)) { if (c != null) { return c.getCount(); } - } finally { - if (c != null) { - c.close(); - } } return 0; } @@ -269,10 +250,8 @@ public static ArrayList findLinkedMediaIdsByParentId(ContentResolver con final ArrayList subIds = new ArrayList<>(); final String[] arguments1 = mArguments1; arguments1[0] = parentId; - Cursor c = null; - try { - c = contentResolver.query(MediaItem.CONTENT_URI_LINK, MediaItem.PROJECTION_INTERNAL_ID, mMediaParentIdSelection, - arguments1, null); + try (Cursor c = contentResolver.query(MediaItem.CONTENT_URI_LINK, MediaItem.PROJECTION_INTERNAL_ID, + mMediaParentIdSelection, arguments1, null)) { if (c != null && c.getCount() > 0) { final int columnIndex = c.getColumnIndexOrThrow(MediaItem.INTERNAL_ID); @@ -281,10 +260,6 @@ public static ArrayList findLinkedMediaIdsByParentId(ContentResolver con subIds.add(linkId); } } - } finally { - if (c != null) { - c.close(); - } } return subIds; } @@ -349,10 +324,6 @@ public static ArrayList findMediaByParentId(ContentResolver contentRe return medias; } - public static ArrayList findMediaIdsByParentId(ContentResolver contentResolver, String parentId) { - return findMediaIdsByParentId(contentResolver, parentId, true); - } - public static ArrayList findMediaIdsByParentId(ContentResolver contentResolver, String parentId, boolean includeLinks) { final ArrayList mediaIds = new ArrayList<>(); @@ -418,19 +389,13 @@ public static ArrayList findDeletedMediaLinks(ContentResolver contentRes private static ArrayList findDeletedMedia(ContentResolver contentResolver, Uri contentUri) { final ArrayList mediaIds = new ArrayList<>(); - Cursor c = null; - try { - c = contentResolver.query(contentUri, MediaItem.PROJECTION_INTERNAL_ID, mDeletedSelection, null, null); + try (Cursor c = contentResolver.query(contentUri, MediaItem.PROJECTION_INTERNAL_ID, mDeletedSelection, null, null)) { if (c != null && c.getCount() > 0) { final int columnIndex = c.getColumnIndexOrThrow(MediaItem.INTERNAL_ID); while (c.moveToNext()) { mediaIds.add(c.getString(columnIndex)); } } - } finally { - if (c != null) { - c.close(); - } } return mediaIds; } @@ -438,19 +403,13 @@ private static ArrayList findDeletedMedia(ContentResolver contentResolve // currently only used for upgrade to version 38+ public static ArrayList findAllTextMedia(ContentResolver contentResolver) { final ArrayList medias = new ArrayList<>(); - Cursor c = null; - try { - c = contentResolver.query(MediaItem.CONTENT_URI, MediaItem.PROJECTION_ALL, mTextTypeSelection, null, null); + try (Cursor c = contentResolver.query(MediaItem.CONTENT_URI, MediaItem.PROJECTION_ALL, mTextTypeSelection, null, null)) { if (c != null && c.getCount() > 0) { while (c.moveToNext()) { final MediaItem media = MediaItem.fromCursor(c); medias.add(media); } } - } finally { - if (c != null) { - c.close(); - } } return medias; } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaPhoneProvider.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaPhoneProvider.java index ce58673c..1270ee28 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaPhoneProvider.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/MediaPhoneProvider.java @@ -125,8 +125,8 @@ public Cursor query(@NonNull Uri uri, String[] projection, String selection, Str public String getType(@NonNull Uri uri) { int match = URI_MATCHER.match(uri); - if (match == R.id.uri_narratives || match == R.id.uri_frames || match == R.id.uri_media || - match == R.id.uri_media_links || match == R.id.uri_templates) { + if (match == R.id.uri_narratives || match == R.id.uri_frames || match == R.id.uri_media || match == R.id.uri_media_links || + match == R.id.uri_templates) { return "vnd.android.cursor.dir/vnd." + URI_PACKAGE; // do these need to be unique? } throw new IllegalArgumentException("Unknown URI " + uri); @@ -248,9 +248,8 @@ public void onCreate(SQLiteDatabase db) { + NarrativeItem.SEQUENCE_ID + " INTEGER, " // the displayed ID of this narrative item + NarrativeItem.DATE_CREATED + " INTEGER, " // the timestamp when this narrative was created + NarrativeItem.DELETED + " INTEGER);"); // whether this narrative has been deleted - db.execSQL( - "CREATE INDEX " + NARRATIVES_LOCATION + "Index" + NarrativeItem.INTERNAL_ID + " ON " + NARRATIVES_LOCATION + - "(" + NarrativeItem.INTERNAL_ID + ");"); + db.execSQL("CREATE INDEX " + NARRATIVES_LOCATION + "Index" + NarrativeItem.INTERNAL_ID + " ON " + NARRATIVES_LOCATION + + "(" + NarrativeItem.INTERNAL_ID + ");"); db.execSQL("CREATE TABLE " + FRAMES_LOCATION + " (" + FrameItem._ID + " INTEGER PRIMARY KEY, " // required for Android Adapters @@ -314,16 +313,10 @@ private void createMediaLinksTable(SQLiteDatabase db) { } private void fixVersion1To3UpgradeBug(SQLiteDatabase db) { - Cursor c = null; - try { - c = db.rawQuery("SELECT * FROM " + MEDIA_LOCATION + " LIMIT 0,1", null); + try (Cursor c = db.rawQuery("SELECT * FROM " + MEDIA_LOCATION + " LIMIT 0,1", null)) { if (c.getColumnIndex(MediaItem.SPAN_FRAMES) < 0) { db.execSQL("ALTER TABLE " + MEDIA_LOCATION + " ADD COLUMN " + MediaItem.SPAN_FRAMES + " INTEGER;"); } - } finally { - if (c != null) { - c.close(); - } } createMediaLinksTable(db); } @@ -335,24 +328,18 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO: backup database if necessary (also: check for read only database?) // must always check whether the items we're upgrading already exist, just in case a downgrade has occurred - Cursor c = null; if (oldVersion < 2) { // version 2 added spanning media fixVersion1To3UpgradeBug(db); } if (oldVersion < 3) { // version 3 added an extra media metadata field to separate text duration from word count - try { - c = db.rawQuery("SELECT * FROM " + MEDIA_LOCATION + " LIMIT 0,1", null); + try (Cursor c = db.rawQuery("SELECT * FROM " + MEDIA_LOCATION + " LIMIT 0,1", null)) { if (c.getColumnIndex(MediaItem.EXTRA) < 0) { db.execSQL("ALTER TABLE " + MEDIA_LOCATION + " ADD COLUMN " + MediaItem.EXTRA + " INTEGER;"); db.execSQL( "UPDATE " + MEDIA_LOCATION + " SET " + MediaItem.DURATION + " = -1 WHERE " + MediaItem.DURATION + " < 0 AND " + MediaItem.TYPE + " = " + TYPE_TEXT + ";"); } - } finally { - if (c != null) { - c.close(); - } } } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeAdapter.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeAdapter.java index 8b7eb76c..e2d2ef7a 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeAdapter.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeAdapter.java @@ -52,8 +52,7 @@ public class NarrativeAdapter extends CursorAdapter { // must *not* be static - will leak on destroy otherwise... private final HashMap mFrameAdapters = new HashMap<>(); - public NarrativeAdapter(BrowserActivity activity, boolean showKeyFrames, boolean startScrolledToEnd, - boolean isTemplateView) { + public NarrativeAdapter(BrowserActivity activity, boolean showKeyFrames, boolean startScrolledToEnd, boolean isTemplateView) { super(activity, null, 0); // null cursor and no auto querying - we use a loader to manage cursors mActivity = activity; @@ -126,14 +125,6 @@ public void bindView(View view, Context context, Cursor cursor) { holder.narrativeSequenceId)); } - public HashMap getFrameAdapters() { - return mFrameAdapters; - } - - public FrameAdapter getEmptyAdapter() { - return mEmptyAdapter; - } - public void attachAdapter(HorizontalListView frameList, NarrativeViewHolder holder) { // TODO: soft references to the activity? delete on destroy? FrameAdapter viewAdapter = mFrameAdapters.get(holder.narrativeInternalId); diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeItem.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeItem.java index bc569b0e..094ff215 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeItem.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativeItem.java @@ -107,10 +107,6 @@ public int getSequenceId() { return mSequenceId; } - public void setSequenceId(int sequenceId) { - mSequenceId = sequenceId; - } - public boolean getDeleted() { return mDeleted != 0; } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativesManager.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativesManager.java index 5c578411..fee88c7d 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativesManager.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/NarrativesManager.java @@ -127,17 +127,11 @@ private static NarrativeItem findItemByInternalId(Uri contentType, ContentResolv } private static NarrativeItem findItem(Uri contentType, ContentResolver contentResolver, String clause, String[] arguments) { - Cursor c = null; - try { + try (Cursor c = contentResolver.query(contentType, NarrativeItem.PROJECTION_ALL, clause, arguments, null)) { // could add sort order here, but we assume no duplicates... - c = contentResolver.query(contentType, NarrativeItem.PROJECTION_ALL, clause, arguments, null); if (c != null && c.moveToFirst()) { return NarrativeItem.fromCursor(c); } - } finally { - if (c != null) { - c.close(); - } } return null; } @@ -151,16 +145,11 @@ public static int getNarrativesCount(ContentResolver contentResolver) { } private static int getCount(Uri contentType, ContentResolver contentResolver) { - Cursor c = null; - try { - c = contentResolver.query(contentType, NarrativeItem.PROJECTION_INTERNAL_ID, mNotDeletedSelection, null, null); + try (Cursor c = contentResolver.query(contentType, NarrativeItem.PROJECTION_INTERNAL_ID, mNotDeletedSelection, null, + null)) { if (c != null) { return c.getCount(); } - } finally { - if (c != null) { - c.close(); - } } return 0; } @@ -174,16 +163,11 @@ public static int getNextNarrativeExternalId(ContentResolver contentResolver) { } private static int getNextExternalId(Uri contentType, ContentResolver contentResolver) { - Cursor c = null; - try { - c = contentResolver.query(contentType, NarrativeItem.PROJECTION_NEXT_EXTERNAL_ID, mNotDeletedSelection, null, null); + try (Cursor c = contentResolver.query(contentType, NarrativeItem.PROJECTION_NEXT_EXTERNAL_ID, mNotDeletedSelection, null, + null)) { if (c != null && c.moveToFirst()) { return c.getInt(c.getColumnIndexOrThrow(NarrativeItem.MAX_ID)) + 1; } - } finally { - if (c != null) { - c.close(); - } } return 0; } @@ -198,19 +182,13 @@ public static ArrayList findDeletedTemplates(ContentResolver contentReso private static ArrayList findDeletedItems(Uri contentType, ContentResolver contentResolver) { final ArrayList narrativeIds = new ArrayList<>(); - Cursor c = null; - try { - c = contentResolver.query(contentType, NarrativeItem.PROJECTION_INTERNAL_ID, mDeletedSelection, null, null); + try (Cursor c = contentResolver.query(contentType, NarrativeItem.PROJECTION_INTERNAL_ID, mDeletedSelection, null, null)) { if (c != null && c.getCount() > 0) { final int columnIndex = c.getColumnIndexOrThrow(NarrativeItem.INTERNAL_ID); while (c.moveToNext()) { narrativeIds.add(c.getString(columnIndex)); } } - } finally { - if (c != null) { - c.close(); - } } return narrativeIds; } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/UpgradeManager.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/UpgradeManager.java index a5c83dd1..482f2f7b 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/UpgradeManager.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/provider/UpgradeManager.java @@ -104,7 +104,7 @@ public static void upgradeApplication(Context context) { float newValue = 2.5f; // 2.5 is the default frame duration in v16 (saves reading TypedValue from prefs) String preferenceKey = "minimum_frame_duration"; // the old value of the frame duration key try { - newValue = Float.valueOf(mediaPhoneSettings.getString(preferenceKey, Float.toString(newValue))); + newValue = Float.parseFloat(mediaPhoneSettings.getString(preferenceKey, Float.toString(newValue))); prefsEditor.remove(preferenceKey); } catch (Exception ignored) { } @@ -113,7 +113,7 @@ public static void upgradeApplication(Context context) { preferenceKey = "word_duration"; newValue = 0.2f; // 0.2 is the default frame duration in v16 (saves reading TypedValue from prefs) try { - newValue = Float.valueOf(mediaPhoneSettings.getString(preferenceKey, Float.toString(newValue))); + newValue = Float.parseFloat(mediaPhoneSettings.getString(preferenceKey, Float.toString(newValue))); prefsEditor.remove(preferenceKey); } catch (Exception ignored) { } @@ -314,8 +314,7 @@ public static void installTimingEditorNarrative(Context context) { context.getString(R.string.timing_editor_record_icon_alternative)), context.getString(R.string.timing_editor_narrative_frame_4), "\u00A0\n" + context.getString(R.string.timing_editor_narrative_frame_5, - context.getString(R.string.preferences_contact_us_title), - context.getString(R.string.title_preferences)) + + context.getString(R.string.preferences_contact_us_title), context.getString(R.string.title_preferences)) + "\n\u00A0", }; diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/CameraView.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/CameraView.java index a8c44802..dfc148ad 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/CameraView.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/CameraView.java @@ -613,8 +613,9 @@ public void onAutoFocus(boolean success, Camera camera) { // simulate continuous autofocus by sending a focus request every [interval] milliseconds if (mAutoFocusInterval > 0) { if (mAutoFocusHandler != null) { - mAutoFocusHandler.sendMessageDelayed( - mAutoFocusHandler.obtainMessage(R.id.msg_auto_focus, CameraView.this), mAutoFocusInterval); + mAutoFocusHandler.sendMessageDelayed(mAutoFocusHandler.obtainMessage(R.id.msg_auto_focus, + CameraView.this), + mAutoFocusInterval); mAutoFocusHandler = null; } else { if (MediaPhone.DEBUG) { diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/HorizontalListView.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/HorizontalListView.java index b58f289d..574caa3e 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/HorizontalListView.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/HorizontalListView.java @@ -27,6 +27,7 @@ package ac.robinson.mediaphone.view; +import android.annotation.SuppressLint; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; @@ -88,7 +89,6 @@ public class HorizontalListView extends AdapterView { private static int mFrameWidth = 0; // static to fix scroll positioning bug private boolean mPendingIconsUpdate; private boolean mIconLoadingComplete; - private boolean mFingerUp = true; private final Runnable mLayoutUpdater = this::requestLayout; public HorizontalListView(Context context, AttributeSet attrs) { @@ -203,10 +203,6 @@ public static int getFrameWidth() { return mFrameWidth; } - public int getHorizontalPosition() { - return mCurrentX; - } - private void savePositionToAdapter(int position) { if (mAdapter != null) { mAdapter.setHorizontalPosition(position); @@ -512,6 +508,7 @@ public int getMaxFlingX(boolean hideKeyFrames) { return xMax; } + @SuppressLint("ClickableViewAccessibility") // the HorizontalGestureListener *does* call performClick @Override public boolean onTouchEvent(MotionEvent e) { int action = e.getAction() & MotionEvent.ACTION_MASK; @@ -591,6 +588,7 @@ private void setFrameSelectedState(View view, int resourceId, boolean selected) } } else { PressableRelativeLayout currentFrame = (PressableRelativeLayout) view; + //noinspection ConstantValue if (currentFrame != null) { // needed in case a frame is deleted while they're pressing currentFrame.setPressedIcon(resourceId); currentFrame.setPressed(selected); @@ -780,8 +778,7 @@ public boolean onDown(@NonNull MotionEvent e) { int primaryChildIndex = getSelectedChildIndex(e, 0); int secondaryChildIndex = getSelectedChildIndex(e, 1); - if (primaryChildIndex >= 0 && secondaryChildIndex >= 0 && - Math.abs(primaryChildIndex - secondaryChildIndex) == 1) { + if (primaryChildIndex >= 0 && secondaryChildIndex >= 0 && Math.abs(primaryChildIndex - secondaryChildIndex) == 1) { View primaryView = getChildAt(primaryChildIndex); View secondaryView = getChildAt(secondaryChildIndex); @@ -814,8 +811,7 @@ public boolean onDown(@NonNull MotionEvent e) { int selectedChild = getSelectedChildIndex(e, 0); // e.getPointerId(e.getActionIndex()) if (selectedChild >= 0) { View child = getChildAt(selectedChild); - // setFrameSelectedState(child, mAdapter.getSelectAllFramesAsOne() ? 0 - // : PressableRelativeLayout.PLAY_ICON, true); + // setFrameSelectedState(child, mAdapter.getSelectAllFramesAsOne() ? 0 : PLAY_ICON, true); setFrameSelectedState(child, 0, true); if (mOnItemSelected != null) { mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + selectedChild, @@ -1004,8 +1000,7 @@ public synchronized void postUpdateFrameIcons() { mPendingIconsUpdate = true; Handler handler = mScrollHandler; handler.removeMessages(R.id.msg_update_frame_icons); - Message message = handler.obtainMessage(R.id.msg_update_frame_icons, HorizontalListView.this); - handler.sendMessage(message); + handler.sendMessage(handler.obtainMessage(R.id.msg_update_frame_icons, HorizontalListView.this)); } private void updateScrollState(int scrollState) { @@ -1014,8 +1009,7 @@ private void updateScrollState(int scrollState) { mPendingIconsUpdate = true; final Handler handler = mScrollHandler; handler.removeMessages(R.id.msg_update_frame_icons); - final Message message = handler.obtainMessage(R.id.msg_update_frame_icons, HorizontalListView.this); - handler.sendMessageDelayed(message, mFingerUp ? 0 : MediaPhone.ANIMATION_ICON_SHOW_DELAY); + handler.sendMessage(handler.obtainMessage(R.id.msg_update_frame_icons, HorizontalListView.this)); } else if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) { mPendingIconsUpdate = false; mScrollHandler.removeMessages(R.id.msg_update_frame_icons); @@ -1035,8 +1029,8 @@ public void handleMessage(Message msg) { private class FingerTracker implements View.OnTouchListener { public boolean onTouch(View view, MotionEvent event) { final int action = event.getAction(); - mFingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; - if (mFingerUp && mScrollState != AbsListView.OnScrollListener.SCROLL_STATE_FLING) { + boolean fingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; + if (fingerUp && mScrollState != AbsListView.OnScrollListener.SCROLL_STATE_FLING) { postUpdateFrameIcons(); } return false; diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/SeekBarPreference.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/SeekBarPreference.java index 2191269d..2f412577 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/SeekBarPreference.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/SeekBarPreference.java @@ -78,7 +78,6 @@ public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) { setValuesFromXml(context, attrs); } - /** @noinspection UnnecessaryBoxing*/ // we can't use valueOf as we need the *actual* string value - valueOf doesn't do this private void setValuesFromXml(Context context, AttributeSet attrs) { TypedArray customAttributes = context.obtainStyledAttributes(attrs, R.styleable.SeekBarPreference); @@ -90,7 +89,7 @@ private void setValuesFromXml(Context context, AttributeSet attrs) { String defaultValue = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "defaultValue"); try { - mDefaultValue = Float.valueOf(defaultValue); + mDefaultValue = Float.parseFloat(defaultValue); } catch (Throwable t) { // for some ridiculous reason, Android's inbuilt preference values don't resolve references! float defaultValueFloat = 0; @@ -122,7 +121,7 @@ private void setValuesFromXml(Context context, AttributeSet attrs) { if (!defaultValueFound) { // bizarrely, loading as a string seems to work as a last resort for most values try { - defaultValueFloat = Float.valueOf(context.getString(resourceId)); + defaultValueFloat = Float.parseFloat(context.getString(resourceId)); defaultValueFound = true; } catch (Throwable ignored) { } @@ -298,7 +297,10 @@ protected Object onGetDefaultValue(TypedArray typedArray, int index) { mDefaultValue = typedArray.getFloat(index, mDefaultValue); } catch (Throwable t) { try { - mDefaultValue = Float.valueOf(typedArray.getString(index)); + String defaultString = typedArray.getString(index); + if (defaultString != null) { + mDefaultValue = Float.parseFloat(defaultString); + } } catch (Throwable ignored) { } } diff --git a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/VUMeter.java b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/VUMeter.java index 0b16b294..74e12220 100644 --- a/MediaPhone/src/main/java/ac/robinson/mediaphone/view/VUMeter.java +++ b/MediaPhone/src/main/java/ac/robinson/mediaphone/view/VUMeter.java @@ -146,8 +146,8 @@ protected void onDraw(Canvas canvas) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); - super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(Math.round( - width * WIDTH_HEIGHT_RATIO), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(Math.round(width * WIDTH_HEIGHT_RATIO), MeasureSpec.EXACTLY)); } @Override diff --git a/MediaPhone/src/main/res/layout/audio_view_preview.xml b/MediaPhone/src/main/res/layout/audio_view_preview.xml index cdf5728c..9985f88f 100644 --- a/MediaPhone/src/main/res/layout/audio_view_preview.xml +++ b/MediaPhone/src/main/res/layout/audio_view_preview.xml @@ -8,15 +8,6 @@ android:layout_height="@dimen/navigation_button_height" android:layout_alignParentBottom="true"> - - - - - - diff --git a/MediaPhone/src/main/res/layout/camera_view.xml b/MediaPhone/src/main/res/layout/camera_view.xml index 2d3217f5..7da70bf0 100644 --- a/MediaPhone/src/main/res/layout/camera_view.xml +++ b/MediaPhone/src/main/res/layout/camera_view.xml @@ -60,15 +60,6 @@ android:layout_height="wrap_content" android:layout_gravity="bottom"> - - - - - - - - - - - - - diff --git a/MediaPhone/src/main/res/values-es/strings.xml b/MediaPhone/src/main/res/values-es/strings.xml index 96a5cb13..a4dfbeb2 100644 --- a/MediaPhone/src/main/res/values-es/strings.xml +++ b/MediaPhone/src/main/res/values-es/strings.xml @@ -147,6 +147,7 @@ Toda la narrativa (%1$d cuadro) será permanentemente borrada + Toda la narrativa (%1$d cuadros) será permanentemente borrada Toda la narrativa (%1$d cuadros) será permanentemente borrada @@ -317,7 +318,6 @@ Copiar medios Pegar medios Editor de tiempo (beta) - Atrás Hecho Agregar cuadro después Reproducir / exportar diff --git a/MediaPhone/src/main/res/values-fr/strings.xml b/MediaPhone/src/main/res/values-fr/strings.xml index 02680303..c31fce70 100644 --- a/MediaPhone/src/main/res/values-fr/strings.xml +++ b/MediaPhone/src/main/res/values-fr/strings.xml @@ -147,6 +147,7 @@ Le récit entier (%1$d diapositive) va être effacé définitivement + Le récit entier (%1$d diapositives) va être supprimé définitivement Le récit entier (%1$d diapositives) va être supprimé définitivement @@ -317,7 +318,6 @@ Copier le média Coller le média Chronométreur (bêta) - Retour en arrière Terminé Ajouter une diapositive à la suite Lire / exporter diff --git a/MediaPhone/src/main/res/values-nl/strings.xml b/MediaPhone/src/main/res/values-nl/strings.xml index 4abe33c8..f7cd38a8 100644 --- a/MediaPhone/src/main/res/values-nl/strings.xml +++ b/MediaPhone/src/main/res/values-nl/strings.xml @@ -317,7 +317,6 @@ Kopieer media Plak media Timing-editor (bèta) - Terug Klaar Lijst invoegen na Afspelen/Exporteren diff --git a/MediaPhone/src/main/res/values-pl/strings.xml b/MediaPhone/src/main/res/values-pl/strings.xml index f13b99a0..7810b2c6 100644 --- a/MediaPhone/src/main/res/values-pl/strings.xml +++ b/MediaPhone/src/main/res/values-pl/strings.xml @@ -319,7 +319,6 @@ Media kopiujące Pasta medialna Edytor czasowy (beta) - Cofnij Skończone Dodaj slajd po Odtwórz / eksportuj diff --git a/MediaPhone/src/main/res/values-pt/strings.xml b/MediaPhone/src/main/res/values-pt/strings.xml index 9b36a75c..0e6acac4 100644 --- a/MediaPhone/src/main/res/values-pt/strings.xml +++ b/MediaPhone/src/main/res/values-pt/strings.xml @@ -147,6 +147,7 @@ Toda a narrativa (%1$d quadro) será excluída permanentemente + Toda a narrativa (%1$d quadros) será excluída permanentemente Toda a narrativa (%1$d quadros) será excluída permanentemente @@ -317,7 +318,6 @@ Mídia de cópia Colar mídia Editor de tempo (beta) - Voltar Concluído Adicionar quadro Reproduzir / exportar diff --git a/MediaPhone/src/main/res/values-ru/strings.xml b/MediaPhone/src/main/res/values-ru/strings.xml index ff292e8c..e0026909 100644 --- a/MediaPhone/src/main/res/values-ru/strings.xml +++ b/MediaPhone/src/main/res/values-ru/strings.xml @@ -319,7 +319,6 @@ Копируемые носители пастообразные СМИ Редактор времени (бета) - Вернуться Готово Добавить рамку после Проигрыш / экспортирование diff --git a/MediaPhone/src/main/res/values/attrs.xml b/MediaPhone/src/main/res/values/attrs.xml index cbee38db..e191a5ab 100644 --- a/MediaPhone/src/main/res/values/attrs.xml +++ b/MediaPhone/src/main/res/values/attrs.xml @@ -66,7 +66,6 @@ 10 175 - 350 250 250 600 @@ -114,8 +113,6 @@ -1 false - true - false false @@ -152,7 +149,6 @@ appearance_category screen_orientation start_scrolled_to_end - show_back_button spanning_media timing_editor custom_font diff --git a/MediaPhone/src/main/res/values/colors.xml b/MediaPhone/src/main/res/values/colors.xml index 444030af..195378ac 100644 --- a/MediaPhone/src/main/res/values/colors.xml +++ b/MediaPhone/src/main/res/values/colors.xml @@ -19,8 +19,8 @@ #ffe4e4e4 - #ffffe0b2 - @color/template_list_light + #aaffe0b2 + #ffffe0b2 @color/primary_dark diff --git a/MediaPhone/src/main/res/values/strings.xml b/MediaPhone/src/main/res/values/strings.xml index 2493b8a4..0cb4302f 100644 --- a/MediaPhone/src/main/res/values/strings.xml +++ b/MediaPhone/src/main/res/values/strings.xml @@ -339,7 +339,6 @@ Paste media Timing editor (beta) @string/title_preferences - Back Done Add frame after Play / export diff --git a/MediaUtilities b/MediaUtilities index 6722c552..750010e4 160000 --- a/MediaUtilities +++ b/MediaUtilities @@ -1 +1 @@ -Subproject commit 6722c552a5ef4c3051ea726a5f844d057c36d810 +Subproject commit 750010e4ea3f514416dee3a35026476c60521bf1 diff --git a/fastlane/metadata/android/en-US/changelogs/55.txt b/fastlane/metadata/android/en-US/changelogs/55.txt new file mode 100644 index 00000000..74056fed --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/55.txt @@ -0,0 +1,2 @@ +- Added support for ZIP archive import +- Modernisation and bugfixes to better support more recent Android versions