syncthing.android.ui.LauncherActivity.java Source code

Java tutorial

Introduction

Here is the source code for syncthing.android.ui.LauncherActivity.java

Source

/*
 * Copyright (c) 2015 OpenSilk Productions LLC
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package syncthing.android.ui;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.Menu;
import android.view.MenuItem;

import org.opensilk.common.core.mortar.DaggerService;
import org.opensilk.common.ui.mortar.DrawerOwner;
import org.opensilk.common.ui.mortar.DrawerOwnerActivity;
import org.opensilk.common.ui.mortar.DrawerOwnerDelegate;
import org.opensilk.common.ui.mortar.ToolbarOwnerDelegate;
import org.opensilk.common.ui.mortarfragment.MortarFragment;

import java.util.List;

import javax.inject.Inject;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.Optional;
import mortar.MortarScope;
import syncthing.android.AppComponent;
import syncthing.android.R;
import syncthing.android.identicon.IdenticonGenerator;
import syncthing.api.Credentials;
import syncthing.android.ui.common.ActivityRequestCodes;
import syncthing.android.ui.login.LoginFragment;
import syncthing.android.ui.login.ManageFragment;
import syncthing.android.ui.session.SessionFragment;
import syncthing.android.ui.settings.SettingsActivity;
import syncthing.android.ui.welcome.WelcomeFragment;
import timber.log.Timber;

/**
 * Created by drew on 3/1/15.
 */
public class LauncherActivity extends SyncthingActivity implements DrawerOwnerActivity {

    @Inject
    DrawerOwner mDrawerOwner;
    @Inject
    IdenticonGenerator mIdenticonGenerator;

    ActionBarDrawerToggle mDrawerToggle;
    protected DrawerOwnerDelegate<LauncherActivity> mDrawerOwnerDelegate;

    @InjectView(R.id.drawer_layout)
    @Optional
    DrawerLayout mDrawerLayout;
    @InjectView(R.id.navigation)
    NavigationView mNavigation;

    @Override
    protected void onCreateScope(MortarScope.Builder builder) {
        AppComponent component = DaggerService.getDaggerComponent(getApplicationContext());
        builder.withService(DaggerService.DAGGER_SERVICE, LauncherActivityComponent.FACTORY.call(component));
    }

    @Override
    protected void performInjection() {
        DaggerService.<LauncherActivityComponent>getDaggerComponent(this).inject(this);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Timber.d("-> onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launcher);
        ButterKnife.inject(this);

        if (mDrawerLayout != null) {
            mDrawerOwnerDelegate = new DrawerOwnerDelegate<>(this, mDrawerOwner, mDrawerLayout, R.string.app_name,
                    R.string.app_name);
            mDrawerOwnerDelegate.onCreate();
            mActionBarOwnerDelegate = new ToolbarOwnerDelegate<>(this, mActionBarOwner, mDrawerOwnerDelegate);
        } else {
            mActionBarOwnerDelegate = new ToolbarOwnerDelegate<>(this, mActionBarOwner);
        }
        mActionBarOwnerDelegate.onCreate();

        setupNavigation(savedInstanceState);
        Timber.d("<- onCreate()");
    }

    @Override
    protected void onDestroy() {
        Timber.d("-> onDestroy()");
        super.onDestroy();
        if (mDrawerOwnerDelegate != null)
            mDrawerOwnerDelegate.onDestroy();
        Timber.d("<- onDestroy()");
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        if (mDrawerOwnerDelegate != null)
            mDrawerOwnerDelegate.onPostCreate(savedInstanceState);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (mDrawerOwnerDelegate != null)
            mDrawerOwnerDelegate.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return (mDrawerOwnerDelegate != null && mDrawerOwnerDelegate.onOptionsItemSelected(item))
                || super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        if (mDrawerOwnerDelegate != null && mDrawerOwnerDelegate.onBackPressed()) {
            return;
        }
        super.onBackPressed();
    }

    /*
     * Drawer ACtivity
     */

    @Override
    public void openDrawer(int gravity) {
        if (!isDrawerOpen())
            mDrawerLayout.openDrawer(gravity);
    }

    @Override
    public void openDrawers() {
        openDrawer(GravityCompat.START);
    }

    @Override
    public void closeDrawer(int gravity) {
        if (isDrawerOpen())
            mDrawerLayout.closeDrawer(gravity);
    }

    @Override
    public void closeDrawers() {
        closeDrawer(GravityCompat.START);
    }

    @Override
    public void enableDrawer(int gravity, boolean enable) {
        int mode = enable ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
        if (mDrawerToggle != null)
            mDrawerToggle.setDrawerIndicatorEnabled(enable);
        if (mDrawerLayout != null)
            mDrawerLayout.setDrawerLockMode(mode, gravity);
    }

    @Override
    public void enableDrawers(boolean enable) {
        enableDrawer(GravityCompat.START, enable);
    }

    /*
     * drawer helpers
     */

    private boolean isDrawerOpen() {
        return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(GravityCompat.START);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Timber.d("onActivityResult(%d, %d, %s)", requestCode, resultCode, data);
        final Handler handler = new Handler();
        switch (requestCode) {
        case ActivityRequestCodes.LOGIN_ACTIVITY:
        case ActivityRequestCodes.MANAGE_ACTIVITY:
        case ActivityRequestCodes.WELCOME_ACTIVITY: {
            // OK with credentials opens the device
            if (resultCode == Activity.RESULT_OK && data != null
                    && data.hasExtra(ManageActivity.EXTRA_CREDENTIALS)) {
                Timber.d("Got Positive response");
                data.setExtrasClassLoader(LauncherActivity.class.getClassLoader());
                final Credentials currentDevice = data.getParcelableExtra(ManageActivity.EXTRA_CREDENTIALS);
                if (currentDevice != null) {
                    Timber.d("Found credentials in the intent");
                    handler.postDelayed(() -> populateNavigationMenu(currentDevice, true), 10);
                    return;
                }
            }
            Timber.d("Result either canceled or missing credentials");
            //IDK just open the drawer
            handler.postDelayed(() -> {
                populateNavigationMenu(null, false);
                openDrawer(GravityCompat.START);
            }, 10);
            break;
        }
        default:
            Timber.d("Unknown request code");
            super.onActivityResult(requestCode, resultCode, data);
            break;
        }
    }

    void setupNavigation(Bundle savedInstanceState) {
        mNavigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.manage_devices:
                    closeDrawers();
                    startDeviceManageActivity();
                    return true;
                case R.id.app_settings:
                    closeDrawers();
                    startSettingsActivity();
                    return true;
                default:
                    break;
                }
                Intent intent = item.getIntent();
                if (intent != null && intent.hasExtra(ManageActivity.EXTRA_CREDENTIALS)) {
                    clearCheckedMenuItems();
                    item.setChecked(true);
                    closeDrawers();

                    intent.setExtrasClassLoader(LauncherActivity.class.getClassLoader());
                    Credentials credentials = intent.getParcelableExtra(ManageActivity.EXTRA_CREDENTIALS);
                    openSession(credentials);
                    return true;
                }
                return false;
            }
        });
        Credentials current = mSettings.getDefaultCredentials();
        populateNavigationMenu(current, savedInstanceState == null);
    }

    void populateNavigationMenu(Credentials current, boolean goToCurrent) {
        List<Credentials> creds = mSettings.getSavedCredentialsSorted();
        //TODO any way to just clear the devices group?
        mNavigation.getMenu().clear();
        mNavigation.inflateMenu(R.menu.navigation);
        Menu menu = mNavigation.getMenu();
        for (int ii = 0; ii < creds.size(); ii++) {
            Credentials c = creds.get(ii);
            MenuItem item = menu.add(R.id.nav_devices, Menu.NONE, ii + 1, c.alias);
            item.setIcon(new BitmapDrawable(getResources(), mIdenticonGenerator.generate(c.id)));
            item.setIntent(new Intent().putExtra(ManageActivity.EXTRA_CREDENTIALS, c));
            if (goToCurrent && c.equals(current)) {
                item.setChecked(true);
            }
        }
        if (goToCurrent) {
            if (current != null) {
                openSession(current);
            } else if (creds.isEmpty()) {
                startWelcomeActivity();
            } else {
                Timber.w("No current device");
                openDrawer(GravityCompat.START);
            }
        }
    }

    void clearCheckedMenuItems() {
        Menu menu = mNavigation.getMenu();
        for (int ii = 0; ii < menu.size(); ii++) {
            menu.getItem(ii).setChecked(false);
        }
    }

    void openSession(Credentials credentials) {
        Timber.d("opening session %s", credentials.alias);
        MortarFragment session = SessionFragment.newInstance(credentials);
        int ret = mFragmentManagerOwner.replaceMainContent(session, false);
    }

    void startDeviceManageActivity() {
        Intent intent = new Intent(this, ManageActivity.class).putExtra(ManageActivity.EXTRA_FRAGMENT,
                ManageFragment.NAME);
        mActivityResultsOwner.startActivityForResult(intent, ActivityRequestCodes.MANAGE_ACTIVITY, null);
    }

    void startSettingsActivity() {
        Intent intent = new Intent(this, SettingsActivity.class);
        mActivityResultsOwner.startActivityForResult(intent, 0, null);
    }

    void startLoginActivity() {
        Intent intent = new Intent(this, ManageActivity.class).putExtra(ManageActivity.EXTRA_FRAGMENT,
                LoginFragment.NAME);
        mActivityResultsOwner.startActivityForResult(intent, ActivityRequestCodes.LOGIN_ACTIVITY, null);
    }

    void startWelcomeActivity() {
        Intent intent = new Intent(this, ManageActivity.class)
                .putExtra(ManageActivity.EXTRA_FRAGMENT, WelcomeFragment.NAME)
                .putExtra(ManageActivity.EXTRA_DISABLE_BACK, true);
        mActivityResultsOwner.startActivityForResult(intent, ActivityRequestCodes.WELCOME_ACTIVITY, null);
    }

}