Skip to content

Commit

Permalink
Merge pull request #355 from AndBible/feature/#245_tabs
Browse files Browse the repository at this point in the history
Feature/#245 tabs
  • Loading branch information
tuomas2 authored May 23, 2019
2 parents d4a680d + f84cc44 commit 9004293
Show file tree
Hide file tree
Showing 15 changed files with 511 additions and 167 deletions.
2 changes: 1 addition & 1 deletion app/src/main/java/net/bible/android/BibleApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ open class BibleApplication : MultiDexApplication() {
private var ttsWidgetManager: SpeakWidgetManager? = null

val appStateSharedPreferences: SharedPreferences
get() = getSharedPreferences(saveStateTag, 0)
get() = getSharedPreferences(saveStateTag, Context.MODE_PRIVATE)

override fun onCreate() {
// save to a singleton to allow easy access from anywhere
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,13 @@ open class Window (var windowLayout: WindowLayout, var pageManager: CurrentPageM
val stateJson: JSONObject
@Throws(JSONException::class)
get() {
val `object` = JSONObject()
`object`.put("screenNo", screenNo)
.put("isSynchronised", isSynchronised)
.put("windowLayout", windowLayout.stateJson)
.put("pageManager", pageManager.stateJson)
return `object`
val obj = JSONObject().apply {
put("screenNo", screenNo)
put("isSynchronised", isSynchronised)
put("windowLayout", windowLayout.stateJson)
put("pageManager", pageManager.stateJson)
}
return obj
}

open val isLinksWindow: Boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import net.bible.android.control.event.window.CurrentWindowChangedEvent
import net.bible.android.control.page.CurrentPageManager
import net.bible.android.control.page.window.WindowLayout.WindowState
import net.bible.service.common.Logger
import net.bible.service.history.HistoryManager

import org.apache.commons.lang3.StringUtils
import org.json.JSONArray
Expand All @@ -43,7 +44,9 @@ import javax.inject.Provider
open class WindowRepository @Inject constructor(
// Each window has its own currentPageManagerProvider to store the different state e.g.
// different current Bible module, so must create new cpm for each window
private val currentPageManagerProvider: Provider<CurrentPageManager>)
val currentPageManagerProvider: Provider<CurrentPageManager>,
private val historyManagerProvider: Provider<HistoryManager>
)
{

private var windowList: MutableList<Window> = ArrayList()
Expand All @@ -52,6 +55,8 @@ open class WindowRepository @Inject constructor(

private var maxWindowNoUsed = 0

var name = ""

private val logger = Logger(this.javaClass.name)

//TODO if user presses a link then should also show links window
Expand All @@ -72,7 +77,7 @@ open class WindowRepository @Inject constructor(
}

init {
restoreState()
//restoreState()
ABEventBus.getDefault().safelyRegister(this)
}

Expand Down Expand Up @@ -249,20 +254,15 @@ open class WindowRepository @Inject constructor(
}
}

/** save current page and document state */
private fun saveState() {
logger.info("Save instance state for screens")
val settings = BibleApplication.application.appStateSharedPreferences
saveState(settings)
}

/** restore current page and document state */
private fun restoreState() {
fun restoreState() {
try {
logger.info("Restore instance state for screens")
val application = BibleApplication.application
val settings = application.appStateSharedPreferences
restoreState(settings)
val stateJsonString = settings.getString("windowRepositoryState", null)
if(stateJsonString != null)
restoreState(stateJsonString)
} catch (e: Exception) {
logger.error("Restore error", e)
}
Expand All @@ -273,68 +273,76 @@ open class WindowRepository @Inject constructor(
*
* @param outState
*/
private fun saveState(outState: SharedPreferences) {
private fun saveState(outState: SharedPreferences = BibleApplication.application.appStateSharedPreferences) {
logger.info("save state")
try {

val windowRepositoryStateObj = JSONObject()
val windowStateArray = JSONArray()
for (window in windowList) {
try {
if (window.windowLayout.state !== WindowState.CLOSED) {
windowStateArray.put(window.stateJson)
}
} catch (je: JSONException) {
logger.error("Error saving screen state", je)
}

}
windowRepositoryStateObj.put("windowState", windowStateArray)

val editor = outState.edit()
editor.putString("windowRepositoryState", windowRepositoryStateObj.toString())
editor.putString("windowRepositoryState", dumpState())
editor.apply()
} catch (je: JSONException) {
logger.error("Saving window state", je)
}

}

fun dumpState(): String {
val windowRepositoryStateObj = JSONObject()
val windowStateArray = JSONArray()
for (window in windowList) {
try {
if (window.windowLayout.state !== WindowState.CLOSED) {
windowStateArray.put(window.stateJson)
}
} catch (je: JSONException) {
logger.error("Error saving screen state", je)
}

}
windowRepositoryStateObj.put("windowState", windowStateArray)
windowRepositoryStateObj.put("name", name)
windowRepositoryStateObj.put("history", historyManagerProvider.get().dumpString)
return windowRepositoryStateObj.toString()
}

/** called during app start-up to restore previous state
*
* @param inState
*/
private fun restoreState(inState: SharedPreferences) {
fun restoreState(stateJsonString: String) {
logger.info("restore state")
val windowRepositoryStateString = inState.getString("windowRepositoryState", null)
if (StringUtils.isNotEmpty(windowRepositoryStateString)) {
if (StringUtils.isNotEmpty(stateJsonString)) {
try {
val windowRepositoryState = JSONObject(windowRepositoryStateString)
val windowRepositoryState = JSONObject(stateJsonString)
val windowState = windowRepositoryState.getJSONArray("windowState")
name = windowRepositoryState.optString("name")
if (windowState.length() > 0) {

// remove current (default) state before restoring
windowList.clear()

for (i in 0 until windowState.length()) {
try {
val screenState = windowState.getJSONObject(i)
val window = Window(currentPageManagerProvider.get())
window.restoreState(screenState)

window.restoreState(windowState.getJSONObject(i))
maxWindowNoUsed = Math.max(maxWindowNoUsed, window.screenNo)

windowList.add(window)
} catch (je: JSONException) {
logger.error("Error restoring screen state", je)
}

}
}
historyManagerProvider.get().dumpString = windowRepositoryState.optString("history")

} catch (je: JSONException) {
logger.error("Error restoring screen state", je)
}

}
activeWindow = getDefaultActiveWindow()
}

fun clear() {
windowList.clear()
activeWindow = getDefaultActiveWindow()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,8 @@ class WindowSync(private val windowRepository: WindowRepository) {
* Save/restore dynamic state that is not automatically saved as Preferences
*/
fun onEvent(event: AppToBackgroundEvent) {
lastSynchdInactiveWindowKey = if (event.isMovedToBackground) {
// ensure nonactive screen is initialised when returning from background
null
} else {
null
}
// ensure nonactive screen is initialised when returning from background
lastSynchdInactiveWindowKey = null
}

fun synchronizeAllScreens() {
Expand Down
34 changes: 17 additions & 17 deletions app/src/main/java/net/bible/android/control/speak/SpeakSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,16 @@ object VerseRangeSerializer: KSerializer<VerseRange?> {

@Serializable
data class PlaybackSettings (
@Optional val speakChapterChanges: Boolean = true,
@Optional val speakTitles: Boolean = true,
@Optional val speakFootnotes: Boolean = false,
@Optional var speed: Int = 100,
val speakChapterChanges: Boolean = true,
val speakTitles: Boolean = true,
val speakFootnotes: Boolean = false,
var speed: Int = 100,

// Bookmark related metadata.
// Restoring bookmark from widget uses this.
@Optional var bookId: String? = null,
@Optional var bookmarkWasCreated: Boolean? = null,
@Optional @Serializable(with=VerseRangeSerializer::class) var verseRange: VerseRange? = null
var bookId: String? = null,
var bookmarkWasCreated: Boolean? = null,
@Serializable(with=VerseRangeSerializer::class) var verseRange: VerseRange? = null
) {
companion object {

Expand All @@ -84,17 +84,17 @@ data class PlaybackSettings (
data class SpeakSettingsChangedEvent(val speakSettings: SpeakSettings, val updateBookmark: Boolean = false, val sleepTimerChanged: Boolean = false)

@Serializable
data class SpeakSettings(@Optional var synchronize: Boolean = true,
@Optional var replaceDivineName: Boolean = false,
@Optional var autoBookmark: Boolean = false,
@Optional var restoreSettingsFromBookmarks: Boolean = false,
@Optional var playbackSettings: PlaybackSettings = PlaybackSettings(),
@Optional var sleepTimer: Int = 0,
@Optional var lastSleepTimer: Int = 10,
data class SpeakSettings(var synchronize: Boolean = true,
var replaceDivineName: Boolean = false,
var autoBookmark: Boolean = false,
var restoreSettingsFromBookmarks: Boolean = false,
var playbackSettings: PlaybackSettings = PlaybackSettings(),
var sleepTimer: Int = 0,
var lastSleepTimer: Int = 10,
// General book speak settings
@Optional var queue: Boolean = true,
@Optional var repeat: Boolean = false,
@Optional var numPagesToSpeakId: Int = 0
var queue: Boolean = true,
var repeat: Boolean = false,
var numPagesToSpeakId: Int = 0
) {
enum class RewindAmount {NONE, ONE_VERSE, TEN_VERSES, SMART}

Expand Down
Loading

0 comments on commit 9004293

Please sign in to comment.