fix: script list not updated when script is renamed, deleted or created

This commit is contained in:
hyb1996
2017-09-30 20:45:48 +08:00
parent f35de5ce02
commit 7eb0bec0a7
11 changed files with 219 additions and 53 deletions

View File

@@ -0,0 +1,52 @@
package com.stardust.scriptdroid.external.floatingwindow;
import android.content.Context;
import android.content.Intent;
import android.view.WindowManager;
import android.widget.Toast;
import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.enhancedfloaty.FloatyWindow;
import com.stardust.enhancedfloaty.util.FloatingWindowPermissionUtil;
import com.stardust.scriptdroid.R;
import ezy.assist.compat.SettingsCompat;
/**
* Created by Stardust on 2017/9/30.
*/
public class FloatyWindowManger {
public static void addWindow(Context context, FloatyWindow window) {
context.startService(new Intent(context, FloatyService.class));
if (SettingsCompat.canDrawOverlays(context)) {
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
manageDrawOverlays(context);
return;
}
try {
FloatyService.addWindow(window);
// SecurityException: https://github.com/hyb1996-guest/AutoJsIssueReport/issues/4781
} catch (Exception e) {
e.printStackTrace();
manageDrawOverlays(context);
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
}
}
public static void manageDrawOverlays(Context context) {
try {
SettingsCompat.manageDrawOverlays(context);
} catch (Exception ex) {
FloatingWindowPermissionUtil.goToAppDetailSettings(context, context.getPackageName());
}
}
public static void closeWindow(FloatyWindow window) {
window.close();
}
}

View File

@@ -2,6 +2,7 @@ package com.stardust.scriptdroid.script;
import android.os.Environment; import android.os.Environment;
import android.renderscript.Script; import android.renderscript.Script;
import android.support.annotation.Nullable;
import com.stardust.autojs.script.AutoFileSource; import com.stardust.autojs.script.AutoFileSource;
import com.stardust.autojs.script.JavaScriptFileSource; import com.stardust.autojs.script.JavaScriptFileSource;
@@ -34,6 +35,11 @@ public class ScriptFile extends File {
init(); init();
} }
public ScriptFile(String parent, String name) {
super(parent, name);
init();
}
private void init() { private void init() {
mSimplifiedName = PFile.getNameWithoutExtension(getName()); mSimplifiedName = PFile.getNameWithoutExtension(getName());
mSimplifyPath = getPath(); mSimplifyPath = getPath();
@@ -54,6 +60,17 @@ public class ScriptFile extends File {
return renameTo(new File(getParent(), newName + "." + getExtension())); return renameTo(new File(getParent(), newName + "." + getExtension()));
} }
@Nullable
public ScriptFile renameAndReturnNewFile(String newName) {
ScriptFile newFile = isDirectory() ? new ScriptFile(getParent(), newName) :
new ScriptFile(getParent(), newName + "." + getExtension());
if (renameTo(newFile)) {
return newFile;
} else {
return null;
}
}
private String getExtension() { private String getExtension() {
return PFile.getExtension(getName()); return PFile.getExtension(getName());
} }
@@ -123,10 +140,10 @@ public class ScriptFile extends File {
return renameTo(new File(to, getName())); return renameTo(new File(to, getName()));
} }
public ScriptSource toSource(){ public ScriptSource toSource() {
if(getType() == TYPE_JAVA_SCRIPT){ if (getType() == TYPE_JAVA_SCRIPT) {
return new JavaScriptFileSource(this); return new JavaScriptFileSource(this);
}else { } else {
return new AutoFileSource(this); return new AutoFileSource(this);
} }
} }

View File

@@ -4,18 +4,19 @@ import android.os.Environment;
import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
import com.stardust.util.FileSorter;
import com.stardust.util.LimitedHashMap; import com.stardust.util.LimitedHashMap;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.ObservableSource;
import io.reactivex.annotations.NonNull; import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function; import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
/** /**
* Created by Stardust on 2017/3/31. * Created by Stardust on 2017/3/31.
@@ -23,13 +24,48 @@ import io.reactivex.schedulers.Schedulers;
public class StorageFileProvider { public class StorageFileProvider {
public static final int REMOVE = 0;
public static final int CREATE = 1;
public static final int CHANGE = 2;
public static final int ALL = 3;
public static class DirectoryChangeEvent { public static class DirectoryChangeEvent {
public ScriptFile directory;
private final ScriptFile mDir;
private final int mChange;
private final ScriptFile mFile;
private final ScriptFile mNewFile;
public DirectoryChangeEvent(ScriptFile dir, int change, ScriptFile file) {
this(dir, change, file, file);
}
public DirectoryChangeEvent(ScriptFile directory) { public DirectoryChangeEvent(ScriptFile directory) {
this.directory = directory; this(directory, ALL, null);
}
public DirectoryChangeEvent(ScriptFile dir, int change, ScriptFile oldFile, ScriptFile newFile) {
mDir = dir;
mChange = change;
mFile = oldFile;
mNewFile = newFile;
}
public ScriptFile getDir() {
return mDir;
}
public int getChange() {
return mChange;
}
public ScriptFile getFile() {
return mFile;
}
public ScriptFile getNewFile() {
return mNewFile;
} }
} }
@@ -53,7 +89,7 @@ public class StorageFileProvider {
} }
private EventBus mDirectoryEventBus = new EventBus(); private EventBus mDirectoryEventBus = new EventBus();
private LimitedHashMap<String, ScriptFile[]> mScriptFileCache; private LimitedHashMap<String, List<ScriptFile>> mScriptFileCache;
private ScriptFile mInitialDirectory; private ScriptFile mInitialDirectory;
private ScriptFile[] mInitialDirectoryScriptFiles; private ScriptFile[] mInitialDirectoryScriptFiles;
@@ -75,6 +111,35 @@ public class StorageFileProvider {
mDirectoryEventBus.post(new DirectoryChangeEvent(directory)); mDirectoryEventBus.post(new DirectoryChangeEvent(directory));
} }
public void notifyFileChanged(ScriptFile dir, ScriptFile oldFile, ScriptFile newFile) {
List<ScriptFile> files = getScriptFilesFromCache(dir);
if (files == null)
return;
int i = files.indexOf(oldFile);
if (i >= 0) {
files.set(i, newFile);
mDirectoryEventBus.post(new DirectoryChangeEvent(dir, CHANGE, oldFile, newFile));
}
}
public void notifyFileRemoved(ScriptFile dir, ScriptFile file) {
List<ScriptFile> files = getScriptFilesFromCache(dir);
if (files == null)
return;
if (files.remove(file)) {
mDirectoryEventBus.post(new DirectoryChangeEvent(dir, REMOVE, file));
}
}
public void notifyFileCreated(ScriptFile dir, ScriptFile file) {
List<ScriptFile> files = getScriptFilesFromCache(dir);
if (files == null)
return;
files.add(0, file);
mDirectoryEventBus.post(new DirectoryChangeEvent(dir, CREATE, file));
}
public void notifyStoragePermissionGranted() { public void notifyStoragePermissionGranted() {
mScriptFileCache.clear(); mScriptFileCache.clear();
mInitialDirectoryScriptFiles = null; mInitialDirectoryScriptFiles = null;
@@ -101,11 +166,11 @@ public class StorageFileProvider {
} }
public Observable<ScriptFile> getDirectoryScriptFiles(ScriptFile directory) { public Observable<ScriptFile> getDirectoryScriptFiles(ScriptFile directory) {
ScriptFile[] scriptFiles = getScriptFilesFromCache(directory); List<ScriptFile> scriptFiles = getScriptFilesFromCache(directory);
if (scriptFiles == null) { if (scriptFiles == null) {
return listAndSortFiles(directory); return listFiles(directory);
} }
return Observable.fromArray(scriptFiles); return Observable.fromIterable(scriptFiles);
} }
private void clearCache(ScriptFile directory) { private void clearCache(ScriptFile directory) {
@@ -113,27 +178,19 @@ public class StorageFileProvider {
} }
private Observable<ScriptFile> listAndSortFiles(ScriptFile directory) { private Observable<ScriptFile> listFiles(ScriptFile directory) {
return Observable.just(directory) return Observable.just(directory)
.observeOn(Schedulers.computation()) .flatMap(new Function<ScriptFile, ObservableSource<ScriptFile>>() {
.flatMap(new Function<ScriptFile, Observable<ScriptFile>>() {
@Override @Override
public Observable<ScriptFile> apply(@NonNull ScriptFile dir) throws Exception { public ObservableSource<ScriptFile> apply(@NonNull ScriptFile dir) throws Exception {
ScriptFile[] scriptFiles = dir.listFiles(); ScriptFile[] scriptFiles = dir.listFiles();
if (scriptFiles == null) { mScriptFileCache.put(dir.getPath(), new ArrayList<>(Arrays.asList(scriptFiles)));
return Observable.empty(); return Observable.fromArray(scriptFiles);
} else {
FileSorter.sort(scriptFiles, FileSorter.NAME);
mScriptFileCache.put(dir.getPath(), scriptFiles);
return Observable.fromArray(scriptFiles);
}
} }
}); });
} }
private ScriptFile[] getScriptFilesFromCache(ScriptFile directory) { private List<ScriptFile> getScriptFilesFromCache(ScriptFile directory) {
return mScriptFileCache.get(directory.getPath()); return mScriptFileCache.get(directory.getPath());
} }

View File

@@ -47,11 +47,13 @@ public class ScriptOperations {
private Context mContext; private Context mContext;
private View mView; private View mView;
private ScriptFile mCurrentDirectory; private ScriptFile mCurrentDirectory;
private StorageFileProvider mStorageFileProvider;
public ScriptOperations(Context context, View view, ScriptFile currentDirectory) { public ScriptOperations(Context context, View view, ScriptFile currentDirectory) {
mContext = context; mContext = context;
mView = view; mView = view;
mCurrentDirectory = currentDirectory; mCurrentDirectory = currentDirectory;
mStorageFileProvider = StorageFileProvider.getDefault();
} }
public ScriptOperations(Context context, View view) { public ScriptOperations(Context context, View view) {
@@ -83,9 +85,10 @@ public class ScriptOperations {
PFile.write(path, script); PFile.write(path, script);
} catch (UncheckedIOException e) { } catch (UncheckedIOException e) {
showMessage(R.string.text_file_write_fail); showMessage(R.string.text_file_write_fail);
return;
} }
} }
notifyScriptFileChanged(); mStorageFileProvider.notifyFileCreated(mCurrentDirectory, new ScriptFile(path));
if (edit) if (edit)
Scripts.edit(path); Scripts.edit(path);
} else { } else {
@@ -115,7 +118,7 @@ public class ScriptOperations {
} else { } else {
showMessage(R.string.text_import_fail); showMessage(R.string.text_import_fail);
} }
notifyScriptFileChanged(); mStorageFileProvider.notifyFileCreated(mCurrentDirectory, new ScriptFile(pathTo));
return pathTo; return pathTo;
} }
}); });
@@ -133,7 +136,7 @@ public class ScriptOperations {
} else { } else {
showMessage(R.string.text_import_fail); showMessage(R.string.text_import_fail);
} }
notifyScriptFileChanged(); mStorageFileProvider.notifyFileCreated(mCurrentDirectory, new ScriptFile(pathTo));
return pathTo; return pathTo;
} }
}); });
@@ -147,7 +150,7 @@ public class ScriptOperations {
public void accept(@io.reactivex.annotations.NonNull String path) throws Exception { public void accept(@io.reactivex.annotations.NonNull String path) throws Exception {
if (new ScriptFile(getCurrentDirectory(), path).mkdirs()) { if (new ScriptFile(getCurrentDirectory(), path).mkdirs()) {
showMessage(R.string.text_already_create); showMessage(R.string.text_already_create);
notifyScriptFileChanged(); mStorageFileProvider.notifyFileCreated(mCurrentDirectory, new ScriptFile(path));
} else { } else {
showMessage(R.string.text_create_fail); showMessage(R.string.text_create_fail);
} }
@@ -155,10 +158,6 @@ public class ScriptOperations {
}); });
} }
private void notifyScriptFileChanged() {
StorageFileProvider.getDefault().notifyDirectoryChanged(mCurrentDirectory);
}
private void showMessage(final int resId) { private void showMessage(final int resId) {
if (Looper.myLooper() == Looper.getMainLooper()) { if (Looper.myLooper() == Looper.getMainLooper()) {
showMessageWithoutThreadSwitch(resId); showMessageWithoutThreadSwitch(resId);
@@ -218,13 +217,18 @@ public class ScriptOperations {
} }
public Observable<Boolean> rename(final ScriptFile file) { public Observable<Boolean> rename(final ScriptFile file) {
final ScriptFile oldFile = new ScriptFile(file.getPath());
String originalName = file.getSimplifiedName(); String originalName = file.getSimplifiedName();
return showNameInputDialog(originalName, new InputCallback(file.isDirectory() ? null : PFile.getExtension(file.getName()), return showNameInputDialog(originalName, new InputCallback(file.isDirectory() ? null : PFile.getExtension(file.getName()),
originalName)) originalName))
.map(new Function<String, Boolean>() { .map(new Function<String, Boolean>() {
@Override @Override
public Boolean apply(@io.reactivex.annotations.NonNull String newName) throws Exception { public Boolean apply(@io.reactivex.annotations.NonNull String newName) throws Exception {
return file.renameTo(newName); ScriptFile newFile = file.renameAndReturnNewFile(newName);
if (newFile != null) {
mStorageFileProvider.notifyFileChanged(mCurrentDirectory, oldFile, newFile);
}
return newFile != null;
} }
}); });
} }
@@ -246,7 +250,8 @@ public class ScriptOperations {
@Override @Override
public void accept(@io.reactivex.annotations.NonNull Boolean deleted) throws Exception { public void accept(@io.reactivex.annotations.NonNull Boolean deleted) throws Exception {
showMessage(deleted ? R.string.text_already_delete : R.string.text_delete_failed); showMessage(deleted ? R.string.text_already_delete : R.string.text_delete_failed);
notifyScriptFileChanged(); if (deleted)
mStorageFileProvider.notifyFileRemoved(mCurrentDirectory, scriptFile);
} }
}); });
} }

View File

@@ -2,11 +2,13 @@ package com.stardust.scriptdroid.ui.edit;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Build; import android.os.Build;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.Gravity; import android.view.Gravity;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface; import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult; import android.webkit.JsPromptResult;
import android.webkit.JsResult; import android.webkit.JsResult;
@@ -59,7 +61,7 @@ public class CodeMirrorEditor extends FrameLayout {
private static String[] sAvailableThemes; private static String[] sAvailableThemes;
private String mTheme = "neo"; private String mTheme = "neo";
private MaterialProgressBar mProgressBar; private FrameLayout mProgressBarContainer;
private WebView mWebView; private WebView mWebView;
private JavaScriptBridge mJavaScriptBridge = new JavaScriptBridge(); private JavaScriptBridge mJavaScriptBridge = new JavaScriptBridge();
private Callback mCallback; private Callback mCallback;
@@ -141,11 +143,15 @@ public class CodeMirrorEditor extends FrameLayout {
} }
private void setupProgress() { private void setupProgress() {
mProgressBar = new MaterialProgressBar(getContext()); mProgressBarContainer = new FrameLayout(getContext());
mProgressBarContainer.setBackgroundColor(Color.WHITE);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
addView(mProgressBarContainer, params);
MaterialProgressBar progressBar = new MaterialProgressBar(getContext());
int dp50 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()); int dp50 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(dp50, dp50); FrameLayout.LayoutParams p = new FrameLayout.LayoutParams(dp50, dp50);
params.gravity = Gravity.CENTER; p.gravity = Gravity.CENTER;
addView(mProgressBar, params); mProgressBarContainer.addView(progressBar, p);
} }
private void setupWebView() { private void setupWebView() {
@@ -171,7 +177,7 @@ public class CodeMirrorEditor extends FrameLayout {
} }
public void setProgress(boolean onProgress) { public void setProgress(boolean onProgress) {
mProgressBar.setVisibility(onProgress ? VISIBLE : GONE); mProgressBarContainer.setVisibility(onProgress ? VISIBLE : GONE);
} }
public void setText(final String text) { public void setText(final String text) {
@@ -464,7 +470,7 @@ public class CodeMirrorEditor extends FrameLayout {
@Override @Override
public void onProgressChanged(WebView view, int newProgress) { public void onProgressChanged(WebView view, int newProgress) {
mProgressBar.setVisibility(newProgress == 100 ? GONE : VISIBLE); setProgress(newProgress != 100);
} }
} }
} }

View File

@@ -7,9 +7,11 @@ import android.view.ContextThemeWrapper;
import android.view.View; import android.view.View;
import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.enhancedfloaty.FloatyWindow;
import com.stardust.enhancedfloaty.ResizableFloaty; import com.stardust.enhancedfloaty.ResizableFloaty;
import com.stardust.enhancedfloaty.ResizableFloatyWindow; import com.stardust.enhancedfloaty.ResizableFloatyWindow;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.external.floatingwindow.FloatyWindowManger;
import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.ScriptFile;
import com.stardust.scriptdroid.ui.edit.EditActivity_; import com.stardust.scriptdroid.ui.edit.EditActivity_;
import com.stardust.scriptdroid.ui.edit.EditorView; import com.stardust.scriptdroid.ui.edit.EditorView;
@@ -41,8 +43,7 @@ public class EditorFloaty implements ResizableFloaty {
} }
public static void floatingEdit(Context context, Intent intent) { public static void floatingEdit(Context context, Intent intent) {
FloatyService.addWindow(new ResizableFloatyWindow(new EditorFloaty(intent))); FloatyWindowManger.addWindow(context, new ResizableFloatyWindow(new EditorFloaty(intent)));
context.startService(new Intent(context, FloatyService.class));
} }
public static void floatingEdit(Context context, String path) { public static void floatingEdit(Context context, String path) {

View File

@@ -314,7 +314,7 @@ public class ScriptListRecyclerView extends RecyclerView {
@Subscribe(threadMode = ThreadMode.MAIN) @Subscribe(threadMode = ThreadMode.MAIN)
public void onDirectoryChange(StorageFileProvider.DirectoryChangeEvent event) { public void onDirectoryChange(StorageFileProvider.DirectoryChangeEvent event) {
if (event.directory.equals(mCurrentDirectory)) { if (event.getDir().equals(mCurrentDirectory)) {
updateCurrentDirectory(); updateCurrentDirectory();
} }
} }

View File

@@ -30,6 +30,7 @@ import com.stardust.widget.BindableViewHolder;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.regex.Pattern;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@@ -104,7 +105,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
initScriptListRecyclerView(); initScriptListRecyclerView();
mStorageFileProvider = StorageFileProvider.getDefault(); mStorageFileProvider = StorageFileProvider.getDefault();
setCurrentDirectory(mStorageFileProvider.getInitialDirectory()); setCurrentDirectory(mStorageFileProvider.getInitialDirectory());
//mStorageFileProvider.registerDirectoryChangeListener(this); mStorageFileProvider.registerDirectoryChangeListener(this);
} }
private void initScriptListRecyclerView() { private void initScriptListRecyclerView() {
@@ -158,9 +159,10 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
@Subscribe @Subscribe
void onDirectoryChange(StorageFileProvider.DirectoryChangeEvent event) { void onDirectoryChange(StorageFileProvider.DirectoryChangeEvent event) {
if (event.directory.equals(mCurrentDirectory)) { if (!event.getDir().equals(mCurrentDirectory)) {
loadScriptList(); return;
} }
loadScriptList();
} }
@Override @Override
@@ -238,7 +240,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
super.onDetachedFromWindow(); super.onDetachedFromWindow();
// mStorageFileProvider.unregisterDirectoryChangeListener(this); mStorageFileProvider.unregisterDirectoryChangeListener(this);
} }
private class ScriptListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private class ScriptListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@@ -404,6 +406,9 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
@BindView(R.id.order) @BindView(R.id.order)
ImageView mSortOrder; ImageView mSortOrder;
@BindView(R.id.back)
ImageView mGoBack;
private boolean mIsDir; private boolean mIsDir;
CategoryViewHolder(View itemView) { CategoryViewHolder(View itemView) {
@@ -415,6 +420,11 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
public void bind(Boolean isDirCategory, int position) { public void bind(Boolean isDirCategory, int position) {
mTitle.setText(isDirCategory ? R.string.text_directory : R.string.text_file); mTitle.setText(isDirCategory ? R.string.text_directory : R.string.text_file);
mIsDir = isDirCategory; mIsDir = isDirCategory;
if (isDirCategory && canGoBack()) {
mGoBack.setVisibility(VISIBLE);
} else {
mGoBack.setVisibility(GONE);
}
} }
@OnClick(R.id.order) @OnClick(R.id.order)
@@ -441,5 +451,12 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
popupMenu.show(); popupMenu.show();
} }
@OnClick(R.id.back)
void back() {
if (canGoBack()) {
goBack();
}
}
} }
} }

View File

@@ -77,10 +77,10 @@ public class ScriptList {
} }
public void add(ScriptFile file) { public void add(ScriptFile file) {
if (file.isFile()) { if (file.isDirectory()) {
mScriptFiles.add(file);
} else {
mDirectories.add(file); mDirectories.add(file);
} else {
mScriptFiles.add(file);
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

View File

@@ -34,6 +34,17 @@
</LinearLayout> </LinearLayout>
<ImageView
android:id="@+id/back"
android:layout_width="32dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="?selectableItemBackgroundBorderless"
android:clickable="true"
android:padding="9dp"
android:src="@drawable/ic_dir_up"
android:tint="#828384"/>
<ImageView <ImageView
android:id="@+id/order" android:id="@+id/order"
android:layout_width="32dp" android:layout_width="32dp"