diff --git a/app/build.gradle b/app/build.gradle index 269d5e217..a3a7a54f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -125,7 +125,6 @@ dependencies { implementation 'com.github.omadahealth:swipy:1.2.3' implementation 'de.cketti.library.changelog:ckchangelog:1.2.2' implementation 'com.google.android:flexbox:0.3.2' - implementation 'com.mikepenz:materialdrawer:6.1.1' implementation 'com.mikepenz:aboutlibraries:6.2.0' implementation "com.mikepenz:fastadapter:$fastadapterVersion" implementation "com.mikepenz:fastadapter-commons:$fastadapterVersion" @@ -162,4 +161,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' androidTestImplementation('tools.fastlane:screengrab:2.1.1') kaptAndroidTestDebug "com.google.dagger:dagger-compiler:$daggerVersion" + + implementation 'androidx.core:core-splashscreen:1.0.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e123f5379..98c192585 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,9 +46,9 @@ + android:windowSoftInputMode="stateHidden|adjustPan" + android:theme="@style/Theme.App.Starting"> @@ -68,18 +68,18 @@ + android:parentActivityName="de.grobox.transportr.map.MapActivity" /> + android:theme="@style/AppTheme.MapFullscreen" /> loadMoreDepartures(direction != TOP)); diff --git a/app/src/main/java/de/grobox/transportr/favorites/locations/SpecialLocationFragment.kt b/app/src/main/java/de/grobox/transportr/favorites/locations/SpecialLocationFragment.kt index c32d4e169..721184f3a 100644 --- a/app/src/main/java/de/grobox/transportr/favorites/locations/SpecialLocationFragment.kt +++ b/app/src/main/java/de/grobox/transportr/favorites/locations/SpecialLocationFragment.kt @@ -19,18 +19,21 @@ package de.grobox.transportr.favorites.locations +import android.app.Activity import android.content.DialogInterface +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager.LayoutParams +import android.view.inputmethod.InputMethodManager import androidx.annotation.StringRes import androidx.fragment.app.DialogFragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import com.mikepenz.materialize.util.KeyboardUtil import de.grobox.transportr.AppComponent import de.grobox.transportr.R import de.grobox.transportr.TransportrApplication @@ -43,6 +46,7 @@ import de.grobox.transportr.settings.SettingsManager import javax.annotation.ParametersAreNonnullByDefault import javax.inject.Inject + @ParametersAreNonnullByDefault abstract class SpecialLocationFragment : DialogFragment(), LocationView.LocationViewListener { @@ -62,10 +66,6 @@ abstract class SpecialLocationFragment : DialogFragment(), LocationView.Location override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) inject((activity!!.application as TransportrApplication).component) - setStyle( - STYLE_NO_TITLE, - R.style.SetHomeDialogTheme - ) } protected abstract fun inject(component: AppComponent) @@ -74,6 +74,8 @@ abstract class SpecialLocationFragment : DialogFragment(), LocationView.Location override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val v = inflater.inflate(R.layout.fragment_special_location, container) + dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + // Initialize LocationView loc = v.findViewById(R.id.location_input) loc.setHint(hint) @@ -109,7 +111,8 @@ abstract class SpecialLocationFragment : DialogFragment(), LocationView.Location } override fun onCancel(dialog: DialogInterface) { - KeyboardUtil.hideKeyboard(activity) + val imm = activity?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager? + imm?.hideSoftInputFromWindow(requireActivity().currentFocus?.windowToken, 0) } override fun onLocationItemClick(loc: WrapLocation, type: FavLocationType) { diff --git a/app/src/main/java/de/grobox/transportr/locations/LocationView.kt b/app/src/main/java/de/grobox/transportr/locations/LocationView.kt index ae502908c..c6c9807e8 100644 --- a/app/src/main/java/de/grobox/transportr/locations/LocationView.kt +++ b/app/src/main/java/de/grobox/transportr/locations/LocationView.kt @@ -38,6 +38,7 @@ import android.view.View import android.view.View.OnFocusChangeListener import android.view.inputmethod.InputMethodManager import android.widget.* +import androidx.core.content.res.ResourcesCompat import com.google.common.base.Strings.isNullOrEmpty import de.grobox.transportr.R import de.grobox.transportr.data.locations.FavoriteLocation @@ -142,6 +143,11 @@ open class LocationView @JvmOverloads constructor(context: Context, attrs: Attri val location: AutoCompleteTextView = view.findViewById(R.id.location) internal val progress: ProgressBar = view.findViewById(R.id.progress) val clear: ImageButton = view.findViewById(R.id.clearButton) + + init { + val drawable = ResourcesCompat.getDrawable(view.context.resources, R.drawable.shape_location_dropdown, null) + location.setDropDownBackgroundDrawable(drawable) + } } /* State Saving and Restoring */ diff --git a/app/src/main/java/de/grobox/transportr/map/DrawerActivity.kt b/app/src/main/java/de/grobox/transportr/map/DrawerActivity.kt deleted file mode 100644 index e41367845..000000000 --- a/app/src/main/java/de/grobox/transportr/map/DrawerActivity.kt +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Transportr - * - * Copyright (c) 2013 - 2021 Torsten Grote - * - * This program is Free Software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package de.grobox.transportr.map - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import androidx.annotation.DrawableRes -import androidx.annotation.StringRes -import androidx.core.app.ActivityCompat -import androidx.core.app.ActivityOptionsCompat.makeScaleUpAnimation -import androidx.recyclerview.widget.RecyclerView.NO_POSITION -import android.view.View -import com.mikepenz.materialdrawer.AccountHeader -import com.mikepenz.materialdrawer.AccountHeaderBuilder -import com.mikepenz.materialdrawer.Drawer -import com.mikepenz.materialdrawer.DrawerBuilder -import com.mikepenz.materialdrawer.model.DividerDrawerItem -import com.mikepenz.materialdrawer.model.PrimaryDrawerItem -import com.mikepenz.materialdrawer.model.ProfileDrawerItem -import com.mikepenz.materialize.util.KeyboardUtil -import de.grobox.transportr.R -import de.grobox.transportr.TransportrActivity -import de.grobox.transportr.about.AboutActivity -import de.grobox.transportr.about.ContributorsActivity -import de.grobox.transportr.networks.PickTransportNetworkActivity -import de.grobox.transportr.networks.TransportNetwork -import de.grobox.transportr.settings.SettingsActivity -import de.grobox.transportr.ui.TransportrChangeLog - -internal abstract class DrawerActivity : TransportrActivity() { - - private lateinit var drawer: Drawer - private lateinit var accountHeader: AccountHeader - - protected fun setupDrawer(savedInstanceState: Bundle?) { - // Accounts aka TransportNetworks - accountHeader = AccountHeaderBuilder() - .withActivity(this) - .withHeaderBackground(R.drawable.account_header_background) - .withDividerBelowHeader(true) - .withSelectionListEnabled(false) - .withThreeSmallProfileImages(true) - .withOnAccountHeaderListener { view, profile, currentProfile -> - if (currentProfile) { - openPickNetworkProviderActivity(view) - true - } else if (profile != null && profile is ProfileDrawerItem) { - val network = profile.tag as TransportNetwork - manager.setTransportNetwork(network) - false - } else { - false - } - } - .withOnAccountHeaderSelectionViewClickListener { view, _ -> - openPickNetworkProviderActivity(view) - true - } - .withSavedInstance(savedInstanceState) - .build() - - // Drawer - drawer = DrawerBuilder() - .withActivity(this) - .withAccountHeader(accountHeader) - .addDrawerItems( - getDrawerItem(R.string.drawer_settings, R.drawable.ic_action_settings) { - val intent = Intent(this, SettingsActivity::class.java) - startActivity(intent) - }, - DividerDrawerItem(), - getDrawerItem(R.string.drawer_changelog, R.drawable.ic_action_changelog) { - TransportrChangeLog(this, settingsManager).fullLogDialog.show() - }, - getDrawerItem(R.string.drawer_contributors, R.drawable.ic_people) { - val intent = Intent(this, ContributorsActivity::class.java) - startActivity(intent) - }, - getDrawerItem(R.string.drawer_report_issue, R.drawable.ic_bug_report) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.bug_tracker))) - startActivity(intent) - }, - getDrawerItem(R.string.drawer_about, R.drawable.ic_action_about) { - val intent = Intent(this, AboutActivity::class.java) - startActivity(intent) - } - ) - .withOnDrawerListener(object : Drawer.OnDrawerListener { - override fun onDrawerOpened(drawerView: View) { - KeyboardUtil.hideKeyboard(this@DrawerActivity) - } - - override fun onDrawerClosed(drawerView: View) {} - - override fun onDrawerSlide(drawerView: View, slideOffset: Float) {} - }) - .withFireOnInitialOnClick(false) - .withShowDrawerOnFirstLaunch(false) - .withSavedInstance(savedInstanceState) - .withSelectedItem(NO_POSITION.toLong()) - .build() - - // add transport networks to header - addAccounts() - } - - private fun getDrawerItem(@StringRes name: Int, @DrawableRes icon: Int, onClick: () -> Unit): PrimaryDrawerItem { - return PrimaryDrawerItem() - .withName(name) - .withIcon(icon) - .withIconTintingEnabled(true) - .withSelectable(false) - .withOnDrawerItemClickListener { _, _, _ -> - closeDrawer() - onClick.invoke() - return@withOnDrawerItemClickListener true - } - } - - private fun addAccounts() { - manager.transportNetwork.value?.let { addAccountItem(it) } - manager.getTransportNetwork(2)?.let { addAccountItem(it) } - manager.getTransportNetwork(3)?.let { addAccountItem(it) } - } - - private fun addAccountItem(network: TransportNetwork) { - val item = ProfileDrawerItem() - .withName(network.getName(this)) - .withEmail(network.getDescription(this)) - .withIcon(network.logo) - .withTag(network) - accountHeader.addProfile(item, accountHeader.profiles.size) - } - - private fun openPickNetworkProviderActivity(view: View) { - val intent = Intent(this, PickTransportNetworkActivity::class.java) - val options = makeScaleUpAnimation(view, 0, 0, 0, 0) - ActivityCompat.startActivity(this, intent, options.toBundle()) - } - - protected fun openDrawer() { - drawer.openDrawer() - } - - protected fun closeDrawer() { - drawer.closeDrawer() - } - -} diff --git a/app/src/main/java/de/grobox/transportr/map/GpsMapFragment.kt b/app/src/main/java/de/grobox/transportr/map/GpsMapFragment.kt index 2a203cb5f..bbc5a7f2d 100644 --- a/app/src/main/java/de/grobox/transportr/map/GpsMapFragment.kt +++ b/app/src/main/java/de/grobox/transportr/map/GpsMapFragment.kt @@ -31,7 +31,6 @@ import android.view.ViewGroup import android.widget.Toast import androidx.annotation.CallSuper import androidx.annotation.RequiresPermission -import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.google.android.material.floatingactionbutton.FloatingActionButton import com.mapbox.mapboxsdk.location.LocationComponent diff --git a/app/src/main/java/de/grobox/transportr/map/MapActivity.java b/app/src/main/java/de/grobox/transportr/map/MapActivity.java index 4fcaddc48..ff4330fdc 100644 --- a/app/src/main/java/de/grobox/transportr/map/MapActivity.java +++ b/app/src/main/java/de/grobox/transportr/map/MapActivity.java @@ -19,16 +19,23 @@ package de.grobox.transportr.map; +import android.app.Activity; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.VmPolicy; +import android.view.MenuItem; import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.TextView; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.navigation.NavigationView; import com.mapbox.mapboxsdk.geometry.LatLng; import javax.annotation.ParametersAreNonnullByDefault; @@ -36,16 +43,25 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.core.splashscreen.SplashScreen; +import androidx.drawerlayout.widget.DrawerLayout; import androidx.lifecycle.ViewModelProvider; import de.grobox.transportr.BuildConfig; import de.grobox.transportr.R; +import de.grobox.transportr.TransportrActivity; +import de.grobox.transportr.about.AboutActivity; +import de.grobox.transportr.about.ContributorsActivity; import de.grobox.transportr.data.locations.FavoriteLocation.FavLocationType; import de.grobox.transportr.locations.LocationFragment; import de.grobox.transportr.locations.LocationView; import de.grobox.transportr.locations.LocationView.LocationViewListener; import de.grobox.transportr.locations.WrapLocation; +import de.grobox.transportr.networks.PickTransportNetworkActivity; import de.grobox.transportr.networks.TransportNetwork; +import de.grobox.transportr.settings.SettingsActivity; import de.grobox.transportr.ui.TransportrChangeLog; +import de.grobox.transportr.utils.FullScreenUtil; import de.grobox.transportr.utils.OnboardingBuilder; import static android.content.Intent.ACTION_VIEW; @@ -61,7 +77,7 @@ import static uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.STATE_FOCAL_PRESSED; @ParametersAreNonnullByDefault -public class MapActivity extends DrawerActivity implements LocationViewListener { +public class MapActivity extends TransportrActivity implements LocationViewListener, NavigationView.OnNavigationItemSelectedListener { @Inject ViewModelProvider.Factory viewModelFactory; @@ -74,14 +90,23 @@ public class MapActivity extends DrawerActivity implements LocationViewListener @Override public void onCreate(@Nullable Bundle savedInstanceState) { + SplashScreen.installSplashScreen(this); super.onCreate(savedInstanceState); if (BuildConfig.DEBUG) enableStrictMode(); getComponent().inject(this); setContentView(R.layout.activity_map); - setupDrawer(savedInstanceState); + setupDrawer(); + FullScreenUtil.Companion.drawBehindStatusbar(this); + FullScreenUtil.Companion.applyTopInset(findViewById(R.id.searchCardView), 16); View menu = findViewById(R.id.menu); - menu.setOnClickListener(view -> openDrawer()); + menu.setOnClickListener(view -> { + InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); + View currentFocus = getCurrentFocus(); + if (currentFocus != null) imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0); + DrawerLayout drawer = findViewById(R.id.drawerLayout); + drawer.open(); + }); search = findViewById(R.id.search); search.setLocationViewListener(this); @@ -161,6 +186,54 @@ private void onTransportNetworkChanged(TransportNetwork network) { } } + private void setupDrawer() { + NavigationView navigationView = findViewById(R.id.navigationView); + navigationView.setNavigationItemSelectedListener(this); + View header = navigationView.getHeaderView(0); + TransportNetwork network = manager.getTransportNetwork().getValue(); + header.setOnClickListener(view -> { + openPickNetworkProviderActivity(); + }); + if (network != null) { + TextView title = header.findViewById(R.id.network_name); + TextView description = header.findViewById(R.id.network_description); + ImageView image = header.findViewById(R.id.network_image); + title.setText(network.getName(this)); + description.setText(network.getDescription(this)); + image.setImageResource(network.getLogo()); + } + TransportNetwork networkTwo = manager.getTransportNetwork(2); + TransportNetwork networkThree = manager.getTransportNetwork(3); + + if (networkTwo != null) { + ImageView image = header.findViewById(R.id.network_image_two); + image.setImageResource(networkTwo.getLogo()); + image.setOnClickListener(view -> { + manager.setTransportNetwork(networkTwo); + closeDrawer(); + }); + } + + if (networkThree != null) { + ImageView image = header.findViewById(R.id.network_image_three); + image.setImageResource(networkThree.getLogo()); + image.setOnClickListener(view -> { + manager.setTransportNetwork(networkThree); + closeDrawer(); + }); + } + } + + private void closeDrawer() { + DrawerLayout drawer = findViewById(R.id.drawerLayout); + drawer.close(); + } + + private void openPickNetworkProviderActivity() { + Intent intent = new Intent(this, PickTransportNetworkActivity.class); + ActivityCompat.startActivity(this, intent, null); + } + @Override public void onLocationItemClick(final WrapLocation loc, FavLocationType type) { viewModel.selectLocation(loc); @@ -235,7 +308,7 @@ protected void onNewIntent(Intent intent) { private void checkAndShowChangelog() { TransportrChangeLog cl = new TransportrChangeLog(this, getSettingsManager()); if (cl.isFirstRun() && !cl.isFirstRunEver()) { - cl.getLogDialog().show(); + cl.getMaterialDialog(cl.isFirstRunEver()).show(); } } @@ -251,4 +324,31 @@ private void enableStrictMode() { StrictMode.setVmPolicy(vmPolicy.build()); } + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.settings: { + startActivity(new Intent(this, SettingsActivity.class)); + break; + } + case R.id.changelog: { + new TransportrChangeLog(this, settingsManager).getMaterialDialog(true).show(); + break; + } + case R.id.about: { + startActivity(new Intent(this, AboutActivity.class)); + break; + } + case R.id.contributors: { + startActivity(new Intent(this, ContributorsActivity.class)); + break; + } + case R.id.bug_report: { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.bug_tracker)))); + break; + } + } + closeDrawer(); + return true; + } } diff --git a/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.kt b/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.kt index e2552bc78..99c6316e0 100644 --- a/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.kt +++ b/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.kt @@ -24,8 +24,8 @@ import android.os.Bundle import android.os.PersistableBundle import android.view.MenuItem import android.view.View -import android.view.View.GONE import android.view.View.VISIBLE +import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.mikepenz.fastadapter.IItem @@ -61,7 +61,7 @@ class PickTransportNetworkActivity : TransportrActivity(), ISelectionListener(R.id.firstRunTextView).visibility = GONE + findViewById(R.id.firstRunTextView).text = "" } setResult(RESULT_CANCELED) diff --git a/app/src/main/java/de/grobox/transportr/settings/SettingsFragment.kt b/app/src/main/java/de/grobox/transportr/settings/SettingsFragment.kt index 57a0cc0ff..2b74a0a32 100644 --- a/app/src/main/java/de/grobox/transportr/settings/SettingsFragment.kt +++ b/app/src/main/java/de/grobox/transportr/settings/SettingsFragment.kt @@ -27,8 +27,10 @@ import androidx.appcompat.app.AppCompatDelegate.* import androidx.core.app.ActivityCompat import androidx.core.app.ActivityOptionsCompat import androidx.lifecycle.Observer +import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import com.google.android.material.dialog.MaterialAlertDialogBuilder import de.grobox.transportr.R import de.grobox.transportr.TransportrApplication import de.grobox.transportr.map.MapActivity @@ -108,4 +110,24 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + override fun onDisplayPreferenceDialog(preference: Preference?) { + when (preference) { + // show a material design 3 dialog instead of the default md2 preference dialog + is ListPreference -> { + val currentValueIndex = preference.entryValues.indexOf(preference.value) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(preference.title) + .setSingleChoiceItems(preference.entries, currentValueIndex) { dialog, index -> + val newValue = preference.entryValues[index] + if (preference.callChangeListener(newValue)) { + preference.value = newValue as String + } + dialog.dismiss() + } + .setNegativeButton(R.string.cancel, null) + .show() + } + else -> super.onDisplayPreferenceDialog(preference) + } + } } diff --git a/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailActivity.java b/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailActivity.java index 9d36e8917..1665398d5 100644 --- a/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailActivity.java +++ b/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailActivity.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.view.View; import android.widget.FrameLayout; +import android.widget.ImageButton; import com.google.android.material.bottomsheet.BottomSheetBehavior; @@ -37,6 +38,7 @@ import de.grobox.transportr.locations.WrapLocation; import de.grobox.transportr.trips.detail.TripDetailViewModel.SheetState; import de.grobox.transportr.ui.ThreeStateBottomSheetBehavior; +import de.grobox.transportr.utils.FullScreenUtil; import de.grobox.transportr.utils.OnboardingBuilder; import de.schildbach.pte.dto.Trip; @@ -64,6 +66,8 @@ public class TripDetailActivity extends TransportrActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + FullScreenUtil.Companion.drawBehindStatusbar(this); + FullScreenUtil.Companion.applyTopInset(findViewById(R.id.appBarLayout)); getComponent().inject(this); @@ -116,6 +120,8 @@ public void onSlide(@NonNull View bottomSheet, float slideOffset) { showOnboarding(); } + + ((ImageButton) findViewById(R.id.backView)).setOnClickListener(view -> getOnBackPressedDispatcher().onBackPressed()); } private void showOnboarding() { @@ -140,11 +146,17 @@ private void onSheetStateChanged(@Nullable SheetState sheetState) { case BOTTOM: bottomSheetBehavior.setBottom(); bottomSheetBehavior.setState(STATE_COLLAPSED); + FullScreenUtil.Companion.drawBehindStatusbar(this); break; case MIDDLE: bottomSheetBehavior.setHideable(true); // ensures it can be swiped down bottomSheetBehavior.setMiddle(); bottomSheetBehavior.setState(STATE_COLLAPSED); + FullScreenUtil.Companion.drawBehindStatusbar(this); + FullScreenUtil.Companion.applyTopInset(findViewById(R.id.appBarLayout)); + break; + case EXPANDED: + FullScreenUtil.Companion.drawBehindStatusbar(this); break; } } diff --git a/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailFragment.kt b/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailFragment.kt index c6270feb0..ae6230f1b 100644 --- a/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailFragment.kt +++ b/app/src/main/java/de/grobox/transportr/trips/detail/TripDetailFragment.kt @@ -21,12 +21,16 @@ package de.grobox.transportr.trips.detail import android.os.Bundle import android.os.CountDownTimer -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View import android.view.View.GONE import android.view.View.VISIBLE +import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.widget.Toolbar -import androidx.core.content.ContextCompat.getColor import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -41,7 +45,7 @@ import de.grobox.transportr.trips.detail.TripUtils.share import de.grobox.transportr.utils.DateUtils.formatDuration import de.grobox.transportr.utils.DateUtils.formatTime import de.grobox.transportr.utils.DateUtils.formatRelativeTime -import de.grobox.transportr.utils.TransportrUtils.getColorFromAttr +import de.grobox.transportr.utils.FullScreenUtil import de.schildbach.pte.dto.Trip import kotlinx.android.synthetic.main.fragment_trip_detail.* import javax.inject.Inject @@ -79,6 +83,7 @@ class TripDetailFragment : TransportrFragment(), Toolbar.OnMenuItemClickListener override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setUpToolbar(toolbar) setHasOptionsMenu(true) component.inject(this) @@ -166,29 +171,23 @@ class TripDetailFragment : TransportrFragment(), Toolbar.OnMenuItemClickListener } private fun onSheetStateChanged(sheetState: SheetState?) { + FullScreenUtil.applyImageViewTopInset(closeButton) when (sheetState) { null -> return BOTTOM -> { - toolbar.visibility = GONE + closeButton.visibility = GONE topBar.visibility = GONE bottomBar.visibility = VISIBLE } MIDDLE -> { - toolbar.visibility = GONE + + closeButton.visibility = GONE topBar.visibility = VISIBLE - topBar.setBackgroundColor(context.getColorFromAttr(R.attr.colorPrimary)) - fromTimeRel.setTextColor(getColor(context, R.color.md_white_1000)) - durationTop.setTextColor(getColor(context, R.color.md_white_1000)) - priceTop.setTextColor(getColor(context, R.color.md_white_1000)) bottomBar.visibility = GONE } EXPANDED -> { - toolbar.visibility = VISIBLE + closeButton.visibility = VISIBLE topBar.visibility = VISIBLE - topBar.setBackgroundColor(context.getColorFromAttr(android.R.attr.colorBackground)) - fromTimeRel.setTextColor(context.getColorFromAttr(android.R.attr.textColorPrimary)) - durationTop.setTextColor(context.getColorFromAttr(android.R.attr.textColorSecondary)) - priceTop.setTextColor(context.getColorFromAttr(android.R.attr.textColorSecondary)) bottomBar.visibility = GONE } } diff --git a/app/src/main/java/de/grobox/transportr/trips/detail/TripDrawer.kt b/app/src/main/java/de/grobox/transportr/trips/detail/TripDrawer.kt index 80c68a55c..ab0dafada 100644 --- a/app/src/main/java/de/grobox/transportr/trips/detail/TripDrawer.kt +++ b/app/src/main/java/de/grobox/transportr/trips/detail/TripDrawer.kt @@ -21,12 +21,14 @@ package de.grobox.transportr.trips.detail import android.content.Context +import android.graphics.Color import android.graphics.PorterDuff.Mode.SRC_IN import android.graphics.PorterDuff.Mode.MULTIPLY import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import androidx.annotation.ColorInt import androidx.core.content.ContextCompat +import com.google.android.material.color.MaterialColors import com.mapbox.mapboxsdk.annotations.Icon import com.mapbox.mapboxsdk.annotations.PolylineOptions import com.mapbox.mapboxsdk.geometry.LatLng @@ -138,10 +140,10 @@ internal class TripDrawer(context: Context) : MapDrawer(context) { return if (line?.style != null && line.style!!.backgroundColor != 0) { line.style!!.backgroundColor } else { - ContextCompat.getColor(context, R.color.accent) + MaterialColors.getColor(context, R.attr.colorPrimary, Color.TRANSPARENT) } } - return ContextCompat.getColor(context, R.color.walking) + return MaterialColors.getColor(context, R.attr.colorSecondary, Color.TRANSPARENT) } @ColorInt diff --git a/app/src/main/java/de/grobox/transportr/trips/search/ProductDialogFragment.java b/app/src/main/java/de/grobox/transportr/trips/search/ProductDialogFragment.java index 5d1329f01..227683766 100755 --- a/app/src/main/java/de/grobox/transportr/trips/search/ProductDialogFragment.java +++ b/app/src/main/java/de/grobox/transportr/trips/search/ProductDialogFragment.java @@ -20,8 +20,11 @@ package de.grobox.transportr.trips.search; import android.app.Dialog; + +import androidx.annotation.NonNull; import androidx.lifecycle.ViewModelProvider; import android.content.Context; +import android.content.DialogInterface; import android.os.Bundle; import androidx.fragment.app.DialogFragment; import androidx.recyclerview.widget.LinearLayoutManager; @@ -35,6 +38,7 @@ import android.widget.ImageView; import android.widget.TextView; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter; import com.mikepenz.fastadapter.items.AbstractItem; @@ -62,6 +66,29 @@ public class ProductDialogFragment extends DialogFragment { private FastItemAdapter adapter; private Button okButton; + private View dialog; + + @NonNull + @Override + public Dialog onCreateDialog(@androidx.annotation.Nullable Bundle savedInstanceState) { + dialog = onCreateView(LayoutInflater.from(requireContext()), null, savedInstanceState); + + + MaterialAlertDialogBuilder mb = new MaterialAlertDialogBuilder(requireContext()); + mb.setView(dialog); + mb.setTitle(R.string.select_products); + mb.setIcon(R.drawable.product_bus); + mb.setNegativeButton(R.string.cancel, (dialog, which) -> { + getDialog().cancel(); + }); + mb.setPositiveButton(R.string.ok, (dialog, which) -> { + EnumSet products = getProductsFromItems(adapter.getSelectedItems()); + viewModel.setProducts(products); + getDialog().cancel(); + }); + return mb.create(); + } + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_product_dialog, container); @@ -79,41 +106,14 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, // Get view model and observe products viewModel = new ViewModelProvider(requireActivity(), viewModelFactory).get(DirectionsViewModel.class); if (savedInstanceState == null) { - viewModel.getProducts().observe(getViewLifecycleOwner(), this::onProductsChanged); + viewModel.getProducts().observe(requireActivity(), this::onProductsChanged); } else { adapter.withSavedInstanceState(savedInstanceState); } - // OK Button - okButton = v.findViewById(R.id.okButton); - okButton.setOnClickListener(view -> { - EnumSet products = getProductsFromItems(adapter.getSelectedItems()); - viewModel.setProducts(products); - getDialog().cancel(); - }); - // Cancel Button - Button cancelButton = v.findViewById(R.id.cancelButton); - cancelButton.setOnClickListener(view -> getDialog().cancel()); - return v; } - @Override - public void onStart() { - super.onStart(); - - // adjust width and height to be shown properly in landscape orientation - Dialog dialog = getDialog(); - if (dialog != null) { - Window window = dialog.getWindow(); - if (window != null) { - int width = ViewGroup.LayoutParams.MATCH_PARENT; - int height = ViewGroup.LayoutParams.MATCH_PARENT; - window.setLayout(width, height); - } - } - } - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/de/grobox/transportr/trips/search/TripsFragment.kt b/app/src/main/java/de/grobox/transportr/trips/search/TripsFragment.kt index 73515cc2e..2bda8e541 100644 --- a/app/src/main/java/de/grobox/transportr/trips/search/TripsFragment.kt +++ b/app/src/main/java/de/grobox/transportr/trips/search/TripsFragment.kt @@ -20,6 +20,7 @@ package de.grobox.transportr.trips.search import android.annotation.SuppressLint import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.os.CountDownTimer import android.util.Pair @@ -30,6 +31,7 @@ import android.widget.Button import android.widget.Toast import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.color.MaterialColors import com.omadahealth.github.swipyrefreshlayout.library.SwipyRefreshLayout.OnRefreshListener import com.omadahealth.github.swipyrefreshlayout.library.SwipyRefreshLayoutDirection import de.grobox.transportr.R @@ -61,7 +63,7 @@ class TripsFragment : TransportrFragment(), OnRefreshListener, OnTripClickListen val v = inflater.inflate(R.layout.fragment_trips, container, false) component.inject(this) - viewModel = ViewModelProvider(activity!!, viewModelFactory).get(DirectionsViewModel::class.java) + viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(DirectionsViewModel::class.java) return v } @@ -74,7 +76,8 @@ class TripsFragment : TransportrFragment(), OnRefreshListener, OnTripClickListen // Swipe to Refresh swipe.let { - it.setColorSchemeColors(R.color.accent) + val color = MaterialColors.getColor(context, R.attr.colorPrimary, Color.TRANSPARENT) + it.setColorSchemeColors(color) it.setDistanceToTriggerSync(getDragDistance(context)) it.setOnRefreshListener(this) } diff --git a/app/src/main/java/de/grobox/transportr/ui/BasePopupMenu.java b/app/src/main/java/de/grobox/transportr/ui/BasePopupMenu.java index d8a116b92..cc90bab71 100644 --- a/app/src/main/java/de/grobox/transportr/ui/BasePopupMenu.java +++ b/app/src/main/java/de/grobox/transportr/ui/BasePopupMenu.java @@ -46,7 +46,7 @@ protected BasePopupMenu(Context context, View anchor) { setOnMenuItemClickListener(this); TypedValue typedValue = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.colorControlNormal, typedValue, true); + context.getTheme().resolveAttribute(R.attr.colorOnPrimarySurface, typedValue, true); iconColor = typedValue.data; } diff --git a/app/src/main/java/de/grobox/transportr/ui/LineView.kt b/app/src/main/java/de/grobox/transportr/ui/LineView.kt index c511c308f..b985e6a63 100644 --- a/app/src/main/java/de/grobox/transportr/ui/LineView.kt +++ b/app/src/main/java/de/grobox/transportr/ui/LineView.kt @@ -30,6 +30,7 @@ import androidx.appcompat.widget.AppCompatTextView import android.util.AttributeSet import de.grobox.transportr.R import de.grobox.transportr.utils.TransportrUtils.dpToPx +import de.grobox.transportr.utils.TransportrUtils.getColorFromAttr import de.grobox.transportr.utils.TransportrUtils.getDrawableForProduct import de.schildbach.pte.dto.Line @@ -61,7 +62,7 @@ class LineView(context: Context, attr: AttributeSet?) : AppCompatTextView(contex } fun setWalk() { - setDrawable(R.drawable.ic_walk, getColor(context, android.R.color.black)) + setCompoundDrawablesWithIntrinsicBounds(getDrawable(context, R.drawable.ic_walk), null, null, null) setBackgroundResource(R.drawable.walk_box) } diff --git a/app/src/main/java/de/grobox/transportr/ui/TimeDateFragment.kt b/app/src/main/java/de/grobox/transportr/ui/TimeDateFragment.kt index a4e28a218..126939627 100755 --- a/app/src/main/java/de/grobox/transportr/ui/TimeDateFragment.kt +++ b/app/src/main/java/de/grobox/transportr/ui/TimeDateFragment.kt @@ -19,26 +19,25 @@ package de.grobox.transportr.ui -import android.app.DatePickerDialog -import android.app.DatePickerDialog.OnDateSetListener import android.os.Build +import android.app.Dialog import android.os.Bundle import android.text.format.DateFormat.getDateFormat import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.ViewGroup -import android.widget.DatePicker import android.widget.TimePicker import android.widget.TimePicker.OnTimeChangedListener import androidx.fragment.app.DialogFragment +import com.google.android.material.datepicker.MaterialDatePicker +import com.google.android.material.dialog.MaterialAlertDialogBuilder import de.grobox.transportr.R import kotlinx.android.synthetic.main.fragment_time_date.* import java.util.* import java.util.Calendar.* -class TimeDateFragment : DialogFragment(), OnDateSetListener, OnTimeChangedListener { - +class TimeDateFragment : DialogFragment(), OnTimeChangedListener { private var listener: TimeDateListener? = null private var departure: Boolean? = null // null means no departure/arrival selection will be possible private lateinit var calendar: Calendar @@ -62,6 +61,11 @@ class TimeDateFragment : DialogFragment(), OnDateSetListener, OnTimeChangedListe } } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return MaterialAlertDialogBuilder(requireContext()) + .show() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -89,8 +93,13 @@ class TimeDateFragment : DialogFragment(), OnDateSetListener, OnTimeChangedListe // Date dateView.setOnClickListener { - DatePickerDialog(context!!, this@TimeDateFragment, calendar.get(YEAR), calendar.get(MONTH), calendar.get(DAY_OF_MONTH)) - .show() + MaterialDatePicker.Builder.datePicker() + .setSelection(calendar.timeInMillis) + .build() + .apply { + addOnPositiveButtonClickListener(this@TimeDateFragment::onDateSet) + } + .show(childFragmentManager, null) } showDate(calendar) @@ -150,10 +159,8 @@ class TimeDateFragment : DialogFragment(), OnDateSetListener, OnTimeChangedListe calendar.set(MINUTE, minute) } - override fun onDateSet(datePicker: DatePicker, year: Int, month: Int, day: Int) { - calendar.set(YEAR, year) - calendar.set(MONTH, month) - calendar.set(DAY_OF_MONTH, day) + private fun onDateSet(timeInMillis: Long) { + calendar.timeInMillis = timeInMillis showDate(calendar) } diff --git a/app/src/main/java/de/grobox/transportr/ui/TransportrChangeLog.kt b/app/src/main/java/de/grobox/transportr/ui/TransportrChangeLog.kt index 11c61b7e5..36bb3b675 100644 --- a/app/src/main/java/de/grobox/transportr/ui/TransportrChangeLog.kt +++ b/app/src/main/java/de/grobox/transportr/ui/TransportrChangeLog.kt @@ -20,28 +20,58 @@ package de.grobox.transportr.ui import android.content.Context -import android.os.Build -import android.view.ContextThemeWrapper - +import android.graphics.Color +import android.webkit.WebView +import androidx.appcompat.app.AlertDialog +import com.google.android.material.color.MaterialColors +import com.google.android.material.dialog.MaterialAlertDialogBuilder import de.cketti.library.changelog.ChangeLog import de.grobox.transportr.R import de.grobox.transportr.settings.SettingsManager class TransportrChangeLog(context: Context, settingsManager: SettingsManager) : ChangeLog( - ContextThemeWrapper(context, R.style.DialogTheme), + context, settingsManager.settings, theme(settingsManager.isDarkTheme) ) { + fun getMaterialDialog(full: Boolean): AlertDialog { + val wv = WebView(mContext) + wv.setBackgroundColor(Color.TRANSPARENT) + wv.loadDataWithBaseURL(null, getLog(full), "text/html", "UTF-8", null) + + val builder = MaterialAlertDialogBuilder(mContext) + builder.setTitle( + mContext.resources.getString( + if (full) R.string.changelog_full_title else R.string.changelog_title + ) + ) + .setView(wv) + .setCancelable(false) + .setPositiveButton( + mContext.resources.getString(R.string.changelog_ok_button) + ) { _, _ -> + updateVersionInPreferences() + } + + if (!full) { + builder.setNegativeButton( + R.string.changelog_show_full + ) { _, _ -> getMaterialDialog(true) } + } + + return builder.create() + } + companion object { private fun theme(dark: Boolean): String { return if (dark) { // material dark - "body { color: #f3f3f3; font-size: 0.9em; background-color: #424242; } h1 { font-size: 1.3em; } ul { padding-left: 2em; }" + "body { color: #f3f3f3; font-size: 0.9em; } h1 { font-size: 1.3em; } ul { padding-left: 2em; }" } else { // material light - "body { color: #202020; font-size: 0.9em; background-color: transparent; } h1 { font-size: 1.3em; } ul { padding-left: 2em; }" + "body { color: #202020; font-size: 0.9em; } h1 { font-size: 1.3em; } ul { padding-left: 2em; }" } } diff --git a/app/src/main/java/de/grobox/transportr/utils/DateUtils.kt b/app/src/main/java/de/grobox/transportr/utils/DateUtils.kt index 9618707dd..158696d99 100644 --- a/app/src/main/java/de/grobox/transportr/utils/DateUtils.kt +++ b/app/src/main/java/de/grobox/transportr/utils/DateUtils.kt @@ -19,10 +19,12 @@ package de.grobox.transportr.utils import android.content.Context +import android.graphics.Color import android.text.format.DateFormat import android.text.format.DateUtils import android.view.View import androidx.core.content.ContextCompat +import com.google.android.material.color.MaterialColors import de.grobox.transportr.R import java.util.* import kotlin.math.abs @@ -71,7 +73,7 @@ object DateUtils { val delayMinutes = millisToMinutes(delay) return Delay( delay = "${if (delayMinutes >= 0) '+' else ""}$delayMinutes", - color = ContextCompat.getColor(context, if (delayMinutes > 0) R.color.md_red_500 else R.color.md_green_500) + color = MaterialColors.getColor(context, if (delayMinutes > 0) R.attr.colorError else R.attr.colorPrimary, Color.TRANSPARENT) ) } diff --git a/app/src/main/java/de/grobox/transportr/utils/FullScreenUtil.kt b/app/src/main/java/de/grobox/transportr/utils/FullScreenUtil.kt new file mode 100644 index 000000000..de4702964 --- /dev/null +++ b/app/src/main/java/de/grobox/transportr/utils/FullScreenUtil.kt @@ -0,0 +1,107 @@ +/* + * Transportr + * + * Copyright (c) 2013 - 2024 Torsten Grote + * + * This program is Free Software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.grobox.transportr.utils + +import android.app.Activity +import android.graphics.Color +import android.os.Build +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.MarginLayoutParams +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import de.grobox.transportr.utils.TransportrUtils.dpToPx + + +class FullScreenUtil { + companion object { + fun drawBehindStatusbar(activity: Activity) { + WindowCompat.setDecorFitsSystemWindows(activity.window, false) + // required for the main view, which cant properly use the theme.xml + activity.window.statusBarColor = Color.TRANSPARENT + activity.window.navigationBarColor = Color.TRANSPARENT + } + + fun showStatusbar(activity: Activity) { + WindowCompat.setDecorFitsSystemWindows(activity.window, true) + } + + fun applyTopInset(view: View?) { + if(view == null) { + return + } + applyTopInset(view, 0, 8, 0 ,0) + } + + fun applyTopInset(view: View?, margin: Int) { + if(view == null) { + return + } + applyTopInset(view, margin, margin, margin ,margin) + } + + fun applyTopInset(view: View?, dpLeft: Int, dpTop: Int, dpRight: Int, dpBottom: Int) { + if(view == null) { + return + } + + view.setOnApplyWindowInsetsListener { v, insets -> + val originalOffset = dpToPx(view.context, dpTop) + val top = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + insets.getInsets(WindowInsetsCompat.Type.statusBars()).top + } else { + insets.systemWindowInsetTop + } + + val parameters = CoordinatorLayout.LayoutParams( + v.layoutParams.width, + v.layoutParams.height + ) + parameters.setMargins(dpToPx(view.context, dpLeft), top + originalOffset, dpToPx(view.context, dpRight), dpToPx(view.context, dpBottom)) + v.layoutParams = parameters + + return@setOnApplyWindowInsetsListener insets + } + } + + fun applyImageViewTopInset(imageView: ImageView) { + + imageView.setOnApplyWindowInsetsListener { v, insets -> + val originalOffset = dpToPx(imageView.context, 0) + val top = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + insets.getInsets(WindowInsetsCompat.Type.statusBars()).top + } else { + insets.systemWindowInsetTop + } + + val parameters = v.layoutParams as MarginLayoutParams + parameters.setMargins(0, top + originalOffset, 0, 0) + v.layoutParams = parameters + + return@setOnApplyWindowInsetsListener insets + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/grobox/transportr/utils/OnboardingBuilder.kt b/app/src/main/java/de/grobox/transportr/utils/OnboardingBuilder.kt index 7d02b02e6..9f6844450 100644 --- a/app/src/main/java/de/grobox/transportr/utils/OnboardingBuilder.kt +++ b/app/src/main/java/de/grobox/transportr/utils/OnboardingBuilder.kt @@ -20,8 +20,10 @@ package de.grobox.transportr.utils import android.app.Activity +import android.graphics.Color import androidx.core.content.ContextCompat import android.util.TypedValue +import com.google.android.material.color.MaterialColors import de.grobox.transportr.R import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt import uk.co.samuelwall.materialtaptargetprompt.extras.backgrounds.CirclePromptBackground @@ -33,7 +35,7 @@ import uk.co.samuelwall.materialtaptargetprompt.extras.focals.RectanglePromptFoc class OnboardingBuilder(activity: Activity) : MaterialTapTargetPrompt.Builder(activity) { init { - backgroundColour = ContextCompat.getColor(activity, R.color.primary) + backgroundColour = MaterialColors.getColor(activity, R.attr.colorPrimary, Color.TRANSPARENT) promptBackground = RectanglePromptBackground() promptFocal = RectanglePromptFocal() setFocalPadding(R.dimen.buttonSize) @@ -48,7 +50,7 @@ class OnboardingBuilder(activity: Activity) : MaterialTapTargetPrompt.Builder(ac class IconOnboardingBuilder(activity: Activity) : MaterialTapTargetPrompt.Builder(activity) { init { - backgroundColour = ContextCompat.getColor(activity, R.color.primary) + backgroundColour = MaterialColors.getColor(activity, R.attr.colorPrimary, Color.TRANSPARENT) promptBackground = CirclePromptBackground() promptFocal = CirclePromptFocal() } diff --git a/app/src/main/res/color/selector_highlight.xml b/app/src/main/res/color/selector_highlight.xml index 50f642aaa..0f3bfe807 100644 --- a/app/src/main/res/color/selector_highlight.xml +++ b/app/src/main/res/color/selector_highlight.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android"> + android:color="?colorOnPrimary" + android:state_selected="true" /> + android:color="?android:attr/textColorPrimary" + android:state_selected="false" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_calendar.xml b/app/src/main/res/drawable/ic_action_calendar.xml index 229d5412c..96f78dd33 100644 --- a/app/src/main/res/drawable/ic_action_calendar.xml +++ b/app/src/main/res/drawable/ic_action_calendar.xml @@ -1,6 +1,7 @@ diff --git a/app/src/main/res/drawable/ic_action_departures.xml b/app/src/main/res/drawable/ic_action_departures.xml index d47f5c8e5..3fc786ef2 100644 --- a/app/src/main/res/drawable/ic_action_departures.xml +++ b/app/src/main/res/drawable/ic_action_departures.xml @@ -1,6 +1,7 @@ + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml index 39e64d698..0e869fa90 100644 --- a/app/src/main/res/drawable/ic_delete.xml +++ b/app/src/main/res/drawable/ic_delete.xml @@ -1,6 +1,7 @@ + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground_primary_color.xml b/app/src/main/res/drawable/ic_launcher_foreground_primary_color.xml new file mode 100644 index 000000000..1dd21ff2c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground_primary_color.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_menu_directions.xml b/app/src/main/res/drawable/ic_menu_directions.xml index 739dd20ee..6684b1a82 100644 --- a/app/src/main/res/drawable/ic_menu_directions.xml +++ b/app/src/main/res/drawable/ic_menu_directions.xml @@ -1,6 +1,7 @@ diff --git a/app/src/main/res/drawable/ic_mode_edit.xml b/app/src/main/res/drawable/ic_mode_edit.xml index 2ab2fb753..f6b77b6f2 100644 --- a/app/src/main/res/drawable/ic_mode_edit.xml +++ b/app/src/main/res/drawable/ic_mode_edit.xml @@ -1,6 +1,7 @@ + android:viewportWidth="24" + android:tint="?attr/colorOnPrimary"> diff --git a/app/src/main/res/drawable/line_box.xml b/app/src/main/res/drawable/line_box.xml index 8caf390af..6a7c90c4f 100644 --- a/app/src/main/res/drawable/line_box.xml +++ b/app/src/main/res/drawable/line_box.xml @@ -4,7 +4,7 @@ android:shape="rectangle" > + android:color="?colorTertiary" /> diff --git a/app/src/main/res/drawable/product_bus.xml b/app/src/main/res/drawable/product_bus.xml index e16e25979..cc4050322 100644 --- a/app/src/main/res/drawable/product_bus.xml +++ b/app/src/main/res/drawable/product_bus.xml @@ -2,7 +2,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:viewportHeight="24.0" + android:tint="?colorOnBackground"> diff --git a/app/src/main/res/drawable/selector_list_item_background.xml b/app/src/main/res/drawable/selector_list_item_background.xml index 58cc6c04c..eb0afb94f 100644 --- a/app/src/main/res/drawable/selector_list_item_background.xml +++ b/app/src/main/res/drawable/selector_list_item_background.xml @@ -4,13 +4,16 @@ android:exitFadeDuration="@android:integer/config_shortAnimTime" > + android:state_pressed="true" > + + + android:state_selected="true" > + + + android:state_activated="true" > + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle.xml b/app/src/main/res/drawable/shape_circle.xml new file mode 100644 index 000000000..c4759da91 --- /dev/null +++ b/app/src/main/res/drawable/shape_circle.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_location_dropdown.xml b/app/src/main/res/drawable/shape_location_dropdown.xml new file mode 100644 index 000000000..3d9f4d30d --- /dev/null +++ b/app/src/main/res/drawable/shape_location_dropdown.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_departures.xml b/app/src/main/res/layout/activity_departures.xml index 0e09b508c..0b4196ea4 100644 --- a/app/src/main/res/layout/activity_departures.xml +++ b/app/src/main/res/layout/activity_departures.xml @@ -16,7 +16,6 @@ diff --git a/app/src/main/res/layout/activity_directions.xml b/app/src/main/res/layout/activity_directions.xml index d331120f2..10281f03c 100644 --- a/app/src/main/res/layout/activity_directions.xml +++ b/app/src/main/res/layout/activity_directions.xml @@ -1,40 +1,48 @@ - + android:fitsSystemWindows="false"> + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + tools:layout="@layout/fragment_directions_form" /> + android:paddingStart="4dp" + android:paddingEnd="4dp" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> - + diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml index 2035a5620..cca6066d4 100644 --- a/app/src/main/res/layout/activity_map.xml +++ b/app/src/main/res/layout/activity_map.xml @@ -1,76 +1,89 @@ - + android:layout_height="match_parent"> - + android:layout_height="match_parent"> - + + + + + - + + + + + app:behavior_autoHide="true" + app:fabSize="normal" + app:layout_anchor="@+id/bottomSheet" + app:layout_anchorGravity="top|end" + app:srcCompat="@drawable/ic_menu_directions" /> - + android:layout_height="wrap_content" + app:behavior_hideable="true" + app:elevation="5dp" + app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" /> - + - - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pick_transport_network.xml b/app/src/main/res/layout/activity_pick_transport_network.xml index b7e9b71ff..c5e53eadc 100644 --- a/app/src/main/res/layout/activity_pick_transport_network.xml +++ b/app/src/main/res/layout/activity_pick_transport_network.xml @@ -1,54 +1,91 @@ - - + android:layout_marginStart="16dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + app:cardCornerRadius="@dimen/cardview_corner_radius" + app:cardElevation="@dimen/cardview_default_elevation" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + android:layout_margin="12dp"> - + android:layout_marginTop="8dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_globe" /> - + + + + - + - - + - + + + + + - - + diff --git a/app/src/main/res/layout/activity_trip_detail.xml b/app/src/main/res/layout/activity_trip_detail.xml index 54ce5ff18..d625d9960 100644 --- a/app/src/main/res/layout/activity_trip_detail.xml +++ b/app/src/main/res/layout/activity_trip_detail.xml @@ -8,8 +8,7 @@ + android:layout_height="match_parent"/> - - - - - + diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 55cc947ec..3a6e1e39e 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -60,51 +60,62 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/appIcon"/> - - - + app:layout_constraintTop_toBottomOf="@+id/aboutTextView"> + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/cardView" />