Java tutorial
/* * Copyright 2016 Andrey Tolpeev * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.vase4kin.teamcityapp.overview.view; import android.app.Activity; import android.content.DialogInterface; import android.graphics.Color; import android.graphics.PorterDuff; import android.support.annotation.StringRes; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import com.cocosw.bottomsheet.BottomSheet; import com.github.vase4kin.teamcityapp.R; import com.github.vase4kin.teamcityapp.navigation.api.BuildElement; import com.github.vase4kin.teamcityapp.overview.data.OverviewDataModelImpl; import com.joanzapata.iconify.IconDrawable; import com.joanzapata.iconify.fonts.MaterialIcons; import com.pnikosis.materialishprogress.ProgressWheel; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import tr.xip.errorview.ErrorView; /** * View to manage {@link OverviewFragment} */ public class OverviewViewImpl implements OverviewView { private static final String ICON_TIME = "{mdi-clock}"; private static final String ICON_BRANCH = "{mdi-git}"; private static final String ICON_AGENT = "{md-directions-railway}"; private static final String ICON_TRIGGER_BY = "{md-account-circle}"; @BindView(R.id.swiperefresh) SwipeRefreshLayout mSwipeRefreshLayout; @BindView(R.id.my_recycler_view) RecyclerView mRecyclerView; @BindView(R.id.error_view) ErrorView mErrorView; @BindView(R.id.progress_wheel) ProgressWheel mProgressWheel; private Unbinder mUnbinder; private ViewListener mListener; private Activity mActivity; private View mView; private OverviewAdapter mAdapter; private final List<BuildElement> mElements = new ArrayList<>(); public OverviewViewImpl(View view, Activity activity, OverviewAdapter overviewAdapter) { this.mActivity = activity; this.mView = view; this.mAdapter = overviewAdapter; } /** * {@inheritDoc} */ @Override public void initViews(ViewListener listener) { this.mListener = listener; mUnbinder = ButterKnife.bind(this, mView); mErrorView.getImage().setColorFilter(Color.LTGRAY, PorterDuff.Mode.SRC_ATOP); mErrorView.setOnRetryListener(listener); mSwipeRefreshLayout.setOnRefreshListener(listener); mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); // For testing purposes mRecyclerView.setId(R.id.overview_recycler_view); } /** * {@inheritDoc} */ @Override public void showCards() { mAdapter.setDataModel(new OverviewDataModelImpl(mElements, mActivity.getApplicationContext())); mAdapter.setViewListener(mListener); mRecyclerView.setAdapter(mAdapter); mAdapter.notifyDataSetChanged(); } /** * {@inheritDoc} */ @Override public void hideCards() { mElements.clear(); mAdapter.setDataModel(new OverviewDataModelImpl(mElements, mActivity.getApplicationContext())); mAdapter.notifyDataSetChanged(); } /** * {@inheritDoc} */ @Override public void showProgressWheel() { mProgressWheel.setVisibility(View.VISIBLE); } /** * {@inheritDoc} */ @Override public void hideProgressWheel() { mProgressWheel.setVisibility(View.GONE); } /** * {@inheritDoc} */ @Override public void showRefreshingProgress() { mSwipeRefreshLayout.setRefreshing(true); } /** * {@inheritDoc} */ @Override public void hideRefreshingProgress() { mSwipeRefreshLayout.setRefreshing(false); } /** * {@inheritDoc} */ @Override public void showErrorView() { mErrorView.setVisibility(View.VISIBLE); mErrorView.setSubtitle(R.string.error_view_error_text); } /** * {@inheritDoc} */ @Override public void hideErrorView() { mErrorView.setVisibility(View.GONE); } /** * {@inheritDoc} */ @Override public void unbindViews() { mUnbinder.unbind(); } /** * {@inheritDoc} */ @Override public void addWaitReasonStatusCard(String icon, String waitReason) { addCard(R.string.build_wait_reason_section_text, icon, waitReason); } /** * {@inheritDoc} */ @Override public void addResultStatusCard(String icon, String result) { addCard(R.string.build_result_section_text, icon, result); } /** * {@inheritDoc} */ @Override public void addCancelledByCard(String icon, String userName) { addCard(R.string.build_canceled_by_text, icon, userName); } /** * {@inheritDoc} */ @Override public void addCancellationTimeCard(String time) { addCard(R.string.build_cancellation_time_text, ICON_TIME, time); } /** * {@inheritDoc} */ @Override public void addTimeCard(String time) { addCard(R.string.build_time_section_text, ICON_TIME, time); } /** * {@inheritDoc} */ @Override public void addQueuedTimeCard(String time) { addCard(R.string.build_queued_time_section_text, ICON_TIME, time); } /** * {@inheritDoc} */ @Override public void addEstimatedTimeToStartCard(String time) { addCard(R.string.build_time_to_start_section_text, ICON_TIME, time); } /** * {@inheritDoc} */ @Override public void addBranchCard(String branchName) { addCard(R.string.build_branch_section_text, ICON_BRANCH, branchName); } /** * {@inheritDoc} */ @Override public void addAgentCard(String agentName) { addCard(R.string.build_agent_section_text, ICON_AGENT, agentName); } /** * {@inheritDoc} */ @Override public void addTriggeredByCard(String triggeredBy) { addCard(R.string.build_triggered_by_section_text, ICON_TRIGGER_BY, triggeredBy); } /** * {@inheritDoc} */ @Override public void addRestartedByCard(String restartedBy) { addCard(R.string.build_restarted_by_section_text, ICON_TRIGGER_BY, restartedBy); } /** * {@inheritDoc} */ @Override public void addTriggeredByUnknownTriggerTypeCard() { String unknownTrigger = mActivity.getString(R.string.unknown_trigger_type_text); addTriggeredByCard(unknownTrigger); } /** * {@inheritDoc} */ @Override public void addPersonalCard(String userName) { addCard(R.string.build_personal_text, ICON_TRIGGER_BY, userName); } /** * Add card * * @param header - Header * @param icon - Icon * @param text - Text */ private void addCard(@StringRes int header, String icon, String text) { mElements.add(new BuildElement(icon, text, mActivity.getString(header))); } /** * {@inheritDoc} */ @Override public void createStopBuildOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_stop_build_tabs_activity, menu); } /** * {@inheritDoc} */ @Override public void createRemoveBuildFromQueueOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_remove_from_queue_build_tabs_activity, menu); } /** * {@inheritDoc} */ @Override public void createDefaultOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_share_build_tabs_activity, menu); } /** * {@inheritDoc} */ @Override public boolean onOptionsItemSelected(MenuItem item) { mActivity.invalidateOptionsMenu(); switch (item.getItemId()) { case R.id.cancel_build: mListener.onCancelBuildContextMenuClick(); return true; case R.id.share_build: mListener.onShareButtonClick(); return true; case R.id.restart_build: mListener.onRestartBuildButtonClick(); return true; default: return false; } } /** * {@inheritDoc} */ @Override public void showDefaultCardBottomSheetDialog(String header, final String description) { BottomSheet bottomSheet = createBottomSheet(header, description); bottomSheet.getMenu().findItem(R.id.show_builds_built_branch).setVisible(false); bottomSheet.show(); } /** * {@inheritDoc} */ @Override public void showBranchCardBottomSheetDialog(String description) { BottomSheet bottomSheet = createBottomSheet(mActivity.getString(R.string.build_branch_section_text), description); bottomSheet.show(); } /** * Create bottom sheet * * @param header - bottom sheet header * @param description - description to use * @return */ private BottomSheet createBottomSheet(String header, final String description) { BottomSheet bottomSheet = new BottomSheet.Builder(mActivity).title(header).sheet(R.menu.menu_item_overview) .listener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.copy: mListener.onCopyActionClick(description); return true; case R.id.show_builds_built_branch: mListener.onShowBuildsActionClick(description); return true; default: return false; } } }).build(); bottomSheet.getMenu().findItem(R.id.copy) .setIcon(new IconDrawable(mActivity, MaterialIcons.md_content_copy)); bottomSheet.getMenu().findItem(R.id.show_builds_built_branch) .setIcon(new IconDrawable(mActivity, MaterialIcons.md_list)); bottomSheet.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { mListener.onBottomSheetShow(); } }); bottomSheet.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mListener.onBottomSheetDismiss(); } }); return bottomSheet; } }