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