Improve view tests

pull/286/head
Alinson S. Xavier 9 years ago
parent e6ceed9ec9
commit 6e0393f611

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

@ -29,15 +29,14 @@ import org.isoron.uhabits.utils.*;
import org.isoron.uhabits.widgets.*;
import java.io.*;
import java.util.*;
import static android.view.View.MeasureSpec.*;
import static junit.framework.Assert.*;
public class BaseViewTest extends BaseAndroidTest
{
protected static final double DEFAULT_SIMILARITY_CUTOFF = 0.09;
public static final int HISTOGRAM_BIN_SIZE = 8;
protected static final double DEFAULT_SIMILARITY_CUTOFF = 0.001;
private double similarityCutoff;
@ -67,11 +66,10 @@ public class BaseViewTest extends BaseAndroidTest
Bitmap scaledExpected =
Bitmap.createScaledBitmap(expected, width, height, true);
double distance;
boolean similarEnough = true;
double distance = distance(actual, scaledExpected);
if ((distance = compareHistograms(getHistogram(actual),
getHistogram(scaledExpected))) > similarityCutoff)
if (distance > similarityCutoff)
{
similarEnough = false;
errorMessage.append(String.format(
@ -144,58 +142,47 @@ public class BaseViewTest extends BaseAndroidTest
e.recycle();
}
private double compareHistograms(int[][] actualHistogram,
int[][] expectedHistogram)
{
long diff = 0;
long total = 0;
for (int i = 0; i < 256 / HISTOGRAM_BIN_SIZE; i++)
{
diff += Math.abs(actualHistogram[0][i] - expectedHistogram[0][i]);
diff += Math.abs(actualHistogram[1][i] - expectedHistogram[1][i]);
diff += Math.abs(actualHistogram[2][i] - expectedHistogram[2][i]);
diff += Math.abs(actualHistogram[3][i] - expectedHistogram[3][i]);
total += actualHistogram[0][i];
total += actualHistogram[1][i];
total += actualHistogram[2][i];
total += actualHistogram[3][i];
}
return (double) diff / total / 2;
}
private Bitmap getBitmapFromAssets(String path) throws IOException
{
InputStream stream = testContext.getAssets().open(path);
return BitmapFactory.decodeStream(stream);
}
private int[][] getHistogram(Bitmap bitmap)
private double distance(Bitmap b1, Bitmap b2)
{
int histogram[][] = new int[4][256 / HISTOGRAM_BIN_SIZE];
if(b1.getWidth() != b2.getWidth()) return 1.0;
if(b1.getHeight() != b2.getHeight()) return 1.0;
Random random = new Random();
for (int x = 0; x < bitmap.getWidth(); x++)
double distance = 0.0;
for (int x = 0; x < b1.getWidth(); x++)
{
for (int y = 0; y < bitmap.getHeight(); y++)
for (int y = 0; y < b1.getHeight(); y++)
{
int color = bitmap.getPixel(x, y);
int[] argb = new int[]{
(color >> 24) & 0xff, //alpha
(color >> 16) & 0xff, //red
(color >> 8) & 0xff, //green
(color) & 0xff //blue
};
histogram[0][argb[0] / HISTOGRAM_BIN_SIZE]++;
histogram[1][argb[1] / HISTOGRAM_BIN_SIZE]++;
histogram[2][argb[2] / HISTOGRAM_BIN_SIZE]++;
histogram[3][argb[3] / HISTOGRAM_BIN_SIZE]++;
if(random.nextInt(4) != 0) continue;
int[] argb1 = colorToArgb(b1.getPixel(x, y));
int[] argb2 = colorToArgb(b2.getPixel(x, y));
distance += Math.abs(argb1[0] - argb2[0]);
distance += Math.abs(argb1[1] - argb2[1]);
distance += Math.abs(argb1[2] - argb2[2]);
distance += Math.abs(argb1[3] - argb2[3]);
}
}
return histogram;
distance /= (0xff * 16) * b1.getWidth() * b1.getHeight();
return distance;
}
private int[] colorToArgb(int c1)
{
return new int[]{
(c1 >> 24) & 0xff, //alpha
(c1 >> 16) & 0xff, //red
(c1 >> 8) & 0xff, //green
(c1) & 0xff //blue
};
}
private String getVersionedViewAssetPath(String path)

@ -63,6 +63,7 @@ public class HabitCardViewTest extends BaseViewTest
view.setSelected(false);
view.setScore(habit.getScores().getTodayValue());
view.setController(controller);
view.setButtonCount(6);
measureView(view, dpToPixels(400), dpToPixels(50));
}
@ -86,6 +87,7 @@ public class HabitCardViewTest extends BaseViewTest
habit.setName("Wake up early");
habit.setColor(2);
habit.getObservable().notifyListeners();
Thread.sleep(500);
assertRenders(view, PATH + "render_changed.png");
}
}

@ -0,0 +1,83 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.activities.habits.list.views;
import android.support.test.filters.*;
import android.support.test.runner.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.utils.*;
import org.junit.*;
import org.junit.runner.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class HeaderViewTest extends BaseViewTest
{
public static final String PATH = "habits/list/HeaderView/";
private HeaderView view;
private Preferences prefs;
private MidnightTimer midnightTimer;
@Override
@Before
public void setUp()
{
super.setUp();
setSimilarityCutoff(0);
prefs = mock(Preferences.class);
midnightTimer = mock(MidnightTimer.class);
view = new HeaderView(targetContext, prefs, midnightTimer);
view.setButtonCount(5);
measureView(view, dpToPixels(600), dpToPixels(48));
}
@Test
public void testRender() throws Exception
{
when(prefs.shouldReverseCheckmarks()).thenReturn(false);
assertRenders(view, PATH + "render.png");
verify(prefs).shouldReverseCheckmarks();
verifyNoMoreInteractions(prefs);
}
@Test
public void testRender_reverse() throws Exception
{
when(prefs.shouldReverseCheckmarks()).thenReturn(true);
assertRenders(view, PATH + "render_reverse.png");
verify(prefs).shouldReverseCheckmarks();
verifyNoMoreInteractions(prefs);
}
}

@ -0,0 +1,113 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.activities.habits.list.views;
import android.support.test.filters.*;
import android.support.test.runner.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.utils.*;
import org.junit.*;
import org.junit.runner.*;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class NumberButtonViewTest extends BaseViewTest
{
public static final String PATH = "habits/list/NumberButtonView/";
private NumberButtonView view;
private NumberButtonController controller;
@Override
@Before
public void setUp()
{
super.setUp();
setSimilarityCutoff(0.015f);
view = new NumberButtonView(targetContext);
view.setUnit("steps");
view.setThreshold(100.0);
view.setColor(ColorUtils.getAndroidTestColor(5));
measureView(view, dpToPixels(48), dpToPixels(48));
controller = mock(NumberButtonController.class);
view.setController(controller);
}
@Test
public void testFormatValue()
{
assertThat(NumberButtonView.formatValue(0.1235), equalTo("0.12"));
assertThat(NumberButtonView.formatValue(0.1000), equalTo("0.1"));
assertThat(NumberButtonView.formatValue(5.0), equalTo("5"));
assertThat(NumberButtonView.formatValue(5.25), equalTo("5.25"));
assertThat(NumberButtonView.formatValue(12.3456), equalTo("12.3"));
assertThat(NumberButtonView.formatValue(123.123), equalTo("123"));
assertThat(NumberButtonView.formatValue(321.2), equalTo("321"));
assertThat(NumberButtonView.formatValue(4321.2), equalTo("4.3k"));
assertThat(NumberButtonView.formatValue(54321.2), equalTo("54.3k"));
assertThat(NumberButtonView.formatValue(654321.2), equalTo("654k"));
assertThat(NumberButtonView.formatValue(7654321.2), equalTo("7.7M"));
assertThat(NumberButtonView.formatValue(87654321.2), equalTo("87.7M"));
assertThat(NumberButtonView.formatValue(987654321.2), equalTo("988M"));
assertThat(NumberButtonView.formatValue(1987654321.2), equalTo("2.0G"));
}
@Test
public void testRender_aboveThreshold() throws Exception
{
view.setValue(500);
assertRenders(view, PATH + "render_above.png");
}
@Test
public void testRender_belowThreshold() throws Exception
{
view.setValue(99);
assertRenders(view, PATH + "render_below.png");
}
@Test
public void testRender_zero() throws Exception
{
view.setValue(0);
assertRenders(view, PATH + "render_zero.png");
}
@Test
public void test_click()
{
view.performClick();
verify(controller).onClick();
view.performLongClick();
verify(controller).onLongClick();
}
}

@ -25,7 +25,6 @@ import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.widgets.*;
import org.junit.*;
import org.junit.runner.*;
@ -37,7 +36,7 @@ import static org.isoron.uhabits.models.Checkmark.*;
@MediumTest
public class CheckmarkWidgetTest extends BaseViewTest
{
private static final String PATH = "widgets/CheckmarkWidgetView/";
private static final String PATH = "widgets/CheckmarkWidget/";
private Habit habit;
@ -49,6 +48,8 @@ public class CheckmarkWidgetTest extends BaseViewTest
public void setUp()
{
super.setUp();
setTheme(R.style.TransparentWidgetTheme);
habit = fixtures.createShortHabit();
checkmarks = habit.getCheckmarks();
CheckmarkWidget widget = new CheckmarkWidget(targetContext, 0, habit);
@ -80,6 +81,6 @@ public class CheckmarkWidgetTest extends BaseViewTest
@Test
public void testRender() throws Exception
{
assertRenders(view, PATH + "checked.png");
assertRenders(view, PATH + "render.png");
}
}

@ -38,8 +38,6 @@ public class CheckmarkWidgetViewTest extends BaseViewTest
private CheckmarkWidgetView view;
private Habit habit;
@Override
@Before
public void setUp()
@ -47,13 +45,12 @@ public class CheckmarkWidgetViewTest extends BaseViewTest
super.setUp();
setTheme(R.style.TransparentWidgetTheme);
habit = fixtures.createShortHabit();
Habit habit = fixtures.createShortHabit();
view = new CheckmarkWidgetView(targetContext);
int color = ColorUtils.getAndroidTestColor(habit.getColor());
double score = habit.getScores().getTodayValue();
float percentage = (float) score;
view.setActiveColor(color);
view.setActiveColor(ColorUtils.getAndroidTestColor(0));
view.setCheckmarkValue(habit.getCheckmarks().getTodayValue());
view.setPercentage(percentage);
view.setName(habit.getName());

@ -116,14 +116,14 @@ public class HabitCardView extends FrameLayout
public void setHabit(@NonNull Habit habit)
{
if (this.habit != null) detachFromHabit();
if (isAttachedToWindow()) stopListening();
this.habit = habit;
checkmarkPanel.setHabit(habit);
numberPanel.setHabit(habit);
refresh();
attachToHabit();
refresh();
if (isAttachedToWindow()) startListening();
postInvalidate();
}
@ -177,20 +177,17 @@ public class HabitCardView extends FrameLayout
}
@Override
protected void onDetachedFromWindow()
{
if (habit != null) detachFromHabit();
super.onDetachedFromWindow();
}
private void attachToHabit()
protected void onAttachedToWindow()
{
if (habit != null) habit.getObservable().addListener(this);
super.onAttachedToWindow();
stopListening();
}
private void detachFromHabit()
@Override
protected void onDetachedFromWindow()
{
if (habit != null) habit.getObservable().removeListener(this);
startListening();
super.onDetachedFromWindow();
}
private int getActiveColor(Habit habit)
@ -309,6 +306,16 @@ public class HabitCardView extends FrameLayout
postInvalidate();
}
private void startListening()
{
if (habit != null) habit.getObservable().removeListener(this);
}
private void stopListening()
{
if (habit != null) habit.getObservable().addListener(this);
}
private void triggerRipple(final float x, final float y)
{
final Drawable background = innerFrame.getBackground();

@ -46,18 +46,23 @@ public class HeaderView extends ScrollableChart
@Nullable
private MidnightTimer midnightTimer;
private final TextPaint paint;
private TextPaint paint;
private RectF rect;
public HeaderView(Context context, AttributeSet attrs)
public HeaderView(@NonNull Context context,
@NonNull Preferences prefs,
@NonNull MidnightTimer midnightTimer)
{
super(context, attrs);
super(context);
this.prefs = prefs;
this.midnightTimer = midnightTimer;
init();
}
if (isInEditMode())
{
setButtonCount(5);
}
public HeaderView(Context context, @Nullable AttributeSet attrs)
{
super(context, attrs);
Context appContext = context.getApplicationContext();
if (appContext instanceof HabitsApplication)
@ -68,23 +73,12 @@ public class HeaderView extends ScrollableChart
if (context instanceof ListHabitsActivity)
{
ListHabitsActivity activity = (ListHabitsActivity) context;
midnightTimer = activity.getListHabitsComponent().getMidnightTimer();
ListHabitsComponent component =
((ListHabitsActivity) context).getListHabitsComponent();
midnightTimer = component.getMidnightTimer();
}
Resources res = context.getResources();
setScrollerBucketSize((int) res.getDimension(R.dimen.checkmarkWidth));
StyledResources sr = new StyledResources(context);
paint = new TextPaint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setTextSize(getResources().getDimension(R.dimen.tinyTextSize));
paint.setTextAlign(Paint.Align.CENTER);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setColor(sr.getColor(R.attr.mediumContrastTextColor));
rect = new RectF();
init();
}
@Override
@ -115,14 +109,6 @@ public class HeaderView extends ScrollableChart
if (midnightTimer != null) midnightTimer.addListener(this);
}
private void updateDirection()
{
int direction = -1;
if (shouldReverseCheckmarks()) direction *= -1;
if (InterfaceUtils.isLayoutRtl(this)) direction *= -1;
setDirection(direction);
}
@Override
protected void onDetachedFromWindow()
{
@ -131,16 +117,6 @@ public class HeaderView extends ScrollableChart
super.onDetachedFromWindow();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) getContext()
.getResources()
.getDimension(R.dimen.checkmarkHeight);
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas)
{
@ -161,7 +137,7 @@ public class HeaderView extends ScrollableChart
rect.set(0, 0, width, height);
rect.offset(canvas.getWidth(), 0);
if(reverse) rect.offset(- (i + 1) * width, 0);
if (reverse) rect.offset(-(i + 1) * width, 0);
else rect.offset((i - buttonCount) * width, 0);
if (isRtl) rect.set(canvas.getWidth() - rect.right, rect.top,
@ -170,8 +146,8 @@ public class HeaderView extends ScrollableChart
String text = DateUtils.formatHeaderDate(day).toUpperCase();
String[] lines = text.split("\n");
int y1 = (int)(rect.centerY() - 0.25 * em);
int y2 = (int)(rect.centerY() + 1.25 * em);
int y1 = (int) (rect.centerY() - 0.25 * em);
int y2 = (int) (rect.centerY() + 1.25 * em);
canvas.drawText(lines[0], rect.centerX(), y1, paint);
canvas.drawText(lines[1], rect.centerX(), y2, paint);
@ -179,9 +155,46 @@ public class HeaderView extends ScrollableChart
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) getContext()
.getResources()
.getDimension(R.dimen.checkmarkHeight);
setMeasuredDimension(width, height);
}
private void init()
{
Resources res = getContext().getResources();
setScrollerBucketSize((int) res.getDimension(R.dimen.checkmarkWidth));
StyledResources sr = new StyledResources(getContext());
paint = new TextPaint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setTextSize(getResources().getDimension(R.dimen.tinyTextSize));
paint.setTextAlign(Paint.Align.CENTER);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setColor(sr.getColor(R.attr.mediumContrastTextColor));
rect = new RectF();
if (isInEditMode()) setButtonCount(5);
}
private boolean shouldReverseCheckmarks()
{
if (prefs == null) return false;
return prefs.shouldReverseCheckmarks();
}
private void updateDirection()
{
int direction = -1;
if (shouldReverseCheckmarks()) direction *= -1;
if (InterfaceUtils.isLayoutRtl(this)) direction *= -1;
setDirection(direction);
}
}

@ -31,7 +31,7 @@ import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.utils.*;
import java.text.DecimalFormat;
import java.text.*;
import static org.isoron.uhabits.utils.AttributeSetUtils.*;
import static org.isoron.uhabits.utils.ColorUtils.*;
@ -91,7 +91,6 @@ public class NumberButtonView extends View
}
/**
*
* @param v
* @return
*/
@ -104,6 +103,7 @@ public class NumberButtonView extends View
if (v >= 1e5) return String.format("%.0fk", v / 1e3);
if (v >= 1e4) return String.format("%.1fk", v / 1e3);
if (v >= 1e3) return String.format("%.1fk", v / 1e3);
if (v >= 1e2) return new DecimalFormat("#").format(v);
if (v >= 1e1) return new DecimalFormat("#.#").format(v);
return new DecimalFormat("#.##").format(v);
}
@ -117,7 +117,11 @@ public class NumberButtonView extends View
public void setController(final NumberButtonController controller)
{
setOnClickListener(v -> controller.onClick());
setOnLongClickListener(v -> controller.onLongClick());
setOnLongClickListener(v ->
{
controller.onLongClick();
return true;
});
}
public void setThreshold(double threshold)
@ -142,8 +146,8 @@ public class NumberButtonView extends View
protected void onDraw(Canvas canvas)
{
int activeColor = lightGrey;
if(value > 0 && value < threshold) activeColor = darkGrey;
if(value >= threshold) activeColor = color;
if (value > 0 && value < threshold) activeColor = darkGrey;
if (value >= threshold) activeColor = color;
pRegular.setColor(activeColor);
pBold.setColor(activeColor);

@ -49,6 +49,9 @@ mkdir -p ${OUTPUT_DIR}/failed
adb pull /mnt/sdcard/test-screenshots/ ${OUTPUT_DIR}/failed >> $LOG 2>> $LOG
adb pull /storage/sdcard/test-screenshots/ ${OUTPUT_DIR}/failed >> $LOG 2>> $LOG
adb pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ ${OUTPUT_DIR}/failed >> $LOG 2>> $LOG
adb shell rm -r /mnt/sdcard/test-screenshots/ >> $LOG 2>> $LOG
adb shell rm -r /storage/sdcard/test-screenshots/ >> $LOG 2>> $LOG
adb shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ >> $LOG 2>> $LOG
info "Fetching logcat..."

Loading…
Cancel
Save