OSDN Git Service

Add Weather Content Provider [5/5]
[android-x86/frameworks-base.git] / packages / SystemUI / src / com / android / systemui / statusbar / phone / StatusBarHeaderView.java
index 792d01e..5ca3655 100644 (file)
@@ -43,6 +43,7 @@ import android.widget.RelativeLayout;
 import android.widget.Switch;
 import android.widget.TextView;
 import android.widget.Toast;
+
 import com.android.keyguard.KeyguardStatusView;
 import com.android.systemui.BatteryMeterView;
 import com.android.systemui.FontSizeUtils;
@@ -55,21 +56,27 @@ import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
 import com.android.systemui.statusbar.policy.NextAlarmController;
 import com.android.systemui.statusbar.policy.UserInfoController;
+import com.android.systemui.statusbar.policy.WeatherController;
+import com.android.systemui.statusbar.policy.WeatherControllerImpl;
 import com.android.systemui.tuner.TunerService;
 
 import java.text.NumberFormat;
 
+import cyanogenmod.providers.CMSettings;
+import cyanogenmod.weather.util.WeatherUtils;
+
 /**
  * The view to manage the header area in the expanded status bar.
  */
 public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnClickListener,
         BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback,
-        EmergencyListener {
+        EmergencyListener, WeatherController.Callback, TunerService.Tunable {
 
     private boolean mExpanded;
     private boolean mListening;
 
     private ViewGroup mSystemIconsContainer;
+    private ViewGroup mWeatherContainer;
     private View mSystemIconsSuperContainer;
     private View mDateGroup;
     private View mClock;
@@ -90,6 +97,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
     private TextView mEmergencyCallsOnly;
     private TextView mBatteryLevel;
     private TextView mAlarmStatus;
+    private TextView mWeatherLine1, mWeatherLine2;
 
     private boolean mShowEmergencyCallsOnly;
     private boolean mAlarmShowing;
@@ -119,6 +127,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
     private ActivityStarter mActivityStarter;
     private BatteryController mBatteryController;
     private NextAlarmController mNextAlarmController;
+    private WeatherController mWeatherController;
     private QSPanel mQSPanel;
 
     private final Rect mClipBounds = new Rect();
@@ -132,6 +141,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
     private float mCurrentT;
     private boolean mShowingDetail;
     private boolean mDetailTransitioning;
+    private boolean mShowWeather;
 
     private boolean mAllowExpand = true;
 
@@ -169,6 +179,10 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         mAlarmStatus.setOnClickListener(this);
         mSignalCluster = findViewById(R.id.signal_cluster);
         mSystemIcons = (LinearLayout) findViewById(R.id.system_icons);
+        mWeatherContainer = (LinearLayout) findViewById(R.id.weather_container);
+        mWeatherContainer.setOnClickListener(this);
+        mWeatherLine1 = (TextView) findViewById(R.id.weather_line_1);
+        mWeatherLine2 = (TextView) findViewById(R.id.weather_line_2);
         loadDimens();
         updateVisibilities();
         updateClockScale();
@@ -294,6 +308,11 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         mNextAlarmController = nextAlarmController;
     }
 
+    @Override
+    public void setWeatherController(WeatherController weatherController) {
+        mWeatherController = weatherController;
+    }
+
     public int getCollapsedHeight() {
         return mCollapsedHeight;
     }
@@ -347,14 +366,14 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         mDateExpanded.setVisibility(mExpanded && mAlarmShowing ? View.INVISIBLE : View.VISIBLE);
         mAlarmStatus.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
         mSettingsContainer.setVisibility(mExpanded ? View.VISIBLE : View.INVISIBLE);
+        mWeatherContainer.setVisibility(mExpanded && mShowWeather ? View.VISIBLE : View.GONE);
         mQsDetailHeader.setVisibility(mExpanded && mShowingDetail? View.VISIBLE : View.INVISIBLE);
         if (mSignalCluster != null) {
             updateSignalClusterDetachment();
         }
         mEmergencyCallsOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly ? VISIBLE : GONE);
         mBatteryLevel.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
-        mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
-                TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
+        mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(View.INVISIBLE);
     }
 
     private void updateSignalClusterDetachment() {
@@ -387,11 +406,16 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
 
     private void updateListeners() {
         if (mListening) {
+            TunerService.get(getContext()).addTunable(this,
+                    "cmsystem:" + CMSettings.System.STATUS_BAR_SHOW_WEATHER);
             mBatteryController.addStateChangedCallback(this);
             mNextAlarmController.addStateChangedCallback(this);
+            mWeatherController.addCallback(this);
         } else {
             mBatteryController.removeStateChangedCallback(this);
             mNextAlarmController.removeStateChangedCallback(this);
+            mWeatherController.removeCallback(this);
+            TunerService.get(getContext()).removeTunable(this);
         }
     }
 
@@ -441,6 +465,19 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         requestCaptureValues();
     }
 
+    @Override
+    public void onWeatherChanged(WeatherController.WeatherInfo info) {
+        if (Double.isNaN(info.temp) || info.condition == null) {
+            mWeatherLine1.setText(null);
+        } else {
+            mWeatherLine1.setText(mContext.getString(
+                    R.string.status_bar_expanded_header_weather_format,
+                    WeatherUtils.formatTemperature(info.temp, info.tempUnit),
+                    info.condition));
+        }
+        mWeatherLine2.setText(info.city);
+    }
+
     private void updateClickTargets() {
         mMultiUserSwitch.setClickable(mExpanded);
         mMultiUserSwitch.setFocusable(mExpanded);
@@ -550,6 +587,8 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
             startClockActivity();
         } else if (v == mDateGroup) {
             startDateActivity();
+        } else if (v == mWeatherContainer) {
+            startForecastActivity();
         }
     }
 
@@ -576,6 +615,13 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         mActivityStarter.startActivity(intent, true /* dismissShade */);
     }
 
+    private void startForecastActivity() {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.setComponent(WeatherControllerImpl.COMPONENT_WEATHER_FORECAST);
+        mActivityStarter.startActivity(intent, true /* dismissShade */);
+    }
+
     public void setQSPanel(QSPanel qsp) {
         mQSPanel = qsp;
         if (mQSPanel != null) {
@@ -618,6 +664,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         target.avatarScale = mMultiUserAvatar.getScaleX();
         target.avatarX = mMultiUserSwitch.getLeft() + mMultiUserAvatar.getLeft();
         target.avatarY = mMultiUserSwitch.getTop() + mMultiUserAvatar.getTop();
+        target.weatherY = mClock.getBottom() - mWeatherLine1.getHeight();
         if (getLayoutDirection() == LAYOUT_DIRECTION_LTR) {
             target.batteryX = mSystemIconsSuperContainer.getLeft()
                     + mSystemIconsContainer.getRight();
@@ -656,6 +703,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         mTime.setScaleY(values.timeScale);
         mClock.setY(values.clockY - mClock.getHeight());
         mDateGroup.setY(values.dateY);
+        mWeatherContainer.setY(values.weatherY);
         mAlarmStatus.setY(values.dateY - mAlarmStatus.getPaddingTop());
         mMultiUserAvatar.setScaleX(values.avatarScale);
         mMultiUserAvatar.setScaleY(values.avatarScale);
@@ -696,6 +744,8 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         applyAlpha(mDateExpanded, values.dateExpandedAlpha);
         applyAlpha(mBatteryLevel, values.batteryLevelAlpha);
         applyAlpha(mSettingsContainer, values.settingsAlpha);
+        applyAlpha(mWeatherLine1, values.settingsAlpha);
+        applyAlpha(mWeatherLine2, values.settingsAlpha);
         applyAlpha(mSignalCluster, values.signalClusterAlpha);
         if (!mExpanded) {
             mTime.setScaleX(1f);
@@ -727,6 +777,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
         float settingsTranslation;
         float signalClusterAlpha;
         float settingsRotation;
+        float weatherY;
 
         public void interpoloate(LayoutValues v1, LayoutValues v2, float t) {
             timeScale = v1.timeScale * (1 - t) + v2.timeScale * t;
@@ -738,6 +789,7 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
             batteryX = v1.batteryX * (1 - t) + v2.batteryX * t;
             batteryY = v1.batteryY * (1 - t) + v2.batteryY * t;
             settingsTranslation = v1.settingsTranslation * (1 - t) + v2.settingsTranslation * t;
+            weatherY = v1.weatherY * (1 - t) + v2.weatherY * t;
 
             float t1 = Math.max(0, t - 0.5f) * 2;
             settingsRotation = v1.settingsRotation * (1 - t1) + v2.settingsRotation * t1;
@@ -811,6 +863,9 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
             final boolean showingDetail = detail != null;
             transition(mClock, !showingDetail);
             transition(mDateGroup, !showingDetail);
+            if (mShowWeather) {
+                transition(mWeatherContainer, !showingDetail);
+            }
             if (mAlarmShowing) {
                 transition(mAlarmStatus, !showingDetail);
             }
@@ -862,4 +917,12 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC
                     .start();
         }
     };
+
+    @Override
+    public void onTuningChanged(String key, String newValue) {
+        if (key.endsWith(CMSettings.System.STATUS_BAR_SHOW_WEATHER)) {
+            mShowWeather = newValue == null || "1".equals(newValue);
+            updateVisibilities();
+        }
+    }
 }