| /* |
| * 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.formatShortElapsedTimeRoundingUpToMinutes( |
| 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) { |
| boolean isChargingOrFull = status.status == BatteryManager.BATTERY_STATUS_CHARGING |
| || status.status == BatteryManager.BATTERY_STATUS_FULL; |
| mPowerPluggedIn = status.isPluggedIn() && isChargingOrFull; |
| 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(); |
| } |
| } |
| }; |
| } |