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

Commit ee920d50 authored by Adrian Roos's avatar Adrian Roos Committed by Android Git Automerger
Browse files

am 612734fb: Merge "Display time to charge on lock screen" into lmp-preview-dev

* commit '612734fbfa24b925d51dcf47260a87290629f220':
  Display time to charge on lock screen
parents 67985dd5 3b60d3fe
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -59,8 +59,8 @@
    <string name="keyguard_charged">Charged</string>
    <string name="keyguard_charged">Charged</string>


    <!-- When the lock screen is showing and the phone plugged in, and the battery
    <!-- When the lock screen is showing and the phone plugged in, and the battery
         is not fully charged, show the current charge %.  -->
         is not fully charged, say that it's charging.  -->
    <string name="keyguard_plugged_in">Charging, <xliff:g id="number">%d</xliff:g><xliff:g id="percent">%%</xliff:g></string>
    <string name="keyguard_plugged_in">Charging</string>


    <!-- When the lock screen is showing and the battery is low, warn user to plug
    <!-- When the lock screen is showing and the battery is low, warn user to plug
         in the phone soon. -->
         in the phone soon. -->
+1 −1
Original line number Original line Diff line number Diff line
@@ -418,7 +418,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        }
        }
    }
    }


    /* package */ static class BatteryStatus {
    public static class BatteryStatus {
        public final int status;
        public final int status;
        public final int level;
        public final int level;
        public final int plugged;
        public final int plugged;
+3 −0
Original line number Original line Diff line number Diff line
@@ -581,6 +581,9 @@
    <!-- Zen mode condition: no exit criteria. [CHAR LIMIT=NONE] -->
    <!-- Zen mode condition: no exit criteria. [CHAR LIMIT=NONE] -->
    <string name="zen_mode_forever">Until you turn this off</string>
    <string name="zen_mode_forever">Until you turn this off</string>


    <!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=40]-->
    <string name="keyguard_indication_charging_time">Charging (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string>

    <!-- Zen mode condition: time duration in minutes. [CHAR LIMIT=NONE] -->
    <!-- Zen mode condition: time duration in minutes. [CHAR LIMIT=NONE] -->
    <plurals name="zen_mode_duration_minutes">
    <plurals name="zen_mode_duration_minutes">
        <item quantity="one">For one minute</item>
        <item quantity="one">For one minute</item>
+190 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2014 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;

import com.android.internal.app.IBatteryStats;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.BatteryStats;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;

/**
 * Controls the little text indicator on the keyguard.
 */
public class KeyguardIndicationController {

    private static final String TAG = "KeyguardIndicationController";

    private static final int MSG_HIDE_TRANSIENT = 1;

    private final Context mContext;
    private final KeyguardIndicationTextView mTextView;
    private final IBatteryStats mBatteryInfo;

    private String mRestingIndication;
    private String mTransientIndication;
    private boolean mVisible;

    private boolean mPowerPluggedIn;
    private boolean mPowerCharged;

    public KeyguardIndicationController(Context context, KeyguardIndicationTextView textView) {
        mContext = context;
        mTextView = textView;

        mBatteryInfo = IBatteryStats.Stub.asInterface(
                ServiceManager.getService(BatteryStats.SERVICE_NAME));
        KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitor);
        context.registerReceiverAsUser(
                mReceiver, UserHandle.OWNER, new IntentFilter(Intent.ACTION_TIME_TICK), null, null);
    }

    public void setVisible(boolean visible) {
        mVisible = visible;
        mTextView.setVisibility(visible ? View.VISIBLE : View.GONE);
        if (visible) {
            hideTransientIndication();
            updateIndication();
        }
    }

    /**
     * Sets the indication that is shown if nothing else is showing.
     */
    public void setRestingIndication(String restingIndication) {
        mRestingIndication = restingIndication;
        updateIndication();
    }

    /**
     * Hides transient indication in {@param delayMs}.
     */
    public void hideTransientIndicationDelayed(long delayMs) {
        mHandler.sendMessageDelayed(
                mHandler.obtainMessage(MSG_HIDE_TRANSIENT), delayMs);
    }

    /**
     * Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}.
     */
    public void showTransientIndication(int transientIndication) {
        showTransientIndication(mContext.getResources().getString(transientIndication));
    }

    /**
     * Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}.
     */
    public void showTransientIndication(String transientIndication) {
        mTransientIndication = transientIndication;
        mHandler.removeMessages(MSG_HIDE_TRANSIENT);
        updateIndication();
    }

    /**
     * Hides transient indication.
     */
    public void hideTransientIndication() {
        if (mTransientIndication != null) {
            mTransientIndication = null;
            mHandler.removeMessages(MSG_HIDE_TRANSIENT);
            updateIndication();
        }
    }

    private void updateIndication() {
        if (mVisible) {
            mTextView.switchIndication(computeIndication());
        }
    }

    private String computeIndication() {
        if (!TextUtils.isEmpty(mTransientIndication)) {
            return mTransientIndication;
        }
        if (mPowerPluggedIn) {
            return computePowerIndication();
        }
        return mRestingIndication;
    }

    private String computePowerIndication() {
        if (mPowerCharged) {
            return mContext.getResources().getString(R.string.keyguard_charged);
        }

        // Try fetching charging time from battery stats.
        try {
            long chargingTimeRemaining = mBatteryInfo.computeChargeTimeRemaining();
            if (chargingTimeRemaining > 0) {
                String chargingTimeFormatted =
                        Formatter.formatShortElapsedTime(mContext, chargingTimeRemaining);
                return mContext.getResources().getString(
                        R.string.keyguard_indication_charging_time, chargingTimeFormatted);
            }
        } catch (RemoteException e) {
            Log.e(TAG, "Error calling IBatteryStats: ", e);
        }

        // Fall back to simple charging label.
        return mContext.getResources().getString(R.string.keyguard_plugged_in);
    }

    KeyguardUpdateMonitorCallback mUpdateMonitor = new KeyguardUpdateMonitorCallback() {
        @Override
        public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) {
            mPowerPluggedIn = status.status == BatteryManager.BATTERY_STATUS_CHARGING
                    || status.status == BatteryManager.BATTERY_STATUS_FULL;
            mPowerCharged = status.isCharged();
            updateIndication();
        }
    };

    BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (mVisible) {
                updateIndication();
            }
        }
    };

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_HIDE_TRANSIENT && mTransientIndication != null) {
                mTransientIndication = null;
                updateIndication();
            }
        }
    };
}
+13 −26
Original line number Original line Diff line number Diff line
@@ -105,6 +105,7 @@ import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.GestureRecorder;
import com.android.systemui.statusbar.GestureRecorder;
import com.android.systemui.statusbar.InterceptedNotifications;
import com.android.systemui.statusbar.InterceptedNotifications;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationData.Entry;
import com.android.systemui.statusbar.NotificationData.Entry;
import com.android.systemui.statusbar.NotificationOverflowContainer;
import com.android.systemui.statusbar.NotificationOverflowContainer;
@@ -122,7 +123,6 @@ import com.android.systemui.statusbar.policy.LocationControllerImpl;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
import com.android.systemui.statusbar.policy.RotationLockControllerImpl;
import com.android.systemui.statusbar.policy.RotationLockControllerImpl;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.policy.ZenModeControllerImpl;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout.OnChildLocationsChangedListener;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout.OnChildLocationsChangedListener;
import com.android.systemui.statusbar.stack.StackScrollState.ViewState;
import com.android.systemui.statusbar.stack.StackScrollState.ViewState;
@@ -253,10 +253,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    View mKeyguardStatusView;
    View mKeyguardStatusView;
    KeyguardBottomAreaView mKeyguardBottomArea;
    KeyguardBottomAreaView mKeyguardBottomArea;
    boolean mLeaveOpenOnKeyguardHide;
    boolean mLeaveOpenOnKeyguardHide;
    KeyguardIndicationTextView mKeyguardIndicationTextView;
    KeyguardIndicationController mKeyguardIndicationController;


    // TODO: Fetch phrase from search/hotword provider.
    String mKeyguardHotwordPhrase = "";
    int mKeyguardMaxNotificationCount;
    int mKeyguardMaxNotificationCount;
    View mDateTimeView;
    View mDateTimeView;


@@ -496,13 +494,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        }
        }
    };
    };


    private final Runnable mResetIndicationRunnable = new Runnable() {
        @Override
        public void run() {
            mKeyguardIndicationTextView.switchIndication(mKeyguardHotwordPhrase);
        }
    };

    @Override
    @Override
    public void setZenMode(int mode) {
    public void setZenMode(int mode) {
        super.setZenMode(mode);
        super.setZenMode(mode);
@@ -674,8 +665,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        mKeyguardBottomArea =
        mKeyguardBottomArea =
                (KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area);
                (KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area);
        mKeyguardBottomArea.setActivityStarter(this);
        mKeyguardBottomArea.setActivityStarter(this);
        mKeyguardIndicationTextView = (KeyguardIndicationTextView) mStatusBarWindow.findViewById(
        mKeyguardIndicationController = new KeyguardIndicationController(mContext,
                R.id.keyguard_indication_text);
                (KeyguardIndicationTextView) mStatusBarWindow.findViewById(
                        R.id.keyguard_indication_text));
        mDateView = (DateView)mStatusBarWindow.findViewById(R.id.date);
        mDateView = (DateView)mStatusBarWindow.findViewById(R.id.date);


        mDateTimeView = mHeader.findViewById(R.id.datetime);
        mDateTimeView = mHeader.findViewById(R.id.datetime);
@@ -2866,12 +2858,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    private void updateKeyguardState() {
    private void updateKeyguardState() {
        if (mState == StatusBarState.KEYGUARD) {
        if (mState == StatusBarState.KEYGUARD) {
            mKeyguardStatusView.setVisibility(View.VISIBLE);
            mKeyguardStatusView.setVisibility(View.VISIBLE);
            mKeyguardIndicationTextView.setVisibility(View.VISIBLE);
            mKeyguardIndicationController.setVisible(true);
            mKeyguardIndicationTextView.switchIndication(mKeyguardHotwordPhrase);
            mNotificationPanel.resetViews();
            mNotificationPanel.resetViews();
        } else {
        } else {
            mKeyguardStatusView.setVisibility(View.GONE);
            mKeyguardStatusView.setVisibility(View.GONE);
            mKeyguardIndicationTextView.setVisibility(View.GONE);
            mKeyguardIndicationController.setVisible(false);
        }
        }
        if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
        if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
            mKeyguardBottomArea.setVisibility(View.VISIBLE);
            mKeyguardBottomArea.setVisibility(View.VISIBLE);
@@ -2958,7 +2949,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    @Override
    @Override
    public void onActivated(View view) {
    public void onActivated(View view) {
        userActivity();
        userActivity();
        mKeyguardIndicationTextView.switchIndication(R.string.notification_tap_again);
        mKeyguardIndicationController.showTransientIndication(R.string.notification_tap_again);
        mStackScroller.setActivatedChild(view);
        mStackScroller.setActivatedChild(view);
    }
    }


@@ -2973,7 +2964,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    @Override
    @Override
    public void onActivationReset(View view) {
    public void onActivationReset(View view) {
        if (view == mStackScroller.getActivatedChild()) {
        if (view == mStackScroller.getActivatedChild()) {
            mKeyguardIndicationTextView.switchIndication(mKeyguardHotwordPhrase);
            mKeyguardIndicationController.hideTransientIndication();
            mStackScroller.setActivatedChild(null);
            mStackScroller.setActivatedChild(null);
        }
        }
    }
    }
@@ -2982,24 +2973,20 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    }
    }


    public void onUnlockHintStarted() {
    public void onUnlockHintStarted() {
        mStatusBarView.removeCallbacks(mResetIndicationRunnable);
        mKeyguardIndicationController.showTransientIndication(R.string.keyguard_unlock);
        mKeyguardIndicationTextView.switchIndication(R.string.keyguard_unlock);
    }
    }


    public void onHintFinished() {
    public void onHintFinished() {

        // Delay the reset a bit so the user can read the text.
        // Delay the reset a bit so the user can read the text.
        mStatusBarView.postDelayed(mResetIndicationRunnable, HINT_RESET_DELAY_MS);
        mKeyguardIndicationController.hideTransientIndicationDelayed(HINT_RESET_DELAY_MS);
    }
    }


    public void onCameraHintStarted() {
    public void onCameraHintStarted() {
        mStatusBarView.removeCallbacks(mResetIndicationRunnable);
        mKeyguardIndicationController.showTransientIndication(R.string.camera_hint);
        mKeyguardIndicationTextView.switchIndication(R.string.camera_hint);
    }
    }


    public void onPhoneHintStarted() {
    public void onPhoneHintStarted() {
        mStatusBarView.removeCallbacks(mResetIndicationRunnable);
        mKeyguardIndicationController.showTransientIndication(R.string.phone_hint);
        mKeyguardIndicationTextView.switchIndication(R.string.phone_hint);
    }
    }


    public void onTrackingStopped(boolean expand) {
    public void onTrackingStopped(boolean expand) {