com.tapchatapp.android.app.activity.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.tapchatapp.android.app.activity.MainActivity.java

Source

/*
 * Copyright (C) 2014 Eric Butler
 *
 * 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.tapchatapp.android.app.activity;

import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.SimpleAdapter;
import android.widget.Spinner;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.tapchatapp.android.R;
import com.tapchatapp.android.app.TapchatAnalytics;
import com.tapchatapp.android.app.TapchatApp;
import com.tapchatapp.android.app.fragment.BufferFragment;
import com.tapchatapp.android.app.fragment.ConnectionFragment;
import com.tapchatapp.android.app.fragment.MainFragment;
import com.tapchatapp.android.app.ui.ConnectionsPagerAdapter;
import com.tapchatapp.android.client.TapchatService;
import com.tapchatapp.android.client.model.Connection;

import java.util.List;
import java.util.Map;

import javax.inject.Inject;

public class MainActivity extends TapchatServiceFragmentActivity {

    private static final Uri CONTRIBUTE_URI = Uri.parse("http://tapchatapp.com/contribute");

    public static final String EXTRA_SELECTED_CONNECTION = "com.tapchatapp.android.extra_seleted_connection";

    @Inject
    TapchatAnalytics mAnalytics;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (!TapchatApp.get().isConfigured()) {
            startActivity(new Intent(this, WelcomeActivity.class));
            finish();
            return;
        }

        getActionBar().setHomeButtonEnabled(false);

        mAnalytics.trackScreenView("main");
    }

    @Override
    public void onSetupFragments() {
        if (TapchatApp.get().isConfigured()) {
            super.onSetupFragments();
        }
    }

    @Override
    public void loadFragments() {
        setContentView(R.layout.activity_main);
        MainFragment fragment = (MainFragment) getFragmentManager().findFragmentByTag("main");
        if (fragment == null) {
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.content, new MainFragment(), "main");
            transaction.commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        boolean hasConnection = getConnection(getCurrentIndex()) != null;
        menu.findItem(R.id.join_channel).setEnabled((getService() != null) && hasConnection);
        menu.findItem(R.id.message_user).setEnabled((getService() != null) && hasConnection);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int currentIndex = getCurrentIndex();

        switch (item.getItemId()) {
        case R.id.join_channel: {
            View dialogView = this.getLayoutInflater().inflate(R.layout.dialog_join_channel, null);
            Spinner serverSpinner = (Spinner) dialogView.findViewById(R.id.server);
            serverSpinner.setAdapter(ServerSpinnerAdapter.create(this, getService()));
            serverSpinner.setSelection(currentIndex);
            new AlertDialog.Builder(this).setTitle(R.string.join_channel).setView(dialogView)
                    .setPositiveButton(R.string.join, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Spinner serverSpinner = (Spinner) ((AlertDialog) dialogInterface)
                                    .findViewById(R.id.server);
                            Map serverItem = (Map) serverSpinner.getSelectedItem();

                            long connectionId = (Long) serverItem.get("id");
                            Connection connection = getService().getConnection(connectionId);

                            EditText channelEditText = (EditText) ((AlertDialog) dialogInterface)
                                    .findViewById(R.id.channel);
                            connection.join(channelEditText.getText().toString(), null);
                        }

                    }).setNegativeButton(android.R.string.cancel, null).show();
            return true;
        }

        case R.id.message_user: {
            View dialogView = this.getLayoutInflater().inflate(R.layout.dialog_message_user, null);
            Spinner serverSpinner = (Spinner) dialogView.findViewById(R.id.server);
            serverSpinner.setAdapter(ServerSpinnerAdapter.create(this, getService()));
            serverSpinner.setSelection(currentIndex);

            new AlertDialog.Builder(this).setTitle(R.string.send_message).setView(dialogView)
                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Spinner serverSpinner = (Spinner) ((AlertDialog) dialogInterface)
                                    .findViewById(R.id.server);
                            Map serverItem = (Map) serverSpinner.getSelectedItem();

                            long connectionId = (Long) serverItem.get("id");
                            Connection connection = getService().getConnection(connectionId);

                            EditText nickEditText = (EditText) ((AlertDialog) dialogInterface)
                                    .findViewById(R.id.nick);
                            connection.say(nickEditText.getText().toString(), null, null);
                        }

                    }).setNegativeButton(android.R.string.cancel, null).show();
            return true;
        }

        case R.id.preferences:
            startActivity(new Intent(this, PreferencesActivity.class));
            return true;

        case R.id.contribute:
            Intent intent = new Intent(Intent.ACTION_VIEW, CONTRIBUTE_URI);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            return true;
        }
        return false;
    }

    public void showBuffer(int type, long connectionId, long bufferId, boolean isArchived) {
        boolean isTablet = (findViewById(R.id.content1) != null);

        if (isTablet) {
            Fragment fragment = BufferFragment.create(type, connectionId, bufferId);
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.content1, fragment, "buffer");
            transaction.commit();
        } else {
            Intent intent = new Intent(this, BuffersActivity.class);
            Uri data = Uri.parse(String.format("tapchat://%s/%s", connectionId, bufferId));
            if (isArchived) {
                data = data.buildUpon().appendQueryParameter("display", "archived").build();
            }
            intent.setData(data);
            startActivity(intent);
        }
    }

    private int getCurrentIndex() {
        ViewPager view = (ViewPager) findViewById(R.id.pager);
        if (view != null) {
            return view.getCurrentItem();
        } else {
            return -1;
        }
    }

    private Connection getConnection(int index) {
        Fragment fragment = getFragmentManager().findFragmentByTag("main");
        if (fragment == null) {
            return null;
        }

        ConnectionsPagerAdapter adapter = ((MainFragment) fragment).getTabsAdapter();

        if (index < 0 || adapter == null || index >= adapter.getCount()) {
            return null;
        }

        ConnectionsPagerAdapter.ConnectionInfo connectionInfo = adapter.getConnectionInfo(index);
        if (connectionInfo != null) {
            String currentId = String.valueOf(connectionInfo.getId());
            ConnectionFragment connectionFragment = (ConnectionFragment) this.getFragmentManager()
                    .findFragmentByTag(currentId);
            if (connectionFragment != null) {
                return connectionFragment.getConnection();
            }
        }
        return null;
    }

    private static class ServerSpinnerAdapter extends SimpleAdapter {
        public static ServerSpinnerAdapter create(Context context, TapchatService service) {
            List<Map<String, ?>> servers = Lists.newArrayList();
            for (Connection connection : service.getConnections()) {
                Map<String, Object> serverInfo = Maps.newHashMap();
                serverInfo.put("name", connection.getDisplayName());
                serverInfo.put("id", connection.getId());
                servers.add(serverInfo);
            }
            return new ServerSpinnerAdapter(context, servers);
        }

        private ServerSpinnerAdapter(Context context, List<Map<String, ?>> data) {
            super(context, data, android.R.layout.simple_spinner_item, new String[] { "name" },
                    new int[] { android.R.id.text1 });
            setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        }
    }
}