package com.felkertech.cumulustv.activities;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.v4.util.Pair;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.felkertech.cumulustv.fileio.AbstractFileParser;
import com.felkertech.cumulustv.fileio.AssetsFileParser;
import com.felkertech.cumulustv.fileio.FileParserFactory;
import com.felkertech.cumulustv.fileio.HttpFileParser;
import com.felkertech.cumulustv.fileio.LocalFileParser;
import com.felkertech.cumulustv.fileio.M3uParser;
import com.felkertech.cumulustv.fileio.CumulusXmlParser;
import com.felkertech.cumulustv.model.ChannelDatabase;
import com.felkertech.n.cumulustv.R;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by Nick on 12/16/2016.
*/
@VisibleForTesting
public class FileIoTestActivity extends AppCompatActivity {
private static final String TAG = FileIoTestActivity.class.getSimpleName();
private ImportedFile[] files = new ImportedFile[] {
new ImportedFile("Test Open", ""),
new ImportedFile("Print M3U", ""),
new ImportedFile("M3U 1", "https://raw.githubusercontent.com/Fleker/CumulusTV/master/app/src/test/resources/m3u_test1.m3u"),
new ImportedFile("M3U 2", "https://raw.githubusercontent.com/Fleker/CumulusTV/master/app/src/test/resources/m3u_test2.m3u"),
new ImportedFile("M3U 3", "https://raw.githubusercontent.com/Fleker/CumulusTV/master/app/src/test/resources/m3u_test3.m3u"),
new ImportedFile("M3U 4", "https://raw.githubusercontent.com/Fleker/CumulusTV/master/app/src/test/resources/m3u_test4.m3u"),
new ImportedFile("M3U 5", "https://raw.githubusercontent.com/Fleker/CumulusTV/master/app/src/test/resources/m3u_test5.m3u"),
new ImportedFile("M3U 6", "https://raw.githubusercontent.com/Fleker/CumulusTV/master/app/src/test/resources/m3u_test6.m3u")
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = new View(this);
v.setBackgroundColor(getResources().getColor(R.color.md_material_blue_800));
setContentView(v);
}
@Override
protected void onResume() {
super.onResume();
new AlertDialog.Builder(this)
.setTitle("Choose a file")
.setItems(getTitles(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int position) {
if (position > 1) {
readFile(position);
} else if (position == 0) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("https://raw.githubusercontent.com/Fleker/Cumulus" +
"TV/master/app/src/test/resources/m3u_test1.m3u"));
startActivity(i);
} else if (position == 1) {
new AlertDialog.Builder(FileIoTestActivity.this)
.setTitle("Here's how your Channel Data Looks:")
.setMessage(ChannelDatabase.getInstance(FileIoTestActivity.this)
.toM3u())
.show();
}
}
})
.show();
}
private void readFile(int position) {
Log.d(TAG, "User selected " + files[position].uri);
FileParserFactory.parseGenericFileUri(files[position].uri,
new FileParserFactory.FileIdentifier() {
@Override
public void onLocalFile(final String uri) {
try {
new LocalFileParser(uri, new AbstractFileParser.FileLoader() {
@Override
public void onFileLoaded(InputStream inputStream) {
try {
parse(uri, inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
});
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void onAsset(final String uri) {
try {
new AssetsFileParser(getApplicationContext(), uri,
new AbstractFileParser.FileLoader() {
@Override
public void onFileLoaded(InputStream inputStream) {
try {
parse(uri, inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onHttpFile(final String uri) {
new HttpFileParser(uri, new AbstractFileParser.FileLoader() {
@Override
public void onFileLoaded(InputStream inputStream) {
try {
Log.d(TAG, "Printing " + uri);
parse(uri, inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
}
private void parse(String uri, InputStream inputStream) throws IOException {
String extension = FileParserFactory.getFileExtension(uri);
String result;
if (extension.equals("xml")) {
CumulusXmlParser.TvListing listing = null;
try {
listing = CumulusXmlParser.parse(inputStream);
result = listing.toString();
} catch (CumulusXmlParser.XmlTvParseException e) {
result = e.getMessage();
}
} else if (extension.equals("m3u") || uri.contains("m3u")) {
M3uParser.TvListing listing = M3uParser.parse(inputStream);
if (listing == null) {
new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(FileIoTestActivity.this, "Null listing", Toast.LENGTH_SHORT).show();
}
}.sendEmptyMessage(0);
return;
}
result = listing.toString();
Log.d(TAG, listing.getChannelList()+"<");
} else {
result = "This file has no parser";
}
Log.d(TAG, "Obtained " + result);
final String finalResult = result;
new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
new AlertDialog.Builder(FileIoTestActivity.this)
.setTitle("Parsing Result")
.setMessage(finalResult)
.setNegativeButton("Restart", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startActivity(new Intent(FileIoTestActivity.this,
FileIoTestActivity.class));
}
})
.show();
}
}.sendEmptyMessage(0);
}
private class ImportedFile extends Pair<String, String> {
public final String title;
public final String uri;
/**
* Constructor for a Pair.
*
* @param first the first object in the Pair
* @param second the second object in the pair
*/
ImportedFile(String first, String second) {
super(first, second);
title = first;
uri = second;
}
}
private String[] getTitles() {
String[] titles = new String[files.length];
for (int i = 0; i < files.length; i++) {
titles[i] = files[i].title;
}
return titles;
}
}