Lint + max width for wizard

This commit is contained in:
serso 2016-03-03 16:10:30 +01:00
parent e9343e3b6b
commit 001888973a
12 changed files with 124 additions and 93 deletions

View File

@ -41,9 +41,12 @@ import android.support.v7.view.ContextThemeWrapper;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import com.squareup.otto.Bus;
@ -397,7 +400,14 @@ public final class App {
}
public static int toPixels(@Nonnull DisplayMetrics dm, float dps) {
final float scale = dm.density;
return (int) (dps * scale + 0.5f);
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dps, dm);
}
public static int toPixels(@Nonnull Context context, float dps) {
return toPixels(context.getResources().getDisplayMetrics(), dps);
}
public static int toPixels(@Nonnull View view, float dps) {
return toPixels(view.getContext(), dps);
}
}

View File

@ -50,7 +50,6 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import java.util.EnumMap;
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT;
import static android.content.Intent.ACTION_CONFIGURATION_CHANGED;
import static android.os.Build.VERSION_CODES.JELLY_BEAN;
import static org.solovyev.android.calculator.App.cast;
@ -181,7 +180,7 @@ public class CalculatorWidget extends AppWidgetProvider {
return getDefaultLayout(theme);
}
final int widgetMinHeight = App.toPixels(resources.getDisplayMetrics(), options.getInt(OPTION_APPWIDGET_MIN_HEIGHT, 0));
final int widgetMinHeight = App.toPixels(resources.getDisplayMetrics(), options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, 0));
final int lockScreenMinHeight = resources.getDimensionPixelSize(R.dimen.min_expanded_height_lock_screen);
final boolean expanded = widgetMinHeight >= lockScreenMinHeight;
if (expanded) {

View File

@ -8,12 +8,12 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteFragment;
import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteStep;
import org.solovyev.android.calculator.release.ReleaseNoteFragment;
import org.solovyev.android.calculator.release.ReleaseNoteStep;
import org.solovyev.android.views.Adjuster;
import org.solovyev.android.wizard.Wizard;
import org.solovyev.android.wizard.WizardFlow;
import org.solovyev.android.wizard.WizardStep;
@ -21,6 +21,8 @@ import org.solovyev.android.wizard.WizardStep;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import static org.solovyev.android.calculator.App.toPixels;
public abstract class WizardFragment extends Fragment implements View.OnClickListener {
@Nullable
@ -63,6 +65,7 @@ public abstract class WizardFragment extends Fragment implements View.OnClickLis
final ViewGroup content = (ViewGroup) view.findViewById(R.id.wizard_content);
inflater.inflate(getViewResId(), content, true);
Adjuster.maxWidth(content, toPixels(view, 300));
nextButton = (TextView) view.findViewById(R.id.wizard_next);
if (nextButton != null) {
@ -118,18 +121,21 @@ public abstract class WizardFragment extends Fragment implements View.OnClickLis
public void onClick(View v) {
final int id = v.getId();
final WizardActivity activity = getWizardActivity();
if (id == R.id.wizard_next) {
if (activity.canGoNext()) {
activity.goNext();
} else {
activity.finishWizard();
}
} else if (id == R.id.wizard_prev) {
if (activity.canGoPrev()) {
activity.goPrev();
} else {
activity.finishWizardAbruptly();
}
switch (id) {
case R.id.wizard_next:
if (activity.canGoNext()) {
activity.goNext();
} else {
activity.finishWizard();
}
break;
case R.id.wizard_prev:
if (activity.canGoPrev()) {
activity.goPrev();
} else {
activity.finishWizardAbruptly();
}
break;
}
}

View File

@ -1,17 +1,18 @@
package org.solovyev.android.views;
import static android.graphics.Matrix.MSCALE_Y;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import static android.graphics.Matrix.MSCALE_Y;
public class Adjuster {
private static final float[] MATRIX = new float[9];
@ -41,35 +42,58 @@ public class Adjuster {
}
public static void adjustImage(@NonNull final ImageView view, final float percentage) {
ViewTreeObserver treeObserver = getTreeObserver(view);
final ViewTreeObserver treeObserver = getTreeObserver(view);
if (treeObserver == null) {
return;
}
treeObserver.addOnPreDrawListener(new ImageViewAdjuster(view, percentage));
}
private static class TextViewAdjuster implements ViewTreeObserver.OnPreDrawListener {
@NonNull
private final TextView view;
private final float percentage;
private final float minTextSizePxs;
public static void maxWidth(@NonNull View view, int maxWidth) {
final ViewTreeObserver treeObserver = getTreeObserver(view);
if (treeObserver == null) {
return;
}
treeObserver.addOnPreDrawListener(new MaxWidthAdjuster(view, maxWidth));
}
public TextViewAdjuster(@NonNull TextView view, float percentage, float minTextSizePxs) {
private static abstract class BaseViewAdjuster<V extends View> implements ViewTreeObserver.OnPreDrawListener {
@NonNull
protected final V view;
protected BaseViewAdjuster(@NonNull V view) {
this.view = view;
this.percentage = percentage;
this.minTextSizePxs = minTextSizePxs;
}
@Override
public boolean onPreDraw() {
public final boolean onPreDraw() {
final int width = view.getWidth();
final int height = view.getHeight();
if (!ViewCompat.isLaidOut(view) || height <= 0) {
if (!ViewCompat.isLaidOut(view) || height <= 0 || width <= 0) {
return true;
}
final ViewTreeObserver treeObserver = getTreeObserver(view);
if (treeObserver != null) {
treeObserver.removeOnPreDrawListener(this);
}
return adjust(width, height);
}
protected abstract boolean adjust(int width, int height);
}
private static class TextViewAdjuster extends BaseViewAdjuster<TextView> {
private final float percentage;
private final float minTextSizePxs;
public TextViewAdjuster(@NonNull TextView view, float percentage, float minTextSizePxs) {
super(view);
this.percentage = percentage;
this.minTextSizePxs = minTextSizePxs;
}
@Override
protected boolean adjust(int width, int height) {
final float oldTextSize = Math.round(view.getTextSize());
final float newTextSize = Math.max(minTextSizePxs, Math.round(height * percentage));
if (oldTextSize == newTextSize) {
@ -80,26 +104,37 @@ public class Adjuster {
}
}
private static class ImageViewAdjuster implements ViewTreeObserver.OnPreDrawListener {
@NonNull
private final ImageView view;
private static class MaxWidthAdjuster extends BaseViewAdjuster<View> {
private final int maxWidth;
public MaxWidthAdjuster(@NonNull View view, int maxWidth) {
super(view);
this.maxWidth = maxWidth;
}
@Override
protected boolean adjust(int width, int height) {
if (width <= maxWidth) {
return true;
}
final ViewGroup.LayoutParams lp = view.getLayoutParams();
lp.width = maxWidth;
view.setLayoutParams(lp);
return false;
}
}
private static class ImageViewAdjuster extends BaseViewAdjuster<ImageView> {
private final float percentage;
public ImageViewAdjuster(@NonNull ImageView view, float percentage) {
this.view = view;
super(view);
this.percentage = percentage;
}
@Override
public boolean onPreDraw() {
final int height = view.getHeight();
if (!ViewCompat.isLaidOut(view) || height <= 0) {
return true;
}
final ViewTreeObserver treeObserver = getTreeObserver(view);
if (treeObserver != null) {
treeObserver.removeOnPreDrawListener(this);
}
protected boolean adjust(int width, int height) {
final Drawable d = view.getDrawable();
if (d == null) {
return true;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

View File

@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
style="@style/WizardFragment"
a:orientation="vertical">
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="match_parent"
a:layout_height="match_parent"
a:orientation="vertical"
a:gravity="center"
a:paddingLeft="10dp"
a:paddingRight="10dp">
<ScrollView
a:id="@+id/wizard_content"
@ -14,6 +17,29 @@
a:layout_weight="1"
a:fillViewport="true" />
<include layout="@layout/fragment_wizard_buttons" />
<LinearLayout
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="center_horizontal|bottom"
a:layout_marginTop="@dimen/control_margin"
a:orientation="horizontal">
<org.solovyev.android.material.MaterialButton
a:id="@+id/wizard_prev"
style="@style/MaterialButton.Wizard"
a:layout_width="0dp"
a:layout_height="wrap_content"
a:layout_weight="1"
a:visibility="gone" />
<org.solovyev.android.material.MaterialButton
a:id="@+id/wizard_next"
style="@style/MaterialButton.Wizard"
a:layout_width="0dp"
a:layout_height="wrap_content"
a:layout_weight="1"
a:visibility="gone" />
</LinearLayout>
</LinearLayout>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
style="@style/WizardButtons"
a:layout_gravity="center_horizontal|bottom"
a:gravity="center">
<org.solovyev.android.material.MaterialButton
a:id="@+id/wizard_prev"
style="@style/MaterialButton.Wizard"
a:layout_width="0dp"
a:layout_height="wrap_content"
a:layout_weight="1"
a:visibility="gone" />
<org.solovyev.android.material.MaterialButton
a:id="@+id/wizard_next"
style="@style/MaterialButton.Wizard"
a:layout_width="0dp"
a:layout_height="wrap_content"
a:layout_weight="1"
a:visibility="gone" />
</LinearLayout>

View File

@ -161,15 +161,6 @@
<item name="android:textAppearance">@android:style/TextAppearance.Medium</item>
</style>
<style name="BaseWizardButtons">
<item name="android:background">@null</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginTop">@dimen/control_margin</item>
<item name="android:layout_gravity">top|center_horizontal</item>
<item name="android:orientation">horizontal</item>
</style>
<style name="WizardPrimaryButton" parent="PrimaryButton">
<item name="android:singleLine">true</item>
<item name="android:maxLines">1</item>
@ -178,19 +169,8 @@
<item name="android:textAppearance">@android:style/TextAppearance.Medium</item>
</style>
<style name="WizardButtons" parent="BaseWizardButtons" />
<style name="PrimaryButton" parent="MaterialButton"/>
<style name="WizardFragment">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:orientation">vertical</item>
<item name="android:paddingLeft">10dp</item>
<item name="android:paddingRight">10dp</item>
<item name="android:gravity">center</item>
</style>
<style name="MaterialButton.Wizard" parent="MaterialButton">
<item name="android:textColor">@color/cpp_button_text</item>
<item name="materialColor">?attr/cpp_wizard_button_bg</item>