No more use of butterknife
This commit is contained in:
parent
6f969f4217
commit
5c2a1e743e
18 changed files with 249 additions and 306 deletions
5
Jenkinsfile
vendored
5
Jenkinsfile
vendored
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
node {
|
node {
|
||||||
def flavorCombination='WithMapsWithAnalyticsForPlay'
|
def flavorCombination='WithMapsWithAnalyticsForPlay'
|
||||||
|
|
||||||
|
@ -11,8 +12,8 @@ node {
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
currentBuild.result = FAILURE
|
currentBuild.result = FAILURE
|
||||||
} finally {
|
} finally {
|
||||||
publishHTML(target:[allowMissing: true, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "android/build/spoon-output/${flavorCombination}DebugAndroidTest", reportFiles: 'index.html', reportName: 'Spoon'])
|
publishHTML(target:[allowMissing: true, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "android/build/spoon", reportFiles: '*/debug/index.html', reportName: 'Spoon'])
|
||||||
step([$class: 'JUnitResultArchiver', testResults: 'android/build/spoon-output/*/junit-reports/*.xml'])
|
step([$class: 'JUnitResultArchiver', testResults: 'android/build/spoon/*/debug/junit-reports/*.xml'])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ buildscript {
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
classpath 'com.android.tools.build:gradle:2.2.2'
|
classpath 'com.android.tools.build:gradle:2.2.2'
|
||||||
classpath 'de.felixschulze.gradle:gradle-spoon-plugin:2.7.3'
|
classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.2.2'
|
||||||
classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0'
|
classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0'
|
||||||
classpath 'de.mobilej.unmock:UnMockPlugin:0.5.0'
|
classpath 'de.mobilej.unmock:UnMockPlugin:0.5.0'
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ buildscript {
|
||||||
|
|
||||||
apply plugin: 'android-sdk-manager'
|
apply plugin: 'android-sdk-manager'
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'de.felixschulze.gradle.spoon'
|
apply plugin: 'spoon'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlin-android-extensions'
|
apply plugin: 'kotlin-android-extensions'
|
||||||
apply plugin: 'kotlin-kapt'
|
apply plugin: 'kotlin-kapt'
|
||||||
|
@ -118,7 +118,6 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
kapt "com.google.dagger:dagger-compiler:$dagger_version"
|
kapt "com.google.dagger:dagger-compiler:$dagger_version"
|
||||||
kapt "com.jakewharton:butterknife-compiler:$butterknife_version"
|
|
||||||
|
|
||||||
provided 'org.glassfish:javax.annotation:10.0-b28'
|
provided 'org.glassfish:javax.annotation:10.0-b28'
|
||||||
|
|
||||||
|
@ -156,7 +155,6 @@ dependencies {
|
||||||
|
|
||||||
|
|
||||||
compile 'net.lingala.zip4j:zip4j:1.3.2'
|
compile 'net.lingala.zip4j:zip4j:1.3.2'
|
||||||
compile "com.jakewharton:butterknife:$butterknife_version"
|
|
||||||
compile 'com.jakewharton.threetenabp:threetenabp:1.0.4'
|
compile 'com.jakewharton.threetenabp:threetenabp:1.0.4'
|
||||||
compile 'org.greenrobot:eventbus:3.0.0'
|
compile 'org.greenrobot:eventbus:3.0.0'
|
||||||
|
|
||||||
|
@ -214,6 +212,7 @@ dependencies {
|
||||||
|
|
||||||
spoon {
|
spoon {
|
||||||
debug = true
|
debug = true
|
||||||
|
grantAllPermissions = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,4 +11,8 @@ public class TestApp extends App {
|
||||||
return (TestComponent) App.component();
|
return (TestComponent) App.component();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void installLeakCanary() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package org.ligi.passandroid;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import com.squareup.spoon.Spoon;
|
import com.squareup.spoon.Spoon;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
@ -85,7 +84,7 @@ public class TheFullscreenBarcodeActivity {
|
||||||
rule.launchActivity(null);
|
rule.launchActivity(null);
|
||||||
onView(withId(R.id.fullscreen_barcode)).check(matches(isDisplayed()));
|
onView(withId(R.id.fullscreen_barcode)).check(matches(isDisplayed()));
|
||||||
|
|
||||||
final ImageView viewById = ButterKnife.findById(rule.getActivity(), R.id.fullscreen_barcode);
|
final ImageView viewById = (ImageView) rule.getActivity().findViewById(R.id.fullscreen_barcode);
|
||||||
BitmapDrawable bitmapDrawable = (BitmapDrawable) viewById.getDrawable();
|
BitmapDrawable bitmapDrawable = (BitmapDrawable) viewById.getDrawable();
|
||||||
final Bitmap bitmap = bitmapDrawable.getBitmap();
|
final Bitmap bitmap = bitmapDrawable.getBitmap();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package org.ligi.passandroid;
|
package org.ligi.passandroid;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.support.test.filters.MediumTest;
|
|
||||||
import android.support.test.rule.ActivityTestRule;
|
import android.support.test.rule.ActivityTestRule;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
@ -75,7 +74,7 @@ public class ThePassViewActivity {
|
||||||
onView(withId(R.id.date)).check(matches(isDisplayed()));
|
onView(withId(R.id.date)).check(matches(isDisplayed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@Test
|
||||||
public void testLinkToCalendarIsThereWhenPassbookHasDate() {
|
public void testLinkToCalendarIsThereWhenPassbookHasDate() {
|
||||||
act_pass.setCalendarTimespan(new PassImpl.TimeSpan(ZonedDateTime.now(), null, null));
|
act_pass.setCalendarTimespan(new PassImpl.TimeSpan(ZonedDateTime.now(), null, null));
|
||||||
rule.launchActivity(null);
|
rule.launchActivity(null);
|
||||||
|
|
|
@ -19,13 +19,17 @@ public class App extends Application {
|
||||||
component = createComponent();
|
component = createComponent();
|
||||||
|
|
||||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
||||||
LeakCanary.install(this);
|
installLeakCanary();
|
||||||
AndroidThreeTen.init(this);
|
AndroidThreeTen.init(this);
|
||||||
initTraceDroid();
|
initTraceDroid();
|
||||||
|
|
||||||
AppCompatDelegate.setDefaultNightMode(component.settings().getNightMode());
|
AppCompatDelegate.setDefaultNightMode(component.settings().getNightMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void installLeakCanary() {
|
||||||
|
LeakCanary.install(this);
|
||||||
|
}
|
||||||
|
|
||||||
public AppComponent createComponent() {
|
public AppComponent createComponent() {
|
||||||
return DaggerAppComponent.builder().appModule(new AppModule(this)).trackerModule(new TrackerModule(this)).build();
|
return DaggerAppComponent.builder().appModule(new AppModule(this)).trackerModule(new TrackerModule(this)).build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ class PassImpl(override val id: String) : Pass {
|
||||||
|
|
||||||
override var calendarTimespan: TimeSpan? = null
|
override var calendarTimespan: TimeSpan? = null
|
||||||
|
|
||||||
override var fields: List<PassField> = ArrayList()
|
override var fields: MutableList<PassField> = ArrayList()
|
||||||
|
|
||||||
override var locations: List<PassLocation> = ArrayList()
|
override var locations: List<PassLocation> = ArrayList()
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.support.v7.app.AlertDialog
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import butterknife.ButterKnife
|
|
||||||
import org.ligi.passandroid.R
|
import org.ligi.passandroid.R
|
||||||
import org.ligi.passandroid.helper.MoveHelper
|
import org.ligi.passandroid.helper.MoveHelper
|
||||||
import org.ligi.passandroid.model.PassStore
|
import org.ligi.passandroid.model.PassStore
|
||||||
|
@ -39,7 +38,6 @@ internal class MoveToNewTopicUI(private val context: Activity, private val passS
|
||||||
move(newTopicEditText.text.toString())
|
move(newTopicEditText.text.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ButterKnife.bind(this, dialog)
|
|
||||||
|
|
||||||
val oldTopic = passStore.classifier.getTopic(pass, "")
|
val oldTopic = passStore.classifier.getTopic(pass, "")
|
||||||
|
|
||||||
|
|
|
@ -1,101 +0,0 @@
|
||||||
package org.ligi.passandroid.ui;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.annotation.LayoutRes;
|
|
||||||
import android.support.design.widget.NavigationView;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
|
||||||
import org.greenrobot.eventbus.ThreadMode;
|
|
||||||
import org.ligi.axt.AXT;
|
|
||||||
import org.ligi.passandroid.App;
|
|
||||||
import org.ligi.passandroid.R;
|
|
||||||
import org.ligi.passandroid.events.PassStoreChangeEvent;
|
|
||||||
import org.ligi.passandroid.model.PassStore;
|
|
||||||
|
|
||||||
public class PassNavigationView extends NavigationView {
|
|
||||||
|
|
||||||
@BindView(R.id.pass_count_header)
|
|
||||||
TextView passCountTextView;
|
|
||||||
|
|
||||||
@BindView(R.id.topic_count_header)
|
|
||||||
TextView topicCountTextView;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
PassStore passStore;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
EventBus bus;
|
|
||||||
|
|
||||||
public PassNavigationView(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
|
|
||||||
setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onNavigationItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.menu_plus:
|
|
||||||
AXT.at(getContext()).startCommonIntent().openUrl("https://plus.google.com/communities/116353894782342292067");
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case R.id.menu_github:
|
|
||||||
AXT.at(getContext()).startCommonIntent().openUrl("https://github.com/ligi/PassAndroid");
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case R.id.menu_share:
|
|
||||||
AXT.at(getContext()).startCommonIntent().shareUrl(getMarketUrl());
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case R.id.menu_beta:
|
|
||||||
AXT.at(getContext()).startCommonIntent().openUrl("https://play.google.com/apps/testing/org.ligi.passandroid");
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case R.id.menu_settings:
|
|
||||||
AXT.at(getContext()).startCommonIntent().activityFromClass(PreferenceActivity.class);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View inflateHeaderView(@LayoutRes int res) {
|
|
||||||
final View view = super.inflateHeaderView(res);
|
|
||||||
|
|
||||||
ButterKnife.bind(this, view);
|
|
||||||
|
|
||||||
App.component().inject(this);
|
|
||||||
|
|
||||||
bus.register(this);
|
|
||||||
onPassStoreChangeEvent(PassStoreChangeEvent.INSTANCE);
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDetachedFromWindow() {
|
|
||||||
super.onDetachedFromWindow();
|
|
||||||
bus.unregister(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getMarketUrl() {
|
|
||||||
return getContext().getString(R.string.market_url, getContext().getPackageName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
||||||
public void onPassStoreChangeEvent(PassStoreChangeEvent passStoreChangeEvent) {
|
|
||||||
final int passCount = passStore.getPassMap().size();
|
|
||||||
passCountTextView.setText(getContext().getString(R.string.passes_nav, passCount));
|
|
||||||
|
|
||||||
final int topicCount = passStore.getClassifier().getTopics().size();
|
|
||||||
topicCountTextView.setText(getContext().getString(R.string.categories_nav, topicCount));
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
package org.ligi.passandroid.ui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.support.annotation.LayoutRes
|
||||||
|
import android.support.design.widget.NavigationView
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.View
|
||||||
|
import kotlinx.android.synthetic.main.navigation_drawer_header.view.*
|
||||||
|
import org.greenrobot.eventbus.EventBus
|
||||||
|
import org.greenrobot.eventbus.Subscribe
|
||||||
|
import org.greenrobot.eventbus.ThreadMode
|
||||||
|
import org.ligi.axt.AXT
|
||||||
|
import org.ligi.passandroid.App
|
||||||
|
import org.ligi.passandroid.R
|
||||||
|
import org.ligi.passandroid.events.PassStoreChangeEvent
|
||||||
|
import org.ligi.passandroid.model.PassStore
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class PassNavigationView(context: Context, attrs: AttributeSet) : NavigationView(context, attrs) {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit internal var passStore: PassStore
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit internal var bus: EventBus
|
||||||
|
|
||||||
|
init {
|
||||||
|
|
||||||
|
setNavigationItemSelectedListener(OnNavigationItemSelectedListener { item ->
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.menu_plus -> {
|
||||||
|
AXT.at(getContext()).startCommonIntent().openUrl("https://plus.google.com/communities/116353894782342292067")
|
||||||
|
return@OnNavigationItemSelectedListener true
|
||||||
|
}
|
||||||
|
|
||||||
|
R.id.menu_github -> {
|
||||||
|
AXT.at(getContext()).startCommonIntent().openUrl("https://github.com/ligi/PassAndroid")
|
||||||
|
return@OnNavigationItemSelectedListener true
|
||||||
|
}
|
||||||
|
|
||||||
|
R.id.menu_share -> {
|
||||||
|
AXT.at(getContext()).startCommonIntent().shareUrl(marketUrl)
|
||||||
|
return@OnNavigationItemSelectedListener true
|
||||||
|
}
|
||||||
|
|
||||||
|
R.id.menu_beta -> {
|
||||||
|
AXT.at(getContext()).startCommonIntent().openUrl("https://play.google.com/apps/testing/org.ligi.passandroid")
|
||||||
|
return@OnNavigationItemSelectedListener true
|
||||||
|
}
|
||||||
|
|
||||||
|
R.id.menu_settings -> {
|
||||||
|
AXT.at(getContext()).startCommonIntent().activityFromClass(PreferenceActivity::class.java)
|
||||||
|
return@OnNavigationItemSelectedListener true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun inflateHeaderView(@LayoutRes res: Int): View {
|
||||||
|
val view = super.inflateHeaderView(res)
|
||||||
|
|
||||||
|
App.component().inject(this)
|
||||||
|
|
||||||
|
bus.register(this)
|
||||||
|
onPassStoreChangeEvent(PassStoreChangeEvent)
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDetachedFromWindow() {
|
||||||
|
super.onDetachedFromWindow()
|
||||||
|
bus.unregister(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val marketUrl: String
|
||||||
|
get() = context.getString(R.string.market_url, context.packageName)
|
||||||
|
|
||||||
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||||
|
fun onPassStoreChangeEvent(passStoreChangeEvent: PassStoreChangeEvent) {
|
||||||
|
|
||||||
|
val passCount = passStore.passMap.size
|
||||||
|
getHeaderView(0).pass_count_header.text = context.getString(R.string.passes_nav, passCount)
|
||||||
|
|
||||||
|
val topicCount = passStore.classifier.getTopics().size
|
||||||
|
getHeaderView(0).topic_count_header.text = context.getString(R.string.categories_nav, topicCount)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,119 +0,0 @@
|
||||||
package org.ligi.passandroid.ui.edit;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.design.widget.TextInputEditText;
|
|
||||||
import android.text.Editable;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.ImageButton;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import butterknife.OnClick;
|
|
||||||
import java.util.List;
|
|
||||||
import org.ligi.axt.simplifications.SimpleTextWatcher;
|
|
||||||
import org.ligi.passandroid.R;
|
|
||||||
import org.ligi.passandroid.model.pass.PassField;
|
|
||||||
|
|
||||||
public class FieldsEditFragment extends PassandroidFragment {
|
|
||||||
|
|
||||||
private final static String ARGUMENT_KEY = "KEY";
|
|
||||||
private boolean isEditingHiddenFields;
|
|
||||||
|
|
||||||
public static FieldsEditFragment create(boolean primary) {
|
|
||||||
final FieldsEditFragment fieldsEditFragment = new FieldsEditFragment();
|
|
||||||
final Bundle args = new Bundle();
|
|
||||||
args.putBoolean(ARGUMENT_KEY, primary);
|
|
||||||
fieldsEditFragment.setArguments(args);
|
|
||||||
return fieldsEditFragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@BindView(R.id.fields_container)
|
|
||||||
ViewGroup viewGroup;
|
|
||||||
|
|
||||||
@BindView(R.id.add_field)
|
|
||||||
Button addFieldButton;
|
|
||||||
|
|
||||||
@OnClick(R.id.add_field)
|
|
||||||
void onAddField() {
|
|
||||||
final PassField passField = new PassField(null, null, null, isEditingHiddenFields);
|
|
||||||
addField(passField);
|
|
||||||
getPass().getFields().add(passField);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LayoutInflater inflater;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
|
||||||
this.inflater = inflater;
|
|
||||||
final View inflate = inflater.inflate(R.layout.edit_fields, container, false);
|
|
||||||
|
|
||||||
ButterKnife.bind(this, inflate);
|
|
||||||
|
|
||||||
isEditingHiddenFields = getArguments().getBoolean(ARGUMENT_KEY);
|
|
||||||
|
|
||||||
if (isEditingHiddenFields) {
|
|
||||||
addFieldButton.setText(R.string.add_back_fields);
|
|
||||||
} else {
|
|
||||||
addFieldButton.setText(R.string.add_front_field);
|
|
||||||
}
|
|
||||||
for (final PassField passField : getPass().getFields()) {
|
|
||||||
if (passField.getHide() == isEditingHiddenFields) {
|
|
||||||
addField(passField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return inflate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addField(final PassField passField) {
|
|
||||||
final ViewGroup child = (ViewGroup) inflater.inflate(R.layout.edit_field, viewGroup, false);
|
|
||||||
new FieldView(child).apply(passField, getPass().getFields());
|
|
||||||
viewGroup.addView(child);
|
|
||||||
}
|
|
||||||
|
|
||||||
class FieldView {
|
|
||||||
@BindView(R.id.label_field_edit)
|
|
||||||
TextInputEditText labelEdit;
|
|
||||||
|
|
||||||
@BindView(R.id.value_field_edit)
|
|
||||||
TextInputEditText valueEdit;
|
|
||||||
|
|
||||||
@BindView(R.id.delete_button)
|
|
||||||
ImageButton deleteButton;
|
|
||||||
|
|
||||||
FieldView(final ViewGroup container) {
|
|
||||||
ButterKnife.bind(this, container);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void apply(final PassField passField, final List<PassField> fields) {
|
|
||||||
labelEdit.setText(passField.getLabel());
|
|
||||||
valueEdit.setText(passField.getValue());
|
|
||||||
|
|
||||||
deleteButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(final View v) {
|
|
||||||
((View) (v.getParent())).setVisibility(View.GONE);
|
|
||||||
fields.remove(passField);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
valueEdit.addTextChangedListener(new SimpleTextWatcher() {
|
|
||||||
@Override
|
|
||||||
public void afterTextChanged(final Editable s) {
|
|
||||||
passField.setValue(s.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
labelEdit.addTextChangedListener(new SimpleTextWatcher() {
|
|
||||||
@Override
|
|
||||||
public void afterTextChanged(final Editable s) {
|
|
||||||
passField.setLabel(s.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
package org.ligi.passandroid.ui.edit
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.Editable
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import kotlinx.android.synthetic.main.edit_field.view.*
|
||||||
|
import kotlinx.android.synthetic.main.edit_fields.view.*
|
||||||
|
import org.ligi.axt.simplifications.SimpleTextWatcher
|
||||||
|
import org.ligi.passandroid.R
|
||||||
|
import org.ligi.passandroid.model.pass.PassField
|
||||||
|
|
||||||
|
class FieldsEditFragment : PassandroidFragment() {
|
||||||
|
private var isEditingHiddenFields: Boolean = false
|
||||||
|
|
||||||
|
private lateinit var inflater: LayoutInflater
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
this.inflater = inflater
|
||||||
|
val inflate = inflater.inflate(R.layout.edit_fields, container, false)
|
||||||
|
|
||||||
|
isEditingHiddenFields = arguments.getBoolean(ARGUMENT_KEY)
|
||||||
|
|
||||||
|
if (isEditingHiddenFields) {
|
||||||
|
inflate.add_field.setText(R.string.add_back_fields)
|
||||||
|
} else {
|
||||||
|
inflate.add_field.setText(R.string.add_front_field)
|
||||||
|
}
|
||||||
|
for (passField in pass.fields) {
|
||||||
|
if (passField.hide == isEditingHiddenFields) {
|
||||||
|
addField(passField, inflate.fields_container)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inflate.add_field.setOnClickListener {
|
||||||
|
val passField = PassField(null, null, null, isEditingHiddenFields)
|
||||||
|
addField(passField, inflate.fields_container)
|
||||||
|
pass.fields.add(passField)
|
||||||
|
}
|
||||||
|
return inflate
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addField(passField: PassField, viewGroup: ViewGroup) {
|
||||||
|
val child = inflater.inflate(R.layout.edit_field, viewGroup, false) as ViewGroup
|
||||||
|
FieldView(child).apply(passField, pass.fields)
|
||||||
|
viewGroup.addView(child)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal inner class FieldView(val container: ViewGroup) {
|
||||||
|
|
||||||
|
fun apply(passField: PassField, fields: MutableList<PassField>) {
|
||||||
|
container.label_field_edit.setText(passField.label)
|
||||||
|
container.value_field_edit.setText(passField.value)
|
||||||
|
|
||||||
|
container.delete_button.setOnClickListener { v ->
|
||||||
|
(v.parent as View).visibility = View.GONE
|
||||||
|
fields.remove(passField)
|
||||||
|
}
|
||||||
|
|
||||||
|
container.value_field_edit.addTextChangedListener(object : SimpleTextWatcher() {
|
||||||
|
override fun afterTextChanged(s: Editable) {
|
||||||
|
passField.value = s.toString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
container.label_field_edit.addTextChangedListener(object : SimpleTextWatcher() {
|
||||||
|
override fun afterTextChanged(s: Editable) {
|
||||||
|
passField.label = s.toString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private val ARGUMENT_KEY = "KEY"
|
||||||
|
|
||||||
|
fun create(primary: Boolean): FieldsEditFragment {
|
||||||
|
val fieldsEditFragment = FieldsEditFragment()
|
||||||
|
val args = Bundle()
|
||||||
|
args.putBoolean(ARGUMENT_KEY, primary)
|
||||||
|
fieldsEditFragment.arguments = args
|
||||||
|
return fieldsEditFragment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,42 +0,0 @@
|
||||||
package org.ligi.passandroid.ui.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.annotation.LayoutRes;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import org.ligi.passandroid.R;
|
|
||||||
import org.ligi.passandroid.helper.CategoryHelper;
|
|
||||||
import org.ligi.passandroid.model.pass.PassType;
|
|
||||||
|
|
||||||
public class BaseCategoryIndicatorView extends LinearLayout {
|
|
||||||
|
|
||||||
private ImageView topImageView;
|
|
||||||
|
|
||||||
public BaseCategoryIndicatorView(Context context, AttributeSet attrs) {
|
|
||||||
this(context,attrs,R.layout.category_indicator_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseCategoryIndicatorView(Context context, AttributeSet attrs, @LayoutRes final int layout) {
|
|
||||||
super(context, attrs);
|
|
||||||
LayoutInflater.from(context).inflate(layout, this, true);
|
|
||||||
topImageView = ButterKnife.findById(this,R.id.topImageView);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImageByCategory(PassType category) {
|
|
||||||
if (category == null) {
|
|
||||||
topImageView.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
topImageView.setVisibility(View.VISIBLE);
|
|
||||||
topImageView.setImageResource(CategoryHelper.INSTANCE.getCategoryTopImageRes(category));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAccentColor(int color) {
|
|
||||||
setBackgroundColor(color);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.ligi.passandroid.ui.views
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.support.annotation.LayoutRes
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import kotlinx.android.synthetic.main.category_indicator_base.view.*
|
||||||
|
import org.ligi.passandroid.R
|
||||||
|
import org.ligi.passandroid.helper.CategoryHelper
|
||||||
|
import org.ligi.passandroid.model.pass.PassType
|
||||||
|
|
||||||
|
open class BaseCategoryIndicatorView @JvmOverloads constructor(context: Context, attrs: AttributeSet, @LayoutRes val layoutRes: Int = R.layout.category_indicator_base) : LinearLayout(context, attrs) {
|
||||||
|
|
||||||
|
|
||||||
|
override fun onFinishInflate() {
|
||||||
|
super.onFinishInflate()
|
||||||
|
LayoutInflater.from(context).inflate(layoutRes, this, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setImageByCategory(category: PassType?) {
|
||||||
|
if (category == null) {
|
||||||
|
topImageView.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
topImageView.visibility = View.VISIBLE
|
||||||
|
topImageView.setImageResource(CategoryHelper.getCategoryTopImageRes(category))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setAccentColor(color: Int) = setBackgroundColor(color)
|
||||||
|
}
|
|
@ -1,23 +0,0 @@
|
||||||
package org.ligi.passandroid.ui.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import org.ligi.passandroid.R;
|
|
||||||
|
|
||||||
public class CategoryIndicatorViewWithIcon extends BaseCategoryIndicatorView {
|
|
||||||
|
|
||||||
private ImageView iconImageView;
|
|
||||||
|
|
||||||
public CategoryIndicatorViewWithIcon(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs, R.layout.category_indicator);
|
|
||||||
iconImageView = ButterKnife.findById(this, R.id.iconImageView);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIcon(final Bitmap iconBitmap) {
|
|
||||||
iconImageView.setImageBitmap(iconBitmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package org.ligi.passandroid.ui.views
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import kotlinx.android.synthetic.main.category_indicator.view.*
|
||||||
|
import org.ligi.passandroid.R
|
||||||
|
|
||||||
|
class CategoryIndicatorViewWithIcon(context: Context, attrs: AttributeSet) : BaseCategoryIndicatorView(context, attrs, R.layout.category_indicator) {
|
||||||
|
|
||||||
|
fun setIcon(iconBitmap: Bitmap) {
|
||||||
|
iconImageView.setImageBitmap(iconBitmap)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/fields_container"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
android:minWidth="64dp"
|
android:minWidth="64dp"
|
||||||
android:layout_width="wrap_content" android:layout_height="wrap_content"
|
android:layout_width="wrap_content" android:layout_height="wrap_content"
|
||||||
android:hint="label"
|
android:hint="label"
|
||||||
/>
|
/>
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
android:minWidth="64dp"
|
android:minWidth="64dp"
|
||||||
android:layout_width="wrap_content" android:layout_height="wrap_content"
|
android:layout_width="wrap_content" android:layout_height="wrap_content"
|
||||||
android:hint="value"
|
android:hint="value"
|
||||||
/>
|
/>
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
|
@ -30,7 +30,7 @@ class TheAppleStyleQuirkCorrector {
|
||||||
fun testThatDateIsExtracted() {
|
fun testThatDateIsExtracted() {
|
||||||
val pass = PassImpl(UUID.randomUUID().toString())
|
val pass = PassImpl(UUID.randomUUID().toString())
|
||||||
|
|
||||||
pass.fields = listOf(PassField("date", "foo", DATE_PROBE, false))
|
pass.fields = mutableListOf(PassField("date", "foo", DATE_PROBE, false))
|
||||||
|
|
||||||
tested.correctQuirks(pass)
|
tested.correctQuirks(pass)
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ class TheAppleStyleQuirkCorrector {
|
||||||
fun testThatInvalidDateIsIgnored() {
|
fun testThatInvalidDateIsIgnored() {
|
||||||
val pass = PassImpl(UUID.randomUUID().toString())
|
val pass = PassImpl(UUID.randomUUID().toString())
|
||||||
|
|
||||||
pass.fields = listOf(PassField("date", "foo", "invalid", false))
|
pass.fields = mutableListOf(PassField("date", "foo", "invalid", false))
|
||||||
|
|
||||||
tested.correctQuirks(pass)
|
tested.correctQuirks(pass)
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ class TheAppleStyleQuirkCorrector {
|
||||||
fun testThatDateIsExtractedAfterWrongDatesBefore() {
|
fun testThatDateIsExtractedAfterWrongDatesBefore() {
|
||||||
val pass = PassImpl(UUID.randomUUID().toString())
|
val pass = PassImpl(UUID.randomUUID().toString())
|
||||||
|
|
||||||
pass.fields = listOf(PassField("date", "foo", "invalid", false),PassField("date", "foo", DATE_PROBE, false))
|
pass.fields = mutableListOf(PassField("date", "foo", "invalid", false), PassField("date", "foo", DATE_PROBE, false))
|
||||||
|
|
||||||
tested.correctQuirks(pass)
|
tested.correctQuirks(pass)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue