[AA] Added Vehicle Listener interface
Added APIP to listen to Vehicle Speed if available.
This commit is contained in:
@@ -37,6 +37,7 @@ dependencies {
|
|||||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
|
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
|
||||||
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
|
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
|
||||||
implementation 'androidx.car.app:app:1.4.0'
|
implementation 'androidx.car.app:app:1.4.0'
|
||||||
|
implementation 'androidx.car.app:app-projected:1.4.0'
|
||||||
implementation 'androidx.concurrent:concurrent-futures:1.2.0'
|
implementation 'androidx.concurrent:concurrent-futures:1.2.0'
|
||||||
|
|
||||||
// Color Picker Preference
|
// Color Picker Preference
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="android.car.permission.CAR_INFO"/>
|
||||||
|
<uses-permission android:name="com.google.android.gms.permission.CAR_SPEED" />
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="32"
|
<uses-sdk android:minSdkVersion="32"
|
||||||
android:targetSdkVersion="34" />
|
android:targetSdkVersion="34" />
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.aldo.apps.familyhelpers;
|
|||||||
|
|
||||||
import static android.Manifest.permission.CAMERA;
|
import static android.Manifest.permission.CAMERA;
|
||||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||||
|
import static com.aldo.apps.familyhelpers.utils.GlobalConstants.CAR_SPEED_PERMISSION;
|
||||||
import static com.aldo.apps.familyhelpers.utils.GlobalConstants.SIGN_IN_PROVIDERS;
|
import static com.aldo.apps.familyhelpers.utils.GlobalConstants.SIGN_IN_PROVIDERS;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -168,6 +169,9 @@ public class HelperGridActivity extends AppCompatActivity {
|
|||||||
Log.d(TAG, "launchHelper: Notifications not allowed, return...");
|
Log.d(TAG, "launchHelper: Notifications not allowed, return...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!requestVehicleSpeedPermission()) {
|
||||||
|
Log.d(TAG, "launchHelper: Permission not granted cannot read vehicle speed.");
|
||||||
|
}
|
||||||
if (mLocationHelper.requestLocationPermissions(HelperGridActivity.this)
|
if (mLocationHelper.requestLocationPermissions(HelperGridActivity.this)
|
||||||
&& mLocationHelper.requestBackgroundLocationPermission(HelperGridActivity.this)) {
|
&& mLocationHelper.requestBackgroundLocationPermission(HelperGridActivity.this)) {
|
||||||
Log.d(TAG, "launchHelper: Permission already granted");
|
Log.d(TAG, "launchHelper: Permission already granted");
|
||||||
@@ -232,6 +236,26 @@ public class HelperGridActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to request the VehicleSpeed permission before launching the ShareLocationActivity.
|
||||||
|
*
|
||||||
|
* @return true if granted, flase otherwise.
|
||||||
|
*/
|
||||||
|
private boolean requestVehicleSpeedPermission() {
|
||||||
|
if (ContextCompat.checkSelfPermission(this, CAR_SPEED_PERMISSION) ==
|
||||||
|
PackageManager.PERMISSION_GRANTED) {
|
||||||
|
// Permission already granted
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (shouldShowRequestPermissionRationale(CAR_SPEED_PERMISSION)) {
|
||||||
|
Toast.makeText(HelperGridActivity.this, "Consider granting this for the vehicle speed in Android Auto to be more accurate",
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
mRequestPermissionLauncher.launch(CAR_SPEED_PERMISSION);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to request the CameraPermission as it is required to access the
|
* Helper method to request the CameraPermission as it is required to access the
|
||||||
* flashlight settings.
|
* flashlight settings.
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ import androidx.car.app.model.GridTemplate;
|
|||||||
import androidx.car.app.model.ItemList;
|
import androidx.car.app.model.ItemList;
|
||||||
import androidx.car.app.model.Template;
|
import androidx.car.app.model.Template;
|
||||||
import androidx.core.graphics.drawable.IconCompat;
|
import androidx.core.graphics.drawable.IconCompat;
|
||||||
|
import androidx.lifecycle.Lifecycle;
|
||||||
|
import androidx.lifecycle.LifecycleEventObserver;
|
||||||
|
import androidx.lifecycle.LifecycleObserver;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
|
|
||||||
import com.aldo.apps.familyhelpers.R;
|
import com.aldo.apps.familyhelpers.R;
|
||||||
import com.aldo.apps.familyhelpers.workers.LocationHelper;
|
import com.aldo.apps.familyhelpers.workers.LocationHelper;
|
||||||
@@ -36,6 +40,26 @@ public class ShareLocationScreen extends Screen {
|
|||||||
*/
|
*/
|
||||||
private LocationHelper mLocationHelper;
|
private LocationHelper mLocationHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link VehicleInformationHelper} to read vehicle information in AA use case.
|
||||||
|
*/
|
||||||
|
private VehicleInformationHelper mVehicleInformationHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link LifecycleObserver} to stop listening to Vehicle Speed updates when AA ends.
|
||||||
|
*/
|
||||||
|
private LifecycleObserver mLifecycleObserver = new LifecycleEventObserver() {
|
||||||
|
@Override
|
||||||
|
public void onStateChanged(@NonNull final LifecycleOwner lifecycleOwner,
|
||||||
|
@NonNull final Lifecycle.Event event) {
|
||||||
|
|
||||||
|
if (event == Lifecycle.Event.ON_STOP) {
|
||||||
|
Log.d(TAG, "onStateChanged: Activity stopped, unsubscribe");
|
||||||
|
mVehicleInformationHelper.unsubscribeFromSpeedValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* C'Tor.
|
* C'Tor.
|
||||||
*
|
*
|
||||||
@@ -44,6 +68,8 @@ public class ShareLocationScreen extends Screen {
|
|||||||
protected ShareLocationScreen(@NonNull CarContext carContext) {
|
protected ShareLocationScreen(@NonNull CarContext carContext) {
|
||||||
super(carContext);
|
super(carContext);
|
||||||
Log.d(TAG, "ShareLocationScreen() called with: carContext = [" + carContext + "]");
|
Log.d(TAG, "ShareLocationScreen() called with: carContext = [" + carContext + "]");
|
||||||
|
mVehicleInformationHelper = new VehicleInformationHelper(carContext);
|
||||||
|
getLifecycle().addObserver(mLifecycleObserver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExperimentalCarApi
|
@ExperimentalCarApi
|
||||||
@@ -52,6 +78,7 @@ public class ShareLocationScreen extends Screen {
|
|||||||
public Template onGetTemplate() {
|
public Template onGetTemplate() {
|
||||||
Log.d(TAG, "onGetTemplate() called");
|
Log.d(TAG, "onGetTemplate() called");
|
||||||
mLocationHelper = LocationHelper.getInstance(getCarContext());
|
mLocationHelper = LocationHelper.getInstance(getCarContext());
|
||||||
|
mVehicleInformationHelper.subscribeToSpeedValues(getCarContext());
|
||||||
|
|
||||||
final GridItem startItem = new GridItem.Builder()
|
final GridItem startItem = new GridItem.Builder()
|
||||||
.setTitle(getString(R.string.android_auto_share_location_start))
|
.setTitle(getString(R.string.android_auto_share_location_start))
|
||||||
@@ -67,10 +94,18 @@ public class ShareLocationScreen extends Screen {
|
|||||||
.setOnClickListener(this::stopLocationSharingService)
|
.setOnClickListener(this::stopLocationSharingService)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
final GridItem startNavigation = new GridItem.Builder()
|
||||||
|
.setTitle(getString(R.string.android_auto_share_location_navigation_title))
|
||||||
|
.setText(getString(R.string.android_auto_share_location_naviagation_summary))
|
||||||
|
.setImage(getIconForResource(R.drawable.ic_navigation), GridItem.IMAGE_TYPE_ICON)
|
||||||
|
.setOnClickListener(this::startNavigationScreen)
|
||||||
|
.build();
|
||||||
|
|
||||||
final ItemList itemList = new ItemList.Builder()
|
final ItemList itemList = new ItemList.Builder()
|
||||||
.setNoItemsMessage(getString(R.string.android_auto_share_location_no_items_yet))
|
.setNoItemsMessage(getString(R.string.android_auto_share_location_no_items_yet))
|
||||||
.addItem(startItem)
|
.addItem(startItem)
|
||||||
.addItem(stopItem)
|
.addItem(stopItem)
|
||||||
|
.addItem(startNavigation)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return new GridTemplate.Builder()
|
return new GridTemplate.Builder()
|
||||||
@@ -125,6 +160,13 @@ public class ShareLocationScreen extends Screen {
|
|||||||
getCarContext().stopService(serviceIntent);
|
getCarContext().stopService(serviceIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to start The Navigation screen.
|
||||||
|
*/
|
||||||
|
private void startNavigationScreen() {
|
||||||
|
CarToast.makeText(getCarContext(), "Not yet implemented", CarToast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to extract a string resource.
|
* Helper method to extract a string resource.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package com.aldo.apps.familyhelpers.auto;
|
||||||
|
|
||||||
|
import static com.aldo.apps.familyhelpers.utils.GlobalConstants.CAR_SPEED_PERMISSION;
|
||||||
|
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.car.app.CarContext;
|
||||||
|
import androidx.car.app.hardware.CarHardwareManager;
|
||||||
|
import androidx.car.app.hardware.info.CarInfo;
|
||||||
|
import androidx.car.app.hardware.info.Speed;
|
||||||
|
|
||||||
|
import com.aldo.apps.familyhelpers.workers.LocationHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to retrieve a set of {@link CarInfo} to be used in other functionalities.
|
||||||
|
*/
|
||||||
|
public class VehicleInformationHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag for debugging purposes.
|
||||||
|
*/
|
||||||
|
private static final String TAG = "VehicleInformationHelper";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link CarInfo} as retrieved from the CarService.
|
||||||
|
*/
|
||||||
|
private CarInfo mCarInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link LocationHelper} to apply the speed in.
|
||||||
|
*/
|
||||||
|
private LocationHelper mLocationHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* C'Tor.
|
||||||
|
*
|
||||||
|
* @param carContext The {@link CarContext} from which this was instantiated.
|
||||||
|
*/
|
||||||
|
public VehicleInformationHelper(final CarContext carContext) {
|
||||||
|
if (carContext.checkCallingOrSelfPermission(CAR_SPEED_PERMISSION) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
Log.w(TAG, "VehicleInformationHelper: Nothing to do, permission not granted");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mLocationHelper = LocationHelper.getInstance(carContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subscribe to the Vehicle Speed and handle it.
|
||||||
|
*
|
||||||
|
* @param carContext The {@link CarContext} from which this was called.
|
||||||
|
*/
|
||||||
|
public void subscribeToSpeedValues(final CarContext carContext) {
|
||||||
|
if (carContext.checkCallingOrSelfPermission(CAR_SPEED_PERMISSION) == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
mCarInfo = carContext.getCarService(CarHardwareManager.class).getCarInfo();
|
||||||
|
if (mCarInfo == null) {
|
||||||
|
Log.e(TAG, "subscribeToSpeedValues: No car info available");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mCarInfo.addSpeedListener(carContext.getMainExecutor(), this::handleReceivedSpeed);
|
||||||
|
} else {
|
||||||
|
Log.w(TAG, "subscribeToSpeedValues: No Speed permission granted, cannot subscribe");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When AA ends, unsubscribe from the speed value again.
|
||||||
|
*/
|
||||||
|
public void unsubscribeFromSpeedValue() {
|
||||||
|
mCarInfo.removeSpeedListener(this::handleReceivedSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the received speed value by publishing it to the {@link LocationHelper}.
|
||||||
|
*
|
||||||
|
* @param data The {@link Speed} data.
|
||||||
|
*/
|
||||||
|
private void handleReceivedSpeed(@NonNull final Speed data) {
|
||||||
|
mLocationHelper.updateVehicleSpeed(data.getDisplaySpeedMetersPerSecond());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -126,6 +126,17 @@ public class LocationObject {
|
|||||||
return speed;
|
return speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for the speed to be used if the speed is received from the vehicle.
|
||||||
|
*
|
||||||
|
* @param vehicleSpeed The received vehicle speed.
|
||||||
|
*/
|
||||||
|
public void setSpeed(final Float vehicleSpeed) {
|
||||||
|
if (vehicleSpeed != null) {
|
||||||
|
speed = vehicleSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the last received timestamp.
|
* Returns the last received timestamp.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -77,6 +77,12 @@ public final class GlobalConstants {
|
|||||||
new AuthUI.IdpConfig.GoogleBuilder().build()
|
new AuthUI.IdpConfig.GoogleBuilder().build()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the permission for the VehicleSpeed.
|
||||||
|
*/
|
||||||
|
public static final String CAR_SPEED_PERMISSION = "com.google.android.gms.permission.CAR_SPEED";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private C'tor to prevent instantiation.
|
* Private C'tor to prevent instantiation.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import android.util.Log;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.car.app.hardware.common.CarValue;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.app.NotificationCompat;
|
import androidx.core.app.NotificationCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
@@ -96,7 +97,6 @@ public final class LocationHelper {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link BehaviorSubject} for the {@link LocationObject} for clients to subscribe to.
|
* The {@link BehaviorSubject} for the {@link LocationObject} for clients to subscribe to.
|
||||||
* TODO: Check if needed.
|
|
||||||
*/
|
*/
|
||||||
private final BehaviorSubject<LocationObject> mLocationSubject = BehaviorSubject.create();
|
private final BehaviorSubject<LocationObject> mLocationSubject = BehaviorSubject.create();
|
||||||
/**
|
/**
|
||||||
@@ -111,6 +111,11 @@ public final class LocationHelper {
|
|||||||
* The {@link BehaviorSubject} holding the state of current subscription.
|
* The {@link BehaviorSubject} holding the state of current subscription.
|
||||||
*/
|
*/
|
||||||
private final BehaviorSubject<Boolean> mSharingStateSubject = BehaviorSubject.createDefault(false);
|
private final BehaviorSubject<Boolean> mSharingStateSubject = BehaviorSubject.createDefault(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link CarValue} of the vehicles speed in meters per second if available.
|
||||||
|
*/
|
||||||
|
private CarValue<Float> mVehicleSpeed;
|
||||||
/**
|
/**
|
||||||
* Boolean flag to check whether a subscription for location updates is already running or not.
|
* Boolean flag to check whether a subscription for location updates is already running or not.
|
||||||
*/
|
*/
|
||||||
@@ -176,6 +181,11 @@ public final class LocationHelper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateVehicleSpeed(final CarValue<Float> vehicleSpeed) {
|
||||||
|
Log.d(TAG, "updateVehicleSpeed() called with: vehicleSpeed = [" + vehicleSpeed + "]");
|
||||||
|
mVehicleSpeed = vehicleSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request the permission for {@link android.Manifest.permission#ACCESS_BACKGROUND_LOCATION} if not
|
* Request the permission for {@link android.Manifest.permission#ACCESS_BACKGROUND_LOCATION} if not
|
||||||
* yet granted before.
|
* yet granted before.
|
||||||
@@ -296,6 +306,10 @@ public final class LocationHelper {
|
|||||||
*/
|
*/
|
||||||
private void handleReceivedLocation(final Location location) {
|
private void handleReceivedLocation(final Location location) {
|
||||||
final LocationObject locationObject = LocationObject.fromLocation(location);
|
final LocationObject locationObject = LocationObject.fromLocation(location);
|
||||||
|
if (mVehicleSpeed != null && mVehicleSpeed.getStatus() == CarValue.STATUS_SUCCESS) {
|
||||||
|
Log.d(TAG, "handleReceivedLocation: VehicleSpeed available");
|
||||||
|
locationObject.setSpeed(mVehicleSpeed.getValue());
|
||||||
|
}
|
||||||
Log.d(TAG, "onLocationChanged: Received update with " + locationObject);
|
Log.d(TAG, "onLocationChanged: Received update with " + locationObject);
|
||||||
mLocationSubject.onNext(locationObject);
|
mLocationSubject.onNext(locationObject);
|
||||||
mDbHelper.insertOrUpdateLocation(locationObject);
|
mDbHelper.insertOrUpdateLocation(locationObject);
|
||||||
|
|||||||
7
app/src/main/res/drawable/ic_navigation.xml
Normal file
7
app/src/main/res/drawable/ic_navigation.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<vector android:height="200dp" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="#00000000"
|
||||||
|
android:pathData="M12,6H12.01M9,20L3,17V4L5,5M9,20L15,17M9,20V14M15,17L21,20V7L19,6M15,17V14M15,6.2C15,7.967 13.5,9.4 12,11C10.5,9.4 9,7.967 9,6.2C9,4.433 10.343,3 12,3C13.657,3 15,4.433 15,6.2Z"
|
||||||
|
android:strokeColor="#000000" android:strokeLineCap="round"
|
||||||
|
android:strokeLineJoin="round" android:strokeWidth="2"/>
|
||||||
|
</vector>
|
||||||
@@ -1,16 +1,4 @@
|
|||||||
<vector android:height="200dp" android:viewportHeight="24"
|
<vector android:height="200dp" android:viewportHeight="24"
|
||||||
android:viewportWidth="24" android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
android:viewportWidth="24" android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<path android:fillColor="#00000000"
|
<path android:fillColor="#292D32" android:pathData="M22,11.25H19.96C19.6,7.44 16.56,4.39 12.75,4.04V2C12.75,1.59 12.41,1.25 12,1.25C11.59,1.25 11.25,1.59 11.25,2V4.04C7.44,4.4 4.39,7.44 4.04,11.25H2C1.59,11.25 1.25,11.59 1.25,12C1.25,12.41 1.59,12.75 2,12.75H4.04C4.4,16.56 7.44,19.61 11.25,19.96V22C11.25,22.41 11.59,22.75 12,22.75C12.41,22.75 12.75,22.41 12.75,22V19.96C16.56,19.6 19.61,16.56 19.96,12.75H22C22.41,12.75 22.75,12.41 22.75,12C22.75,11.59 22.41,11.25 22,11.25ZM12,15.12C10.28,15.12 8.88,13.72 8.88,12C8.88,10.28 10.28,8.88 12,8.88C13.72,8.88 15.12,10.28 15.12,12C15.12,13.72 13.72,15.12 12,15.12Z"/>
|
||||||
android:pathData="M4,12C4,13.381 5.119,14.5 6.5,14.5C7.881,14.5 9,13.381 9,12C9,10.619 7.881,9.5 6.5,9.5"
|
|
||||||
android:strokeColor="#1C274C" android:strokeLineCap="round" android:strokeWidth="1.5"/>
|
|
||||||
<path android:fillColor="#00000000" android:pathData="M14,6.5L9,10"
|
|
||||||
android:strokeColor="#1C274C" android:strokeLineCap="round" android:strokeWidth="1.5"/>
|
|
||||||
<path android:fillColor="#00000000" android:pathData="M14,17.5L9,14"
|
|
||||||
android:strokeColor="#1C274C" android:strokeLineCap="round" android:strokeWidth="1.5"/>
|
|
||||||
<path android:fillColor="#00000000"
|
|
||||||
android:pathData="M16.5,21C17.881,21 19,19.881 19,18.5C19,17.119 17.881,16 16.5,16C15.119,16 14,17.119 14,18.5"
|
|
||||||
android:strokeColor="#1C274C" android:strokeLineCap="round" android:strokeWidth="1.5"/>
|
|
||||||
<path android:fillColor="#00000000"
|
|
||||||
android:pathData="M18.665,6.75C17.975,7.946 16.446,8.355 15.25,7.665C14.054,6.975 13.644,5.446 14.335,4.25C15.025,3.054 16.554,2.645 17.75,3.335"
|
|
||||||
android:strokeColor="#1C274C" android:strokeLineCap="round" android:strokeWidth="1.5"/>
|
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
<vector android:height="200dp" android:viewportHeight="24"
|
<vector android:height="200dp" android:viewportHeight="24"
|
||||||
android:viewportWidth="24" android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
android:viewportWidth="24" android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<path android:fillColor="#00000000"
|
<path android:fillColor="#292D32" android:pathData="M22.751,11.999C22.751,12.409 22.411,12.749 22.001,12.749H19.961C19.611,16.559 16.561,19.609 12.751,19.959V21.999C12.751,22.409 12.411,22.749 12.001,22.749C11.591,22.749 11.251,22.409 11.251,21.999V19.959C10.641,19.909 10.041,19.779 9.471,19.589C8.761,19.349 8.541,18.449 9.071,17.919L11.881,15.109C11.921,15.119 11.951,15.119 11.991,15.119C13.721,15.119 15.111,13.729 15.111,11.999C15.111,11.959 15.111,11.929 15.101,11.889L17.911,9.079C18.441,8.549 19.341,8.769 19.581,9.479C19.771,10.049 19.901,10.639 19.951,11.259H22.001C22.411,11.249 22.751,11.589 22.751,11.999Z"/>
|
||||||
android:pathData="M12,12m-9,0a9,9 0,1 1,18 0a9,9 0,1 1,-18 0"
|
<path android:fillColor="#292D32" android:pathData="M21.77,2.23C21.47,1.93 20.98,1.93 20.68,2.23L17.07,5.84C15.87,4.85 14.37,4.2 12.74,4.05V2C12.74,1.59 12.4,1.25 11.99,1.25C11.58,1.25 11.24,1.59 11.24,2V4.04C7.43,4.4 4.38,7.44 4.03,11.25H2C1.59,11.25 1.25,11.59 1.25,12C1.25,12.41 1.59,12.75 2,12.75H4.04C4.19,14.38 4.84,15.88 5.83,17.08L2.22,20.69C1.92,20.99 1.92,21.48 2.22,21.78C2.38,21.92 2.57,22 2.77,22C2.97,22 3.16,21.92 3.31,21.77L21.77,3.31C22.08,3.01 22.08,2.53 21.77,2.23ZM8.88,12C8.88,10.28 10.28,8.88 12,8.88C12.58,8.88 13.12,9.05 13.58,9.33L9.33,13.58C9.05,13.12 8.88,12.58 8.88,12Z"/>
|
||||||
android:strokeColor="#33363F" android:strokeWidth="2"/>
|
|
||||||
<path android:fillColor="#00000000" android:pathData="M18,18L6,6"
|
|
||||||
android:strokeColor="#33363F" android:strokeWidth="2"/>
|
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -63,13 +63,15 @@
|
|||||||
<string name="android_auto_actions_start_sharing">Ja, fang an zu teilen</string>
|
<string name="android_auto_actions_start_sharing">Ja, fang an zu teilen</string>
|
||||||
<string name="android_auto_actions_stop_sharing">Ja, hör auf zu teilen</string>
|
<string name="android_auto_actions_stop_sharing">Ja, hör auf zu teilen</string>
|
||||||
<string name="android_auto_share_location_start">Start</string>
|
<string name="android_auto_share_location_start">Start</string>
|
||||||
<string name="android_auto_share_location_start_desc">Standrot teilen</string>
|
<string name="android_auto_share_location_start_desc">Standort teilen</string>
|
||||||
<string name="android_auto_share_location_stop">Stop</string>
|
<string name="android_auto_share_location_stop">Stop</string>
|
||||||
<string name="android_auto_share_location_stop_desc">Nicht mehr teilen</string>
|
<string name="android_auto_share_location_stop_desc">Nicht mehr teilen</string>
|
||||||
<string name="pref_on_screen_flashlight_custom_color_summary">Wähle eine eigene Farbe für deine Bildschirm-Taschenlampe</string>
|
<string name="pref_on_screen_flashlight_custom_color_summary">Wähle eine eigene Farbe für deine Bildschirm-Taschenlampe</string>
|
||||||
<string name="flashlight_on_screen_custom_color">Eigene Farbe</string>
|
<string name="flashlight_on_screen_custom_color">Eigene Farbe</string>
|
||||||
<string name="android_auto_share_location_no_items_yet">Noch keine Einträge, seltsam...</string>
|
<string name="android_auto_share_location_no_items_yet">Noch keine Einträge, seltsam…</string>
|
||||||
<string name="android_auto_share_location_already_sharing">Du teilst deinen Standort schon</string>
|
<string name="android_auto_share_location_already_sharing">Du teilst deinen Standort schon</string>
|
||||||
<string name="android_auto_share_location_not_yet_sharing">Du teilst deinen Standort noch nicht</string>
|
<string name="android_auto_share_location_not_yet_sharing">Du teilst deinen Standort noch nicht</string>
|
||||||
|
<string name="android_auto_share_location_navigation_title">Navigation</string>
|
||||||
|
<string name="android_auto_share_location_naviagation_summary">Teilen und navigieren</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -71,6 +71,8 @@
|
|||||||
<string name="android_auto_share_location_no_items_yet">No Items yet, something went wrong</string>
|
<string name="android_auto_share_location_no_items_yet">No Items yet, something went wrong</string>
|
||||||
<string name="android_auto_share_location_already_sharing">You already share your location</string>
|
<string name="android_auto_share_location_already_sharing">You already share your location</string>
|
||||||
<string name="android_auto_share_location_not_yet_sharing">You are not yet sharing your location</string>
|
<string name="android_auto_share_location_not_yet_sharing">You are not yet sharing your location</string>
|
||||||
|
<string name="android_auto_share_location_navigation_title">Navigate</string>
|
||||||
|
<string name="android_auto_share_location_naviagation_summary">Share and navigate</string>
|
||||||
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -100,5 +100,7 @@
|
|||||||
<string name="android_auto_share_location_no_items_yet">No Items yet, something went wrong</string>
|
<string name="android_auto_share_location_no_items_yet">No Items yet, something went wrong</string>
|
||||||
<string name="android_auto_share_location_already_sharing">You already share your location</string>
|
<string name="android_auto_share_location_already_sharing">You already share your location</string>
|
||||||
<string name="android_auto_share_location_not_yet_sharing">You are not yet sharing your location</string>
|
<string name="android_auto_share_location_not_yet_sharing">You are not yet sharing your location</string>
|
||||||
|
<string name="android_auto_share_location_navigation_title">Navigate</string>
|
||||||
|
<string name="android_auto_share_location_naviagation_summary">Share and navigate</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user