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