Merge changes from topic 'TunerLoc' into mnc-dev
* changes: Add metrics to tuner Move tuner enable point to QS
This commit is contained in:
@@ -27,7 +27,20 @@ import android.view.View;
|
|||||||
*/
|
*/
|
||||||
public class MetricsLogger implements MetricsConstants {
|
public class MetricsLogger implements MetricsConstants {
|
||||||
// Temporary constants go here, to await migration to MetricsConstants.
|
// Temporary constants go here, to await migration to MetricsConstants.
|
||||||
// next value is 227;
|
// next value is 238;
|
||||||
|
|
||||||
|
public static final int TUNER = 227;
|
||||||
|
public static final int TUNER_QS = 228;
|
||||||
|
public static final int TUNER_DEMO_MODE = 229;
|
||||||
|
|
||||||
|
public static final int TUNER_QS_REORDER = 230;
|
||||||
|
public static final int TUNER_QS_ADD = 231;
|
||||||
|
public static final int TUNER_QS_REMOVE = 232;
|
||||||
|
public static final int TUNER_STATUS_BAR_ENABLE = 233;
|
||||||
|
public static final int TUNER_STATUS_BAR_DISABLE = 234;
|
||||||
|
public static final int TUNER_DEMO_MODE_ENABLED = 235;
|
||||||
|
public static final int TUNER_DEMO_MODE_ON = 236;
|
||||||
|
public static final int TUNER_BATTERY_PERCENTAGE = 237;
|
||||||
|
|
||||||
public static void visible(Context context, int category) throws IllegalArgumentException {
|
public static void visible(Context context, int category) throws IllegalArgumentException {
|
||||||
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
|
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
|
||||||
|
|||||||
@@ -405,5 +405,13 @@
|
|||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:singleUser="true"
|
android:singleUser="true"
|
||||||
android:permission="android.permission.BIND_DREAM_SERVICE" />
|
android:permission="android.permission.BIND_DREAM_SERVICE" />
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".tuner.TunerService$ClearReceiver"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.android.systemui.action.CLEAR_TUNER" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
Copyright (C) 2015 The Android Open Source Project
|
Copyright (C) 2015 The Android Open Source Project
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
@@ -14,14 +14,11 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="48.0dp"
|
android:width="24.0dp"
|
||||||
android:height="48.0dp"
|
android:height="24.0dp"
|
||||||
android:viewportWidth="48.0"
|
android:viewportWidth="24.0"
|
||||||
android:viewportHeight="48.0">
|
android:viewportHeight="24.0">
|
||||||
<path
|
<path
|
||||||
android:fillColor="#FF000000"
|
android:fillColor="#FFFFFFFF"
|
||||||
android:pathData="M29.9,24.8c0.0,-0.3 0.1,-0.5 0.1,-0.8s0.0,-0.5 -0.1,-0.8l1.7,-1.3c0.2,-0.1 0.2,-0.3 0.1,-0.5l-1.6,-2.8c-0.1,-0.2 -0.3,-0.2 -0.5,-0.2l-2.0,0.8c-0.4,-0.3 -0.9,-0.6 -1.4,-0.8L26.0,16.3c0.0,-0.2 -0.2,-0.3 -0.4,-0.3l-3.2,0.0c-0.2,0.0 -0.4,0.1 -0.4,0.3l-0.3,2.1c-0.5,0.2 -0.9,0.5 -1.4,0.8l-2.0,-0.8c-0.2,-0.1 -0.4,0.0 -0.5,0.2l-1.6,2.8c-0.1,0.2 -0.1,0.4 0.1,0.5l1.7,1.3c0.0,0.3 -0.1,0.5 -0.1,0.8s0.0,0.5 0.1,0.8l-1.7,1.3c-0.2,0.1 -0.2,0.3 -0.1,0.5l1.6,2.8c0.1,0.2 0.3,0.2 0.5,0.2l2.0,-0.8c0.4,0.3 0.9,0.6 1.4,0.8l0.3,2.1c0.0,0.2 0.2,0.3 0.4,0.3l3.2,0.0c0.2,0.0 0.4,-0.1 0.4,-0.3l0.3,-2.1c0.5,-0.2 0.9,-0.5 1.4,-0.8l2.0,0.8c0.2,0.1 0.4,0.0 0.5,-0.2l1.6,-2.8c0.1,-0.2 0.1,-0.4 -0.1,-0.5L29.9,24.8zM24.0,26.8c-1.5,0.0 -2.8,-1.3 -2.8,-2.8s1.3,-2.8 2.8,-2.8s2.8,1.3 2.8,2.8S25.5,26.8 24.0,26.8z"/>
|
android:pathData="M22.7,19.0l-9.1,-9.1c0.9,-2.0 0.4,-5.0 -1.5,-6.9 -2.0,-2.0 -5.0,-2.4 -7.4,-1.3L9.0,6.0 6.0,9.0 1.6,4.7C0.4,7.0 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1.0,0.4 1.4,0.0l2.3,-2.3c0.5,-0.4 0.5,-1.0 0.1,-1.4z"/>
|
||||||
<path
|
|
||||||
android:fillColor="#FF000000"
|
|
||||||
android:pathData="M18.0,38.0c-0.6,0.0 -1.0,-0.4 -1.0,-1.0s0.4,-1.0 1.0,-1.0s1.0,0.4 1.0,1.0S18.6,38.0 18.0,38.0zM24.0,38.0c-0.6,0.0 -1.0,-0.4 -1.0,-1.0s0.4,-1.0 1.0,-1.0s1.0,0.4 1.0,1.0S24.6,38.0 24.0,38.0zM30.0,38.0c-0.6,0.0 -1.0,-0.4 -1.0,-1.0s0.4,-1.0 1.0,-1.0s1.0,0.4 1.0,1.0S30.6,38.0 30.0,38.0zM42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,28.0c0.0,2.2 1.8,4.0 4.0,4.0l36.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0zM42.0,34.0L6.0,34.0L6.0,14.0l36.0,0.0L42.0,34.0zM9.0,12.0L7.0,12.0l0.0,-2.0l2.0,0.0L9.0,12.0zM13.0,12.0l-2.0,0.0l0.0,-2.0l2.0,0.0L13.0,12.0zM17.0,12.0l-2.0,0.0l0.0,-2.0l2.0,0.0L17.0,12.0z"/>
|
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -44,14 +44,31 @@
|
|||||||
android:scaleType="centerInside"/>
|
android:scaleType="centerInside"/>
|
||||||
</com.android.systemui.statusbar.phone.MultiUserSwitch>
|
</com.android.systemui.statusbar.phone.MultiUserSwitch>
|
||||||
|
|
||||||
<com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/settings_button"
|
<com.android.keyguard.AlphaOptimizedLinearLayout
|
||||||
style="@android:style/Widget.Material.Button.Borderless"
|
android:id="@+id/settings_button_container"
|
||||||
android:layout_toStartOf="@id/multi_user_switch"
|
|
||||||
android:layout_width="48dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="@dimen/status_bar_header_height"
|
android:layout_height="@dimen/status_bar_header_height"
|
||||||
android:background="@drawable/ripple_drawable"
|
android:paddingStart="12dp"
|
||||||
android:src="@drawable/ic_settings"
|
android:clipChildren="false"
|
||||||
android:contentDescription="@string/accessibility_desc_settings" />
|
android:clipToPadding="false"
|
||||||
|
android:layout_toStartOf="@id/multi_user_switch">
|
||||||
|
|
||||||
|
<com.android.systemui.statusbar.phone.SettingsButton android:id="@+id/settings_button"
|
||||||
|
style="@android:style/Widget.Material.Button.Borderless"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="@dimen/status_bar_header_height"
|
||||||
|
android:background="@drawable/ripple_drawable"
|
||||||
|
android:src="@drawable/ic_settings"
|
||||||
|
android:contentDescription="@string/accessibility_desc_settings" />
|
||||||
|
<com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/tuner_icon"
|
||||||
|
android:layout_width="12dp"
|
||||||
|
android:layout_height="@dimen/status_bar_header_height"
|
||||||
|
android:tint="#4DFFFFFF"
|
||||||
|
android:tintMode="src_in"
|
||||||
|
android:visibility="invisible"
|
||||||
|
android:src="@drawable/tuner" />
|
||||||
|
|
||||||
|
</com.android.keyguard.AlphaOptimizedLinearLayout>
|
||||||
|
|
||||||
<LinearLayout android:id="@+id/system_icons_super_container"
|
<LinearLayout android:id="@+id/system_icons_super_container"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|||||||
@@ -1032,7 +1032,7 @@
|
|||||||
<string name="volume_stream_vibrate_dnd" translatable="false">%s vibrate — Priority only</string>
|
<string name="volume_stream_vibrate_dnd" translatable="false">%s vibrate — Priority only</string>
|
||||||
|
|
||||||
<!-- Name of special SystemUI debug settings -->
|
<!-- Name of special SystemUI debug settings -->
|
||||||
<string name="system_ui_tuner">System UI tuner</string>
|
<string name="system_ui_tuner">System UI Tuner</string>
|
||||||
|
|
||||||
<!-- Preference to show/hide embedded battery percentage [CHAR LIMIT=50] -->
|
<!-- Preference to show/hide embedded battery percentage [CHAR LIMIT=50] -->
|
||||||
<string name="show_battery_percentage">Show embedded battery percentage</string>
|
<string name="show_battery_percentage">Show embedded battery percentage</string>
|
||||||
@@ -1099,4 +1099,25 @@
|
|||||||
<!-- Accessibility label for managed profile icon (not shown on screen) [CHAR LIMIT=NONE] -->
|
<!-- Accessibility label for managed profile icon (not shown on screen) [CHAR LIMIT=NONE] -->
|
||||||
<string name="accessibility_managed_profile">Work profile</string>
|
<string name="accessibility_managed_profile">Work profile</string>
|
||||||
|
|
||||||
|
<!-- Title of warning when entering System UI tuner for first time [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="tuner_warning_title">Fun for some but not for all</string>
|
||||||
|
|
||||||
|
<!-- Warning for users entering the System UI tuner for the first time [CHAR LIMIT=NONE]-->
|
||||||
|
<string name="tuner_warning">System UI Tuner gives you extra ways to tweak and customize the Android user interface. These experimental features may change, break, or disappear in future releases. Proceed with caution.</string>
|
||||||
|
|
||||||
|
<!-- Warning for users entering the System UI tuner [CHAR LIMIT=NONE]-->
|
||||||
|
<string name="tuner_persistent_warning">These experimental features may change, break, or disappear in future releases. Proceed with caution.</string>
|
||||||
|
|
||||||
|
<!-- Generic "got it" acceptance of dialog or cling [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="got_it">Got it</string>
|
||||||
|
|
||||||
|
<!-- Toast describing tuner has been enabled [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="tuner_toast">Congrats! System UI Tuner has been added to Settings</string>
|
||||||
|
|
||||||
|
<!-- Option to remove the tuner from settings [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="remove_from_settings">Remove from Settings</string>
|
||||||
|
|
||||||
|
<!-- Dialog asking if the tuner should really be removed from settings [CHAR LIMIT=NONE]-->
|
||||||
|
<string name="remove_from_settings_prompt">Remove System UI Tuner from Settings and stop using all of its features?"</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -76,4 +76,8 @@
|
|||||||
android:key="demo_mode"
|
android:key="demo_mode"
|
||||||
android:title="@string/demo_mode" />
|
android:title="@string/demo_mode" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:summary="@string/tuner_persistent_warning"
|
||||||
|
android:selectable="false" />
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import android.os.Bundle;
|
|||||||
|
|
||||||
public interface DemoMode {
|
public interface DemoMode {
|
||||||
|
|
||||||
|
public static final String DEMO_MODE_ALLOWED = "sysui_demo_allowed";
|
||||||
|
|
||||||
void dispatchDemoCommand(String command, Bundle args);
|
void dispatchDemoCommand(String command, Bundle args);
|
||||||
|
|
||||||
public static final String ACTION_DEMO = "com.android.systemui.demo";
|
public static final String ACTION_DEMO = "com.android.systemui.demo";
|
||||||
|
|||||||
@@ -3211,7 +3211,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
|||||||
public void dispatchDemoCommand(String command, Bundle args) {
|
public void dispatchDemoCommand(String command, Bundle args) {
|
||||||
if (!mDemoModeAllowed) {
|
if (!mDemoModeAllowed) {
|
||||||
mDemoModeAllowed = Settings.Global.getInt(mContext.getContentResolver(),
|
mDemoModeAllowed = Settings.Global.getInt(mContext.getContentResolver(),
|
||||||
"sysui_demo_allowed", 0) != 0;
|
DEMO_MODE_ALLOWED, 0) != 0;
|
||||||
}
|
}
|
||||||
if (!mDemoModeAllowed) return;
|
if (!mDemoModeAllowed) return;
|
||||||
if (command.equals(COMMAND_ENTER)) {
|
if (command.equals(COMMAND_ENTER)) {
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 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.phone;
|
||||||
|
|
||||||
|
import android.animation.Animator;
|
||||||
|
import android.animation.Animator.AnimatorListener;
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewConfiguration;
|
||||||
|
import android.view.animation.Animation;
|
||||||
|
import android.view.animation.AnimationUtils;
|
||||||
|
|
||||||
|
import com.android.keyguard.AlphaOptimizedImageButton;
|
||||||
|
|
||||||
|
public class SettingsButton extends AlphaOptimizedImageButton {
|
||||||
|
|
||||||
|
private static final long LONG_PRESS_LENGTH = 1000;
|
||||||
|
private static final long ACCEL_LENGTH = 750;
|
||||||
|
private static final long FULL_SPEED_LENGTH = 375;
|
||||||
|
private static final long RUN_DURATION = 350;
|
||||||
|
|
||||||
|
private boolean mUpToSpeed;
|
||||||
|
private ObjectAnimator mAnimator;
|
||||||
|
|
||||||
|
private float mSlop;
|
||||||
|
|
||||||
|
public SettingsButton(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
mSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAnimating() {
|
||||||
|
return mAnimator != null && mAnimator.isRunning();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTunerClick() {
|
||||||
|
return mUpToSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
|
switch (event.getActionMasked()) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
postDelayed(mLongPressCallback, LONG_PRESS_LENGTH);
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
if (mUpToSpeed) {
|
||||||
|
startExitAnimation();
|
||||||
|
} else {
|
||||||
|
cancelLongClick();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_CANCEL:
|
||||||
|
cancelLongClick();
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
float x = event.getX();
|
||||||
|
float y = event.getY();
|
||||||
|
if ((x < -mSlop) || (y < -mSlop) || (x > getWidth() + mSlop)
|
||||||
|
|| (y > getHeight() + mSlop)) {
|
||||||
|
cancelLongClick();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return super.onTouchEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cancelLongClick() {
|
||||||
|
cancelAnimation();
|
||||||
|
mUpToSpeed = false;
|
||||||
|
removeCallbacks(mLongPressCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cancelAnimation() {
|
||||||
|
if (mAnimator != null) {
|
||||||
|
mAnimator.removeAllListeners();
|
||||||
|
mAnimator.cancel();
|
||||||
|
mAnimator = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startExitAnimation() {
|
||||||
|
animate()
|
||||||
|
.translationX(((View) getParent().getParent()).getWidth() - getX())
|
||||||
|
.alpha(0)
|
||||||
|
.setDuration(RUN_DURATION)
|
||||||
|
.setInterpolator(AnimationUtils.loadInterpolator(mContext,
|
||||||
|
android.R.interpolator.accelerate_cubic))
|
||||||
|
.setListener(new AnimatorListener() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationStart(Animator animation) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationRepeat(Animator animation) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation) {
|
||||||
|
setAlpha(1f);
|
||||||
|
setTranslationX(0);
|
||||||
|
cancelLongClick();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationCancel(Animator animation) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void startAccelSpin() {
|
||||||
|
cancelAnimation();
|
||||||
|
mAnimator = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360);
|
||||||
|
mAnimator.setInterpolator(AnimationUtils.loadInterpolator(mContext,
|
||||||
|
android.R.interpolator.accelerate_quad));
|
||||||
|
mAnimator.setDuration(ACCEL_LENGTH);
|
||||||
|
mAnimator.addListener(new AnimatorListener() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationStart(Animator animation) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationRepeat(Animator animation) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation) {
|
||||||
|
startContinuousSpin();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationCancel(Animator animation) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mAnimator.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void startContinuousSpin() {
|
||||||
|
cancelAnimation();
|
||||||
|
mUpToSpeed = true;
|
||||||
|
mAnimator = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360);
|
||||||
|
mAnimator.setInterpolator(AnimationUtils.loadInterpolator(mContext,
|
||||||
|
android.R.interpolator.linear));
|
||||||
|
mAnimator.setDuration(FULL_SPEED_LENGTH);
|
||||||
|
mAnimator.setRepeatCount(Animation.INFINITE);
|
||||||
|
mAnimator.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Runnable mLongPressCallback = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
startAccelSpin();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -37,6 +37,7 @@ import android.widget.LinearLayout;
|
|||||||
import android.widget.RelativeLayout;
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.android.keyguard.KeyguardStatusView;
|
import com.android.keyguard.KeyguardStatusView;
|
||||||
import com.android.systemui.BatteryMeterView;
|
import com.android.systemui.BatteryMeterView;
|
||||||
@@ -48,6 +49,7 @@ import com.android.systemui.statusbar.policy.BatteryController;
|
|||||||
import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
|
import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
|
||||||
import com.android.systemui.statusbar.policy.NextAlarmController;
|
import com.android.systemui.statusbar.policy.NextAlarmController;
|
||||||
import com.android.systemui.statusbar.policy.UserInfoController;
|
import com.android.systemui.statusbar.policy.UserInfoController;
|
||||||
|
import com.android.systemui.tuner.TunerService;
|
||||||
|
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
|
|
||||||
@@ -73,7 +75,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
private TextView mDateExpanded;
|
private TextView mDateExpanded;
|
||||||
private LinearLayout mSystemIcons;
|
private LinearLayout mSystemIcons;
|
||||||
private View mSignalCluster;
|
private View mSignalCluster;
|
||||||
private View mSettingsButton;
|
private SettingsButton mSettingsButton;
|
||||||
|
private View mSettingsContainer;
|
||||||
private View mQsDetailHeader;
|
private View mQsDetailHeader;
|
||||||
private TextView mQsDetailHeaderTitle;
|
private TextView mQsDetailHeaderTitle;
|
||||||
private Switch mQsDetailHeaderSwitch;
|
private Switch mQsDetailHeaderSwitch;
|
||||||
@@ -142,7 +145,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
|
mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
|
||||||
mDateCollapsed = (TextView) findViewById(R.id.date_collapsed);
|
mDateCollapsed = (TextView) findViewById(R.id.date_collapsed);
|
||||||
mDateExpanded = (TextView) findViewById(R.id.date_expanded);
|
mDateExpanded = (TextView) findViewById(R.id.date_expanded);
|
||||||
mSettingsButton = findViewById(R.id.settings_button);
|
mSettingsButton = (SettingsButton) findViewById(R.id.settings_button);
|
||||||
|
mSettingsContainer = findViewById(R.id.settings_button_container);
|
||||||
mSettingsButton.setOnClickListener(this);
|
mSettingsButton.setOnClickListener(this);
|
||||||
mQsDetailHeader = findViewById(R.id.qs_detail_header);
|
mQsDetailHeader = findViewById(R.id.qs_detail_header);
|
||||||
mQsDetailHeader.setAlpha(0);
|
mQsDetailHeader.setAlpha(0);
|
||||||
@@ -323,13 +327,15 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
mDateCollapsed.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
|
mDateCollapsed.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
|
||||||
mDateExpanded.setVisibility(mExpanded && mAlarmShowing ? View.INVISIBLE : View.VISIBLE);
|
mDateExpanded.setVisibility(mExpanded && mAlarmShowing ? View.INVISIBLE : View.VISIBLE);
|
||||||
mAlarmStatus.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
|
mAlarmStatus.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
|
||||||
mSettingsButton.setVisibility(mExpanded ? View.VISIBLE : View.INVISIBLE);
|
mSettingsContainer.setVisibility(mExpanded ? View.VISIBLE : View.INVISIBLE);
|
||||||
mQsDetailHeader.setVisibility(mExpanded && mShowingDetail? View.VISIBLE : View.INVISIBLE);
|
mQsDetailHeader.setVisibility(mExpanded && mShowingDetail? View.VISIBLE : View.INVISIBLE);
|
||||||
if (mSignalCluster != null) {
|
if (mSignalCluster != null) {
|
||||||
updateSignalClusterDetachment();
|
updateSignalClusterDetachment();
|
||||||
}
|
}
|
||||||
mEmergencyCallsOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly ? VISIBLE : GONE);
|
mEmergencyCallsOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly ? VISIBLE : GONE);
|
||||||
mBatteryLevel.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
|
mBatteryLevel.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
|
||||||
|
mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
|
||||||
|
TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateSignalClusterDetachment() {
|
private void updateSignalClusterDetachment() {
|
||||||
@@ -352,7 +358,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
private void updateSystemIconsLayoutParams() {
|
private void updateSystemIconsLayoutParams() {
|
||||||
RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
|
RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
|
||||||
int rule = mExpanded
|
int rule = mExpanded
|
||||||
? mSettingsButton.getId()
|
? mSettingsContainer.getId()
|
||||||
: mMultiUserSwitch.getId();
|
: mMultiUserSwitch.getId();
|
||||||
if (rule != lp.getRules()[RelativeLayout.START_OF]) {
|
if (rule != lp.getRules()[RelativeLayout.START_OF]) {
|
||||||
lp.addRule(RelativeLayout.START_OF, rule);
|
lp.addRule(RelativeLayout.START_OF, rule);
|
||||||
@@ -495,6 +501,20 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
if (v == mSettingsButton) {
|
if (v == mSettingsButton) {
|
||||||
|
if (mSettingsButton.isTunerClick()) {
|
||||||
|
if (TunerService.isTunerEnabled(mContext)) {
|
||||||
|
TunerService.showResetRequest(mContext, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// Relaunch settings so that the tuner disappears.
|
||||||
|
startSettingsActivity();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getContext(), R.string.tuner_toast, Toast.LENGTH_LONG).show();
|
||||||
|
TunerService.setTunerEnabled(mContext, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
startSettingsActivity();
|
startSettingsActivity();
|
||||||
} else if (v == mSystemIconsSuperContainer) {
|
} else if (v == mSystemIconsSuperContainer) {
|
||||||
startBatteryActivity();
|
startBatteryActivity();
|
||||||
@@ -567,10 +587,10 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
}
|
}
|
||||||
target.batteryY = mSystemIconsSuperContainer.getTop() + mSystemIconsContainer.getTop();
|
target.batteryY = mSystemIconsSuperContainer.getTop() + mSystemIconsContainer.getTop();
|
||||||
target.batteryLevelAlpha = getAlphaForVisibility(mBatteryLevel);
|
target.batteryLevelAlpha = getAlphaForVisibility(mBatteryLevel);
|
||||||
target.settingsAlpha = getAlphaForVisibility(mSettingsButton);
|
target.settingsAlpha = getAlphaForVisibility(mSettingsContainer);
|
||||||
target.settingsTranslation = mExpanded
|
target.settingsTranslation = mExpanded
|
||||||
? 0
|
? 0
|
||||||
: mMultiUserSwitch.getLeft() - mSettingsButton.getLeft();
|
: mMultiUserSwitch.getLeft() - mSettingsContainer.getLeft();
|
||||||
target.signalClusterAlpha = mSignalClusterDetached ? 0f : 1f;
|
target.signalClusterAlpha = mSignalClusterDetached ? 0f : 1f;
|
||||||
target.settingsRotation = !mExpanded ? 90f : 0f;
|
target.settingsRotation = !mExpanded ? 90f : 0f;
|
||||||
}
|
}
|
||||||
@@ -622,9 +642,11 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
mSignalCluster.setTranslationX(0f);
|
mSignalCluster.setTranslationX(0f);
|
||||||
mSignalCluster.setTranslationY(0f);
|
mSignalCluster.setTranslationY(0f);
|
||||||
}
|
}
|
||||||
mSettingsButton.setTranslationY(mSystemIconsSuperContainer.getTranslationY());
|
if (!mSettingsButton.isAnimating()) {
|
||||||
mSettingsButton.setTranslationX(values.settingsTranslation);
|
mSettingsContainer.setTranslationY(mSystemIconsSuperContainer.getTranslationY());
|
||||||
mSettingsButton.setRotation(values.settingsRotation);
|
mSettingsContainer.setTranslationX(values.settingsTranslation);
|
||||||
|
mSettingsButton.setRotation(values.settingsRotation);
|
||||||
|
}
|
||||||
applyAlpha(mEmergencyCallsOnly, values.emergencyCallsOnlyAlpha);
|
applyAlpha(mEmergencyCallsOnly, values.emergencyCallsOnlyAlpha);
|
||||||
if (!mShowingDetail && !mDetailTransitioning) {
|
if (!mShowingDetail && !mDetailTransitioning) {
|
||||||
// Otherwise it needs to stay invisible
|
// Otherwise it needs to stay invisible
|
||||||
@@ -633,7 +655,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
|||||||
applyAlpha(mDateCollapsed, values.dateCollapsedAlpha);
|
applyAlpha(mDateCollapsed, values.dateCollapsedAlpha);
|
||||||
applyAlpha(mDateExpanded, values.dateExpandedAlpha);
|
applyAlpha(mDateExpanded, values.dateExpandedAlpha);
|
||||||
applyAlpha(mBatteryLevel, values.batteryLevelAlpha);
|
applyAlpha(mBatteryLevel, values.batteryLevelAlpha);
|
||||||
applyAlpha(mSettingsButton, values.settingsAlpha);
|
applyAlpha(mSettingsContainer, values.settingsAlpha);
|
||||||
applyAlpha(mSignalCluster, values.signalClusterAlpha);
|
applyAlpha(mSignalCluster, values.signalClusterAlpha);
|
||||||
if (!mExpanded) {
|
if (!mExpanded) {
|
||||||
mTime.setScaleX(1f);
|
mTime.setScaleX(1f);
|
||||||
|
|||||||
@@ -28,13 +28,14 @@ import android.preference.PreferenceFragment;
|
|||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.systemui.DemoMode;
|
import com.android.systemui.DemoMode;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
|
|
||||||
public class DemoModeFragment extends PreferenceFragment implements OnPreferenceChangeListener {
|
public class DemoModeFragment extends PreferenceFragment implements OnPreferenceChangeListener {
|
||||||
|
|
||||||
private static final String DEMO_MODE_ALLOWED = "sysui_demo_allowed";
|
|
||||||
private static final String DEMO_MODE_ON = "sysui_tuner_demo_on";
|
private static final String DEMO_MODE_ON = "sysui_tuner_demo_on";
|
||||||
|
|
||||||
private static final String[] STATUS_ICONS = {
|
private static final String[] STATUS_ICONS = {
|
||||||
@@ -75,10 +76,33 @@ public class DemoModeFragment extends PreferenceFragment implements OnPreference
|
|||||||
updateDemoModeEnabled();
|
updateDemoModeEnabled();
|
||||||
updateDemoModeOn();
|
updateDemoModeOn();
|
||||||
ContentResolver contentResolver = getContext().getContentResolver();
|
ContentResolver contentResolver = getContext().getContentResolver();
|
||||||
contentResolver.registerContentObserver(Settings.Global.getUriFor(DEMO_MODE_ALLOWED), false,
|
contentResolver.registerContentObserver(Settings.Global.getUriFor(
|
||||||
mDemoModeObserver);
|
DemoMode.DEMO_MODE_ALLOWED), false, mDemoModeObserver);
|
||||||
contentResolver.registerContentObserver(Settings.Global.getUriFor(DEMO_MODE_ON), false,
|
contentResolver.registerContentObserver(Settings.Global.getUriFor(DEMO_MODE_ON), false,
|
||||||
mDemoModeObserver);
|
mDemoModeObserver);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case android.R.id.home:
|
||||||
|
getFragmentManager().popBackStack();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER_DEMO_MODE, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER_DEMO_MODE, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -89,7 +113,7 @@ public class DemoModeFragment extends PreferenceFragment implements OnPreference
|
|||||||
|
|
||||||
private void updateDemoModeEnabled() {
|
private void updateDemoModeEnabled() {
|
||||||
boolean enabled = Settings.Global.getInt(getContext().getContentResolver(),
|
boolean enabled = Settings.Global.getInt(getContext().getContentResolver(),
|
||||||
DEMO_MODE_ALLOWED, 0) != 0;
|
DemoMode.DEMO_MODE_ALLOWED, 0) != 0;
|
||||||
mEnabledSwitch.setChecked(enabled);
|
mEnabledSwitch.setChecked(enabled);
|
||||||
mOnSwitch.setEnabled(enabled);
|
mOnSwitch.setEnabled(enabled);
|
||||||
}
|
}
|
||||||
@@ -102,15 +126,18 @@ public class DemoModeFragment extends PreferenceFragment implements OnPreference
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
boolean enabled = newValue == Boolean.TRUE;
|
||||||
if (preference == mEnabledSwitch) {
|
if (preference == mEnabledSwitch) {
|
||||||
if (newValue != Boolean.TRUE) {
|
if (!enabled) {
|
||||||
// Make sure we aren't in demo mode when disabling it.
|
// Make sure we aren't in demo mode when disabling it.
|
||||||
mOnSwitch.setChecked(false);
|
mOnSwitch.setChecked(false);
|
||||||
stopDemoMode();
|
stopDemoMode();
|
||||||
}
|
}
|
||||||
setGlobal(DEMO_MODE_ALLOWED, newValue == Boolean.TRUE ? 1 : 0);
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_DEMO_MODE_ENABLED, enabled);
|
||||||
|
setGlobal(DemoMode.DEMO_MODE_ALLOWED, enabled ? 1 : 0);
|
||||||
} else if (preference == mOnSwitch) {
|
} else if (preference == mOnSwitch) {
|
||||||
if (newValue == Boolean.TRUE) {
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_DEMO_MODE_ON, enabled);
|
||||||
|
if (enabled) {
|
||||||
startDemoMode();
|
startDemoMode();
|
||||||
} else {
|
} else {
|
||||||
stopDemoMode();
|
stopDemoMode();
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import android.widget.EditText;
|
|||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ScrollView;
|
import android.widget.ScrollView;
|
||||||
|
|
||||||
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.qs.QSPanel;
|
import com.android.systemui.qs.QSPanel;
|
||||||
import com.android.systemui.qs.QSTile;
|
import com.android.systemui.qs.QSTile;
|
||||||
@@ -79,12 +80,25 @@ public class QsTuner extends Fragment implements Callback {
|
|||||||
menu.add(0, MENU_RESET, 0, com.android.internal.R.string.reset);
|
menu.add(0, MENU_RESET, 0, com.android.internal.R.string.reset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER_QS, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER_QS, false);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case MENU_RESET:
|
case MENU_RESET:
|
||||||
mTileHost.reset();
|
mTileHost.reset();
|
||||||
break;
|
break;
|
||||||
|
case android.R.id.home:
|
||||||
|
getFragmentManager().popBackStack();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
@@ -205,6 +219,8 @@ public class QsTuner extends Fragment implements Callback {
|
|||||||
if (oldTile.equals(newTile)) {
|
if (oldTile.equals(newTile)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_QS_REORDER, oldTile + ","
|
||||||
|
+ newTile);
|
||||||
List<String> order = new ArrayList<>(mTileSpecs);
|
List<String> order = new ArrayList<>(mTileSpecs);
|
||||||
int index = order.indexOf(oldTile);
|
int index = order.indexOf(oldTile);
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
@@ -217,12 +233,14 @@ public class QsTuner extends Fragment implements Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void remove(String tile) {
|
public void remove(String tile) {
|
||||||
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_QS_REMOVE, tile);
|
||||||
List<String> tiles = new ArrayList<>(mTileSpecs);
|
List<String> tiles = new ArrayList<>(mTileSpecs);
|
||||||
tiles.remove(tile);
|
tiles.remove(tile);
|
||||||
setTiles(tiles);
|
setTiles(tiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(String tile) {
|
public void add(String tile) {
|
||||||
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_QS_ADD, tile);
|
||||||
List<String> tiles = new ArrayList<>(mTileSpecs);
|
List<String> tiles = new ArrayList<>(mTileSpecs);
|
||||||
tiles.add(tile);
|
tiles.add(tile);
|
||||||
setTiles(tiles);
|
setTiles(tiles);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import android.provider.Settings;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
||||||
import com.android.systemui.tuner.TunerService.Tunable;
|
import com.android.systemui.tuner.TunerService.Tunable;
|
||||||
|
|
||||||
@@ -50,11 +51,14 @@ public class StatusBarSwitch extends SwitchPreference implements Tunable {
|
|||||||
if (!value) {
|
if (!value) {
|
||||||
// If not enabled add to blacklist.
|
// If not enabled add to blacklist.
|
||||||
if (!mBlacklist.contains(getKey())) {
|
if (!mBlacklist.contains(getKey())) {
|
||||||
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_STATUS_BAR_DISABLE,
|
||||||
|
getKey());
|
||||||
mBlacklist.add(getKey());
|
mBlacklist.add(getKey());
|
||||||
setList(mBlacklist);
|
setList(mBlacklist);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mBlacklist.remove(getKey())) {
|
if (mBlacklist.remove(getKey())) {
|
||||||
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_STATUS_BAR_ENABLE, getKey());
|
||||||
setList(mBlacklist);
|
setList(mBlacklist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ package com.android.systemui.tuner;
|
|||||||
|
|
||||||
import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
|
import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
import android.app.FragmentTransaction;
|
import android.app.FragmentTransaction;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.DialogInterface.OnClickListener;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -28,19 +31,29 @@ import android.preference.Preference.OnPreferenceClickListener;
|
|||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.preference.PreferenceGroup;
|
import android.preference.PreferenceGroup;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.provider.Settings.System;
|
import android.provider.Settings.System;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
||||||
import com.android.systemui.tuner.TunerService.Tunable;
|
import com.android.systemui.tuner.TunerService.Tunable;
|
||||||
|
|
||||||
public class TunerFragment extends PreferenceFragment {
|
public class TunerFragment extends PreferenceFragment {
|
||||||
|
|
||||||
|
private static final String TAG = "TunerFragment";
|
||||||
|
|
||||||
private static final String KEY_QS_TUNER = "qs_tuner";
|
private static final String KEY_QS_TUNER = "qs_tuner";
|
||||||
private static final String KEY_DEMO_MODE = "demo_mode";
|
private static final String KEY_DEMO_MODE = "demo_mode";
|
||||||
private static final String KEY_BATTERY_PCT = "battery_pct";
|
private static final String KEY_BATTERY_PCT = "battery_pct";
|
||||||
|
|
||||||
|
public static final String SETTING_SEEN_TUNER_WARNING = "seen_tuner_warning";
|
||||||
|
|
||||||
|
private static final int MENU_REMOVE = Menu.FIRST + 1;
|
||||||
|
|
||||||
private final SettingObserver mSettingObserver = new SettingObserver();
|
private final SettingObserver mSettingObserver = new SettingObserver();
|
||||||
|
|
||||||
private SwitchPreference mBatteryPct;
|
private SwitchPreference mBatteryPct;
|
||||||
@@ -73,6 +86,19 @@ public class TunerFragment extends PreferenceFragment {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
mBatteryPct = (SwitchPreference) findPreference(KEY_BATTERY_PCT);
|
mBatteryPct = (SwitchPreference) findPreference(KEY_BATTERY_PCT);
|
||||||
|
if (Settings.Secure.getInt(getContext().getContentResolver(), SETTING_SEEN_TUNER_WARNING,
|
||||||
|
0) == 0) {
|
||||||
|
new AlertDialog.Builder(getContext())
|
||||||
|
.setTitle(R.string.tuner_warning_title)
|
||||||
|
.setMessage(R.string.tuner_warning)
|
||||||
|
.setPositiveButton(R.string.got_it, new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Settings.Secure.putInt(getContext().getContentResolver(),
|
||||||
|
SETTING_SEEN_TUNER_WARNING, 1);
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -83,6 +109,7 @@ public class TunerFragment extends PreferenceFragment {
|
|||||||
System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
|
System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
|
||||||
|
|
||||||
registerPrefs(getPreferenceScreen());
|
registerPrefs(getPreferenceScreen());
|
||||||
|
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -91,6 +118,7 @@ public class TunerFragment extends PreferenceFragment {
|
|||||||
getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
|
getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
|
||||||
|
|
||||||
unregisterPrefs(getPreferenceScreen());
|
unregisterPrefs(getPreferenceScreen());
|
||||||
|
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerPrefs(PreferenceGroup group) {
|
private void registerPrefs(PreferenceGroup group) {
|
||||||
@@ -119,12 +147,25 @@ public class TunerFragment extends PreferenceFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
menu.add(Menu.NONE, MENU_REMOVE, Menu.NONE, R.string.remove_from_settings);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case android.R.id.home:
|
case android.R.id.home:
|
||||||
getActivity().finish();
|
getActivity().finish();
|
||||||
return true;
|
return true;
|
||||||
|
case MENU_REMOVE:
|
||||||
|
TunerService.showResetRequest(getContext(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
getActivity().finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
@@ -152,6 +193,7 @@ public class TunerFragment extends PreferenceFragment {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
final boolean v = (Boolean) newValue;
|
final boolean v = (Boolean) newValue;
|
||||||
|
MetricsLogger.action(getContext(), MetricsLogger.TUNER_BATTERY_PERCENTAGE, v);
|
||||||
System.putInt(getContext().getContentResolver(), SHOW_PERCENT_SETTING, v ? 1 : 0);
|
System.putInt(getContext().getContentResolver(), SHOW_PERCENT_SETTING, v ? 1 : 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,15 @@
|
|||||||
package com.android.systemui.tuner;
|
package com.android.systemui.tuner;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.DialogInterface.OnClickListener;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -25,9 +32,13 @@ import android.os.Looper;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
|
|
||||||
|
import com.android.systemui.BatteryMeterView;
|
||||||
|
import com.android.systemui.DemoMode;
|
||||||
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.SystemUI;
|
import com.android.systemui.SystemUI;
|
||||||
import com.android.systemui.SystemUIApplication;
|
import com.android.systemui.SystemUIApplication;
|
||||||
import com.android.systemui.settings.CurrentUserTracker;
|
import com.android.systemui.settings.CurrentUserTracker;
|
||||||
|
import com.android.systemui.statusbar.phone.SystemUIDialog;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -36,6 +47,8 @@ import java.util.List;
|
|||||||
|
|
||||||
public class TunerService extends SystemUI {
|
public class TunerService extends SystemUI {
|
||||||
|
|
||||||
|
public static final String ACTION_CLEAR = "com.android.systemui.action.CLEAR_TUNER";
|
||||||
|
|
||||||
private final Observer mObserver = new Observer();
|
private final Observer mObserver = new Observer();
|
||||||
// Map of Uris we listen on to their settings keys.
|
// Map of Uris we listen on to their settings keys.
|
||||||
private final ArrayMap<Uri, String> mListeningUris = new ArrayMap<>();
|
private final ArrayMap<Uri, String> mListeningUris = new ArrayMap<>();
|
||||||
@@ -118,6 +131,19 @@ public class TunerService extends SystemUI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void clearAll() {
|
||||||
|
// A couple special cases.
|
||||||
|
Settings.Global.putString(mContentResolver, DemoMode.DEMO_MODE_ALLOWED, null);
|
||||||
|
Settings.System.putString(mContentResolver, BatteryMeterView.SHOW_PERCENT_SETTING, null);
|
||||||
|
Intent intent = new Intent(DemoMode.ACTION_DEMO);
|
||||||
|
intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_EXIT);
|
||||||
|
mContext.sendBroadcast(intent);
|
||||||
|
|
||||||
|
for (String key : mTunableLookup.keySet()) {
|
||||||
|
Settings.Secure.putString(mContentResolver, key, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Only used in other processes, such as the tuner.
|
// Only used in other processes, such as the tuner.
|
||||||
private static TunerService sInstance;
|
private static TunerService sInstance;
|
||||||
|
|
||||||
@@ -141,6 +167,44 @@ public class TunerService extends SystemUI {
|
|||||||
return sInstance;
|
return sInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final void showResetRequest(final Context context, final Runnable onDisabled) {
|
||||||
|
SystemUIDialog dialog = new SystemUIDialog(context);
|
||||||
|
dialog.setMessage(R.string.remove_from_settings_prompt);
|
||||||
|
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.cancel),
|
||||||
|
(OnClickListener) null);
|
||||||
|
dialog.setButton(DialogInterface.BUTTON_POSITIVE,
|
||||||
|
context.getString(R.string.guest_exit_guest_dialog_remove), new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
// Tell the tuner (in main SysUI process) to clear all its settings.
|
||||||
|
context.sendBroadcast(new Intent(TunerService.ACTION_CLEAR));
|
||||||
|
// Disable access to tuner.
|
||||||
|
TunerService.setTunerEnabled(context, false);
|
||||||
|
// Make them sit through the warning dialog again.
|
||||||
|
Settings.Secure.putInt(context.getContentResolver(),
|
||||||
|
TunerFragment.SETTING_SEEN_TUNER_WARNING, 0);
|
||||||
|
if (onDisabled != null) {
|
||||||
|
onDisabled.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final void setTunerEnabled(Context context, boolean enabled) {
|
||||||
|
context.getPackageManager().setComponentEnabledSetting(
|
||||||
|
new ComponentName(context, TunerActivity.class),
|
||||||
|
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
|
||||||
|
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
||||||
|
PackageManager.DONT_KILL_APP);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean isTunerEnabled(Context context) {
|
||||||
|
return context.getPackageManager().getComponentEnabledSetting(
|
||||||
|
new ComponentName(context, TunerActivity.class))
|
||||||
|
== PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
private class Observer extends ContentObserver {
|
private class Observer extends ContentObserver {
|
||||||
public Observer() {
|
public Observer() {
|
||||||
super(new Handler(Looper.getMainLooper()));
|
super(new Handler(Looper.getMainLooper()));
|
||||||
@@ -157,4 +221,13 @@ public class TunerService extends SystemUI {
|
|||||||
public interface Tunable {
|
public interface Tunable {
|
||||||
void onTuningChanged(String key, String newValue);
|
void onTuningChanged(String key, String newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ClearReceiver extends BroadcastReceiver {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
if (ACTION_CLEAR.equals(intent.getAction())) {
|
||||||
|
get(context).clearAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user