Home | History | Annotate | Download | only in deviceinfo
      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.text.format.DateUtils;
     24 
     25 import androidx.annotation.VisibleForTesting;
     26 import androidx.preference.Preference;
     27 import androidx.preference.PreferenceScreen;
     28 
     29 import com.android.settingslib.core.AbstractPreferenceController;
     30 import com.android.settingslib.core.lifecycle.Lifecycle;
     31 import com.android.settingslib.core.lifecycle.LifecycleObserver;
     32 import com.android.settingslib.core.lifecycle.events.OnStart;
     33 import com.android.settingslib.core.lifecycle.events.OnStop;
     34 
     35 import java.lang.ref.WeakReference;
     36 
     37 /**
     38  * Preference controller for uptime
     39  */
     40 public abstract class AbstractUptimePreferenceController extends AbstractPreferenceController
     41         implements LifecycleObserver, OnStart, OnStop {
     42 
     43     @VisibleForTesting
     44     static final String KEY_UPTIME = "up_time";
     45     private static final int EVENT_UPDATE_STATS = 500;
     46 
     47     private Preference mUptime;
     48     private Handler mHandler;
     49 
     50     public AbstractUptimePreferenceController(Context context, Lifecycle lifecycle) {
     51         super(context);
     52         if (lifecycle != null) {
     53             lifecycle.addObserver(this);
     54         }
     55     }
     56 
     57     @Override
     58     public void onStart() {
     59         getHandler().sendEmptyMessage(EVENT_UPDATE_STATS);
     60     }
     61 
     62     @Override
     63     public void onStop() {
     64         getHandler().removeMessages(EVENT_UPDATE_STATS);
     65     }
     66 
     67     @Override
     68     public boolean isAvailable() {
     69         return true;
     70     }
     71 
     72     @Override
     73     public String getPreferenceKey() {
     74         return KEY_UPTIME;
     75     }
     76 
     77     @Override
     78     public void displayPreference(PreferenceScreen screen) {
     79         super.displayPreference(screen);
     80         mUptime = screen.findPreference(KEY_UPTIME);
     81         updateTimes();
     82     }
     83 
     84     private Handler getHandler() {
     85         if (mHandler == null) {
     86             mHandler = new MyHandler(this);
     87         }
     88         return mHandler;
     89     }
     90 
     91     private void updateTimes() {
     92         mUptime.setSummary(DateUtils.formatElapsedTime(SystemClock.elapsedRealtime() / 1000));
     93     }
     94 
     95     private static class MyHandler extends Handler {
     96         private WeakReference<AbstractUptimePreferenceController> mStatus;
     97 
     98         public MyHandler(AbstractUptimePreferenceController activity) {
     99             mStatus = new WeakReference<>(activity);
    100         }
    101 
    102         @Override
    103         public void handleMessage(Message msg) {
    104             AbstractUptimePreferenceController status = mStatus.get();
    105             if (status == null) {
    106                 return;
    107             }
    108 
    109             switch (msg.what) {
    110                 case EVENT_UPDATE_STATS:
    111                     status.updateTimes();
    112                     sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
    113                     break;
    114 
    115                 default:
    116                     throw new IllegalStateException("Unknown message " + msg.what);
    117             }
    118         }
    119     }
    120 }
    121