summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/TransitionEffectsFragment.java
blob: 6c5542b0b72fe194e94a7bb6c2400c75b6f683cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
package com.android.launcher3;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.Fragment;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.android.launcher3.settings.SettingsProvider;

public class TransitionEffectsFragment extends Fragment {
    public static final String PAGE_OR_DRAWER_SCROLL_SELECT = "pageOrDrawer";
    public static final String SELECTED_TRANSITION_EFFECT = "selectedTransitionEffect";
    public static final String TRANSITION_EFFECTS_FRAGMENT = "transitionEffectsFragment";
    ImageView mTransitionIcon;
    ListView mListView;
    View mCurrentSelection;

    String[] mTransitionStates;
    TypedArray mTransitionDrawables;
    String mCurrentState;
    int mCurrentPosition;
    boolean mIsDrawer;
    String mSettingsProviderValue;
    int mPreferenceValue;

    OnClickListener mSettingsItemListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mCurrentPosition == (Integer) v.getTag()) {
                return;
            }
            mCurrentPosition = (Integer) v.getTag();
            mCurrentState = mTransitionStates[mCurrentPosition];

            setCleared(mCurrentSelection);
            setSelected(v);
            mCurrentSelection = v;

            new Thread(new Runnable() {
                public void run() {
                    mTransitionIcon.post(new Runnable() {
                        public void run() {
                            setImageViewToEffect();
                        }
                    });
                }
            }).start();

            ((TransitionsArrayAdapter) mListView.getAdapter()).notifyDataSetChanged();
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.settings_transitions_screen, container, false);
        mListView = (ListView) v.findViewById(R.id.settings_transitions_list);

        final Launcher launcher = (Launcher) getActivity();

        mIsDrawer = getArguments().getBoolean(PAGE_OR_DRAWER_SCROLL_SELECT);

        mSettingsProviderValue = mIsDrawer ?
                SettingsProvider.SETTINGS_UI_DRAWER_SCROLLING_TRANSITION_EFFECT
                : SettingsProvider.SETTINGS_UI_HOMESCREEN_SCROLLING_TRANSITION_EFFECT;
        mPreferenceValue = mIsDrawer ? R.string.preferences_interface_drawer_scrolling_transition_effect
                : R.string.preferences_interface_homescreen_scrolling_transition_effect;

        mTransitionIcon = (ImageView) v.findViewById(R.id.settings_transition_image);
        TextView title = (TextView) v.findViewById(R.id.transition_effect_title);
        title.setText(getResources().getString(R.string.scroll_effect_text));
        LinearLayout titleLayout = (LinearLayout) v.findViewById(R.id.transition_title);
        titleLayout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setEffect();
            }
        });
        View options = v.findViewById(R.id.transition_options_menu);
        options.setVisibility(mIsDrawer ? View.GONE : View.VISIBLE);
        options.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                launcher.onClickTransitionEffectOverflowMenuButton(view, mIsDrawer);
            }
        });

        String[] titles = getResources().getStringArray(
                R.array.transition_effect_entries);
        mListView.setAdapter(new TransitionsArrayAdapter(getActivity(),
                R.layout.settings_pane_list_item, titles));

        mTransitionStates = getResources().getStringArray(
                R.array.transition_effect_values);
        mTransitionDrawables = getResources().obtainTypedArray(
                R.array.transition_effect_drawables);

        mCurrentState = SettingsProvider.getString(getActivity(),
                mSettingsProviderValue, mPreferenceValue);
        mCurrentPosition = mapEffectToPosition(mCurrentState);

        mListView.setSelection(mCurrentPosition);

        // RTL
        ImageView navPrev = (ImageView) v.findViewById(R.id.nav_prev);
        Configuration config = getResources().getConfiguration();
        if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
            navPrev.setImageResource(R.drawable.ic_navigation_next);
        }
        return v;
    }

    public void setEffect() {
        ((Launcher) getActivity()).setTransitionEffect(mIsDrawer, mCurrentState);
    }

    private int mapEffectToPosition(String effect) {
        int length = mTransitionStates.length;
        for (int i = 0; i < length; i++) {
            if (effect.equals(mTransitionStates[i])) {
                return i;
            }
        }
        return -1;
    }

    private void setImageViewToEffect() {
        mTransitionIcon.setBackgroundResource(mTransitionDrawables
                .getResourceId(mCurrentPosition, R.drawable.transition_none));

        AnimationDrawable frameAnimation = (AnimationDrawable) mTransitionIcon.getBackground();
        frameAnimation.start();
    }

    @Override
    public void onStop() {
        super.onStop();

        // explicitly stop animation to ensure that we release references from the
        // view root's run queue
        AnimationDrawable frameAnimation = (AnimationDrawable) mTransitionIcon.getBackground();
        if (frameAnimation != null) {
            frameAnimation.stop();
        }
    }

    private void setSelected(View v) {
        v.setBackgroundColor(Color.WHITE);
        TextView t = (TextView) v.findViewById(R.id.item_name);
        t.setTextColor(getResources().getColor(R.color.settings_bg_color));
    }

    private void setCleared(View v) {
        v.setBackgroundColor(getResources().getColor(R.color.settings_bg_color));
        TextView t = (TextView) v.findViewById(R.id.item_name);
        t.setTextColor(Color.WHITE);
    }

    @Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
        if (enter) {
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            int width = displaymetrics.widthPixels;
            Configuration config = getResources().getConfiguration();
            final ObjectAnimator anim;
            if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
                anim = ObjectAnimator.ofFloat(this, "translationX", -width, 0);
            } else {
                anim = ObjectAnimator.ofFloat(this, "translationX", width, 0);
            }

            final View darkPanel = ((Launcher) getActivity()).getDarkPanel();
            darkPanel.setVisibility(View.VISIBLE);
            ObjectAnimator anim2 = ObjectAnimator.ofFloat(
                   darkPanel , "alpha", 0.0f, 0.3f);
            anim2.start();

            anim.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator arg0) {}
                @Override
                public void onAnimationRepeat(Animator arg0) {}
                @Override
                public void onAnimationEnd(Animator arg0) {
                    darkPanel.setVisibility(View.GONE);
                    setImageViewToEffect();
                }
                @Override
                public void onAnimationCancel(Animator arg0) {}
            });

            return anim;
        } else {
            return super.onCreateAnimator(transit, enter, nextAnim);
        }
    }

    private class TransitionsArrayAdapter extends ArrayAdapter<String> {
        Context mContext;
        String[] titles;

        public TransitionsArrayAdapter(Context context, int textViewResourceId,
                String[] objects) {
            super(context, textViewResourceId, objects);

            mContext = context;
            titles = objects;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.settings_pane_list_item,
                    parent, false);
            TextView textView = (TextView) convertView
                    .findViewById(R.id.item_name);

            // RTL
            Configuration config = getResources().getConfiguration();
            if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
                textView.setGravity(Gravity.RIGHT);
            }

            textView.setText(titles[position]);
            // Set Selected State
            if (position == mCurrentPosition) {
                mCurrentSelection = convertView;
                setSelected(mCurrentSelection);
            }

            convertView.setOnClickListener(mSettingsItemListener);
            convertView.setTag(position);
            return convertView;
        }
    }
}