156 lines
4.8 KiB
Java
156 lines
4.8 KiB
Java
/*
|
|
* Copyright (C) 2018 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.internal.globalactions;
|
|
|
|
import android.content.Context;
|
|
import android.util.Log;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
import com.android.internal.R;
|
|
|
|
/**
|
|
* A toggle action knows whether it is on or off, and displays an icon and status message
|
|
* accordingly.
|
|
*/
|
|
public abstract class ToggleAction implements Action {
|
|
private static final String TAG = "ToggleAction";
|
|
|
|
public enum State {
|
|
Off(false),
|
|
TurningOn(true),
|
|
TurningOff(true),
|
|
On(false);
|
|
|
|
private final boolean inTransition;
|
|
|
|
State(boolean intermediate) {
|
|
inTransition = intermediate;
|
|
}
|
|
|
|
public boolean inTransition() {
|
|
return inTransition;
|
|
}
|
|
}
|
|
|
|
protected State mState = State.Off;
|
|
|
|
// prefs
|
|
protected int mEnabledIconResId;
|
|
protected int mDisabledIconResid;
|
|
protected int mMessageResId;
|
|
protected int mEnabledStatusMessageResId;
|
|
protected int mDisabledStatusMessageResId;
|
|
|
|
/**
|
|
* @param enabledIconResId The icon for when this action is on.
|
|
* @param disabledIconResid The icon for when this action is off.
|
|
* @param message The general information message, e.g 'Silent Mode'
|
|
* @param enabledStatusMessageResId The on status message, e.g 'sound disabled'
|
|
* @param disabledStatusMessageResId The off status message, e.g. 'sound enabled'
|
|
*/
|
|
public ToggleAction(int enabledIconResId,
|
|
int disabledIconResid,
|
|
int message,
|
|
int enabledStatusMessageResId,
|
|
int disabledStatusMessageResId) {
|
|
mEnabledIconResId = enabledIconResId;
|
|
mDisabledIconResid = disabledIconResid;
|
|
mMessageResId = message;
|
|
mEnabledStatusMessageResId = enabledStatusMessageResId;
|
|
mDisabledStatusMessageResId = disabledStatusMessageResId;
|
|
}
|
|
|
|
/** Override to make changes to resource IDs just before creating the View. */
|
|
void willCreate() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public CharSequence getLabelForAccessibility(Context context) {
|
|
return context.getString(mMessageResId);
|
|
}
|
|
|
|
@Override
|
|
public View create(Context context, View convertView, ViewGroup parent,
|
|
LayoutInflater inflater) {
|
|
willCreate();
|
|
|
|
View v = inflater.inflate(R.layout.global_actions_item, parent, false);
|
|
|
|
ImageView icon = v.findViewById(R.id.icon);
|
|
TextView messageView = v.findViewById(R.id.message);
|
|
TextView statusView = v.findViewById(R.id.status);
|
|
final boolean enabled = isEnabled();
|
|
|
|
if (messageView != null) {
|
|
messageView.setText(mMessageResId);
|
|
messageView.setEnabled(enabled);
|
|
}
|
|
|
|
boolean on = ((mState == State.On) || (mState == State.TurningOn));
|
|
if (icon != null) {
|
|
icon.setImageDrawable(context.getDrawable(
|
|
(on ? mEnabledIconResId : mDisabledIconResid)));
|
|
icon.setEnabled(enabled);
|
|
}
|
|
|
|
if (statusView != null) {
|
|
statusView.setText(on ? mEnabledStatusMessageResId : mDisabledStatusMessageResId);
|
|
statusView.setVisibility(View.VISIBLE);
|
|
statusView.setEnabled(enabled);
|
|
}
|
|
v.setEnabled(enabled);
|
|
|
|
return v;
|
|
}
|
|
|
|
@Override
|
|
public final void onPress() {
|
|
if (mState.inTransition()) {
|
|
Log.w(TAG, "shouldn't be able to toggle when in transition");
|
|
return;
|
|
}
|
|
|
|
final boolean nowOn = !(mState == State.On);
|
|
onToggle(nowOn);
|
|
changeStateFromPress(nowOn);
|
|
}
|
|
|
|
@Override
|
|
public boolean isEnabled() {
|
|
return !mState.inTransition();
|
|
}
|
|
|
|
/**
|
|
* Implementations may override this if their state can be in on of the intermediate
|
|
* states until some notification is received (e.g airplane mode is 'turning off' until
|
|
* we know the wireless connections are back online
|
|
* @param buttonOn Whether the button was turned on or off
|
|
*/
|
|
protected void changeStateFromPress(boolean buttonOn) {
|
|
mState = buttonOn ? State.On : State.Off;
|
|
}
|
|
|
|
public abstract void onToggle(boolean on);
|
|
|
|
public void updateState(State state) {
|
|
mState = state;
|
|
}
|
|
}
|