package org.numixproject.hermes;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import com.melnykov.fab.FloatingActionButton;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.accountswitcher.AccountHeader;
import com.mikepenz.materialdrawer.accountswitcher.AccountHeaderBuilder;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.Nameable;
import org.numixproject.hermes.activity.AddServerActivity;
import org.numixproject.hermes.activity.ConversationActivity;
import org.numixproject.hermes.activity.Gitty;
import org.numixproject.hermes.adapter.ServerListAdapter;
import org.numixproject.hermes.db.Database;
import org.numixproject.hermes.irc.IRCBinder;
import org.numixproject.hermes.activity.SettingsActivity;
import org.numixproject.hermes.irc.IRCService;
import org.numixproject.hermes.listener.ServerListener;
import org.numixproject.hermes.model.Broadcast;
import org.numixproject.hermes.model.Extra;
import org.numixproject.hermes.model.Server;
import org.numixproject.hermes.model.Status;
import org.numixproject.hermes.receiver.ServerReceiver;
import org.numixproject.hermes.utils.iap;
public class MainActivity extends AppCompatActivity implements ServiceConnection, ServerListener, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener {
private static int instanceCount = 0;
SharedPreferences prefs = null;
public static GoogleAnalytics analytics;
public static Tracker tracker;
private static final int REQUEST_INVITE = 1;
private IRCBinder binder;
private ServerReceiver receiver;
private ServerListAdapter adapter;
private ExpandableHeightListView list;
private String channel;
private int positionBuffer;
private FloatingActionButton fab = null;
String key;
BillingProcessor bp;
private Drawer result = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_fragment);
analytics = GoogleAnalytics.getInstance(this);
analytics.setLocalDispatchPeriod(1800);
tracker = analytics.newTracker("UA-63953479-1");
tracker.enableExceptionReporting(true);
tracker.enableAdvertisingIdCollection(true);
tracker.enableAutoActivityTracking(true);
key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B4Oomgmm2D8XVSxh1DIFGtU3p1N2w6Xi2ZO7MoeZRAhvVjk3B8MfrOatlO9HfozRGhEkCkq0MfstB4Cjci3dsnYZieNmHOVYIFBWERqdwfdtnUIfI554xFsAC3Ah7PTP3MwKE7qTT1VLTTHxxsE7GH4sLtvLwrAzsVrLK+dgQk+e9bDJMvhhEPBgabRFaTvKaTtSzB/BBwrCa5mv0pte6WfrNbugFjiAJC43b7NNY2PV9UA8mukiBNZ9mPrK5fZeSEfcVqenyqbvZZG+P+O/cohAHbIEzPMuAS1EBf0VBsZtm3fjQ45PgCvEB7Ye3ucfR9BQ9ADjDwdqivExvXndQIDAQAB";
iap inAppPayments = new iap();
bp = inAppPayments.getBilling(this, key);
bp.loadOwnedPurchasesFromGoogle();
// Handle Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
AccountHeader headerResult = new AccountHeaderBuilder()
.withActivity(this)
.withHeaderBackground(R.drawable.cover)
.build();
result = new DrawerBuilder()
.withActivity(this)
.withToolbar(toolbar)
.withTranslucentStatusBar(true)
.withActionBarDrawerToggle(true)
.withAccountHeader(headerResult)
.withSelectedItem(0)
.addDrawerItems(
new PrimaryDrawerItem().withName("Connect to...").withIcon(R.drawable.ic_ic_swap_horiz_24px),
new PrimaryDrawerItem().withName("Settings").withIcon(R.drawable.ic_ic_settings_24px)
)
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public boolean onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) {
if (drawerItem instanceof Nameable) {
switch (((Nameable) drawerItem).getName()) {
case "Settings": {
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(intent);
break;
}
case "Contact us": {
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:" + "team@numixproject.org"));
startActivity(intent);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "A mail client is required.", Toast.LENGTH_SHORT).show();
}
break;
}
case "Remove ads": {
removeAds();
break;
}
case "Send feedback": {
Intent intent = new Intent(MainActivity.this, Gitty.class);
startActivity(intent);
break;
}
case "More Apps": {
String url = "https://play.google.com/store/apps/dev?id=5600498874720965803";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
break;
}
}
}
return false;
}
}).build();
if (!inAppPayments.isPurchased()) {
result.addItem(new PrimaryDrawerItem().withName("Remove ads").withIcon(R.drawable.ic_ic_dnd_on_24px));
}
result.addItem(new PrimaryDrawerItem().withName("Send feedback").withIcon(R.drawable.ic_edit_black_18dp));
result.addItem(new PrimaryDrawerItem().withName("Contact us").withIcon(R.drawable.ic_ic_mail_24px));
result.addItem(new PrimaryDrawerItem().withName("More Apps").withIcon(R.drawable.ic_ic_shop_24px));
adapter = new ServerListAdapter();
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
newAddServerActivity(v);
}
});
list = (ExpandableHeightListView) findViewById(R.id.list);
list.setAdapter(adapter);
list.setOnItemClickListener(this);
list.setOnItemLongClickListener(this);
list.setExpanded(true);
fab.attachToListView(list);
LinearLayout reportBugLayout = (LinearLayout) findViewById(R.id.reportLayout);
reportBugLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start Gitty Reporter
Intent intent = new Intent(MainActivity.this, Gitty.class);
startActivity(intent);
}
});
if (instanceCount > 0) {
finish();
}
prefs = getSharedPreferences("org.numixproject.hermes", MODE_PRIVATE);
if (prefs.getBoolean("firstrun", true)) {
startIntro();
prefs.edit().putBoolean("firstrun", false).commit();
}
if (adapter.isServerNull()){
reportBugLayout.setVisibility(View.GONE);
}
}
private void newAddServerActivity(View v){
Intent intent = new Intent(this, AddServerActivity.class);
startActivity(intent);
}
public void removeAds() {
bp.purchase(this, "remove_ads");
}
public BillingProcessor getIAP() {
return bp;
}
private void startIntro() {
Intent intent = new Intent(this, IntroActivity.class);
startActivity(intent);
}
/**
* Service connected to Activity
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
binder = (IRCBinder) service;
}
/**
* On server selected
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Server server = adapter.getItem(position);
if (server == null) {
// "Add server" was selected
startActivityForResult(new Intent(this, AddServerActivity.class), 0);
return;
}
Intent intent = new Intent(this, ConversationActivity.class);
finish();
if (server.getStatus() == Status.DISCONNECTED && !server.mayReconnect()) {
server.setStatus(Status.PRE_CONNECTING);
intent.putExtra("connect", true);
}
intent.putExtra("serverId", server.getId());
startActivity(intent);
}
// same of OnItemClick. But opens new room too.
public void openServer(int position) {
Server server = adapter.getItem(position);
if (server == null) {
// "Add server" was selected
startActivityForResult(new Intent(this, AddServerActivity.class), 0);
return;
}
Intent intent = new Intent(this, ConversationActivity.class);
if (server.getStatus() == Status.DISCONNECTED && !server.mayReconnect()) {
server.setStatus(Status.PRE_CONNECTING);
intent.putExtra("connect", true);
}
intent.putExtra("serverId", server.getId());
startActivity(intent);
finish();
}
/**
* On activity result
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
// Refresh list from database
adapter.loadServers();
} catch (Exception e){
e.printStackTrace();
}
}
switch (requestCode) {
case 1:
channel = data.getExtras().getString("channel");
Intent intent = new Intent(this, ConversationActivity.class);
// send position in intent.putExtra
final Server server = adapter.getItem(positionBuffer);
intent.putExtra("serverId", server.getId());
// Intent wants to open another room
intent.putExtra("NewRoom", 1);
intent.putExtra("channel", channel);
// starts ConversationActivity
startActivity(intent);
finish();
break;
}
}
/**
* On long click
*/
@Override
public boolean onItemLongClick(AdapterView<?> l, View v, int position, long id)
{
final Server server = adapter.getItem(position);
if (server == null) {
// "Add server" view selected
return true;
}
final CharSequence[] items = {
getString(R.string.connect),
getString(R.string.disconnect),
getString(R.string.edit),
getString(R.string.delete)
};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(server.getTitle());
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
switch (item) {
case 0: // Connect
if (server.getStatus() == Status.DISCONNECTED) {
binder.connect(server);
server.setStatus(Status.CONNECTING);
adapter.notifyDataSetChanged();
}
break;
case 1: // Disconnect
server.clearConversations();
server.setStatus(Status.DISCONNECTED);
server.setMayReconnect(false);
binder.getService().getConnection(server.getId()).quitServer();
break;
case 2: // Edit
editServer(server.getId());
break;
case 3: // Delete
binder.getService().getConnection(server.getId()).quitServer();
deleteServer(server.getId());
break;
}
}
});
AlertDialog alert = builder.create();
alert.show();
return true;
}
/**
* Start activity to edit server with given id
*
* @param serverId The id of the server
*/
private void editServer(int serverId)
{
Server server = Hermes.getInstance().getServerById(serverId);
if (server.getStatus() != Status.DISCONNECTED) {
Toast.makeText(this, getResources().getString(R.string.disconnect_before_editing), Toast.LENGTH_SHORT).show();
}
else {
Intent intent = new Intent(this, AddServerActivity.class);
intent.putExtra(Extra.SERVER, serverId);
startActivityForResult(intent, 0);
}
}
public void deleteServer(int serverId)
{
Database db = new Database(this);
db.removeServerById(serverId);
db.close();
Hermes.getInstance().removeServerById(serverId);
adapter.loadServers();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
@Override
public void onResume() {
super.onResume();
result.setSelectionByIdentifier(0);
try {
// Find out if delete server
Intent mIntent = getIntent();
if (mIntent != null) {
int serverToDelete = mIntent.getIntExtra("serverId", 0);
deleteServer(serverToDelete);
}
} catch (Exception e){
e.printStackTrace();
}
// Start and connect to service
Intent intent = new Intent(this, IRCService.class);
intent.setAction(IRCService.ACTION_BACKGROUND);
startService(intent);
bindService(intent, this, 0);
receiver = new ServerReceiver(this);
registerReceiver(receiver, new IntentFilter(Broadcast.SERVER_UPDATE));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// inflate from xml
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.servers, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public void onDestroy() {
super.onDestroy();
if (bp != null)
bp.release();
instanceCount--;
}
@Override
public void onPause() {
super.onPause();
if (binder != null && binder.getService() != null) {
binder.getService().checkServiceStatus();
}
unbindService(this);
unregisterReceiver(receiver);
}
@Override
public void onBackPressed() {
//handle the back press :D close the drawer first and if the drawer is closed close the activity
if (result != null && result.isDrawerOpen()) {
result.closeDrawer();
} else {
super.onBackPressed();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
binder = null;
}
@Override
public void onStatusUpdate() {
adapter.loadServers();
if (adapter.getCount() > 2) {
// Hide background if there are servers in the list
list.setBackgroundDrawable(null);
}
}
}