package com.gaiagps.iburn.fragment;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import com.gaiagps.iburn.R;
import com.gaiagps.iburn.database.CampTable;
import com.gaiagps.iburn.database.DataProvider;
import com.gaiagps.iburn.database.PlayaDatabase;
import com.gaiagps.iburn.database.PlayaItemTable;
import com.squareup.sqlbrite.SqlBrite;
import java.io.IOException;
import timber.log.Timber;
public class WelcomeFragment extends Fragment implements TextureView.SurfaceTextureListener {
final static String LAYOUT_ID = "layoutid";
// Welcome 1 - Show video
private MediaPlayer mediaPlayer;
private TextureView textureView;
private Surface surface;
// Welcome 3 - Set Home
private AutoCompleteTextView campSearchView;
public static WelcomeFragment newInstance(int layoutId) {
WelcomeFragment pane = new WelcomeFragment();
Bundle args = new Bundle();
args.putInt(LAYOUT_ID, layoutId);
pane.setArguments(args);
return pane;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(getArguments().getInt(LAYOUT_ID, -1), container, false);
if (getArguments().getInt(LAYOUT_ID, -1) == R.layout.welcome_fragment1) {
// Intro video
textureView = ((TextureView) rootView.findViewById(R.id.video));
textureView.setSurfaceTextureListener(this);
} else if (getArguments().getInt(LAYOUT_ID, -1) == R.layout.welcome_fragment3) {
// Set Home location
campSearchView = (AutoCompleteTextView) rootView.findViewById(R.id.campNameSearch);
campSearchView.setAdapter(new CampAutoCompleteAdapter(getActivity()));
campSearchView.setOnItemClickListener((parent, view, position, id) -> {
Cursor campCursor = ((Cursor) campSearchView.getAdapter().getItem(position));
HomeCampSelectionListener.CampSelection selection = new HomeCampSelectionListener.CampSelection(campCursor.getDouble(campCursor.getColumnIndex(CampTable.latitude)),
campCursor.getDouble(campCursor.getColumnIndex(CampTable.longitude)),
campCursor.getString(campCursor.getColumnIndex(CampTable.name)));
campSearchView.setTag(selection);
Timber.d("Item selected %s", campSearchView.getText().toString());
InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(campSearchView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
if (getActivity() instanceof HomeCampSelectionListener) {
((HomeCampSelectionListener) getActivity()).onHomeCampSelected(selection);
}
});
}
return rootView;
}
@Override
public void onDestroyView () {
super.onDestroyView();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
if (surface != null) {
surface.release();
}
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
surface = new Surface(surfaceTexture);
try {
AssetFileDescriptor descriptor = getActivity().getAssets().openFd("mp4/onboarding_loop_final.mp4");
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
mediaPlayer.setSurface(surface);
mediaPlayer.prepare();
scaleTextureView(textureView);
mediaPlayer.start();
mediaPlayer.setLooping(true);
} catch (IllegalArgumentException | SecurityException | IOException | IllegalStateException e) {
Timber.e(e, "Error preparing video");
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
//unused
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
//unused
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
//unused
}
private void scaleTextureView(TextureView textureView) {
// TODO : Do this properly. We're assuming a ~9:16 portrait screen ratio
textureView.setScaleX(1.78f);
textureView.requestLayout();
textureView.invalidate();
}
private class CampAutoCompleteAdapter extends BaseAdapter implements Filterable {
private Cursor cursor;
private DataProvider dataProvider;
private CampNameFilter filter;
LayoutInflater inflater;
public CampAutoCompleteAdapter(Context context) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
DataProvider.getInstance(context.getApplicationContext())
.subscribe(readyDataProvider -> this.dataProvider = readyDataProvider);
}
public void changeCursor(Cursor newCursor) {
if (cursor != null) {
cursor.close();
cursor = null;
}
cursor = newCursor;
}
@Override
public int getCount() {
return cursor == null ? 0 : cursor.getCount();
}
@Override
public Object getItem(int position) {
if (cursor == null) return null;
cursor.moveToPosition(position);
return cursor;
}
@Override
public long getItemId(int position) {
if (cursor == null) return -1;
cursor.moveToPosition(position);
return cursor.getInt(cursor.getColumnIndex(PlayaItemTable.id));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(getActivity());
convertView.setPadding(16, 16, 16, 16);
((TextView) convertView).setTextSize(16);
((TextView) convertView).setTextAppearance(getActivity(), R.style.PlayaTextItem);
}
if (cursor != null) {
cursor.moveToPosition(position);
((TextView) convertView).setText(cursor.getString(cursor.getColumnIndex(PlayaItemTable.name)));
}
return convertView;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new CampNameFilter();
}
return filter;
}
private class CampNameFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Timber.d("Perform filtering with constraint %s", constraint == null ? "None" : constraint.toString());
FilterResults r = new FilterResults();
if (constraint != null) {
String query = '%' + constraint.toString() + '%';
Cursor newResult = dataProvider.createEmbargoExemptQuery(PlayaDatabase.CAMPS, "SELECT * FROM " + PlayaDatabase.CAMPS + " WHERE " + CampTable.name + " LIKE ?", query)
.map(SqlBrite.Query::run)
.toBlocking()
.first();
r.values = newResult;
r.count = newResult.getCount();
}
return r;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
Timber.d("Publish %d result for %s", results.values == null ? 0 : ((Cursor) results.values).getCount(), constraint == null ? "None" : constraint.toString());
if (results.values == null || results.count > 0) {
Timber.d("Publishing results to adapter");
changeCursor((Cursor) results.values);
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
public CharSequence convertResultToString(Object result) {
if (result instanceof Cursor) {
Cursor cursorResult = (Cursor) result;
return cursorResult.getString(cursorResult.getColumnIndex(PlayaItemTable.name));
}
return super.convertResultToString(result);
}
}
}
public interface HomeCampSelectionListener {
void onHomeCampSelected(CampSelection selection);
class CampSelection {
public final String name;
public final double lat;
public final double lon;
public CampSelection(double lat, double lon, String name) {
this.lat = lat;
this.lon = lon;
this.name = name;
}
}
}
}