diff --git a/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt b/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt --- a/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt +++ b/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt @@ -3,9 +3,11 @@ import android.content.Intent import android.os.Bundle import android.util.Log +import android.util.TypedValue import android.view.View import android.widget.ImageButton import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter @@ -21,10 +23,12 @@ private lateinit var viewPager : ViewPager2 private lateinit var btnForward: ImageButton private lateinit var btnBackward: ImageButton + private lateinit var closeBottomButton: ImageButton private var restartMain = true + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_intro) @@ -32,6 +36,7 @@ viewPager = findViewById(R.id.viewPager) btnBackward = findViewById(R.id.btnPrevious) btnForward = findViewById(R.id.btnNext) + closeBottomButton = findViewById(R.id.btnCompactClose) val extras = intent.extras if(extras!=null){ @@ -56,6 +61,11 @@ btnBackward.setOnClickListener { viewPager.setCurrentItem(viewPager.currentItem-1, true) } + /*closeBottomButton.setOnClickListener { + closeIntroduction() + } + + */ viewPager.registerOnPageChangeCallback(object : OnPageChangeCallback() { @@ -67,12 +77,30 @@ } if(position == NUM_ITEMS-1){ btnForward.visibility = View.INVISIBLE - } else{ - btnForward.visibility = View.VISIBLE + closeBottomButton.visibility = View.VISIBLE + }else if(position == NUM_ITEMS-2){ + if(closeBottomButton.visibility == View.VISIBLE) { + closeBottomButton.visibility = View.INVISIBLE + btnForward.visibility = View.VISIBLE + } + //btnForward.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.arrow_forward_white, null)) + //btnForward.setBackgroundColor(ResourcesCompat.getColor(resources,R.attr.colorAccent, theme)) + /*val + GET THE COLOR VALUE OF THE THEMER + colo = TypedValue() + theme.resolveAttribute(R.attr.colorAccent,colo, true) + btnForward.backgroundTintList //(colo.data) + + */ } } + }) + + closeBottomButton.setOnClickListener { + closeIntroduction() + } } diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/RouteAdapter.kt b/app/src/main/java/it/reyboz/bustorino/adapters/RouteAdapter.kt --- a/app/src/main/java/it/reyboz/bustorino/adapters/RouteAdapter.kt +++ b/app/src/main/java/it/reyboz/bustorino/adapters/RouteAdapter.kt @@ -11,11 +11,11 @@ import java.lang.ref.WeakReference class RouteAdapter(val routes: List, - click: onItemClick, - private val layoutId: Int = R.layout.line_title_header) : + click: ItemClicker, + private val layoutId: Int = R.layout.line_title_header) : RecyclerView.Adapter() { - val clickreference: WeakReference + val clickreference: WeakReference init { clickreference = WeakReference(click) } @@ -53,7 +53,7 @@ } } - fun interface onItemClick{ + fun interface ItemClicker{ fun onRouteItemClicked(gtfsRoute: GtfsRoute) } } \ No newline at end of file diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/RouteOnlyLineAdapter.kt b/app/src/main/java/it/reyboz/bustorino/adapters/RouteOnlyLineAdapter.kt --- a/app/src/main/java/it/reyboz/bustorino/adapters/RouteOnlyLineAdapter.kt +++ b/app/src/main/java/it/reyboz/bustorino/adapters/RouteOnlyLineAdapter.kt @@ -7,10 +7,18 @@ import androidx.recyclerview.widget.RecyclerView import it.reyboz.bustorino.R import it.reyboz.bustorino.backend.Palina +import java.lang.ref.WeakReference -class RouteOnlyLineAdapter (val routeNames: List) : +class RouteOnlyLineAdapter (val routeNames: List, + onItemClick: OnClick?) : RecyclerView.Adapter() { + + private val clickreference: WeakReference? + init { + clickreference = if(onItemClick!=null) WeakReference(onItemClick) else null + } + /** * Provide a reference to the type of views that you are using * (custom ViewHolder) @@ -23,7 +31,7 @@ textView = view.findViewById(R.id.routeBallID) } } - constructor(palina: Palina, showOnlyEmpty: Boolean): this(palina.routesNamesWithNoPassages) + constructor(palina: Palina, showOnlyEmpty: Boolean): this(palina.routesNamesWithNoPassages, null) // Create new views (invoked by the layout manager) override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { @@ -40,9 +48,15 @@ // Get element from your dataset at this position and replace the // contents of the view with that element viewHolder.textView.text = routeNames[position] + viewHolder.itemView.setOnClickListener{ + clickreference?.get()?.onItemClick(position, routeNames[position]) + } } // Return the size of your dataset (invoked by the layout manager) override fun getItemCount() = routeNames.size + fun interface OnClick{ + fun onItemClick(index: Int, name: String) + } } diff --git a/app/src/main/java/it/reyboz/bustorino/data/GtfsRepository.kt b/app/src/main/java/it/reyboz/bustorino/data/GtfsRepository.kt --- a/app/src/main/java/it/reyboz/bustorino/data/GtfsRepository.kt +++ b/app/src/main/java/it/reyboz/bustorino/data/GtfsRepository.kt @@ -35,4 +35,8 @@ fun getAllRoutes(): LiveData>{ return gtfsDao.getAllRoutes() } + + fun getRouteFromGtfsId(gtfsId: String): LiveData{ + return gtfsDao.getRouteByGtfsID(gtfsId) + } } \ No newline at end of file diff --git a/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java b/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java --- a/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java +++ b/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java @@ -19,12 +19,16 @@ import android.content.Context; import android.content.SharedPreferences; +import android.util.Log; import it.reyboz.bustorino.R; import static android.content.Context.MODE_PRIVATE; import androidx.preference.PreferenceManager; +import java.util.HashSet; +import java.util.Set; + /** * Static class for commonly used SharedPreference operations */ @@ -33,6 +37,8 @@ public static final String PREF_GTFS_DB_VERSION = "gtfs_db_version"; public static final String PREF_INTRO_ACTIVITY_RUN ="pref_intro_activity_run"; + public static final String PREF_FAVORITE_LINES = "pref_favorite_lines"; + public static SharedPreferences getMainSharedPreferences(Context context){ return context.getSharedPreferences(context.getString(R.string.mainSharedPreferences), MODE_PRIVATE); } @@ -59,4 +65,27 @@ final SharedPreferences pref = getMainSharedPreferences(con); return pref.getBoolean(PREF_INTRO_ACTIVITY_RUN, false); } + + public static boolean addOrRemoveLineToFavorites(Context con, String gtfsLineId, boolean addToFavorites){ + final SharedPreferences pref = getMainSharedPreferences(con); + final HashSet favorites = new HashSet<>(pref.getStringSet(PREF_FAVORITE_LINES, new HashSet<>())); + boolean modified = true; + if(addToFavorites) + favorites.add(gtfsLineId); + else if(favorites.contains(gtfsLineId)) + favorites.remove(gtfsLineId); + else + modified = false; // we are not changing anything + if(modified) { + final SharedPreferences.Editor editor = pref.edit(); + editor.putStringSet(PREF_FAVORITE_LINES, favorites); + editor.apply(); + } + return modified; + } + + public static HashSet getFavoritesLinesGtfsIDs(Context con){ + final SharedPreferences pref = getMainSharedPreferences(con); + return new HashSet<>(pref.getStringSet(PREF_FAVORITE_LINES, new HashSet<>())); + } } diff --git a/app/src/main/java/it/reyboz/bustorino/data/gtfs/GtfsDBDao.kt b/app/src/main/java/it/reyboz/bustorino/data/gtfs/GtfsDBDao.kt --- a/app/src/main/java/it/reyboz/bustorino/data/gtfs/GtfsDBDao.kt +++ b/app/src/main/java/it/reyboz/bustorino/data/gtfs/GtfsDBDao.kt @@ -26,8 +26,8 @@ @Query("SELECT * FROM "+GtfsRoute.DB_TABLE) fun getAllRoutes() : LiveData> - @Query("SELECT * FROM ${GtfsRoute.DB_TABLE} WHERE ${GtfsRoute.COL_ROUTE_ID} IN (:routeGtfsIds)") - fun getRoutesByIDs(routeGtfsIds: List): LiveData> + @Query("SELECT * FROM ${GtfsRoute.DB_TABLE} WHERE ${GtfsRoute.COL_ROUTE_ID} LIKE :gtfsId") + fun getRouteByGtfsID(gtfsId: String) : LiveData @Query("SELECT "+GtfsTrip.COL_TRIP_ID+" FROM "+GtfsTrip.DB_TABLE) diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.java @@ -409,7 +409,7 @@ final ArrayList routesWithNoPassages = lastUpdatedPalina.getRoutesNamesWithNoPassages(); Collections.sort(routesWithNoPassages, new LinesNameSorter()); - noArrivalsAdapter = new RouteOnlyLineAdapter(routesWithNoPassages); + noArrivalsAdapter = new RouteOnlyLineAdapter(routesWithNoPassages, null); if(noArrivalsRecyclerView!=null){ noArrivalsRecyclerView.setAdapter(noArrivalsAdapter); //hide the views if there are no empty routes diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/IntroFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/IntroFragment.kt --- a/app/src/main/java/it/reyboz/bustorino/fragments/IntroFragment.kt +++ b/app/src/main/java/it/reyboz/bustorino/fragments/IntroFragment.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Button +import android.widget.ImageButton import android.widget.ImageView import android.widget.TextView import androidx.fragment.app.Fragment @@ -33,6 +34,7 @@ private lateinit var textView: TextView + private lateinit var listener: IntroListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -88,6 +90,7 @@ 6-> { setImageBitmap(imageHolder,R.drawable.tuto_menu) setTextHtmlDescription(R.string.tutorial_menu) + //this is the cheapest trick ever lol val closeButton = root.findViewById