Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 051dccf6 authored by Daniel Sandler's avatar Daniel Sandler
Browse files

Hello, HoloClock.

Bug: 3203162
Change-Id: I3c4fb47eb4fd7f6de966055e0d0a5de77b0c4eac
parent a914f340
Loading
Loading
Loading
Loading
+2.28 KiB

File added.

No diff preview for this file type.

+2.16 KiB

File added.

No diff preview for this file type.

+17 −12
Original line number Diff line number Diff line
@@ -57,20 +57,25 @@
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                >
                <!-- paddingLeft: 24 dips = 32dp (total space to icon) - 8dp in the icon.
                TODO: Make sure the font has a small enough leading that we don't need this
                negative margin business. -->
                <com.android.systemui.statusbar.policy.Clock
                    style="@*android:style/TextAppearance.StatusBar.Icon"
                <com.android.systemui.statusbar.tablet.HoloClock
                    android:id="@+id/clock"
                    android:layout_width="wrap_content"
                    android:layout_height="65dp"
                    android:layout_marginTop="-17dp"
                    android:layout_height="match_parent"
                    >
                    <TextView android:id="@+id/time_bg"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:singleLine="true"
                    android:textSize="60sp"
                    android:paddingLeft="24dip"
                    android:textColor="#2e2e2e"
                    />
                        android:textSize="72dip"
                        android:textColor="#1f1f1f" />
                    <TextView android:id="@+id/time_fg"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:singleLine="true"
                        android:textSize="72dip"
                        android:textColor="#2e2e2e" />
                </com.android.systemui.statusbar.tablet.HoloClock>

                <LinearLayout
                    android:layout_width="48dip"
                    android:layout_height="match_parent"
+19 −5
Original line number Diff line number Diff line
@@ -40,15 +40,29 @@
        android:layout_alignParentRight="true"
        >

        <com.android.systemui.statusbar.policy.Clock
        <com.android.systemui.statusbar.tablet.HoloClock
            android:id="@+id/clock"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_alignParentTop="true"
            android:layout_marginRight="48dp"
            android:textSize="70sp"
            android:layout_marginRight="40dip"
            android:layout_marginBottom="4dip"
            >
            <TextView android:id="@+id/time_bg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="right"
            />
                android:singleLine="true"
                android:textSize="90dip"
                android:textColor="#999999" />
            <TextView android:id="@+id/time_fg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="right"
                android:singleLine="true"
                android:textSize="90dip"
                android:textColor="#666666" />
        </com.android.systemui.statusbar.tablet.HoloClock>

        <com.android.systemui.statusbar.policy.DateView
            android:id="@+id/date"
+169 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.statusbar.tablet;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.format.DateFormat;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

import com.android.systemui.R;

public class HoloClock extends FrameLayout {
    private boolean mAttached;
    private Calendar mCalendar;
    private String mClockFormatString;
    private SimpleDateFormat mClockFormat;

    private static Typeface sBackgroundType, sForegroundType;
    private TextView mBgText, mFgText;

    public HoloClock(Context context) {
        this(context, null);
    }

    public HoloClock(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public HoloClock(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        if (sBackgroundType == null) {
            AssetManager assets = getContext().getAssets();

            sBackgroundType = Typeface.createFromAsset(assets,
                "fonts/AndroidClock.ttf");
            sForegroundType = Typeface.createFromAsset(assets,
                "fonts/AndroidClock2.ttf");
        }
        mBgText = (TextView) findViewById(R.id.time_bg);
        if (mBgText != null) {
            mBgText.setTypeface(sBackgroundType);
        }
        mFgText = (TextView) findViewById(R.id.time_fg);
        if (mFgText != null) {
            mFgText.setTypeface(sForegroundType);
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        if (!mAttached) {
            mAttached = true;
            IntentFilter filter = new IntentFilter();

            filter.addAction(Intent.ACTION_TIME_TICK);
            filter.addAction(Intent.ACTION_TIME_CHANGED);
            filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
            filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);

            getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
        }

        // NOTE: It's safe to do these after registering the receiver since the receiver always runs
        // in the main thread, therefore the receiver can't run before this method returns.

        // The time zone may have changed while the receiver wasn't registered, so update the Time
        mCalendar = Calendar.getInstance(TimeZone.getDefault());

        // Make sure we update to the current time
        updateClock();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mAttached) {
            getContext().unregisterReceiver(mIntentReceiver);
            mAttached = false;
        }
    }

    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
                String tz = intent.getStringExtra("time-zone");
                mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));
                if (mClockFormat != null) {
                    mClockFormat.setTimeZone(mCalendar.getTimeZone());
                }
            }
            updateClock();
        }
    };

    final void updateClock() {
        mCalendar.setTimeInMillis(System.currentTimeMillis());
        CharSequence txt = getTimeText();
        mBgText.setText(txt);
        mFgText.setText(txt);
    }

    private final CharSequence getTimeText() {
        Context context = getContext();
        int res = DateFormat.is24HourFormat(context)
            ? com.android.internal.R.string.twenty_four_hour_time_format
            : com.android.internal.R.string.twelve_hour_time_format;

        SimpleDateFormat sdf;
        String format = context.getString(res);
        if (!format.equals(mClockFormatString)) {
            // we don't want AM/PM showing up in our statusbar, even in 12h mode
            format = format.replaceAll("a", "").trim();
            mClockFormat = sdf = new SimpleDateFormat(format);
            mClockFormatString = format;
        } else {
            sdf = mClockFormat;
        }
        String result = sdf.format(mCalendar.getTime());
        return result;
    }
}