Skip to content
This repository has been archived by the owner on Aug 27, 2024. It is now read-only.

Commit

Permalink
new debug log file feature
Browse files Browse the repository at this point in the history
  • Loading branch information
y20k committed Jul 25, 2019
1 parent f0024f8 commit 1618359
Show file tree
Hide file tree
Showing 17 changed files with 130 additions and 40 deletions.
2 changes: 1 addition & 1 deletion app/src/main/java/org/y20k/escapepods/Keys.kt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ object Keys {
const val PREF_NUMBER_OF_EPISODES_TO_KEEP: String = "NUMBER_OF_EPISODES_TO_KEEP"
const val PREF_NUMBER_OF_AUDIO_FILES_TO_KEEP: String = "NUMBER_OF_AUDIO_FILES_TO_KEEP"
const val PREF_NIGHT_MODE_STATE: String = "NIGHT_MODE_STATE"

const val PREF_KEEP_DEBUG_LOG: String = "KEEP_DEBUG_LOG"
const val PREF_PLAYER_STATE_EPISODE_MEDIA_ID: String = "PLAYER_STATE_EPISODE_MEDIA_ID"
const val PREF_PLAYER_STATE_PLAYBACK_STATE: String = "PLAYER_STATE_PLAYBACK_STATE"
const val PREF_PLAYER_STATE_PLAYBACK_POSITION: String = "PLAYER_STATE_PLAYBACK_POSITION"
Expand Down
34 changes: 19 additions & 15 deletions app/src/main/java/org/y20k/escapepods/PodcastPlayerActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
}
} else {
// permission denied
Toast.makeText(this, getString(R.string.toast_message_error_missing_storage_permission), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_error_missing_storage_permission, Toast.LENGTH_LONG).show()
}
}
}
Expand Down Expand Up @@ -258,7 +258,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
super.onMeteredNetworkDialog(dialogType, payload)
when (dialogType) {
Keys.DIALOG_DOWNLOAD_EPISODE_WITHOUT_WIFI -> {
Toast.makeText(this, getString(R.string.toast_message_downloading_episode), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_downloading_episode, Toast.LENGTH_LONG).show()
DownloadHelper.downloadEpisode(this, payload, true, true)
}
}
Expand All @@ -283,7 +283,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
if (CollectionHelper.hasEnoughTimePassedSinceLastUpdate(this)) {
updateCollection()
} else {
Toast.makeText(this, getString(R.string.toast_message_collection_update_not_necessary), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_collection_update_not_necessary, Toast.LENGTH_LONG).show()
}
}
// user tapped cancel - for dev purposes: refresh the podcast list view // todo check if that can be helpful
Expand Down Expand Up @@ -350,14 +350,13 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
layout.swipeRefreshLayout.isRefreshing = false
}


// set up sleep timer button
layout.sheetSleepButtonView.setOnClickListener {
Toast.makeText(this, getString(R.string.toast_message_sleep_not_yet_available), Toast.LENGTH_LONG).show()
layout.sheetSleepTimerButtonView.setOnClickListener {
Toast.makeText(this, R.string.toast_message_sleep_not_yet_available, Toast.LENGTH_LONG).show()
}

// set up sleep timer button - long press (night mode switch)
layout.sheetSleepButtonView.setOnLongClickListener {
layout.sheetSleepTimerButtonView.setOnLongClickListener {
val v = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
v.vibrate(50)
// v.vibrate(VibrationEffect.createOneShot(50, android.os.VibrationEffect.DEFAULT_AMPLITUDE)); // todo check if there is an androidx vibrator
Expand All @@ -366,6 +365,11 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
return@setOnLongClickListener true
}

// set up the degug log toogle switch
layout.sheetDebugToggleButtonView.setOnClickListener {
LogHelper.toggleDebugLogFileCreation(this@PodcastPlayerActivity)
}

}


Expand Down Expand Up @@ -398,15 +402,15 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
layout.sheetSkipBackButtonView.setOnClickListener {
when (playerState.playbackState == PlaybackStateCompat.STATE_PLAYING) {
true -> mediaController.transportControls.rewind()
false -> Toast.makeText(this, getString(R.string.toast_message_skipping_disabled), Toast.LENGTH_LONG).show()
false -> Toast.makeText(this, R.string.toast_message_skipping_disabled, Toast.LENGTH_LONG).show()
}
}

// bottom sheet skip forward button
layout.sheetSkipForwardButtonView.setOnClickListener {
when (playerState.playbackState == PlaybackStateCompat.STATE_PLAYING) {
true -> mediaController.transportControls.fastForward()
false -> Toast.makeText(this, getString(R.string.toast_message_skipping_disabled), Toast.LENGTH_LONG).show()
false -> Toast.makeText(this, R.string.toast_message_skipping_disabled, Toast.LENGTH_LONG).show()
}
}

Expand All @@ -426,7 +430,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
layout.sheetUpNextClearButton.setOnClickListener {
// clear up next
updateUpNext()
Toast.makeText(this, getString(R.string.toast_message_up_next_removed_episode), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_up_next_removed_episode, Toast.LENGTH_LONG).show()
}

// register a callback to stay in sync
Expand Down Expand Up @@ -469,7 +473,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
playerState.upNextEpisodeMediaId = episode.getMediaId()
layout.updateUpNextViews(episode)
if (episode.getMediaId().isNotEmpty()) {
Toast.makeText(this, getString(R.string.toast_message_up_next_added_episode), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_up_next_added_episode, Toast.LENGTH_LONG).show()
}
PreferencesHelper.savePlayerState(this, playerState)
MediaControllerCompat.getMediaController(this@PodcastPlayerActivity).sendCommand(Keys.CMD_RELOAD_PLAYER_STATE, null, null)
Expand All @@ -479,7 +483,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
/* Updates podcast collection */
private fun updateCollection() {
if (NetworkHelper.isConnectedToNetwork(this)) {
Toast.makeText(this, getString(R.string.toast_message_updating_collection), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_updating_collection, Toast.LENGTH_LONG).show()
DownloadHelper.updateCollection(this)
} else {
ErrorDialog().show(this, R.string.dialog_error_title_no_network, R.string.dialog_error_message_no_network)
Expand All @@ -490,7 +494,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
/* Updates podcast collection */
private fun downloadEpisode(episode: Episode) {
if (NetworkHelper.isConnectedToWifi(this)) {
Toast.makeText(this, getString(R.string.toast_message_downloading_episode), Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.toast_message_downloading_episode, Toast.LENGTH_LONG).show()
DownloadHelper.downloadEpisode(this, episode.getMediaId(), true, true)
} else if (NetworkHelper.isConnectedToCellular(this)) {
MeteredNetworkDialog(this).show(this, Keys.DIALOG_DOWNLOAD_EPISODE_WITHOUT_WIFI, R.string.dialog_metered_download_episode_title, R.string.dialog_metered_download_episode_message, R.string.dialog_metered_download_episode_button_okay, episode.getMediaId())
Expand All @@ -509,7 +513,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
// wait for result
val contentType: NetworkHelper.ContentType = deferred.await()
if ((contentType.type in Keys.MIME_TYPES_RSS) || (contentType.type in Keys.MIME_TYPES_ATOM)) {
Toast.makeText(this@PodcastPlayerActivity, getString(R.string.toast_message_adding_podcast), Toast.LENGTH_LONG).show()
Toast.makeText(this@PodcastPlayerActivity, R.string.toast_message_adding_podcast, Toast.LENGTH_LONG).show()
DownloadHelper.downloadPodcasts(this@PodcastPlayerActivity, arrayOf(feedUrl))
} else {
ErrorDialog().show(this@PodcastPlayerActivity, R.string.dialog_error_title_podcast_invalid_feed, R.string.dialog_error_message_podcast_invalid_feed, feedUrl)
Expand All @@ -526,7 +530,7 @@ class PodcastPlayerActivity: AppCompatActivity(), CoroutineScope,
if (NetworkHelper.isConnectedToNetwork(this@PodcastPlayerActivity)) {
val urls = CollectionHelper.removeDuplicates(collection, feedUrls)
if (urls.isNotEmpty()) {
Toast.makeText(this@PodcastPlayerActivity, getString(R.string.toast_message_adding_podcast), Toast.LENGTH_LONG).show()
Toast.makeText(this@PodcastPlayerActivity, R.string.toast_message_adding_podcast, Toast.LENGTH_LONG).show()
DownloadHelper.downloadPodcasts(this, CollectionHelper.removeDuplicates(collection, feedUrls))
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,8 @@ object CollectionHelper {
for (i in podcastSize -1 downTo numberOfEpisodesToKeep) {
val audioUri: String = podcast.episodes[i].audio
if (audioUri.isNotEmpty()) {
LogHelper.d(TAG, "Deleting audio file for episode no. ${i+1}")
LogHelper.d(TAG, "Trim list of episodes (delete if > 5): Deleting audio file for episode no. ${i+1} - ${podcast.episodes[i].title}")
LogHelper.save(context, TAG, "Trim list of episodes (delete if > 5): Deleting audio file for episode no. ${i+1} - ${podcast.episodes[i].title}") // todo remove
try {
context.contentResolver.delete(Uri.parse(podcast.episodes[i].audio), null, null)
} catch (e: Exception) {
Expand All @@ -367,7 +368,7 @@ object CollectionHelper {


/* Deletes audio files that are no longer needed */
fun deleteOldAudioFiles(context: Context, collection: Collection): Collection {
fun deleteUnneededAudioFiles(context: Context, collection: Collection): Collection {
val numberOfAudioFilesToKeep: Int = PreferenceManager.getDefaultSharedPreferences(context).getInt(Keys.PREF_NUMBER_OF_AUDIO_FILES_TO_KEEP, Keys.DEFAULT_NUMBER_OF_AUDIO_FILES_TO_KEEP)
for (podcast: Podcast in collection.podcasts) {
val podcastSize = podcast.episodes.size
Expand All @@ -376,7 +377,8 @@ object CollectionHelper {
for (i in podcastSize -1 downTo numberOfAudioFilesToKeep) {
// check if episode can be deleted
if (canBeDeleted(context, podcast.episodes[i])) {
LogHelper.d(TAG, "Deleting audio file for episode no. ${i+1}")
LogHelper.d(TAG, "Deleting unneeded audio files (delete if > 2): Deleting audio file for episode no. ${i+1} - ${podcast.episodes[i].title} ")
LogHelper.save(context, TAG, "Deleting unneeded audio files (delete if > 2):: Deleting audio file for episode no. ${i+1} - ${podcast.episodes[i].title}") // todo remove
// delete audio file
try {
context.contentResolver.delete(Uri.parse(podcast.episodes[i].audio), null, null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ object DownloadHelper {
}
}
// remove unused audio references from collection
collection = CollectionHelper.deleteOldAudioFiles(context, collection)
collection = CollectionHelper.deleteUnneededAudioFiles(context, collection)
// update player state if necessary
PreferencesHelper.updatePlayerState(context, collection)
// save collection
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/java/org/y20k/escapepods/helpers/FileHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,15 @@ object FileHelper {
}


/* Deletes the debug log file */
fun deleteLog(context: Context) {
val logFile: File = File(context.getExternalFilesDir(Keys.FOLDER_COLLECTION), Keys.DEBUG_LOG_FILE)
if (logFile.exists()) {
logFile.delete()
}
}


/* Suspend function: Wrapper for saveCollection */
suspend fun saveCollectionSuspended(context: Context, collection: Collection) {
return suspendCoroutine { cont ->
Expand Down Expand Up @@ -263,7 +272,7 @@ object FileHelper {
// check if file exists
val file: File = File(context.getExternalFilesDir(folder), fileName)
if (!file.exists()) {
return ""
return String()
}
// readSuspended until last line reached
val stream: InputStream = file.inputStream()
Expand Down
48 changes: 33 additions & 15 deletions app/src/main/java/org/y20k/escapepods/helpers/LogHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ package org.y20k.escapepods.helpers

import android.content.Context
import android.util.Log
import android.widget.Toast
import org.y20k.escapepods.BuildConfig
import org.y20k.escapepods.R
import java.util.*


Expand Down Expand Up @@ -75,28 +77,44 @@ object LogHelper {
log(tag, Log.ERROR, t, *messages)
}

// todo remove debug log feature
fun save(context: Context, tag: String, vararg messages: Any) {
save(context, tag, null, *messages)
}

// todo remove debug log feature
fun save(context: Context, tag: String, t: Throwable?, vararg messages: Any) {
val sb = StringBuilder()
sb.append(DateTimeHelper.convertToRfc2822(Calendar.getInstance().time))
sb.append(" | ")
sb.append(tag)
sb.append(" | ")
for (m in messages) {
sb.append(m)
}
if (t != null) {
if (PreferencesHelper.loadKeepDebugLog(context)) {
val sb = StringBuilder()
sb.append(DateTimeHelper.convertToRfc2822(Calendar.getInstance().time))
sb.append(" | ")
sb.append(tag)
sb.append(" | ")
for (m in messages) {
sb.append(m)
}
if (t != null) {
sb.append("\n")
sb.append(Log.getStackTraceString(t))
}
sb.append("\n")
sb.append(Log.getStackTraceString(t))
val message = sb.toString()
FileHelper.saveLog(context, message)
}
}

fun toggleDebugLogFileCreation(context: Context) {
when (PreferencesHelper.loadKeepDebugLog(context)) {
true -> {
// turn off log
PreferencesHelper.saveKeepDebugLog(context, false)
FileHelper.deleteLog(context)
Toast.makeText(context, R.string.toast_message_debug_logging_to_file_stopped, Toast.LENGTH_LONG).show()
}
false -> {
// turn on log
PreferencesHelper.saveKeepDebugLog(context, true)
Toast.makeText(context, R.string.toast_message_debug_logging_to_file_started, Toast.LENGTH_LONG).show()
}
}
sb.append("\n")
val message = sb.toString()
FileHelper.saveLog(context, message)
}

private fun log(tag: String, level: Int, t: Throwable?, vararg messages: Any) {
Expand Down
16 changes: 16 additions & 0 deletions app/src/main/java/org/y20k/escapepods/helpers/PreferencesHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,22 @@ object PreferencesHelper {
}


/* Loads keepDebugLog true or false */
fun loadKeepDebugLog(context: Context): Boolean {
val settings = PreferenceManager.getDefaultSharedPreferences(context)
return settings.getBoolean(Keys.PREF_KEEP_DEBUG_LOG, false)
}


/* Saves keepDebugLog true or false */
fun saveKeepDebugLog(context: Context, keepDebugLog: Boolean = false) {
val settings = PreferenceManager.getDefaultSharedPreferences(context)
val editor = settings.edit()
editor.putBoolean(Keys.PREF_KEEP_DEBUG_LOG, keepDebugLog)
editor.apply()
}


/* Loads state of playback for player / PlayerService from shared preferences */
fun loadPlayerPlayBackState(context: Context): Int {
val settings = PreferenceManager.getDefaultSharedPreferences(context)
Expand Down
6 changes: 4 additions & 2 deletions app/src/main/java/org/y20k/escapepods/ui/LayoutHolder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ data class LayoutHolder(var activity: Activity) {
var sheetPlayButtonView: ImageView
var sheetSkipBackButtonView: ImageView
var sheetSkipForwardButtonView: ImageView
var sheetSleepButtonView: ImageView
var sheetSleepTimerButtonView: ImageView
var sheetDebugToggleButtonView: ImageView
var sheetUpNextName: TextView
var sheetUpNextClearButton: ImageView
var bottomSheetBehavior: BottomSheetBehavior<ConstraintLayout>
Expand All @@ -94,7 +95,8 @@ data class LayoutHolder(var activity: Activity) {
sheetPlayButtonView = activity.findViewById(R.id.sheet_play_button)
sheetSkipBackButtonView = activity.findViewById(R.id.sheet_skip_back_button)
sheetSkipForwardButtonView = activity.findViewById(R.id.sheet_skip_forward_button)
sheetSleepButtonView = activity.findViewById(R.id.sleep_timer_button)
sheetSleepTimerButtonView = activity.findViewById(R.id.sleep_timer_button)
sheetDebugToggleButtonView = activity.findViewById(R.id.debug_toggle_bottle)
sheetUpNextName = activity.findViewById(R.id.player_sheet_up_next_name)
sheetUpNextClearButton = activity.findViewById(R.id.player_sheet_up_next_clear_button)
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/ic_developer_mode_24dp.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/player_sheet_icon"
android:pathData="M7,5h10v2h2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99L7,1c-1.1,0 -2,0.9 -2,2v4h2L7,5zM15.41,16.59L20,12l-4.59,-4.59L14,8.83 17.17,12 14,15.17l1.41,1.42zM10,15.17L6.83,12 10,8.83 8.59,7.41 4,12l4.59,4.59L10,15.17zM17,19L7,19v-2L5,17v4c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2v2z"/>
</vector>
14 changes: 14 additions & 0 deletions app/src/main/res/layout/bottom_sheet_playback_controls.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,20 @@
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_sleep_timer_24dp" />

<ImageView
android:id="@+id/debug_toggle_bottle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/descr_expanded_player_debug_log_toggle_button"
android:focusable="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_developer_mode_24dp" />

<ImageView
android:id="@+id/sheet_large_podcast_cover"
android:layout_width="0dp"
Expand Down
Loading

0 comments on commit 1618359

Please sign in to comment.