ソースを参照

auto upload folder icon implementation.
Commit id: 8c5ddaa from feature/NMCLOUD-629.

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>

A117870935 2 年 前
コミット
a8abd516e1

+ 44 - 0
app/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java

@@ -20,6 +20,7 @@
  */
 package com.owncloud.android.datamodel;
 
+import android.accounts.Account;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -405,4 +406,47 @@ public class SyncedFolderProvider extends Observable {
 
         return cv;
     }
+
+    /**
+     * method to check if sync folder for the remote path exist in table or not
+     *
+     * @param remotePath to be check
+     * @param user       for which we are looking
+     * @return
+     */
+    public boolean findByRemotePathAndAccount(String remotePath, User user) {
+        boolean result = false;
+
+        //if path ends with / then remove the last / to work the query right way
+        //because the sub folders of synced folders will not have the slash at the end
+        if (remotePath.endsWith("/")) {
+            remotePath = remotePath.substring(0, remotePath.length() - 1);
+        }
+
+        Cursor cursor = mContentResolver.query(
+            ProviderMeta.ProviderTableMeta.CONTENT_URI_SYNCED_FOLDERS,
+            null,
+            ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_REMOTE_PATH + " LIKE ? AND " +
+                ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ACCOUNT + " =? ",
+            new String[]{"%" + remotePath + "%", user.getAccountName()},
+            null);
+
+        if (cursor != null && cursor.getCount() >= 1) {
+            result = true;
+        } else {
+            if (cursor == null) {
+                Log_OC.e(TAG, "Sync folder db cursor for remote path = " + remotePath + " in NULL.");
+            } else {
+                Log_OC.e(TAG, cursor.getCount() + " items for remote path = " + remotePath
+                    + " available in sync folder db. Expected 1 or greater than 1. Failed to update sync folder db.");
+            }
+        }
+
+        if (cursor != null) {
+            cursor.close();
+        }
+
+        return result;
+
+    }
 }

+ 12 - 0
app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java

@@ -39,14 +39,19 @@ import android.widget.Toast;
 
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.core.Clock;
+import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.java.util.Optional;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.RichdocumentsWebviewBinding;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 
+import javax.inject.Inject;
+
 public abstract class EditorWebView extends ExternalSiteWebView {
     public static final int REQUEST_LOCAL_FILE = 101;
     public ValueCallback<Uri[]> uploadMessage;
@@ -56,6 +61,11 @@ public abstract class EditorWebView extends ExternalSiteWebView {
 
     RichdocumentsWebviewBinding binding;
 
+    private SyncedFolderProvider syncedFolderProvider;
+
+    @Inject
+    Clock clock;
+
     protected void loadUrl(String url) {
         onUrlLoaded(url);
     }
@@ -154,6 +164,7 @@ public abstract class EditorWebView extends ExternalSiteWebView {
             finish();
             return;
         }
+        syncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences, clock);
         initLoadingScreen(user.get());
     }
 
@@ -225,6 +236,7 @@ public abstract class EditorWebView extends ExternalSiteWebView {
                                                                                   file.isSharedWithSharee(),
                                                                               file.isSharedViaLink(),
                                                                               file.isEncrypted(),
+                                                                              syncedFolderProvider.findByRemotePathAndAccount(file.getRemotePath(), user),
                                                                               file.isGroupFolder(),
                                                                               file.getMountType(),
                                                                               this,

+ 8 - 0
app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -59,6 +59,7 @@ import android.widget.Toast;
 
 import com.google.android.material.button.MaterialButton;
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
@@ -66,6 +67,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.databinding.ReceiveExternalFilesBinding;
 import com.owncloud.android.databinding.UploadFileDialogBinding;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
@@ -143,6 +145,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
 
     @Inject AppPreferences preferences;
     @Inject LocalBroadcastManager localBroadcastManager;
+    @Inject Clock clock;
     private AccountManager mAccountManager;
     private Stack<String> mParents = new Stack<>();
     private List<Parcelable> mStreamsToUpload;
@@ -152,6 +155,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
     private SyncBroadcastReceiver mSyncBroadcastReceiver;
     private boolean mSyncInProgress;
 
+    private SyncedFolderProvider syncedFolderProvider;
+
     private final static int REQUEST_CODE__SETUP_ACCOUNT = REQUEST_CODE__LAST_SHARED + 1;
 
     private final static String KEY_PARENTS = "PARENTS";
@@ -189,6 +194,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
         binding = ReceiveExternalFilesBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
 
+        syncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences, clock);
+
         // Listen for sync messages
         IntentFilter syncIntentFilter = new IntentFilter(RefreshFolderOperation.
                                                              EVENT_SINGLE_FOLDER_CONTENTS_SYNCED);
@@ -772,6 +779,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
                                                          new int[]{R.id.filename},
                                                          getStorageManager(),
                                                          getUser().get(),
+                                                         syncedFolderProvider,
                                                          viewThemeUtils);
 
                 binding.list.setAdapter(sa);

+ 12 - 0
app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java

@@ -26,10 +26,12 @@ import android.graphics.Bitmap;
 import android.os.Bundle;
 
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.java.util.Optional;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.ShareActivityBinding;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -43,6 +45,8 @@ import com.owncloud.android.ui.fragment.FileDetailsSharingProcessFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 
+import javax.inject.Inject;
+
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentTransaction;
 
@@ -55,6 +59,11 @@ public class ShareActivity extends FileActivity {
 
     static final String TAG_SHARE_FRAGMENT = "SHARE_FRAGMENT";
 
+    private SyncedFolderProvider syncedFolderProvider;
+
+    @Inject
+    Clock clock;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -62,6 +71,8 @@ public class ShareActivity extends FileActivity {
         ShareActivityBinding binding = ShareActivityBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
 
+        syncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences, clock);
+
         OCFile file = getFile();
         Optional<User> optionalUser = getUser();
         if (!optionalUser.isPresent()) {
@@ -75,6 +86,7 @@ public class ShareActivity extends FileActivity {
                                                                                       file.isSharedWithSharee(),
                                                                                   file.isSharedViaLink(),
                                                                                   file.isEncrypted(),
+                                                                                  syncedFolderProvider.findByRemotePathAndAccount(file.getRemotePath(), optionalUser.get()),
                                                                                   file.isGroupFolder(),
                                                                                   file.getMountType(),
                                                                                   this,

+ 4 - 1
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -54,6 +54,7 @@ import com.owncloud.android.databinding.ListItemBinding;
 import com.owncloud.android.datamodel.DecryptedFolderMetadata;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.datamodel.VirtualFolderType;
 import com.owncloud.android.db.ProviderMeta;
@@ -136,6 +137,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
         Activity activity,
         @NonNull User user,
         AppPreferences preferences,
+        SyncedFolderProvider syncedFolderProvider,
         ComponentsGetter transferServiceGetter,
         OCFileListFragmentInterface ocFileListFragmentInterface,
         boolean argHideItemOptions,
@@ -173,7 +175,8 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                                                         .getCapability(activity)
                                                         .getVersion()
                                                         .isShareesOnDavSupported(),
-                                                    viewThemeUtils);
+                                                    viewThemeUtils,
+                                                    syncedFolderProvider);
 
         // initialise thumbnails cache on background thread
         new ThumbnailsCacheManager.InitDiskCacheTask().execute();

+ 5 - 2
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt

@@ -34,6 +34,7 @@ import com.nextcloud.client.preferences.AppPreferences
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.FileDataStorageManager
 import com.owncloud.android.datamodel.OCFile
+import com.owncloud.android.datamodel.SyncedFolderProvider
 import com.owncloud.android.datamodel.ThumbnailsCacheManager
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncGalleryImageDrawable
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.GalleryImageGenerationTask
@@ -61,7 +62,8 @@ class OCFileListDelegate(
     private val transferServiceGetter: ComponentsGetter,
     private val showMetadata: Boolean,
     private var showShareAvatar: Boolean,
-    private var viewThemeUtils: ViewThemeUtils
+    private var viewThemeUtils: ViewThemeUtils,
+    private val syncFolderProvider: SyncedFolderProvider? = null
 ) {
     private val checkedFiles: MutableSet<OCFile> = HashSet()
     private var highlightedItem: OCFile? = null
@@ -216,7 +218,8 @@ class OCFileListDelegate(
             context,
             gridViewHolder.shimmerThumbnail,
             preferences,
-            viewThemeUtils
+            viewThemeUtils,
+            syncFolderProvider
         )
         // item layout + click listeners
         bindGridItemLayout(file, gridViewHolder)

+ 5 - 0
app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java

@@ -34,6 +34,7 @@ import com.nextcloud.client.account.User;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncThumbnailDrawable;
 import com.owncloud.android.utils.DisplayUtils;
@@ -51,6 +52,7 @@ public class UploaderAdapter extends SimpleAdapter {
     private final FileDataStorageManager mStorageManager;
     private final LayoutInflater inflater;
     private final ViewThemeUtils viewThemeUtils;
+    private SyncedFolderProvider syncedFolderProvider;
 
     public UploaderAdapter(Context context,
                            List<? extends Map<String, ?>> data,
@@ -59,11 +61,13 @@ public class UploaderAdapter extends SimpleAdapter {
                            int[] to,
                            FileDataStorageManager storageManager,
                            User user,
+                           SyncedFolderProvider syncedFolderProvider,
                            ViewThemeUtils viewThemeUtils) {
         super(context, data, resource, from, to);
         this.user = user;
         mStorageManager = storageManager;
         mContext = context;
+        this.syncedFolderProvider = syncedFolderProvider;
         inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         this.viewThemeUtils = viewThemeUtils;
     }
@@ -104,6 +108,7 @@ public class UploaderAdapter extends SimpleAdapter {
             final Drawable icon = MimeTypeUtil.getFolderTypeIcon(isShared,
                                                                  file.isSharedViaLink(),
                                                                  file.isEncrypted(),
+                                                                 syncedFolderProvider.findByRemotePathAndAccount(file.getRemotePath(), user),
                                                                  file.isGroupFolder(),
                                                                  file.getMountType(),
                                                                  mContext,

+ 6 - 0
app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -41,6 +41,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.android.material.tabs.TabLayout;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.jobs.BackgroundJobManager;
 import com.nextcloud.client.network.ClientFactory;
@@ -53,6 +54,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.databinding.FileDetailsFragmentBinding;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
@@ -106,6 +108,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
     private View view;
     private User user;
     private OCFile parentFolder;
+    private SyncedFolderProvider syncedFolderProvider;
     private boolean previewLoaded;
 
     private FileDetailsFragmentBinding binding;
@@ -120,6 +123,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
     @Inject FileDataStorageManager storageManager;
     @Inject ViewThemeUtils viewThemeUtils;
     @Inject BackgroundJobManager backgroundJobManager;
+    @Inject Clock clock;
 
     /**
      * Public factory method to create new FileDetailFragment instances.
@@ -208,6 +212,8 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
             throw new IllegalArgumentException("Arguments may not be null");
         }
 
+        syncedFolderProvider =new SyncedFolderProvider(requireActivity().getContentResolver(), preferences, clock);
+
         setFile(arguments.getParcelable(ARG_FILE));
         parentFolder = arguments.getParcelable(ARG_PARENT_FOLDER);
         user = arguments.getParcelable(ARG_USER);

+ 8 - 0
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -50,6 +50,7 @@ import com.nextcloud.android.lib.resources.files.ToggleFileLockRemoteOperation;
 import com.nextcloud.android.lib.richWorkspace.RichWorkspaceDirectEditingRemoteOperation;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.DeviceInfo;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.documentscan.DocumentScanActivity;
@@ -67,6 +68,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.VirtualFolderType;
 import com.owncloud.android.lib.common.Creator;
 import com.owncloud.android.lib.common.OwnCloudClient;
@@ -202,6 +204,9 @@ public class OCFileListFragment extends ExtendedListFragment implements
     @Inject FastScrollUtils fastScrollUtils;
     @Inject EditorUtils editorUtils;
     @Inject ShortcutUtil shortcutUtil;
+    @Inject Clock clock;
+
+    private SyncedFolderProvider syncedFolderProvider;
 
     protected FileFragment.ContainerActivity mContainerActivity;
 
@@ -324,6 +329,8 @@ public class OCFileListFragment extends ExtendedListFragment implements
             viewThemeUtils.material.themeFAB(mFabMain);
         }
 
+        syncedFolderProvider = new SyncedFolderProvider(requireActivity().getContentResolver(), preferences, clock);
+
         Log_OC.i(TAG, "onCreateView() end");
         return v;
     }
@@ -422,6 +429,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
             getActivity(),
             accountManager.getUser(),
             preferences,
+            syncedFolderProvider,
             mContainerActivity,
             this,
             hideItemOptions,

+ 4 - 1
app/src/main/java/com/owncloud/android/utils/DisplayUtils.java

@@ -72,6 +72,7 @@ import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.ArbitraryDataProviderImpl;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.utils.Log_OC;
@@ -845,13 +846,15 @@ public final class DisplayUtils {
                                     Context context,
                                     LoaderImageView shimmerThumbnail,
                                     AppPreferences preferences,
-                                    ViewThemeUtils viewThemeUtils) {
+                                    ViewThemeUtils viewThemeUtils,
+                                    SyncedFolderProvider syncedFolderProvider) {
         if (file.isFolder()) {
             stopShimmer(shimmerThumbnail, thumbnailView);
             thumbnailView.setImageDrawable(MimeTypeUtil
                                                .getFolderTypeIcon(file.isSharedWithMe() || file.isSharedWithSharee(),
                                                                   file.isSharedViaLink(),
                                                                   file.isEncrypted(),
+                                                                  syncedFolderProvider != null && syncedFolderProvider.findByRemotePathAndAccount(file.getRemotePath(), user),
                                                                   file.isGroupFolder(),
                                                                   file.getMountType(),
                                                                   context,

+ 4 - 0
app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java

@@ -144,6 +144,7 @@ public final class MimeTypeUtil {
     public static Drawable getFolderTypeIcon(boolean isSharedViaUsers,
                                              boolean isSharedViaLink,
                                              boolean isEncrypted,
+                                             boolean isAutoUploadFolder,
                                              boolean isGroupFolder,
                                              WebdavEntry.MountType mountType,
                                              Context context,
@@ -158,6 +159,8 @@ public final class MimeTypeUtil {
             drawableId = R.drawable.folder_shared_users;
         } else if (isEncrypted) {
             drawableId = R.drawable.folder_encrypted;
+        } else if (isAutoUploadFolder) {
+            drawableId = R.drawable.folder_photo;
         } else if (WebdavEntry.MountType.EXTERNAL == mountType) {
             drawableId = R.drawable.folder_external;
         } else {
@@ -175,6 +178,7 @@ public final class MimeTypeUtil {
                                  false,
                                  false,
                                  false,
+                                 false,
                                  WebdavEntry.MountType.INTERNAL,
                                  context,
                                  viewThemeUtils);

+ 40 - 0
app/src/main/res/drawable/folder_photo.xml

@@ -0,0 +1,40 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="64dp"
+    android:height="64dp"
+    android:viewportWidth="64"
+    android:viewportHeight="64">
+    <path
+        android:fillColor="#fff"
+        android:pathData="M22.86,45.83a3.43,3.43 0,0 1,-3.43 -3.43L19.43,32.69a3.42,3.42 0,0 1,3.43 -3.43L25,29.26l1.72,-2.86L37.37,26.4l1.72,2.86h2a3.42,3.42 0,0 1,3.43 3.43L44.52,42.4a3.43,3.43 0,0 1,-3.43 3.43ZM21.14,32.69L21.14,42.4a1.67,1.67 0,0 0,1.64 1.71L41.14,44.11a1.67,1.67 0,0 0,1.72 -1.63L42.86,32.69A1.68,1.68 0,0 0,41.22 31L38.06,31l-1.72,-2.86L27.6,28.14L25.89,31h-3a1.68,1.68 0,0 0,-1.72 1.64ZM26.29,36.69A5.71,5.71 0,1 1,32 42.4,5.71 5.71,0 0,1 26.29,36.69ZM28,36.69a4,4 0,1 0,4 -4,3.94 3.94,0 0,0 -4,3.91ZM38.86,33.83A1.14,1.14 0,1 1,40 35,1.14 1.14,0 0,1 38.86,33.83Z" />
+    <path
+        android:fillColor="#53baf2"
+        android:pathData="M20.57,5.71H2.29A2.3,2.3 0,0 0,0 8v5.71H28.57Z" />
+    <path
+        android:fillAlpha="0.25"
+        android:fillColor="#317cb3"
+        android:pathData="M20.57,5.71H2.29A2.3,2.3 0,0 0,0 8v5.71H28.57Z"
+        android:strokeAlpha="0.25" />
+    <path android:pathData="M61.71,13.71H0V56a2.3,2.3 0,0 0,2.29 2.29H61.71A2.3,2.3 0,0 0,64 56V16A2.3,2.3 0,0 0,61.71 13.71Z">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="32"
+                android:endY="13.64"
+                android:startX="32"
+                android:startY="58.11"
+                android:type="linear">
+                <item
+                    android:color="#FF53BAF2"
+                    android:offset="0" />
+                <item
+                    android:color="#FF7ECBF5"
+                    android:offset="1" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillAlpha="0.9"
+        android:fillColor="#fff"
+        android:pathData="M44.43,46.67H19.57a3.48,3.48 0,0 1,-3.48 -3.49V30a3.48,3.48 0,0 1,3.48 -3.5h3.51l2.32,-3.88H38.6l2.32,3.88h3.51A3.5,3.5 0,0 1,47.91 30h0V43.18a3.5,3.5 0,0 1,-3.48 3.49ZM32,29.72a5.7,5.7 0,1 0,5.7 5.7A5.7,5.7 0,0 0,32 29.72ZM42.86,30a1.55,1.55 0,1 0,1.55 1.55A1.55,1.55 0,0 0,42.86 30Z"
+        android:strokeAlpha="0.9" />
+</vector>