Java tutorial
/* * 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(); } }