Java tutorial
/* * Copyright 2013 The Android Open Source Project * Copyright 2016 Timothy Rae * * 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.example.android.immersive; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.design.widget.NavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.GestureDetector; import android.view.Gravity; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; public class ImmersiveDrawerActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private static final int INITIAL_HIDE_DELAY = 300; private static final boolean USE_FULLSCREEN = true; private View mDecorView; private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.immersive_drawer_activity); final View controlsView = findViewById(R.id.fullscreen_content_controls); final View contentView = findViewById(R.id.fullscreen_content); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); configureDrawer(toolbar); getSupportActionBar().setTitle(""); } mDecorView = getWindow().getDecorView(); mDecorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int flags) { boolean visible = (flags & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; controlsView.animate().alpha(visible ? 1 : 0).translationY(visible ? 0 : controlsView.getHeight()); if (getSupportActionBar() == null) { return; } if (visible) { getSupportActionBar().show(); } else { getSupportActionBar().hide(); } } }); contentView.setClickable(true); final GestureDetector clickDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { if (!USE_FULLSCREEN) { return true; } boolean visible = (mDecorView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; if (visible) { hideSystemUI(); } else { showSystemUI(); } return true; } }); contentView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return clickDetector.onTouchEvent(motionEvent); } }); } /** * Configure the navigation drawer */ private void configureDrawer(Toolbar toolbar) { mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); NavigationView nv = (NavigationView) mDrawerLayout.findViewById(R.id.navdrawer_items_container); nv.setNavigationItemSelectedListener(this); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDrawerLayout.openDrawer(Gravity.LEFT); } }); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0) { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } }; getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); mDrawerLayout.addDrawerListener(mDrawerToggle); } @Override public boolean onNavigationItemSelected(MenuItem item) { // Don't do anything if user selects already selected position if (item.isChecked()) { return true; } Intent intent = null; switch (item.getItemId()) { case R.id.nav_1: intent = new Intent(this, ImmersiveDrawerActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); break; case R.id.nav_2: intent = new Intent(this, ImmersiveActivity.class); break; case R.id.nav_3: intent = new Intent(this, ImmersiveStickyActivity.class); break; } startActivity(intent); mDrawerLayout.closeDrawers(); return true; } /** * When using the ActionBarDrawerToggle, you must call it during * onPostCreate() and onConfigurationChanged()... */ @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. if (mDrawerToggle != null) { mDrawerToggle.syncState(); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggles if (mDrawerToggle != null) { mDrawerToggle.onConfigurationChanged(newConfig); } } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!USE_FULLSCREEN) { return; } // When the window loses focus (e.g. the action overflow is shown), // cancel any pending hide action. When the window gains focus, // hide the system UI. if (hasFocus) { delayedHide(INITIAL_HIDE_DELAY); } else { mHideHandler.removeMessages(0); } } private void hideSystemUI() { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_IMMERSIVE); } private void showSystemUI() { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } private final Handler mHideHandler = new Handler() { @Override public void handleMessage(Message msg) { hideSystemUI(); } }; private void delayedHide(int delayMillis) { mHideHandler.removeMessages(0); mHideHandler.sendEmptyMessageDelayed(0, delayMillis); } }