DateView.java revision 56018e577edada2721f4772bcec9274d043a06e7
1503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato/*
2503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Copyright (C) 2008 The Android Open Source Project
3503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
4503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * you may not use this file except in compliance with the License.
6503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * You may obtain a copy of the License at
7503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
8503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
10503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Unless required by applicable law or agreed to in writing, software
11503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * See the License for the specific language governing permissions and
14503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * limitations under the License.
15503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato */
16503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.policy;
18503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
19503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.BroadcastReceiver;
20503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.Context;
21503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.Intent;
22503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.IntentFilter;
23503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.util.AttributeSet;
24fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.view.View;
25fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.view.ViewParent;
264519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkeyimport android.widget.TextView;
27503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
28ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwoodimport com.android.systemui.R;
29ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwood
3056018e577edada2721f4772bcec9274d043a06e7Chris Wrenimport java.text.SimpleDateFormat;
31503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport java.util.Date;
3256018e577edada2721f4772bcec9274d043a06e7Chris Wrenimport java.util.Locale;
3356018e577edada2721f4772bcec9274d043a06e7Chris Wren
3456018e577edada2721f4772bcec9274d043a06e7Chris Wrenimport libcore.icu.ICU;
35503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
36d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungpublic class DateView extends TextView {
37503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    private static final String TAG = "DateView";
38503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
39fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private boolean mAttachedToWindow;
40fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private boolean mWindowVisible;
41fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private boolean mUpdating;
42503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
43503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
44503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        @Override
45503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        public void onReceive(Context context, Intent intent) {
464519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey            final String action = intent.getAction();
474519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey            if (Intent.ACTION_TIME_TICK.equals(action)
484519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey                    || Intent.ACTION_TIME_CHANGED.equals(action)
494519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey                    || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
50503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                updateClock();
51503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato            }
52503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        }
53503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    };
54503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
55503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    public DateView(Context context, AttributeSet attrs) {
56503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super(context, attrs);
57503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
58503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
59503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    @Override
60503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    protected void onAttachedToWindow() {
61503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super.onAttachedToWindow();
62fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mAttachedToWindow = true;
63fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        setUpdates();
64503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
65503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
66503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    @Override
67503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    protected void onDetachedFromWindow() {
68503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super.onDetachedFromWindow();
69fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mAttachedToWindow = false;
70fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        setUpdates();
71fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    }
72fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
73fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    @Override
74fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    protected void onWindowVisibilityChanged(int visibility) {
75fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        super.onWindowVisibilityChanged(visibility);
76fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mWindowVisible = visibility == VISIBLE;
77fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        setUpdates();
78fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    }
79fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
80fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    @Override
81fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    protected void onVisibilityChanged(View changedView, int visibility) {
82fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        super.onVisibilityChanged(changedView, visibility);
83fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        setUpdates();
84503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
85503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
86503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    @Override
87503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    protected int getSuggestedMinimumWidth() {
88503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        // makes the large background bitmap not force us to full width
89503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        return 0;
90503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
91503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
92d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    protected void updateClock() {
9356018e577edada2721f4772bcec9274d043a06e7Chris Wren        final String dateFormat = getContext().getString(R.string.system_ui_date_pattern);
9456018e577edada2721f4772bcec9274d043a06e7Chris Wren        final Locale l = Locale.getDefault();
9556018e577edada2721f4772bcec9274d043a06e7Chris Wren        String fmt = ICU.getBestDateTimePattern(dateFormat, l.toString());
9656018e577edada2721f4772bcec9274d043a06e7Chris Wren        SimpleDateFormat sdf = new SimpleDateFormat(fmt, l);
9756018e577edada2721f4772bcec9274d043a06e7Chris Wren        setText(sdf.format(new Date()));
98fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    }
99fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
100fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private boolean isVisible() {
101fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        View v = this;
102fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        while (true) {
103fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            if (v.getVisibility() != VISIBLE) {
104fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato                return false;
105fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            }
106fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            final ViewParent parent = v.getParent();
107fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            if (parent instanceof View) {
108fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato                v = (View)parent;
109fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            } else {
110fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato                return true;
111fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            }
112fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        }
113503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
114503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
115fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private void setUpdates() {
116fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        boolean update = mAttachedToWindow && mWindowVisible && isVisible();
117503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        if (update != mUpdating) {
118503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato            mUpdating = update;
119503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato            if (update) {
120503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                // Register for Intent broadcasts for the clock and battery
121503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                IntentFilter filter = new IntentFilter();
122503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                filter.addAction(Intent.ACTION_TIME_TICK);
1234519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey                filter.addAction(Intent.ACTION_TIME_CHANGED);
124503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
125503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                mContext.registerReceiver(mIntentReceiver, filter, null, null);
126503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                updateClock();
127503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato            } else {
128503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                mContext.unregisterReceiver(mIntentReceiver);
129503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato            }
130503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        }
131503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
132503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato}
133