Page MenuHomeGitPull.it

D147.1729696781.diff
No OneTemporary

Size
25 KB
Referenced Files
None
Subscribers
None

D147.1729696781.diff

diff --git a/app/build.gradle b/app/build.gradle
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -55,6 +55,13 @@
dependencies {
//new libraries
}
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+ kotlin {
+ jvmToolchain 17
+ }
}
dependencies {
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
@@ -1,13 +1,11 @@
package it.reyboz.bustorino
import android.content.Intent
+import android.os.Build
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
@@ -17,8 +15,9 @@
import com.google.android.material.tabs.TabLayoutMediator
import it.reyboz.bustorino.data.PreferencesHolder
import it.reyboz.bustorino.fragments.IntroFragment
+import it.reyboz.bustorino.middleware.GeneralActivity
-class ActivityIntro : AppCompatActivity(), IntroFragment.IntroListener {
+class ActivityIntro : GeneralActivity(), IntroFragment.IntroListener {
private lateinit var viewPager : ViewPager2
private lateinit var btnForward: ImageButton
@@ -28,7 +27,6 @@
private var restartMain = true
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intro)
@@ -119,7 +117,7 @@
const private val DEBUG_TAG = "BusTO-IntroActivity"
const val RESTART_MAIN = "restartMainActivity"
- const val NUM_ITEMS = 7
+ val NUM_ITEMS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) 8 else 7
}
override fun closeIntroduction() {
diff --git a/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java b/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java
--- a/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java
+++ b/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java
@@ -351,6 +351,7 @@
return super.onCreateOptionsMenu(menu);
}
+ //requesting permissions
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
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
@@ -1,7 +1,7 @@
package it.reyboz.bustorino.fragments
import android.content.Context
-import android.graphics.BitmapFactory
+import android.graphics.*
import android.graphics.text.LineBreaker
import android.os.Build
import android.os.Bundle
@@ -9,33 +9,38 @@
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.activity.result.contract.ActivityResultContracts
+import androidx.core.content.ContextCompat
+import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.Fragment
import it.reyboz.bustorino.R
import it.reyboz.bustorino.backend.utils
+import it.reyboz.bustorino.util.Permissions
+import it.reyboz.bustorino.util.ViewUtils
import java.lang.IllegalStateException
-// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val SCREEN_INDEX = "screenindex"
-/**
- * A simple [Fragment] subclass.
- * Use the [IntroFragment.newInstance] factory method to
- * create an instance of this fragment.
- */
class IntroFragment : Fragment() {
- // TODO: Rename and change types of parameters
private var screenIndex = 1
private lateinit var imageHolder: ImageView
private lateinit var textView: TextView
-
-
private lateinit var listener: IntroListener
+ private lateinit var interactButton: Button
+
+ private val locationRequestResLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){ res ->
+ //onActivityResult(res: map<String,Boolean>)
+ if(res.get(Permissions.LOCATION_PERMISSIONS[0])==true || res.get(Permissions.LOCATION_PERMISSIONS[1])==true)
+ setInteractButtonState(ButtonState.LOCATION,false)
+ }
+ private val notificationsReqLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
+ if (it) setInteractButtonState(ButtonState.NOTIFICATIONS, false)
+ }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
@@ -57,9 +62,10 @@
): View? {
// Inflate the layout for this fragment
val root= inflater.inflate(R.layout.fragment_intro, container, false)
+
imageHolder = root.findViewById(R.id.image_tutorial)
textView = root.findViewById(R.id.tutorialTextView)
-
+ interactButton = root.findViewById(R.id.permissionButton)
when(screenIndex){
0 -> {
@@ -81,7 +87,15 @@
}
4 ->{
setImageBitmap(imageHolder, R.drawable.tuto_map)
+ val permGranted = (Permissions.anyLocationPermissionsGranted(requireContext()))
+ setInteractButtonState(ButtonState.LOCATION, !permGranted)
textView.text = utils.convertHtml(getString(R.string.tutorial_map))
+ interactButton.setOnClickListener {
+ //ask location permission
+ locationRequestResLauncher.launch(Permissions.LOCATION_PERMISSIONS)
+ }
+ interactButton.visibility = View.VISIBLE
+
}
5 ->{
setImageBitmap(imageHolder, R.drawable.tuto_line_det)
@@ -91,9 +105,37 @@
setImageBitmap(imageHolder,R.drawable.tuto_menu)
setTextHtmlDescription(R.string.tutorial_menu)
//this is the cheapest trick ever lol
- val closeButton = root.findViewById<Button>(R.id.closeAllButton)
- closeButton.visibility = View.VISIBLE
- closeButton.setOnClickListener {
+ if(!Permissions.isNotificationPermissionNeeded()){
+ //no other screen needed
+ val button = root.findViewById<Button>(R.id.closeAllButton)
+ button.visibility = View.VISIBLE
+ button.setOnClickListener {
+ listener.closeIntroduction()
+ }
+ }
+ }
+ /// IMPORTANT: THIS NEEDS TO BE LAST SCREEN, ALWAYS
+ 7 ->{
+ imageHolder.setImageDrawable(ContextCompat.getDrawable(requireContext(),R.drawable.megaphone))
+ setTextHtmlDescription(R.string.tutorial_permissions)
+ if(Permissions.isNotificationPermissionNeeded()) {
+ val disabled = Permissions.isPermissionGranted(
+ requireContext(),
+ android.Manifest.permission.POST_NOTIFICATIONS
+ )
+ setInteractButtonState(ButtonState.NOTIFICATIONS, !disabled)
+ interactButton.setOnClickListener {
+ if (Permissions.isNotificationPermissionNeeded()) {
+ notificationsReqLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
+ }
+ }
+ interactButton.visibility = View.VISIBLE
+ }
+ //show the other button
+ val button = root.findViewById<Button>(R.id.closeAllButton)
+ button.setText(R.string.close_tutorial_short)
+ button.visibility = View.VISIBLE
+ button.setOnClickListener {
listener.closeIntroduction()
}
}
@@ -110,6 +152,25 @@
textView.text = utils.convertHtml(getString(resId))
}
+ private fun setInteractButtonState(state: ButtonState, active: Boolean){
+ when(state){
+ ButtonState.LOCATION ->
+ if(active) interactButton.setText(R.string.grant_location_permission)
+ else interactButton.setText(R.string.location_permission_granted)
+ ButtonState.NOTIFICATIONS -> if(active)
+ interactButton.setText(R.string.grant_notification_permission)
+ else interactButton.setText(R.string.notification_permission_granted)
+ }
+ if(!active) {
+ val color = ViewUtils.getColorFromTheme(requireContext(), R.attr.colorAccent)//ContextCompat.getColor(requireContext(), R.style.AppTheme.)
+ if(Build.VERSION.SDK_INT >= 29)
+ interactButton.background.colorFilter = BlendModeColorFilter(color, BlendMode.MULTIPLY)
+ else
+ interactButton.background.setColorFilter(
+ color,PorterDuff.Mode.MULTIPLY)
+ interactButton.isClickable = false
+ }
+ }
private fun setImageBitmap(imageView: ImageView, resId: Int, maxDpToScale:Float = DP_LIM_IMAGE){
val bitmap = BitmapFactory.decodeResource(resources,resId)
@@ -145,10 +206,16 @@
@JvmStatic
fun makeArguments(index: Int) = Bundle().apply {
putInt(SCREEN_INDEX, index) }
-
+ fun View.disable() {
+ background.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
+ isClickable = false
+ }
+ enum class ButtonState{
+ LOCATION, NOTIFICATIONS
+ }
}
interface IntroListener{
fun closeIntroduction()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/LinesDetailFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/LinesDetailFragment.kt
--- a/app/src/main/java/it/reyboz/bustorino/fragments/LinesDetailFragment.kt
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/LinesDetailFragment.kt
@@ -419,7 +419,14 @@
}
private fun savePatternsToShow(patterns: List<MatoPatternWithStops>){
- currentPatterns = patterns.sortedBy { p-> p.pattern.code }
+ val patternsSorter = Comparator{ p1: MatoPatternWithStops, p2: MatoPatternWithStops ->
+ if(p1.pattern.directionId != p2.pattern.directionId)
+ return@Comparator p1.pattern.directionId - p2.pattern.directionId
+ else
+ return@Comparator -1*(p1.stopsIndices.size - p2.stopsIndices.size)
+
+ }
+ currentPatterns = patterns.sortedWith(patternsSorter)
patternsAdapter?.let {
it.clear()
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java
--- a/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java
@@ -4,7 +4,6 @@
import android.Manifest;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
@@ -159,14 +158,12 @@
registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
@Override
public void onActivityResult(Map<String, Boolean> result) {
- if(result==null || result.get(Manifest.permission.ACCESS_COARSE_LOCATION) == null
- ||result.get(Manifest.permission.ACCESS_FINE_LOCATION) == null) return;
+ if(result==null) return;
if(result.get(Manifest.permission.ACCESS_COARSE_LOCATION) == null ||
result.get(Manifest.permission.ACCESS_FINE_LOCATION) == null)
return;
- boolean resCoarse = result.get(Manifest.permission.ACCESS_COARSE_LOCATION);
- boolean resFine = result.get(Manifest.permission.ACCESS_FINE_LOCATION);
+
Log.d(DEBUG_TAG, "Permissions for location are: "+result);
if(Boolean.TRUE.equals(result.get(Manifest.permission.ACCESS_COARSE_LOCATION))
&& Boolean.TRUE.equals(result.get(Manifest.permission.ACCESS_FINE_LOCATION))){
@@ -470,7 +467,7 @@
//deactivate flag
pendingIntroRun = false;
}
- if(Permissions.locationPermissionGranted(con)){
+ if(Permissions.bothLocationPermissionsGranted(con)){
Log.d(DEBUG_TAG, "Location permission OK");
if(!locationManager.isRequesterRegistered(requester))
locationManager.addLocationRequestFor(requester);
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java
--- a/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java
@@ -50,7 +50,6 @@
import it.reyboz.bustorino.data.gtfs.MatoPattern;
import it.reyboz.bustorino.data.gtfs.TripAndPatternWithStops;
import it.reyboz.bustorino.map.*;
-import it.reyboz.bustorino.viewmodels.GtfsPositionsViewModel;
import it.reyboz.bustorino.viewmodels.LivePositionsViewModel;
import it.reyboz.bustorino.viewmodels.StopsMapViewModel;
import org.osmdroid.api.IGeoPoint;
@@ -265,7 +264,7 @@
btCenterMap.setOnClickListener(v -> {
//Log.i(TAG, "centerMap clicked ");
- if(Permissions.locationPermissionGranted(getContext())) {
+ if(Permissions.bothLocationPermissionsGranted(getContext())) {
final GeoPoint myPosition = mLocationOverlay.getMyLocation();
map.getController().animateTo(myPosition);
} else
@@ -275,7 +274,7 @@
btFollowMe.setOnClickListener(v -> {
//Log.i(TAG, "btFollowMe clicked ");
- if(Permissions.locationPermissionGranted(getContext()))
+ if(Permissions.bothLocationPermissionsGranted(getContext()))
setLocationFollowing(!followingLocation);
else
Toast.makeText(getContext(), R.string.enable_position_message_map, Toast.LENGTH_SHORT)
@@ -502,7 +501,7 @@
//ask for location permission
- if(!Permissions.locationPermissionGranted(activity)){
+ if(!Permissions.bothLocationPermissionsGranted(activity)){
if(shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)){
//TODO: show dialog for permission rationale
Toast.makeText(activity, R.string.enable_position_message_map, Toast.LENGTH_SHORT).show();
@@ -516,7 +515,7 @@
// and set the start zoom
IMapController mapController = map.getController();
GeoPoint startPoint = null;
- startLocationOverlay(Permissions.locationPermissionGranted(activity),
+ startLocationOverlay(Permissions.bothLocationPermissionsGranted(activity),
map);
// set the center point
if (marker != null) {
@@ -540,7 +539,7 @@
LocationManager locationManager =
(LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
//check for permission
- if (locationManager != null && Permissions.locationPermissionGranted(activity)) {
+ if (locationManager != null && Permissions.bothLocationPermissionsGranted(activity)) {
@SuppressLint("MissingPermission")
Location userLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
diff --git a/app/src/main/java/it/reyboz/bustorino/util/Permissions.java b/app/src/main/java/it/reyboz/bustorino/util/Permissions.java
--- a/app/src/main/java/it/reyboz/bustorino/util/Permissions.java
+++ b/app/src/main/java/it/reyboz/bustorino/util/Permissions.java
@@ -6,13 +6,12 @@
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.LocationManager;
+import android.os.Build;
import android.util.Log;
-import androidx.activity.result.ActivityResultCaller;
-import androidx.activity.result.ActivityResultLauncher;
+import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
import java.util.List;
@@ -29,6 +28,12 @@
final static public String[] LOCATION_PERMISSIONS={Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION};
+ //final static public String[] NOTIFICATION_PERMISSION={Manifest.permission.POST_NOTIFICATIONS};
+
+ @RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
+ public static String[] getNotificationPermissions(){
+ return new String[]{Manifest.permission.POST_NOTIFICATIONS};
+ }
public static boolean anyLocationProviderMatchesCriteria(LocationManager mng, Criteria cr, boolean enabled) {
List<String> providers = mng.getProviders(cr, enabled);
@@ -42,10 +47,14 @@
return ContextCompat.checkSelfPermission(con, permission) == PackageManager.PERMISSION_GRANTED;
}
- public static boolean locationPermissionGranted(Context con){
+ public static boolean bothLocationPermissionsGranted(Context con){
return isPermissionGranted(con, Manifest.permission.ACCESS_FINE_LOCATION) &&
isPermissionGranted(con, Manifest.permission.ACCESS_COARSE_LOCATION);
}
+ public static boolean anyLocationPermissionsGranted(Context con){
+ return isPermissionGranted(con, Manifest.permission.ACCESS_FINE_LOCATION) ||
+ isPermissionGranted(con, Manifest.permission.ACCESS_COARSE_LOCATION);
+ }
public static void assertLocationPermissions(Context con, Activity activity) {
if(!isPermissionGranted(con, Manifest.permission.ACCESS_FINE_LOCATION) ||
@@ -53,4 +62,12 @@
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_POSITION);
}
}
+
+ /**
+ * Check if the system requires the POST_NOTIFICATION permission to send notifications
+ * @return true if required
+ */
+ public static boolean isNotificationPermissionNeeded(){
+ return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU);
+ }
}
diff --git a/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt b/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt
--- a/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt
+++ b/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt
@@ -1,14 +1,16 @@
package it.reyboz.bustorino.util
+import android.R
+import android.content.Context
+import android.content.res.Resources.Theme
import android.graphics.Rect
-import android.os.Build
-import android.text.Html
-import android.text.Spanned
import android.util.Log
+import android.util.TypedValue
import android.view.View
import android.view.WindowManager
import android.view.animation.Animation
import android.view.animation.Transformation
+import androidx.annotation.ColorInt
import androidx.core.widget.NestedScrollView
@@ -95,6 +97,13 @@
const val DEF_DURATION: Long = -2
+ fun getColorFromTheme(context: Context, resId: Int): Int {
+ val typedValue = TypedValue()
+ val theme: Theme = context.getTheme()
+ theme.resolveAttribute(resId, typedValue, true)
+ val color = typedValue.data
+ return color
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/megaphone.xml b/app/src/main/res/drawable/megaphone.xml
new file mode 100644
--- /dev/null
+++ b/app/src/main/res/drawable/megaphone.xml
@@ -0,0 +1,5 @@
+<vector android:height="64dp" android:viewportHeight="16"
+ android:viewportWidth="16" android:width="64dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="@color/grey_700"
+ android:pathData="M13,2.5a1.5,1.5 0,0 1,3 0v11a1.5,1.5 0,0 1,-3 0v-0.214c-2.162,-1.241 -4.49,-1.843 -6.912,-2.083l0.405,2.712A1,1 0,0 1,5.51 15.1h-0.548a1,1 0,0 1,-0.916 -0.599l-1.85,-3.49 -0.202,-0.003A2.014,2.014 0,0 1,0 9L0,7a2.02,2.02 0,0 1,1.992 -2.013,75 75,0 0,0 2.483,-0.075c3.043,-0.154 6.148,-0.849 8.525,-2.199zM14,2.5v11a0.5,0.5 0,0 0,1 0v-11a0.5,0.5 0,0 0,-1 0m-1,1.35c-2.344,1.205 -5.209,1.842 -8,2.033v4.233q0.27,0.015 0.537,0.036c2.568,0.189 5.093,0.744 7.463,1.993zM4,10.065v-4.13a95,95 0,0 1,-1.992 0.052A1.02,1.02 0,0 0,1 7v2c0,0.55 0.448,1.002 1.006,1.009A61,61 0,0 1,4 10.065m-0.657,0.975 l1.609,3.037 0.01,0.024h0.548l-0.002,-0.014 -0.443,-2.966a68,68 0,0 0,-1.722 -0.082z"/>
+</vector>
diff --git a/app/src/main/res/layout/fragment_intro.xml b/app/src/main/res/layout/fragment_intro.xml
--- a/app/src/main/res/layout/fragment_intro.xml
+++ b/app/src/main/res/layout/fragment_intro.xml
@@ -38,12 +38,26 @@
android:fontFamily="@font/pitagon_medium"
app:layout_constraintBottom_toTopOf="@id/closeAllButton" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
+ <Button
+ android:text="@string/grant_location_permission"
+ android:layout_width="wrap_content"
+ android:visibility="gone"
+ android:layout_height="wrap_content" android:id="@+id/permissionButton"
+ app:layout_constraintTop_toBottomOf="@id/tutorialTextView"
+ app:layout_constraintBottom_toBottomOf="@id/closeAllButton"
+ app:layout_constraintStart_toStartOf="@id/tutorialTextView"
+ android:backgroundTint="?colorPrimaryDark"
+ android:textColor="@color/white"
+ app:layout_constraintEnd_toEndOf="@id/tutorialTextView"
+ android:layout_marginTop="18dp"
+ android:layout_marginBottom="5dp"
+ />
<Button
android:text="@string/close_tutorial"
android:layout_width="wrap_content"
android:visibility="gone"
android:layout_height="wrap_content" android:id="@+id/closeAllButton"
- app:layout_constraintTop_toBottomOf="@id/tutorialTextView"
+ app:layout_constraintTop_toBottomOf="@id/permissionButton"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/tutorialTextView"
android:backgroundTint="?colorPrimaryDark"
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -228,7 +228,7 @@
<string name="all_trips_removed">Tutti i trip GTFS sono rimossi dal database</string>
<!-- tutorial -->
- <string name="tutorial_action">Mostra tutorial</string>
+ <string name="tutorial_action">Mostra introduzione</string>
<string name="tutorial_first">
<![CDATA[Grazie per aver installato BusTO, l\'app gratuita, libera e <b>open source</b> per il trasporto pubblico di Torino. Stai usando un\'app <b>indipendente</b>, senza pubblicità e senza nessun tracciamento.
]]> </string>
@@ -251,7 +251,21 @@
<![CDATA[Tutte queste funzioni si trovano nel menu laterale.<br>
Guarda nelle <b>Impostazioni</b> per personalizzare l\'app come preferisci, e su <b>Informazioni</b> per sapere di più sull\'app e il team di sviluppo.]]>
</string>
- <string name="close_tutorial">Capito, chiudi il tutorial</string>
+ <string name="close_tutorial">Capito, chiudi introduzione</string>
+ <string name="close_tutorial_short">Chiudi introduzione</string>
+ <string name="tutorial_permissions">
+ <![CDATA[
+ L\'app usa le notifiche per fornire informazioni sullo stato delle attività.
+ Tocca il bottone per abilitarle.
+ ]]>
+ </string>
+
+ <string name="grant_location_permission">Abilita accesso alla posizione</string>
+ <string name="location_permission_granted">Accesso alla posizione abilitato</string>
+ <string name="grant_notification_permission">Abilita notifiche</string>
+ <string name="notification_permission_granted">Notifiche abilitate</string>
+
+
</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -286,6 +286,17 @@
<![CDATA[You can find all of this from the lateral menu.
Look in the <b>Settings</b> to customize the app behaviour, and in the <b>About the app</b> section if you want to know more about the app and the developers.]]>
</string>
+ <string name="tutorial_permissions">
+ <![CDATA[The app needs the <b>Notifications</b> permission to show the information about background processing.
+ Press the button below to grant it]]>
+ </string>
+ <string name="grant_location_permission">Grant location permission</string>
+ <string name="location_permission_granted">Location permission granted</string>
+
<string name="close_tutorial">OK, close the tutorial</string>
+ <string name="close_tutorial_short">Close the tutorial</string>
+ <string name="grant_notification_permission">Enable notifications</string>
+ <string name="notification_permission_granted">Notifications enabled</string>
+
</resources>

File Metadata

Mime Type
text/plain
Expires
Wed, Oct 23, 17:19 (7 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
641138
Default Alt Text
D147.1729696781.diff (25 KB)

Event Timeline