/*
* Copyright © 2016 TIBCO Software,Inc.All rights reserved.
* http://community.jaspersoft.com/project/jaspermobile-android
*
* Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
* the following license terms apply:
*
* This program is part of TIBCO Jaspersoft Mobile for Android.
*
* TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation,either version 3of the License,or
* (at your option)any later version.
*
* TIBCO Jaspersoft Mobile 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TIBCO Jaspersoft Mobile for Android.If not,see
* <http://www.gnu.org/licenses/lgpl>.
*/
package com.jaspersoft.android.jaspermobile.activities.inputcontrols;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.adapters.FilterableAdapter;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.adapters.SingleSelectIcAdapter;
import com.jaspersoft.android.jaspermobile.internal.di.modules.activity.ActivityModule;
import com.jaspersoft.android.jaspermobile.internal.di.modules.activity.ReportModule;
import com.jaspersoft.android.jaspermobile.ui.view.activity.ToolbarActivity;
import com.jaspersoft.android.jaspermobile.util.ReportParamsStorage;
import com.jaspersoft.android.sdk.client.oxm.control.InputControl;
import com.jaspersoft.android.sdk.client.oxm.control.InputControlOption;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.OptionsMenuItem;
import org.androidannotations.annotations.ViewById;
import java.util.List;
import javax.inject.Inject;
/**
* @author Andrew Tivodar
* @since 2.2
*/
@EActivity(R.layout.view_select_ic_list)
@OptionsMenu(R.menu.search_menu)
public class SingleSelectActivity extends ToolbarActivity implements SearchView.OnQueryTextListener {
public static final String SELECT_IC_ARG = "select_input_control_id";
@Inject
protected ReportParamsStorage paramsStorage;
@Extra
protected String reportUri;
@Extra
protected String inputControlId;
@Extra
protected int listType;
@OptionsMenuItem(R.id.search)
public MenuItem searchMenuItem;
@ViewById(R.id.inputControlsList)
protected RecyclerView inputControlsList;
@ViewById(R.id.empty)
protected TextView emptyText;
private SingleSelectIcAdapter mSingleSelectIcAdapter;
private List<InputControlOption> mInputControlOptions;
private String mInputControlLabel;
private int mPreviousSelected;
private boolean isValueChanged;
@AfterViews
protected void init() {
getProfileComponent()
.plusControlsPage(
new ActivityModule(this),
new ReportModule(reportUri)
)
.inject(this);
initInputControlOptions();
showInputControlOptions();
emptyText.setText(getString(R.string.r_search_nothing_to_display));
mPreviousSelected = getSelectedPosition();
inputControlsList.scrollToPosition(mPreviousSelected);
getSupportActionBar().setTitle(mInputControlLabel);
}
@Override
public void onBackPressed() {
Intent dataIntent = new Intent();
dataIntent.putExtra(SELECT_IC_ARG, inputControlId);
int resultCode = isValueChanged ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
setResult(resultCode, dataIntent);
super.onBackPressed();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setOnQueryTextListener(this);
searchView.setQueryHint(getString(R.string.ro_search));
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mSingleSelectIcAdapter.filter(newText);
return true;
}
@Override
protected String getScreenName() {
return getString(R.string.ja_ss_ic_s);
}
private void showInputControlOptions() {
mSingleSelectIcAdapter = new SingleSelectIcAdapter(mInputControlOptions);
inputControlsList.setLayoutManager(new LinearLayoutManager(this));
inputControlsList.setAdapter(mSingleSelectIcAdapter);
inputControlsList.setHasFixedSize(true);
inputControlsList.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int visibleItemCount = recyclerView.getChildCount();
int totalItemCount = recyclerView.getLayoutManager().getItemCount();
int firstVisibleItem = ((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition();
if (totalItemCount > 0 && firstVisibleItem + visibleItemCount >= totalItemCount) {
mSingleSelectIcAdapter.loadNextItems();
}
}
});
mSingleSelectIcAdapter.setFilterListener(new FilterableAdapter.FilterListener() {
@Override
public void onFilterDone() {
onFilteringList();
}
});
mSingleSelectIcAdapter.setItemSelectListener(new SingleSelectIcAdapter.ItemSelectListener() {
@Override
public void onItemSelected(int position) {
mInputControlOptions.get(mPreviousSelected).setSelected(false);
mSingleSelectIcAdapter.updateItem(mPreviousSelected);
mInputControlOptions.get(position).setSelected(true);
mSingleSelectIcAdapter.updateItem(position);
mPreviousSelected = position;
isValueChanged = true;
}
});
}
private void initInputControlOptions() {
List<InputControl> inputControls = paramsStorage.getInputControlHolder(reportUri).getInputControls();
for (InputControl inputControl : inputControls) {
if (inputControl.getId().equals(inputControlId)) {
mInputControlLabel = inputControl.getLabel();
mInputControlOptions = inputControl.getState().getOptions();
break;
}
}
}
private void onFilteringList(){
emptyText.setVisibility(mSingleSelectIcAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
inputControlsList.scrollToPosition(0);
}
private int getSelectedPosition() {
for (int i = 0; i < mInputControlOptions.size(); i++) {
if (mInputControlOptions.get(i).isSelected()) {
return i;
}
}
return -1;
}
}