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">