1db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase/*
2db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * Copyright (C) 2012 The Android Open Source Project
3db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase *
4db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * you may not use this file except in compliance with the License.
6db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * You may obtain a copy of the License at
7db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase *
8db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase *
10db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * Unless required by applicable law or agreed to in writing, software
11db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * See the License for the specific language governing permissions and
14db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * limitations under the License.
15db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase */
16db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
17db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haasepackage com.android.test.hwui;
18db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
19db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.animation.ObjectAnimator;
20db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.animation.ValueAnimator;
21db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.app.Activity;
22db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.content.Context;
23db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.graphics.Canvas;
24db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.graphics.Color;
25db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.graphics.Paint;
26db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.os.Bundle;
27db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.Spannable;
28db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.SpannableStringBuilder;
29db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.BackgroundColorSpan;
30db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.ForegroundColorSpan;
31db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.ImageSpan;
32db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.SuggestionSpan;
33db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.UnderlineSpan;
34db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.view.View;
35db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.Button;
36db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.EditText;
37db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.LinearLayout;
38db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.TextView;
39db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
40db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haasepublic class ViewPropertyAlphaActivity extends Activity {
41db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
42db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    MyView myViewAlphaDefault, myViewAlphaHandled;
43db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
44db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    @Override
45db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    protected void onCreate(Bundle savedInstanceState) {
46db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        super.onCreate(savedInstanceState);
47db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
48db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        setContentView(R.layout.view_properties);
49db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
50db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        getWindow().getDecorView().postDelayed(new Runnable() {
51db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            @Override
52db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            public void run() {
53db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.button);
54db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.textview);
55db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.spantext);
56db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.edittext);
57db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.selectedtext);
58db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.textviewbackground);
59db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.layout);
60db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(R.id.imageview);
61db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(myViewAlphaDefault);
62db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                startAnim(myViewAlphaHandled);
63db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                EditText selectedText = (EditText) findViewById(R.id.selectedtext);
64db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                selectedText.setSelection(3, 8);
65db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            }
66db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        }, 2000);
67db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
68db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        Button invalidator = (Button) findViewById(R.id.invalidateButton);
69db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        invalidator.setOnClickListener(new View.OnClickListener() {
70db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            @Override
71db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            public void onClick(View v) {
72db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                findViewById(R.id.textview).invalidate();
73db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                findViewById(R.id.spantext).invalidate();
74db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            }
75db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        });
76db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
77db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        TextView textView = (TextView) findViewById(R.id.spantext);
78db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        if (textView != null) {
79db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            SpannableStringBuilder text =
80db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    new SpannableStringBuilder("Now this is a short text message with spans");
81db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
82db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            text.setSpan(new BackgroundColorSpan(Color.RED), 0, 3,
83db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
84db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            text.setSpan(new ForegroundColorSpan(Color.BLUE), 4, 9,
85db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
86db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            text.setSpan(new SuggestionSpan(this, new String[]{"longer"}, 3), 11, 16,
87db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
88db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            text.setSpan(new UnderlineSpan(), 17, 20,
89db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
90db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            text.setSpan(new ImageSpan(this, R.drawable.icon), 21, 22,
91db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
92db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
93db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            textView.setText(text);
94db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        }
95db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
96db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        LinearLayout container = (LinearLayout) findViewById(R.id.container);
97db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        myViewAlphaDefault = new MyView(this, false);
98db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        myViewAlphaDefault.setLayoutParams(new LinearLayout.LayoutParams(75, 75));
99db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        container.addView(myViewAlphaDefault);
100db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        myViewAlphaHandled = new MyView(this, true);
101db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        myViewAlphaHandled.setLayoutParams(new LinearLayout.LayoutParams(75, 75));
102db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        container.addView(myViewAlphaHandled);
103db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
104db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
105db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    private void startAnim(View target) {
106db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        ObjectAnimator anim = ObjectAnimator.ofFloat(target, View.ALPHA, 0);
107db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        anim.setRepeatCount(ValueAnimator.INFINITE);
108db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        anim.setRepeatMode(ValueAnimator.REVERSE);
109db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        anim.setDuration(1000);
110db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        anim.start();
111db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
112db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    private void startAnim(int id) {
113db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        startAnim(findViewById(id));
114db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
115db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
116db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    private static class MyView extends View {
117db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        private int mMyAlpha = 255;
118db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        private boolean mHandleAlpha;
119db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
120db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
121db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        private MyView(Context context, boolean handleAlpha) {
122db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            super(context);
123db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            mHandleAlpha = handleAlpha;
124db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            mPaint.setColor(Color.RED);
125db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        }
126db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
127db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        @Override
128db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        protected void onDraw(Canvas canvas) {
129db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            if (mHandleAlpha) {
130db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                mPaint.setAlpha(mMyAlpha);
131db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            }
132db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            canvas.drawCircle(30, 30, 30, mPaint);
133db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        }
134db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
135db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        @Override
136db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        protected boolean onSetAlpha(int alpha) {
137db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            if (mHandleAlpha) {
138db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                mMyAlpha = alpha;
139db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                return true;
140db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            }
141db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            return super.onSetAlpha(alpha);
142db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        }
143db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
144db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
145db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase}
146