diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 1fd20b0..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -My Costs \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 261ec28..0f32ff6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,6 +13,7 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index d3efc26..2d3f4db 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - - - - - - - - - - - - + diff --git a/.idea/modules.xml b/.idea/modules.xml index b8b99b7..ed716cb 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index a612d6c..72df4f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.application' -apply plugin: 'com.neenbedankt.android-apt' apply from: "${project.rootDir}/QA/quality.gradle" android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 26 + buildToolsVersion '26.0.1' defaultConfig { applicationId "com.kodelabs.mycosts" minSdkVersion 15 - targetSdkVersion 23 + targetSdkVersion 26 versionCode 1 versionName "1.0" } @@ -28,9 +27,10 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // general - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' - compile 'com.jakewharton:butterknife:7.0.1' + compile 'com.android.support:appcompat-v7:26.0.0' + compile 'com.android.support:design:26.0.0' + compile 'com.jakewharton:butterknife:8.8.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.0' compile 'com.jakewharton.timber:timber:4.1.0' // inspection @@ -38,23 +38,23 @@ dependencies { compile 'com.facebook.stetho:stetho-okhttp3:1.3.0' // network - compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' - compile 'com.squareup.retrofit2:converter-gson:+' - compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' + compile 'com.squareup.retrofit2:retrofit:2.3.0' + compile 'com.squareup.retrofit2:converter-gson:2.3.0' + compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' // database - apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" + annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}" compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}" // material design - compile 'com.android.support:cardview-v7:23.1.1' - compile 'com.android.support:recyclerview-v7:23.1.1' + compile 'com.android.support:cardview-v7:26.0.0' + compile 'com.android.support:recyclerview-v7:26.0.0' compile('com.github.ozodrukh:CircularReveal:1.1.1@aar') { transitive = true; } // tests testCompile 'junit:junit:4.12' - testCompile "org.mockito:mockito-core:1.+" + testCompile "org.mockito:mockito-core:1.10.19" } diff --git a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/AbstractCostActivity.java b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/AbstractCostActivity.java index fa4f43c..c492c62 100644 --- a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/AbstractCostActivity.java +++ b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/AbstractCostActivity.java @@ -18,7 +18,7 @@ import java.util.Date; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import io.codetail.widget.RevealFrameLayout; @@ -30,29 +30,23 @@ public abstract class AbstractCostActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener { - @Bind(R.id.reveal_layout) + protected Date mSelectedDate; + protected String mDescription; + protected String mCategory; + protected double mAmount; + @BindView(R.id.reveal_layout) RevealFrameLayout mRevealLayout; - - @Bind(R.id.toolbar) + @BindView(R.id.toolbar) Toolbar mToolbar; - - @Bind(R.id.input_date) + @BindView(R.id.input_date) TextView mDateTextView; - - @Bind(R.id.input_amount) + @BindView(R.id.input_amount) EditText mAmountEditText; - - @Bind(R.id.input_description) + @BindView(R.id.input_description) EditText mDescriptionEditText; - - @Bind(R.id.input_cost_category) + @BindView(R.id.input_cost_category) Spinner mCategorySpinner; - protected Date mSelectedDate; - protected String mDescription; - protected String mCategory; - protected double mAmount; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/MainActivity.java b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/MainActivity.java index c0062ac..4ea37c1 100644 --- a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/activities/MainActivity.java @@ -27,7 +27,7 @@ import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; import io.codetail.widget.RevealFrameLayout; import timber.log.Timber; @@ -38,10 +38,10 @@ public class MainActivity extends AppCompatActivity implements MainPresenter.Vie public static final int EDIT_COST_REQUEST = 0; - @Bind(R.id.expenses_list) + @BindView(R.id.expenses_list) RecyclerView mRecyclerView; - @Bind(R.id.reveal_layout) + @BindView(R.id.reveal_layout) RevealFrameLayout mRevealLayout; private MainPresenter mMainPresenter; diff --git a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/adapters/CostItemAdapter.java b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/adapters/CostItemAdapter.java index f4c7b0b..084351c 100644 --- a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/adapters/CostItemAdapter.java +++ b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/adapters/CostItemAdapter.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Set; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -30,86 +30,12 @@ public class CostItemAdapter extends RecyclerView.Adapter implements RecyclerViewClickListener { - private enum ViewType { - CONTRACTED_CARD, EXPANDED_CARD - } - + public final MainPresenter.View mView; private List mCostList; - private Context mContext; + private Context mContext; private Set mSelectedItems; - public final MainPresenter.View mView; - - public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - - @Bind(R.id.cost_item_title) - public TextView mTitle; - - @Bind(R.id.cost_item_total_value) - public TextView mTotalCost; - - private RecyclerViewClickListener mListener; - - public void setup(DailyTotalCost dailyTotalCost) { - Context context = mTitle.getContext(); - - final String dateText = DateUtils.dateToText(context, dailyTotalCost.getDate()); - final String title = String.format(context.getString(R.string.total_expenses), dateText); - mTitle.setText(title); - mTotalCost.setText(String.valueOf(dailyTotalCost.getTotalCost()) + "$"); - } - - @Override - public void onClick(View v) { - mListener.onClickView(getAdapterPosition()); - } - - public ViewHolder(View v, final RecyclerViewClickListener listener) { - super(v); - ButterKnife.bind(this, v); - v.setOnClickListener(this); - mListener = listener; - } - } - - public static class ExpandedViewHolder extends RecyclerView.ViewHolder - implements View.OnClickListener, IndividualCostViewClickListener { - - @Bind(R.id.card_expanded_costview) - public ExpandedCostView mExpandedCostView; - - private RecyclerViewClickListener mListener; - - @Override - public void onClickDelete(long costId) { - mListener.onClickDelete(getAdapterPosition(), costId); - } - - @Override - public void onClickEdit(long costId) { - mListener.onClickEdit(getAdapterPosition(), costId); - } - - @Override - public void onClick(View v) { - mListener.onClickView(getAdapterPosition()); - } - - public ExpandedViewHolder(View v, final RecyclerViewClickListener listener) { - super(v); - ButterKnife.bind(this, v); - v.setOnClickListener(this); - - // this listener is our adapter - mListener = listener; - - // set a listener for edit, delete calls - mExpandedCostView.setIndividualCostViewClickListener(this); - } - } - - public CostItemAdapter(MainPresenter.View view, Context context) { mCostList = new ArrayList<>(); mView = view; @@ -198,4 +124,76 @@ public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { public int getItemCount() { return mCostList.size(); } + + private enum ViewType { + CONTRACTED_CARD, EXPANDED_CARD + } + + public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + + @BindView(R.id.cost_item_title) + public TextView mTitle; + + @BindView(R.id.cost_item_total_value) + public TextView mTotalCost; + + private RecyclerViewClickListener mListener; + + public ViewHolder(View v, final RecyclerViewClickListener listener) { + super(v); + ButterKnife.bind(this, v); + v.setOnClickListener(this); + mListener = listener; + } + + public void setup(DailyTotalCost dailyTotalCost) { + Context context = mTitle.getContext(); + + final String dateText = DateUtils.dateToText(context, dailyTotalCost.getDate()); + final String title = String.format(context.getString(R.string.total_expenses), dateText); + mTitle.setText(title); + mTotalCost.setText(String.valueOf(dailyTotalCost.getTotalCost()) + "$"); + } + + @Override + public void onClick(View v) { + mListener.onClickView(getAdapterPosition()); + } + } + + public static class ExpandedViewHolder extends RecyclerView.ViewHolder + implements View.OnClickListener, IndividualCostViewClickListener { + + @BindView(R.id.card_expanded_costview) + public ExpandedCostView mExpandedCostView; + + private RecyclerViewClickListener mListener; + + public ExpandedViewHolder(View v, final RecyclerViewClickListener listener) { + super(v); + ButterKnife.bind(this, v); + v.setOnClickListener(this); + + // this listener is our adapter + mListener = listener; + + // set a listener for edit, delete calls + mExpandedCostView.setIndividualCostViewClickListener(this); + } + + @Override + public void onClickDelete(long costId) { + mListener.onClickDelete(getAdapterPosition(), costId); + } + + @Override + public void onClickEdit(long costId) { + mListener.onClickEdit(getAdapterPosition(), costId); + } + + @Override + public void onClick(View v) { + mListener.onClickView(getAdapterPosition()); + } + } } diff --git a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/CostItemView.java b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/CostItemView.java index e19edcd..1cc5c35 100644 --- a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/CostItemView.java +++ b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/CostItemView.java @@ -14,7 +14,7 @@ import com.kodelabs.mycosts.domain.model.Cost; import com.kodelabs.mycosts.presentation.ui.listeners.IndividualCostViewClickListener; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @@ -23,16 +23,16 @@ */ public class CostItemView extends RelativeLayout implements OnMenuItemClickListener { - @Bind(R.id.cost_item_title) + @BindView(R.id.cost_item_title) TextView mCategoryView; - @Bind(R.id.cost_item_total_value) + @BindView(R.id.cost_item_total_value) TextView mValueView; - @Bind(R.id.cost_item_description) + @BindView(R.id.cost_item_description) TextView mDescriptionView; - @Bind(R.id.button_menu) + @BindView(R.id.button_menu) ImageButton mMenuButton; private IndividualCostViewClickListener mCostViewClickListener; diff --git a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/ExpandedCostView.java b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/ExpandedCostView.java index 393fba7..76e1656 100644 --- a/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/ExpandedCostView.java +++ b/app/src/main/java/com/kodelabs/mycosts/presentation/ui/customviews/ExpandedCostView.java @@ -19,7 +19,7 @@ import java.util.Date; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -27,13 +27,13 @@ */ public class ExpandedCostView extends CardView { - @Bind(R.id.cost_item_title) + @BindView(R.id.cost_item_title) TextView mTitle; - @Bind(R.id.cost_item_total_value) + @BindView(R.id.cost_item_total_value) TextView mValue; - @Bind(R.id.layout_individual_cost_items) + @BindView(R.id.layout_individual_cost_items) LinearLayout mLinearLayout; @Nullable diff --git a/app/src/main/java/com/kodelabs/mycosts/sync/SyncAdapter.java b/app/src/main/java/com/kodelabs/mycosts/sync/SyncAdapter.java index 1eee50c..d080f93 100644 --- a/app/src/main/java/com/kodelabs/mycosts/sync/SyncAdapter.java +++ b/app/src/main/java/com/kodelabs/mycosts/sync/SyncAdapter.java @@ -39,6 +39,25 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { private CostRepository mCostRepository; private List mUnsyncedCosts; + private Callback mResponseCallback = new Callback() { + @Override + public void onResponse(Call call, Response response) { + Timber.i("UPLOAD SUCCESS: %d", response.code()); + + if (response.isSuccessful()) { + mCostRepository.markSynced(mUnsyncedCosts); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Timber.e("UPLOAD FAIL"); + t.printStackTrace(); + + // try to sync again + SyncResult syncResult = new SyncResult(); + } + }; public SyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); @@ -69,27 +88,6 @@ public static void triggerSync(Context context) { ContentResolver.requestSync(account, context.getString(R.string.stub_content_authority), settingsBundle); } - - private Callback mResponseCallback = new Callback() { - @Override - public void onResponse(Call call, Response response) { - Timber.i("UPLOAD SUCCESS: %d", response.code()); - - if (response.isSuccess()) { - mCostRepository.markSynced(mUnsyncedCosts); - } - } - - @Override - public void onFailure(Call call, Throwable t) { - Timber.e("UPLOAD FAIL"); - t.printStackTrace(); - - // try to sync again - SyncResult syncResult = new SyncResult(); - } - }; - @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { @@ -117,7 +115,7 @@ public void onPerformSync(Account account, Bundle extras, String authority, Cont Timber.i("UPLOAD SUCCESS: %d", response.code()); // everything went well, mark local cost items as synced - if (response.isSuccess()) { + if (response.isSuccessful()) { mCostRepository.markSynced(mUnsyncedCosts); } diff --git a/build.gradle b/build.gradle index 2974c8e..2ff6984 100644 --- a/build.gradle +++ b/build.gradle @@ -5,10 +5,9 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:3.0.0-alpha8' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' - // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -18,8 +17,9 @@ allprojects { repositories { jcenter() maven { - url "https://jitpack.io" + url "https://maven.google.com" } + maven { url "https://jitpack.io" } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f23df6e..2b30c4d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 21 11:34:03 PDT 2015 +#Mon Jul 31 17:57:11 MST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-milestone-1-all.zip