14a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes/* 24a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * Copyright (C) 2015 The Android Open Source Project 34a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * 44a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 54a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * you may not use this file except in compliance with the License. 64a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * You may obtain a copy of the License at 74a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * 84a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 94a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * 104a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * Unless required by applicable law or agreed to in writing, software 114a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 124a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * See the License for the specific language governing permissions and 144a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes * limitations under the License. 154a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes */ 164a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 174a58e0859ab43f004d44868ff48589e329a80cb5Chris Banespackage com.example.android.support.design.widget; 184a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 194a58e0859ab43f004d44868ff48589e329a80cb5Chris Banesimport android.os.Bundle; 206f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banesimport android.os.Handler; 214a58e0859ab43f004d44868ff48589e329a80cb5Chris Banesimport android.text.TextUtils; 224a58e0859ab43f004d44868ff48589e329a80cb5Chris Banesimport android.view.Menu; 23141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banesimport android.view.MenuItem; 244a58e0859ab43f004d44868ff48589e329a80cb5Chris Banesimport android.widget.TextView; 254a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 26def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.app.AppCompatActivity; 27def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.widget.Toolbar; 28def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.LinearLayoutManager; 29def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.RecyclerView; 30def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout; 31def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 32def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.support.design.Cheeses; 33def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.support.design.R; 34def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.support.design.Shakespeare; 35f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikasimport com.google.android.material.appbar.AppBarLayout; 36f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikasimport com.google.android.material.appbar.CollapsingToolbarLayout; 37f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikasimport com.google.android.material.tabs.TabLayout; 38def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 394a58e0859ab43f004d44868ff48589e329a80cb5Chris Banesimport java.util.Random; 404a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 414a58e0859ab43f004d44868ff48589e329a80cb5Chris Banesabstract class AppBarLayoutUsageBase extends AppCompatActivity { 424a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 434a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes @Override 444a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes protected void onCreate(Bundle savedInstanceState) { 454a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes super.onCreate(savedInstanceState); 464a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes setContentView(getLayoutId()); 474a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 484a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes // Retrieve the Toolbar from our content view, and set it as the action bar 49fa2e2acf79d791a90410025daad438968550d18cAlan Viverette Toolbar toolbar = findViewById(R.id.toolbar); 504a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes setSupportActionBar(toolbar); 514a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 52141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) 534a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes findViewById(R.id.collapsing_app_bar); 54cf5f5d47bd55cd69c287b1cbd3a65b852e527adeChris Banes if (collapsingToolbarLayout != null) { 55cf5f5d47bd55cd69c287b1cbd3a65b852e527adeChris Banes if (displayTitle()) { 56cf5f5d47bd55cd69c287b1cbd3a65b852e527adeChris Banes collapsingToolbarLayout.setTitle(getTitle()); 57cf5f5d47bd55cd69c287b1cbd3a65b852e527adeChris Banes } 58cf5f5d47bd55cd69c287b1cbd3a65b852e527adeChris Banes collapsingToolbarLayout.setContentScrimColor(0xFFFF00FF); 594a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 604a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 61fa2e2acf79d791a90410025daad438968550d18cAlan Viverette TextView dialog = findViewById(R.id.textview_dialogue); 624a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes if (dialog != null) { 634a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes dialog.setText(TextUtils.concat(Shakespeare.DIALOGUE)); 644a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 654a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 66fa2e2acf79d791a90410025daad438968550d18cAlan Viverette RecyclerView recyclerView = findViewById(R.id.appbar_recyclerview); 674a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes if (recyclerView != null) { 684a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes setupRecyclerView(recyclerView); 694a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 704a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 71fa2e2acf79d791a90410025daad438968550d18cAlan Viverette TabLayout tabLayout = findViewById(R.id.tabs); 724a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes if (tabLayout != null) { 734a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes setupTabs(tabLayout); 744a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 756f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes 76fa2e2acf79d791a90410025daad438968550d18cAlan Viverette final SwipeRefreshLayout refreshLayout = findViewById(R.id.swiperefresh); 776f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes if (refreshLayout != null) { 786f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 796f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes private final Handler mHandler = new Handler(); 806f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes 816f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes @Override 826f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes public void onRefresh() { 836f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes // Post a delayed runnable to reset the refreshing state in 2 seconds 846f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes mHandler.postDelayed(new Runnable() { 856f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes @Override 866f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes public void run() { 876f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes refreshLayout.setRefreshing(false); 886f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes } 896f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes }, 2000); 906f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes } 916f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes }); 926f9e9188d5b1486b58bb651ce36ee273b6d437c4Chris Banes } 934a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 944a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 954a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes @Override 964a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes public boolean onCreateOptionsMenu(Menu menu) { 974a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes getMenuInflater().inflate(R.menu.sample_actions, menu); 984a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes return true; 994a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 1004a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 101141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes @Override 102141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes public boolean onOptionsItemSelected(MenuItem item) { 103141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes switch (item.getItemId()) { 104141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes case R.id.action_toggle_expand: { 105fa2e2acf79d791a90410025daad438968550d18cAlan Viverette AppBarLayout abl = findViewById(R.id.app_bar); 106141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes abl.setExpanded(true); 107141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes return true; 108141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes } 109141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes case R.id.action_toggle_collapse: { 110fa2e2acf79d791a90410025daad438968550d18cAlan Viverette AppBarLayout abl = findViewById(R.id.app_bar); 111141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes abl.setExpanded(false); 112141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes return true; 113141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes } 114141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes } 115141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes return super.onOptionsItemSelected(item); 116141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes } 117141250e2ebb7ccdbee06c1b5f31d1d0e0f8851e6Chris Banes 1184a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes private void addRandomTab(TabLayout tabLayout) { 1194a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes Random r = new Random(); 1204a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes String cheese = Cheeses.sCheeseStrings[r.nextInt(Cheeses.sCheeseStrings.length)]; 1214a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes tabLayout.addTab(tabLayout.newTab().setText(cheese)); 1224a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 1234a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 1244a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes private void setupTabs(TabLayout tabLayout) { 1254a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes for (int i = 0; i < 10; i++) { 1264a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes addRandomTab(tabLayout); 1274a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 1284a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 1294a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 1304a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes private void setupRecyclerView(RecyclerView recyclerView) { 1314a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); 1324a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(this, Cheeses.sCheeseStrings)); 1334a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 1344a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 1354a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes protected boolean displayTitle() { 1364a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes return true; 1374a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes } 1384a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 1394a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes protected abstract int getLayoutId(); 1404a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes 1414a58e0859ab43f004d44868ff48589e329a80cb5Chris Banes} 142