io.github.hidroh.materialistic.DrawerActivity.java Source code

Java tutorial

Introduction

Here is the source code for io.github.hidroh.materialistic.DrawerActivity.java

Source

/*
 * Copyright (c) 2015 Ha Duy Trung
 *
 * 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 io.github.hidroh.materialistic;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.preference.PreferenceManager;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import javax.inject.Inject;

import io.github.hidroh.materialistic.annotation.Synthetic;

public abstract class DrawerActivity extends InjectableActivity {

    @Inject
    AlertDialogBuilder mAlertDialogBuilder;
    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
    @Synthetic
    View mDrawer;
    @Synthetic
    Class<? extends Activity> mPendingNavigation;
    @Synthetic
    Bundle mPendingNavigationExtras;
    private TextView mDrawerAccount;
    private View mDrawerLogout;
    private View mDrawerUser;
    private final SharedPreferences.OnSharedPreferenceChangeListener mLoginListener = (sharedPreferences, key) -> {
        if (TextUtils.equals(key, getString(R.string.pref_username))) {
            setUsername();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_drawer);
        mDrawer = findViewById(R.id.drawer);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerAccount = (TextView) findViewById(R.id.drawer_account);
        mDrawerLogout = findViewById(R.id.drawer_logout);
        mDrawerUser = findViewById(R.id.drawer_user);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open_drawer,
                R.string.close_drawer) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                if (drawerView.equals(mDrawer) && mPendingNavigation != null) {
                    final Intent intent = new Intent(DrawerActivity.this, mPendingNavigation);
                    if (mPendingNavigationExtras != null) {
                        intent.putExtras(mPendingNavigationExtras);
                        mPendingNavigationExtras = null;
                    }
                    // TODO M bug https://code.google.com/p/android/issues/detail?id=193822
                    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    startActivity(intent);
                    mPendingNavigation = null;
                }
            }
        };
        mDrawerLayout.addDrawerListener(mDrawerToggle);
        PreferenceManager.getDefaultSharedPreferences(this)
                .registerOnSharedPreferenceChangeListener(mLoginListener);
        setUpDrawer();
        setUsername();
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        if (mDrawerLayout.isDrawerOpen(mDrawer)) {
            closeDrawers();
        } else if (isTaskRoot() && Preferences.isLaunchScreenLast(this)) {
            moveTaskToBack(true);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mDrawerLayout.removeDrawerListener(mDrawerToggle);
        PreferenceManager.getDefaultSharedPreferences(this)
                .unregisterOnSharedPreferenceChangeListener(mLoginListener);
    }

    @Override
    public void setContentView(int layoutResID) {
        ViewGroup drawerLayout = (ViewGroup) findViewById(R.id.drawer_layout);
        View view = getLayoutInflater().inflate(layoutResID, drawerLayout, false);
        //noinspection ConstantConditions
        drawerLayout.addView(view, 0);
    }

    @SuppressWarnings("ConstantConditions")
    private void setUpDrawer() {
        mDrawerAccount.setOnClickListener(v -> showLogin());
        mDrawerLogout.setOnClickListener(v -> confirmLogout());
        View moreContainer = findViewById(R.id.drawer_more_container);
        TextView moreToggle = (TextView) findViewById(R.id.drawer_more);
        moreToggle.setOnClickListener(v -> {
            if (moreContainer.getVisibility() == View.VISIBLE) {
                moreToggle.setTextColor(ContextCompat.getColor(DrawerActivity.this,
                        AppUtils.getThemedResId(DrawerActivity.this, android.R.attr.textColorTertiary)));
                moreToggle.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_expand_more_white_24dp, 0, 0, 0);
                moreContainer.setVisibility(View.GONE);
            } else {
                moreToggle.setTextColor(ContextCompat.getColor(DrawerActivity.this,
                        AppUtils.getThemedResId(DrawerActivity.this, android.R.attr.textColorSecondary)));
                moreToggle.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_expand_less_white_24dp, 0, 0, 0);
                moreContainer.setVisibility(View.VISIBLE);
            }
        });
        findViewById(R.id.drawer_list).setOnClickListener(v -> navigate(ListActivity.class));
        findViewById(R.id.drawer_best).setOnClickListener(v -> navigate(BestActivity.class));
        findViewById(R.id.drawer_popular).setOnClickListener(v -> navigate(PopularActivity.class));
        findViewById(R.id.drawer_new).setOnClickListener(v -> navigate(NewActivity.class));
        findViewById(R.id.drawer_show).setOnClickListener(v -> navigate(ShowActivity.class));
        findViewById(R.id.drawer_ask).setOnClickListener(v -> navigate(AskActivity.class));
        findViewById(R.id.drawer_job).setOnClickListener(v -> navigate(JobsActivity.class));
        findViewById(R.id.drawer_settings).setOnClickListener(v -> navigate(SettingsActivity.class));
        findViewById(R.id.drawer_favorite).setOnClickListener(v -> navigate(FavoriteActivity.class));
        findViewById(R.id.drawer_submit).setOnClickListener(v -> navigate(SubmitActivity.class));
        findViewById(R.id.drawer_user).setOnClickListener(v -> {
            Bundle extras = new Bundle();
            extras.putString(UserActivity.EXTRA_USERNAME, Preferences.getUsername(this));
            navigate(UserActivity.class, extras);
        });
        findViewById(R.id.drawer_feedback).setOnClickListener(v -> navigate(FeedbackActivity.class));

    }

    @SuppressLint("MissingPermission")
    private void showLogin() {
        Account[] accounts = AccountManager.get(this).getAccountsByType(BuildConfig.APPLICATION_ID);
        if (accounts.length == 0) { // no accounts, ask to login or re-login
            startActivity(new Intent(this, LoginActivity.class));
        } else { // has accounts, show account chooser regardless of login status
            AppUtils.showAccountChooser(this, mAlertDialogBuilder, accounts);
        }
    }

    private void confirmLogout() {
        mAlertDialogBuilder.init(this).setMessage(R.string.logout_confirm)
                .setNegativeButton(android.R.string.cancel, null)
                .setPositiveButton(android.R.string.ok, (dialog, which) -> Preferences.setUsername(this, null))
                .show();
    }

    private void navigate(Class<? extends Activity> activityClass) {
        navigate(activityClass, null);
    }

    private void navigate(Class<? extends Activity> activityClass, @Nullable Bundle extras) {
        mPendingNavigation = !getClass().equals(activityClass) ? activityClass : null;
        mPendingNavigationExtras = extras;
        closeDrawers();
    }

    private void setUsername() {
        String username = Preferences.getUsername(this);
        if (!TextUtils.isEmpty(username)) {
            mDrawerAccount.setText(username);
            mDrawerLogout.setVisibility(View.VISIBLE);
            mDrawerUser.setVisibility(View.VISIBLE);
        } else {
            mDrawerAccount.setText(R.string.login);
            mDrawerLogout.setVisibility(View.GONE);
            mDrawerUser.setVisibility(View.GONE);
        }
    }

    private void closeDrawers() {
        mDrawerLayout.closeDrawers();
    }
}