93 lines
2.6 KiB
Kotlin
93 lines
2.6 KiB
Kotlin
package jp.juggler.subwaytooter.api.entity
|
|
|
|
import android.content.ContentValues
|
|
import android.content.Intent
|
|
import android.database.Cursor
|
|
import android.os.Bundle
|
|
import jp.juggler.util.getStringOrNull
|
|
import jp.juggler.util.notZero
|
|
import org.json.JSONObject
|
|
|
|
class EntityId(val x : String) : Comparable<EntityId> {
|
|
|
|
companion object {
|
|
|
|
// IDのパース失敗時にエラー扱いしたくない場合に使われる
|
|
internal val DEFAULT = EntityId("<>default")
|
|
|
|
// マストドンのアカウント作成APIで作成した直後は「IDが発行されてない」状態になる
|
|
internal val CONFIRMING = EntityId("<>confirming")
|
|
|
|
fun mayDefault(x : String?) = if(x==null) DEFAULT else EntityId(x)
|
|
|
|
fun mayNull(x : String?) = if(x==null) null else EntityId(x)
|
|
|
|
fun String.decode() : EntityId? {
|
|
if(this.isEmpty()) return null
|
|
// first character is 'L' for EntityIdLong, 'S' for EntityIdString.
|
|
// integer id is removed at https://source.joinmastodon.org/mastodon/docs/commit/e086d478afa140e7b0b9a60183655315966ad9ff
|
|
return EntityId(this.substring(1))
|
|
}
|
|
|
|
fun from(intent : Intent?, key : String) =
|
|
intent?.getStringExtra(key)?.decode()
|
|
|
|
fun from(bundle : Bundle?, key : String) =
|
|
bundle?.getString(key)?.decode()
|
|
|
|
// 内部保存データのデコード用。APIレスポンスのパースに使ってはいけない
|
|
fun from(data : JSONObject?, key : String) : EntityId? {
|
|
val o = data?.opt(key)
|
|
if(o is Long) return EntityId(o.toString())
|
|
return (o as? String)?.decode()
|
|
}
|
|
|
|
fun from(cursor : Cursor, key : String) =
|
|
cursor.getStringOrNull(key)?.decode()
|
|
}
|
|
|
|
private fun encode() : String {
|
|
val prefix = 'S'
|
|
return "$prefix$this"
|
|
}
|
|
|
|
fun putTo(data : Intent, key : String) : Intent = data.putExtra(key, encode())
|
|
|
|
fun putTo(bundle : Bundle, key : String) = bundle.putString(key, encode())
|
|
|
|
fun putTo(data : JSONObject, key : String) : JSONObject = data.put(key, encode())
|
|
|
|
fun putTo(cv : ContentValues, key : String) {
|
|
cv.put(key, encode())
|
|
}
|
|
|
|
val isDefault : Boolean
|
|
get() = this == DEFAULT
|
|
|
|
val notDefault : Boolean
|
|
get() = this != DEFAULT
|
|
|
|
override fun compareTo(other : EntityId) : Int =
|
|
(x.length - other.x.length).notZero() ?: x.compareTo(other.x)
|
|
|
|
override fun equals(other : Any?) : Boolean = if(other is EntityId) {
|
|
x == other.x
|
|
} else {
|
|
false
|
|
}
|
|
|
|
override fun hashCode() = x.hashCode()
|
|
|
|
override fun toString() = x
|
|
|
|
}
|
|
|
|
fun EntityId?.putMayNull(cv : ContentValues, key : String) {
|
|
if(this == null) {
|
|
cv.putNull(key)
|
|
} else {
|
|
this.putTo(cv, key)
|
|
}
|
|
}
|
|
|