10bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska/* 20bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Copyright (C) 2017 The Android Open Source Project 30bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * 40bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Licensed under the Apache License, Version 2.0 (the "License"); 50bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * you may not use this file except in compliance with the License. 60bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * You may obtain a copy of the License at 70bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * 80bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * http://www.apache.org/licenses/LICENSE-2.0 90bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * 100bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Unless required by applicable law or agreed to in writing, software 110bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * distributed under the License is distributed on an "AS IS" BASIS, 120bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * See the License for the specific language governing permissions and 140bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * limitations under the License. 150bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska */ 160bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.wear.widget; 180bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 190bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.os.Bundle; 200bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.preference.PreferenceFragment; 210bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.util.TypedValue; 220bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.view.LayoutInflater; 230bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.view.View; 240bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskaimport android.view.ViewGroup; 250bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 26d75a466859fee504b717c529094e318d1278f831Aurimas Liutikasimport androidx.wear.widget.SwipeDismissFrameLayout.Callback; 27d75a466859fee504b717c529094e318d1278f831Aurimas Liutikas 280bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska/** 290bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * {@link PreferenceFragment} that supports swipe-to-dismiss. 300bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * 310bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * <p>Unlike a regular PreferenceFragment, this Fragment has a solid color background using the 320bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * background color from the theme. This allows the fragment to be layered on top of other 330bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * fragments so that the previous layer is seen when this fragment is swiped away. 340bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska */ 350bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurskapublic class SwipeDismissPreferenceFragment extends PreferenceFragment { 360bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 370bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska private SwipeDismissFrameLayout mSwipeLayout; 380bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 390bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska private final Callback mCallback = 400bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska new Callback() { 410bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska @Override 429a5734f937641667bae07b81dac4fea8514c0aecAga Madurska public void onSwipeStarted(SwipeDismissFrameLayout layout) { 430bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska SwipeDismissPreferenceFragment.this.onSwipeStart(); 440bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 450bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 460bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska @Override 479a5734f937641667bae07b81dac4fea8514c0aecAga Madurska public void onSwipeCanceled(SwipeDismissFrameLayout layout) { 480bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska SwipeDismissPreferenceFragment.this.onSwipeCancelled(); 490bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 500bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 510bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska @Override 520bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska public void onDismissed(SwipeDismissFrameLayout layout) { 530bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska SwipeDismissPreferenceFragment.this.onDismiss(); 540bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 550bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska }; 560bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 570bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska @Override 580bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska public View onCreateView( 590bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 600bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 610bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout = new SwipeDismissFrameLayout(getActivity()); 620bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.addCallback(mCallback); 630bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 640bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska View contents = super.onCreateView(inflater, mSwipeLayout, savedInstanceState); 650bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 660bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.setBackgroundColor(getBackgroundColor()); 670bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.addView(contents); 680bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 690bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska return mSwipeLayout; 700bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 710bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 720bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska /** Called when the fragment is dismissed with a swipe. */ 730bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska public void onDismiss() { 740bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 750bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 760bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska /** Called when a swipe-to-dismiss gesture is started. */ 770bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska public void onSwipeStart() { 780bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 790bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 800bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska /** Called when a swipe-to-dismiss gesture is cancelled. */ 810bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska public void onSwipeCancelled() { 820bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 830bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 840bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska /** 850bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * Sets whether or not the preferences list can be focused. If {@code focusable} is false, any 860bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska * existing focus will be cleared. 870bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska */ 880bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska public void setFocusable(boolean focusable) { 890bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska if (focusable) { 900bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 910bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.setFocusable(true); 920bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } else { 930bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska // Prevent any child views from receiving focus. 940bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 950bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 960bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.setFocusable(false); 970bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska mSwipeLayout.clearFocus(); 980bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 990bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 1000bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska 1010bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska private int getBackgroundColor() { 1020bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska TypedValue value = new TypedValue(); 1030bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska getActivity().getTheme().resolveAttribute(android.R.attr.colorBackground, value, true); 1040bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska return value.data; 1050bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska } 1060bb1bb33c39fa5eef545f8513753a8e3b8dfede7Aga Madurska} 107