1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settingslib.deviceinfo; 18 19 import android.content.Context; 20 import android.os.Handler; 21 import android.os.Message; 22 import android.os.SystemClock; 23 import android.support.annotation.VisibleForTesting; 24 import android.support.v7.preference.Preference; 25 import android.support.v7.preference.PreferenceScreen; 26 import android.text.format.DateUtils; 27 28 import com.android.settingslib.core.AbstractPreferenceController; 29 import com.android.settingslib.core.lifecycle.Lifecycle; 30 import com.android.settingslib.core.lifecycle.LifecycleObserver; 31 import com.android.settingslib.core.lifecycle.events.OnStart; 32 import com.android.settingslib.core.lifecycle.events.OnStop; 33 34 import java.lang.ref.WeakReference; 35 36 /** 37 * Preference controller for uptime 38 */ 39 public abstract class AbstractUptimePreferenceController extends AbstractPreferenceController 40 implements LifecycleObserver, OnStart, OnStop { 41 42 @VisibleForTesting 43 static final String KEY_UPTIME = "up_time"; 44 private static final int EVENT_UPDATE_STATS = 500; 45 46 private Preference mUptime; 47 private Handler mHandler; 48 AbstractUptimePreferenceController(Context context, Lifecycle lifecycle)49 public AbstractUptimePreferenceController(Context context, Lifecycle lifecycle) { 50 super(context); 51 if (lifecycle != null) { 52 lifecycle.addObserver(this); 53 } 54 } 55 56 @Override onStart()57 public void onStart() { 58 getHandler().sendEmptyMessage(EVENT_UPDATE_STATS); 59 } 60 61 @Override onStop()62 public void onStop() { 63 getHandler().removeMessages(EVENT_UPDATE_STATS); 64 } 65 66 @Override isAvailable()67 public boolean isAvailable() { 68 return true; 69 } 70 71 @Override getPreferenceKey()72 public String getPreferenceKey() { 73 return KEY_UPTIME; 74 } 75 76 @Override displayPreference(PreferenceScreen screen)77 public void displayPreference(PreferenceScreen screen) { 78 super.displayPreference(screen); 79 mUptime = screen.findPreference(KEY_UPTIME); 80 updateTimes(); 81 } 82 getHandler()83 private Handler getHandler() { 84 if (mHandler == null) { 85 mHandler = new MyHandler(this); 86 } 87 return mHandler; 88 } 89 updateTimes()90 private void updateTimes() { 91 mUptime.setSummary(DateUtils.formatDuration(SystemClock.elapsedRealtime())); 92 } 93 94 private static class MyHandler extends Handler { 95 private WeakReference<AbstractUptimePreferenceController> mStatus; 96 MyHandler(AbstractUptimePreferenceController activity)97 public MyHandler(AbstractUptimePreferenceController activity) { 98 mStatus = new WeakReference<>(activity); 99 } 100 101 @Override handleMessage(Message msg)102 public void handleMessage(Message msg) { 103 AbstractUptimePreferenceController status = mStatus.get(); 104 if (status == null) { 105 return; 106 } 107 108 switch (msg.what) { 109 case EVENT_UPDATE_STATS: 110 status.updateTimes(); 111 sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000); 112 break; 113 114 default: 115 throw new IllegalStateException("Unknown message " + msg.what); 116 } 117 } 118 } 119 } 120