Merge "QS: Long-press on usage-based tiles to hide." into lmp-mr1-dev

automerge: 5cde5c6

* commit '5cde5c616a39b060730f9b995c19642695222975':
  QS: Long-press on usage-based tiles to hide.
This commit is contained in:
John Spurlock
2014-11-07 20:56:35 +00:00
committed by android-build-merger
8 changed files with 105 additions and 13 deletions

View File

@@ -911,4 +911,12 @@
<!-- Screen pinning negative response. --> <!-- Screen pinning negative response. -->
<string name="screen_pinning_negative">No thanks</string> <string name="screen_pinning_negative">No thanks</string>
<!-- Hide quick settings tile confirmation title -->
<string name="quick_settings_reset_confirmation_title">Hide <xliff:g id="tile_label" example="Hotspot">%1$s</xliff:g>?</string>
<!-- Hide quick settings tile confirmation message -->
<string name="quick_settings_reset_confirmation_message">It will reappear the next time you turn it on in settings.</string>
<!-- Hide quick settings tile confirmation button -->
<string name="quick_settings_reset_confirmation_button">Hide</string>
</resources> </resources>

View File

@@ -296,7 +296,14 @@ public class QSPanel extends ViewGroup {
r.tile.secondaryClick(); r.tile.secondaryClick();
} }
}; };
r.tileView.init(click, clickSecondary); final View.OnLongClickListener longClick = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
r.tile.longClick();
return true;
}
};
r.tileView.init(click, clickSecondary, longClick);
r.tile.setListening(mListening); r.tile.setListening(mListening);
callback.onStateChanged(r.tile.getState()); callback.onStateChanged(r.tile.getState());
r.tile.refreshState(); r.tile.refreshState();

View File

@@ -112,6 +112,10 @@ public abstract class QSTile<TState extends State> implements Listenable {
mHandler.sendEmptyMessage(H.SECONDARY_CLICK); mHandler.sendEmptyMessage(H.SECONDARY_CLICK);
} }
public void longClick() {
mHandler.sendEmptyMessage(H.LONG_CLICK);
}
public void showDetail(boolean show) { public void showDetail(boolean show) {
mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0).sendToTarget(); mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0).sendToTarget();
} }
@@ -155,6 +159,10 @@ public abstract class QSTile<TState extends State> implements Listenable {
// optional // optional
} }
protected void handleLongClick() {
// optional
}
protected void handleRefreshState(Object arg) { protected void handleRefreshState(Object arg) {
handleUpdateState(mTmpState, arg); handleUpdateState(mTmpState, arg);
final boolean changed = mTmpState.copyTo(mState); final boolean changed = mTmpState.copyTo(mState);
@@ -216,12 +224,13 @@ public abstract class QSTile<TState extends State> implements Listenable {
private static final int SET_CALLBACK = 1; private static final int SET_CALLBACK = 1;
private static final int CLICK = 2; private static final int CLICK = 2;
private static final int SECONDARY_CLICK = 3; private static final int SECONDARY_CLICK = 3;
private static final int REFRESH_STATE = 4; private static final int LONG_CLICK = 4;
private static final int SHOW_DETAIL = 5; private static final int REFRESH_STATE = 5;
private static final int USER_SWITCH = 6; private static final int SHOW_DETAIL = 6;
private static final int TOGGLE_STATE_CHANGED = 7; private static final int USER_SWITCH = 7;
private static final int SCAN_STATE_CHANGED = 8; private static final int TOGGLE_STATE_CHANGED = 8;
private static final int DESTROY = 9; private static final int SCAN_STATE_CHANGED = 9;
private static final int DESTROY = 10;
private H(Looper looper) { private H(Looper looper) {
super(looper); super(looper);
@@ -241,6 +250,9 @@ public abstract class QSTile<TState extends State> implements Listenable {
} else if (msg.what == SECONDARY_CLICK) { } else if (msg.what == SECONDARY_CLICK) {
name = "handleSecondaryClick"; name = "handleSecondaryClick";
handleSecondaryClick(); handleSecondaryClick();
} else if (msg.what == LONG_CLICK) {
name = "handleLongClick";
handleLongClick();
} else if (msg.what == REFRESH_STATE) { } else if (msg.what == REFRESH_STATE) {
name = "handleRefreshState"; name = "handleRefreshState";
handleRefreshState(msg.obj); handleRefreshState(msg.obj);

View File

@@ -63,6 +63,7 @@ public class QSTileView extends ViewGroup {
private boolean mDual; private boolean mDual;
private OnClickListener mClickPrimary; private OnClickListener mClickPrimary;
private OnClickListener mClickSecondary; private OnClickListener mClickSecondary;
private OnLongClickListener mLongClick;
private Drawable mTileBackground; private Drawable mTileBackground;
private RippleDrawable mRipple; private RippleDrawable mRipple;
@@ -190,6 +191,7 @@ public class QSTileView extends ViewGroup {
mTopBackgroundView.setOnClickListener(null); mTopBackgroundView.setOnClickListener(null);
mTopBackgroundView.setClickable(false); mTopBackgroundView.setClickable(false);
setOnClickListener(mClickPrimary); setOnClickListener(mClickPrimary);
setOnLongClickListener(mLongClick);
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground); setBackground(mTileBackground);
} }
@@ -206,9 +208,11 @@ public class QSTileView extends ViewGroup {
} }
} }
public void init(OnClickListener clickPrimary, OnClickListener clickSecondary) { public void init(OnClickListener clickPrimary, OnClickListener clickSecondary,
OnLongClickListener longClick) {
mClickPrimary = clickPrimary; mClickPrimary = clickPrimary;
mClickSecondary = clickSecondary; mClickSecondary = clickSecondary;
mLongClick = longClick;
} }
protected View createIcon() { protected View createIcon() {

View File

@@ -18,10 +18,13 @@ package com.android.systemui.qs;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.Listenable; import com.android.systemui.statusbar.policy.Listenable;
public class UsageTracker implements Listenable { public class UsageTracker implements Listenable {
@@ -65,6 +68,25 @@ public class UsageTracker implements Listenable {
getSharedPrefs().edit().remove(mPrefKey).commit(); getSharedPrefs().edit().remove(mPrefKey).commit();
} }
public void showResetConfirmation(String title, final Runnable onConfirmed) {
final SystemUIDialog d = new SystemUIDialog(mContext);
d.setTitle(title);
d.setMessage(mContext.getString(R.string.quick_settings_reset_confirmation_message));
d.setNegativeButton(android.R.string.cancel, null);
d.setPositiveButton(R.string.quick_settings_reset_confirmation_button,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
reset();
if (onConfirmed != null) {
onConfirmed.run();
}
}
});
d.setCanceledOnTouchOutside(true);
d.show();
}
private SharedPreferences getSharedPrefs() { private SharedPreferences getSharedPrefs() {
return mContext.getSharedPreferences(mContext.getPackageName(), 0); return mContext.getSharedPreferences(mContext.getPackageName(), 0);
} }

View File

@@ -87,6 +87,19 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> {
mDisable.setAllowAnimation(true); mDisable.setAllowAnimation(true);
} }
@Override
protected void handleLongClick() {
if (mState.value) return; // don't allow usage reset if inversion is active
final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title,
mState.label);
mUsageTracker.showResetConfirmation(title, new Runnable() {
@Override
public void run() {
refreshState();
}
});
}
@Override @Override
protected void handleUpdateState(BooleanState state, Object arg) { protected void handleUpdateState(BooleanState state, Object arg) {
final int value = arg instanceof Integer ? (Integer) arg : mSetting.getValue(); final int value = arg instanceof Integer ? (Integer) arg : mSetting.getValue();

View File

@@ -64,6 +64,19 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> {
mController.setHotspotEnabled(!isEnabled); mController.setHotspotEnabled(!isEnabled);
} }
@Override
protected void handleLongClick() {
if (mState.value) return; // don't allow usage reset if hotspot is active
final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title,
mState.label);
mUsageTracker.showResetConfirmation(title, new Runnable() {
@Override
public void run() {
refreshState();
}
});
}
@Override @Override
protected void handleUpdateState(BooleanState state, Object arg) { protected void handleUpdateState(BooleanState state, Object arg) {
state.visible = mController.isHotspotSupported() && mUsageTracker.isRecentlyUsed() state.visible = mController.isHotspotSupported() && mUsageTracker.isRecentlyUsed()

View File

@@ -39,6 +39,8 @@ public class IntentTile extends QSTile<QSTile.State> {
private PendingIntent mOnClick; private PendingIntent mOnClick;
private String mOnClickUri; private String mOnClickUri;
private PendingIntent mOnLongClick;
private String mOnLongClickUri;
private int mCurrentUserId; private int mCurrentUserId;
private IntentTile(Host host, String action) { private IntentTile(Host host, String action) {
@@ -80,15 +82,24 @@ public class IntentTile extends QSTile<QSTile.State> {
@Override @Override
protected void handleClick() { protected void handleClick() {
sendIntent("click", mOnClick, mOnClickUri);
}
@Override
protected void handleLongClick() {
sendIntent("long-click", mOnLongClick, mOnLongClickUri);
}
private void sendIntent(String type, PendingIntent pi, String uri) {
try { try {
if (mOnClick != null) { if (pi != null) {
mOnClick.send(); pi.send();
} else if (mOnClickUri != null) { } else if (uri != null) {
final Intent intent = Intent.parseUri(mOnClickUri, Intent.URI_INTENT_SCHEME); final Intent intent = Intent.parseUri(uri, Intent.URI_INTENT_SCHEME);
mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
} }
} catch (Throwable t) { } catch (Throwable t) {
Log.w(TAG, "Error sending click intent", t); Log.w(TAG, "Error sending " + type + " intent", t);
} }
} }
@@ -120,6 +131,8 @@ public class IntentTile extends QSTile<QSTile.State> {
} }
mOnClick = intent.getParcelableExtra("onClick"); mOnClick = intent.getParcelableExtra("onClick");
mOnClickUri = intent.getStringExtra("onClickUri"); mOnClickUri = intent.getStringExtra("onClickUri");
mOnLongClick = intent.getParcelableExtra("onLongClick");
mOnLongClickUri = intent.getStringExtra("onLongClickUri");
} }
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { private final BroadcastReceiver mReceiver = new BroadcastReceiver() {