Bimba.git

commit e484116e157119383e2af23bb4b9d3220769fa2d

Author: Adam Pioterek <adam.pioterek@protonmail.ch>

proper singletons -> favourite renaming

%!v(PANIC=String method: strings: negative Repeat count)


diff --git a/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt b/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt
index fad8a2b196fa98dd6cd2127896847e578a146206..39d9ee191aac7f3939939acebd03bcc59e93413e 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt
@@ -27,7 +27,7 @@             if (!isNetworkAvailable(this)) {
                 sendResult("no connectivity")
                 return
             }
-            val metadataUrl = URL("https://adamsprogs.ml/w/_media/programmes/bimba/timetable.meta")
+            val metadataUrl = URL("https://adamsprogs.ml/w/_media/programmes/bimba/timetable.db.meta")
             var httpCon = metadataUrl.openConnection() as HttpURLConnection
             if (httpCon.responseCode != HttpURLConnection.HTTP_OK)
                 throw Exception("Failed to connect")




diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt
index 6f068964f6951e6093281d7a1e485bb823890c97..bc53abdac252f6feb1e7314e3d3ca03a76691871 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt
@@ -15,6 +15,7 @@ import android.support.v4.widget.*
 import android.support.v7.widget.*
 import android.util.Log
 import android.view.inputmethod.InputMethodManager
+import android.widget.Toast
 import ml.adamsprogs.bimba.*
 
 //todo refresh every 15s
@@ -75,8 +76,9 @@                     view = View(context)
                 }
                 imm.hideSoftInputFromWindow(view.windowToken, 0)
                 intent = Intent(context, StopActivity::class.java)
-                intent.putExtra("stopId", (searchSuggestion as StopSuggestion).id)
-                intent.putExtra("stopSymbol", (searchSuggestion as StopSuggestion).symbol)
+                searchSuggestion as StopSuggestion
+                intent.putExtra("stopId", searchSuggestion.id)
+                intent.putExtra("stopSymbol", searchSuggestion.symbol)
                 startActivity(intent)
             }
 
@@ -100,7 +102,7 @@         //todo searchView.attachNavigationDrawerToMenuButton(mDrawerLayout)
     }
 
     private fun prepareFavourites() {
-        favourites = FavouriteStorage(context)
+        favourites = FavouriteStorage.getFavouriteStorage(context)
         val layoutManager = LinearLayoutManager(context)
         favouritesList = findViewById(R.id.favouritesList) as RecyclerView
         favouritesList.adapter = FavouritesAdapter(context, favourites.favouritesList, this)
@@ -108,7 +110,7 @@         favouritesList.layoutManager = layoutManager
     }
 
     private fun getStops() {
-        timetable = getTimetable(this)
+        timetable = Timetable.getTimetable(this)
         stops = timetable.getStops()
     }
 
@@ -144,7 +146,7 @@     }
 
     override fun onResume() {
         super.onResume()
-        favourites.refresh()
+        Toast.makeText(this, "Resume", Toast.LENGTH_LONG).show()
         favouritesList.adapter = FavouritesAdapter(context, favourites.favouritesList, this)
         favouritesList.adapter.notifyDataSetChanged()
     }
@@ -188,7 +190,6 @@     override fun edit(name: String): Boolean {
         val intent = Intent(this, EditFavouriteActivity::class.java)
         intent.putExtra("favourite", favourites.favourites[name])
         startActivity(intent)
-        favourites.refresh()
         (favouritesList.adapter as FavouritesAdapter).favourites = favourites.favouritesList
         favouritesList.adapter.notifyDataSetChanged()
         return true




diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/EditFavouriteActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/EditFavouriteActivity.kt
index b8380a37e4ce6a65d4b9f79882aa9f9139cf7c99..d5c8a9bf95ccb2c8fb2c0f4c430455abd585f79f 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/activities/EditFavouriteActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/activities/EditFavouriteActivity.kt
@@ -10,26 +10,42 @@ import android.widget.EditText
 import ml.adamsprogs.bimba.R
 import ml.adamsprogs.bimba.models.Favourite
 import ml.adamsprogs.bimba.models.FavouriteEditRowAdapter
+import ml.adamsprogs.bimba.models.FavouriteStorage
 
 class EditFavouriteActivity : AppCompatActivity() {
 
+    lateinit var favourites: FavouriteStorage
+    lateinit var nameEdit: EditText
+    var favourite: Favourite? = null
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_edit_favourite)
 
-        val favourite = intent.getParcelableExtra<Favourite>("favourite")
+        favourite = intent.getParcelableExtra<Favourite>("favourite")
+        if (favourite == null)
+            finish()
+        favourites = FavouriteStorage.getFavouriteStorage(this)
 
         val recyclerView = findViewById(R.id.favourite_edit_list) as RecyclerView?
         val layoutManager = LinearLayoutManager(this)
         recyclerView!!.layoutManager = layoutManager
         val dividerItemDecoration = DividerItemDecoration(this, layoutManager.orientation)
         recyclerView.addItemDecoration(dividerItemDecoration)
-        recyclerView.adapter = FavouriteEditRowAdapter(this, favourite)
+        recyclerView.adapter = FavouriteEditRowAdapter(favourite!!)
         val toolbar = findViewById(R.id.toolbar) as Toolbar
         setSupportActionBar(toolbar)
-        supportActionBar?.title = getString(R.string.edit_favourite_title, favourite.name)
+        supportActionBar?.title = getString(R.string.edit_favourite_title, favourite!!.name)
+        nameEdit = findViewById(R.id.favourite_name_edit) as EditText
+        nameEdit.setText(favourite!!.name)
+    }
 
-        val nameEdit = findViewById(R.id.favourite_name_edit) as EditText
-        nameEdit.setText(favourite.name)
+    override fun onBackPressed() {
+        val oldName = favourite?.name
+        val newName = nameEdit.text.toString()
+        favourites.delete(oldName!!)
+        favourite?.name = newName
+        favourites.add(newName, favourite!!)
+        super.onBackPressed()
     }
 }




diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/SplashActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/SplashActivity.kt
index 91f260811253e612ba7d26f2d14570747932690a..aaa8ccb668a1bb08f3507cdc3ccb5537a1796c2e 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/activities/SplashActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/activities/SplashActivity.kt
@@ -4,7 +4,7 @@ import android.support.v7.app.AppCompatActivity
 import android.os.Bundle
 import android.content.Intent
 import android.database.sqlite.SQLiteCantOpenDatabaseException
-import ml.adamsprogs.bimba.models.getTimetable
+import ml.adamsprogs.bimba.models.Timetable
 
 
 class SplashActivity : AppCompatActivity() {
@@ -12,7 +12,7 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         try {
-            getTimetable(this)
+            Timetable.getTimetable(this)
             startActivity(Intent(this, DashActivity::class.java))
         } catch(e: SQLiteCantOpenDatabaseException) {
             startActivity(Intent(this, NoDbActivity::class.java))




diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/StopActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/StopActivity.kt
index ebdd6f4d74c1f8a06ebe87a7e5fc5f1d3ccab37a..0186293dd268fc39efc0b8f660528ff32ca06a72 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/activities/StopActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/activities/StopActivity.kt
@@ -49,7 +49,7 @@         createTimerTask()
 
         prepareOnDownloadListener()
 
-        timetable = getTimetable()
+        timetable = Timetable.getTimetable()
         supportActionBar?.title = timetable.getStopName(stopId) ?: "Stop"
 
         viewPager = findViewById(R.id.container) as ViewPager
@@ -67,7 +67,7 @@         scheduleRefresh()
 
         val fab = findViewById(R.id.fab) as FloatingActionButton
 
-        val favourites = FavouriteStorage(context)
+        val favourites = FavouriteStorage.getFavouriteStorage(context)
         if (!favourites.has(stopSymbol)) {
             fab.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_favourite_empty, this.theme))
         }




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
index c60f6c604ea2beafda6575d042f6e3943e82fa9c..5a81d32ba43c8f72ab348ce651e82bb217bf2aae 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
@@ -34,7 +34,7 @@     return filtered
 }
 
 fun createDepartures(stopId: String): HashMap<String, ArrayList<Departure>> {
-    val timetable = getTimetable()
+    val timetable = Timetable.getTimetable()
     val departures = timetable.getStopDepartures(stopId)
     val moreDepartures = timetable.getStopDepartures(stopId)
     val rolledDepartures = HashMap<String, ArrayList<Departure>>()




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt b/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt
index ed1e8b3182e8b86962679cf74c973054473e09c9..79e96cdf9859734f4181aab9597bfd2a8c812aef 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt
@@ -44,7 +44,7 @@         dest?.writeStringList(parcel)
         dest?.writeString(name)
     }
 
-    val timetable = getTimetable()
+    val timetable = Timetable.getTimetable()
     val size: Int
         get() = timetables.size
 




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteEditRowAdapter.kt b/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteEditRowAdapter.kt
index a1666423bf48e79f9154afa02d545a9d2d8b19b3..b46c27f10bf33ea327cd12ab933e81f578a5c289 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteEditRowAdapter.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteEditRowAdapter.kt
@@ -1,8 +1,6 @@
 package ml.adamsprogs.bimba.models
 
-import android.content.Context
 import android.support.v7.widget.RecyclerView
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -10,15 +8,15 @@ import android.widget.ImageView
 import android.widget.TextView
 import ml.adamsprogs.bimba.R
 
-class FavouriteEditRowAdapter(val context: Context, var favourite: Favourite) :
+class FavouriteEditRowAdapter(var favourite: Favourite) :
         RecyclerView.Adapter<FavouriteEditRowAdapter.ViewHolder>() {
     override fun getItemCount(): Int {
         return favourite.size
     }
 
     override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
-        val timetable = getTimetable()
-        val favourites = FavouriteStorage(context)
+        val timetable = Timetable.getTimetable()
+        val favourites = FavouriteStorage.getFavouriteStorage()
         val favouriteElement = timetable.getFavouriteElement(favourite.timetables[position]["stop"]!!,
                 favourite.timetables[position]["line"]!!)
         holder?.rowTextView?.text = favouriteElement




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteStorage.kt b/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteStorage.kt
index 970e2ad54c03a8a60f601be937903c1ed3016f0f..38b9d791c187ec18baa390442822d46c7216a61f 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteStorage.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/FavouriteStorage.kt
@@ -7,7 +7,22 @@ import com.google.gson.Gson
 import com.google.gson.JsonArray
 import com.google.gson.JsonObject
 
-class FavouriteStorage(val context: Context) {
+
+class FavouriteStorage private constructor(context: Context) {
+    companion object {
+        private var favouriteStorage: FavouriteStorage? = null
+        fun getFavouriteStorage(context: Context? = null): FavouriteStorage {
+            if (favouriteStorage == null) {
+                if (context == null)
+                    throw IllegalArgumentException("requested new storage context not given")
+                else {
+                    favouriteStorage = FavouriteStorage(context)
+                    return favouriteStorage as FavouriteStorage
+                }
+            } else
+                return favouriteStorage as FavouriteStorage
+        }
+    }
     val favourites = HashMap<String, Favourite>()
     val preferences: SharedPreferences = context.getSharedPreferences("ml.adamsprogs.bimba.prefs", Context.MODE_PRIVATE)
     val favouritesList: List<Favourite>
@@ -43,8 +58,18 @@             serialize()
         }
     }
 
+    fun add(name: String, favourite: Favourite) {
+        if (favourites[name] == null) {
+            favourites[name] = favourite
+            serialize()
+        }
+    }
+
     fun delete(name: String) {
-        favourites.remove(name)
+        Log.i("ROW", "Deleting $name")
+        Log.i("ROW", "$name is in favourites?: ${favourites.contains(name)}")
+        val b = favourites.remove(name)
+        Log.i("ROW", "deleted: $b")
         serialize()
     }
 




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt b/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt
index bf8d21faf6cccb40a3bbf0ac8155448e0dbaffd9..5a6dd7f77f03f0d8dfda60870f338da73911e40a 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt
@@ -7,33 +7,34 @@ import android.database.sqlite.SQLiteDatabase
 import android.database.sqlite.SQLiteDatabaseCorruptException
 import java.io.File
 
-private var timetable: Timetable? = null
+class Timetable private constructor() {
+    companion object {
+        private var timetable: Timetable? = null
 
-fun getTimetable(context: Context? = null, force: Boolean = false): Timetable {
-    if (timetable == null || force)
-        if (context != null) {
-            val db: SQLiteDatabase?
-            try {
-                db = SQLiteDatabase.openDatabase(File(context.filesDir, "timetable.db").path,
-                        null, SQLiteDatabase.OPEN_READONLY)
-            } catch(e: NoSuchFileException) {
-                throw SQLiteCantOpenDatabaseException("no such file")
-            } catch(e: SQLiteCantOpenDatabaseException) {
-                throw SQLiteCantOpenDatabaseException("cannot open db")
-            } catch(e: SQLiteDatabaseCorruptException) {
-                throw SQLiteCantOpenDatabaseException("db corrupt")
-            }
-            timetable = Timetable()
-            timetable!!.db = db
-            return timetable as Timetable
+        fun getTimetable(context: Context? = null, force: Boolean = false): Timetable {
+            if (timetable == null || force)
+                if (context != null) {
+                    val db: SQLiteDatabase?
+                    try {
+                        db = SQLiteDatabase.openDatabase(File(context.filesDir, "timetable.db").path,
+                                null, SQLiteDatabase.OPEN_READONLY)
+                    } catch(e: NoSuchFileException) {
+                        throw SQLiteCantOpenDatabaseException("no such file")
+                    } catch(e: SQLiteCantOpenDatabaseException) {
+                        throw SQLiteCantOpenDatabaseException("cannot open db")
+                    } catch(e: SQLiteDatabaseCorruptException) {
+                        throw SQLiteCantOpenDatabaseException("db corrupt")
+                    }
+                    timetable = Timetable()
+                    timetable!!.db = db
+                    return timetable as Timetable
+                }
+                else
+                    throw IllegalArgumentException("new timetable requested and no context given")
+            else
+                return timetable as Timetable
         }
-        else
-            throw IllegalArgumentException("new timetable requested and no context given")
-    else
-        return timetable as Timetable
-}
-
-class Timetable internal constructor() {
+    }
     lateinit var db: SQLiteDatabase
 
     init {




diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml
index 39e64d6980a8c1d7330ec2eb8172779cffd483af..6710f2bdd72d4724f2e75b95d1ff6d4233d56c80 100644
--- a/app/src/main/res/drawable/ic_delete.xml
+++ b/app/src/main/res/drawable/ic_delete.xml
@@ -4,6 +4,6 @@         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="?attr/colorControlNormal"
         android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
 </vector>




diff --git a/app/src/main/res/drawable/ic_more.xml b/app/src/main/res/drawable/ic_more.xml
index e9d756cad67783d7ac68687ef1d196ed887bbeba..6b9181cd8aa06a7397a477ae2bc040203b4af121 100644
--- a/app/src/main/res/drawable/ic_more.xml
+++ b/app/src/main/res/drawable/ic_more.xml
@@ -5,5 +5,5 @@         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
         android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/colorControlNormal"/>
 </vector>




diff --git a/app/src/main/res/drawable/ic_split.xml b/app/src/main/res/drawable/ic_split.xml
index 327e1d2f554eac9ed106caf94f45a9421e15fd22..bc49d952149fc8e785af02d8918b3b40c2ef3b8d 100644
--- a/app/src/main/res/drawable/ic_split.xml
+++ b/app/src/main/res/drawable/ic_split.xml
@@ -4,6 +4,6 @@         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="?attr/colorControlNormal"
         android:pathData="M14,4l2.29,2.29 -2.88,2.88 1.42,1.42 2.88,-2.88L20,10L20,4zM10,4L4,4v6l2.29,-2.29 4.71,4.7L11,20h2v-8.41l-5.29,-5.3z"/>
 </vector>




diff --git a/app/src/main/res/layout/row_favourite.xml b/app/src/main/res/layout/row_favourite.xml
index e1a3189141bc6f2d966cdb4088f4539ecd20a8c4..9c910b3c54a773d5b850cf5db7b73fa7ae6588b8 100644
--- a/app/src/main/res/layout/row_favourite.xml
+++ b/app/src/main/res/layout/row_favourite.xml
@@ -4,6 +4,7 @@     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:layout_margin="4dp"
     tools:layout_editor_absoluteX="8dp"
     tools:layout_editor_absoluteY="128dp">